zabbix监控docker容器状态【推荐】

前言:前段时间在部署zabbix,有个需求就是需要监控容器的状态 也就是cpu 内存 io的占用,于是就自己写了一个脚本,以及模板,在这里分享一下 嘿嘿 : )

废话我也就不多说,直接开始

首选,zabbix_agentd 配置  vim /usr/local/zabbix/etc/zabbix_agentd.conf

UserParameter=docker.discovery,/usr/local/zabbix/script/docker.py
UserParameter=docker.[*],/usr/local/zabbix/script/docker.py $1 $2

下面是docker.py 脚本,采用自动发现规则来发现容器,然后指定容器获取状态信息

#!/usr/bin/python
import sys
import os
import json
def discover():
 d = {}
 d['data'] = []
 with os.popen("docker ps -a --format {{.Names}}") as pipe:
  for line in pipe:
   info = {}
   info['{#CONTAINERNAME}'] = line.replace("\n","")
   d['data'].append(info)
 print json.dumps(d)
def status(name,action):
 if action == "ping":
  cmd = 'docker inspect --format="{{.State.Running}}" %s' %name
  result = os.popen(cmd).read().replace("\n","")
  if result == "true":
   print 1
  else:
   print 0
 else:
  cmd = 'docker stats %s --no-stream --format "{{.%s}}"' % (name,action)
  result = os.popen(cmd).read().replace("\n","")
  if "%" in result:
   print float(result.replace("%",""))
  else:
   print result
if __name__ == '__main__':
  try:
    name, action = sys.argv[1], sys.argv[2]
    status(name,action)
  except IndexError:
    discover()

