Zabbix自动发现是通过(1)网络扫描或(2)代理主动发现实现监控。本文主要介绍网络扫描的发现方式,并深入介绍底层监控项的主动发现功能。

网络发现(Discovery)

对于网络发现最需要理解的就是工作流程,不然觉得这个发现功能很奇怪,理解之后,就觉得这个设计很合理了。而且使用起来也很正常,而大部分文章只是讲解了如何使用,官方文件简单的提到了工作流程,不小心很容易忽略。
参考文档: https://www.zabbix.com/documentation/4.0/manual/discovery/network_discovery

自动发现主要是希望通过发现网络中的主机,并自动把主机添加到监控中,并关联特定的模板,实现自动监控。例如在办公网络中,希望通过Zabbix Agent监控所有工作电脑,只需要把新安装的电脑开放防火墙10050端口,那么电脑就可以自动通过发现新机器,并开始监控。如果网络中可能存在Windows和Linux系统,就需要通过Zabbix Agent判断自动添加的主机是Windows还是Linux。
以上这个过程需要分为两个步骤:

  1. 通过网络扫描制定的服务,本例为Zabbix Agent是否可以访问system.uname指标
  2. 发现主机之后需要执行添加的动作,这个过程由动作(Action)完成

下图为配置扫描是的方法:


扫描到网端内存在新机器时,就会出现在监控(Monitoring)->发现(Discovery)中:

如果希望把新发现的机器添加到Zabbix监控范围,就需要通过动作来实现主机添加,模板关联了。如下图所示,在配置(Configuration)->动作(Action),选择事件源为发现(Discovery)。通过创建一个新动作,配置好条件和动作实现自动添加主机功能。

工作流程如下:

如图,如果网络中有新的机器加入,Zabbix Server扫描到了该机器的代理服务,并且满足动作的条件,则会执行添加主机的动作,并自动关联模板。如果需要分别添加Windows和Linux主机,则需要分别创建两个规则,并通过Zabbix主机发现制定的检查值(本例为system.uname指标)判断是否包含windows或者linux字样来判断是否采用特定的规则。

底层自动发现(Low Level Discovery)

什么叫底层发现?底层发现是相对与网络发现的,这里翻译为“底层”有点儿不好理解,“低级别”的发现也不是很合理,最好的理解是:发现监控项,相对于添加主机而言,监控项是位于主机之下的,所以有“底层发现”之说。底层发现主要是发现监控主机的监控项,并自动进行监控的一个功能。主要可以实现自动添加监控项,添加触发器,添加图,也可以添加另外的主机。通过底层发现规则自动添加的规则叫做原型。
参考文档:https://www.zabbix.com/documentation/4.0/manual/discovery/low_level_discovery
底层发现执行需要在特定的主机之上才可以执行,而且只能通过模板来添加(添加多项,就是复制操作,需要原型来定义)。他的工作原理如下:

  1. 通过采集主机的特定指标,获得一个JSON对象
  2. 解析JSON对象,匹配原型,获得需要执行的添加项的具体内容
  3. 检查该模型是否已经添加,有则结束
  4. 添加具体的内容,如果有多项,则添加多项(监控项,触发器,图,其他主机)

下面以监控Java进程的内存使用情况为例,分析如何实现自动发现机器上运行的Java进程,并主动监控Java进程的内存使用情况,本例仅实现监控进程的内存回收时间和执行回收的次数。
监控Java进程在JDK中有一个jps工具,可以监控Java的进程名称和进程号,例如执行如下命令:

[root@upass-server scripts]# jps -l
1760 upaas-config-server-1.1.0.jar
1906 content-uauth-client-1.1-SNAPSHOT.jar
1735 upaas-eureka-server-1.1.0.jar
1831 content-uauth-service-1.1-SNAPSHOT.jar
4360 org.apache.catalina.startup.Bootstrap
22670 sun.tools.jps.Jps

例如上面系统运行了Tomcat服务和Spring Cloud的几个微服务,希望通过进程IP获得每一个进程的内存回收数据。这可以通过jstat获得。

[root@upass-server scripts]# jstat -gc 1760S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
1536.0 6656.0 1184.0  0.0   158720.0 14280.5   70144.0    29983.1   60888.0 57833.7 7936.0 7439.1     36   53.392   3      0.318   53.711

具体指令参考:https://blog.csdn.net/wayne_2015/article/details/71159813
要实现自动发现Java进程,需要通过一个脚本实现发现,并配置到Zabbix Agent中。
发现脚本:zbx_java_discovery.sh

#!/bin/bash
javaProcessList=`sudo $JAVA_HOME/bin/jps -l | grep -v Jps | grep -v Jstat | awk '{print $1"#"$2}' | grep "^[0-9]*#[a-zA-Z].*" `
echo "{\"data\":["
first=1
for javaProcess in $javaProcessList;
doIFS='#' read -r -a items <<< "$javaProcess";if [ $first == 1 ]; thenecho "{\"{#JAVAPSNAME}\":\"${items[1]}\",\"{#JAVAPSPID}\":\"${items[0]}\"}";first=0elseecho ",{\"{#JAVAPSNAME}\":\"${items[1]}\",\"{#JAVAPSPID}\":\"${items[0]}\"}";fi
done;echo "]}";

