前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >zabbix自动发现监控docker中的容器

zabbix自动发现监控docker中的容器

作者头像
菲宇
发布2022-12-21 19:25:21
5180
发布2022-12-21 19:25:21
举报
文章被收录于专栏:菲宇菲宇

说明

第一种方案,借助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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-06-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器镜像服务
容器镜像服务(Tencent Container Registry,TCR)为您提供安全独享、高性能的容器镜像托管分发服务。您可同时在全球多个地域创建独享实例,以实现容器镜像的就近拉取,降低拉取时间,节约带宽成本。TCR 提供细颗粒度的权限管理及访问控制,保障您的数据安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档