The math
Cardinality = product of unique label values across all labels. A metric with (region=10) × (env=3) × (service=50) × (user_id=10M) = 15 billion unique series. Each series consumes memory + storage. Costs scale linearly with cardinality, not request volume.
Advertisement
Label hygiene rules
Never label with high-cardinality user data: user_id, email, request_id, full URLs. Bucketize what you can (latency_bucket=fast/slow). Use enums for known-small sets (status_code, region). Logs/traces hold the high-cardinality data, not metrics.
Advertisement
Offending patterns
'Track per-user error rate' as a metric — wrong; do it as a log query. 'Track per-customer latency' — use exemplars on a single latency histogram. 'Track per-endpoint with /users/{id} unhashed' — route templates, not URLs.