zoukankan      html  css  js  c++  java
  • zabbix上监控docker

    说明

    第一种方案,借助docker的python版的api,然后通过自己封装自定义脚本来做,稍微麻烦点,但是可以达到个人自定义的效果。

    第二种借助国外的一位大神已经封装好的模板来做,简单省事情,不过功能有限,更多功能还是需要自己开写脚本开发。

     开始配置

    废话不多说,搭建部分可以直接略过了,不知道的童鞋,可以参考我写的其他文章,有docker安装的,也有宿主机安装的,不过我建议宿主机安装吧,灵活,或者你自己写好dockerfile来做定制也不错。主要讲解配置。

    安装模块docker.py

    pip  install docker

    具体用法参见:https://docker-py.readthedocs.io/en/stable/

    我这里贴一下我自己的zabbix-server.conf .zabbix-agent.conf的配置文件

    zabbix-server.conf

    LogFile=/var/log/zabbix/zabbix_server.log
    LogFileSize=0
    DebugLevel=1
    PidFile=/var/run/zabbix/zabbix_server.pid
    DBHost=localhost
    DBName=zabbix
    DBUser=zabbix
    DBPassword=xxxxxxx
    Timeout=10
    AlertScriptsPath=/usr/lib/zabbix/alertscripts
    ExternalScripts=/usr/lib/zabbix/externalscripts
    FpingLocation=/usr/bin/fping
    Fping6Location=/usr/bin/fping6
    LogSlowQueries=3000

    zabbix_agentd.conf

    PidFile=/var/run/zabbix/zabbix_agentd.pid
    LogFile=/var/log/zabbix-agent/zabbix_agentd.log
    LogFileSize=0
    DebugLevel=2
    EnableRemoteCommands=1
    Server=x.x.x.x
    ServerActive=x.x.x.x:10051
    Hostname=zn-46
    BufferSize=1024
    Include=/etc/zabbix/zabbix_agentd.d/
    UnsafeUserParameters=1    #这个必须有,是开启自定义脚本

     下面开始写自动发现docker容器的脚本,以下操作是在zabbix_agent端进行的

    脚本放在一般放在这里/etc/zabbix/script  (新建了一个script的目录)

    docker_discovery.py

    1 #!/usr/bin/env python 
    2 import os
    3 import simplejson as json
    4 t=os.popen("""sudo docker ps |grep -v 'CONTAINER ID'|awk {'print $NF'} """)
    5 container_name = []
    6 for container in  t.readlines():
    7         r = os.path.basename(container.strip())
    8         container_name += [{'{#CONTAINERNAME}':r}]
    9 print json.dumps({'data':container_name},sort_keys=True,indent=4,separators=(',',':'))

    执行上面的脚本是需要先安装模块,赋予执行权限

    pip  install  simplejson
    chmod 757 docker_discovery.py
    chown zabbix:zabbix /etx/zabbix/script -R

    赋予zabbix权限,编辑/etc/sudoers,添加如下内容

    zabbix  ALL=(root)    NOPASSWD: ALL  #可能权限比较大
    
    或者
    zabbix  ALL=(root)    NOPASSWD:/usr/bin/docker,/usr/bin/python,/etc/zabbix/script/docker_discovery.py    #这种写法比较具体

    添加配置文件,配置文件放在/etc/zabbix/zabbix_agentd.d/里面,如下

    cat docker_discovery.conf 
    
    UserParameter=docker_discovery,python /etc/zabbix/script/docker_discovery.py

    以上完成之后可以测试了,在sever端测试如下。默认情况下ubuntu是没有在server端安装zabbix_get的。可以使用apt-get来安装,在server端执行

    apt-get  install  -y zabbix-get

    测试:

    [root@ubuntu ~]# zabbix_get -s 192.168.72.131 -k docker_discovery 
    {
        "data":[
            {
                "{#CONTAINERNAME}":"happy_banach"
            }
        ]
    }

    成功即可。

    另外一个脚本,监控容器内的各个状态,参考别人的脚本,修正了一下。脚本还是放在/etc/zabbix/script下面。如下:

     1 #!/usr/bin/env python
     2 import docker
     3 import sys
     4 import subprocess
     5 import os
     6 import json 
     7 def check_container_stats(container_name,collect_item):
     8     #docker_client = docker_client.containers.get(container_name)
     9     container_collect=docker_client.containers.get(container_name).stats(stream=True)
    10     old_result=json.loads(container_collect.next())
    11     new_result=json.loads(container_collect.next())
    12     container_collect.close()
    13     if collect_item == 'cpu_total_usage':
    14         result=new_result['cpu_stats']['cpu_usage']['total_usage'] - old_result['cpu_stats']['cpu_usage']['total_usage']
    15     elif collect_item == 'cpu_system_usage':
    16         result=new_result['cpu_stats']['system_cpu_usage'] - old_result['cpu_stats']['system_cpu_usage']
    17     elif collect_item == 'cpu_percent':
    18         cpu_total_usage=new_result['cpu_stats']['cpu_usage']['total_usage'] - old_result['cpu_stats']['cpu_usage']['total_usage']
    19         cpu_system_uasge=new_result['cpu_stats']['system_cpu_usage'] - old_result['cpu_stats']['system_cpu_usage']
    20         cpu_num=len(old_result['cpu_stats']['cpu_usage']['percpu_usage'])
    21         result=round((float(cpu_total_usage)/float(cpu_system_uasge))*cpu_num*100.0,2)
    22     elif collect_item == 'mem_usage':
    23         result=new_result['memory_stats']['usage']
    24     elif collect_item == 'mem_limit':
    25         result=new_result['memory_stats']['limit']
    26     elif collect_item == 'network_rx_bytes':
    27         result=new_result['networks']['eth0']['rx_bytes']
    28     elif collect_item == 'network_tx_bytes':
    29         result=new_result['networks']['eth0']['tx_bytes']
    30     elif collect_item == 'mem_percent':
    31         mem_usage=new_result['memory_stats']['usage']
    32         mem_limit=new_result['memory_stats']['limit']
    33         result=round(float(mem_usage)/float(mem_limit)*100.0,2)
    34     return result
    35 if __name__ == "__main__":
    36     docker_client = docker.DockerClient(base_url='unix://var/run/docker.sock', version='1.27')
    37     container_name=sys.argv[1]
    38     collect_item=sys.argv[2]
    39     print check_container_stats(container_name,collect_item)

    赋予脚本权限:

    chmod 757  docker_discovery.py

    添加配置文件,配置文件放在/etc/zabbix/zabbix_agentd.d/里面,如下

    cat docker_status.conf 
    UserParameter=docker_status[*],sudo /usr/bin/python /etc/zabbix/script/docker_monitor.py $1 $2

    在server端测试:

    zabbix_get -s 10.6.28.28 -k docker_status[mscrm-jenkins,cpu_total_usage]
    
    1004562

    成功。

    现在开始在web端配置,制作自己的模板

    简要说下:

    Configuration------》Templates--------》create  template

     找到创建的模板点击discovery

     点击进来之后

    点击创建发现规则,填写如下

    filter部分

    保存即可,这样自动发现就完成了。

    现在添加item

    返回刚才页面,点解item

     点击创建

    以其中一个来说,其他相同

     完成之后,最后添加graph即可。不在描述。

    下面贴出几张出的图

     总体来说效果还不错。

     第二种方法,借助国外大神的模板,无需写脚本,脚本已经封装到模块

    需要在zabbix-agent端安装扩展模块zabbix_module_docker.so,安装方法很简单,如下,在zabbix_agent.conf文件里面加上即可

    首先下载模块 不同版本在这里https://github.com/monitoringartist/zabbix-docker-monitoring

    wget  xxxxx

    加入配置文件即可

    LoadModulePath=/etc/zabbix/modules    #自定义
    LoadModule=zabbix_module_docker.so

    重启agent服务

    然后模板在web端导入,然后将模板加入监控主机

    在server端测试

    在web端看看导入模板的key是什么

     测试:

    [root@ubuntu ~]# zabbix_get -s 192.168.72.131 -k docker.discovery
    {"data":[{"{#FCONTAINERID}":"ef5937dd46c5a27f23bbca2e9b773219df66ef33db9a5618618c4f64eeadf17d","{#SCONTAINERID}":"ef5937dd46c5","{#SYSTEM.HOSTNAME}":"ubuntu","{#HCONTAINERID}":"happy_banach"}]}

    成功

    如实没有效果,那我么需要手动去编译模块

     1 # Required CentOS/RHEL apps:   yum install -y wget autoconf automake gcc svn pcre-devel
     2 # Required Debian/Ubuntu apps: apt-get install -y wget autoconf automake gcc subversion make pkg-config libpcre3-dev
     3 # Required Fedora apps:        dnf install -y wget autoconf automake gcc subversion make pcre-devel
     4 # Required openSUSE apps:      zypper install -y wget autoconf automake gcc subversion make pkg-config pcre-devel
     5 # Required Gentoo apps 1:      emerge net-misc/wget sys-devel/autoconf sys-devel/automake sys-devel/gcc
     6 # Required Gentoo apps 2:      emerge dev-vcs/subversion sys-devel/make dev-util/pkgconfig dev-libs/libpcre
     7 # Source, use your version:    svn export svn://svn.zabbix.com/tags/3.2.7 /usr/src/zabbix
     8 cd /usr/src/zabbix
     9 ./bootstrap.sh
    10 ./configure --enable-agent
    11 mkdir src/modules/zabbix_module_docker
    12 cd src/modules/zabbix_module_docker
    13 wget https://raw.githubusercontent.com/monitoringartist/zabbix-docker-monitoring/master/src/modules/zabbix_module_docker/zabbix_module_docker.c
    14 wget https://raw.githubusercontent.com/monitoringartist/zabbix-docker-monitoring/master/src/modules/zabbix_module_docker/Makefile
    15 make
    View Code

    如果顺利的话,很快就出图了

    具体参考:https://github.com/monitoringartist/zabbix-docker-monitoring   (大神的)

    https://segmentfault.com/a/1190000007568413

    http://xianglinhu.blog.51cto.com/5787032/1697427

  • 相关阅读:
    从零开始学android开发-setBackgroundDrawable与setBackgroundResource的区别
    从零开始学android开发-用Intent启动Activity的方法
    从零开始学android开发-View的setOnClickListener的添加方法
    从零开始学android开发- 应用程序窗体显示状态操作requestWindowFeature
    从零开始学android开发- layout属性介绍
    android常见错误--Unable to resolve target ‘android
    Html+jquery mobile
    用jQuery Mobile做HTML5移动应用的三个优缺点
    Chrome Apps将可以打包成iOS或Android应用
    [转]0.python:scikit-learn基本用法
  • 原文地址:https://www.cnblogs.com/Dicky-Zhang/p/7489366.html
Copyright © 2011-2022 走看看