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を書くことは、サービスの状態を言語化することだ。
「なぜこのアラートが鳴るのか?」「このグラフは本当にユーザーの体験を示しているのか?」
ツールを使うだけでなく、常にその裏にある「ユーザーの痛み」を想像してクエリを書いてほしい。
良いクエリはシンプルで、かつ物語を語る。
さあ、コンソールを開け。そして、システムが発する静かな悲鳴を、君の手で可視化してくれ。健闘を祈る。