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容器状态,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是 zabbix监控docker容器状态【推荐】 的全部内容, 来源链接: utcz.com/z/344577.html

回到顶部