美文网首页DockerWhat is SoftWare TestJenkins
Zabbix 监控 Jenkins Online Node 发送

Zabbix 监控 Jenkins Online Node 发送

作者: Rethink | 来源:发表于2019-10-12 17:31 被阅读0次

    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 种类型:

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

    补充:

    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)

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

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

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

    参考文档

    1. Zabbix Documentation 4.0

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

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

    4. Zabbix Documentation: Escalations

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

    6. zabbix自定义keyMr_dark_

    相关文章

      网友评论

        本文标题:Zabbix 监控 Jenkins Online Node 发送

        本文链接:https://www.haomeiwen.com/subject/jifnuctx.html