2、指标口径设计原则:明确业务语义、避免指标爆炸、命名规范
指标口径(Metric Instrumentation)是自定义指标体系的骨架。口径设计一旦偏离业务语义或缺乏约束,轻则导致数据解读歧义,重则引发指标爆炸、存储成本失控。本节从三个核心原则展开:业务语义明确、避免指标爆炸、命名规范,并给出 OpenTelemetry 的最佳实践对照。
2.1 原则一:明确业务语义
每个指标必须能回答三个问题:测量什么(What)、在什么维度上(Where)、代表什么业务含义(Why)。
| 维度 | 反例(语义模糊) | 正例(语义明确) |
|---|---|---|
| 指标名称 | request_count |
http.server.request_count |
| 单位 | 无单位 / 默认 | {requests} 或 {bytes} |
| 描述 | “请求数量” | “HTTP 服务端接收到的请求总数,按 method、route、status_code 区分” |
| 标签 | type、code |
http.method、http.route、http.status_code |
最佳实践:在定义指标前,先编写一份“指标字典”,包含名称、单位、描述、标签列表、聚合方式。字典通过团队评审后再进行埋点编码,避免后期返工。
2.2 原则二:避免指标爆炸
指标爆炸通常由高基数标签(High Cardinality Labels)引发。例如将 user_id、request_id、session_id 直接作为标签,会导致时间序列数量呈指数级增长。
下表列出常见的高基数来源与应对策略:
| 高基数来源 | 典型值范围 | 推荐处理方式 |
|---|---|---|
user_id |
百万级 | 移出标签,改用日志或 Trace 关联 |
request_id |
无限 | 禁止作为指标标签,仅用于 Trace |
ip_address |
十万级 | 聚合为 ip_prefix 或地理标签 |
session_id |
百万级 | 使用 Histogram 聚合,不保留独立标签 |
error_message |
千级 | 提取 error_type 枚举,保留有限类别 |
避坑提醒:不要为了“未来可能有用”而提前添加高基数标签。每个额外标签都会增加存储成本、查询延迟和告警噪声。遵循“按需添加,用完即弃”原则。
2.3 原则三:命名规范(OTel 命名规范与最佳实践)
OpenTelemetry 在 Semantic Conventions 中定义了指标命名规范,核心规则如下:
- 命名空间前缀:使用
namespace.开头,例如http.server.、db.client.、messaging.。 - 小写字母 + 下划线:禁止使用大写字母、驼峰、连字符。例如
request_duration而非requestDuration或request-duration。 - 单位后缀:如果指标有明确单位,在名称末尾添加
_seconds、_bytes、_total等后缀。例如http.server.request_duration_seconds。 - 避免冗余:不要在名称中重复命名空间。例如
http.server.http_request_count中的http重复,应改为http.server.request_count。 - 标签名使用点分隔:例如
http.method、http.status_code,保持与 Semantic Conventions 一致。
以下是一个符合 OTel 规范的指标定义示例:
// 符合 OTel 规范的指标定义
metric_name: "http.server.request_duration_seconds"
metric_type: Histogram
unit: "seconds"
description: "HTTP 服务端请求处理耗时,按路由和方法区分"
attributes:
- name: "http.method"
type: string
description: "HTTP 请求方法,如 GET、POST"
- name: "http.route"
type: string
description: "路由模板,如 /api/users/:id"
- name: "http.status_code"
type: int
description: "HTTP 响应状态码,如 200、404"
命名检查清单:
- 是否以
namespace.开头? - 是否全部小写 + 下划线?
- 是否包含单位后缀(如
_seconds、_bytes)? - 标签名是否使用点分隔且与语义惯例一致?
- 是否避免了高基数标签?
2.4 口径设计流程总览
下图展示了从业务需求到指标埋点的完整设计流程,帮助你在实际项目中落地上述原则:
2.5 常见口径设计反模式
- “万能指标”反模式:用一个指标携带所有标签,试图覆盖所有查询场景。结果导致基数爆炸,查询性能急剧下降。
- “标签即字段”反模式:将数据库字段直接映射为标签,不考虑基数与业务相关性。例如将
product_sku(百万级)直接作为标签。 - “命名随意”反模式:团队内不同成员使用不同命名风格,如
req_count、requestCount、request-count,导致指标无法统一查询。 - “无单位”反模式:指标名称不包含单位,使用者需要猜测是毫秒还是秒,是字节还是千字节。
推荐工具:在团队内推行
otel-cli 或自定义的指标定义校验工具,在 CI 阶段自动检查命名规范、标签基数、单位后缀,将口径设计原则固化为自动化规则。