跳至主内容

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,这是一个用于管理和监控 Java 应用程序的标准。

使用 JMX

Dropwizard Metrics 通过 JmxReporter 类内置支持 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,这是 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 客户端指标集成到您喜欢的监控工具应该会很简单。

源代码

© . This site is unofficial and not affiliated with VMware.