Metrics Cardinality Explosion Sizer

Visualize the terrifying Datadog/Prometheus bill caused by tagging metrics with unbounded cardinality (like user_id).

Active Time Series

3,000,000

Monthly APM Bill

$150,000

Cost Scale by Cardinality

โš ๏ธ Cardinality Trap: Never put high-entropy strings (`uuid`, `email`, `request_id`, `ip_address`) as metric tags. Use logs or OpenTelemetry distributed tracing instead.

Cardinality Multiplies โ€” It Doesn't Add

Every dimension you tag a metric with is a multiplier on the number of distinct time series your monitoring backend has to store and bill for, not an additive cost. This calculator makes that concrete: totalTimeSeries = baseMetrics ร— environments ร— regions ร— userCardinality. At the defaults โ€” 50 base metrics, 3 environments, 4 regions, 5,000 unique tag values โ€” that's 50 ร— 3 ร— 4 ร— 5,000 = 3,000,000 active time series, priced here at Datadog's modeled custom-metrics rate of roughly $5.00 per 100 series/month. Adding one more region or environment feels incremental; multiplying the existing cardinality by it is not.

The Tag You Should Never Add

The single input that dominates this formula in practice is the last one โ€” a high-entropy tag value like user_id. Going from 500 to 5,000 unique users tagged on every metric doesn't add 4,500 series; it multiplies your entire existing series count by 10x, because cardinality compounds across every base metric, environment, and region combination that already exists. The same trap applies to any unbounded label: request_id, email, ip_address, session UUIDs. None of these belong as metric tags โ€” they belong in structured logs or as span attributes in distributed tracing, where per-event cardinality is expected and priced differently than per-series cardinality.