这是原厂英文文档的翻译页面. 欢迎帮助我们 完善文档.
2022 Zabbix中国峰会
2022 Zabbix中国峰会

5 JMX对象的自动发现

概述

可以 自动发现 所有 JMX MBean或MBean属性,也可以为这些对象的自动发现指定一个样式。

有必要理解自动发现规则配置中的MBean和MBean属性之间的区别。MBean是一个对象,代表一个设备、一个应用程序或任何需要管理的资源。

例如,有一个MBean,用来表示一个web服务器。其属性有连接数、线程数、请求超时时间、HTTP文件缓存大小、内存使用率等。用通俗语言来类比一下,可以把一台咖啡机定义成一个MBean,有这些属性会被监控:每杯的水量、某段时间平均消耗水量、每杯所需咖啡豆数量、咖啡豆和水的重新装填时间等。

监控项的键

自动发现规则 配置中的 类型 区域选择 JMX agent

JMX对象自动发现有两个可用的键 - jmx.discovery[] 和 jmx.get[]:

监控项的键
返回值 参数 备注
jmx.discovery[<自动发现模式>,<对象名称>,<唯一简短描述>]
此监控项返回一个JSON数组,其中包含LLD宏,宏描述了MBean对象或对象的属性。 自动发现模式 - 任选其一: 属性 (获取 JMX MBean 属性, 默认设置) 或者 beans (获取 JMX MBean)
对象名称 - 对象名称样式 (参考 文档) 用于识别获取到的MBean名称 (默认为空, 获取所有已注册的bean)
唯一简短描述 - 一个唯一的描述字段,允许多个JMX监控项使用相同的自动发现模式和相同的主机对象名称(可选)
例子:
→ jmx.discovery - 获取所有JMX MBean属性
→ jmx.discovery[beans] - 获取所有JMX MBean
→ jmx.discovery[attributes,"*:type=GarbageCollector,name=*"] - 获取所有垃圾回收器属性
→ jmx.discovery[beans,"*:type=GarbageCollector,name=*"] - 获取所有垃圾回收器

此监控项能返回的MBean属性有一些 限制,取决于宏名称中的字符长度限制(支持的字符可使用这个正则表达式来表示: A-Z0-9_\.). 例如, 要想发现带有连字符或非ASCII字符的MBean属性,需要使用jmx.get[]

从Zabbix Java gateway 3.4开始支持此特性。
jmx.get[<自动发现模式>,<对象名称>,<唯一简短描述>]
此监控项返回一个JSON数组,包含MBean对象或对象的属性,与 jmx.discovery[] 相比,此监控项并不需要定义LLD宏。 自动发现模式 - 任选其一: 属性 (获取JMX MBean属性, 默认设置) 或 beans (获取JMX MBean)
对象名称 - 对象名称样式 (参考文档) 用于识别获取到的MBean名称(默认为空, 获取所有已注册的bean)
唯一简短描述 - 一个唯一的描述字段,允许多个JMX监控项使用相同的自动发现模式和相同的主机对象名称(可选)
一旦使用此监控项,需要自定义低级别自动发现宏,指向JSONPath返回的JSON数据。

从Zabbix Java gateway 4.4开始支持此特性。

如果不传递参数,则会向JMX请求所有的MBean属性。如果不指定JMX自动发现的参数,或者试图接收一个很大范围内的所有属性,比如 *:type=*,name=*,此两者可能会导致潜在的性能问题。

使用jmx.discovery

此监控项返回一个JSON对象,其中包含低级别自动发现的宏,用于描述MBean对象或对象的属性,比如MBean属性的自动发现(为了清晰重新排版):

[
           {
               "{#JMXVALUE}":"0",
               "{#JMXTYPE}":"java.lang.Long",
               "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,CollectionCount",
               "{#JMXATTR}":"CollectionCount"
           },
           {
               "{#JMXVALUE}":"0",
               "{#JMXTYPE}":"java.lang.Long",
               "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,CollectionTime",
               "{#JMXATTR}":"CollectionTime"
           },
           {
               "{#JMXVALUE}":"true",
               "{#JMXTYPE}":"java.lang.Boolean",
               "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,Valid",
               "{#JMXATTR}":"Valid"
           },
           {
               "{#JMXVALUE}":"PS Scavenge",
               "{#JMXTYPE}":"java.lang.String",
               "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,Name",
               "{#JMXATTR}":"Name"
           },
           {
               "{#JMXVALUE}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXTYPE}":"javax.management.ObjectName",
               "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,ObjectName",
               "{#JMXATTR}":"ObjectName"
           }
       ]

又比如MBean的自动发现 (为了清晰重新排版):

[
           {
               "{#JMXDOMAIN}":"java.lang",
               "{#JMXTYPE}":"GarbageCollector",
               "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXNAME}":"PS Scavenge"
           }
       ]
支持的宏

支持在自动发现规则的过滤器和监控项、触发器、图形的原型中使用下面的宏:

