📊
Grafana + InfluxDBで可視化を行うのならInfluxQLよりもFluxをおすすめする理由
この記事の想定読者
- InfluxDB の基本概念は知っている。
- (Optional) InfluxQL を使って Grafana で可視化をしたことがある。
はじめに — なぜFluxを使うべきか?
InfluxDB + Grafana の組み合わせは時系列データを用いた各種の可視化でポピュラーな組み合わせかと思いますが、Grafana側がどちらかというとまだ InfluxQL をデフォルトのクエリ言語として利用することを想定している(ように見える)こともあり、InfluxQL を使ってクエリを書いている人が多いのではないかと思います。
しかし、InfluxDB が現在推している新しいクエリ言語 Flux を使うほうが高度な可視化が(容易に)可能になります:
- Fluxには
pivot()
機能があり、テーブルの行列の入れ替えが可能。これにより InfluxQL ではできなかった種類の可視化が可能になる。 -
pivot()
を活用すると、InfluxDBの tag と field をほぼ等価に使える。例えば field を使ってgroup()
関数でグループ化するような処理が可能。 - Fluxではクエリの結果として得られる Stream of Tables を変数として保存し、再利用することが容易にできる。
GrafanaでFluxクエリを使うための最初の一歩 — Field をテーブルの列(column)に変換する
Fluxでクエリをかけると最初すべての Field が別々の行(row)として出力されるので面食らうと思います。
各 Field を Table の列に変換する場合は pivot()
関数を使って以下のような感じでクエリを書きます。
from(bucket: "${bucket}")
|> range(start: v.timeRangeStart, stop:v.timeRangeStop)
|> filter(fn: (r) =>
r._measurement == "${measurement}"
)
|> pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value")
|> group()
要するにタイムスタンプが同じ Field のレコード(行として表現される)をまとめて列に変換します。
捕捉:この例では、Bucketの名前と、Measurementの名前はGrafanaの変数として保存されていると想定しています。
ここまでは、InfluxQL のほうが Flux よりも簡単ですので、シンプルなクエリを行うだけなら InfluxQL を使うほうが良いかもしれません。
動作確認をした環境
2022-08-25時点の以下の環境
- InfluxDB Cloud v2.0
- Grafana Cloud v9.1.0-76166 (7002c1100)
Discussion