检查Java进程内存回收的脚本: zbx_java_stat.sh

#!/bin/sh#jstat -gc $PID
# S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
#512.0  512.0   0.0    0.0    4416.0   1982.6   10944.0      0.0     4480.0 866.8  384.0   73.9       0    0.000   0      0.000    0.000
if [ 'YGC' == $2 ]; thenpos=13
elif [ 'YGCT' = $2 ]; thenpos=14
elif [ 'FGC' == $2 ]; thenpos=15
elif [ 'FGCT' == $2 ]; thenpos=16
elif [ 'GCT' == $2 ]; thenpos=17
elsepos=0
fi
sudo $JAVA_HOME/bin/jstat -gc $1 | grep -v YGC | awk -v p=$pos '{print $p}'

把上面两个脚本添加到Zabbx agent UserParameter中:

### Option: UserParameter
#   User-defined parameter to monitor. There can be several user-defined parameters.
#   Format: UserParameter=<key>,<shell command>
#   See 'zabbix_agentd' directory for examples.
#
# Mandatory: no
# Default:
# UserParameter=
UserParameter=javaps,/etc/zabbix/scripts/zbx_java_discovery.sh
UserParameter=javastat[*],/etc/zabbix/scripts/zbx_java_stat.sh $1 $2

这样就可以通过Zabbix Agent调用脚本了。
例如,调用javaps查看java进程信息:

[zabbix@upass-server ~]$ /etc/zabbix/sbin/zabbix_agentd -c /etc/zabbix/conf/zabbix_agentd.conf -t javaps
javaps                                        [t|{"data":[
{"{#JAVAPSNAME}":"upaas-config-server-1.1.0.jar","{#JAVAPSPID}":"1760"}
,{"{#JAVAPSNAME}":"content-uauth-client-1.1-SNAPSHOT.jar","{#JAVAPSPID}":"1906"}
,{"{#JAVAPSNAME}":"upaas-eureka-server-1.1.0.jar","{#JAVAPSPID}":"1735"}
,{"{#JAVAPSNAME}":"content-uauth-service-1.1-SNAPSHOT.jar","{#JAVAPSPID}":"1831"}
,{"{#JAVAPSNAME}":"org.apache.catalina.startup.Bootstrap","{#JAVAPSPID}":"4360"}
]}]

就可以输出底层发现要求的JSON格式了。
调用javastat就可以获得特定进程的内存回收状态了,格式为javastat[PID|YGC|YGCT|FGC|
FGCT|GCT]

[zabbix@upass-server ~]$ /etc/zabbix/sbin/zabbix_agentd -c /etc/zabbix/conf/zabbix_agentd.conf -t javastat[1760,YGC]
javastat[1760,YGC]                            [t|36]

这里需要注意:

  1. Zabbix Agent要求用非Root用户运行,如果java进程用其他用户,或者root用户运行,可能jps无法查询,所以需要配置zabbix用户的sudo,请参考:https://blog.csdn.net/huangzhijie3918/article/details/51345178
  2. Zabbix Agent测试时要注意,如果不是确实配置文件位置,那么需要在执行命令时制定配置文件,才可以正确执行。

通过以上工作,zabbix agent就可以实现java进程的内存回收监控了,下面在Zabbix Server上实现自动发现监控。
流程如下:

  1. 创建一个监控的模板
  2. 在该模板上添加一个自动发现规则
  3. 在新添加的规则上添加监控项原型(prototype)
  4. 把新模板关联到部署好的主机(也可以添加到上一节中自动发现规则的自动添加模板中)

下面图示配置内容:
添加一个模板,并关联一个模板组:

在模板中添加底层自动发现(Low Level Discovery),实现自定义的java内存监控,这里需要选择采用zabbix agent,并输入关键字(key)为前面编写的javaps命令,该命令执行zbx_java_discovery.sh脚本,获得当前进程列表的JSON数据。

在通过底层自动发现模板,添加监控项(Item)模板,实现自动监控当前运行的有效Java进程。

一共添加了5个监控项,分别获取Java年轻代内存回收次数,时间,全内存回收(FGC)次数和时间,内存回收总耗时。
经过Zabbix自动发现后,就会自动添加监控项,并开始监控,如果存在错误,会有告警提示。

注意:
如果在调试过程中发现不对劲的地方,可以通过调高日志级别,获取更多的日志信息,有助于解决问题。
下面指令调高服务器日志级别:
zabbix_server -c /usr/local/etc/zabbix_server.conf -R log_level_increase
具体文档参考:
https://www.zabbix.com/documentation/4.0/manual/concepts/server

