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属性的自动发现(为了清晰重新格式化):
[
{
"{#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
此规则会返回三个对象:该列的第一行: MBean1,MBean2, MBean3.
更多关于对象的信息请查阅 自动发现MBean 小节中的支持的宏 表格。
收集Mbean数据(不包含属性)的自动发现规则配置如下:
这里使用的键:
jmx.discovery[beans,"*:type=GarbageCollector,name=*"]
所有的垃圾回收器都会被发现,但不包含它们的属性数据。由于垃圾回收器的属性集都是相同的,所以可以在监控项原型中使用属性,像下面这样:
这里使用的键:
jmx[{#JMXOBJ},CollectionCount]
jmx[{#JMXOBJ},CollectionTime]
jmx[{#JMXOBJ},Valid]
LLD自动发现规则会产生近似于下面的结果(两个垃圾回收器的监控项被发现):
例2: 自动发现Mbean的属性
此规则会返回下列九个对象: MBean1Attribute1, MBean2Attribute1, Mbean3Attribute1,MBean1Attribute2,MBean2Attribute2, Mbean3Attribute2, MBean1Attribute3, MBean2Attribute3, Mbean3Attribute3.
更多关于对象的信息请参考 自动发现Mbean的属性 小节中的支持的宏 表格。
收集Mbean属性数据的自动发现规则配置如下:
这里使用的键:
jmx.discovery[attributes,"*:type=GarbageCollector,name=*"]
所有垃圾回收器连同其监控项的属性都会被发现。
在这个特定场景下,对于每个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
}
}
]