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,这是一个用于管理和监控 Java 应用程序的标准。
使用 JMX
Dropwizard Metrics 通过 JmxReporter 类内置支持 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,这是 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 应用程序启动,访问 https://: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 端点是明确的,但 这应该会成为自动的(就像 Spring Boot 自动配置一样),只要满足适当的条件(类路径上有 Dropwizard Metrics 和 RabbitMQ Java 客户端 4.0 或更高版本)。
总结
现在,操作员和开发人员可以更深入地了解使用 RabbitMQ Java 客户端的应用程序。可用的指标可以告诉您应用程序是否正常运行。而且,由于 Dropwizard Metrics 支持的后端范围广泛,将 Java 客户端指标集成到您喜欢的监控工具应该会很简单。
