流水线执行跟踪应采集哪些状态与时效指标

流水线执行跟踪要回答两个问题:每次运行走到了哪一步,以及每一步花了多久。前者靠状态指标记录触发、排队、执行、结束及失败原因,后者靠时效指标计算排队等待、执行时长、端到端时长和失败恢复间隔。两类指标都以运行ID为主键关联,并统一时间戳来源、时区和分母口径,才能判断跟踪是否及时、完整,并支撑异常协调。ONES DevOps 解决方案可集中呈现 CI/CD 过程并同步流水线执行状态与日志,适合作为运行记录与异常处置的承载位置。



要点总览(TL;DR)


  • 状态指标覆盖触发来源、排队与执行状态、成功/失败/取消/跳过/超时终态、失败原因分类、重试次数和人工介入标记,以运行ID为主键关联阶段与作业。
  • 时效指标给出可复算公式:排队等待=开始执行−触发,执行时长=结束−开始,端到端=结束−触发,另设阶段时长、作业时长、失败发现时长、失败恢复时长和重跑间隔。
  • 判断跟踪是否及时看状态更新延迟分布和失败到认领的间隔;判断是否完整看必备字段缺失率与状态跳变连续性,两者结合恢复时长共同解读。
  • 时间戳统一采用平台事件时间并注明时区与精度,缺失运行标记为不完整并从时效统计中排除,成功率分母需固定取消与跳过的处理规则。
  • 指标用于发现异常、协调处置和验证改进,时长变化不能直接归因于流程改进,成功率也不能替代发布准入判断。


跟踪及时与完整要回答哪两个问题


评估流水线执行跟踪,先要把“跟踪得好不好”拆成两个可判断的问题。及时性问的是:状态变化发生后,多久被记录并暴露给需要知道的人。完整性问的是:一次运行从触发到结束,关键状态和时间点是否齐全,能否还原全过程。两个问题都针对流水线运行及其阶段、作业,评估对象是运行记录本身,与个人产出无关。


把指标用途限定在发现异常、协调处置和验证改进上,采集范围会更清晰。团队需要知道哪次运行卡在排队、哪次失败后长时间无人认领、哪个阶段耗时突然拉长,据此安排处置;改进措施上线后,再用同一口径对比前后变化。若把指标直接用于个人考核,采集动作容易变形,例如人为缩短记录间隔或回避标记失败,反而破坏数据可信度。


据此可以形成一份判断问题清单:最近一个时间窗内,有多少运行缺少开始或结束时间戳;状态更新从发生到可见的延迟分布如何;失败运行从失败到被认领、再到恢复成功的间隔有多长;阶段和作业级结果是否都能关联回同一次运行。这些问题分别对应完整性、及时性和恢复效率,后续章节的字段与公式都围绕它们展开。



状态指标:一次运行要记录哪些节点


状态指标的作用是还原一次运行的位置和结果。采集时应覆盖从触发到终态的完整链路,并为每个字段规定取值,避免同一状态在不同流水线里叫法不一。下表给出建议字段,字段名可按平台习惯调整,取值定义需要团队内统一。


字段名 取值 说明
运行ID 平台生成的唯一标识 关联阶段、作业、代码提交的主键
触发来源 提交、合并请求、定时、手动、上游流水线 区分自动触发与人工触发,便于分析触发结构
触发时间 时间戳 以平台事件时间为准,记录到秒
排队状态 排队中、已开始 标记运行等待执行资源的区间
运行状态 排队、执行中、成功、失败、取消、跳过、超时 终态需区分成功、失败、取消、跳过、超时五类
阶段状态 未开始、执行中、成功、失败、取消、跳过 按阶段记录进入与结束状态
作业状态 未开始、执行中、成功、失败、取消、跳过、超时 作业是失败定位的最小单元
失败原因分类 环境、依赖、测试、配置、代码、其他 由处置人确认后填写,避免仅凭日志关键词自动归类
重试次数 整数 同一作业或同一运行的重试次数,需说明统计层级
人工介入标记 是、否 标记是否有人工重跑、手动放行或干预处置

