指标和管理

本节描述了如何为 Spring Integration 捕获指标。在最新版本中,我们更多地依赖于 Micrometer(请参阅 [role="bare"][role="bare"][role="bare"]micrometer.io),并且计划在未来的版本中更多地使用 Micrometer。

在高并发环境中禁用日志记录

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

以下列表显示了控制日志记录的可用选项:

  • Java

  • XML

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

public static class ContextConfiguration {
...
}
<int:management default-logging-enabled="true"/> [id="CO1-1"]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: Send processing time

failure 结果和 none 异常表示通道的 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: Messages received

消息处理器上操作的 Timer 表计具有以下名称或标签:

  • name: spring.integration.send

  • tag: type:handler

  • tag: name:<componentName>

  • tag: result:(success|failure)

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

  • description: Send processing time

消息源的 Counter 表计具有以下名称/标签:

  • name: spring.integration.receive

  • tag: type:source

  • tag: name:<componentName>

  • tag: result:success

  • tag: exception:none

  • description: Messages received

此外,还有三个 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: The size of the queue channel

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

  • tag: type:channel

  • tag: name:<componentName>

  • description: The remaining capacity of the queue channel

禁用表计

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

例如,给定:

@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 Observation 抽象,该抽象可以通过适当的 ObservationHandler 配置处理指标以及 跟踪

当应用程序上下文中存在 ObservationRegistry bean 并且配置了 @EnableIntegrationManagement 时,IntegrationManagement 组件上会启用观测处理。为了定制应该检测哪些组件集,@EnableIntegrationManagement 注解上暴露了一个 observationPatterns() 属性。有关模式匹配算法,请参阅其 javadoc。

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

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

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

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

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

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

  • AbstractMessageHandler 是一个 CONSUMER span 类型并使用 IntegrationObservation.HANDLER API;

  • SourcePollingChannelAdapter(从版本 6.5 开始)作为流的入站端点,被视为 CONSUMER span 类型并使用 IntegrationObservation.HANDLER API。

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

以下是观测 API 支持的指标、span 和约定:

Unresolved directive in metrics.adoc - include::partial$metrics.adoc[]

Unresolved directive in metrics.adoc - include::partial$spans.adoc[]

Unresolved directive in metrics.adoc - include::partial$conventions.adoc[]

观测传播

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

Spring Integration JMX 支持

另请参阅 JMX 支持