跳至主要内容

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://127.0.0.1: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 客户端指标插入您喜欢的监控工具应该很简单。

源代码

© 2024 RabbitMQ. All rights reserved.