Grafana Cloud で InfluxDB v2 のデータを可視化する

InfluxDB v2 ではそれ自体でダッシュボードの作成もできますが、まだまだ使いにくかったり細かい設定ができなかったりしたので、使い慣れている Grafana を使うことにしました。
また、この機会に Grafana もオンプレミス版からクラウドサービスの Grafana Cloud に変更しました。

Grafana Cloud へのサインアップ方法などは割愛します。

データソースの設定

  1. サイドメニューから Data Sources を選択します。
  2. Add data source をクリックし、InfluxDB をクリックします。
  3. InfluxDB の情報を入力します。

InfluxDB Cloud の場合、Query LanguageFlux を選択します。
また、URL, トークン、バケット名が必要になるので、以下を参考に取得しておきます。

ダッシュボード(パネル)の作成

InfluxDB v1 では GUI でポチポチと設定していくだけでグラフが表示できましたが、InfluxDB v2 では Flux で処理を書いていく必要があります。
最初は難しかったですが、慣れればこちらのほうが簡単に思えてきました。
いくつか例を挙げます。

基本

以下にサンプルがあります。

from(bucket:"バケット名")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn:(r) => r._measurement == "メジャーメント名")
  |> filter(fn:(r) => r["_field"] == "表示したいフィールドの名前")
  |> aggregateWindow(every: v.windowPeriod, fn: mean)

基本的にはこれでグラフが作成できます。

一日ごとのデータを表示

例えば株価の終値を表示したい場合などは以下のようにすることでできました。

import "timezone"

option location = timezone.location(name: "Asia/Tokyo")

from(bucket:"バケット名")
  |> range(start: -30d, stop: now())
  |> filter(fn:(r) => r._measurement == "メジャーメント名")
  |> filter(fn:(r) => r["_field"] == "表示したいフィールドの名前")
  |> aggregateWindow(every: 1d, fn: last)

ポイントは aggregateWindow(every: 1d, fn: last) で、一日ごとの最後の値を取得しています。

また、タイムゾーンを指定しないと UTC での終値(つまり、日本時間の9時の時点の値)が取得されてしまったので、JST を指定しました。

尚、私の場合はグラフではなくテーブル表示にしたかったため、グラフの表示期間に関わらず range(start: -30d, stop: now()) で直近30日固定表示にしています。

累積グラフの作成

cumulativeSum を使います。

例えば、日次損益の集計を行う場合などは以下のようにするとできました。

import "timezone"

option location = timezone.location(name: "Asia/Tokyo")

from(bucket:"バケット名")
  |> range(start: -30d, stop: now())
  |> filter(fn:(r) => r._measurement == "メジャーメント名")
  |> filter(fn:(r) => r["_field"] == "表示したいフィールドの名前")
  |> aggregateWindow(every: 1d, fn: last)
  |> cumulativeSum()

一日ごとの値は取り出す方法は前述の例と同じです。
あとはそれを cumulativeSum() で加算していくだけです。
これにより、一日ごとの値を加算してグラフに表示できます。

参考 URL

Hugo で構築されています。
テーマ StackJimmy によって設計されています。