前言:前段时间在部署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 来检测当前这个容器状态是否运行,如果不是就报警。
模板如下
3.2 2018-06-04T04:12:36Z Templates docker-status docker-status Templates docker_test docker.discovery 0 docker.discovery 60 0 0 0 0 0 0 {#CONTAINERNAME} @ ConTAINER NAME 8 A 30 Container {#CONTAINERNAME} Diskio usage: 0 0 docker.[{#CONTAINERNAME} ,BlockIO] 60 90 0 0 1 0 0 0 0 1 0 00 docker_test Container{#CONTAINERNAME} CPU usage: 0 0 docker.[{#CONTAINERNAME},CPUPerc] 60 90 365 0 0 % 0 0 0 0 1 0 00 docker_test Container {#CONTAINERNAME} mem usage: 0 0 docker.[{#CONTAINERNAME},MemPerc] 60 90 365 0 0 % 0 0 0 0 1 0 00 docker_test Container {#CONTAINERNAME} NETio usage: 0 0 docker.[{#CONTAINERNAME},NetIO] 60 90 0 0 1 0 0 0 0 1 0 00 docker_test Container{#CONTAINERNAME} is_run : 0 0 docker.[{#CONTAINERNAME} ,ping] 30 90 365 0 3 0 0 0 0 1 0 00 docker_test {docker-status:docker.[{#CONTAINERNAME} ,ping].last()}=0 0 docker_{#CONTAINERNAME}_down 0 0 5 0 0
修改Zabbix_agentd 配置,docker.py脚本放在指定路径下,不要忘了给权限,导入模板,能获取数据就没问题。获取不了的,可以zabbix_get 来调试 找到问题出在哪去解决。
总结
以上所述是小编给大家介绍的zabbix监控docker容器状态,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对考高分网网站的支持!



