zabbix监控docker容器状态【推荐】
author:一佰互联 2019-04-23   click:214

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

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

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

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

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

#!/usr/bin/pythonimport sysimport osimport jsondef discover(): d = {} d["data"] = [] with os.popen("docker ps -a --format {{.Names}}") as pipe:  for line in pipe:   info = {}   info["{#CONTAINERNAME}"] = line.replace("","")   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("","")  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("","")  if "%" in result:   print float(result.replace("%",""))  else:   print resultif __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容器状态,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网页设计网站的支持!