最近在搞zabbix监控docker以及docker内部应用状态信息,网上找的资料好少,只找到了一个大神的一篇文章,用的是python实现监控docker容器的基本状态,我在他给的脚本基础上进行修改,另外,增加了docker内部常用应用的状态监控,目前在测试环境上部署成功了,具体还需要在线上环境部署后才能检验出效果如何。

好了,根据惯例,废话讲完了,开始进入正题了。

首先,介绍下该监控套件有三个脚本,一个是自动发现主机上的docker容器脚本,另一个是用python写的获取每个docker容器的系统状态,包括CPU使用率,内存使用率以及网络资源使用率,最后这个脚本添加了一些我公司常用的应用的状态监控,包括应用占用内存,cpu资源以及进程的存活状态,至于读者们需要监控其他docker里面的应用,可以依照我的脚本来进行修改。

首先,需要编辑自动发现docker中容器个数的脚本,内容如下:

# cat /usr/local/zabbix/scripts/docker_low_discovery.sh
#!/bin/bash
#Fucation:docker 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[@]}doif [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];thenprintf '\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"fidoneprintf '\t ]\n'printf '}\n'
}
case $1 in
docker)
docker
;;
*)
echo "Usage:`basename $0` {docker}"
;;
esac

上面这个脚本是用来获取到docker里面应用的容器,并对其进行json化输出的,效果如下:

# sh /usr/local/zabbix/scripts/docker_low_discovery.sh docker
{
"data":[{
"{#CONTAINERNAME}":"hopeful_brown"},{
"{#CONTAINERNAME}":"happy_einstein"}]
}

这样就能被zabbix_server获取到了,然后是python脚本,使用python获取docker的参数需要使用一个扩展包,可以通过pip或者easy_install安装docker-py扩展:

pip install docker-py或者easy_install docker-py或者不想这样安装的话可以去python官网下载docker-py的安装包,解压后使用docker docker-py-1.4.0/setup.py install命令安装,扩展包我将会打包放在附件中。

下面是python脚本:
# cat /usr/local/zabbix/scripts/docker_monitor.py
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#author:Xianglin Hu
#email: a714585725@qq.com
from docker import Client
import sys
import subprocess
import osdef 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_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 == '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)elif collect_item == 'network_rx_bytes':network_check_command="""sudo /usr/bin/docker exec %s cat /proc/net/dev|sed -n 3p|awk '{print $2,$10}'"""%container_nameresult=os.popen(network_check_command).read().split()[0]elif collect_item == 'network_tx_bytes':network_check_command="""sudo /usr/bin/docker exec %s cat /proc/net/dev|sed -n 3p|awk '{print $2,$10}'"""%container_nameresult=os.popen(network_check_command).read().split()[1]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)

这里面使用到了docker里面的Client类,获取到某个docker容器的当前状态信息,然后进行运算,返回运算结果。但是容器当前信息那个dict中的network的key获取到的信息不准确,于是我使用了docker exec命令来获取docker容器内部的网络流量信息。这也是我在大神的基础上进行改进的地方,这里的改进将python脚本的执行时间缩短了,将有助于server获取duocker容器信息时减少长连接的数量,提升zabbix_server的性能。这里的docker exec命令将会在下一个脚本中大量使用来获取docker容器中的应用状态信息。

下面是获取容器应用状态信息的脚本:

# cat docker_processmonitor.sh
#!/bin/bash
#license:GPL
#mail:a714585725@qq.com
#date:2015.09.22
processmem(){sudo /usr/bin/docker exec $1 ps aux|grep $2|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$6}; END{print sum}'
}
processcpu(){sudo /usr/bin/docker exec $1 ps aux|grep $2|grep -v "grep"|grep -v "processstatus.sh"|awk '{sum+=$3}; END{print sum}'
}
processport(){sudo /usr/bin/docker exec $1 ss -antlp|grep $2|grep LISTEN|wc -l
}
case "$3" in
mem)
processmem $1 $2
;;
cpu)
processcpu $1 $2
;;
port)
processport $1 $2
;;
*)
echo "Usage: $0 {docker_containername}{processname}{mem|cpu|port}"
;;
esac

