6 自动发现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[]
jmx.get[<自动发现模式>,<对象名称>,<唯一简短描述>]
此监控项返回一个JSON数组,包含MBean对象或对象的属性,与 jmx.discovery[] 相比,此监控项并不需要定义LLD宏。 自动发现模式 - 任选其一: 属性 (获取JMX MBean属性, 默认设置) 或 beans (获取JMX MBean)
对象名称 - 对象名称样式 (参考文档) 用于识别获取到的MBean名称(默认为空, 获取所有已注册的bean)
唯一简短描述 - 一个唯一的描述字段,允许多个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"
           }
       ]
       ```在发现 MBeans 时(为清晰起见重新格式化):
       
       ```json
       [
           {
               "{#JMXDOMAIN}":"java.lang",
               "{#JMXTYPE}":"GarbageCollector",
               "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXNAME}":"PS Scavenge"
           }
       ]
       
       ```请注意,监控项, object, objects, [
           {
               "{#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"
           }
       ], [
           {
               "{#JMXDOMAIN}":"java.lang",
               "{#JMXTYPE}":"GarbageCollector",
               "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
               "{#JMXNAME}":"PS Scavenge"
           }
       ]
        为占位符,代表特定的技术术语或代码示例,在实际文档中应替换为具体的内容。
       
       
       ##### 支持的宏
       
       支持在自动发现规则的[过滤器](/manual/discovery/low_level_discovery#过滤器)和监控项、触发器、图形的原型中使用下面的宏:
       
       |宏|描述|
       |-----|-----------|
       |自动发现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规则的实际示例。为了更好地理解收集MBeans的LLD规则与收集MBean属性的LLD规则之间的区别,请参阅下表:
       
       |     |     |     |
       |---|---|---|
       | **MBean1** | **MBean2** | **MBean3** |
       | MBean1Attribute1 | MBean2Attribute1 | MBean3Attribute1 |
       | MBean1Attribute2 | MBean2Attribute2 | MBean3Attribute2 |
       | MBean1Attribute3 | MBean2Attribute3 | MBean3Attribute3 |
       
       
       ##### 例1: 自动发现Mbean
       
       此规则会返回三个对象:该列的第一行: MBean1,MBean2, MBean3.
       
       更多关于对象的信息请查阅 *自动发现MBean* 小节中的[支持的宏](/manual/discovery/low_level_discovery/examples/jmx#支持的宏)
       表格。
       
       收集Mbean数据(不包含属性)的自动发现规则配置如下:
       
       ![lld\_rule\_mbean.png](../../../../../assets/en/manual/discovery/low_level_discovery/lld_rule_mbean.png)
       
       这里使用的键:
       
           jmx.discovery[beans,"*:type=GarbageCollector,name=*"]
       
       所有的垃圾回收器都会被发现,但不包含它们的属性数据。由于垃圾回收器的属性集都是相同的,所以可以在监控项原型中使用属性,像下面这样:
       
       ![lld\_rule\_mbean\_prototypes.png](../../../../../assets/en/manual/discovery/low_level_discovery/lld_rule_mbean_prototypes.png)
       
       这里使用的键:
       
           jmx[{#JMXOBJ},CollectionCount] 
           jmx[{#JMXOBJ},CollectionTime] 
           jmx[{#JMXOBJ},Valid] 
       
       LLD自动发现规则会产生近似于下面的结果(两个垃圾回收器的监控项被发现):
       
       ![discovery\_rule\_mbean\_3.png](../../../../../assets/en/manual/discovery/low_level_discovery/discovery_rule_mbean_3.png){width="600"}
       
       
       ##### 例2: 自动发现Mbean的属性
       
       此规则会返回下列九个对象:
       MBean1Attribute1, MBean2Attribute1,
       Mbean3Attribute1,MBean1Attribute2,MBean2Attribute2, Mbean3Attribute2,
       MBean1Attribute3, MBean2Attribute3, Mbean3Attribute3.
       
       更多关于对象的信息请参考 *自动发现Mbean的属性* 小节中的[支持的宏](/manual/discovery/low_level_discovery/examples/jmx#支持的宏)
       表格。
       
       收集Mbean属性数据的自动发现规则配置如下:
       
       ![lld\_rule\_mbean\_attr.png](../../../../../assets/en/manual/discovery/low_level_discovery/lld_rule_mbean_attr.png)
       
       这里使用的键:
       
           jmx.discovery[attributes,"*:type=GarbageCollector,name=*"]
       
       所有垃圾回收器连同其监控项的属性都会被发现。
       
       ![lld\_rule\_mbean\_attr\_prototypes.png](../../../../../assets/en/manual/discovery/low_level_discovery/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=*,*"]`
       
       返回数据:
       
       ``` {.json}
       [
           {
               "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
               }
           }
       ]