【メトリクスカーディナリティ】
メトリクスカーディナリティ とは?
💡 ラベルを増やすほどデータが爆発する、メトリクス監視の「組み合わせ地雷」。
📌 このページのポイント
- カーディナリティとはラベル値の組み合わせ総数のこと
- user_idやrequest_idをラベルに入れると時系列数が無限に増える(高カーディナリティ問題)
- PrometheusやDatadogではカーディナリティが高いと保存コストとクエリ速度が悪化する
- 解決策はラベルに使う値を有限の列挙型に絞ること
メトリクスカーディナリティって名前が難しいけど、何なの?
メトリクスに付けるラベルの値の組み合わせ数のことだよ。たとえばstatusというラベルに「200・404・500」の3種類があれば、カーディナリティは3だね。
組み合わせが増えると何が困るの?
PrometheusやDatadogでは、ラベルの組み合わせごとに別々の時系列データ(タイムシリーズ)が作られるんだよ。カーディナリティが高いと時系列の数が爆発して、ストレージもクエリも重くなるんだ。
爆発するのはどんなときなの?
user_idやrequest_idをラベルにするのが典型例だね。ユーザーが10万人いたら10万個の時系列が生まれる。さらに別のラベルと掛け合わさると、数百万〜数億にあっという間に膨らんでしまうんだ。
どうすれば防げるの?
ラベルの値を有限の列挙型に限定するのが基本だよ。status_codeなら「2xx・4xx・5xx」のように丸め、ユーザーIDのような無限に増える値は絶対にラベルに入れない。Prometheusの公式も「ラベルは慎重に」と強調しているよ。
もしうっかり高カーディナリティになったらどうなるの?
Prometheusならメモリ使用量が急増してOOMでクラッシュすることがあるし、DatadogやNew Relicはカーディナリティに応じて課金されるから月額費用が突然跳ね上がることもあるよ。「カーディナリティ爆発」はSREあるあるの怖い話なんだ。
まとめ:ざっくりこれだけ覚えればOK!
「メトリクスカーディナリティ」って出てきたら「ラベルの組み合わせ数が爆発してメトリクスが重くなる問題」と思えればだいたいOK!
📖 おまけ:英語の意味
「Metrics Cardinality」 = メトリクスの基数(組み合わせ数)
💬 カーディナリティ(Cardinality)はもともと集合論の「集合の要素数」を意味する数学用語で、データベースの「ユニーク値の数」と同じ意味でメトリクスの世界でも使われるようになったよ。