这里说一下自动发现规则的坑。。。我被坑了好久才找出来.....一是必须返回json格式内容,二是 info['{#CONTAINERNAME}' ]  这个key一定要这么写{#CONTAINERNAME}......

返回结果如下,一定要是这样的层级关系....

{"data": [{"{#CONTAINERNAME}": "node-3"}, {"{#CONTAINERNAME}": "node-2"}, {"{#CONTAINERNAME}": "node-1"}, {"{#CONTAINERNAME}": "web"}, {"{#CONTAINERNAME}": "cadvisor"}, {"{#CONTAINERNAME}": "updatol"}, {"{#CONTAINERNAME}": "research"}, {"{#CONTAINERNAME}": "services"}, {"{#CONTAINERNAME}": "data"}, {"{#CONTAINERNAME}": "rabbitmq"}, {"{#CONTAINERNAME}": "redis"}, {"{#CONTAINERNAME}": "mysql"}, {"{#CONTAINERNAME}": "ssdb"}]}

另外那个函数的很简单了,就是调用docker 命令在获取数据的。

自动发现规则呢 也就是这样

只监控的这几个状态,以及还有一个触发器就是ping 来检测当前这个容器状态是否运行,如果不是就报警。

模板如下

<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
 <version>3.2</version>
 <date>2018-06-04T04:12:36Z</date>
 <groups>
  <group>
   <name>Templates</name>
  </group>
 </groups>
 <templates>
  <template>
   <template>docker-status</template>
   <name>docker-status</name>
   <description/>
   <groups>
    <group>
     <name>Templates</name>
    </group>
   </groups>
   <applications>
    <application>
     <name>docker_test</name>
    </application>
   </applications>
   <items/>
   <discovery_rules>
    <discovery_rule>
     <name>docker.discovery</name>
     <type>0</type>
     <snmp_community/>
     <snmp_oid/>
     <key>docker.discovery</key>
     <delay>60</delay>
     <status>0</status>
     <allowed_hosts/>
     <snmpv3_contextname/>
     <snmpv3_securityname/>
     <snmpv3_securitylevel>0</snmpv3_securitylevel>
     <snmpv3_authprotocol>0</snmpv3_authprotocol>
     <snmpv3_authpassphrase/>
     <snmpv3_privprotocol>0</snmpv3_privprotocol>
     <snmpv3_privpassphrase/>
     <delay_flex/>
     <params/>
     <ipmi_sensor/>
     <authtype>0</authtype>
     <username/>
     <password/>
     <publickey/>
     <privatekey/>
     <port/>
     <filter>
      <evaltype>0</evaltype>
      <formula/>
      <conditions>
       <condition>
        <macro>{#CONTAINERNAME}</macro>
        <value>@ CONTAINER NAME</value>
        <operator>8</operator>
        <formulaid>A</formulaid>
       </condition>
      </conditions>
     </filter>
     <lifetime>30</lifetime>
     <description/>
     <item_prototypes>
      <item_prototype>
       <name>Container {#CONTAINERNAME} Diskio usage:</name>
       <type>0</type>
       <snmp_community/>
       <multiplier>0</multiplier>
       <snmp_oid/>
       <key>docker.[{#CONTAINERNAME} ,BlockIO]</key>
       <delay>60</delay>
       <history>90</history>
       <trends>0</trends>
       <status>0</status>
       <value_type>1</value_type>
       <allowed_hosts/>
       <units/>
       <delta>0</delta>
       <snmpv3_contextname/>
       <snmpv3_securityname/>
       <snmpv3_securitylevel>0</snmpv3_securitylevel>
       <snmpv3_authprotocol>0</snmpv3_authprotocol>
       <snmpv3_authpassphrase/>
       <snmpv3_privprotocol>0</snmpv3_privprotocol>
       <snmpv3_privpassphrase/>
       <formula>1</formula>
       <delay_flex/>
       <params/>
       <ipmi_sensor/>
       <data_type>0</data_type>
       <authtype>0</authtype>
       <username/>
       <password/>
       <publickey/>
       <privatekey/>
       <port/>
       <description/>
       <inventory_link>0</inventory_link>
       <applications>
        <application>
         <name>docker_test</name>
        </application>
       </applications>
       <valuemap/>
       <logtimefmt/>
       <application_prototypes/>
      </item_prototype>
      <item_prototype>
       <name>Container{#CONTAINERNAME} CPU usage:</name>
       <type>0</type>
       <snmp_community/>
       <multiplier>0</multiplier>
       <snmp_oid/>
       <key>docker.[{#CONTAINERNAME},CPUPerc]</key>
       <delay>60</delay>
       <history>90</history>
       <trends>365</trends>
       <status>0</status>
       <value_type>0</value_type>
       <allowed_hosts/>
       <units>%</units>
       <delta>0</delta>
       <snmpv3_contextname/>
       <snmpv3_securityname/>
       <snmpv3_securitylevel>0</snmpv3_securitylevel>
       <snmpv3_authprotocol>0</snmpv3_authprotocol>
       <snmpv3_authpassphrase/>
       <snmpv3_privprotocol>0</snmpv3_privprotocol>
       <snmpv3_privpassphrase/>
       <formula>1</formula>
       <delay_flex/>
       <params/>
       <ipmi_sensor/>
       <data_type>0</data_type>
       <authtype>0</authtype>
       <username/>
       <password/>
       <publickey/>
       <privatekey/>
       <port/>
       <description/>
       <inventory_link>0</inventory_link>
       <applications>
        <application>
         <name>docker_test</name>
        </application>
       </applications>
       <valuemap/>
       <logtimefmt/>
       <application_prototypes/>
      </item_prototype>
      <item_prototype>
       <name>Container {#CONTAINERNAME} mem usage:</name>
       <type>0</type>
       <snmp_community/>
       <multiplier>0</multiplier>
       <snmp_oid/>
       <key>docker.[{#CONTAINERNAME},MemPerc]</key>
       <delay>60</delay>
       <history>90</history>
       <trends>365</trends>
       <status>0</status>
       <value_type>0</value_type>
       <allowed_hosts/>
       <units>%</units>
       <delta>0</delta>
       <snmpv3_contextname/>
       <snmpv3_securityname/>
       <snmpv3_securitylevel>0</snmpv3_securitylevel>
       <snmpv3_authprotocol>0</snmpv3_authprotocol>
       <snmpv3_authpassphrase/>
       <snmpv3_privprotocol>0</snmpv3_privprotocol>
       <snmpv3_privpassphrase/>
       <formula>1</formula>
       <delay_flex/>
       <params/>
       <ipmi_sensor/>
       <data_type>0</data_type>
       <authtype>0</authtype>
       <username/>
       <password/>
       <publickey/>
       <privatekey/>
       <port/>
       <description/>
       <inventory_link>0</inventory_link>
       <applications>
        <application>
         <name>docker_test</name>
        </application>
       </applications>
       <valuemap/>
       <logtimefmt/>
       <application_prototypes/>
      </item_prototype>
      <item_prototype>
       <name>Container {#CONTAINERNAME} NETio usage:</name>
       <type>0</type>
       <snmp_community/>
       <multiplier>0</multiplier>
       <snmp_oid/>
       <key>docker.[{#CONTAINERNAME},NetIO]</key>
       <delay>60</delay>
       <history>90</history>
       <trends>0</trends>
       <status>0</status>
       <value_type>1</value_type>
       <allowed_hosts/>
       <units/>
       <delta>0</delta>
       <snmpv3_contextname/>
       <snmpv3_securityname/>
       <snmpv3_securitylevel>0</snmpv3_securitylevel>
       <snmpv3_authprotocol>0</snmpv3_authprotocol>
       <snmpv3_authpassphrase/>
       <snmpv3_privprotocol>0</snmpv3_privprotocol>
       <snmpv3_privpassphrase/>
       <formula>1</formula>
       <delay_flex/>
       <params/>
       <ipmi_sensor/>
       <data_type>0</data_type>
       <authtype>0</authtype>
       <username/>
       <password/>
       <publickey/>
       <privatekey/>
       <port/>
       <description/>
       <inventory_link>0</inventory_link>
       <applications>
        <application>
         <name>docker_test</name>
        </application>
       </applications>
       <valuemap/>
       <logtimefmt/>
       <application_prototypes/>
      </item_prototype>
      <item_prototype>
       <name>Container{#CONTAINERNAME} is_run :</name>
       <type>0</type>
       <snmp_community/>
       <multiplier>0</multiplier>
       <snmp_oid/>
       <key>docker.[{#CONTAINERNAME} ,ping]</key>
       <delay>30</delay>
       <history>90</history>
       <trends>365</trends>
       <status>0</status>
       <value_type>3</value_type>
       <allowed_hosts/>
       <units/>
       <delta>0</delta>
       <snmpv3_contextname/>
       <snmpv3_securityname/>
       <snmpv3_securitylevel>0</snmpv3_securitylevel>
       <snmpv3_authprotocol>0</snmpv3_authprotocol>
       <snmpv3_authpassphrase/>
       <snmpv3_privprotocol>0</snmpv3_privprotocol>
       <snmpv3_privpassphrase/>
       <formula>1</formula>
       <delay_flex/>
       <params/>
       <ipmi_sensor/>
       <data_type>0</data_type>
       <authtype>0</authtype>
       <username/>
       <password/>
       <publickey/>
       <privatekey/>
       <port/>
       <description/>
       <inventory_link>0</inventory_link>
       <applications>
        <application>
         <name>docker_test</name>
        </application>
       </applications>
       <valuemap/>
       <logtimefmt/>
       <application_prototypes/>
      </item_prototype>
     </item_prototypes>
     <trigger_prototypes>
      <trigger_prototype>
       <expression>{docker-status:docker.[{#CONTAINERNAME} ,ping].last()}=0</expression>
       <recovery_mode>0</recovery_mode>
       <recovery_expression/>
       <name>docker_{#CONTAINERNAME}_down</name>
       <correlation_mode>0</correlation_mode>
       <correlation_tag/>
       <url/>
       <status>0</status>
       <priority>5</priority>
       <description/>
       <type>0</type>
       <manual_close>0</manual_close>
       <dependencies/>
       <tags/>
      </trigger_prototype>
     </trigger_prototypes>
     <graph_prototypes/>
     <host_prototypes/>
    </discovery_rule>
   </discovery_rules>
   <httptests/>
   <macros/>
   <templates/>
   <screens/>
  </template>
 </templates>
</zabbix_export>

修改Zabbix_agentd 配置,docker.py脚本放在指定路径下,不要忘了给权限,导入模板,能获取数据就没问题。获取不了的,可以zabbix_get 来调试 找到问题出在哪去解决。

总结

以上所述是小编给大家介绍的zabbix监控docker容器状态,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Zabbix监控Linux主机设置方法

    说明: Zabbix监控服务端已经配置完成,现在要使用Zabbix对Linux主机进行监控. 具体操作: 以下操作在被监控的Linux主机进行,这里以CentOS 6.x系统为例. 一.配置防火墙,开启10050.10051的TCP和UDP端口 vi /etc/sysconfig/iptables #编辑防火墙配置文件 -A INPUT -s 192.168.21.127 -m state --state NEW -m tcp -p tcp --dport 10050:10051 -j ACCE

  • 什么是zabbix(高度集成的监控集成方案)

    zabbix(音同 zæbix)是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案. zabbix能监视各种网络参数,保证服务器系统的安全运营:并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题. zabbix由2部分构成,zabbix server与可选组件zabbix agent. zabbix server可以通过SNMP,zabbix agent,ping,端口监视等方法提供对远程服务器/网络状态的监视,数据收集等功能,它可以运行在Linux,So

  • Zabbix监控交换机设置方法

    说明: Zabbix监控服务端已经配置完成,现在要使用Zabbix对交换机进行监控. 具体操作: 以下操作在被监控的交换机上进行,这里以Cisco交换机为例. 一.登录到Cisco交换机,开启snmp服务 注意:使用telnet或者仿真终端登录到交换机特权配置模式 enable #切换到特权模式 configure terminal #进入全局配置模式 snmp-server community public ro #打开交换机snmp服务,设置团体名称为public,只读 snmp-serve

  • 基于Docker安装与部署Zabbix

    今天测试了一天的Zabbix-Docker,部署起来确实方便,就需要在安装了Docker的linux系统中输入以下命令就可以了. 1.安装mysql数据库, 启动一个空的MySQL服务器实例 docker run –name zabbix-DB -t \      -e MYSQL_DATABASE="zabbix" \      -e MYSQL_USER="zabbix" \      -e MYSQL_PASSWORD="zabbix_pwd&quo

  • 使用zabbix监控mongodb的方法

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. Mongodb如今越来越火,要做好对mongodb的监控就需要从它的安装配置,到简单的command语句使用,再到对它运行机制以及状态获取方法的掌握. mongodb有三种基本的状态获取方式: 1.mongostat 2.开启28017的监听端口,curl

  • zabbix监控docker容器状态【推荐】

    前言:前段时间在部署zabbix,有个需求就是需要监控容器的状态 也就是cpu 内存 io的占用,于是就自己写了一个脚本,以及模板,在这里分享一下 嘿嘿 : ) 废话我也就不多说,直接开始 首选,zabbix_agentd 配置  vim /usr/local/zabbix/etc/zabbix_agentd.conf UserParameter=docker.discovery,/usr/local/zabbix/script/docker.py UserParameter=docker.[*

  • zabbix监控docker应用配置

    容器的应用越来越普遍了,但是大量的容器我们怎么进行管理呢?当然是监控起来! 今天这篇文章讲的就是使用zabbix监控docker容器! 关于zabbix监控的docker的原理: agent2监控docker就是通过调用docker的API来获取数据 插件目录存放于zabbix-agent2/src/go/plugins/docker client.go文件定义了 使用Unix套接字地址进行docker客户端与服务端的通信 默认套接字位置为/var/run/docker.sock 通过zabbi

  • python脚本监控docker容器

    本文实例为大家分享了python脚本监控docker容器的方法,供大家参考,具体内容如下 脚本功能: 1.监控CPU使用率 2.监控内存使用状况 3.监控网络流量 具体代码: #!/usr/bin/env python # --*-- coding:UTF-8 --*-- import sys import tab import re import os import time from docker import Client import commands keys_container_st

  • zabbix监控MySQL主从状态的方法详解

    搭建MySQL主从后,很多时候不知道从的状态是否ok,有时候出现异常不能及时知道,这里通过shell脚本结合zabbix实现监控并告警 一般情况下,在MySQL的从上查看从的运行状态是通过Slave_IO_Running线程和Slave_SQL_Running线程是否ok,通过命令"show slave status\G;"即可查看.所以这里根据这两个值进行判断. agent端脚本编写及配置 说明:所有zabbix相关的脚本我都放在了/etc/zabbix/script/ 目录里面,下

  • docker容器状态的转换实现

    一 docker容器状态转换图 二 实战 [root@localhost ~]# docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 3 Server Version: 17.09.0-ce Storage Driver: overlay Backing Filesystem: xfs Supports d_type: false Logging Driver: json-file Cgroup Driver: cg

  • docker容器状态转换管理命令实例详解

    目录 前言 一.从镜像启动容器 二.查看容器与日志 三.进入容器内部操作系统 四.停止容器暂停容器 五.启动stopped状态的容器 六.删除容器 七.export与import 八.commit 九.查看容器配置及资源使用情况 总结 前言 docker容器有三种状态运行.停止.暂停,镜像可以创建.运行容器,镜像和容器也可以转换成tar压缩包进行存储.本文为大家介绍容器的状态转换命令及镜像创建运行容器.tar包导入导出相关的命令及使用场景. 结合下文中的命令介绍来理解上面的这张图. 一.从镜像启

  • 如何监控docker容器运行状态 shell 脚本

    场景 公司项目部署在docker中,由于未知原因容器偶尔会停止,需要写一个脚本监控 容器运行状态,如果容器停止了,就再启动该容器 shell脚本 #!/bin/bash # 传入容器名称 containerName=$1 currTime=`date +"%Y-%m-%d %H:%M:%S"` # 查看进程是否存在 exist=`docker inspect --format '{{.State.Running}}' ${containerName}` if [ "${exi

  • golang实现对docker容器心跳监控功能

    自己写的go程序放到线上本来编译成二进制扔上去就行啦,但是怀着一颗docker的心,最终还是将它放到docker容器中运行起来了,运行起来也ok,一个最小容器64M,统一管理起来也方便,但是毕竟是个线上长驻内存的服务程序,万一跑挂了怎么办,如何才能监控它,直接上go代码,网上代码,略微做了下注释,但实测过,真实有效: package main import ( "encoding/json" "errors" "flag" "fmt&q

  • 详解Docker容器可视化监控中心搭建

    概述 一个宿主机上可以运行多个容器化应用,容器化应用运行于宿主机上,我们需要知道该容器的运行情况,包括 CPU使用率.内存占用.网络状况以及磁盘空间等等一系列信息,而且这些信息随时间变化,我们称其为时序数据,本文将实操 如何搭建一个可视化的监控中心 来收集这些承载着具体应用的容器的时序信息并可视化分析与展示! 动手了,动手了... 准备镜像 adviser:负责收集容器的随时间变化的数据 influxdb:负责存储时序数据 grafana:负责分析和展示时序数据 部署Influxdb服务 可以将

  • Docker容器监控及日志管理实现过程解析

    当Docker部署规模变大后,需要对容器进行监控,一般Docker自带几个监控子命令ps.top和stats,然后是现在流行的开源监控工具Prometheus Docker自带的监控子命令ps docker ps ,列出容器,方便查看当前的运行的容器,以下是命令语法与参数 语法 docker ps [OPTIONS] OPTIONS说明: -a :显示所有的容器,包括未运行的. -f :根据条件过滤显示的内容. --format :指定返回值的模板文件. -l :显示最近创建的容器. -n :列

随机推荐