原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://dl528888.blog.51cto.com/2382721/1660844
无论开源的CAdvisor、Data Dog还是我自己写的监控(http://dl528888.blog.51cto.com/2382721/1635951),不是通过docker的stats api就是使用socket来进行。
不说太多的废话,直接看效果图,满足自己需求在继续深入研究
一、效果图
1、监控容器cpu使用率
2、监控容器内存使用量
3、监控容器网络流量值
目前我监控docker就监控这些东西,至于其他的资源个人有需求可以自己写。
下面是如何部署
二、部署
1、环境
我的zabbix是2.0.6,所以想使用我的模板,必须是2.0.x以上的zabbix版本;
docker使用1.6版本,如果想使用我的监控,docker必须大于1.5;
需要安装jq,如何安装参考http://stedolan.github.io/jq/tutorial/
监控客户端里必须安装docker的python 模块
安装的话,可以使用
easy_install docker-py
2、客户端部署
A.在zabbix_agentd.conf最后添加以下内容
UserParameter=zabbix_low_discovery[*], /bin/bash /usr/local/zabbix/bin/zabbix_low_discovery .sh $1
UserParameter=docker_stats[*], sudo /usr/local/zabbix/bin/zabbix_monitor_docker .py $1 $2
B.把下面的脚本放到/usr/local/zabbix/bin里,然后给与755权限,并修改用户与组为zabbix
[root@ip-10-10-125-8 bin] # cat zabbix_monitor_docker.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#author:Deng Lei
#email: dl528888@gmail.com
from docker import Client
import os
import re
import sys
import subprocess
import time
def check_container_stats(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_uasge' :
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)
#network_rx_packets=new_result['network']['rx_packets']
#network_tx_packets=new_result['network']['tx_packets']
elif collect_item == 'network_rx_bytes' :
network_check_command= "" "docker exec %s ifconfig eth1|grep bytes|awk -F ':' '{print $2,$3}'|awk -F '(' '{print $1,$2}'|awk -F ')' '{print $1}'|awk '{print " {\\ "rx\\" : "$1" ,\\ "tx\\" : "$2" } "}'" "" %container_name
network_old_result= eval(((subprocess.Popen(network_check_command,shell=True,stdout=subprocess.PIPE)).stdout.readlines()[0]).strip( '\n' ))
time . sleep (1)
network_new_result= eval(((subprocess.Popen(network_check_command,shell=True,stdout=subprocess.PIPE)).stdout.readlines()[0]).strip( '\n' ))
#unit KB
result=int(network_new_result[ 'rx' ]) - int(network_old_result[ 'rx' ])
elif collect_item == 'network_tx_bytes' :
network_check_command= "" "docker exec %s ifconfig eth1|grep bytes|awk -F ':' '{print $2,$3}'|awk -F '(' '{print $1,$2}'|awk -F ')' '{print $1}'|awk '{print " {\\ "rx\\" : "$1" ,\\ "tx\\" : "$2" } "}'" "" %container_name
network_old_result= eval(((subprocess.Popen(network_check_command,shell=True,stdout=subprocess.PIPE)).stdout.readlines()[0]).strip( '\n' ))
time . sleep (1)
network_new_result= eval(((subprocess.Popen(network_check_command,shell=True,stdout=subprocess.PIPE)).stdout.readlines()[0]).strip( '\n' ))
result=int(network_new_result[ 'tx' ]) - int(network_old_result[ 'tx' ])
return result
if __name__ == "__main__" :
docker_client = Client(base_url= 'unix://var/run/docker.sock' , version= '1.17' )
container_name=sys.argv[1]
collect_item=sys.argv[2]
print check_container_stats(container_name,collect_item)
监控内容的json化
下面在是我的json监控docker容器的json展示
[root@ip-10-10-125-6 ~] # sh /usr/local/zabbix/bin/zabbix_low_discovery.sh docker
{
"data" :[
{
"{#CONTAINERNAME}" : "nodeA" },
{
"{#CONTAINERNAME}" : "xiaotg-mesos.5" },
{
"{#CONTAINERNAME}" : "xiaotg-mesos.4" },
{
"{#CONTAINERNAME}" : "xiaotg-mesos.3" },
{
"{#CONTAINERNAME}" : "xiaotg-mesos.2" },
{
"{#CONTAINERNAME}" : "xiaotg-mesos.1" },
{
"{#CONTAINERNAME}" : "xiaotg-mesos.0" },
{
"{#CONTAINERNAME}" : "ulimit_test.1" },
{
"{#CONTAINERNAME}" : "ulimit_test.0" }
]
}
脚本内容如下:
[root@ip-10-10-125-6 tmp] # cat zabbix_low_discovery.sh
#!/bin/bash
#Fucation:zabbix low-level discovery
docker() {
port=($( sudo docker ps -a| grep - v "CONTAINER ID" | awk '{print $NF}' ))
printf '{\n'
printf '\t"data":[\n'
for key in ${!port[@]}
do
if [[ "${#port[@]}" -gt 1 && "${key}" - ne "$((${#port[@]}-1))" ]]; then
printf '\t {\n'
printf "\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"},\n"
else [[ "${key}" - eq "((${#port[@]}-1))" ]]
printf '\t {\n'
printf "\t\t\t\"{#CONTAINERNAME}\":\"${port[${key}]}\"}\n"
fi
done
printf '\t ]\n'
printf '}\n'
}
case $1 in
docker)
docker
;;
*)
echo "Usage:`basename $0` {docker}"
;;
esac
把此文件存放到/usr/local/zabbix/bin里,然后给与755权限,并修改用户与组为zabbix,同时允许zabbix用户无密码运行docker
echo "zabbix ALL=(root) NOPASSWD:/bin/docker, /usr/local/zabbix/bin/zabbix_monitor_docker.py" >> /etc/sudoers
重启zabbix服务
ps -ef| grep zabbix| grep - v grep | awk '{print $2}' | xargs kill -9
/usr/local/zabbix/sbin/zabbix_agentd -c /usr/local/zabbix/conf/zabbix_agentd .conf
3、服务端部署
A、模板导入
把Template Docker Auto Discovery导入到zabbix里(模板在附件),具体操作不介绍。
B.主机关联模板
把需要监控docker容器的主机管理模板即可监控,默认是60秒后自动更新,如下图
由于在zabbix里监控docker只是为了查看方便,所以报警就没有做,有需求可以自己来修改。
本文出自 “吟—技术交流” 博客,请务必保留此出处http://dl528888.blog.51cto.com/2382721/1660844