大家好!今天,我想和大家聊聊每个开发者都应该了解的监控核心概念——指标和时间序列数据的基数(Cardinality)。
我们使用各种监控系统(例如:Prometheus、Datadog)来了解服务的状态。我们收集了无数指标(Metric),如CPU使用率、内存占用率、API请求数等。但是,您是否曾有过“监控仪表盘突然变慢或成本急剧增加”的经历?🤔 罪魁祸首可能就是“高基数(High Cardinality)”问题!

📊 指标和时间序列数据,从基础开始了解
首先,我们来掌握基本概念。
- 指标 (Metric): 我们想要测量的值的名称。例如,http_requests_total(HTTP请求总数)。
- 属性/维度/标签 (Attribute/Dimension/Label): 包含指标详细信息的“标签”。它由key-value对组成。
- method=”GET”
- status_code=”200″
- region=”ap-northeast-2″
指标和属性的每个组合都会创建一个唯一的时间序列(Time Series)数据。
举个例子:
- http_requests_total{method=”GET”, status_code=”200″, region=”ap-northeast-2″} 👉 一个时间序列
- http_requests_total{method=”POST”, status_code=”200″, region=”ap-northeast-2″} 👉 另一个时间序列
- http_requests_total{method=”GET”, status_code=”404″, region=”us-east-1″} 👉 一个全新的时间序列
像这样,即使是相同的指标名称,如果附加的标签组合不同,也会被视为完全独立的数据流。
🔢 那么,“基数”是什么?
基数(Cardinality)就是指“唯一时间序列数据的总数”。
基数可以通过将每个属性可能拥有的唯一值的数量相乘来计算。
简单示例: 假设有一个名为login_attempts(登录尝试)的指标。
- 属性 1: device (可能的值:mobile, desktop, tablet 👉 3个)
- 属性 2: country (可能的值:KR, US, JP, CN 👉 4个)
在这种情况下,login_attempts指标的总基数是多少?
📱💻 3 (device) x 🌍 4 (country) = 12个
总共生成12个唯一的时间序列数据。这属于完全没有问题的“低基数”。
💥 高基数(High Cardinality)的陷阱
问题在于当属性值中出现几乎无限的唯一值时。
危险示例: 想象一下,给api_latency_seconds(API响应时间)这个指标添加以下属性。
- 属性 1: endpoint (可能的值:/users, /orders, /products 👉 3个)
- 属性 2: user_id (可能的值:1, 2, 3, …, 1,000,000 👉 100万个)
这个指标的基数会是多少?
🚀 3 (endpoint) x 👤 1,000,000 (user_id) = 3,000,000个 😱
仅仅添加了一个user_id,瞬间就爆炸性地生成了300万个时间序列数据。这就是高基数的问题。
这种情况会导致以下严重问题:
- 💰 成本飙升: 大多数监控服务都根据时间序列数据的数量收费。基数越高,需要存储和处理的数据越多,可能导致巨额账单。
- 🐢 性能下降: 查询和聚合数百万个时间序列数据的操作会非常缓慢。对于需要实时响应故障的监控系统来说,这是致命的。
- 🔥 系统不稳定: 监控系统本身可能无法承受过高的负载,并可能因内存不足(OOM)等原因而崩溃。
✅ 智能管理基数
那么,如何避免这个可怕的基数问题呢?
- 谨慎选择标签!
- 绝对不能使用的值: user_id, request_id, session_id, email, 精确的timestamp等唯一且可能无限增长的值,请勿用作标签。❌
- 适合使用的值: environment (prod/stg), region, http_method (GET/POST), error_code_group (2xx, 4xx, 5xx)等可以分组且可预测的集合值。✅
- 将唯一信息记录到日志(Log)中!
- 像user_id或request_id这样特定事件的详细信息,应该记录在结构化日志(Structured Log)中,而不是作为指标的标签。🪵
- 区分职责:指标用于查看“聚合趋势”,日志用于追踪“单个事件”。
- 限制标签的数量。
- 给一个指标附加过多的标签是潜在的基数爆炸原因。养成只添加必要的、核心维度的标签的习惯是很好的。
✨ 总结
基数是一个强大的工具,可以帮助我们更深入地分析数据,但如果使用不当,它就像一把双刃剑,可能使整个监控系统瘫痪。
从今天开始,我们不妨检查一下我们收集的指标的标签?希望您能通过智能的基数管理,构建一个稳定高效的监控环境!💪
发表回复