• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    zabbix监控docker容器状态【推荐】

    前言:前段时间在部署zabbix,有个需求就是需要监控容器的状态 也就是cpu 内存 io的占用,于是就自己写了一个脚本,以及模板,在这里分享一下 嘿嘿 : )

    废话我也就不多说,直接开始

    首选,zabbix_agentd 配置  vim /usr/local/zabbix/etc/zabbix_agentd.conf

    UserParameter=docker.discovery,/usr/local/zabbix/script/docker.py
    UserParameter=docker.[*],/usr/local/zabbix/script/docker.py $1 $2

    下面是docker.py 脚本,采用自动发现规则来发现容器,然后指定容器获取状态信息

    #!/usr/bin/python
    import sys
    import os
    import json
    def discover():
     d = {}
     d['data'] = []
     with os.popen("docker ps -a --format {{.Names}}") as pipe:
      for line in pipe:
       info = {}
       info['{#CONTAINERNAME}'] = line.replace("\n","")
       d['data'].append(info)
     print json.dumps(d)
    def status(name,action):
     if action == "ping":
      cmd = 'docker inspect --format="{{.State.Running}}" %s' %name
      result = os.popen(cmd).read().replace("\n","")
      if result == "true":
       print 1
      else:
       print 0
     else:
      cmd = 'docker stats %s --no-stream --format "{{.%s}}"' % (name,action)
      result = os.popen(cmd).read().replace("\n","")
      if "%" in result:
       print float(result.replace("%",""))
      else:
       print result
    if __name__ == '__main__':
      try:
        name, action = sys.argv[1], sys.argv[2]
        status(name,action)
      except IndexError:
        discover()

    这里说一下自动发现规则的坑。。。我被坑了好久才找出来.....一是必须返回json格式内容,二是 info['{#CONTAINERNAME}' ]  这个key一定要这么写{#CONTAINERNAME}......

    返回结果如下,一定要是这样的层级关系....

    {"data": [{"{#CONTAINERNAME}": "node-3"}, {"{#CONTAINERNAME}": "node-2"}, {"{#CONTAINERNAME}": "node-1"}, {"{#CONTAINERNAME}": "web"}, {"{#CONTAINERNAME}": "cadvisor"}, {"{#CONTAINERNAME}": "updatol"}, {"{#CONTAINERNAME}": "research"}, {"{#CONTAINERNAME}": "services"}, {"{#CONTAINERNAME}": "data"}, {"{#CONTAINERNAME}": "rabbitmq"}, {"{#CONTAINERNAME}": "redis"}, {"{#CONTAINERNAME}": "mysql"}, {"{#CONTAINERNAME}": "ssdb"}]}

    另外那个函数的很简单了,就是调用docker 命令在获取数据的。

    自动发现规则呢 也就是这样

    只监控的这几个状态,以及还有一个触发器就是ping 来检测当前这个容器状态是否运行,如果不是就报警。

    模板如下

    <?xml version="1.0" encoding="UTF-8"?>
    <zabbix_export>
     <version>3.2</version>
     <date>2018-06-04T04:12:36Z</date>
     <groups>
      <group>
       <name>Templates</name>
      </group>
     </groups>
     <templates>
      <template>
       <template>docker-status</template>
       <name>docker-status</name>
       <description/>
       <groups>
        <group>
         <name>Templates</name>
        </group>
       </groups>
       <applications>
        <application>
         <name>docker_test</name>
        </application>
       </applications>
       <items/>
       <discovery_rules>
        <discovery_rule>
         <name>docker.discovery</name>
         <type>0</type>
         <snmp_community/>
         <snmp_oid/>
         <key>docker.discovery</key>
         <delay>60</delay>
         <status>0</status>
         <allowed_hosts/>
         <snmpv3_contextname/>
         <snmpv3_securityname/>
         <snmpv3_securitylevel>0</snmpv3_securitylevel>
         <snmpv3_authprotocol>0</snmpv3_authprotocol>
         <snmpv3_authpassphrase/>
         <snmpv3_privprotocol>0</snmpv3_privprotocol>
         <snmpv3_privpassphrase/>
         <delay_flex/>
         <params/>
         <ipmi_sensor/>
         <authtype>0</authtype>
         <username/>
         <password/>
         <publickey/>
         <privatekey/>
         <port/>
         <filter>
          <evaltype>0</evaltype>
          <formula/>
          <conditions>
           <condition>
            <macro>{#CONTAINERNAME}</macro>
            <value>@ CONTAINER NAME</value>
            <operator>8</operator>
            <formulaid>A</formulaid>
           </condition>
          </conditions>
         </filter>
         <lifetime>30</lifetime>
         <description/>
         <item_prototypes>
          <item_prototype>
           <name>Container {#CONTAINERNAME} Diskio usage:</name>
           <type>0</type>
           <snmp_community/>
           <multiplier>0</multiplier>
           <snmp_oid/>
           <key>docker.[{#CONTAINERNAME} ,BlockIO]</key>
           <delay>60</delay>
           <history>90</history>
           <trends>0</trends>
           <status>0</status>
           <value_type>1</value_type>
           <allowed_hosts/>
           <units/>
           <delta>0</delta>
           <snmpv3_contextname/>
           <snmpv3_securityname/>
           <snmpv3_securitylevel>0</snmpv3_securitylevel>
           <snmpv3_authprotocol>0</snmpv3_authprotocol>
           <snmpv3_authpassphrase/>
           <snmpv3_privprotocol>0</snmpv3_privprotocol>
           <snmpv3_privpassphrase/>
           <formula>1</formula>
           <delay_flex/>
           <params/>
           <ipmi_sensor/>
           <data_type>0</data_type>
           <authtype>0</authtype>
           <username/>
           <password/>
           <publickey/>
           <privatekey/>
           <port/>
           <description/>
           <inventory_link>0</inventory_link>
           <applications>
            <application>
             <name>docker_test</name>
            </application>
           </applications>
           <valuemap/>
           <logtimefmt/>
           <application_prototypes/>
          </item_prototype>
          <item_prototype>
           <name>Container{#CONTAINERNAME} CPU usage:</name>
           <type>0</type>
           <snmp_community/>
           <multiplier>0</multiplier>
           <snmp_oid/>
           <key>docker.[{#CONTAINERNAME},CPUPerc]</key>
           <delay>60</delay>
           <history>90</history>
           <trends>365</trends>
           <status>0</status>
           <value_type>0</value_type>
           <allowed_hosts/>
           <units>%</units>
           <delta>0</delta>
           <snmpv3_contextname/>
           <snmpv3_securityname/>
           <snmpv3_securitylevel>0</snmpv3_securitylevel>
           <snmpv3_authprotocol>0</snmpv3_authprotocol>
           <snmpv3_authpassphrase/>
           <snmpv3_privprotocol>0</snmpv3_privprotocol>
           <snmpv3_privpassphrase/>
           <formula>1</formula>
           <delay_flex/>
           <params/>
           <ipmi_sensor/>
           <data_type>0</data_type>
           <authtype>0</authtype>
           <username/>
           <password/>
           <publickey/>
           <privatekey/>
           <port/>
           <description/>
           <inventory_link>0</inventory_link>
           <applications>
            <application>
             <name>docker_test</name>
            </application>
           </applications>
           <valuemap/>
           <logtimefmt/>
           <application_prototypes/>
          </item_prototype>
          <item_prototype>
           <name>Container {#CONTAINERNAME} mem usage:</name>
           <type>0</type>
           <snmp_community/>
           <multiplier>0</multiplier>
           <snmp_oid/>
           <key>docker.[{#CONTAINERNAME},MemPerc]</key>
           <delay>60</delay>
           <history>90</history>
           <trends>365</trends>
           <status>0</status>
           <value_type>0</value_type>
           <allowed_hosts/>
           <units>%</units>
           <delta>0</delta>
           <snmpv3_contextname/>
           <snmpv3_securityname/>
           <snmpv3_securitylevel>0</snmpv3_securitylevel>
           <snmpv3_authprotocol>0</snmpv3_authprotocol>
           <snmpv3_authpassphrase/>
           <snmpv3_privprotocol>0</snmpv3_privprotocol>
           <snmpv3_privpassphrase/>
           <formula>1</formula>
           <delay_flex/>
           <params/>
           <ipmi_sensor/>
           <data_type>0</data_type>
           <authtype>0</authtype>
           <username/>
           <password/>
           <publickey/>
           <privatekey/>
           <port/>
           <description/>
           <inventory_link>0</inventory_link>
           <applications>
            <application>
             <name>docker_test</name>
            </application>
           </applications>
           <valuemap/>
           <logtimefmt/>
           <application_prototypes/>
          </item_prototype>
          <item_prototype>
           <name>Container {#CONTAINERNAME} NETio usage:</name>
           <type>0</type>
           <snmp_community/>
           <multiplier>0</multiplier>
           <snmp_oid/>
           <key>docker.[{#CONTAINERNAME},NetIO]</key>
           <delay>60</delay>
           <history>90</history>
           <trends>0</trends>
           <status>0</status>
           <value_type>1</value_type>
           <allowed_hosts/>
           <units/>
           <delta>0</delta>
           <snmpv3_contextname/>
           <snmpv3_securityname/>
           <snmpv3_securitylevel>0</snmpv3_securitylevel>
           <snmpv3_authprotocol>0</snmpv3_authprotocol>
           <snmpv3_authpassphrase/>
           <snmpv3_privprotocol>0</snmpv3_privprotocol>
           <snmpv3_privpassphrase/>
           <formula>1</formula>
           <delay_flex/>
           <params/>
           <ipmi_sensor/>
           <data_type>0</data_type>
           <authtype>0</authtype>
           <username/>
           <password/>
           <publickey/>
           <privatekey/>
           <port/>
           <description/>
           <inventory_link>0</inventory_link>
           <applications>
            <application>
             <name>docker_test</name>
            </application>
           </applications>
           <valuemap/>
           <logtimefmt/>
           <application_prototypes/>
          </item_prototype>
          <item_prototype>
           <name>Container{#CONTAINERNAME} is_run :</name>
           <type>0</type>
           <snmp_community/>
           <multiplier>0</multiplier>
           <snmp_oid/>
           <key>docker.[{#CONTAINERNAME} ,ping]</key>
           <delay>30</delay>
           <history>90</history>
           <trends>365</trends>
           <status>0</status>
           <value_type>3</value_type>
           <allowed_hosts/>
           <units/>
           <delta>0</delta>
           <snmpv3_contextname/>
           <snmpv3_securityname/>
           <snmpv3_securitylevel>0</snmpv3_securitylevel>
           <snmpv3_authprotocol>0</snmpv3_authprotocol>
           <snmpv3_authpassphrase/>
           <snmpv3_privprotocol>0</snmpv3_privprotocol>
           <snmpv3_privpassphrase/>
           <formula>1</formula>
           <delay_flex/>
           <params/>
           <ipmi_sensor/>
           <data_type>0</data_type>
           <authtype>0</authtype>
           <username/>
           <password/>
           <publickey/>
           <privatekey/>
           <port/>
           <description/>
           <inventory_link>0</inventory_link>
           <applications>
            <application>
             <name>docker_test</name>
            </application>
           </applications>
           <valuemap/>
           <logtimefmt/>
           <application_prototypes/>
          </item_prototype>
         </item_prototypes>
         <trigger_prototypes>
          <trigger_prototype>
           <expression>{docker-status:docker.[{#CONTAINERNAME} ,ping].last()}=0</expression>
           <recovery_mode>0</recovery_mode>
           <recovery_expression/>
           <name>docker_{#CONTAINERNAME}_down</name>
           <correlation_mode>0</correlation_mode>
           <correlation_tag/>
           <url/>
           <status>0</status>
           <priority>5</priority>
           <description/>
           <type>0</type>
           <manual_close>0</manual_close>
           <dependencies/>
           <tags/>
          </trigger_prototype>
         </trigger_prototypes>
         <graph_prototypes/>
         <host_prototypes/>
        </discovery_rule>
       </discovery_rules>
       <httptests/>
       <macros/>
       <templates/>
       <screens/>
      </template>
     </templates>
    </zabbix_export>

    修改Zabbix_agentd 配置,docker.py脚本放在指定路径下,不要忘了给权限,导入模板,能获取数据就没问题。获取不了的,可以zabbix_get 来调试 找到问题出在哪去解决。

    总结

    以上所述是小编给大家介绍的zabbix监控docker容器状态,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

    上一篇:linux下查看端口是否被占用以及查看所有端口【推荐】
    下一篇:详解nginx实现https网站设置
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    zabbix监控docker容器状态【推荐】 zabbix,监控,docker,容器,状态,