📅

Grafana で $__timeFilter を使うときは $__from と $__to も検討しよう

2024/12/06に公開

その理由は…

  • 日時のフォーマットを指定できて柔軟なクエリ生成が可能になる
  • キャッシュを効かせやすくなる

の 2 点です。

$__timeFilter の挙動がキャッシュに向かない

Grafana には $__timeFilter という便利な変数が用意されています。

https://grafana.com/docs/grafana/latest/dashboards/variables/add-template-variables/#timefilter-or-__timefilter

この変数をクエリに書くだけで、指定した変数や文字列に対して今 Grafana で指定されている日時範囲の Between を実行時に生成してくれて、とても簡単に日時範囲指定とクエリを連動させることができます。

SELECT * FROM hoge_table
WHERE
    $__timeFilter(my_timestamp)SELECT * FROM hoge_table
WHERE
    my_timestamp >= '2024-12-01T12:34:56Z' AND
    my_timestamp <= '2024-12-07T12:34:56Z'

※ 「Grafana 側で指定する日時範囲」とはこの画像にある機能のこと:

ただし、生成された SQL を見ると分かるように日時は秒単位まできっちり生成されます

Grafana で可視化したい単位が「日」や「時」などの大きな単位で十分であり、なおかつデータソースがキャッシュ機能を備えている場合、この秒まで生成される機能は細かすぎて扱いにくいものとなるでしょう。

キャッシュヒットする期間が 1 秒しかありません。
※なんなら、レイテンシーなどを加味すると結局ヒットしないことでしょう。。

$__from と $__to はフォーマットを指定可

Grafana は $__from$__to という変数も提供しています。

https://grafana.com/docs/grafana/latest/dashboards/variables/add-template-variables/#__from-and-__to

この変数は Grafana の日時範囲指定の From と To に入力されたそれぞれの日時に対応しています。さらに嬉しいことに、この変数は指定したフォーマットの形式で日時を生成させることが可能です。

例えば先程 $__timeFilter を使ったクエリは以下のように書き直すことができます。

SELECT * FROM hoge_table
WHERE
    my_timestamp >= '${__from:date:YYYY-MM-DD}' AND
    my_timestamp <= '${__to:date:YYYY-MM-DD}'SELECT * FROM hoge_table
WHERE
    my_timestamp >= '2024-12-01' AND
    my_timestamp <= '2024-12-07'

少し記述量が増えましたが、これによって「日」までの単位でクエリを発行することができました。このように $__from$__to は柔軟な日時発行が可能です。これによりユースケースに応じたクエリの発行、例えばキャッシュヒットする回数を大きく上昇させるクエリ発行が可能になります。

その他のフォーマットの指定方法はドキュメントをご覧ください。

終わりに

Grafana で $__timeFilter を使うときは $__from$__to もぜひ検討してみてください。

前者は便利な変数ですが、後者を使うと日時のフォーマット指定が可能になります。そのため、よりユースケースにあったクエリ(例えばキャッシュに最適なクエリなど)を発行できるはずです。

最後までお読みいただきありがとうございました。

Discussion