这个脚本其实没啥说的,从我以前写的那个脚本上面修改来的,使用了一个case来判断需要获取的docker容器的名称以及该容器中应用的状态信息,只不过这里获取docker容器状态信息使用的是docker exec命令来进行获取。另外这里面添加了对于应用是否存活的状态监测,那就是检测该应用是否侦听了网络端口,假如该应用侦听的网络端口个数为0的话,可以认为该应用存在异常。这些应用只是我公司使用比较多的应用,各位读者可以根据自己需求修改相应应用的监控。

由于docker是以root权限来启用的,而zabbix监控是使用zabbix用户来执行的,所以需要给予zabbix用户相应的权限,需要编辑visudo:

echo "zabbix ALL=(root) NOPASSWD:/bin/docker,/usr/bin/python,/usr/local/zabbix/scripts/docker_monitor.py,/usr/local/zabbix/scripts/docker_low_discovery.sh,/usr/local/zabbix/scripts/docker_processmonitor.sh">>/etc/sudoers

并且还需要注释掉这条记录:#Defaults    requiretty(PS:注意,这条记录是要求使用sudo命令时需要有终端界面,注释掉这一条之后就可以不需要终端执行sudo命令了。)

然后就是编辑zabbix_agentd.conf文件,添加下面几行:

# tail -3 /usr/local/zabbix/etc/zabbix_agentd.conf
UserParameter=docker_low_discovery[*],/bin/bash /usr/local/zabbix/scripts/docker_low_discovery.sh $1
UserParameter=docker_stats[*],sudo /usr/bin/python /usr/local/zabbix/scripts/docker_monitor.py $1 $2
UserParameter=docker_process[*],/bin/bash /usr/local/zabbix/scripts/docker_processmonitor.sh $1 $2  $3

保存配置并重启zabbix_agentd服务,然后修改脚本的属主属组以及权限:

