これは ZOZO Advent Calendar 2024 カレンダー Vol.9 の 10日目の記事です。
はじめに
本記事では、Google CloudのBigQueryのスロットの割り当て量について、Cloud Monitoringによる監視を導入する方法をご紹介します。
BigQueryのスロットについては、昨日投稿したBigQuery コンピューティング容量(スロット)ベースの課金体系とスロット予約の特性を理解するでご紹介しているため、良ければ参照ください。
Cloud Monitoringによるスロット割り当て量の確認
Cloud MonitoringのMetrics ExplorerではBigQuery Project > Slots > Slots used by project, reservation, and job type
の指標から、現在割り当てられているスロットの量を確認できます。
次図が確認できるスロット量のグラフの例です。
スロット割り当て量の監視
スロットベースの課金(BigQuery Editions)を利用する場合、スロットの上限値等はスロットの予約により管理されます。
またスロットのコスト効率はクエリ実行パフォーマンスとのトレードオフになります。
※ 詳細は昨日投稿したBigQuery コンピューティング容量(スロット)ベースの課金体系とスロット予約の特性を理解するを参照ください
上述の指標を監視することで、長時間のスロット不足に気が付きやすくなります。
以下が上記の指標に対してアラートを設定する際のTerraform定義になります。
上記の指標を元にアラートポリシーを設定することで対象プロジェクトにおけるSlotの割り当て量を監視することができます。閾値については、プロジェクトでのユースケースに応じてご調整ください。
resource "google_monitoring_alert_policy" "bq-reservation-assignment-slot" {
for_each = {
"project-a" = {
slots_threshold = <ALERT_THRESHOLD> # ex: 90
duration = "<DURATION>" # ex: "3600s"
notification_channel_id = "<NOTIFICATION_CHANNEL_ID>"
}
}
project = each.key
display_name = "[WARNING] [${each.key}] BigQuery Slots High usage is continuing over ${each.value["duration"]}"
combiner = "OR"
conditions {
display_name = "[WARNING] [${each.key}] BigQuery Slots High usage is continuing over ${each.value["duration"]}"
condition_threshold {
filter = <<-EOT
metric.type="bigquery.googleapis.com/slots/allocated"
resource.type="bigquery_project"
resource.labels.project_id="${each.key}"
EOT
comparison = "COMPARISON_GT"
threshold_value = each.value["slots_threshold"]
duration = each.value["duration"]
aggregations {
alignment_period = "60s"
per_series_aligner = "ALIGN_MAX"
cross_series_reducer = "REDUCE_MAX"
}
trigger {
count = 1
}
}
}
}