zoukankan      html  css  js  c++  java
  • Zabbix-(五)监控Docker容器与自定义jvm监控项

    Zabbix-(五)监控Docker容器与自定义jvm监控项

    一.前言

    前文中讲述了Zabbix对服务器硬件方面的监控功能,本文将讲述利用Zabbix监控Docker容器中的Java Web服务,并通过自定义监控项,监控JVM老年代使用情况以及GC信息。Zabbix其实提供了JMX监控,自带了JMX模板能够直接监控JVM信息,本文主要侧重于自定义参数与自定义监控项,关于JMX会在之后的文章中介绍。

    准备

    • Zabbix Server (Zabbix 4.4) (ip:192.168.152.140)
    • 运行Java应用的主机 以下简称Server-A (已被Zabbix监控) (ip:192.168.152.142)

    二.开启agent用户自定义参数配置

    1. 修改配置

      使用自定义参数时,首先需要修改Server-A的agent配置

      # vim /etc/zabbix/zabbix_agentd.conf
      

      修改配置 UnsafeUserParameters=1

      UnsafeUserParameters=1
      
    2. 重启zabbix-agent

      # systemctl restart zabbix-agent
      

    三.运行tomcat容器

    在Server-A运行tomcat容器

    # docker run --name tomcat -p 8080:8080 -dit tomcat:jdk8-adoptopenjdk-hotspot
    

    将zabbix账号添加到docker组。参考部署问题

    # sudo gpasswd  -a zabbix docker
    

    外部访问测试一下

    访问tomcat


    四.创建自定义Docker模板

    我们可以定义一个比较通用的Docker模板,有服务需要被监控时,直接链接该模板即可。

    1. 创建群组

      点击【配置】-【主机群组】-【创建主机群组】

      定义一个组名 Docker Group

      配置项
      * 组名 Docker Group

    2. 创建模板

      创建一个自定义模板,模板名称Docker Template,选择上步骤创建的Docker Group群组

      配置项
      * 模板名称 Docker Template
      * 群组 Docker Group


    五.编写脚本与自定义监控参数

    我们需要编写一个脚本,用于发现当前正在运行的docker容器(这里使用容器名称)。

    1. 在Server-A编写发现运行容器的python脚本

      创建脚本

      # cd /data/zabbix
      # touch find_container.py
      # chmod a+x find_container.py
      # vim find_container.py
      

      脚本内容:

      #!/usr/bin/env python
      import os
      import json
      
      # 查看当前运行的docker容器
      t=os.popen(""" docker ps  |grep -v 'CONTAINER ID'|awk {'print $NF'} """)
      container_name = []
      for container in  t.readlines():
              r = os.path.basename(container.strip())
              container_name += [{'{#CONTAINERNAME}':r}]
      # 转换成json数据
      print json.dumps({'data':container_name},sort_keys=True,indent=4,separators=(',',':'))
      
      运行脚本,查看一下json数据格式:
      {
          "data":[
              {
                  "{#CONTAINERNAME}":"tomcat"
              }
          ]
      }
      
    2. 在Server-A自定义容器发现参数

      我们需要自定义一个键值对的配置类型,以便Zabbix可以通过键读取到值。

      增加自定义参数

      # cd /etc/zabbix/zabbix_agentd.d
      # vim userparameter_find_container.conf
      
      docker.container /data/zabbix/find_container.py (脚本的运行结果)
      UserParameter=docker.container,/data/zabbix/find_container.py
      
    3. 在Server-A创建查看容器JVM GC情况的脚本

      我们可以使用jstat -gcutil 命令查看GC情况


      创建python脚本

      # cd /data/zabbix
      # touch monitor_gc.py
      # chmod a+x monitor_gc.py
      # vim monitor_gc.py
      

      脚本内容

      #!/usr/bin/python
      import sys
      import os
      
      def monitor_gc(container_name, keyword):
              cmd = ''' docker exec %s bash -c "jstat -gcutil 1" | grep -v S0 | awk '{print $%s}' ''' %(container_name, keyword)
              value = os.popen(cmd).read().replace("
      ","")
              print value
              
      if __name__ == '__main__':
              # 参数1:容器的名称
              # 参数2:查看第几列(例如 Eden区在第3列传入3,Full GC次数在第9列传入9)
              container_name, keyword = sys.argv[1], sys.argv[2]
              monitor_gc(container_name, keyword)
      

      测试脚本,查看当前tomcat容器Full GC次数

      # /data/zabbix/monitor_gc.py 'tomcat' '9'
      

    4. 在Server-A自定义Zabbix JVM GC参数

      同样,增加一个conf文件,表示自定义参数

      # cd /etc/zabbix/zabbix_agentd.d
      # touch userparameter_gc_status.conf
      # vim userparameter_gc_status.conf
      
      jvm.gc.status[*] /data/zabbix/monitor_gc.py $1 $2
      UserParameter=jvm.gc.status[*], /data/zabbix/monitor_gc.py $1 $2
      

      jvm.gc.status[*] 表示可以使用参数。其中$1表示参数1,即容器名称;$2表示参数2,需要查看哪项GC信息,$1 $2都是通过Zabbix配置时传递的。Zabbix自定义参数

    5. 在Zabbix server上测试自定义参数

      为zabbix sever安装zabbix-get

      # yum install -y zabbix-get
      

      测试自定义参数,如果有权限问题,可以参考部署问题

      # zabbix_get -s 192.168.152.142 -p 10050 -k docker.container
      # zabbix_get -s 192.168.152.142 -p 10050 -k "jvm.gc.status['tomcat', 9]"
      

    六.Zabbix模板增加自动发现规则

    上述配置中,已经可以通过脚本获取到已运行的容器信息,此步骤将通过Zabbix配置界面,在模板中添加自动发现规则,以发现被监控主机中正在运行的docker容器,并利用这些获取的数据进一步监控容器中jvm数据。

    1. 创建自动发现规则

      点击【配置】-【模板】-【Docker Template】

      点击【自动发现规则】-【创建发现规则】

      先配置【自动发现规则】

      配置项
      * 名称 发现正在运行的Docker容器规则
      类型 Zabbix 客户端
      * 键值 docker.container (这是我们上述步骤中自定义的键值)
      其他配置 根据需要配置

      键值配置项是之前自定义的监控键值

      再配置【过滤器】

      则配置自定义脚本返回json数据中的key值

      配置项
      {#CONTAINERNAME}

    2. 添加监控项原型

      点击新建的自动发现规则的【监控项原型】-【创建监控项原型】


      输入参数

      配置项
      * 名称 Tomcat Full GC次数监控项
      类型 Zabbix 客户端
      * 键值 jvm.gc.status[{#CONTAINERNAME} , 9]
      其他配置项 根据需要填写

      键值是自定义jvm gc参数步骤中定义的参数,{#CONTAINERNAME} 是jvm.gc.status的参数1,使用了自动发现规则,发现到的docker容器名称(本文中即是 tomcat);参数2 9 则是表示需要查看FullGC次数,FGC列(第9列)

      除此之外,还可以添加Old老年代(对应第4列),Full GC时间(对应第10列)等监控项,这里就不一一添加了,和上述过程基本一致,只需修改参数2即可(也可以利用刚新建的监控项原型进行【克隆】)。


    七.链接模板

    将上述自定义的模板链接到Server-A主机

    八.DashBoard添加可视化图形

    回到Zabbix首页可以为新增的自定义监控项,增加图形(添加图形步骤可以参考Zabbix-(三)监控主机CPU、磁盘、内存并创建监控图形

    九.其他

    部署问题

    • zabbix在执行脚本时,是使用的zabbix账户,因此可能要注意要给zabbix账号赋予权限。

      例如,zabbix账户无法使用docker命令,将zabbix添加到docker组

      # sudo gpasswd -a zabbix docker
      
    • zabbix server无法执行agent自定义参数中的脚本

      为agent主机设置

      # setenforce 0
      
  • 相关阅读:
    明年,我们依然年轻
    总有些东西会如台风一样的来
    ora00257错误处理方法
    ORACLE登录错误的解决方法
    C#中public new void add()的new在这里的意义
    Oracle Form Builder配置问题的一些总结
    作为程序员,你应该知道的职场晋升之路
    ORA01034错误的解决方法
    【转】JQUERY刷新页面
    【转】对C# 中堆栈,堆,值类型,引用类型的理解
  • 原文地址:https://www.cnblogs.com/Sherry-XRJ/p/11837442.html
Copyright © 2011-2022 走看看