本文讲述如何通过zabbix监控docker:使用python脚本实现自动发现正在运行的容器,同时对容器资源使用情况加以监控。
系统环境
需要设置zabbix用户特定的超级权限,修改配置/etc/sudoers:
#zabbix ALL=(ALL) NOPASSWD: ALL #这个权限太大 zabbix ALL=(root) NOPASSWD:/usr/bin/docker,/usr/bin/python
安装依赖
安装simplejson
访问PyPI下载页面或者本地分享点下载,本地提供的版本为3.17.2,然后解压并安装。
tar zxvf simplejson-3.17.2.tar.gz cd simplejson-3.17.2 python setup.py build python setup.py install
安装docker-py
yum -y install python-docker-py # 或者使用pip命令安装 # pip install docker-py
创建监控脚本
创建自动发现容器的脚本/opt/zabbix/scripts/docker_discover.py:
#!/usr/bin/env python import os import simplejson as json t = os.popen("""sudo docker ps |grep -v 'CONTAINER ID'|awk {'print $NF'} """) container_name = [] for container in t.readlines(): r = os.path.basename(container.strip()) container_name += [{'{#CONTAINERNAME}':r}] print (json.dumps({'data':container_name},sort_keys=True,indent=4,separators=(',',':')))
创建监控容器资源使用情况的脚本/opt/zabbix/scripts/docker_monitor.py:
#!/usr/bin/env python # -*- coding: utf-8 -*- from docker import Client import sys import subprocess import os def check_container_status(container_name,collect_item): container_collect=docker_client.stats(container_name) old_result = eval(container_collect.next()) new_result = eval(container_collect.next()) container_collect.close() if collect_item == 'cpu_total_usage': result = new_result['cpu_stats']['cpu_usage']['total_usage'] - old_result['cpu_stats']['cpu_usage']['total_usage'] elif collect_item == 'cpu_system_usage': result = new_result['cpu_stats']['system_cpu_usage'] - old_result['cpu_stats']['system_cpu_usage'] elif collect_item == 'cpu_percent': cpu_total_usage = new_result['cpu_stats']['cpu_usage']['total_usage'] - old_result['cpu_stats']['cpu_usage']['total_usage'] cpu_system_uasge = new_result['cpu_stats']['system_cpu_usage'] - old_result['cpu_stats']['system_cpu_usage'] cpu_num = len(old_result['cpu_stats']['cpu_usage']['percpu_usage']) result = round((float(cpu_total_usage)/float(cpu_system_uasge))*cpu_num*100.0,2) elif collect_item == 'mem_usage': result = new_result['memory_stats']['usage'] elif collect_item == 'mem_limit': result = new_result['memory_stats']['limit'] elif collect_item == 'mem_percent': mem_usage = new_result['memory_stats']['usage'] mem_limit = new_result['memory_stats']['limit'] result = round(float(mem_usage)/float(mem_limit)*100.0,2) elif collect_item == 'network_rx_bytes': network_check_command = """sudo /usr/bin/docker exec %s cat /proc/net/dev|sed -n 3p|awk '{print $2,$10}'"""%container_name result = os.popen(network_check_command).read().split()[0] elif collect_item == 'network_tx_bytes': network_check_command = """sudo /usr/bin/docker exec %s cat /proc/net/dev|sed -n 3p|awk '{print $2,$10}'"""%container_name result = os.popen(network_check_command).read().split()[1] return result if __name__ == "__main__": docker_client = Client(base_url='unix://var/run/docker.sock', version='1.40') container_name = sys.argv[1] collect_item = sys.argv[2] print (check_container_status(container_name,collect_item))
以上两个脚本赋予执行权限:
chmod +x docker_discover.py docker_monitor.py
配置zabbix-agent
修改配置/etc/zabbix/zabbix_agentd.conf:
UserParameter=docker_discover[*], /usr/bin/python /opt/zabbix/scripts/docker_discover.py $1 UserParameter=docker_status[*], sudo /usr/bin/python /opt/zabbix/scripts/docker_monitor.py $1 $2
重启zabbix-agent:
systemctl restart zabbix-agent
测试脚本:
python /opt/zabbix/scripts/docker_discover.py
配置监控模板
在zabbix-server或zabbix-proxy端测试是否能获取数据:
zabbix_get -s 10.10.200.151 -k docker_discover[docker] zabbix_get -s 10.10.200.151 -k docker_status[gifted_hoover,mem_usage]
创建模板
名 称:Docker Containers
应用集:Docker
创建自动发现规则
名称:Auto Discover Containers
键值:docker_discover[docker]
间隔:5m
创建监控项原型
监控脚本中支持的监控项包括:cpu_total_usage、cpu_system_usage、cpu_percent、mem_usage、mem_limit、mem_percent、network_rx_bytes和network_tx_bytes。
CPU使用率
名称:容器{#CONTAINERNAME}的CPU使用率
键值:docker_status[{#CONTAINERNAME},cpu_percent]
单位:%
按相同方法添加内存使用率:mem_percent
已用内存
名称:容器{#CONTAINERNAME}的可用内存
键值:docker_status[{#CONTAINERNAME},mem_usage]
单位:b
按相同方法添加已用内存的监控项:mem_limit
网卡流量
名称:容器{#CONTAINERNAME}网络流出速度
键值:docker_status[{#CONTAINERNAME},network_rx_bytes]
单位:b
进程:每秒更改
按相同方法添加网络流入速度的监控项:network_tx_bytes
创建好监控项原型后,就可以创建触发器和图形了,本文略。
原创文章禁止转载:技术学堂 » Zabbix使用手册:监控Docker容器及其资源使用情况