【メトリクスカーディナリティ】

メトリクスカーディナリティ とは?

💡 ラベルを増やすほどデータが爆発する、メトリクス監視の「組み合わせ地雷」。
📌 このページのポイント
メトリクスカーディナリティ 低カーディナリティ(良い) ラベル: status = {"2xx","4xx","5xx"} status=2xx status=4xx status=5xx 時系列数: 3 ✓ 軽量・高速 高カーディナリティ(危険) ラベル: user_id = 10万種類 … 以下10万行 時系列数: 100,000+ ✗ メモリ・コスト爆発 user_id 追加 → 対策: ラベル値を有限の列挙型に限定する 2xx / 4xx / 5xx のようにグループ化してカーディナリティを抑える
低カーディナリティと高カーディナリティの比較
ひよこ ひよこ

メトリクスカーディナリティって名前が難しいけど、何なの?

ペンギン先生 ペンギン先生

メトリクスに付けるラベルの値の組み合わせ数のことだよ。たとえばstatusというラベルに「200・404・500」の3種類があれば、カーディナリティは3だね。

ひよこ ひよこ

組み合わせが増えると何が困るの?

ペンギン先生 ペンギン先生

PrometheusDatadogでは、ラベルの組み合わせごとに別々の時系列データ(タイムシリーズ)が作られるんだよ。カーディナリティが高いと時系列の数が爆発して、ストレージクエリも重くなるんだ。

ひよこ ひよこ

爆発するのはどんなときなの?

ペンギン先生 ペンギン先生

user_idやrequest_idをラベルにするのが典型例だね。ユーザーが10万人いたら10万個の時系列が生まれる。さらに別のラベルと掛け合わさると、数百万〜数億にあっという間に膨らんでしまうんだ。

ひよこ ひよこ

どうすれば防げるの?

ペンギン先生 ペンギン先生

ラベルの値を有限の列挙型に限定するのが基本だよ。status_codeなら「2xx・4xx・5xx」のように丸め、ユーザーIDのような無限に増える値は絶対にラベルに入れない。Prometheusの公式も「ラベルは慎重に」と強調しているよ。

ひよこ ひよこ

もしうっかり高カーディナリティになったらどうなるの?

ペンギン先生 ペンギン先生

Prometheusならメモリ使用量が急増してOOMでクラッシュすることがあるし、DatadogやNew Relicはカーディナリティに応じて課金されるから月額費用が突然跳ね上がることもあるよ。「カーディナリティ爆発」はSREあるあるの怖い話なんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「メトリクスカーディナリティ」って出てきたら「ラベルの組み合わせ数が爆発してメトリクスが重くなる問題」と思えればだいたいOK!
📖 おまけ:英語の意味
「Metrics Cardinality」 = メトリクスの基数(組み合わせ数)
💬 カーディナリティ(Cardinality)はもともと集合論の「集合の要素数」を意味する数学用語で、データベースの「ユニーク値の数」と同じ意味でメトリクスの世界でも使われるようになったよ。
← 用語集にもどる