Zabbix的自动发现相关推荐

  1. zabbix通过自动发现功能实现自动识别网络设备接口

    可是现在公司上线了一大批网络设备,如果要每个网络设备都做模板,添加item......那就该废了,于是迫于压力今天来测试使用zabbix的自动发现功能实现自动发现网络设备接口,并且自动获取接口的流量值 ...

  2. Zabbix通过自动发现监控端口

    安装环境 Zabbix server和agent通过编译方式安装在服务器192.168.25.106上.Zabbix server/agent的安装目录为:/usr/local/zabbix. 创建脚 ...

  3. zabbix无法自动发现并监测华为AR路由器设备温度的解决办法

    使用zabbix的Template Net Huawei VRP SNMPv2模板(zabbix6.2的华为监测模板为Huawei VRP SNMP)监测华为交换机和路由器的状态,在使用中发现自动发现 ...

  4. zabbix 监控项自动发现过滤_通过Zabbix的自动发现(规则)自动创建监控项

    下图是一个已配置并启用的自动发现规则: 应用到165.194这个主机后,自动发现的监控项: 服务端配置创建Template 创建Discovery rule 键值readPorts跟被监控端配置的参数 ...

  5. Zabbix 神器——自动发现

    1.添加搜索范围: 系统配置--自动发现--Create discovery rule 名称:就是一个规则的名字而已 IP地址段:就是这个规则搜索的IP段 Delay:搜索间隔,就是隔多久搜索一次 C ...

  6. zabbix怎么显示服务器流量,用zabbix的自动发现来获取交换机路由器等接口流量信息...

    前言 笔者之前一直用zabbix监控服务器的各项状态,最近老板交待一项新工作,监控类似交换机.路由器之类的网络设备的接口流量.老板的要求就是职工的需求,立即开始监控准备工作.为了统一管理,决定还是使用 ...

  7. zabbix snmp 自动发现、自定义自动发现规则和监控项原型实现原理

    自动发现(LLD)提供了一种在计算机上为不同实体自动创建监控项,触发器和图形的方法. 例如,Zabbix可以在你的机器上自动开始监控文件系统或网络接口,而无需为每个文件系统或网络接口手动创建监控项:还 ...

  8. zabbix低级自动发现(DDL)

    文章目录 一.简介 1.什么叫低级自动发现DDL? 2.实现原理及其流程 二.获取变量名称 1.设置获取变量名脚本 2.添加监控key 3.添加自动发现规则 三.添加监控项 1.添加监控项 2.设置监 ...

  9. zabbix使用自动发现添加主机

    1.配置--自动发现--创建发现规则 2.配置发现的IP范围及选择是通过ICMP ping来发现主机 3.配置--动作--事件源选择自动发现--创建动作 4.触发条件选择自动发现检查=ICMP pin ...

最新文章

  1. matlab中阈值计算方法,三种阈值计算方法在MatLab6.5中的实现
  2. IntelliJ IDEA中使用综合使用Maven和Struts2
  3. VS2017 安装,建议大家都看一下这个在卸载,真人真事,防止扑街
  4. IO流——流的分类、InputStream、OutputStream、Reader、Writer等
  5. 程序员面试金典 - 面试题 16.26. 计算器(栈)
  6. 新氧科技成为互联网医疗美容第一股 首日股价疯狂上涨32%
  7. 【会话推荐】ICDM论文:探索跨会话信息感知的推荐模型
  8. Jni C 与 Java 互调
  9. jquery基本过滤选择器(jquery筛选选择器)
  10. 简单比较init-method,afterPropertiesSet和BeanPostProcessor
  11. selenium弹窗无法定位_4.3 通过selenium 模拟浏览器抓取
  12. android基于xposed框架,学习笔记:Android Xposed 框架入门
  13. 首次参加齐鲁软件设计大赛经验(及总结出的划水要点)
  14. 是非人生 — 一个菜鸟程序员的5年职场路 第7节
  15. linux shell 安装curl,bash – 不能使用curl安装NPM
  16. 优雅!用了这两款插件,我成了整个公司代码写得最规范的码农
  17. 简易个人网站的搭建--基础准备工作(一)
  18. 机器人瓦力有什么西方的风格_机器人瓦力观后感 英文
  19. Python绘图-怎么获取某个值在色带中对应的颜色
  20. 如何打开虚拟机服务器,虚拟机怎么打开ssh服务器

热门文章

  1. matlab 3维投影,matlab - 如何计算3维投影的面积? - 堆栈内存溢出
  2. 徐汉彬:Web系统大规模并发——电商秒杀与抢购
  3. 求求你!别再考秒杀系统了!看完这篇怼回去 ~
  4. php 实现邮件定时发送,php定时发送邮件解决方案
  5. vue密码正则验证表单验证_如何在Vue中使用表单验证
  6. android cmwap 切换 cmnet,Android上关于cmwap/cmnet网络切换的疑惑?
  7. 高新技术企业申请,申请高新技术企业需要什么材料
  8. 第五章预习导图部署远程访问服务
  9. 投屏镜像工具玩手机游戏的优势
  10. 测试手机速度的软件叫什么,手机测网速哪个软件好? 精确测速软件推荐