在 JMX 密钥中使用通配符获取队列属性列表

Using wild cards in JMX key to get a list of queue attributes

我正在使用 Zabbix 通过 JMX 监控 ActiveMQ Artemis。我想检索一个 JSON 对象,其中包含所有队列的消息计数 - 如果可能的话。

Here 是我对这个主题的主要理解来源:

我可以像这样获取所有队列的所有属性:

jmx.get[attributes,"org.apache.activemq.artemis:broker=*,component=addresses,address=*,subcomponent=queues,routing-type=*,queue=*"]

下面是数组中一些项目的示例:

{
    "name": "Name",
    "description": "name of this queue",
    "type": "java.lang.String",
    "value": "MAO.SOF.User.Import.Queue",
    "object": "org.apache.activemq.artemis:broker=\"0.0.0.0\",component=addresses,address=\"MAO.SOF.User.Import.Topic\",subcomponent=queues,routing-type=\"multicast\",queue=\"MAO.SOF.User.Import.Queue\""
},
{
    "name": "Address",
    "description": "address this queue is bound to",
    "type": "java.lang.String",
    "value": "MAO.SOF.User.Import.Topic",
    "object": "org.apache.activemq.artemis:broker=\"0.0.0.0\",component=addresses,address=\"MAO.SOF.User.Import.Topic\",subcomponent=queues,routing-type=\"multicast\",queue=\"MAO.SOF.User.Import.Queue\""
},
{
    "name": "MessageCount",
    "description": "number of messages currently in this queue (includes scheduled, paged, and in-delivery messages)",
    "type": "java.lang.Long",
    "value": "0",
    "object": "org.apache.activemq.artemis:broker=\"0.0.0.0\",component=addresses,address=\"MAO.SOF.User.Import.Topic\",subcomponent=queues,routing-type=\"multicast\",queue=\"MAO.SOF.User.Import.Queue\""
}

但是,现在我正在尝试弄清楚如何仅针对 MessageCount 进行过滤。我试过这两个,但它 returns 是一个空数组:

jmx.get[attributes,"org.apache.activemq.artemis:broker=*,component=addresses,address=*,subcomponent=queues,routing-type=*,queue=*,name=MessageCount"]
jmx.get[attributes,"org.apache.activemq.artemis:broker=*,component=addresses,address=*,subcomponent=queues,routing-type=*,queue=*,attribute=MessageCount"]

[编辑]

这是我目前的解决方案。这是我使用的密钥示例:

jmx.get[attributes,"org.apache.activemq.artemis:broker=*,component=addresses,address=*,subcomponent=queues,routing-type=*,queue=*"]

这会获取所有队列的所有 JMX 属性。然后在预处理选项卡下添加一个 JSON 路径查询:

$.[?(@.name=='MessageCount')]

此过滤器仅针对邮件计数 属性。然后我用一点javascript来做一个字符串。

var object = JSON.parse(value);
var returnString = ""; 
for (var i=0; i<object.length; i++) {
  if (object[i].value > 5) {
    returnString = returnString + object[i].object.substring(object[i].object.lastIndexOf("\",queue=\"")+9, object[i].object.length-1) + " has " + object[i].value + " messages pending.\n"; 
  }
}
if (returnString.length==0) {
  returnString = "clear"; 
}
return returnString;

这只是循环遍历数组,如果它发现一个消息计数大于该值(在本例中为 5),它会将队列名称和计数附加到一个字符串中。如果没有找到大于 5 的队列,我将字符串设置为“clear”。

然后当我创建一个动作时,如果值不是“明确的”,我会触发一条消息。

根据 Zabbix documentation:

When using jmx.get[] for discovery, low-level discovery macros can be defined separately in the custom LLD macro tab of the discovery rule configuration, using JSONPath to point to the required values.

Documentation on JSONPath functionality 也可以从 Zabbix 获得。

您不能只将 name=MessageCountattribute=MessageCount 添加到 MBean 名称,因为它们实际上并不是 MBean 名称的一部分。 “MessageCount”是从 MBean 中检索到的 属性 。因此,您需要以其他方式获取它(例如使用 JSONPath)。