跳到主要内容

RabbitMQ Java 客户端 4.0 中的指标支持

·4 分钟阅读

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 只需要在 StandardMetricsCollectorJmxReporter 之间共享。

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(带有适当的插件)来浏览指标。

JMX metrics
JMX 指标

如上所述,Dropwizard Metrics 支持许多监控后端,请随时查阅库文档以了解如何将您的指标发送到这些后端。

现在让我们看看如何将 RabbitMQ Java 客户端指标与 Spring Boot 集成。

使用 Spring Boot 的指标端点

许多 RabbitMQ 用户通过 Spring AMQPSpring 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 客户端指标插入到您最喜欢的监控工具中应该很简单。

源代码

© . All rights reserved.