RabbitMQ Java 客户端 4.0 中的指标支持
RabbitMQ Java 客户端 4.0 版本带来了对运行时指标的支持。这对于了解客户端应用程序的行为方式尤其有用。让我们看看如何启用指标收集以及如何在 JMX 甚至 Spring Boot 应用程序内部监控这些指标。
指标激活
指标在 ConnectionFactory
级别通过 MetricsCollector
接口收集。Java 客户端带有一个实现,StandardMetricsCollector
,它使用 Dropwizard Metrics 库。
Dropwizard Metrics 成熟且在 Java 社区中被广泛使用,因此我们认为将其作为默认指标库是有意义的。尽管如此,如果您的应用程序在指标方面有特定需求,您可以提出自己的 MetricsCollector
实现。
请注意,默认情况下指标收集是禁用的,因此它不会影响那些不想要运行时指标的用户。
以下是如何使用默认实现启用指标收集,然后获取从此 ConnectionFactory
创建的所有连接发布的总消息数
ConnectionFactory connectionFactory = new ConnectionFactory();
StandardMetricsCollector metrics = new StandardMetricsCollector();
connectionFactory.setMetricsCollector(metrics);
// later in the code
long publishedMessagesCount = metrics.getPublishedMessages().getCount();
其他可用的指标包括打开的连接和通道、已消费的消息、已确认的消息和已拒绝的消息。
在应用程序代码内部使用指标通常没有太多意义:这些指标更倾向于发送到一些监控后端。幸运的是,Dropwizard Metrics 支持许多这些后端:JMX、Graphite、Ganglia,甚至 CSV 文件导出。让我们看看如何在 JMX 中使用它,JMX 是一种用于管理和监控应用程序的 Java 标准。
使用 JMX
感谢 JmxReporter
类,Dropwizard Metrics 内置了对 JMX 的支持。MetricRegistry
只需要在 StandardMetricsCollector
和 JmxReporter
之间共享。
MetricRegistry registry = new MetricRegistry();
StandardMetricsCollector metrics = new StandardMetricsCollector(registry);
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setMetricsCollector(metrics);
JmxReporter reporter = JmxReporter
.forRegistry(registry)
.inDomain("com.rabbitmq.client.jmx")
.build();
reporter.start();
非常简单直接。然后您可以使用任何 JMX 兼容的客户端,例如 Java VisualVM(带有适当的插件)来浏览指标。

如上所述,Dropwizard Metrics 支持许多监控后端,请随时查阅库文档以了解如何将您的指标发送到这些后端。
现在让我们看看如何将 RabbitMQ Java 客户端指标与 Spring Boot 集成。
使用 Spring Boot 的指标端点
许多 RabbitMQ 用户通过 Spring AMQP 和 Spring Boot 使用 Java 客户端。Spring Boot 还在其 /metrics
端点中支持 Dropwizard Metrics,/metrics
端点是 Spring Boot Actuator 提供的非常有用的端点之一。
一旦 Spring Boot 在类路径上检测到 Dropwizard Metrics,它就会创建一个 MetricRegistry
bean。检索此 bean 并在我们的 StandardMetricsCollector
中使用它并不需要很长时间。请注意,如果 Spring Boot 在类路径上检测到 Spring AMQP,它会自动创建必要的资源(RabbitMQ 的 ConnectionFactory
和 Spring AMQP 的 CachingConnectionFactory
)。添加到配置类中的粘合代码并不明显,但至少很简单直接
@Autowired CachingConnectionFactory connectionFactory;
@Autowired MetricRegistry registry;
@PostConstruct
public void init() {
ConnectionFactory rabbitConnectionFactory = connectionFactory.getRabbitConnectionFactory();
StandardMetricsCollector metrics = new StandardMetricsCollector(registry);
rabbitConnectionFactory.setMetricsCollector(metrics);
}
一旦 Spring Boot Web 应用程序启动,请访问 http://localhost:8080/metrics
,您应该会看到 RabbitMQ Java 客户端指标
{
...
"rabbitmq.acknowledged.count": 5445,
"rabbitmq.acknowledged.fifteenMinuteRate": 7.789880284345983,
"rabbitmq.acknowledged.fiveMinuteRate": 9.311935481093306,
"rabbitmq.acknowledged.meanRate": 9.930420428656602,
"rabbitmq.acknowledged.oneMinuteRate": 9.972266275538352,
"rabbitmq.channels": 2,
"rabbitmq.connections": 1,
"rabbitmq.consumed.count": 5445,
"rabbitmq.consumed.fifteenMinuteRate": 7.789875530041546,
"rabbitmq.consumed.fiveMinuteRate": 9.311910098253794,
"rabbitmq.consumed.meanRate": 9.930418948751754,
"rabbitmq.consumed.oneMinuteRate": 9.972238610447798,
"rabbitmq.published.count": 5445,
"rabbitmq.published.fifteenMinuteRate": 7.789875530041546,
"rabbitmq.published.fiveMinuteRate": 9.311910098253794,
"rabbitmq.published.meanRate": 9.930419905146142,
"rabbitmq.published.oneMinuteRate": 9.972238610447798,
"rabbitmq.rejected.count": 0,
"rabbitmq.rejected.fifteenMinuteRate": 0,
"rabbitmq.rejected.fiveMinuteRate": 0,
"rabbitmq.rejected.meanRate": 0,
"rabbitmq.rejected.oneMinuteRate": 0,
...
}
很简洁,不是吗?现在将 RabbitMQ Java 客户端指标插入到 /metrics
端点是显式的,但只要满足适当的条件(类路径上的 Dropwizard Metrics 和 RabbitMQ Java 客户端 4.0 或更高版本),这有望变为自动(如 Spring Boot 自动配置)。
总结
运维人员和开发人员现在可以更深入地了解使用 RabbitMQ Java 客户端的应用程序。可用的指标可以告诉您应用程序是否正常运行。并且由于 Dropwizard Metrics 支持范围广泛的后端,因此将 Java 客户端指标插入到您最喜欢的监控工具中应该很简单。