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

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 模块

安装的话,可以使用

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: [email protected]
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展示

[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

D.重启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秒后自动更新,如下图

wKiom1V5NGWD9hryAAIwVd2uBjs619.jpg

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

你可能感兴趣的:(Monitor,docker,docker,docker,zabbix,zabbix,zabbix,zabbix,container,lld,zabbix监控docker)