想判断一个 DevOps 团队的软件交付能力是否优秀,不能只依赖主观感受,而应通过可量化的研发效能指标进行评估。经过多年研究,海外某 DevOps 研究团队提出了四项能够反映软件交付团队绩效的关键指标:
部署频率:组织成功将代码发布到生产环境的频率。
变更前置时间:从代码提交到正式发布所需的时间。
变更失败率:导致生产环境出现故障的部署所占比例。
服务恢复时间:组织从生产故障中恢复所需的时间。
从宏观层面来看,部署频率和变更前置时间衡量的是交付速度;变更失败率和服务恢复时间衡量的是系统稳定性。通过持续跟踪这些 DevOps 指标,并基于数据不断迭代改进,团队能够显著提升业务成果。相关研究也表明,软件交付能力表现优异的团队,更有可能达成甚至超越组织设定的绩效目标。

以这四项关键指标作为基准来衡量团队表现,是提升研发效能和运营效率的有效方式。那么,应该从哪里开始?第一步是收集数据。
在实际落地过程中,团队需要打通从目标、需求、开发、测试、发布到知识沉淀的完整链路,让研发过程中的数据能够持续流转和沉淀。例如,PingCode 这类智能化研发管理工具,能够覆盖研发全生命周期管理,并接入研发过程中使用的其他工具,帮助企业以更自动化、数据化、智能化的方式提升研发效能。
为了帮助团队生成并分析这些指标,海外某些技术团队创建了一个开源项目。该项目可以自动搭建数据导入管道,将代码托管平台、持续集成与交付系统中的数据,通过云服务导入数据可视化工具。随后,系统会对数据进行聚合和整理,并生成包含四项关键指标的仪表盘,帮助团队持续跟踪一段时间内的改进效果。
为了降低使用门槛,该开源项目在代码库中提供了设置脚本,方便团队从默认数据源收集数据并查看指标结果。如果希望进一步参与项目建设,或根据自身团队的实际情况进行定制,可以重点了解以下三个核心部分:数据管道、指标计算和仪表盘。
DevOps 指标的数据管道
该开源项目的数据管道本质上是一个 ETL 管道,用于收集 DevOps 相关数据,并将其转换为四项关键指标。
不过,采集这些研发效能指标面临的一大挑战在于:对于任何一个团队而言,更不用说整个组织,部署、变更和故障事件数据通常都分散在不同系统中。如何构建一个开源工具,使其既能从多个不同数据源中采集数据,又能兼容未来可能新增的数据源?
该项目的解决方案是构建一个通用数据管道,并通过扩展机制处理来自不同来源的输入。任何能够发送 HTTP 请求的工具或系统,都可以接入该数据管道。系统通过 Webhook 接收事件,并将事件数据导入云端数据仓库。

在这条数据管道中,已知数据源会被解析为变更、事件和部署等不同类型。例如,代码提交记录会被识别为变更;持续集成与交付系统中的发布记录会被归类为部署;带有特定标签的问题或缺陷记录会被归类为事件。如果新增数据源无法被现有查询逻辑正确分类,开发人员可以通过编辑 SQL 脚本来重新定义分类规则。
DevOps 数据提取与转换
原始数据进入数据仓库后,还需要解决两项关键任务:数据提取和数据转换。为了提升业务灵活性,该项目使用 SQL 来处理这两个过程,并通过云端数据仓库的定时查询功能,从原始事件表中生成下游数据表。

系统使用 WHERE 语句将事件划分为变更、部署和事件等类型,并使用 SELECT 语句对数据进行规范化和转换。对于不同团队而言,什么算作一次变更、一次部署或一次事件,往往取决于具体业务场景。因此,能够灵活地纳入或排除特定事件,非常重要。
虽然不同团队的定义可能有所差异,但项目提供了一些默认脚本,帮助团队快速上手。以下是部署数据提取脚本的简化示例:
SELECT
...
CASE
WHEN source = "managed_build_service"
THEN JSON_EXTRACT_SCALAR(metadata, '$.substitutions.COMMIT_SHA')
WHEN source LIKE "code_hosting_platform_a%"
THEN JSON_EXTRACT_SCALAR(metadata, '$.deployment.sha')
WHEN source LIKE "code_hosting_platform_b%"
THEN JSON_EXTRACT_SCALAR(metadata, '$.commit.id')
END AS main_commit
FROM devops_metrics.events_raw
WHERE (
(
source = "managed_build_service"
AND JSON_EXTRACT_SCALAR(metadata, '$.status') = "SUCCESS"
)
OR (
source LIKE "code_hosting_platform_a%"
AND event_type = "deployment"
)
OR (
source LIKE "code_hosting_platform_b%"
AND event_type = "pipeline"
AND JSON_EXTRACT_SCALAR(metadata, '$.object_attributes.status') = "success"
)
)
在这个示例中,系统使用 WHERE 过滤器从 events_raw 表中提取相关行,并通过 SELECT 语句将 JSON 中的对应字段映射为提交 ID。
将数据转换逻辑放在云端数据仓库中完成,有一个明显优势:当团队需要调整数据分类或重新解释历史数据时,通常无需重新运行整条数据管道,只需修改查询逻辑即可。JSON_EXTRACT_SCALAR 等函数也使团队能够直接在 SQL 中解析和处理 JSON 数据。部分云端数据仓库还支持在 SQL 中编写自定义函数,以满足更复杂的数据处理需求。
四项关键 DevOps 指标如何计算?
本节将介绍如何把四项关键指标转换为系统层面的计算逻辑。

