Jenkins 监控方案:Prometheus + Grafana 实践
这两天在运维群里面看到有人说 Jenkins 节点也可以监控,以前没想过搞这个,现在就对公司 Jenkins 搞搞顺便记录下呗。
一、使用 Jenkins Prometheus 插件(推荐方式)
1. 安装插件
在 Jenkins 插件管理里搜索并安装 Prometheus Metrics Plugin。
2. 启用指标导出
插件安装后,Jenkins 会自动暴露一个 /prometheus
的 HTTP endpoint,例如:
http://<jenkins_host>:8080/prometheus
这里包含了 Job、构建、节点(Agent) 等相关指标。
3. 节点状态指标示例
插件会提供类似的指标:
default_jenkins_nodes_online{node="agent1"} 1
default_jenkins_nodes_online{node="agent2"} 0
其中:
1
表示在线0
表示离线
也可以在 Prometheus 中直接编写告警规则,例如:
- alert: JenkinsNodeOfflineexpr: default_jenkins_nodes_online == 0for: 2mlabels:severity: warningannotations:summary: "Jenkins 节点离线"description: "Jenkins 节点 {{ $labels.node }} 已离线超过 2 分钟"
二、Jenkins 监控常见用途及原理
常见用途
这里说下普罗米修斯监控 Jenkins 的话一般做些什么。
-
节点健康监控
- 发现某个 Agent 掉线及时告警
- 判断节点是否长期闲置,辅助缩容
-
任务执行监控
- 构建成功率统计(CI 健康度)
- 构建耗时分析(定位瓶颈)
- 失败趋势分析(发现不稳定测试或问题代码)
-
资源使用监控
- 队列长度、Executor 使用情况
- 帮助判断是否需要扩容构建资源
原理
一般普罗米修斯监控都是靠 Exporter 去定规则监控,这里简单讲下 Node Exporter
与 Jenkins Prometheus
的原理与区别。
1. Node Exporter 的原理
- 实现方式:独立进程(Go 编写)
- 采集数据:通过
/proc
、/sys
读取主机指标,例如 CPU、内存、磁盘、网络 - 暴露方式:HTTP 服务(默认
:9100/metrics
) - 特点:与应用解耦,只关注系统层面
2. Jenkins Prometheus 插件的原理
-
实现方式:Jenkins 插件,运行在 JVM 内部
-
采集数据:调用 Jenkins 内部对象模型(Java API),如:
Computer
→ 节点信息Run
→ Job 构建状态Queue
→ 任务队列
-
暴露方式:
http://<jenkins>:8080/prometheus
-
特点:强依赖 Jenkins,只能监控 CI/CD 业务指标
3. 本质区别
对比点 | Node Exporter | Jenkins Prometheus 插件 |
---|---|---|
运行位置 | 宿主机/容器,独立进程 | Jenkins JVM 内部 |
采集来源 | Linux 内核接口(/proc) | Jenkins 内部 Java API/对象模型 |
采集对象 | 操作系统层面资源 | 应用级别 CI/CD 指标 |
暴露方式 | HTTP :9100/metrics | Jenkins /prometheus 路径 |
依赖关系 | 与应用解耦,独立运行 | 依赖 Jenkins,本身不可独立使用 |
总结一句话:
- Node Exporter 监控机器
- Jenkins Prometheus 插件监控流水线
三、Prometheus 抓取 Jenkins 数据
在 Prometheus 配置文件 prometheus.yaml
中加入:
- job_name: 'jenkins'scrape_interval: 5mscrape_timeout: 3mstatic_configs:- targets:- jenkins.example.commetrics_path: /prometheus
如果在 Kubernetes 容器内访问:
- job_name: 'jenkins'scrape_interval: 5mscrape_timeout: 3mstatic_configs:- targets:- jenkins.jenkins.svc.cluster.local:8080metrics_path: /prometheus
说明:
- metrics_path:Prometheus 抓取的路径(不填默认对应
/metrics
,上方对应:http://jenkins.example.com/prometheus
) - targets:目标主机+端口。K8s 里用
服务名.命名空间.svc.cluster.local:端口
格式
配置完成后,重启 Prometheus 即可在 Prometheus UI 里看到 Jenkins 指标(可能等1-2分钟)。
四、Grafana 面板展示及报警配置
实际上,我也没监控 Jenkins 任务、资源的需求,这里就监控下 Jenkins 节点在线情况就好了。
首先确认 default_jenkins_nodes_online
是节点在线状态,抓取到的信息是这样的:
default_jenkins_nodes_online{node="aa",} 1.0
default_jenkins_nodes_online{node="bb",} 1.0
default_jenkins_nodes_online{node="cc",} 0.0
...
面板展示
先 New Dashboard,再 Add visualization。
1. Table Panel 配置
- 在 Grafana 下新建的 Panel,选择 Table 视图(默认是 Time series)
- 在 Query Options 下,Format 设置为 Table(而非 Time series),Type 设置为 Instant(即时)
2. 处理重复数据
然后发现同一节点出现多行,可以在 Prometheus 查询里使用聚合函数,例如:
max by (node) (default_jenkins_nodes_online)
这样每个节点只保留一行最新状态。
出现多行是因为指标被采集多次,或者 Grafana 默认把 每个时间点都作为一行。
3. 表格美化
-
Transform - Organize fields → 删除不需要的列,修改列名
-
右侧列 - Add field override → 按列名设置阈值颜色(设Cell options > Cell type 为
Colored text
,添加Thresholds > Threshold
s)1
设 绿色1.001
/0.999
/Base
设 红色
-
排序 → 点击表格列名,按状态递增排列,离线节点置顶
-
列宽度(Colored text) → 调整为合适宽度,避免过长
然后点保存,这样就完成了对 Jenkins 节点的视图面板了。
⚠ 注意:Dashboard 名称和 Panel 名称不要完全相同,否则会报错。
报警配置
在 Alert rules 里 Create alert rule
- 输入 Rule name
- 查询语句处(A)选择 prometheus 类型并输入:
count(max by (node) (default_jenkins_nodes_online))
-
sum(max by (node) (default_jenkins_nodes_online))
>即 A 代表了查询的值,这里用节点总数的和减去返回值的和(节点正常返回1),只要 ≠ 0,就是有异常Options -> Format 选择 Table
-
Add expression 选择 Classic_conditions
WHEN last() OF A IS OUTSIDE RANGE -0.999 TO 0.001限制 A 的值大于或小于 0 就报警
-
最后选择 Folder、Evaluation group,保存
这样就完成了 Jenkins 节点离线异常报警了。
注意事项
default_jenkins_nodes_online
这个指标只有两种状态:
1
→ 节点在线0
→ 节点离线
需要注意的是:
如果你是 手动将节点下线,这个指标同样会变为 0
,并不会区分是手动下线还是节点故障。因此:
- 如果直接以
jenkins_nodes_online
状态不等于1
作为告警条件,手动下线的节点也会触发告警。 - 插件本身没有额外的参数能标识“手动下线”。
解决思路:
-
调用 Jenkins API → 可以进一步判断某个节点是否被手动禁用,再结合 Prometheus 告警规则做过滤。
-
配置告警排除规则 → 如果节点较少,可以在告警规则里直接排除某些手动下线的节点,例如:
jenkins_node_online{node!="手动下线的节点"}
对于节点规模不大、手动下线很少的场景,这样写一行过滤规则就能解决。
总结
- Jenkins Prometheus 插件:轻量、无侵入,快速导出 Jenkins 的业务指标
- Prometheus:集中采集
- Grafana:可视化 + 报表 + 告警
在我本篇博文的基础上,稍微参照一下其他的 Jenkins/prometheus
抓取信息说明,很容易就可以实现从 节点状态 → 任务健康度 → 队列资源 的全方位对 Jenkins 监控了。