はじめに
🎄 本記事は ZOZO Advent Calendar 2024 シリーズ4の17日目です
開発環境に構築するDBなどは、コスト抑えるために平日日中のみ起動する運用が多い。
PromQLを用いて、平日日中のみメトリクスを取得するようにしたい。
PrometheusはTimezoneの設定ができず、全てUTCベースで考える必要がある。
Can I change the timezone? Why is everything in UTC?
To avoid any kind of timezone confusion, especially when the so-called daylight saving time is involved, we decided to exclusively use Unix time internally and UTC for display purposes in all components of Prometheus. A carefully done timezone selection could be introduced into the UI. Contributions are welcome. See issue #500 for the current state of this effort.
解決方法
JST において、月〜金の12時〜18時 のメトリクスを抽出する。
(
((day_of_week() == 0 and hour() >= 15) or
(day_of_week() >= 1 and day_of_week() <= 4) or
(day_of_week() == 5 and hour() < 15))
and
(hour() >= 3 and hour() < 9)
)
-
day_of_week() による曜日のフィルタ:
-
day_of_week() == 0 and hour() >= 15
UTCの日曜日の15時以降は、JSTでの月曜日の0時以降に対応 -
day_of_week() >= 1 and day_of_week() <= 4
UTCの月曜日から木曜日は、そのままJSTの火曜日から金曜日と対応 -
day_of_week() == 5 and hour() < 15
JSTの金曜日9時〜24時に対応
-
-
hour() による時間帯のフィルタ:
-
hour() >= 3 and hour() < 9
UTCの03:00〜09:00はJSTの12:00〜18:00に該当する
-
実際の使用例
下記はDatastreamのFreshnessメトリクスを基に、
平日日中のみを対象にしたアラートポリシーの例。
resource "google_monitoring_alert_policy" "datastream_data_freshness_alert" {
display_name = "Datastream Data Freshness Alert"
combiner = "OR"
conditions {
display_name = "Datastream Data Freshness condition."
condition_prometheus_query_language {
query = <<EOT
avg_over_time(
datastream_googleapis_com:stream_freshness{
monitored_resource="datastream.googleapis.com/Stream",
stream_id="{ストリームID}"
}[60s]
)
and on ()
(
((day_of_week() == 0 and hour() >= 15) or
(day_of_week() >= 1 and day_of_week() <= 4) or
(day_of_week() == 5 and hour() < 15))
and
(hour() >= 3 and hour() < 9)
)
> 1800
EOT
duration = "300s"
evaluation_interval = "300s"
}
}
}
おわりに
時間によるフィルタが無い場合は、filter句にLoggingのクエリ言語などを使用して、シンプルに書けるが、平日の日中のみのスコープだと上記を方法では実現できなかった。
今回は、PromQLを用いることで実現した。
スヌーズ機能なども検討したが、柔軟な時間設定ができなかった。
参考