Prometheusの「死角」を撃ち抜く:サブクエリ(Subquery)で実現する異常検知の神髄
「Prometheusで急激な変化を捉えたいが、`rate()` を単発で打つだけではノイズに埋もれる」
「移動平均を算出したいが、Grafana側の処理に頼るのは限界がある」
現場の苦境を突破する鍵は、Prometheusが隠し持つ最強の武器、「サブクエリ(Subquery)」にあります。今日は、単なる関数の使い方ではなく、オブザーバビリティの解像度を一段階引き上げるための「プロの領域」について話しましょう。
—
1. なぜ今、サブクエリなのか?
PromQLにおいて、レンジベクター(`[5m]`など)は単体ではグラフ化できず、関数(`rate`, `sum_over_time`など)に食わせる必要があります。しかし、「レート計算された結果に対して、さらに平均を取る」といった多段階の計算をしようとすると、通常のクエリでは力尽きます。
そこでサブクエリの出番です。構文は極めてシンプルです。
- `
` : 過去どのくらいの期間を対象にするか。 - `
` : その期間をどの程度の解像度(ステップ)でサンプリングするか。
なぜこれが重要か?
サブクエリは、「時系列データの一時的な加工」をクエリ実行時にオンメモリで行います。これにより、複雑な派生メトリクスを定義することなく、即座にトレンド分析や統計的異常検知が可能になります。
—
2. 実戦:サブクエリによる「真の」異常検知
例えば、「過去1時間のレートの平均値が、急激に上昇した瞬間」を検知したい場合、以下のように記述します。
過去1時間のrate(http_requests_total[5m])の平均値を算出する
avg_over_time(rate(http_requests_total[5m])[1h:1m])
ここで重要なのは解像度(`:1m`)の選定です。ここが粗すぎるとスパイクを見逃し、細かすぎるとクエリ負荷が爆発します。「スクレイピング間隔の2倍から3倍」を基準にするのが、パフォーマンスと精度のバランスを取る黄金律です。
—
3. 現場を救う「神」設定とベストプラクティス
サブクエリを使いこなすには、Prometheusの設計そのものが「汚れていない」ことが前提です。
ベストプラクティス:YAML構成の極意
チーム開発において、Prometheus設定は「DRY(Don’t Repeat Yourself)」を徹底せよ。
prometheus.yml の分割管理
rule_files はディレクトリ指定で管理し、役割ごとに分割する
rule_files:
- “rules/alerts/.yml” # 異常検知ルール
- “rules/recordings/.yml” # 高負荷クエリを事前計算化するレコーディングルール
実践的なRecording Ruleの例
サブクエリを多用するとクエリが重くなるため、頻出する計算は記録ルールへ逃がす
groups:
- name: traffic_analysis
rules:
- record: job:http_requests:avg_rate_1h
expr: avg_over_time(rate(http_requests_total[5m])[1h:1m])
テックリードの助言: 「とりあえずサブクエリ」は禁物です。計算コストが線形に増大するため、ダッシュボードで多用する場合は必ず `record` で永続化してください。
—
4. 生産性を極限まで高める周辺ツール・Tips
① VS Codeの強力な味方「Prometheus YAML」プラグイン
設定ファイルを書く際、`Prometheus YAML` プラグインは必須です。構文チェックをリアルタイムで行い、スペルミスによるデプロイ失敗を未然に防ぎます。
② ショートカットで差をつけろ(Grafana編)
ダッシュボード構築でマウスをカチカチ動かしている時間は無駄です。
- `Shift + I`: クエリのフォーマット整形(見やすさは正義)。
- `Ctrl + Enter`: クエリ実行。
- `d + t`: 時間範囲の切り替え(ショートカットでクエリの検証速度を上げる)。
③ チーム共有化ルール
「クエリのURLをSlackに貼る」のは卒業しましょう。
- Grafanaの `Share` リンクにパラメータを含める際は、必ず `var-` 変数を使って環境やクラスタを切り替え可能にすること。
- `awesome-prometheus-alerts` などのコミュニティ資産をベースに、自社のサービス特性に合わせた「独自のラベル名」を統一すること(例:`app_id`, `env`, `tier`)。
—
最後に:なぜ「監視」ではなく「オブザーバビリティ」なのか
サブクエリを使いこなすということは、「データの中に隠れた『意味』を抽出する」という行為です。ただエラーが起きたら鳴るだけの監視は、もはや過去の遺物です。
「このメトリクスのトレンドは、昨日の同時刻とどう違うのか?」
「ユーザーの体験が劣化する前に、リソースの制約をどう予測するか?」
サブクエリはそのための強力なレンズです。使いこなせば、障害が起きる前に「予兆」を掴み、誰よりも早く修正パッチを当てるエンジニアになれるはずです。
さあ、コードを開いてください。あなたのPrometheusに、新しい視界を実装する時間です。