zabbix自动发现
首先,介绍下该监控套件有2个脚本,一个是自动发现主机上的docker容器名字脚本,另一个是用python写的获取每个docker容器的系统状态,包括CPU使用率,内存使用率等使用率。
1.写监控脚本套件,放在/etc/zabbix/scripts/下:
- docker_project_automatic.py 用于发现docker容器名
#!/usr/bin/python
# 获取容器名
import json,os,sys
docker_pro_list = os.popen("docker ps -a|grep -v 'CONTAINER ID'|awk '{print $NF}'").read().split()
data = {}
data_pro_dic = []
for docker_pro in docker_pro_list:
data_pro_name = {}
data_pro_name['{#CONTAINERNAME}']= docker_pro
data_pro_dic.append(data_pro_name)
data['data'] = data_pro_dic
data_json = json.dumps(data,sort_keys=True,indent=4)
print data_json
zabbix 自动获取,zabbix要求json格式,格式如下:
{
"data": [
{
"{#CONTAINERNAME}": "xxxxxxxxx"
}
]
}
- docker_status.py 用于获取CPU、内存使用率
#!/usr/bin/python
import os,sys
pro_dic = []
cpu_total = 0
mem_total = 0
docker_data = os.popen("docker stats --no-stream").read().replace("/","").replace("%","")
docker_value= docker_data.split()[13:]
for index,value in enumerate(docker_value):
if index % 11 ==1 and "portainer" not in docker_value[index]:
pro_dic_docker = []
pro_dic_docker.append(docker_value[index])
pro_dic_docker.append(float(docker_value[index+1]))
pro_memory = round(float(docker_value[index+4])/100*15.518*1024,2)
pro_dic_docker.append(pro_memory)
pro_dic.append(pro_dic_docker)
if len(sys.argv) > 1:
if sys.argv[1]=="cpu":
if sys.argv[2] =="total":
for pro_docker_list in pro_dic:
cpu_total += pro_docker_list[1]
print cpu_total
for pro_docker_list in pro_dic:
if sys.argv[2] in pro_docker_list:
print pro_docker_list[1]
elif sys.argv[1]=="mem":
if sys.argv[2] =="total":
for pro_docker_list in pro_dic:
mem_total += pro_docker_list[2]
print mem_total
for pro_docker_list in pro_dic:
if sys.argv[2] in pro_docker_list:
print pro_docker_list[2]
else:
print "[mem/cpu]"
else :
print "[mem/cpu] [项目名/mem_total/cpu_total]"
#执行脚本
chmod +x docker_status.py #赋执行权限
python docker_status.py [cpu/mem] [项目名/mem_total/cpu_total] #执行命令
如 :python docker_status.py mem mem_total #获取服务器docker容器内存总共使用量
2.编写zabbix conf文件,路径为/etc/zabbix/zabbix_agentd.d/
- docker_project_automatic.conf
UserParameter=docker_discovery[*],/usr/bin/python /etc/zabbix/scripts/docker_project_automatic.py
UserParameter=docker_stats[*],/usr/bin/python /etc/zabbix/scripts/docker_status.py $1 $2
重启zabbix客户端,systemctl restart zabbix-agent
3.测试
zabbix_get -s 127.0.0.1 -p 10050 -k docker_discovery[*]
#测试docker_project_automatic.py自动发现脚本是否获取到值
zabbix_get -s 127.0.0.1 -p 10050 -k docker_stats[cpu,项目名]
#测试docker_status.py是否获取到值
4.zabbix网页配置
我这里为了方便,没有新建模板,用了系统自带的Template OS Linux模板,而且每台主机都应用了此模板。
以下为梳理的结构:
- 自动发现
- 添加自动发现
- 检查自动发现是否正常
- 配置监控
- 添加监控项原型
- 添加图形原型
- 查看成果
-
然后点击右上角的创建发现规则
到此自动发现规则已经配置完成
-
点击应用的主机里面的自动发现
- 当无感叹号时,说明自动发现规则正常
- 我们再次回到模板中的自动发现。
ps:模板中的自动发现,与主机里的自动发现不一样
名称:container_mem:{#CONTAINERNAME}
{#CONTAINERNAME} 为自动发现中的宏的名字
键值:docker_stats[mem,{#CONTAINERNAME}]
mem,{#CONTAINERNAME} 为两个参数传值到脚本中的$1,$2
信息类型:浮点数
脚本中会涉及到小说,所以这里用了浮点数
单位:B
单位的话,这里建议使用B,因为这个涉及到图形上单位转换的问题,如果你直接使用MB单位的话,图形上涉及1000以上的,
会出现单位kMB,脚本中数据的单位为MB,因此,在进程中,添加预定步骤,自定义倍数,1MB=1048576B.
-
添加完监控原型后,我们来添加图形原型,然后创建图形原型
- 到此监控图添加完毕,我们去看一下,被监控的主机