这些指标最初主要来自对真实用户和软件团队的调研,而不是直接采集系统数据。调研场景中,人们可以根据经验判断团队属于哪一类绩效水平;但在系统计算场景中,每一个概念都必须被明确定义。
例如,询问一位 DevOps 负责人“团队是每天部署、每周部署,还是每月部署”,对方通常可以凭经验给出答案。但如果让计算机计算同样的结果,就必须清楚定义什么是“部署”、什么是“成功部署”、什么是“每日部署”,以及统计周期应该如何划分。
下面分别来看四项指标在定义和计算中的关键细节。
部署频率:衡量 DevOps 团队的交付节奏
部署频率指组织成功发布到生产环境的频率。
部署频率是相对容易采集的指标,因为它通常只依赖部署记录表。不过,如何对“频率”进行分档,却是计算中较为棘手的部分之一。
展示每日部署次数,或者计算每周平均部署次数,都比较简单。但这一指标关注的是“部署频率”,而不是单纯的“部署数量”。换句话说,它要回答的是:团队发布生产变更的节奏是否足够稳定、足够频繁。
在该开源项目的默认脚本中,如果某一统计周期内,团队每周至少成功部署一次的天数中位数大于或等于三天,则部署频率会被归类为“每日”。也就是说,要达到“每日部署”的标准,团队必须在大多数工作日都完成过生产部署。
同理,如果团队在大多数周都有成功部署,则归类为“每周部署”;如果只在大多数月份有部署,则归类为“每月部署”;以此类推。
此外,团队还需要明确如何定义一次成功的生产环境部署。只覆盖 5% 流量的灰度发布是否应该计入?只统计覆盖 80% 以上流量的发布是否更合理?这些问题没有绝对标准,最终取决于团队的业务特点和交付模式。默认情况下,仪表盘可以统计任意流量级别下的成功部署;如果团队希望调整阈值,可以通过修改 SQL 脚本实现。
变更前置时间:衡量代码从提交到上线的效率
变更前置时间指一次代码提交进入生产环境所需的时间。
计算变更前置时间需要两类关键数据:提交时间和部署时间。这意味着,对于每一次部署,系统都需要维护一份已部署变更列表,并能够将部署记录关联回具体提交。
一种常见做法是:通过流水线触发器获取部署信息,再使用提交 SHA 等标识将部署记录映射回代码提交记录。这样,部署表中就能够保留本次部署包含的变更列表。
当部署表中已经包含变更列表后,系统就可以将部署数据关联回变更数据表,获取对应的提交时间戳,并据此计算从提交到发布的耗时。通常情况下,团队会使用中位数来代表整体变更前置时间,以降低极端值对结果的影响。
变更失败率:衡量生产部署的稳定性
变更失败率指导致生产环境故障的部署所占比例。
计算变更失败率需要两类数据:部署尝试总数,以及导致生产环境故障的部署次数。
部署尝试总数通常可以直接从部署表中获取。更关键的是,系统需要将部署记录与故障事件关联起来,从而判断哪些部署导致了生产问题。
事件数据可以来自多种系统,例如缺陷管理工具、问题跟踪系统、表单采集系统、事件管理平台等。无论数据来自哪里,核心要求只有一个:事件记录中必须包含能够关联到部署记录的标识,例如部署 ID、提交 ID 或发布版本号。只有这样,系统才能将事件表与部署表连接起来,进一步计算变更失败率。
服务恢复时间:衡量生产故障恢复能力
服务恢复时间指组织从生产故障中恢复所需的时间。
要衡量服务恢复时间,系统需要知道故障事件的创建时间和解决时间。更进一步,如果团队希望更准确地分析恢复过程,还需要知道是哪一次修复部署解决了该故障,以及该修复部署发生在什么时间。
与变更失败率类似,这些数据可以来自不同的事件管理系统。只要事件记录中包含必要的时间信息和关联字段,就可以接入数据管道,并用于后续计算。
在实际落地过程中,团队需要特别注意事件状态的定义。例如,事件从“已发现”到“已修复”、从“已修复”到“已验证”、从“已验证”到“已关闭”,可能分别代表不同阶段。服务恢复时间应以哪个阶段为终点,需要结合团队内部流程进行明确约定。
DevOps 四项关键指标仪表盘

当所有数据都在云端数据仓库中完成聚合与处理后,团队就可以通过四项关键指标仪表盘进行可视化分析。
该开源项目的设置脚本可以帮助团队将数据接入仪表盘模板。仪表盘会根据四项关键指标对团队表现进行高级别分类,并展示近期绩效变化趋势。这使开发团队能够及时发现交付效率下降、故障恢复变慢或变更失败率升高等问题,并尽早采取改进措施。
对于已经使用研发管理平台的团队,也可以将指标仪表盘与实际研发流程结合起来。例如,通过 PingCode 打通目标、需求、开发、测试、发布和知识沉淀等环节的数据,团队不仅可以看到指标结果,还能进一步追溯指标变化背后的流程瓶颈。
此外,即使团队当前处于较低绩效区间,也可以通过运行趋势提前看到改善迹象。也就是说,在指标分档正式发生变化之前,团队就能够通过数据观察到改进是否已经开始产生效果。
总体来看,DevOps 四项关键指标的价值并不只是“打分”或“排名”,而是帮助团队建立稳定、可持续的研发效能改进机制。通过持续采集数据、分析趋势、定位瓶颈,并围绕交付速度和系统稳定性进行迭代,团队可以更清晰地了解自身 DevOps 能力现状,并逐步提升软件交付绩效。
文章包含AI辅助创作,作者:liu,如若转载,请注明出处:https://docs.pingcode.com/baike/5244857