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对象,其中包含低级别自动发现的宏,用于描述MBean对象或对象的属性,比如MBean属性的自动发现(为了清晰重新格式化):

  1. [
  2. {
  3. "{#JMXVALUE}":"0",
  4. "{#JMXTYPE}":"java.lang.Long",
  5. "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
  6. "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,CollectionCount",
  7. "{#JMXATTR}":"CollectionCount"
  8. },
  9. {
  10. "{#JMXVALUE}":"0",
  11. "{#JMXTYPE}":"java.lang.Long",
  12. "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
  13. "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,CollectionTime",
  14. "{#JMXATTR}":"CollectionTime"
  15. },
  16. {
  17. "{#JMXVALUE}":"true",
  18. "{#JMXTYPE}":"java.lang.Boolean",
  19. "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
  20. "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,Valid",
  21. "{#JMXATTR}":"Valid"
  22. },
  23. {
  24. "{#JMXVALUE}":"PS Scavenge",
  25. "{#JMXTYPE}":"java.lang.String",
  26. "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
  27. "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,Name",
  28. "{#JMXATTR}":"Name"
  29. },
  30. {
  31. "{#JMXVALUE}":"java.lang:type=GarbageCollector,name=PS Scavenge",
  32. "{#JMXTYPE}":"javax.management.ObjectName",
  33. "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
  34. "{#JMXDESC}":"java.lang:type=GarbageCollector,name=PS Scavenge,ObjectName",
  35. "{#JMXATTR}":"ObjectName"
  36. }
  37. ]

又比如MBean的自动发现 (为了清晰重新格式化):

  1. [
  2. {
  3. "{#JMXDOMAIN}":"java.lang",
  4. "{#JMXTYPE}":"GarbageCollector",
  5. "{#JMXOBJ}":"java.lang:type=GarbageCollector,name=PS Scavenge",
  6. "{#JMXNAME}":"PS Scavenge"
  7. }
  8. ]
支持的宏

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

描述
自动发现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 定义了以下属性(其中一些将被忽略; 参见下面) :

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

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

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

被忽略的属性有:

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

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

MBean1MBean2MBean3
MBean1Attribute1MBean2Attribute1MBean3Attribute1
MBean1Attribute2MBean2Attribute2MBean3Attribute2
MBean1Attribute3MBean2Attribute3MBean3Attribute3
例1: 自动发现Mbean

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

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

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

lld_rule_mbean.png

这里使用的键:

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

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

lld_rule_mbean_prototypes.png

这里使用的键:

  1. jmx[{#JMXOBJ},CollectionCount]
  2. jmx[{#JMXOBJ},CollectionTime]
  3. 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

这里使用的键:

  1. 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=*,*"]

返回数据:

  1. [
  2. {
  3. "object": "com.example:type=Hello,data-src=data-base,ключ=значение",
  4. "domain": "com.example",
  5. "properties": {
  6. "data-src": "data-base",
  7. "ключ": "значение",
  8. "type": "Hello"
  9. }
  10. },
  11. {
  12. "object": "com.example:type=Atomic",
  13. "domain": "com.example",
  14. "properties": {
  15. "type": "Atomic"
  16. }
  17. }
  18. ]
自动发现MBean的属性

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

返回数据:

  1. [
  2. {
  3. "object": "com.example:type=*",
  4. "domain": "com.example",
  5. "properties": {
  6. "type": "Simple"
  7. }
  8. },
  9. {
  10. "object": "com.zabbix:type=yes,domain=zabbix.com,data-source=/dev/rand,ключ=значение,obj=true",
  11. "domain": "com.zabbix",
  12. "properties": {
  13. "type": "Hello",
  14. "domain": "com.example",
  15. "data-source": "/dev/rand",
  16. "ключ": "значение",
  17. "obj": true
  18. }
  19. }
  20. ]