chown zabbix.zabbix /usr/local/zabbix/scripts/*

chmod 755 /usr/local/zabbix/scripts/*

然后可以在zabbix_server端测试是否能够获取到相应的数据:

[root@test1 ~]# /usr/local/zabbix-2.4.4/bin/zabbix_get -s x.x.x.x -k"docker_low_discovery[docker]"
{
"data":[{
"{#CONTAINERNAME}":"hopeful_brown"},{
"{#CONTAINERNAME}":"happy_einstein"}]
}
[root@test1 ~]# /usr/local/zabbix-2.4.4/bin/zabbix_get -s x.x.x.x -k"docker_stats[happy_einstein,network_tx_bytes]"
9664252
[root@test1 ~]# /usr/local/zabbix-2.4.4/bin/zabbix_get -s x.x.x.x -k"docker_process[happy_einstein,nginx,port]"
2

这里的IP地址我就用x.x.x.x代替了,这里应该填写客户端的IP地址。如上所示,能够正确获取到agentd的数据以后,然后就需要在zabbix_server这边配置监控模版了,关于监控模版的配置我在之前的文章中提及了很多次,相信大家应该都不会陌生了,这回就不详细描述模板的建立了,稍后我会将模板打包一起上传至附件中,这个模板目前还是半成品,各位可以根据模板进行修改,可以根据你们的需求来做,下面,演示一下监控出来的效果(PS:只是在测试环境小规模的部署,项目还不错,于是没有做成筛选出来。)

上面这些显示的是监控的结果,各位也可以根据自己的需求来进行修改,总之一句话,zabbix可以做到任何你想做的监控,嘻嘻!!!

转载于:https://blog.51cto.com/xianglinhu/1697427

zabbix自动发现实现批量监控docker状态相关推荐

  1. zabbix—自动发现端口并监控

    自动批量检查agent开放的端口 PS:如果服务器上的应用都是固定的,不会随机产生的都可以使用自动发现端口来监控:  如果服务器会随机出现端口且每次启动程序都会改变,可以采用第二种方法,来监控指定的端 ...

  2. 基于docker安装部署Zabbix及使用,自动发现、日志监控报警及参照官方文档遇到的问题(图文)

    目录 一.相关原理 (1)概述 (2)Zabbix 功能 (3)Zabbix 概述 (4)zabbix监控架构详解 二.主要步骤 (一)工具/环境准备 (二)docker安装及测试 (三)docker ...

  3. 5 zabbix 添加host_运维监控实战篇,zabbix自动发现和自动注册图文详解

    一.介绍 自动发现 Zabbix自动发现就是为了解决批量监控而设计的功能之一,什么是自动发现呢,简单来说就是Zabbix Server端可以基于设定的规则,自动批量的去发现局域网若干服务器,并自动把服 ...

  4. zabbix 自动发现规则 触发器_运维监控实战篇,zabbix自动发现和自动注册图文详解...

    一.介绍 自动发现 Zabbix自动发现就是为了解决批量监控而设计的功能之一,什么是自动发现呢,简单来说就是Zabbix Server端可以基于设定的规则,自动批量的去发现局域网若干服务器,并自动把服 ...

  5. zabbix自动发现规则实现批量监控主机的TCP监听端口

    检查服务器所有监听端口和其对应的服务名称的脚本可以参考https://blog.zzyyxx.top/blog/post/gordy/acf57f04f9e1  现在准备加入zabbix自动发现规则并 ...

  6. zabbix自动发现oracle表空间并监控其使用率

    监控需求 Oracle表空间使用率实时监控,当表空间使用率达到95%时触发告警机制.Oracle表空间分为系统默认表空间和用户创建的表空间,而表空间又有自动扩展和非自动扩展两种类型,用户(DBA)在创 ...

  7. 利用zabbix自动发现监控mongo数据库

    但如果公司使用mongo的端口如果不一致的话,那建议使用zabbix的自动发现的功能,自动发现mongo监听的端口,并对它进行相关数据的收集. 先看一下效果图, 教你如何利用zabbix自动发现监控m ...

  8. ZABBIX自动发现Redis端口并监控

    转载来源 :ZABBIX自动发现Redis端口并监控 : https://mp.weixin.qq.com/s/UDeRYn6376MBzNyRt48aAw ZABBIX自动发现Redis端口并监控 ...

  9. zabbix自动发现并监控GPU

    配置zabbix监控模板(只需要在darshboard上操作一次) 创建监控模板 在配置->模板页面,选择创建模板: 如下填写: 模板名称:自定义,我们命名为gpu discovery 群组:放 ...

最新文章

  1. 技术图文:浅析 C# Dictionary实现原理
  2. 为什么LINUX不需要碎片整理
  3. hive常用参数配置设置
  4. matplotlib 横坐标少了一个点_刘洲成点赞说马苏拍戏少视频
  5. 使用 FTP 迁移 SQL Server 数据_迁移数据_快速入门(SQL Server)_云数据库 RDS 版-阿里云...
  6. java行业报告_2018年Java生态行业报告
  7. xdu1068暨2013陕西省赛C题题解
  8. 转专业有什么要求吗?
  9. 宝塔Linux面板公司,宝塔面板_宝塔Linux面板-九州数码,一站式云安全服务平台
  10. java oa系统消息推送_第三方系统向泛微OA系统推送消息
  11. 开源办公套件LibreOffice
  12. 【虚拟机装黑苹果(第三弹)】macOS安装镜像格式转换(dmg转iso,非UltraISO方法)
  13. python 单向链表逆序_python实现单链表反转(经典笔试题)
  14. 语音识别技术基础知识
  15. 安卓10不支持qmc解码_百度云不限速下载,超级简单!亲测可用,IOS/安卓/电脑全支持...
  16. 我的求学十年(00至10):从中学到大学,年少轻狂立大志
  17. Android 11 强制分区存储
  18. Wolfram Alpha推知识型计算引擎免费版
  19. Python webdriver.Chrome()的使用
  20. 【数据统计】— 数据分布、集中趋势、离散程度

热门文章

  1. python与excel结合-Python与Excel之间的交互
  2. 把ros2录制的bag包转换为ros1格式的bag包
  3. foxmail邮件加载失败重试_java retry(重试) spring retry, guava retrying 详解
  4. 题目1154:Jungle Roads
  5. 正则表达式基本语法元字符
  6. springmvc学习(小知识点整理)
  7. jmeter(十八)关联之XPath Extractor
  8. zend studio让编译器导入项目为utf-8如何设置
  9. [算法] 求环形数组中和值最大子段
  10. OpenCV中的CV_IMPL是什么意思?