Zabbix使用手册:监控Docker容器及其资源使用情况

本文讲述如何通过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容器及其资源使用情况

精彩评论

6+9=

感谢您的支持与鼓励

支付宝扫一扫打赏

微信扫一扫打赏