Apache ActiveMQ Artemis 可以通过 Micrometer 供应商中立应用程序指标外壳将指标导出到各种监控系统。

重要运行时指标已通过 Micrometer API 进行检测,用户只需实现 org.apache.activemq.artemis.core.server.metrics.ActiveMQMetricsPlugin 即可实例化和配置 io.micrometer.core.instrument.MeterRegistry 实现。MeterRegistry 的相关实现可从 Micrometer 代码库 获取。

这是一个简单的接口

public interface ActiveMQMetricsPlugin extends Serializable {

   ActiveMQMetricsPlugin init(Map<String, String> options);

   MeterRegistry getRegistry();

   default void registered(ActiveMQServer server) { }
}

当代理启动时,它将调用 init 并传入 options,这些选项可以在 XML 中以键值对属性的形式指定。此时,插件应该实例化并配置 io.micrometer.core.instrument.MeterRegistry 实现。

稍后在代理启动过程中,它将调用 getRegistry 以获取 MeterRegistry 实现并将其用于注册指标。注册后,它将调用 registered 向插件提供一个服务器句柄。然后,插件可以使用该句柄来检查代理是否处于运行状态,而不是处于启动或关闭阶段。

代理附带两个 ActiveMQMetricsPlugin 实现

org.apache.activemq.artemis.core.server.metrics.plugins.LoggingMetricsPlugin

此插件只是记录指标。对于生产环境来说,它没有多大用处,但可以作为 Micrometer 集成的演示。它不接受任何键值对属性进行配置。

org.apache.activemq.artemis.core.server.metrics.plugins.SimpleMetricsPlugin

此插件用于测试。它仅存在于内存中,不提供任何外部输出。它不接受任何键值对属性进行配置。

1. 导出指标

导出以下指标,按组件分类。每个指标的描述都与指标本身一起导出,因此此处不再重复描述。

每个指标都用 broker 标签标记(通过 broker.xml 中的 <name> 配置)。标签是提供指标上下文信息的元数据片段。这些标签是“维度指标”的基础。指标可能包含其他标签,但至少它们都将包含 broker 标签。

最后,所有专门针对 ActiveMQ Artemis 的指标都以 artemis. 为前缀。

1.1. 代理

  • connection.count

  • total.connection.count

  • address.memory.usage

  • address.memory.usage.percentage

  • disk.store.usage

  • replica.sync

  • active

  • authentication.countresult 标记 - successfailure

  • authorization.countresult 标记 - successfailure

1.2. 地址

这些指标使用 address 标签进行标记,该标签反映了相应地址的名称。

  • routed.message.count

  • unrouted.message.count

  • address.size

  • number.of.pages

1.3. 队列

这些指标使用 addressqueue 标签进行标记,分别反映了相应地址和队列的名称。

  • message.count

  • durable.message.count

  • persistent.size

  • durable.persistent.size

  • delivering.message.count

  • delivering.durable.message.count

  • delivering.persistent.size

  • delivering.durable.persistent.size

  • scheduled.message.count

  • scheduled.durable.message.count

  • scheduled.persistent.size

  • scheduled.durable.persistent.size

  • messages.acknowledged

  • messages.added

  • messages.killed

  • messages.expired

  • consumer.count

可能看起来缺少某些更高级别的代理指标(例如,总消息数)。但是,可以通过聚合更低级别的指标来推断这些指标(例如,聚合所有队列中的 message.count 指标以获得总数)。

1.4. 可选指标

还有一些其他有用的指标,这些指标与 JVM、底层操作系统等相关。这些指标由 Micrometer 提供,因此没有 artemis. 前缀。

JVM 内存指标

度量缓冲区和内存池利用率。底层数据从 Java 的 BufferPoolMXBeansMemoryPoolMXBeans 收集。

默认情况下启用。

JVM GC

度量最大和实时数据大小、提升和分配率以及 GC 暂停的次数(或 CMS 情况下并发阶段时间)。底层数据从 Java 的 MemoryPoolMXBeans 收集。

默认情况下禁用。

JVM 线程

度量线程峰值、守护线程数量和活动线程。底层数据从 Java 的 ThreadMXBean 收集。

默认情况下禁用。

Netty

从 Netty 的 PooledByteBufAllocatorMetric 收集指标。

默认情况下禁用。

文件描述符

度量当前和最大允许的打开文件数。

默认情况下禁用。

处理器

度量系统 CPU 数量、CPU 使用率和 1 分钟平均负载,以及进程 CPU 使用率。

默认情况下禁用。

正常运行时间

度量进程启动时间和正常运行时间。

默认情况下禁用。

记录

统计每个记录类别的记录事件数量(例如,WARNERROR 等)。

默认情况下禁用。

与 Log4j2 协同工作(即代理附带的默认记录实现)。如果您正在嵌入代理并使用其他记录实现(例如,Log4j 1.x、JUL、Logback 等),并且您启用了这些指标,那么代理将因 java.lang.NoClassDefFoundError 而无法启动,因为它尝试查找类路径上不存在的 Log4j2 类。

安全缓存

导出以下身份验证和授权缓存指标。它们都用 cache 标记(authenticationauthorization)。其他标签将在注释中说明。

  • cache.size

  • cache.puts

  • cache.getsresult 标记 - hitmiss

  • cache.evictions

  • cache.eviction.weight

默认情况下禁用。

2. 配置

默认情况下,启用所有地址和队列的指标。如果要禁用特定地址或一组地址的指标,可以通过将 enable-metrics address-setting 设置为 false 来实现。

broker.xml 中,使用 metrics 元素配置要报告哪些常规代理和 JVM 指标,以及配置插件本身。以下是一个包含所有可选指标的配置

<metrics>
   <jvm-memory>true</jvm-memory> <!-- defaults to true -->
   <jvm-gc>true</jvm-gc> <!-- defaults to false -->
   <jvm-threads>true</jvm-threads> <!-- defaults to false -->
   <netty-pool>true</netty-pool> <!-- defaults to false -->
   <file-descriptors>true</file-descriptors> <!-- defaults to false -->
   <processor>true</processor> <!-- defaults to false -->
   <uptime>true</uptime> <!-- defaults to false -->
   <logging>true</logging> <!-- defaults to false -->
   <security-caches>true</security-caches> <!-- defaults to false -->
   <plugin class-name="org.apache.activemq.artemis.core.server.metrics.plugins.LoggingMetricsPlugin"/>
</metrics>

插件也可以使用键值对属性进行配置,以便根据需要自定义实现,例如

<metrics>
   <plugin class-name="org.example.MyMetricsPlugin">
      <property key="host" value="example.org" />
      <property key="port" value="5162" />
      <property key="foo" value="10" />
   </plugin>
</metrics>