3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ZOZOAdvent Calendar 2024

Day 17

PromQLを用いた平日日中のみのメトリクスの抽出

Posted at

はじめに

🎄 本記事は 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を用いることで実現した。

スヌーズ機能なども検討したが、柔軟な時間設定ができなかった。

参考

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?