zabbix 监控docker

# 待办 

有两个问题没有解决,

一 zabbix模板自动发现复杂的过滤规则 ,自动发现的图形展示看不到,自动发现的item在 Applications 的聚集在host里面看不到。

二 grafana 里面类似于network自动发现图形展示那种,Variables :

$netif *.Network interfaces.*

  的写法,我并没有完全掌握。

-------------------------------------开始正题zabbix  监控docker:

监控脚本说明:
第一种方案,借助docker的python版的api,然后通过自己封装自定义脚本来做,稍微麻烦点,但是可以达到个人自定义的效果。
第二种借助已经封装好的模板来做,简单省事情,不过功能有限,更多功能还是需要自己开写脚本开发。
开始配置
安装模块docker-py
pip  install docker-py
具体用法参见:https://docker-py.readthedocs.io/en/stable/
下面开始写自动发现docker容器的脚本,以下操作是在zabbix_agent端进行的。也分两种,一种shell脚本一种python脚本
脚本放在一般放在这里/etc/zabbix/script(新建了一个script的目录)
# cat /etc/zabbix/script/docker_discovery.sh
#!/bin/bash
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
我用的第二种脚本:
#cat /etc/zabbix/script/docker_discovery.py

#!/usr/bin/env python
import os
import simplejson as json
t=os.popen("""sudo docker ps |grep -v 'CONTAINER ID'|awk {'print $NF'} """)
container_name = []
for container in  t.readlines():
         r = os.path.basename(container.strip())
         container_name += [{'{#CONTAINERNAME}':r}]
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/script/docker_minion.py    #这种写法比较具体
添加配置文件,配置文件放在/etc/zabbix/zabbix_agentd.d/里面,如下
#cat docker_discovery.conf
UserParameter=docker_discovery,python /etc/zabbix/script/docker_discovery.py
UserParameter=docker_discovery[*],python /etc/zabbix/script/docker_discovery.sh $1
测试:
[root@localhost zabbix_agentd.d]# zabbix_get -s 127.0.0.1 -k docker_discovery
{
    "data":[
        {
            "{#CONTAINERNAME}":"slave2"
        },
        {
            "{#CONTAINERNAME}":"slave1"
        },
        {
            "{#CONTAINERNAME}":"master"
        }
    ]
}
成功即可。
另外一个脚本,监控容器内的各个状态。如下:
#cat /etc/zabbix/script/docker_minion.py

#!/usr/bin/env python
import docker
import sys
import subprocess
import os
def check_container_stats(container_name,collect_item):
    #docker_client = docker_client.containers.get(container_name)
    container_collect=docker_client.containers.get(container_name).stats(stream=True)
    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_usage':
         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 == 'network_rx_bytes':
        result=new_result['networks']['eth0']['rx_bytes']
    elif collect_item == 'network_tx_bytes':
        result=new_result['networks']['eth0']['tx_bytes']
    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)
    return result
if __name__ == "__main__":
    docker_client = docker.DockerClient(base_url='unix://var/run/docker.sock', version='1.27')
    container_name=sys.argv[1]
    collect_item=sys.argv[2]
    print check_container_stats(container_name,collect_item)


赋予脚本权限:
chmod 757  docker_discovery.py
chmod 757  docker_minion.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
先测试一下:
[root@localhost zabbix_agentd.d]# zabbix_get -s 127.0.0.1 -k docker_status[master,cpu_percent]
1.4
这样代表成功。

制作模板:

最终结果

我制作的模板:https://github.com/fungitive/zabbix_template/blob/master/Template_Discovery_Docker.xml

参照文章:https://blog.csdn.net/yang00322/article/details/77895301

猜你喜欢

转载自blog.csdn.net/yuezhilangniao/article/details/112799013