zabbix企业应用之监控docker容器资源情况

原创作品,允许转载,转载时请务必以超链接形式标明文章  原始出处 、作者信息和本声明。否则将追究法律责任。 http://dl528888.blog.51cto.com/2382721/1660844

关于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使用率

wKioL1V5Mk7QAmIOAAenNU8dQQw000.jpg

2、监控容器内存使用量

wKioL1V5MpDy-blvAAfWApuzRjo509.jpg

3、监控容器网络流量值

wKiom1V5MSijfouLAAdnk6d8QrM900.jpg

目前我监控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 模块

安装的话,可以使用

1
easy_install docker-py

2、客户端部署

A.在zabbix_agentd.conf最后添加以下内容

1
2
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
[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)

C.监控内容的json化

下面在是我的json监控docker容器的json展示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[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" }
      ]
}

脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[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

1
echo  "zabbix ALL=(root) NOPASSWD:/bin/docker, /usr/local/zabbix/bin/zabbix_monitor_docker.py" >> /etc/sudoers

D.重启zabbix服务

1
2
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秒后自动更新,如下图

wKiom1V5NGWD9hryAAIwVd2uBjs619.jpg

由于在zabbix里监控docker只是为了查看方便,所以报警就没有做,有需求可以自己来修改。

本文出自 “吟—技术交流” 博客,请务必保留此出处http://dl528888.blog.51cto.com/2382721/1660844

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值