指标和管理

本节介绍如何捕获 Spring Integration 的指标。在最近的版本中,我们更多地依赖于 Micrometer(参见 micrometer.io),并且我们计划在将来的版本中更多地使用 Micrometer。

在高负载环境中禁用日志记录

您可以控制主消息流中的调试日志记录。在非常高负载的应用程序中,对 isDebugEnabled() 的调用在某些日志记录子系统中可能非常昂贵。您可以禁用所有此类日志记录以避免此开销。异常日志记录(调试或其他)不受此设置的影响。

以下清单显示了用于控制日志记录的可用选项

  • Java

  • XML

@Configuration
@EnableIntegration
@EnableIntegrationManagement(
    defaultLoggingEnabled = "true" <1>)

public static class ContextConfiguration {
...
}
<int:management default-logging-enabled="true"/> (1)
1 设置为 false 以禁用主消息流中的所有日志记录,而不管日志系统类别设置如何。设置为“true”以启用调试日志记录(如果也由日志记录子系统启用)。仅在您未在 bean 定义中显式配置设置时才应用。默认值为 true
defaultLoggingEnabled 仅在您未在 bean 定义中显式配置相应的设置时才应用。

Micrometer 集成

概述

从 5.0.3 版本开始,应用程序上下文中存在 Micrometer MeterRegistry 会触发对 Micrometer 指标的支持。

要使用 Micrometer,请将一个 MeterRegistry bean 添加到应用程序上下文。

对于每个 MessageHandlerMessageChannel,都会注册计时器。对于每个 MessageSource,都会注册一个计数器。

这仅适用于扩展 AbstractMessageHandlerAbstractMessageChannelAbstractMessageSource 的对象(大多数框架组件都是这种情况)。

消息通道发送操作的 Timer 指标具有以下名称或标签

  • name: spring.integration.send

  • tag: type:channel

  • tag: name:<componentName>

  • tag: result:(success|failure)

  • tag: exception:(none|exception simple class name)

  • description: 发送处理时间

(具有 none 异常的 failure 结果表示通道的 send() 操作返回 false。)

可轮询消息通道接收操作的 Counter 指标具有以下名称或标签

  • name: spring.integration.receive

  • tag: type:channel

  • tag: name:<componentName>

  • tag: result:(success|failure)

  • tag: exception:(none|exception simple class name)

  • description: 接收到的消息

消息处理程序操作的 Timer 指标具有以下名称或标签

  • name: spring.integration.send

  • tag: type:handler

  • tag: name:<componentName>

  • tag: result:(success|failure)

  • tag: exception:(none|exception simple class name)

  • description: 发送处理时间

消息源的 Counter 指标具有以下名称/标签

  • name: spring.integration.receive

  • tag: type:source

  • tag: name:<componentName>

  • tag: result:success

  • tag: exception:none

  • description: 接收到的消息

此外,还有三个 Gauge 指标

  • spring.integration.channels:应用程序中 MessageChannels 的数量。

  • spring.integration.handlers:应用程序中 MessageHandlers 的数量。

  • spring.integration.sources:应用程序中 MessageSources 的数量。

可以通过提供 MicrometerMetricsCaptor 的子类来自定义集成组件创建的 Meters 的名称和标签。 MicrometerCustomMetricsTests 测试用例展示了一个如何执行此操作的简单示例。您还可以通过重载构建器子类上的 build() 方法进一步自定义指标。

从 5.1.13 版本开始,QueueChannel 公开用于队列大小和剩余容量的 Micrometer 规范。

  • name: spring.integration.channel.queue.size

  • tag: type:channel

  • tag: name:<componentName>

  • description: 队列通道的大小

以及

  • name: spring.integration.channel.queue.remaining.capacity

  • tag: type:channel

  • tag: name:<componentName>

  • description: 队列通道的剩余容量

禁用指标

默认情况下,所有指标在首次使用时都会注册。现在,使用 Micrometer,您可以将 MeterFilter 添加到 MeterRegistry 以阻止某些或所有指标被注册。您可以根据提供的任何属性(nametag 等)过滤掉(拒绝)指标。有关更多信息,请参阅 Micrometer 文档中的 指标过滤器

例如,给定

