当前位置: 首页 > java >正文

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 的话一般做些什么。

  1. 节点健康监控

    • 发现某个 Agent 掉线及时告警
    • 判断节点是否长期闲置,辅助缩容
  2. 任务执行监控

    • 构建成功率统计(CI 健康度)
    • 构建耗时分析(定位瓶颈)
    • 失败趋势分析(发现不稳定测试或问题代码)
  3. 资源使用监控

    • 队列长度、Executor 使用情况
    • 帮助判断是否需要扩容构建资源

原理

一般普罗米修斯监控都是靠 Exporter 去定规则监控,这里简单讲下 Node ExporterJenkins 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 ExporterJenkins Prometheus 插件
运行位置宿主机/容器,独立进程Jenkins JVM 内部
采集来源Linux 内核接口(/proc)Jenkins 内部 Java API/对象模型
采集对象操作系统层面资源应用级别 CI/CD 指标
暴露方式HTTP :9100/metricsJenkins /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 配置

  1. 在 Grafana 下新建的 Panel,选择 Table 视图(默认是 Time series
  2. 在 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 > Thresholds)

    • 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 作为告警条件,手动下线的节点也会触发告警。
  • 插件本身没有额外的参数能标识“手动下线”。

解决思路:

  1. 调用 Jenkins API → 可以进一步判断某个节点是否被手动禁用,再结合 Prometheus 告警规则做过滤。

  2. 配置告警排除规则 → 如果节点较少,可以在告警规则里直接排除某些手动下线的节点,例如:

    jenkins_node_online{node!="手动下线的节点"}
    

对于节点规模不大、手动下线很少的场景,这样写一行过滤规则就能解决。


总结

  • Jenkins Prometheus 插件:轻量、无侵入,快速导出 Jenkins 的业务指标
  • Prometheus:集中采集
  • Grafana:可视化 + 报表 + 告警

在我本篇博文的基础上,稍微参照一下其他的 Jenkins/prometheus 抓取信息说明,很容易就可以实现从 节点状态任务健康度队列资源 的全方位对 Jenkins 监控了。

http://www.xdnf.cn/news/20149.html

相关文章:

  • Java 学习笔记(进阶篇2)
  • 《Cocos Creator的2D、3D渲染使用记录》
  • 使用自定义固定公网URL地址远程访问公司内网OA办公系统,本地无需公网IP和专线让外网访问
  • 【Python基础】 19 Rust 与 Python if 语句对比笔记
  • Unity学习----【进阶】Addressables(二)--加载资源与打包及更新
  • Github | MoneyPrinterTurbo:自动化视频内容生成系统
  • 医疗AI中GPU集群设计与交付实践
  • Windows蓝屏解决方案(扩展)
  • C++进阶——继承 (1)
  • Dify on DMS,快速构建开箱即用的客服对话数据质检服务
  • Cursor Pair Programming:在前端项目里用 AI 快速迭代 UI 组件
  • STM32使用HAL库驱动铁电存储FM25CL64
  • 用 Shields.io 定制 README 个性徽章
  • 嵌入式铁头山羊stm32-SAR型ADC模块介绍、采样时间、转换时间-Day24
  • Web与Nginx
  • MCP 和 Fuction Call 有什么不同
  • Python基础(①④内存管理机制)
  • 【Element Plus 表单组件样式统一 CSS 文字特效实现指南】
  • 啥是两化融合?
  • 算法模板(Java版)_哈希表
  • 手写Java泛型,彻底掌握它!
  • 结合prompt分析NodeRAG的build过程
  • MySQL事务的四大特性(ACID)
  • 代码随想录二刷之“贪心算法”~GO
  • HTML 基本结构
  • 一篇文章带你彻底搞懂 JVM 垃圾收集器
  • 大数据开发计划表(实际版)
  • Python入门教程之数学运算符
  • 基于单片机智能水龙头/智能洗漱台设计
  • STM32F103_Bootloader程序开发15 - 从Keil到vscode + EIDE + GCC的迁移实践