【入門編】PromQLにおけるサブクエリ(Subquery)の徹底解説:過去のデータ範囲に対する集計処理とユースケース – 運用監視・オブザーバビリティ活用バイブル

オブザーバビリティの深淵へようこそ。Prometheusを単なる「グラフを描くための道具」だと思っているなら、今すぐその認識を捨ててください。Prometheusは、時系列データの海を自在に操る「解析エンジン」です。

今日は、多くのエンジニアが「難しそう」と避けて通るサブクエリ(Subquery)の神髄を伝授します。これを理解すれば、過去のデータに対する集計精度が劇的に向上し、異常検知の解像度が別次元のものになります。

—

1. サブクエリとは何か?:時系列の「多次元編集」

通常、PromQLは「今の状態(インスタンスベクター)」か「過去一定期間の統計(レンジベクター)」を扱います。しかし、「過去一定期間の統計の推移を、さらに時系列で追いたい」という贅沢な要求に応えるのがサブクエリです。

基本構文:
`[クエリ範囲の集計関数] [サブクエリの期間:解像度]`
例: `rate(http_requests_total[5m])[1h:1m]`

これは、「過去1時間の各1分時点における、直近5分間の平均リクエストレート」を計算します。単なる過去のデータ表示ではなく、「過去のトレンドそのものをデータセットとして再処理する」という点が、サブクエリの本質です。

—

2. なぜ「サブクエリ」が必要なのか?

初心者が陥る罠に、「集計結果をさらに別の関数で包めない」という制約があります。
例えば、「過去1時間のレート変動の最大値を知りたい」場合、単純な `max(rate(…))` ではうまくいきません。ここでサブクエリの登場です。

  • トレンド分析: 「過去24時間のレートの推移」を計算し、その移動平均の「最大値」や「標準偏差」を算出する。
  • 異常検知の洗練: 単発のスパイクではなく、「過去1時間のレートが平均から大きく乖離し続けている期間」を抽出する。

—

3. 実践:HelloWorld的な導入と検証

まずはPrometheusを触ったことがない方でも再現できる、最もシンプルな確認方法を解説します。

手順1: Prometheusの起動(Docker利用)

ローカルに環境がない場合、これが最短です。

docker run -p 9090:9090 prom/prometheus

手順2: 動作確認クエリの入力

PrometheusのUI(`http://localhost:9090`)を開き、以下のクエリを入力してください。

直近1時間の、毎分ごとの5分間レートの移動平均
avg_over_time(rate(prometheus_http_requests_total[5m])[1h:1m])

このクエリが返すのは、「1時間の推移データ」から導き出された「単一の数値」です。これができると、ダッシュボードでの可視化が圧倒的に柔軟になります。

—

4. 現場で震えるほど役立つ「サブクエリ」の活用例

現場で最も重宝するのは「異常検知の誤検知(False Positive)の排除」です。

ケース:急激なリクエスト増を検知したいが、スパイクは無視したい

単純な `rate` では、一瞬のスパイクでアラートが鳴ります。そこでサブクエリの出番です。

過去15分間のレートの平均が、しきい値を超え続けているか?
avg_over_time(rate(http_requests_total[1m])[15m:1m]) > 100

このクエリは、「過去15分間、毎分計算されたレートの平均が100を超えたらアラート」という、非常に堅牢な条件を作ります。単なるスパイクで深夜に叩き起こされることはもうありません。

—

5. 習得のための注意点:レンジと解像度の「黄金比」

サブクエリを使う際、`[期間:解像度]` の指定には注意が必要です。

  • 期間: どのくらいの過去まで遡るか(例: `1h`)。
  • 解像度: どれくらいの細かさでデータを切るか(例: `1m`)。

黄金律:
サブクエリの解像度は、Prometheusのスクレイピング間隔(`scrape_interval`)よりも短く設定してはいけません。意味のない補間データが生成され、計算負荷だけが高まります。基本は「スクレイピング間隔と同じか、それ以上」に設定してください。

—

まとめ:あなたの運用は、もっとスマートになれる

サブクエリをマスターするということは、Prometheusを「計算機」として使いこなすということです。

1. 基本は `関数[レンジ]` の入れ子。
2. `[期間:解像度]` で過去を時系列として切り出す。
3. `avg_over_time` や `max_over_time` を組み合わせて、ノイズを排除する。

これを覚えれば、あなたはもう単なるオペレーターではありません。データの波を読み解き、システムの鼓動を正確に把握するアーキテクトです。

今日の業務から、ぜひこの「サブクエリ」を一行、アラート設定やダッシュボードに仕込んでみてください。世界が変わるはずです。何か詰まったら、いつでも聞いてくださいね。応援しています。

タイトルとURLをコピーしました