2. Metric Design 基础:设计原则、类型与命名规范

可观测性体系的核心是 Metric(指标)。设计不良的 Metric 会导致告警风暴、误报频发,甚至无法定位故障根因。本节从设计原则、类型选择、命名规范三个维度,建立 Metric Design 的底层共识,为后续异常检测与 MTTR 复盘打下基础。

2.1 Metric 设计三大原则

优秀的 Metric 设计遵循以下原则,确保数据在采集、存储、查询、告警全链路中保持高信噪比。

原则 说明 反例 正例
USE 原则 每个资源关注 Utilization(利用率)、Saturation(饱和度)、Errors(错误) 只监控 CPU 使用率,忽略队列长度 CPU 使用率 + 运行队列长度 + 错误计数
RED 原则 每个服务关注 Rate(速率)、Errors(错误)、Duration(延迟) 只监控 QPS,忽略错误率 请求速率 + 5xx 错误率 + P99 延迟
面向用户 优先定义用户可见的指标(SLO),再推导内部组件指标 先定义数据库连接池大小 先定义首页加载时间 SLO,再反推各依赖指标
实践建议: 新服务上线时,先按 RED 原则定义 3 个黄金指标,再按 USE 原则补充基础设施指标。避免一开始就设计上百个指标,导致存储成本激增和信噪比下降。

2.2 Metric 类型:Counter、Gauge、Histogram

主流可观测性系统(Prometheus、OpenTelemetry)将 Metric 分为三种核心类型。选择错误的类型会导致数据语义失真,直接影响异常检测的准确性。

类型 语义 典型场景 运算方式 异常检测关注点
Counter 只增不减的累计值(重启后归零) 请求总数、错误总数、CPU 时间 rate() / increase() 速率突增或突降
Gauge 可增可减的瞬时值 内存使用量、连接数、温度 直接取值 / avg() / max() 阈值越界、波动幅度
Histogram 观测值的分布统计(桶 + 总和 + 计数) 请求延迟、响应大小 histogram_quantile() 延迟分位数(P50/P99)漂移
常见误区: 将延迟用 Gauge 记录每次请求的耗时,而不是用 Histogram。Gauge 会丢失分布信息,无法计算 P99,且频繁更新导致存储膨胀。始终使用 Histogram 记录延迟分布。
三种 Metric 类型对比与数据流 三种 Metric 类型对比与数据流 Counter 只增不减 · 累计值 例:http_requests_total Gauge 可增可减 · 瞬时值 例:memory_usage_bytes Histogram 分布统计 · 分位数 例:http_request_duration rate() / increase() avg() / max() / min() histogram_quantile() 💡 异常检测场景选择: • 速率异常 → Counter + rate() 检测突增/突降 • 阈值异常 → Gauge + 静态/动态阈值检测 • 延迟漂移 → Histogram + 分位数漂移检测

2.3 Metric 命名规范

统一的命名规范是团队协作和自动化工具(告警规则、仪表盘、异常检测模型)正确解析指标的前提。推荐遵循 OpenMetrics 命名标准,并结合组织内部约定。

2.3.1 核心命名规则

  • 命名空间前缀:使用 namespace_ 区分层级,如 kube_、node_、app_。
  • 下划线分隔:全部小写,单词间用下划线连接,禁止使用驼峰或连字符。
  • 单位后缀:明确单位,如 _bytes、_seconds、_total、_count。
  • 类型后缀:Counter 以 _total 结尾,Histogram 包含 _bucket、_sum、_count。
  • 避免冗余:不重复命名空间内的信息,如 app_requests_total 而非 app_app_requests_total。

2.3.2 命名规范示例

类型 错误命名 正确命名 说明
Counter http.requests http_requests_total 使用下划线,加 _total 后缀
Gauge MemoryUsage node_memory_usage_bytes 小写,加单位后缀
Histogram latency http_request_duration_seconds 明确单位,自动生成 _bucket/_sum/_count
Gauge cpu_utilization_percent node_cpu_utilization_ratio 优先用 ratio(0-1)而非 percent
Label 设计原则: Label 是 Metric 的维度标签,用于多维度聚合。避免高基数 Label(如 user_id、request_id),会导致存储爆炸。推荐使用 method、status、endpoint、instance 等有限枚举值。
Metric 命名规范结构树 Metric 命名规范结构树 完整 Metric 名称 命名空间 node_ / app_ / kube_ 指标名 cpu_utilization 单位/类型 _seconds / _total 示例: node_cpu_utilization_ratio{instance="web-01", mode="user"} → 完整可查询

2.4 设计原则与异常检测的关联

Metric 设计直接影响异常检测模型的输入质量。以下映射关系帮助你在设计阶段就为后续 MTTR 复盘铺路:

  • Counter + rate():适合检测流量突增(如 DDoS、热点事件)或突降(如服务宕机)。
  • Gauge + 阈值:适合检测资源耗尽(如内存 OOM、磁盘满),但需配合动态基线避免静态阈值误报。
  • Histogram + 分位数:适合检测性能劣化(如 P99 延迟从 200ms 升至 2s),是 MTTR 复盘中最关键的指标类型。
  • Label 设计:合理的 Label(如 status、method)允许异常检测模型按维度下钻,快速定位故障范围。
MTTR 复盘视角: 在复盘阶段,Histogram 的 _bucket 数据可以重建故障期间的延迟分布,帮助回答“故障影响了多少比例的请求”、“延迟劣化到哪个分位数”。这是 Counter 和 Gauge 无法提供的诊断能力。