zabbix企业应用之监控docker容器资源情况
关于docker的监控,无论开源的CAdvisor、Data Dog还是我自己写的监控(http://dl528888.blog.51cto.com/2382721/1635951),不是通过docker的statsapi就是使用socket来进行。 单独看一个主机的监控项还行,比如只查看容器test的cpu、内存还是网络,但如果想批量查看的话,比如查看容器test1-test10的所有监控项或者只是看cpu资源使用比较费劲了,现在我使用zabbix通过docker stats api监控容器资源,然后使用lld技术自动监控,使用zatree进行批量展示监控效果。 不说太多的废话,直接看效果图,满足自己需求在继续深入研究 一、效果图 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_installdocker-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-8bin]#catzabbix_monitor_docker.py #!/usr/bin/envpython #-*-coding:utf-8-*- #author:DengLei #email:dl528888@gmail.com fromdockerimportClient importos importre importsys importsubprocess importtime defcheck_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() ifcollect_item=='cpu_total_usage': result=new_result['cpu_stats']['cpu_usage']['total_usage']-old_result['cpu_stats']['cpu_usage']['total_usage'] elifcollect_item=='cpu_system_uasge': result=new_result['cpu_stats']['system_cpu_usage']-old_result['cpu_stats']['system_cpu_usage'] elifcollect_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) elifcollect_item=='mem_usage': result=new_result['memory_stats']['usage'] elifcollect_item=='mem_limit': result=new_result['memory_stats']['limit'] elifcollect_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'] elifcollect_item=='network_rx_bytes': network_check_command="""dockerexec%sifconfigeth1|grepbytes|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')) #unitKB result=int(network_new_result['rx'])-int(network_old_result['rx']) elifcollect_item=='network_tx_bytes': network_check_command="""dockerexec%sifconfigeth1|grepbytes|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']) returnresult 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] printcheck_container_stats(container_name,collect_item) C.监控内容的json化 下面在是我的json监控docker容器的json展示 [root@ip-10-10-125-6~]#sh/usr/local/zabbix/bin/zabbix_low_discovery.shdocker { "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-6tmp]#catzabbix_low_discovery.sh #!/bin/bash #Fucation:zabbixlow-leveldiscovery docker(){ port=($(sudodockerps-a|grep-v"CONTAINERID"|awk'{print$NF}')) printf'{\n' printf'\t"data":[\n' forkeyin${!port[@]} do if[["${#port[@]}"-gt1&&"${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$1in docker) docker ;; *) echo"Usage:`basename$0`{docker}" ;; esac 把此文件存放到/usr/local/zabbix/bin里,然后给与755权限,并修改用户与组为zabbix,同时允许zabbix用户无密码运行docker echo"zabbixALL=(root)NOPASSWD:/bin/docker,/usr/local/zabbix/bin/zabbix_monitor_docker.py">>/etc/sudoers D.重启zabbix服务 ps-ef|grepzabbix|grep-vgrep|awk'{print$2}'|xargskill-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://down.51cto.com/data/2365800 本文转自 dl528888 51CTO博客,原文链接:http://blog.51cto.com/dl528888/1660844,如需转载请自行联系原作者