@Bean
public QueueChannel noMeters() {
    return new QueueChannel(10);
}

您可以使用以下方法抑制仅此通道的指标注册

registry.config().meterFilter(MeterFilter.deny(id ->
        "channel".equals(id.getTag("type")) &&
        "noMeters".equals(id.getTag("name"))));

Micrometer 观察

从 6.0 版本开始,Spring Integration 利用 Micrometer 观察抽象,该抽象可以处理指标以及通过适当的 ObservationHandler 配置处理 跟踪

只要应用程序上下文中存在 ObservationRegistry bean 并且配置了 @EnableIntegrationManagement,就会在 IntegrationManagement 组件上启用观察处理。要自定义应检测哪些组件集,@EnableIntegrationManagement 注解上公开了 observationPatterns() 属性。有关模式匹配算法,请参阅其 javadoc。

默认情况下,没有一个 IntegrationManagement 组件使用 ObservationRegistry bean 进行检测。可以配置为 * 以匹配所有组件。

在这种情况下,指标不会独立收集,而是委托给在提供的 ObservationRegistry 上配置的适当 ObservationHandler

以下 Spring Integration 组件使用观察逻辑进行检测,每个组件都具有相应的约定

  • MessageProducerSupport 作为流的入站端点,被视为 CONSUMER 跨度类型,并使用 IntegrationObservation.HANDLER API;

  • MessagingGatewaySupport` 是一个入站请求回复端点,被视为 SERVER 跨度类型。它使用 IntegrationObservation.GATEWAY API;

  • AbstractMessageChannel.send() 操作是 Spring Integration API 中唯一生成消息的操作。因此,它被视为 PRODUCER 跨度类型,并使用 IntegrationObservation.PRODCUER API。当通道是分布式实现(例如 PublishSubscribeKafkaChannelZeroMqChannel)并且必须将跟踪信息添加到消息时,这样做更有意义。因此,IntegrationObservation.PRODUCER 观察基于 MessageSenderContext,其中 Spring Integration 提供 MutableMessage 以允许后续跟踪 Propagator 添加标头,以便它们可供使用者使用;

  • AbstractMessageHandlerCONSUMER 跨度类型,并使用 IntegrationObservation.HANDLER API。

可以通过 ObservationConvention 配置自定义 IntegrationManagement 组件上的观察生成。例如,AbstractMessageHandler 通过其 setObservationConvention() API 期望 MessageReceiverObservationConvention

以下是 Observation API 支持的指标、跨度和约定

可观察性 - 指标

下面您可以找到此项目声明的所有指标的列表。

网关

入站消息网关的观察。

指标名称 spring.integration.gateway(由约定类 o.s.i.support.management.observation.DefaultMessageRequestReplyReceiverObservationConvention 定义)。类型 timer

指标名称 spring.integration.gateway.active(由约定类 o.s.i.support.management.observation.DefaultMessageRequestReplyReceiverObservationConvention 定义)。类型 long task timer

在启动观察后添加的 KeyValues 可能会从 *.active 指标中丢失。
Micrometer 在内部使用 纳秒 作为基本单位。但是,每个后端都会确定实际的基本单位。(例如,Prometheus 使用秒)

封闭类的完全限定名称 o.s.i.support.management.observation.IntegrationObservation

所有标签都必须以 spring.integration. 前缀开头!
表 1. 低基数键

名称

描述

spring.integration.name (必需)

消息网关组件的名称。

spring.integration.outcome (必需)

请求/回复执行的结果。

spring.integration.type (必需)

组件的类型 - 'gateway'。

处理程序

消息处理程序的观察。

指标名称 spring.integration.handler(由约定类 o.s.i.support.management.observation.DefaultMessageReceiverObservationConvention 定义)。类型 timer

指标名称 spring.integration.handler.active(由约定类 o.s.i.support.management.observation.DefaultMessageReceiverObservationConvention 定义)。类型 long task timer

在启动观察后添加的 KeyValues 可能会从 *.active 指标中丢失。
Micrometer 在内部使用 纳秒 作为基本单位。但是,每个后端都会确定实际的基本单位。(例如,Prometheus 使用秒)

封闭类的完全限定名称 o.s.i.support.management.observation.IntegrationObservation

所有标签都必须以 spring.integration. 前缀开头!
表 2. 低基数键

名称

描述

spring.integration.name (必需)

消息处理程序组件的名称。

spring.integration.type (必需)

组件的类型 - 'handler'。

生产者

消息生产者的观察,例如通道。

指标名称 spring.integration.producer(由约定类 o.s.i.support.management.observation.DefaultMessageSenderObservationConvention 定义)。类型 timer

指标名称 spring.integration.producer.active(由约定类 o.s.i.support.management.observation.DefaultMessageSenderObservationConvention 定义)。类型 long task timer

在启动观察后添加的 KeyValues 可能会从 *.active 指标中丢失。
Micrometer 在内部使用 纳秒 作为基本单位。但是,每个后端都会确定实际的基本单位。(例如,Prometheus 使用秒)

封闭类的完全限定名称 o.s.i.support.management.observation.IntegrationObservation

所有标签都必须以 spring.integration. 前缀开头!
表 3. 低基数键

名称

描述

spring.integration.name (必需)

消息处理程序组件的名称。

spring.integration.type (必需)

组件的类型 - 'producer'。

可观察性 - 跨度

下面您可以找到此项目声明的所有跨度的列表。

网关跨度

入站消息网关的观察。

跨度名称 spring.integration.gateway(由约定类 o.s.i.support.management.observation.DefaultMessageRequestReplyReceiverObservationConvention 定义)。

封闭类的完全限定名称 o.s.i.support.management.observation.IntegrationObservation

所有标签都必须以 spring.integration. 前缀开头!
表 4. 标签键

名称

描述

spring.integration.name (必需)

消息网关组件的名称。

spring.integration.outcome (必需)

请求/回复执行的结果。

spring.integration.type (必需)

组件的类型 - 'gateway'。

处理程序跨度

消息处理程序的观察。

跨度名称 spring.integration.handler(由约定类 o.s.i.support.management.observation.DefaultMessageReceiverObservationConvention 定义)。

封闭类的完全限定名称 o.s.i.support.management.observation.IntegrationObservation

所有标签都必须以 spring.integration. 前缀开头!
表 5. 标签键

名称

描述

spring.integration.name (必需)

消息处理程序组件的名称。

spring.integration.type (必需)

组件的类型 - 'handler'。

生产者跨度

消息生产者的观察,例如通道。

跨度名称 spring.integration.producer(由约定类 o.s.i.support.management.observation.DefaultMessageSenderObservationConvention 定义)。

封闭类的完全限定名称 o.s.i.support.management.observation.IntegrationObservation

所有标签都必须以 spring.integration. 前缀开头!
表 6. 标签键

名称

描述

spring.integration.name (必需)

消息处理程序组件的名称。

spring.integration.type (必需)

组件的类型 - 'producer'。

可观察性 - 约定

下面您可以找到此项目声明的所有 GlobalObservationConventionObservationConvention 的列表。

表 7. ObservationConvention 实现

ObservationConvention 类名称

适用的 ObservationContext 类名称

o.s.i.support.management.observation.DefaultMessageReceiverObservationConvention

MessageReceiverContext

o.s.i.support.management.observation.MessageReceiverObservationConvention

MessageReceiverContext

o.s.i.support.management.observation.DefaultMessageRequestReplyReceiverObservationConvention

MessageRequestReplyReceiverContext

o.s.i.support.management.observation.MessageRequestReplyReceiverObservationConvention

MessageRequestReplyReceiverContext

o.s.i.support.management.observation.DefaultMessageSenderObservationConvention

MessageSenderContext

o.s.i.support.management.observation.MessageSenderObservationConvention

MessageSenderContext

观测传播

为了在一个追踪中提供一个连接的跨度链,独立于消息传递流的性质,即使MessageChannel是持久且分布式的,也必须在此通道及其消费者(订阅者)上启用观测。这样,追踪信息会在传播到消费者线程或持久化到数据库之前存储在消息头中。这是通过上面提到的MessageSenderContext完成的。消费者(一个MessageHandler)端使用MessageReceiverContext从这些头中恢复追踪信息,并启动一个新的子Observation

Spring Integration JMX 支持

另请参见 JMX 支持