JMX 6 的自动发现 objects

概述

可以对所有JMX MBean或MBean属性进行discover,或者指定用于发现这些objects的模式。

在发现规则配置中,理解MBean与MBean属性之间的区别是强制性的。MBean是一个object,它可以代表一个设备、一个应用程序或任何需要被管理的资源。

例如,存在一个代表Web服务器的MBean。它的属性包括连接数、线程数、请求超时、http file缓存、memory使用情况等。用通俗易懂的语言来表达,我们可以将一台咖啡机定义为一个MBean,它具有以下需要监控的属性:每杯水的用量、特定时间段内的平均用水量、每杯所需的咖啡豆数量、咖啡豆和水的补充时间等。

监控项键

发现规则 配置中,于类型字段选择JMX agent

JMX object发现支持两个监控项键 - jmx.discovery[] 和jmx.get[]:

监控项键
返回值 参数 说明
jmx.discovery[<discovery mode>,<object name>,<unique short description>]
该监控项返回包含描述MBean objects或其属性的LLD宏的JSON array。 发现模式 - 以下之一:attributes(检索JMX MBean属性,默认)或beans(检索JMX MBeans)
object名称 - 标识要检索的MBean名称的object名称模式(参见documentation)(默认为空,检索所有注册的beans)
唯一简短描述 - 允许在主机上使用相同发现模式和object名称的多个JMX 监控项的唯一描述(可选)
示例:
→ jmx.discovery - 检索所有JMX MBean属性
→ jmx.discovery[beans] - 检索所有JMX MBeans
→ jmx.discovery[attributes,"*:type=GarbageCollector,name=*"] - 检索所有垃圾收集器属性
→ jmx.discovery[beans,"*:type=GarbageCollector,name=*"] - 检索所有垃圾收集器

由于宏名称生成支持的字符有限(支持的字符可由以下正则表达式描述:A-Z0-9_\.),该监控项能返回的MBean属性存在一些限制。因此,例如要发现带有连字符或非ASCII字符的MBean属性,需要使用jmx.get[]
jmx.get[<discovery mode>,<object name>,<unique short description>]
该监控项返回包含MBean objects或其属性的JSON array。

jmx.discovery[]相比,它不定义LLD宏。
发现模式 - 以下之一:attributes(检索JMX MBean属性,默认)或beans(检索JMX MBeans)
object名称 - 标识要检索的MBean名称的object名称模式(参见documentation)(默认为空,检索所有注册的beans)
唯一简短描述 - 允许在主机上使用相同发现模式和object名称的多个JMX 监控项的唯一描述(可选)
使用此监控项时,需要定义自定义低级发现宏,指向使用JSONPath从返回的JSON中提取的值。

如果未传递参数,则会请求JMX中的所有MBean属性。不为JMX发现指定参数或尝试接收像*:type=*,name=*这样广泛范围的所有属性可能会导致潜在的性能问题。

使用jmx.discovery

该 监控项 返回一个 JSON object,其中包含用于描述 MBean objects 或属性的低级别自动发现宏。例如,在 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"
           }
       ]
支持的宏

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

描述
Discovery of MBean attributes
{#JMXVALUE} 属性值。
{#JMXTYPE} 属性类型。
{#JMXOBJ} object名称。
{#JMXDESC} 包含属性名称的object名称。
{#JMXATTR} 属性名称。
Discovery of MBeans
{#JMXDOMAIN} MBean域。(Zabbix保留名称
{#JMXOBJ} object名称。(Zabbix保留名称
{#JMX<key property>} MBean属性(例如{#JMXTYPE}、{#JMXNAME})(参见下面的限制)。
限制

通过 JMX 属性名称创建 LLD 宏时存在一些限制:

  • 属性名称会被转换为大写
  • 如果属性名称包含不支持的字符,则会被忽略(不会生成 LLD 宏)。LLD 宏名称支持的字符可以通过以下正则表达式描述: A-Z0-9_\.
  • 如果属性名称为 "obj" 或 "domain",则会被忽略,因为这些名称与 Zabbix 保留宏 {#JMXOBJ} 和 {#JMXDOMAIN} 的值冲突

请参考以下 jmx.discovery 示例(使用 "beans" 模式)。MBean 定义了以下属性(其中一些将被忽略;见下文):

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

JMX 自动发现完成后,将生成以下 LLD 宏:

  • {#JMXDOMAIN} - Zabbix 内部使用,用于描述 MBean 的 domain
  • {#JMXOBJ} - Zabbix 内部使用,用于描述 MBean object
  • {#JMXNAME} - 从 "name" 属性生成

被忽略的属性包括:

  • тип : 属性名称包含不支持的字符(非 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

此规则将返回3 objects:列中的Top行:MBean1, MBean2,MBean3。

有关objects的更多信息,请参阅支持的宏 表格,MBeans的发现部分。

发现规则配置收集MBeans(不包括属性) 如下所示:

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 属性

此规则将返回包含以下字段的 9 objects: MBean1Attribute1、MBean2Attribute1、 MBean3Attribute1、MBean1Attribute2、MBean2Attribute2、 MBean3Attribute2、 MBean1Attribute3、 MBean2Attribute3、 MBean3Attribute3。

有关 objects 的更多信息,请参阅 支持的宏 表中的 Discovery of MBean attributes 章节。

用于收集 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 object 属性转换为低级别自动发现宏名称,因此可以返回不受与LLD宏名称生成相关的限制(例如连字符或非ASCII字符)影响的值。

在使用 jmx.get[] 进行发现时,可以在发现规则配置的自定义 发现规则 选项卡中单独定义低级别自动发现宏,使用 JSONPath 指向所需的值。

发现 MBeans

发现 监控项: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
               }
           }
       ]