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