6 自动发现JMX对象

概述

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

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

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

监控项键值

发现规则配置中,在 Type 字段中选择 JMX agent

JMX 对象发现支持两个监控项键值:jmx.discovery[] 和 jmx.get[]:

监控项键值
返回值 参数 注释
jmx.discovery[<discovery mode>,<object name>,<unique short description>]
此监控项返回一个 JSON 数组,其中包含描述 MBean 对象或其属性的 LLD 宏。 discovery mode - 以下之一:attributes(获取 JMX MBean 属性,默认)或 beans(获取 JMX MBeans)
object name - 对象名称模式(参见documentation),用于标识要获取的 MBean 名称(默认为空,即获取所有已注册的 beans)
unique short description - 唯一描述,允许在主机上存在多个具有相同发现模式和对象名称的 JMX 监控项(可选)
示例:
→ jmx.discovery - 获取所有 JMX MBean 属性
→ jmx.discovery[beans] - 获取所有 JMX MBeans
→ jmx.discovery[attributes,"*:type=GarbageCollector,name=*"] - 获取所有垃圾回收器属性
→ jmx.discovery[beans,"*:type=GarbageCollector,name=*"] - 获取所有垃圾回收器

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

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

如果未传递任何参数,则会请求来自 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}的值重叠

请思考这个 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

此规则将返回 3 个对象:列的顶行: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 属性

此规则将返回 9 个对象,包含以下字段: 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
        }
    }
]