やあ、オブザーバビリティの世界へようこそ。Prometheusという強力な武器を手に入れた君は、今まさにシステムの「鼓動」を可視化しようとしている。素晴らしい選択だ。
しかし、多くのエンジニアが最初の数ヶ月で直面する「見えない壁」がある。それが「カーディナリティ爆発」だ。今日は、君が将来的に運用で泣きを見ないために、Prometheusの設計における「聖域」と「禁忌」を伝授しよう。これを理解すれば、君はただの監視ツール使用者ではなく、システムの健康を守るアーキテクトになれる。
—
1. なぜ「カーディナリティ」があなたのシステムを殺すのか
Prometheusのデータモデルは、ラベルの組み合わせ(時系列)で成り立っている。
`http_requests_total{method=”GET”, path=”/api/v1/users”}`
この組み合わせが1つ増えるごとに、Prometheusはメモリを消費し、インデックスを更新する。
もし、ここに変なデータが混ざるとどうなるか?
例えば、`user_id` をラベルに含めたら、ユーザーが1万人増えるたびに1万個の新しい時系列が生成される。100万回のリクエストがあれば、メモリは瞬く間に枯渇し、PrometheusはディスクI/Oの海で溺れ、クエリはタイムアウトする。「監視のための監視」がシステムをダウンさせる……これがカーディナリティ爆発の恐怖だ。
—
2. 絶対にやってはいけない「NGデータ」のリスト
Prometheusのラベルは「検索・集約するためのもの」であって、「個別のログを保存するための場所」ではない。以下のデータは、ラベルに入れてはいけない。
- UUIDや一意なリクエストID: 組み合わせが無限に増える最悪のパターン。
- ユーザーID・メールアドレス: 特定のユーザーの動きを追いたいなら、ラベルではなく「ログ」や「分散トレース(Jaeger/Tempo等)」の領域だ。
- タイムスタンプ: 数秒ごとに値が変わるものをラベルに含めると、時系列が爆発的に断片化する。
- 動的なURLパラメータ: `/api/users/123` のようにIDを含むパスをそのまま入れるのは厳禁。
鉄則: ラベルは「集約して意味があるもの(環境、サービス名、ステータスコード、メソッドなど)」に限定せよ。
—
3. 実践:カーディナリティを防ぐデータモデリングの極意
ステップ1:インストールと基本セットアップ
まずはDockerでサクッと動かしてみよう。`prometheus.yml`を以下のように配置する。
global:
scrape_interval: 15s # 精度と負荷のバランスをとる
scrape_configs:
- job_name: ‘my-service’
static_configs:
- targets: [‘localhost:8080’]
ステップ2:ラベルリネーミングによる「集約」のテクニック
もしアプリケーションが「`/api/users/123`」というパスをメトリクスとして吐き出しているなら、これを正規化して「`/api/users/:id`」に変換する必要がある。Prometheusの `relabel_configs` を使えば、取り込み時にガードを張れる。
scrape_configs:
- job_name: ‘my-service’
metrics_path: /metrics
# ラベルを書き換えて、IDなどの変動要素を削除する
metric_relabel_configs:
- source_labels: [__name__, path]
regex: ‘http_requests_total;/api/users/.’
replacement: ‘/api/users/:id’
target_label: path
こうすることで、何万人のユーザーがいようと、メトリクス上のパスは1つに集約される。これが「設計による防御」だ。
—
4. Hello World: 正しいメトリクスの刻み方
開発者がメトリクスを実装する際、最も重要なのは「どう集計したいか」から逆算することだ。
NG: 個別のリクエストIDをラベルに入れない
counter.labels(request_id=uuid.uuid4()).inc()
OK: 集約可能なカテゴリで刻む
http_requests_total.labels(
method=”GET”,
endpoint=”/api/users”,
status=”200″
).inc()
このコードをデプロイし、Prometheus UI(`http://localhost:9090`)を開いて `sum(http_requests_total) by (endpoint)` を実行してみてほしい。ノイズのない、美しいグラフが描画されるはずだ。これが、あなたがこれから守るべきシステムの「正常な姿」だ。
—
最後に:先輩からのアドバイス
オブザーバビリティの本質は、「何が起きているか」を迷わず追えることにある。ラベルを増やせば増やすほど、データは詳細になるが、同時に「ノイズ」も増える。
「このラベルを増やして、私はどんな問いに答えたいのか?」
常に自問自答すること。もしその問いが「特定のユーザーの挙動」なら、それはラベルではなく、トレースやログの出番だ。適材適所でツールを使い分けることこそが、伝説的なエンジニアへの第一歩だよ。
さあ、恐れずにPrometheusを使いこなしてくれ。君の運用ライフが、今日から劇的に楽になることを約束するよ!