终态的区分直接影响后续统计。取消通常来自主动中止或新提交顶替,跳过多由条件判断触发,超时说明执行超出预期上限,三者与失败的性质不同,混在一起会掩盖真实问题。失败原因分类建议保留“其他”并允许补充说明,因为环境抖动、依赖下载失败、测试用例不稳定、配置错误和代码缺陷的处置路径差异很大,分类准确才能支撑协调分工。


重试次数和人工介入标记容易被忽略,却对解读时效指标很关键。一次运行经历多次重试后成功,端到端时长会被拉长,若不做标记,容易被误读为流水线变慢。人工介入标记则能帮助区分自动恢复与人工处置,评估异常协调的实际工作量。



时效指标:各段耗时怎么定义和计算


时效指标需要给出公式、单位、时间窗和分母,保证任何人拿到原始记录都能复算。建议统一以秒或分钟为单位,同一张报表内不混用;时间窗按周或按迭代固定,跨窗口比较时说明起止边界。


指标 计算公式 单位 分母口径
排队等待时长 开始执行时间 − 触发时间 秒 按运行次数统计,排除未进入排队的运行
执行时长 结束时间 − 开始执行时间 秒 按运行次数统计,取消与跳过单独列出
端到端时长 结束时间 − 触发时间 秒 按运行次数统计,需说明是否含排队
阶段时长 阶段结束时间 − 阶段开始时间 秒 按阶段次数统计,同一运行ID内聚合
作业时长 作业结束时间 − 作业开始时间 秒 按作业次数统计
失败发现时长 失败被认领时间 − 运行失败时间 分钟或小时 按失败运行次数统计
失败恢复时长 修复后首次成功时间 − 首次失败时间 小时 按失败事件统计,需固定同一代码分支范围
重跑间隔 下一次运行触发时间 − 上一次运行结束时间 分钟 按相邻运行对统计

阶段与作业时长要区分串行和并行。串行阶段的时长可以直接相加,并行阶段相加会超过端到端时长,此时应分别报告“阶段时长之和”和“端到端时长”,并注明并行度。按运行ID聚合时,同一运行内多个作业的时长可以求和用于分析资源消耗,但判断用户感知的等待时间应以端到端时长为准。


失败发现时长和失败恢复时长需要明确时间窗。失败发现时长衡量从运行失败到有人认领的间隔,认领动作可以是更新工作项状态、在协作渠道响应或指派处理人,团队需事先约定哪种动作算认领。失败恢复时长衡量从首次失败到修复后首次成功,统计时应限定同一分支或同一合并请求范围,避免把无关的成功运行算作恢复。分母为零的情况要单独处理:时间窗内没有失败运行时,失败恢复时长记为“无样本”,不写为零,也不参与均值计算。


分母口径需要在报表上显式标注。按运行次数统计时,取消和跳过是否计入要固定规则,建议成功率的分母排除取消与跳过,另设一列展示其数量;按阶段次数或作业次数统计时,分母是阶段或作业的出现次数,同一运行可能贡献多个样本,均值含义与按运行统计不同,不能直接比较。



数据口径与证据:时间戳、缺失值和可比性


时效指标可复算的前提是时间戳来源统一。建议全部采用流水线平台的事件时间,而不是日志打印时间或采集端接收时间,因为日志时间受缓冲和时钟偏差影响,采集端时间会引入传输延迟。时区统一为团队约定的标准时区并在报表中注明,精度至少到秒;跨时区团队尤其要避免本地时间直接入库。


运行ID是关联的主键。阶段、作业、代码提交、触发人、关联工作项都应挂到同一个运行ID下,这样既能从一次失败运行追溯到具体提交,也能从需求或工作项反查相关运行。若平台提供上游流水线触发关系,还应记录父运行ID,便于分析跨流水线的等待。


