You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JMX Exporter监控ActiveMQ Artemis集群节点失联问题求助

问题描述

我有一个3节点的ActiveMQ Artemis集群,偶尔会出现单个节点无法识别其他节点但仍能独立运行的情况,导致集群分裂为正常集群和孤立节点两部分。

我想通过每个节点上部署的JMX Exporter实现该场景的监控告警,目前仅发现JMX中的Topology属性可查看集群成员,但JMX Exporter无法抓取这个属性。我知道监控指标需要数值类型,所以测试规则里把value设为1,规则配置如下:

- pattern: "^org.apache.activemq.artemis<broker=\"([^\"]*)\",\\s*component=cluster-connections,\\s*name=\"([^\"]*)\"><>([^:]*):(.*)"
    attrNameSnakeCase: true
    name: artcluster_$3
    value: 1
    labels:
        a1: $1
        a2: $2
        a3: $3
        a4: $4  

相关属性情况如下(标注了可抓取和不可抓取的属性):

scrape            "Started": true,
scrape            "Address": "",
scrape            "MessagesAcknowledged": 1,
scrape            "MessageLoadBalancingType": "ON_DEMAND",
!DONT scrape      "Topology": "topology on Topology@47f077e3[owner=ClusterConnectionImpl@53887553[nodeUUID=e6b1d33c-a8af-11ed-837e-0242ac110002, connector=TransportConfiguration(name=netty-connector, factory=org-apache-activemq-artemis-core-remoting-impl-netty-NettyConnectorFactory) ?port=61616&host=art-smx03-t, address=, server=ActiveMQServerImpl::name=art-smx03-t]]:\n\te6c92b4c-a8af-11ed-baf9-0242ac110002 => TopologyMember[id=e6c92b4c-a8af-11ed-baf9-0242ac110002, connector=Pair[a=TransportConfiguration(name=netty-connector, factory=org-apache-activemq-artemis-core-remoting-impl-netty-NettyConnectorFactory) ?port=61616&host=app-smx01-t, b=TransportConfiguration(name=netty-connector, factory=org-apache-activemq-artemis-core-remoting-impl-netty-NettyConnectorFactory) ?port=62616&host=art-smx03-t], backupGroupName=art-smx03-t, scaleDownGroupName=null]\n\te5777e6d-a8af-11ed-887a-0242ac110002 => TopologyMember[id=e5777e6d-a8af-11ed-887a-0242ac110002, connector=Pair[a=TransportConfiguration(name=netty-connector, factory=org-apache-activemq-artemis-core-remoting-impl-netty-NettyConnectorFactory) ?port=61616&host=art-smx01-t, b=TransportConfiguration(name=netty-connector, factory=org-apache-activemq-artemis-core-remoting-impl-netty-NettyConnectorFactory) ?port=62616&host=app-smx01-t-], backupGroupName=app-smx01-t, scaleDownGroupName=null]\n\te6b1d33c-a8af-11ed-837e-0242ac110002 => TopologyMember[id=e6b1d33c-a8af-11ed-837e-0242ac110002, connector=Pair[a=TransportConfiguration(name=netty-connector, factory=org-apache-activemq-artemis-core-remoting-impl-netty-NettyConnectorFactory) ?port=61616&host=art-smx03-t, b=TransportConfiguration(name=netty-connector, factory=org-apache-activemq-artemis-core-remoting-impl-netty-NettyConnectorFactory) ?port=62616&host=art-smx01-t], backupGroupName=art-smx01-t, scaleDownGroupName=null]\n\tnodes=6\tmembers=3",
scrape            "MaxHops": 1,
!DONT scrape      "Nodes": {
                                  "e5777e6d-a8af-11ed-887a-0242ac110002": "art-smx01-t",
                                  "e6c92b4c-a8af-11ed-baf9-0242ac110002": "app-smx01-t"
                                         },
scrape            "Name": "smx-art-cluster",
scrape            "DuplicateDetection": true,

所有属性层级相同,数值、布尔类型及短文本属性能正常抓取,但长文本属性不行。Topology是java.lang.String类型却无法抓取,而同为java.lang.String的短文本属性MessageLoadBalancingType可以正常抓取。当前使用JMX Exporter版本是0.18.0,请问怎么解决这个问题来实现集群节点失联的监控告警?

解决方案

1. 调整JMX Exporter配置,提取Topology中的关键数值

JMX Exporter 0.18.0对长文本属性的支持有限,但可以通过自定义规则匹配Topology属性,并从中提取成员数量这类关键数值:

- pattern: "^org.apache.activemq.artemis<broker=\"([^\"]*)\",\\s*component=cluster-connections,\\s*name=\"([^\"]*)\"\\><>Topology:(.*)"
    name: artemis_cluster_member_count
    value: "$3"
    labels:
      broker: "$1"
      cluster_connection: "$2"
    type: GAUGE
    transform:
      script: |
        def matcher = java.util.regex.Pattern.compile('members=(\\d+)').matcher(value);
        if (matcher.find()) {
            return Integer.parseInt(matcher.group(1));
        }
        return 0;

注意:此配置需要JMX Exporter启用Groovy脚本支持,若0.18.0版本未包含相关依赖,可升级至0.20+版本,新版本对长文本属性处理更友好,且脚本transform功能更稳定。

2. 改用Nodes属性统计集群节点数量

虽然Nodes是Map类型,但可以通过调整规则将其拆分为多个指标实例,通过统计指标数量判断集群状态:

- pattern: "^org.apache.activemq.artemis<broker=\"([^\"]*)\",\\s*component=cluster-connections,\\s*name=\"([^\"]*)\"\\><>Nodes\\[(.*)\\]:(.*)"
    name: artemis_cluster_node_present
    value: 1
    labels:
      broker: "$1"
      cluster_connection: "$2"
      node_uuid: "$3"
      node_name: "$4"
    type: GAUGE

正常3节点集群中,每个节点应抓取到2个其他节点的指标;当节点失联时,该节点抓取到的指标数量会减少,据此可配置告警。

3. 升级JMX Exporter版本

0.18.0版本较旧,后续版本(如0.20.0+)修复了长文本属性抓取的相关问题,升级后可能无需额外配置即可正常抓取Topology属性。

4. 配置Prometheus告警规则

无论采用哪种方式获取集群成员数据,都需要配置告警规则触发通知。示例规则如下:

groups:
- name: artemis_cluster_alerts
  rules:
  - alert: ArtemisClusterNodeIsolation
    expr: artemis_cluster_member_count < 2
    for: 2m
    labels:
      severity: critical
    annotations:
      summary: "Artemis节点 {{ $labels.broker }} 集群成员数量异常"
      description: "节点 {{ $labels.broker }} 当前仅识别到 {{ $value }} 个集群成员,预期为2个,可能已被孤立。"

内容的提问来源于stack exchange,提问作者Mihail Ma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 12:38:08