本文从开始到监控docker容器状态分为三部分
1.查看自己的环境变量以及自己的服务路径
(1)jdk环境: jdk1.8
(2)zabbix版本:zabbix3.4.5
(3)zabbix脚本存放路径:/data/zabbix/scripts/
( 4 ) .conf文件存放路径:/data/zabbix/etc/zabbix_agentd.conf.d/
2.配置脚本、key、模板
首选,zabbix_agentd 配置 vim/data/zabbix/etc/zabbix_agentd.conf.d/docker.conf
UserParameter=docker.discovery,/data/zabbix/scripts/docker.py
UserParameter=docker.[*],/data/zabbix/script/docker.py $1 $2
下面是docker.py 脚本,采用自动发现规则来发现容器,然后指定容器获取状态信息:
#!/usr/bin/python
import sys
import os
import jsondef 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 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 命令在获取数据的。
然后导入模板:
模板如下:
~~ 3.2 2018-06-04T04:12:36Z Templates
docker-statusdocker-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 0 0 docker_test Container{#CONTAINERNAME} CPU usage: 0 0 docker.[{#CONTAINERNAME},CPUPerc] 60 90 365 0 0 % 0 0 0 0 1 0 0 0 docker_test Container {#CONTAINERNAME} mem usage: 0 0 docker.[{#CONTAINERNAME},MemPerc] 60 90 365 0 0 % 0 0 0 0 1 0 0 0 docker_test Container {#CONTAINERNAME} NETio usage: 0 0 docker.[{#CONTAINERNAME},NetIO] 60 90 0 0 1 0 0 0 0 1 0 0 0 docker_test Container{#CONTAINERNAME} is_run : 0 0 docker.[{#CONTAINERNAME} ,ping] 30 90 365 0 3 0 0 0 0 1 0 0 0 docker_test {docker-status:docker.[{#CONTAINERNAME} ,ping].last()}=0 0 expression/> docker{#CONTAINERNAME}_down 0 0 5 0 0
模板下载链接:https://pan.baidu.com/share/init?surl=18Z9QIkSuLQ3sSPqSlbY2A 密码:3544
3.web端操作
导入模板后
可能有的人在这导入模板后会出现这个问题:
zabbixGlobal regular expression " CONTAINER NAME" does not exist.
出现这个问题,证明:问题不大。
去这个地方把这个去掉
如果你要了解这个时什么意思:请参考官网:zabbix正则表达式写法,大体意思如下:
去管理 、一般,里边点开正则
自己先去了解这个怎么用,去添加就好了
接下来我们看一下模板中都监控了什么
触发器有一个
都没问题之后我们看一下最新数据
我们看到了各个容器状态已经添加上去了,
到此结束,你可以向你领导交差了。
以上内容,如有问题 随时沟通
QQ: 936172842