Zabbix 监控 Jenkins Online Node
Jenkins
Jenkin version : 2.164.2
Jenkins需要安装 Metrics 插件暴露metrics api。安装完成后,在系统配置中,会多出“Metrics”的配置,如下:
只需要点击“Generate...”生成一个 Access Key(生成后,记得要保存),这个 Key 用于身份校验,后面会用到。保存后,在浏览器中输入URL:
${JENKINS_URL}/metrics/<Access Key>
验证 Jenkins 是否已经暴露 metrics,如下:
Metrics 插件基于 dropwizard/metrics 实现,它通过4个接口暴露Jenkins各项数据: /metrics,/ping,/threads,/healthcheck 。下面分别简单介绍一下这四个接口的功能。
-
/metrics
接口返回的的数据非常多(有50000多行),数据结构如下:
{
version: "3.0.0",
gauges: {...},
counters: {...},
histograms: {...},
meters: {...},
timers: {...}
}
从数据结构中可以看出它将指标分成 5 种类型:
- Gauges:某项指标的瞬时值,例如:当前 Jenkins executor 的总个数(jenkins.executor.count.value);
- Counters:某项指标的总数值,例如:http 请求活动连接数(http.activeRequests);
- Meters:一段时间内,某事件的发生概率,例如:Jenkins成功执行的任务每分钟的执行次数(jenkins.runs.success.m1_rate);
- Histogram:统计指标的分布情况。例如:Jenkins executor 数量的分布(jenkins.executor.count.history);
- Timer:某项指标的持续时间。例如:Jenkins 任务等待时间(jenkins.job.waiting.duration)
-
/ping
接口返回pong
代表 Jenkins 存活 ; -
/threads
返回 Jenkins 的线程信息; -
/healthcheck
返回 Jenkins 健康检查的各项信息,包括disk-space、plugins、temporary-space 和 thread-deadlock 。
Zabbix
官方文档:https://www.zabbix.com/documentation/3.4/zh/manual/installation/containers
Zabbix Server
Docker version: 1.13.1
Zabbix-Server 以及数据库都运行在Docker容器中, docker-compose.yml 内容如下:
version: "3"
services:
mysql-server-for-z:
image: mysql:5.7
container_name: mysql-server-for-z
environment:
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=ZabbiX
- MYSQL_ROOT_PASSWORD=******
ports:
- "3306:3306"
volumes:
- "${PWD}/mysql:/var/lib/mysql"
zabbix-server-mysql:
image: zabbix/zabbix-server-mysql:latest
container_name: zabbix-server-mysql
environment:
- DB_SERVER_HOST=mysql-server-for-z
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=ZabbiX
- MYSQL_ROOT_PASSWORD=******
ports:
- "10051:10051"
links:
- mysql-server-for-z:mysql
depends_on:
- mysql-server-for-z
zabbix-web-nginx-mysql:
image: zabbix/zabbix-web-nginx-mysql:latest
container_name: zabbix-web-nginx-mysql
environment:
- DB_SERVER_HOST=mysql-server-for-z
- MYSQL_DATABASE=zabbix
- MYSQL_USER=zabbix
- MYSQL_PASSWORD=ZabbiX
- MYSQL_ROOT_PASSWORD=******
- ZBX_SERVER_HOST=zabbix-server-mysql
- PHP_TZ=Asia/Shanghai
ports:
- "8000:80"
- "8443:443"
links:
- mysql-server-for-z:mysql
- zabbix-server-mysql:zabbix-server
depends_on:
- zabbix-server-mysql
运行容器后,在浏览器中访问 Server IP:8000 查看 ,默认登录用户:Admin/zabbix .
Zabbix Agent
Zabbix Windows Agent Version : 4.2.4
由于 Jenkins 运行在 Windows机器上,所以 Zabbix Agent 对应选择 Windows 版本。官网下载地址:https://www.zabbix.com/download_agents ,Windows下可以下载MSI和ZIP版本,建议下载ZIP版本。
下载完成后,解压到C盘根目录,并重命名目录为zabbix。conf 目录存放是agent 配置文件,bin文件存放windows下32位和64位安装程序;
找到 conf 目录下的配置文件 zabbix_agentd.conf ,修改如下参数:
# zabbix agent log path
LogFile=C:\zabbix\zabbix_agentd.log
# zabbix server的ip地址
Server=******
ServerActive=******
Zabbix server 通过与 Zabbix agent 进行通信实现数据的采集。而 Zabbix agent 又分为被动和主动两种模式,这里我们使用的是被动模式,也就是Zabbix server 向 agent 索要数据。
补充:
- Server 和 ServerActive 都指定 Zabbix Server 的 IP 地址,不同的是,前者是被动后者是主动。也就是说Server这个配置是用来允许Server IP 来 Agent 这取数据,而 ServerActive则表示Agent将主动提交数据给它。
- 在配置文件中,有一个Hostname字段,即主机名,如果不指定参数值将会使用默认的主机名。在主动监控中,Hostname 必须 和 zabbix web上配置的一致,否则zabbix主动监控将无法正常工作。参考:Agent on Windows systems官方文档
修改完成后,复制 zabbix_agentd.exe和zabbix_agentd.conf 到 C:\zabbix 目录下,关闭监控主机 windows server防火墙或设置防火墙入放行zabbix_agentd客户端口号 10050 (TPC/UDP),然后使用 管理员权限(Win+X)依次执行以下命令,将Zabbix Agent 安装为 Windows服务运行。
# 将代理安装为Windows服务
C:\zabbix>C:\zabbix\zabbix_agentd.exe -i -c c:\zabbix\zabbix_agentd.conf
# 启动 agent (也可以通过服务面板启动)
C:\zabbix>C:\zabbix\zabbix_agentd.exe -s -c c:\zabbix\zabbix_agentd.conf
如果需要重新安装 zabbix_agent 服务,则需要先停止服务,再卸载服务,如下:
# 停止服务(也可以通过服务面板)
C:\zabbix\zabbix_agentd.exe -d -c C:\zabbix\zabbix_agentd.win.conf
# 卸载服务
C:\zabbix\zabbix_agentd.exe -d -c C:\zabbix\zabbix_agentd.win.conf
注意,Windows服务面板可能会出现服务状态没有刷新的情况,此时建议重新打开服务面板。
Zabbix Web配置
新建主机(Host)
Zabbix中将需要被zabbix监控的对象称之为主机(Host),主机必须属于某个主机组,新建主机的入口如下:
系统默认已经准备了一些主机组,如果这些主机组不满足项目需要,用户也可以选择创建新的主机组,此处可以随意选择一个主机组。
主机添加完成后,在Host列表中就可以看到了,此时可用性Availability是灰色的,需要添加监控项item后,才能激活zabbix可用性。
添加监控项 (Item)
监控项依附于主机(组),创建监控项入口如下:
解释一下其中几个选项为什么要这样填:
-
Type:是 Zabbix server 采集指标的类型,我们选择的是 Zabbix agent;
-
Type of information:监控数据的数据类型,由于我们监控的是 Jenkins node 节点的个数,所以,使用数字整型;
-
Update interval:指 Zabbix server 多长时间向 agent 获取一次数据;
-
Key:由于要监控的指标并不是 Zabbix 预定义的,所以,需要使用自定义参数来实现监控指标。Key 填的值为:
jenkins.metrics[gauges.jenkins.node.count.value.value]
。jenkins.metrics
是需要执行的真正的 Key 名称。而[]
内是传给该 Key 对应的命令的参数。在使用自定义参数来实现监控的情况下,Zabbix server 会将这个 Key 发送给 agent,然后 agent 根据这个 Key 执行指定的 逻辑 以获取指标数据。这个逻辑通常是一段脚本(shell命令或Python脚本等)。而脚本也是可以传参的,[]
中的值就是传给脚本的参数。当 Zabbix agent 接收到 server 端的请求时,Zabbix agent 会读取自己的配置。由于上面启动 Agent 时使用的是Zabbix Agent默认的配置文件,我们可以直接在
zabbix_agentd.conf
中加入以下配置信息:
# Zabbix Agent Configuration File for Jenkins Master
UserParameter=jenkins.metrics[*], C:/python37/python.exe C:/zabbix/jenkins.metrics.py $1
根据 Key 名称(jenkins.metrics)找到相应的命令,即:C:/python37/python.exe C:/zabbix/jenkins.metrics.py $1
。并执行它,同时将参数 gauges.jenkins.node.online.value.value
传入到脚本 jenkins.metrics.py 中。jenkins.metrics.py 需要我们在 Jenkins agent 启动前放到 C:/zabbix/
目录下。
jenkins.metrics.py 的源码如下:
import sys
import requests
metrics = {}
JENKINS_URL = "YOUR_JENKINS_URL"
PLUGIN_KEY = "QBpW2iDCCmF6yEVOSekEpaBfJQk3fPwK4wxlg6_Y5C30c_3fp3eSwRfctn0ZonZW"
def denormalize(data, keyname):
for d in data.keys():
if isinstance(data[d], dict):
denormalize(data[d], "%s%s." % (keyname, d))
else:
metrics["%s%s" % (keyname, d)] = data[d]
if __name__ == "__main__":
try:
response = requests.get("%s/metrics/%s/metrics" % (JENKINS_URL, PLUGIN_KEY))
data = response.json()
denormalize(data, "")
if len(sys.argv) > 1:
print(metrics[str(sys.argv[1])])
else:
for m in metrics:
print("%s=%s" % (m, metrics[m]))
except:
print(0)
jenkins.metrics.py 所做的事情,无非就是从 Jenkins master 的 metrics api 获取指标数据。但是由于 api 返回的是 JSON 结构,并不是 Zabbix server 所需要的格式。所以,jenkins.metrics.py 还做了一件事情,就是将 JSON 数据进行扁平化,比如原来的数据为:{"gauges":{"jenkins.node.online.value": { "value": 1 }}}
扁平化后变成: gauges.jenkins.node.online.value.value=1
。
当Jenkins服务未启动时,会返回 0 给 Zabbix Server, 所以根据此值同样可以判断 Jenkins的存活状态。
重启Agent ,就样一个自定义的Key在Server和Agent端的配置就完成了。在zabbix_server端通过zabbix_get命令验证是否可以获取到值,如果获取到值,表明这个Key就设置成功了。
/var/lib/zabbix # zabbix_get -s ${Agent_IP} -p 10050 -k jenkins.metrics[gauges.jenkins.node.online.value.value]
1
主机监控项设置完成后,此时再查看 Hosts 的 可用性(Availability),就会发现已经变为绿色了。
添加触发器(Trigger)
再经过上面的配置后,如果 Zabbix server 采集到数据,可通过Monitoring -> Latest data -> Graph菜单(如下图),看到图形化的报表。
数据采集的频率是在 监控项 中的 Update interval 字段设置的。
有了指标数据就可以根据它进行告警了,告警在 Zabbix 中称为触发器(trigger),Zabbix告警发送的步骤,可以用下图来概括说明:
上图中的 “事件”,可以理解为监控项(Items),条件判断就需要触发器(Triggers)来完成,创建触发器的入口如下:
有几个参数需要说明一下:
-
Severity:严重程度,这里选择Hign,在后续的Action操作中,可以根据严重程度这一维度来决定是否发邮件告警;
-
Expression:表达式
{jenkins-zabbix-agent:jenkins.metrics[gauges.jenkins.node.online.value.value].last(#1)}<2
当 Agent 返回的Jenkins online node<2时,就会触发 动作(Action)。
配置报警媒介类型(Media)
选择 Administration-> Media types,Zabbix 有三种默认的报警媒介,如下:
这里我们选择直接编辑默认的Email,将邮件SMTP服务器、发送人以及密码进行修改,然后保存,以腾讯企业邮箱为例: Email相关信息保存成功后,可以点击 Test 进行测试:用户报警媒介(User)
点击 Admin -> Users,配置邮件通知用户相关信息:创建动作(Action)
按照 上面的 Zabbix告警流程,触发器用来条件判断,接下来还需要创建动作,入口如下: 这里的Conditions可以添加多个,一定要勾选 Enabled,然后切换到Operations选项卡,配置如下:Default message 中的内容如下:
Problem: {EVENT.NAME}故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生: {TRIGGER.NAME}故障!
内容:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}</pre>
Operation details中的设置项是Action的核心,按照此处设置,当触发器触发动作后,会给Zabbix administrators User groups 和 Admin (Zabbix Administrator) 发送3封邮件报警,每次的间隔为600s。Recovery Operations 和 Update Operations 配置和 Operations 保持一致就好。
以上,使用 Zabbix 监控 Jenkins Node 配置完成。当Jenkins节点<2 或 Jenkins挂掉时,会自动发邮件通知相关人员,在 Report>Action log中可以查看历史日志信息。
【To be continued...】
网友评论