3. Metric 基础概念:定义、类型、维度与采集方式

在构建跨团队 CI/CD 流水线 SLI 体系之前,必须统一团队对 Metric(度量指标) 的认知。Metric 是 SLI 的原始数据来源,错误的 Metric 设计将直接导致 SLI 口径偏差。本节从定义、类型、维度标签、采集方式四个维度建立 Metric 基础共识。

3.1 Metric 的定义与核心类型

Metric 是随时间变化的、可聚合的数值序列,用于描述系统或流程的某一可观测特征。在 Prometheus、OpenTelemetry 等主流可观测性体系中,Metric 分为四种核心类型:

类型 英文 核心特征 典型 CI/CD 场景
计数器 Counter 只增不减(除重启外),适合累计量 流水线总执行次数、构建失败次数
仪表 Gauge 可增可减,反映当前瞬时值 排队中的 Job 数、Agent 空闲数量
直方图 Histogram 对观测值分桶统计,可计算分位数 构建耗时分布、部署耗时分布
摘要 Summary 客户端直接计算分位数,无法聚合 端到端流水线延迟的 P50/P95/P99
⚠️ 类型选择原则: SLI 中的“速率”类指标(如每分钟部署次数)必须基于 Counter 计算 rate(),不可直接使用 Gauge 累加;延迟类 SLI 优先使用 Histogram 以获得可聚合的分位数能力,Summary 仅用于无法修改客户端埋点的遗留系统。

3.2 Metric 的维度与标签

维度(Dimension)和标签(Label)是 Metric 可观测性的核心扩展能力。一个 Metric 名称加上一组标签键值对,唯一确定一条时间序列。

标签设计三原则:

  • 高基数控制: 避免将 request_id、commit_sha 等无限增长的字段作为标签,会导致存储爆炸和查询性能下降。
  • 可过滤性: 标签应支持按团队、流水线名称、环境、阶段等维度进行下钻分析。
  • 一致性: 跨团队使用统一的标签命名规范,例如 team、pipeline_name、stage、status、branch。
标签示例 基数级别 是否推荐 说明
team, pipeline_name, stage 低(< 1000) ✅ 强烈推荐 SLI 下钻与聚合的基础维度
status (success/failure/skip) 低(< 10) ✅ 推荐 用于计算成功率、失败率
branch, environment 中(< 10000) ⚠️ 谨慎使用 需要配合 retention 策略,避免基数膨胀
commit_sha, request_id 极高(无限) ❌ 禁止 应使用日志或事件系统存储,而非 Metric
💡 跨团队对齐建议: 在组织级 Metric 规范中,强制要求所有 CI/CD 流水线指标必须携带 team、pipeline_name、stage 三个标签,否则拒绝采集。这是实现跨团队 SLI 聚合与对比的前提。

3.3 Metric 的采集方式:Push vs Pull

采集方式决定了 Metric 数据的传输模型,直接影响流水线 SLI 的可靠性、延迟和运维成本。两种模式对比如下:

对比维度 Pull 模式(拉取) Push 模式(推送)
代表系统 Prometheus, OpenTelemetry Collector (Pull) Graphite, StatsD, OpenTelemetry (Push)
数据流向 监控系统主动访问目标端点获取数据 目标主动将数据发送到监控系统
服务发现 依赖服务发现机制(K8s SD, Consul) 无需服务发现,目标已知接收端地址
生命周期 适合长期运行的服务 适合短生命周期任务(如 CI Job)
失败处理 采集失败可重试,不影响目标 推送失败可能导致数据丢失
CI/CD 适用性 适合 Agent 常驻的构建集群 适合每个 Job 独立推送的流水线
🚨 流水线场景关键决策: CI/CD Job 通常是短生命周期(秒级到分钟级),Pull 模式可能因 Job 结束而错过采集窗口。推荐采用 Push → 网关 → Pull 的混合架构:Job 将 Metric 推送到本地网关或 Sidecar,Prometheus 再从网关 Pull 数据。这样既兼容短生命周期任务,又保留 Pull 模式的数据可靠性。
CI/CD 流水线 Metric 采集架构:Push → 网关 → Pull CI/CD Job 集群 Job A (Push) pipeline_build_time Job B (Push) deploy_status Job C (Push) test_coverage 短生命周期任务 主动推送 Metric Metric 网关 接收 Push 请求 缓存 / 聚合 暴露 /metrics 端点 支持短生命周期任务 Prometheus 集群 Pull 模式 定期拉取 /metrics 服务发现 自动发现网关 数据可靠性 重试 / 持久化 统一查询入口 支持 PromQL 聚合 SLI 计算 / 告警

3.4 跨团队 Metric 设计集成要点

在跨团队协作中,Metric 设计必须满足以下集成要求:

  1. 命名空间隔离: 每个团队使用前缀区分,例如 team_a_pipeline_build_duration_seconds,避免命名冲突。
  2. 标签对齐: 所有团队必须使用相同的标签键(如 team、pipeline_name、stage),否则无法在组织级仪表盘上聚合。
  3. 单位标准化: 时间类指标统一使用 _seconds 或 _milliseconds 后缀,大小类指标使用 _bytes,禁止混用。
  4. 采集方式统一: 推荐全组织采用 Push → 网关 → Pull 架构,避免部分团队用 Push、部分用 Pull 导致的数据孤岛。
📐 集成检查清单:
✅ 所有 Metric 名称符合 <namespace>_<name>_<unit> 格式
✅ 所有 Metric 携带 team、pipeline_name、stage 标签
✅ 时间单位统一为秒(seconds),不使用毫秒或分钟
✅ 采集方式统一为 Push → 网关 → Pull
✅ 高基数标签(如 commit_sha)已排除在 Metric 之外
跨团队 Metric 标签对齐与命名规范 团队 A:构建流水线 team="team-a" pipeline_name="build-service" stage="compile" status="success" branch="main" metric: build_duration_seconds 团队 B:部署流水线 team="team-b" pipeline_name="deploy-api" stage="canary" status="failure" environment="staging" metric: deploy_duration_seconds 团队 C:测试流水线 team="team-c" pipeline_name="test-e2e" stage="integration" status="success" test_type="regression" metric: test_duration_seconds ✅ 标签键统一:team / pipeline_name / stage / status 在所有团队中保持一致,支持跨团队 SLI 聚合