オブザーバビリティの世界へようこそ。Prometheusは、単なる「監視ツール」ではありません。システムの「脈拍」を可視化し、異常を未然に防ぐための強力な武器です。
あなたが今、Prometheusのトラブルシューティングという荒波に揉まれているなら、それはあなたが「現場の責任あるエンジニア」として一歩前進した証拠です。今日は、教科書には載っていない「現場の泥臭い戦い方」を伝授します。
—
1. “Context deadline exceeded” の正体と、タイムアウトの設計思想
Prometheusで最も頻繁に遭遇するこのエラー。これは「Prometheusがターゲットにデータを要求したが、制限時間内に返事が来なかった」ことを示しています。
原因の深層:
単なるネットワーク遅延だけでなく、「ターゲット側の処理負荷による応答停止」が真犯人であることが多いです。
- 対処法: `scrape_timeout` を安易に伸ばすのは悪手です。まずは `scrape_interval`(収集間隔)の半分以下に収まるように設計してください。
- プロのアドバイス: `prometheus.yml` での個別設定が鍵です。
scrape_configs:
- job_name: ‘heavy-service’
scrape_interval: 30s
scrape_timeout: 10s # intervalの1/3程度に抑えるのが健全
static_configs:
- targets: [‘service-a:8080’]
もし頻発する場合は、ターゲット側で「メトリクスの生成処理」自体が重くなっていないか、Prometheus側ではなくアプリケーション側を疑ってください。
—
2. ターゲットが “DOWN” になる時のデバッグ手順
ターゲットがDOWNしたとき、慌ててサーバーを再起動してはいけません。以下の順序で「論理的な消去法」を実行してください。
1. 疎通確認の基本: Prometheusのコンテナ内から `curl -v
2. DNSの罠: Docker環境では、Docker DNSの解決失敗がよくあります。IPアドレス直接指定で接続できるか確認してください。
3. セキュリティグループ: ターゲット側のポート(例: 9090や9100)が、Prometheusのセキュリティグループからのインバウンドを許可しているか確認します。
4. 死活監視の視点: PrometheusのUI画面(`/targets`)に表示されるエラーメッセージが「Connection refused」か「EOF」かを見極めてください。EOFならアプリがクラッシュしています。
—
3. メモリリーク:Prometheusが死ぬ原因の8割
Prometheusはメトリクスをメモリ上で管理します。「メモリが足りない」という事態は、「カーディナリティ(時系列データの多様性)の爆発」が原因であることがほとんどです。
- 何が起きているのか?: 例えば、ユーザーIDやURLのクエリパラメータをラベルとして保存していませんか? `http_requests_total{user_id=”12345″}` のように。これを行うと、無限に時系列データが生成され、Prometheusはメモリを食いつぶします。
- 対策: ラベルには「有限の数になるもの(ステータスコード、インスタンスID、メソッド名など)」だけを使用してください。
- 切り分け: `prometheus_tsdb_head_series` メトリクスを監視し、グラフが右肩上がりで止まらない場合は、即座にラベル設計を見直しましょう。
—
4. PromQLのNaN値と構文エラーのデバッグ
「グラフが途切れる」「NaNが表示される」。これはPrometheusが「データが存在しない」と判断している状態です。
- NaNの原因: ゼロ除算や、メトリクスが一時的に消失(再起動など)した場合に発生します。
- 対処法: `or` 演算子や `vector(0)` を活用して、欠損値を補完するのが現場の知恵です。
欠損時に0を表示する魔法
(rate(http_requests_total[5m])) or vector(0)
—
初心者へのプレゼント:HelloWorld的セットアップ
まずは、Prometheus自体をDockerで動かし、自分自身のメトリクスを覗くところから始めましょう。
docker-compose.yml
version: ‘3’
services:
prometheus:
image: prom/prometheus
ports:
- “9090:9090”
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
prometheus.yml
global:
scrape_interval: 15s
scrape_configs:
- job_name: ‘prometheus’
static_configs:
- targets: [‘localhost:9090’]
この設定で起動し、ブラウザで `http://localhost:9090` を開いてください。
「Graph」タブで `prometheus_build_info` と入力して実行しましょう。これが、あなたのシステムを監視するための「最初の1ビット」です。
—
最後に:あなたへ贈る言葉
監視は「守り」に見えて、実は「攻め」の技術です。トラブルを早期に発見し、スマートに解決できるエンジニアは、組織において最も信頼されます。
Prometheusは奥が深いツールです。最初はエラーに怯えるかもしれませんが、それはあなたがシステムと深く向き合っている証拠。一つずつ設定値を調整し、メトリクスの海を泳ぎこなせるようになれば、毎日のオンコールが劇的に、そして確実に楽になりますよ。
さあ、次はどんなメトリクスを可視化してみますか?