【実務・中級編】PromQL完全入門!よく使う基本クエリと集計関数の実例まとめ – 運用監視・オブザーバビリティ活用バイブル

Prometheusを「ただの監視ツール」で終わらせるな。PromQLの深淵と運用の神髄

現場で戦うエンジニア諸君。Prometheusを「ダッシュボードにグラフを出すための道具」だと思っているなら、今すぐその認識を捨ててほしい。

Prometheusは、システムの「心拍」を読み解くための演算エンジンだ。PromQLを使いこなすことは、システムの健康状態をコードとして記述することに他ならない。本稿では、マニュアルの行間にある「現場で本当に役立つ」知見と、地獄のような障害対応から生還するためのテクニックを叩き込む。

—

1. PromQLの本質:データ型と「時間」の概念

PromQLは、単なる時系列データベースのクエリ言語ではない。「時間軸上の変化率を計算するための関数型言語」だ。

  • 瞬時ベクトル (Instant Vector): 「今、この瞬間」の状態。`http_requests_total` と打てば、全ラベルの現在の値が返る。
  • 範囲ベクトル (Range Vector): 「過去N分間のログの蓄積」。`http_requests_total[5m]` と書くと、過去5分間のサンプルセットが返る。ここが全ての計算の起点だ。

【現場の知見】
初心者はすぐに `sum(http_requests_total)` をしたがるが、カウンター値の合計に意味はない。カウンターは常に「増加」する。我々が知りたいのは「増加速度」だ。

—

2. 現場で「息をするように」使う関数とイディオム

rate vs irate

  • `rate(v[5m])`: 5分間の平均増加率。トレンドを見るのに最適。
  • `irate(v[5m])`: 直近2点のみを使用した瞬時の増加率。スパイク検知にはこちらが必須。 ただし、グラフが荒れるため注意が必要だ。

実践:成功率を計算する神のクエリ

エラー率を出す時、`error / total` をしたくなるが、それでは瞬間のゼロ除算でグラフが崩れる。

正解:sum関数とby句で次元を落としつつ、rateで正規化する
sum by (service) (rate(http_requests_total{status=~”5..”}[5m]))
/
sum by (service) (rate(http_requests_total[5m]))

  • ポイント: `by (service)` を忘れると、サービスごとの区別がつかなくなり、単なるノイズの塊になる。

—

3. パフォーマンスを意識した「悪手」を避ける

PromQLを重くするのはクエリそのものより、「巨大なカーディナリティ(ラベルの組み合わせ数)」だ。

  • 悪手1: `count(http_requests_total{url=~”/api/.”})` のような、ラベル値に対する正規表現マッチ。これは全時系列をスキャンするため、Prometheusを殺す。
  • 悪手2: `sum(…) by (user_id)`。IDのような高カーディナリティなラベルで集計してはならない。メモリが枯渇し、OOM Killerに殺されるのがオチだ。

【回避策】
高カーディナリティなデータは、Prometheusではなく、Prometheusの背後にいる ThanosやCortex、あるいはElasticsearch等のログ基盤 へ逃がせ。Prometheusの役割は「高速なアラート」と「サマリー」に特化させることだ。

—

4. プロの運用:生産性を極限まで高めるTips

開発スピードを加速するキーボードショートカット

Prometheus UI(またはGrafana)で作業する際、マウスは使うな。

  • `Ctrl + Enter`: クエリ実行。
  • `Ctrl + /`: 一行コメントアウト(PromQLでは `#` が使える)。

チーム開発のためのベストプラクティス構成 (YAML)

`prometheus.yml` は分割せよ。すべてを1ファイルに詰め込むのは素人だ。

prometheus.yml (メイン)
rule_files:

  • “rules/alerts/.yml” # アラートルール
  • “rules/recording/.yml” # 重い計算結果を事前保存するためのルール

scrape_configs:

  • job_name: ‘kubernetes-pods’

kubernetes_sd_configs:

  • role: pod

# 現場の知見:再ラベル化(relabel_configs)で不要なラベルをドロップせよ
# これによりメモリ使用量を30%削減できる
relabel_configs:

  • source_labels: [__meta_kubernetes_pod_label_component]

regex: ‘.-unused-.’
action: drop

絶対に入れるべき神プラグイン・ツール

1. [PromLens](https://promlens.com/): クエリの実行計画を可視化する。遅いクエリの原因が「どこで時間がかかっているか」が一目で分かる。
2. [Prometheus Operator](https://prometheus-operator.dev/): Kubernetes環境なら必須。`ServiceMonitor` を使うことで、エンジニアが監視設定をコード(CRD)として管理できる。

—

最後に:オブザーバビリティは「哲学」である

PromQLを書くことは、サービスの状態を言語化することだ。
「なぜこのアラートが鳴るのか?」「このグラフは本当にユーザーの体験を示しているのか?」
ツールを使うだけでなく、常にその裏にある「ユーザーの痛み」を想像してクエリを書いてほしい。

良いクエリはシンプルで、かつ物語を語る。
さあ、コンソールを開け。そして、システムが発する静かな悲鳴を、君の手で可視化してくれ。健闘を祈る。

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