数据质量问题需要明确处理规则,而不是事后凭感觉剔除。常见情况包括:时间戳缺失,标记为“不完整运行”并从时效统计中排除,同时计入完整性指标;事件乱序到达,按事件时间排序后重新计算,不按接收顺序;重复上报,以运行ID加事件类型加时间戳去重,保留最早一条。每条剔除规则都应记录剔除数量,避免统计口径悄悄变化。


跨项目、跨流水线比较前要对齐变量。环境差异(开发、测试、生产)、并行度、作业规模、依赖下载缓存策略都会影响时长,直接比较绝对值容易得出错误结论。可行做法是先在同一环境、相似作业规模的分组内比较,或改用同组内的分位数变化来观察趋势。



采集与评估步骤:从字段到判断结论


采集工作从字段定义开始。先按前两节的字段表和公式表确定事件清单,再在流水线平台侧通过事件回调、接口导出或日志解析落表,所有记录以运行ID为主键写入同一张运行事实表,阶段和作业作为明细表关联。字段定义确定后不宜频繁变更,变更时保留版本号,避免历史数据口径断裂。


完整性校验可以按以下顺序执行:


  1. 统计每次运行的必备字段缺失率,必备字段至少包括触发时间、开始执行时间、结束时间、终态;
  2. 检查状态跳变是否连续,例如出现“结束”却没有“开始”,或阶段状态跳过执行中直接到成功;
  3. 核对阶段与作业数量是否与平台配置一致,识别漏采;
  4. 将不完整运行单独列出,分析集中在哪类触发方式或哪条流水线。

及时性校验关注延迟分布而非单一均值。可以统计状态更新延迟的中位数和尾部值,即状态实际发生到在跟踪界面可见的间隔;再统计失败运行从失败到被认领的间隔分布。尾部值偏大往往说明通知链路或值班安排存在问题,比均值更能暴露协调缺口。


汇总节奏建议按周或按迭代固定,输出一页包含运行总数、终态构成、各段时长分位数、完整性缺失率和恢复时长的简报。解读时结合异常协调记录:如果某周恢复时长下降,同时协作记录显示认领和处置更及时,才能说明改进起了作用;若指标变化而处置记录没有对应变化,需要先排查数据口径或作业规模变化。


在工具承载上,ONES 可集成 Jenkins、GitLab CI 等第三方流水线工具,同步流水线数据并更新执行状态和日志,并把流水线与项目关联,在项目、迭代、需求中呈现构建与发布过程。团队可以把运行记录关联到对应工作项,让失败运行有明确的责任上下文,处置动作和状态更新留在同一处,便于后续核对失败发现与恢复的实际情况。报表能提供到什么粒度,以实际集成的字段范围为准。



一个计算示例:单条流水线与一周汇总


以下为演示情景,数字用于说明计算过程。


单次运行示例:某次运行由合并请求触发,触发时间为 10:00:00,10:00:40 开始执行,10:06:10 结束,终态成功。则排队等待时长为 40 秒,执行时长为 5 分 30 秒即 330 秒,端到端时长为 6 分 10 秒即 370 秒。该运行包含构建、单元测试、集成测试三个阶段,时长分别为 90 秒、120 秒、120 秒,串行执行,阶段时长之和为 330 秒,与执行时长一致。


一周汇总示例:某流水线一周内共触发 50 次运行,其中成功 40 次、失败 6 次、取消 3 次、跳过 1 次。若成功率分母排除取消与跳过,则成功率为 40 ÷ 46 ≈ 87.0%;若分母计入全部运行,则为 40 ÷ 50 = 80.0%。两种口径都可用,但必须在报表中注明,且前后周保持一致。端到端时长取这 50 次运行的中位数和 90 分位,分别反映典型体验和尾部等待。


失败恢复示例:6 次失败运行中,有 4 次在同一分支上修复后重新运行成功。第一次失败发生在周一 14:00,修复后成功在周一 16:30,恢复时长为 2.5 小时;其余三次按同样方法计算后取中位数。另外 2 次失败属于环境问题,重跑即通过,可按规则单独归类,不与代码修复混算。若某一周没有失败运行,恢复时长记为“无样本”,报表显示横线而非 0。


