借助ELK从日志获取Jenkins构建数据:整体构建时间获取难题
我完全懂你的困扰——Jenkins控制台日志里能看到各阶段耗时,但核心日志压根不会主动输出Pipeline的整体构建时长,哪怕调了全局日志级别也没用。这是因为整体构建时长属于构建元数据范畴,并不是Jenkins默认控制台日志的输出内容。下面给你几个可行的解决方案,按实现复杂度从低到高排序:
方案1:在Pipeline脚本中主动输出整体时长
这是最直接快速的办法,在你的Pipeline里加一个post阶段,等构建结束后主动把整体时长打印到控制台日志,这样Filebeat就能采集到,后续Logstash也能轻松解析。
示例Pipeline代码
pipeline { agent any stages { stage('代码拉取') { steps { git url: 'https://your-repo-url.git', branch: 'main' } } stage('编译构建') { steps { sh 'mvn clean package -DskipTests' } } // 其他自定义阶段... } post { always { // 不管构建成功失败都执行 script { // currentBuild是Jenkins内置对象,直接拿时长信息 def formattedDuration = currentBuild.durationString // 比如"1分30秒"这种格式化后的文本 def durationMs = currentBuild.duration // 毫秒数,方便后续做数值统计 echo "===== 构建元数据 =====" echo "任务名称: ${env.JOB_NAME}" echo "构建编号: ${currentBuild.number}" echo "整体构建时长(格式化): ${formattedDuration}" echo "整体构建时长(毫秒): ${durationMs}" echo "构建状态: ${currentBuild.result ?: '进行中'}" } } } }
对应的Logstash Grok配置
在你现有的Grok规则里加这两行,就能把时长字段提取出来:
%{DATA:metadata_header} 整体构建时长\(格式化\): %{DATA:total_build_duration} %{DATA:metadata_header} 整体构建时长\(毫秒\): %{NUMBER:total_build_duration_ms:int}
之后在Kibana里,你就能直接用total_build_duration或total_build_duration_ms来统计、展示整体构建时长了。
方案2:通过Jenkins API拉取构建元数据
如果不想逐个修改Pipeline脚本,可以用Logstash的http过滤器,在处理日志时,根据日志里的任务名称和构建编号,调用Jenkins API获取整体时长,再把这个字段注入到日志事件里。
示例Logstash配置片段
filter { # 先从现有日志里提取任务名称和构建编号(得确保你的日志里能拿到这些信息,或者通过其他字段推导) grok { match => { "message" => "任务名称: %{DATA:job_name}" } match => { "message" => "构建编号: %{NUMBER:build_number:int}" } } # 调用Jenkins API获取构建详情 http { url => "http://your-jenkins-address/job/%{job_name}/%{build_number}/api/json" verb => "GET" # 如果Jenkins开了权限验证,要加API Token(在Jenkins用户设置里生成) headers => { "Authorization" => "Bearer your-jenkins-api-token" } # API返回的内容存到jenkins_build_data字段里 target_body => "jenkins_build_data" # 提取时长字段(duration是毫秒数) add_field => { "total_build_duration_ms" => "%{[jenkins_build_data][duration]}" } } # 转换字段类型,顺便算出秒数方便展示 mutate { convert => { "total_build_duration_ms" => "integer" } add_field => { "total_build_duration_sec" => "%{total_build_duration_ms}/1000" } } }
注意:要给Logstash所在机器开放Jenkins API的访问权限,并且确保API Token有足够的权限读取构建信息。
方案3:用Jenkins插件增强日志输出
有些Jenkins插件可以自动把构建元数据输出到控制台日志,比如:
- Build Time Tracker Plugin:能记录并输出构建各阶段和整体的时长
- Pipeline Utility Steps Plugin:提供更多Pipeline内置工具,方便获取和输出元数据
安装插件后,需要在全局配置或者Pipeline里启用日志输出功能,这样控制台日志里就会包含整体构建时长,后续的采集和解析流程和方案1一致。
总结下来,方案1最轻量,适合快速落地;方案2不用改Pipeline,但依赖Jenkins API的稳定性;方案3适合有大量Pipeline且不想逐个修改的场景,你可以根据自己的实际情况选。
内容的提问来源于stack exchange,提问作者JustinCPT

