2、核心概念:指标(Metric)、维度(Dimension)、标签(Label/Tag)、基数(Cardinality)的定义与关系

在 Traffic 指标采集与治理体系中,指标、维度、标签与基数是构成可观测性数据的四大基石。理解它们的定义与相互关系,是进行有效维度治理的前提。本节将逐一拆解这些核心概念,并阐明它们如何在时序数据模型中协同工作。

2.1 指标(Metric)

指标是描述系统某一可测量特征的量化数据,通常是一个随时间变化的数值序列。在 Traffic 场景中,指标代表业务或技术层面的关键性能指标(KPI)。

  • 本质:一个命名的时间序列集合,用于描述“什么被测量”。
  • 特征:具有明确的名称、数据类型(如 Counter、Gauge、Histogram)和测量单位。
  • 示例:http_requests_total(总请求数)、api_latency_seconds(API 延迟)、active_users(活跃用户数)。
治理要点:指标名称应遵循统一的命名规范(如 namespace_subsystem_unit_suffix),避免歧义和重复。一个良好的指标名称本身就是一份文档。

2.2 维度(Dimension)与标签(Label/Tag)

维度是描述指标数据特征的分类属性,用于对指标进行细分和过滤。在 Prometheus 生态中,维度通过标签(Label)实现;在其他系统(如 InfluxDB、OpenTSDB)中,常被称为标签(Tag)。

  • 维度(Dimension):逻辑概念,指代一个分类轴,如“地域”、“服务版本”、“HTTP 方法”。
  • 标签(Label/Tag):物理实现,是键值对(Key-Value Pair),附加在指标上,用于标识维度的具体取值。
概念 定义 示例 治理关注点
维度(Dimension) 指标的分类属性轴 method、status_code、region 维度是否必要?是否可降维?
标签(Label) 维度的键值对实现 method="GET"、status="200" 标签值是否可控?是否包含高基数数据?
标签键(Label Key) 维度的名称 method、status、region 键名是否规范?是否与已有维度冲突?
标签值(Label Value) 维度的具体取值 GET、200、us-east-1 值集合是否有限?是否稳定?
关键区别:维度是“列”,标签是“单元格”。治理时,我们首先审视维度是否合理,再检查标签值的质量。

2.3 基数(Cardinality)

基数是指一个标签键(维度)下所有可能取值的数量。它是维度治理中最核心、最危险的指标。

  • 低基数:取值数量有限且稳定,如 method(GET、POST、PUT、DELETE)——通常不超过 10 个。
  • 中基数:取值数量在几十到几百之间,如 status_code(200、404、500 等)——通常可控。
  • 高基数:取值数量极大,如 user_id、request_id、ip_address——可能导致存储爆炸和查询性能崩溃。
高基数陷阱:一个指标如果包含一个高基数标签(如 user_id),其时间序列数量 = 标签值数量的乘积。假设有 3 个标签,每个标签有 1000 个值,则总序列数 = 1000 × 1000 × 1000 = 10 亿。这足以压垮任何时序数据库。

2.4 四者关系:从指标到时间序列

指标、维度、标签和基数共同决定了时间序列的生成逻辑。以下 SVG 图展示了从指标定义到具体时间序列实例的完整链路。

指标 → 维度 → 标签 → 基数 → 时间序列 指标 (Metric) http_requests_total 维度 (Dimension) method, status, region (逻辑分类轴) 标签 (Label/Tag) method="GET" status="200" region="us-east-1" 基数 Cardinality (值数量) 时间序列实例(由标签组合唯一标识) 序列 1 method="GET", status="200", region="us-east-1" 基数贡献:method(1) × status(1) × region(1) = 1 序列 2 method="POST", status="500", region="eu-west-1" 基数贡献:method(2) × status(2) × region(2) = 8 序列 N method="DELETE", status="404", region="ap-southeast-1" 基数贡献:method(4) × status(50) × region(10) = 2000 基数爆炸公式 总时间序列数 = 标签值数量的笛卡尔积 例:method(4) × status(50) × region(10) = 2000 个序列 若加入 user_id(10000),则总序列数 = 4 × 50 × 10 × 10000 = 20,000,000

2.5 核心关系总结

四者之间的关系可以用以下逻辑链条概括:

  1. 指标是“测量什么”的命名容器。
  2. 维度是“从哪些角度切分”的逻辑分类。
  3. 标签是“具体切分取值”的物理键值对。
  4. 基数是“每个维度有多少种取值”的量化指标。
  5. 指标 + 标签组合 = 唯一的时间序列。
  6. 基数越高,时间序列数量呈笛卡尔积增长,存储和查询成本指数级上升。
治理黄金法则:在定义指标时,优先固定低基数维度(如 method、status),谨慎引入中基数维度(如 region、service),严格禁止高基数维度(如 user_id、request_id)直接作为标签。高基数数据应通过日志或事件系统处理,而非指标系统。

2.6 常见误区与避坑

误区 错误表现 正确做法
维度与标签混为一谈 认为“加个标签就是加个维度”,不考虑基数影响 先评估维度必要性,再决定是否实现为标签
忽略基数爆炸 将 user_id、session_id 直接作为标签 使用聚合指标或日志替代,或通过 job 级别聚合
标签值无约束 标签值包含空格、特殊字符、大小写混用 制定标签值规范,使用枚举或正则校验
过度维度化 为每个可能的属性都创建维度 遵循“够用就好”原则,只保留必要的分析维度