4. 构建阶段 SLI 口径设计:构建成功率、构建时长 P50/P95/P99、构建资源消耗(CPU/内存)
构建阶段是 Jenkins 流水线的核心执行单元,直接反映代码从提交到制品的转化效率。本章聚焦三个关键 SLI:构建成功率、构建时长分位数、构建资源消耗,并给出可落地的口径定义与计算公式。
4.1 构建成功率(Build Success Rate)
构建成功率衡量流水线中构建步骤的稳定程度,是团队交付节奏的基础指标。低成功率意味着频繁的构建失败,需要立即排查环境、依赖或代码问题。
| SLI 名称 | 口径定义 | 公式 |
|---|---|---|
| 构建成功率 | 在统计周期内,构建步骤最终状态为成功的次数占总执行次数的比例 | 构建成功率 = 成功构建次数 / 总构建执行次数 × 100% |
| 重试后成功率 | 包含自动重试后最终成功的构建次数占比(排除基础设施抖动) | 重试后成功率 = (成功构建次数 + 重试后成功次数) / 总构建执行次数 × 100% |
口径注意点:
- “成功”指 Jenkins 构建步骤返回
SUCCESS状态,排除UNSTABLE或ABORTED。 - 统计周期建议按天或按发布窗口聚合,避免跨周对比失真。
- 重试后成功率更适合 SRE 团队评估平台稳定性,开发团队应关注原始成功率。
4.2 构建时长 P50/P95/P99
构建时长分位数反映不同百分位下的构建耗时,P50 代表典型体验,P95/P99 代表长尾问题。通过分位数可以精准定位构建瓶颈。
| SLI 名称 | 口径定义 | 公式 |
|---|---|---|
| 构建时长 P50 | 统计周期内,所有成功构建耗时的中位数 | P50 = 排序后第 50% 位置的构建耗时 |
| 构建时长 P95 | 统计周期内,95% 的构建耗时低于此值 | P95 = 排序后第 95% 位置的构建耗时 |
| 构建时长 P99 | 统计周期内,99% 的构建耗时低于此值 | P99 = 排序后第 99% 位置的构建耗时 |
计算示例: 假设某天有 200 次成功构建,耗时排序后:
- 第 100 个值(200 × 50%)为 3 分 20 秒 → P50 = 200s
- 第 190 个值(200 × 95%)为 8 分 45 秒 → P95 = 525s
- 第 198 个值(200 × 99%)为 15 分 30 秒 → P99 = 930s
P99 与 P50 差距越大,说明长尾构建问题越严重,需要排查大项目或慢步骤。
4.3 构建资源消耗(CPU / 内存)
构建资源消耗 SLI 用于评估 Jenkins Agent 的负载情况,帮助团队合理规划资源配额、识别资源争抢或泄漏问题。
| SLI 名称 | 口径定义 | 公式 |
|---|---|---|
| CPU 使用率(均值) | 构建过程中 Agent 的 CPU 平均使用百分比 | CPU 均值 = Σ(每 10s 采样 CPU%) / 采样次数 |
| CPU 使用率(峰值) | 构建过程中 Agent 的 CPU 最大使用百分比 | CPU 峰值 = max(每 10s 采样 CPU%) |
| 内存使用量(均值) | 构建过程中 Agent 的内存平均使用量(MB) | 内存均值 = Σ(每 10s 采样内存 MB) / 采样次数 |
| 内存使用量(峰值) | 构建过程中 Agent 的内存最大使用量(MB) | 内存峰值 = max(每 10s 采样内存 MB) |
采集与口径注意事项:
- 采样频率建议 10s 一次,避免高频采样影响 Agent 性能。
- 指标应绑定构建 ID(
BUILD_TAG),便于关联具体构建日志。 - 内存使用量建议使用
resident set size (RSS),排除缓存干扰。 - CPU 使用率超过 80% 持续 5 分钟以上,应触发资源告警。
4.4 构建资源消耗 SLI 口径公式汇总
以下表格汇总了构建阶段三个核心 SLI 的完整口径公式,便于团队统一接入监控平台。
| SLI 类别 | SLI 名称 | 口径公式(PromQL / 伪代码) |
|---|---|---|
| 构建成功率 | 原始成功率 | sum(jenkins_build_result{result="SUCCESS"}) / sum(jenkins_build_result) * 100 |
| 构建成功率 | 重试后成功率 | (sum(jenkins_build_result{result="SUCCESS"}) + sum(jenkins_build_retry_success)) / sum(jenkins_build_result) * 100 |
| 构建时长 | P50 / P95 / P99 | histogram_quantile(0.50, sum(rate(jenkins_build_duration_seconds_bucket[1d])) by (le)) |
| 构建资源消耗 | CPU 均值 | avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance) |
| 构建资源消耗 | 内存峰值 | max(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) by (instance) |
实战建议:
- 构建成功率 SLI 建议设置 ≥ 95% 为目标,低于 90% 触发 P0 告警。
- 构建时长 P95 目标值根据项目复杂度设定,Java 项目建议 ≤ 10 分钟,前端项目 ≤ 3 分钟。
- 资源消耗 SLI 应结合 Agent 规格设定阈值,例如 4C8G 的 Agent,CPU 峰值超过 90% 持续 2 分钟需扩容。
4.5 构建阶段 SLI 口径设计检查清单
- 成功率:是否区分原始成功与重试后成功?是否排除 UNSTABLE 状态?
- 时长分位数:是否使用 Histogram 类型指标?分位窗口是否与统计周期一致?
- 资源消耗:采样频率是否合理?是否绑定构建 ID 用于回溯?
- 口径文档化:每个 SLI 是否在团队 Wiki 中记录口径公式、采集方式和阈值?
- 告警联动:SLI 是否与告警规则绑定?P95 超阈值是否自动触发构建队列分析?
最佳实践: 建议将构建阶段 SLI 口径以 YAML 形式存储在代码仓库中,通过 GitOps 方式管理口径变更,确保可追溯、可审计。