描述
MBean属性的自动发现
{#JMXVALUE} 属性的值。
{#JMXTYPE} 属性的类型。
{#JMXOBJ} 对象名称。
{#JMXDESC} 包含属性名称的对象名称。
{#JMXATTR} 属性名称。
MBean的自动发现
{#JMXDOMAIN} MBean的域。 (Zabbix的保留名称)
{#JMXOBJ} 对象名称。 (Zabbix的保留名称)
{#JMX<key property>} MBean属性 (类似 {#JMXTYPE}, {#JMXNAME}) (参考下面的限制)。
限制

从MBean属性的名称中创建LLD宏的名称时,有一些规则上的限制:

  • 属性名称被改为大写
  • 如果LLD宏名称中包含不支持的字符,则属性名称被忽略 (未生成LLD宏) 。支持的字符可用下面的正则表达式来表示: A-Z0-9_\.
  • 如果属性名称是 "obj" 或 "domain" 则会被忽略 因为这与预留的Zabbix属性 {#JMXOBJ} 和{#JMXDOMAIN}的值重叠(从 Zabbix 3.4.3起支持此特性。)

请思考这个 jmx.discovery (使用 "beans" 模式) 的例子。MBean 中定义了下面的属性:

name=test
       тип=Type
       attributes []=1,2,3
       Name=NameOfTheTest
       domAin=some

作为JMX自动发现的结果,会产生下面的LLD宏:

  • {#JMXDOMAIN} - Zabbix内部创建, 描述了MBean的域
  • {#JMXOBJ} - Zabbix内部创建, 描述了MBean对象
  • {#JMXNAME} - 从 "名称" 属性中创建

被忽略的属性有:

  • тип : 该名称包含不支持的字符 (非ASCII)
  • attributes[] : 该名称包含不支持的字符(不支持方括号)
  • Name: 已经定义过了 (name=test)
  • domAin: Zabbix的保留名称
示例

关于使用Mbean创建LLD规则,下面来看两个更具体的例子。要理解收集Mbean数据的LLD规则和收集Mbean属性数据的LLD规则之间的区别,请看下面的表格:

MBean1 MBean2 MBean3
MBean1Attribute1 MBean2Attribute1 MBean3Attribute1
MBean1Attribute2 MBean2Attribute2 MBean3Attribute2
MBean1Attribute3 MBean2Attribute3 MBean3Attribute3
例1: Mbean的自动发现

此规则会返回三个对象:该列的第一行: MBean1, MBean2, MBean3.

更多关于对象的信息请查阅 MBean的自动发现 小节中的支持的宏 表格。

收集Mbean数据(不包含属性)的自动发现规则配置如下:

lld_rule_mbean.png

这里使用的键:

jmx.discovery[beans,"*:type=GarbageCollector,name=*"]

所有的垃圾回收器都会被发现,但不包含它们的属性数据。由于垃圾回收器的属性集都是相同的,所以可以在监控项原型中使用属性,像下面这样:

lld_rule_mbean_prototypes.png

这里使用的键:

jmx[{#JMXOBJ},CollectionCount] 
       jmx[{#JMXOBJ},CollectionTime] 
       jmx[{#JMXOBJ},Valid] 

LLD自动发现规则会产生近似于下面的结果(两个垃圾回收器的监控项被发现):

discovery_rule_mbean_3.png

例2: Mbean属性的自动发现

此规则会返回下列九个对象: MBean1Attribute1, MBean2Attribute1, Mbean3Attribute1,MBean1Attribute2,MBean2Attribute2, Mbean3Attribute2, MBean1Attribute3, MBean2Attribute3, Mbean3Attribute3.

更多关于对象的信息请参考 Mbean属性的自动发现 小节中的支持的宏 表格。

收集Mbean属性数据的自动发现规则配置如下:

lld_rule_mbean_attr.png

这里使用的键:

jmx.discovery[attributes,"*:type=GarbageCollector,name=*"]

所有垃圾回收器连同其监控项的属性都会被发现。

lld_rule_mbean_attr_prototypes.png

在这个特定场景下,对于每个MBean属性,都会从原型中创建一个监控项。此配置的主要缺点是无法从触发器原型中创建触发器,因为只有一个监控项原型对应所有的属性。所以此配置可以用于数据采集,但不推荐用于自动监控。

使用jmx.get

jmx.get[]jmx.discovery[] 监控项很相似, 但此监控项不会把Java对象的属性转换成低级别自动监控的宏的名称。所以此监控项的返回值没有一些 限制 ,具体就是跟LLD宏的名称有关的限制,比如不能使用连字符或非ASCII字符的名称。

如果使用 jmx.get[] 做自动发现, 则可在自动发现规则的自定义LLD宏选项卡中分别对宏进行配置,使用JSONPath映射到所需的值上。

MBean的自动发现

自动发现的监控项: jmx.get[beans,"com.example:type=*,*"]

返回数据:

[
           {
               "object": "com.example:type=Hello,data-src=data-base,ключ=значение",
               "domain": "com.example",
               "properties": {
                   "data-src": "data-base",
                   "ключ": "значение",
                   "type": "Hello"
               }
           },
           {
               "object": "com.example:type=Atomic",
               "domain": "com.example",
               "properties": {
                   "type": "Atomic"
               }
           }
       ]
MBean属性的自动发现

自动发现监控项: jmx.get[attributes,"com.example:type=*,*"]

返回数据:

[
           {
               "object": "com.example:type=*",
               "domain": "com.example",
               "properties": {
                   "type": "Simple"
               }
           },
           {
               "object": "com.zabbix:type=yes,domain=zabbix.com,data-source=/dev/rand,ключ=значение,obj=true",
               "domain": "com.zabbix",
               "properties": {
                   "type": "Hello",
                   "domain": "com.example",
                   "data-source": "/dev/rand",
                   "ключ": "значение",
                   "obj": true
               }
           }
       ]