notebook

都内でWEB系エンジニアやってます。

GrafanaとTimescaleDB使ってみる

TimescaleDB

Time-series data simplified | Timescale

www.timescale.com

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 | Installing

docs.timescale.com

TimescaleDB Docs | Setting up TimescaleDB

docs.timescale.com

これに沿ってテーブル作成とデータ入れ込みをしていく

  • データベースの作成、timescaledbの拡張を入れる
CREATE database tutorial;
\c tutorial
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

TimescaleDB Docs | Creating Hypertables

docs.timescale.com

上記を見ながらサンプルのテーブル作成、データ一件入れてみる

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"

グラフ

あとはポチポチやってグラフを作る

f:id:swfz:20200911090038p:plain

OK!

まとめ

  • PosgreSQLでTimescaleDBの拡張を有効にした
  • Embulkを使ってログファイルを入れ込んだ
  • Grafanaで可視化した

所感

  • Grafanaの操作感が思ったよりしっくり来なかった

    • 小数点以下が選択カラムに出てこなかったり
    • 表現できる幅が他のツールに比べて少ないように感じた
      • 単に習熟度が違うだけかもしれないが…
  • リアルタイムでのデータを扱い時に適している

    • そのため扱うデータが日次集計で良い場合はBigQuery+DataPortalや他のツールでよいのかなと感じた