zabbix企业应用之监控docker容器资源情况
關于docker的監控,無論開源的CAdvisor、Data Dog還是我自己寫的監控(http://dl528888.blog.51cto.com/2382721/1635951),不是通過docker的stats?api就是使用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_install?docker-py2、客戶端部署
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?$2B.把下面的腳本放到/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_namenetwork_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?KBresult=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_namenetwork_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)C.監控內容的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[@]}doif?[[?"${#port[@]}"?-gt?1?&&?"${key}"?-ne?"$((${#port[@]}-1))"?]];thenprintf?'\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"fidoneprintf?'\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/sudoersD.重啟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.conf3、服務端部署
A、模板導入
把Template Docker Auto Discovery導入到zabbix里(模板在附件),具體操作不介紹。
B.主機關聯模板
把需要監控docker容器的主機管理模板即可監控,默認是60秒后自動更新,如下圖
由于在zabbix里監控docker只是為了查看方便,所以報警就沒有做,有需求可以自己來修改。
轉載于:https://blog.51cto.com/dl528888/1660844
總結
以上是生活随笔為你收集整理的zabbix企业应用之监控docker容器资源情况的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PS如何对JPG文件直接抠图
- 下一篇: squid代理服务器(捎带的SNAT)