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.count
由result
标记 -success
或failure
-
authorization.count
由result
标记 -success
或failure
1.2. 地址
这些指标使用 address
标签进行标记,该标签反映了相应地址的名称。
-
routed.message.count
-
unrouted.message.count
-
address.size
-
number.of.pages
1.3. 队列
这些指标使用 address
和 queue
标签进行标记,分别反映了相应地址和队列的名称。
-
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 的 BufferPoolMXBeans 和 MemoryPoolMXBeans 收集。
默认情况下启用。
- JVM GC
-
度量最大和实时数据大小、提升和分配率以及 GC 暂停的次数(或 CMS 情况下并发阶段时间)。底层数据从 Java 的 MemoryPoolMXBeans 收集。
默认情况下禁用。
- JVM 线程
-
度量线程峰值、守护线程数量和活动线程。底层数据从 Java 的 ThreadMXBean 收集。
默认情况下禁用。
- Netty
-
从 Netty 的 PooledByteBufAllocatorMetric 收集指标。
默认情况下禁用。
- 文件描述符
-
度量当前和最大允许的打开文件数。
默认情况下禁用。
- 处理器
-
度量系统 CPU 数量、CPU 使用率和 1 分钟平均负载,以及进程 CPU 使用率。
默认情况下禁用。
- 正常运行时间
-
度量进程启动时间和正常运行时间。
默认情况下禁用。
- 记录
-
统计每个记录类别的记录事件数量(例如,
WARN
、ERROR
等)。默认情况下禁用。
这仅与 Log4j2 协同工作(即代理附带的默认记录实现)。如果您正在嵌入代理并使用其他记录实现(例如,Log4j 1.x、JUL、Logback 等),并且您启用了这些指标,那么代理将因
java.lang.NoClassDefFoundError
而无法启动,因为它尝试查找类路径上不存在的 Log4j2 类。 - 安全缓存
-
导出以下身份验证和授权缓存指标。它们都用
cache
标记(authentication
或authorization
)。其他标签将在注释中说明。-
cache.size
-
cache.puts
-
cache.gets
由result
标记 -hit
或miss
-
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>