DockerWhat is SoftWare TestJenkins

Zabbix 监控 Jenkins Online Node 发送

2019-10-12  本文已影响0人  Rethink

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 。下面分别简单介绍一下这四个接口的功能。

{ 
    version: "3.0.0", 
    gauges: {...},  
    counters: {...},  
    histograms: {...},  
    meters: {...},  
    timers: {...}
}

从数据结构中可以看出它将指标分成 5 种类型:

  1. Gauges:某项指标的瞬时值,例如:当前 Jenkins executor 的总个数(jenkins.executor.count.value);
  2. Counters:某项指标的总数值,例如:http 请求活动连接数(http.activeRequests);
  3. Meters:一段时间内,某事件的发生概率,例如:Jenkins成功执行的任务每分钟的执行次数(jenkins.runs.success.m1_rate);
  4. Histogram:统计指标的分布情况。例如:Jenkins executor 数量的分布(jenkins.executor.count.history);
  5. Timer:某项指标的持续时间。例如:Jenkins 任务等待时间(jenkins.job.waiting.duration)

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 索要数据。

补充:

  1. Server 和 ServerActive 都指定 Zabbix Server 的 IP 地址,不同的是,前者是被动后者是主动。也就是说Server这个配置是用来允许Server IP 来 Agent 这取数据,而 ServerActive则表示Agent将主动提交数据给它。
  1. 在配置文件中,有一个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)

监控项依附于主机(组),创建监控项入口如下:

解释一下其中几个选项为什么要这样填:

# 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)来完成,创建触发器的入口如下:

有几个参数需要说明一下:

{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...】

参考文档

  1. Zabbix Documentation 4.0

  2. 运维监控篇(8)_Zabbix Action(动作)配置浅析 , 小马

  3. zabbix数据采集频率、数据连续多次异常触发、告警次数、告警频率金枪语

  4. Zabbix Documentation: Escalations

  5. zabbix:关于错误unsupported-item-key常见错误汇总一只叫羊的羊

  6. zabbix自定义keyMr_dark_

上一篇下一篇

猜你喜欢

热点阅读