TimescaleDB
Time-series data simplified | Timescale
PostgreSQLベースで時系列データを扱うことができるらしい
GrafanaなどはElasticsearchやInfluxDBなどをバックエンドにグラフ化できたりするがそれのうちの1つにTimescaleDB(Timescale拡張を入れたPostgreSQL)がある
PostgreSQLベースであれば扱いやすいし新たに構文覚える手間もないのかなと言うことで使ってみる
Fluentdなどでリアルタイムにログを送っても良かったが今回はローカルで試すのでEmbulkでデータを入れ込む
インストール
Dockerでやる
- docker-compose.yml
PostgreSQLのイメージはTimescaleDB用のイメージが用意されているのでそれを使う
version: "3" services: timescaledb: image: timescale/timescaledb-postgis:latest-pg12 environment: POSTGRES_PASSWORD: password ports: - 5432:5432 tty: true stdin_open: true grafana: image: grafana/grafana:latest ports: - 3000:3000 embulk: build: context: . dockerfile: Dockerfile volumes: - './data:/data' - '.:/app'
- Dockerfile
Embulkのイメージを用意
FROM openjdk:8-jre-slim-buster RUN apt -y update && apt -y upgrade RUN apt -y install git curl tzdata bash RUN curl --fail --create-dirs -o /opt/embulk/bin/embulk -L https://github.com/embulk/embulk/releases/download/v0.10.12/embulk-0.10.12.jar && \ chmod +x /opt/embulk/bin/embulk ENV PATH $PATH:/opt/embulk/bin RUN embulk gem install embulk-output-bigquery \ embulk-parser-jsonl \ embulk-formatter-jsonl \ jruby-openssl \ embulk-filter-eval \ embulk-output-postgresql RUN curl -o /usr/bin/jq -L https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 && chmod +x /usr/bin/jq
- hoge.yml.liquid
in: type: file path_prefix: lograge-log- parser: type: json stop_on_invalid_record: true charset: UTF-8 newline: LF columns: - { name: method, type: string } - { name: path, type: string } - { name: format, type: string } - { name: controller, type: string } - { name: action, type: string } - { name: status, type: long } - { name: duration, type: double } - { name: view, type: double } - { name: db, type: double } - { name: location, type: string } - { name: host, type: string } - { name: params, type: string } - { name: time, type: timestamp, format: '%Y-%m-%dT%H:%M:%S' } - { name: message, type: string } out: type: postgresql mode: insert host: timescaledb user: postgres password: password database: hoge table: actions
- 起動
docker-compose up docker-compose exec timescaledb psql -U postgres
- チュートリアル
TimescaleDB Docs | Setting up TimescaleDB
これに沿ってテーブル作成とデータ入れ込みをしていく
- データベースの作成、timescaledbの拡張を入れる
CREATE database tutorial; \c tutorial CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
TimescaleDB Docs | Creating Hypertables
上記を見ながらサンプルのテーブル作成、データ一件入れてみる
CREATE database tutorial; \c tutorial CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE; CREATE TABLE conditions ( time TIMESTAMPTZ NOT NULL, location TEXT NOT NULL, temperature DOUBLE PRECISION NULL, humidity DOUBLE PRECISION NULL ); SELECT create_hypertable('conditions', 'time');
timeカラムに対して時系列の情報をもたせる
create_hypertable
でpartitionカラムを指定する
サンプルで雰囲気はつかめたのでログを入れる準備をする
ログ用のデータベースとテーブルを作成
CREATE database hoge; \c hoge CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE; CREATE TABLE actions ( time TIMESTAMPTZ NOT NULL, method VARCHAR(100) NOT NULL, path TEXT NOT NULL, format VARCHAR(100) NULL, controller VARCHAR(100) NOT NULL, action VARCHAR(100) NOT NULL, status integer NOT NULL, duration decimal NOT NULL, view decimal NOT NULL, db decimal NOT NULL, location TEXT NULL, host VARCHAR(255) NULL, params TEXT NULL, message TEXT NULL ); SELECT create_hypertable('actions', 'time');
入れ込み
ログはローカルに置いてある前提で実行
docker-compose run embulk /bin/bash -c "cd app && embulk run action-log.yml.liquid"
グラフ
あとはポチポチやってグラフを作る
OK!
まとめ
- PosgreSQLでTimescaleDBの拡張を有効にした
- Embulkを使ってログファイルを入れ込んだ
- Grafanaで可視化した
所感
Grafanaの操作感が思ったよりしっくり来なかった
- 小数点以下が選択カラムに出てこなかったり
- 表現できる幅が他のツールに比べて少ないように感じた
- 単に習熟度が違うだけかもしれないが…
リアルタイムでのデータを扱い時に適している
- そのため扱うデータが日次集計で良い場合はBigQuery+DataPortalや他のツールでよいのかなと感じた