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

无论开源的CAdvisor、Data Dog还是我自己写的监控(http://dl528888.blog.51cto.com/2382721/1635951),不是通过docker的stats api就是使用socket来进行。

不说太多的废话,直接看效果图,满足自己需求在继续深入研究

一、效果图

1、监控容器cpu使用率

zabbix企业应用之监控docker容器资源情况_客户端

2、监控容器内存使用量

zabbix企业应用之监控docker容器资源情况_客户端_02

3、监控容器网络流量值

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

目前我监控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: 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)



监控内容的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



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

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

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

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