📊

Grafana + InfluxDBで可視化を行うのならInfluxQLよりもFluxをおすすめする理由

2022/08/25に公開

この記事の想定読者

  • InfluxDB の基本概念は知っている。
  • (Optional) InfluxQL を使って Grafana で可視化をしたことがある。

はじめに — なぜFluxを使うべきか?

InfluxDB + Grafana の組み合わせは時系列データを用いた各種の可視化でポピュラーな組み合わせかと思いますが、Grafana側がどちらかというとまだ InfluxQL をデフォルトのクエリ言語として利用することを想定している(ように見える)こともあり、InfluxQL を使ってクエリを書いている人が多いのではないかと思います。

しかし、InfluxDB が現在推している新しいクエリ言語 Flux を使うほうが高度な可視化が(容易に)可能になります:

  • Fluxには pivot() 機能があり、テーブルの行列の入れ替えが可能。これにより InfluxQL ではできなかった種類の可視化が可能になる。
  • pivot() を活用すると、InfluxDBの tagfield をほぼ等価に使える。例えば field を使って group() 関数でグループ化するような処理が可能。
  • Fluxではクエリの結果として得られる Stream of Tables を変数として保存し、再利用することが容易にできる。

GrafanaでFluxクエリを使うための最初の一歩 — Field をテーブルの列(column)に変換する

Fluxでクエリをかけると最初すべての Field が別々の行(row)として出力されるので面食らうと思います。
FieldTable の列に変換する場合は 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