缺失值处理示例:一周内有 2 次运行缺少开始执行时间,无法计算排队等待时长和执行时长。这 2 次运行标记为不完整,从时效统计的分母中排除,同时计入完整性指标,即缺失率为 2 ÷ 50 = 4%。若缺失集中在定时触发场景,应优先排查该触发方式的时间戳采集。



解读与限制:指标能说明什么、不能说明什么


时长变化需要谨慎归因。端到端时长上升,可能来自作业规模增加、并行度调整、依赖下载变慢或执行环境波动,也可能确实来自流程改进的反向效果。没有同步记录作业规模和环境信息时,单看时长曲线无法区分这些原因。可行做法是把时长与作业数量、并行度、缓存命中情况放在一起看,必要时抽取具体运行对照日志。


成功率对分母口径敏感。取消和跳过是否计入,会让同一批数据得出不同数值,因此规则一旦确定就应固定并在报表中展示分母构成。成功率反映的是运行结果分布,不能替代发布准入判断;一次运行成功不代表产物可以发布,发布还需要质量门禁、审批和变更范围等条件,这些属于发布审批与质量门禁的范围。


指标组合使用比单指标更可靠。完整性缺失率说明数据是否可信,状态更新延迟说明跟踪是否及时,失败恢复时长说明协调是否有效,三者结合才能判断跟踪体系的整体状况。任何单一指标都不足以支撑因果结论,也不适合直接作为个人绩效依据。指标的价值在于让异常更早被看见、让处置有据可查、让改进可被验证,超出这个范围的使用需要额外的证据和方法。



常见问题


流水线运行被取消或跳过时,时效指标应该怎么统计?


取消和跳过与失败性质不同,建议在状态指标中单独记录终态,在时效统计中分开处理。执行时长和端到端时长可以照常计算并单独列出,但成功率的分母需要固定规则:常见做法是排除取消与跳过,另设一列展示其数量,并在报表中注明分母构成。规则一旦确定,前后周和跨流水线比较都应保持一致,否则同一批数据会得出不同数值。


失败恢复时长按什么范围统计才不会被无关运行干扰?


失败恢复时长衡量从首次失败到修复后首次成功,统计时应限定在同一分支或同一合并请求范围内,避免把其他分支的成功运行算作恢复。若失败由环境问题导致、重跑即通过,建议单独归类,不与代码修复混算。时间窗内没有失败运行时,记为“无样本”,报表显示横线而非 0,也不参与均值计算。


状态更新延迟这类及时性指标,采集端能直接算出来吗?


可以,但需要两个时间点:状态实际发生的时间和状态在跟踪界面可见的时间。前者取自流水线平台的事件时间,后者取自跟踪系统的入库或展示时间,两者相减得到延迟。建议统计中位数和尾部值,尾部偏大往往说明通知链路或值班安排存在缺口。若平台只提供日志时间,需先确认时钟同步情况,否则延迟会被日志缓冲和时钟偏差污染。


跨项目比较流水线时长时,需要先对齐哪些变量?


环境(开发、测试、生产)、并行度、作业规模、依赖下载缓存策略都会影响时长,直接比较绝对值容易得出错误结论。可行做法是先在同一环境、相似作业规模的分组内比较,或改用同组内的分位数变化观察趋势。跨流水线比较时还应确认时间窗起止边界和分母口径一致,否则差异可能来自统计规则而非执行状况。


这些指标能否直接用于评估团队或个人的交付表现?


不建议。指标反映的是流水线运行及其阶段、作业的状况,时长变化可能来自作业规模、并行度或环境波动,成功率受分母口径影响,单指标不足以支撑因果结论。更合适的用法是组合完整性缺失率、状态更新延迟和失败恢复时长,用于发现异常、协调处置和验证改进效果。若确需用于绩效场景,需要额外的证据和方法支撑。