zabbix企业应用之监控docker容器资源情况
關(guān)于docker的監(jiān)控,無論開源的CAdvisor、Data Dog還是我自己寫的監(jiān)控(http://dl528888.blog.51cto.com/2382721/1635951),不是通過docker的stats?api就是使用socket來進(jìn)行。
單獨(dú)看一個(gè)主機(jī)的監(jiān)控項(xiàng)還行,比如只查看容器test的cpu、內(nèi)存還是網(wǎng)絡(luò),但如果想批量查看的話,比如查看容器test1-test10的所有監(jiān)控項(xiàng)或者只是看cpu資源使用比較費(fèi)勁了,現(xiàn)在我使用zabbix通過docker stats api監(jiān)控容器資源,然后使用lld技術(shù)自動(dòng)監(jiān)控,使用zatree進(jìn)行批量展示監(jiān)控效果。
不說太多的廢話,直接看效果圖,滿足自己需求在繼續(xù)深入研究
一、效果圖
1、監(jiān)控容器cpu使用率
2、監(jiān)控容器內(nèi)存使用量
3、監(jiān)控容器網(wǎng)絡(luò)流量值
目前我監(jiān)控docker就監(jiān)控這些東西,至于其他的資源個(gè)人有需求可以自己寫。
下面是如何部署
二、部署
1、環(huán)境
我的zabbix是2.0.6,所以想使用我的模板,必須是2.0.x以上的zabbix版本;
docker使用1.6版本,如果想使用我的監(jiān)控,docker必須大于1.5;
需要安裝jq,如何安裝參考http://stedolan.github.io/jq/tutorial/
監(jiān)控客戶端里必須安裝docker的python 模塊
安裝的話,可以使用
easy_install?docker-py2、客戶端部署
A.在zabbix_agentd.conf最后添加以下內(nèi)容
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權(quán)限,并修改用戶與組為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.監(jiān)控內(nèi)容的json化
下面在是我的json監(jiān)控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"}] }腳本內(nèi)容如下:
[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權(quán)限,并修改用戶與組為zabbix,同時(shí)允許zabbix用戶無密碼運(yùn)行docker
echo?"zabbix?ALL=(root)?NOPASSWD:/bin/docker,?/usr/local/zabbix/bin/zabbix_monitor_docker.py">>/etc/sudoersD.重啟zabbix服務(wù)
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、服務(wù)端部署
A、模板導(dǎo)入
把Template Docker Auto Discovery導(dǎo)入到zabbix里(模板在附件),具體操作不介紹。
B.主機(jī)關(guān)聯(lián)模板
把需要監(jiān)控docker容器的主機(jī)管理模板即可監(jiān)控,默認(rèn)是60秒后自動(dòng)更新,如下圖
由于在zabbix里監(jiān)控docker只是為了查看方便,所以報(bào)警就沒有做,有需求可以自己來修改。
轉(zhuǎn)載于:https://blog.51cto.com/dl528888/1660844
總結(jié)
以上是生活随笔為你收集整理的zabbix企业应用之监控docker容器资源情况的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: PS如何对JPG文件直接抠图
- 下一篇: squid代理服务器(捎带的SNAT)
