Metrics and Management

本部分介绍如何获取 Spring Integration 的指标。在最近的版本中,我们更多地依赖于 Micrometer(请参见 [role="bare"][role="bare"]https://micrometer.io),并且我们计划在将来的版本中更多地使用 Micrometer。

Disabling Logging in High Volume Environments

您可以在主消息流中控制调试日志记录。在大量应用程序中,某些日志记录子系统对 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 Integration

Overview

从 5.0.3 版本开始,应用程序上下文中 @{33} @{32} 的存在触发了对 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

(带有 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: 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 数目。

可以通过提供 @{35} 子类自定义由集成组件创建的 @{34} 的名称和标记。@{37} 测试用例显示了如何执行此操作的简单示例。您还可以通过在构建器子类上重载 @{36} 方法进一步自定义仪表。

从版本 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

Disabling Meters

默认情况下,在首次使用时会注册所有仪表。现在,有了 Micrometer,您可以将 @{38} 添加到 @{39} 以防止部分或全部仪表被注册。您可以使用任何提供的属性过滤出仪表(拒绝仪表),如 @{40}、@{41} 等。请参阅 Micrometer 文档中的 @{42} 以获取详细信息。

例如,对于给定:

@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 Observation

从 6.0 版本开始,Spring 集成利用 Micrometer 观察抽象,该抽象可以通过适当的 @{43} 配置处理指标和 @{44}。

只要应用程序上下文中存在 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 添加标头,以便消费者可以利用它们;

  • AbstractMessageHandler 是一个 CONSUMER 跨度类型,并使用 IntegrationObservation.HANDLER API。

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

以下是针对观察 API 支持的指标、跨度和约定:

Unresolved include directive in modules/ROOT/pages/metrics.adoc - include::partial$metrics.adoc[]

Unresolved include directive in modules/ROOT/pages/metrics.adoc - include::partial$spans.adoc[]

Unresolved include directive in modules/ROOT/pages/metrics.adoc - include::partial$conventions.adoc[]

Observation Propagation

若要提供跟踪中连接的跨度链,该链独立于消息流的性质(即使 MessageChannel 是持久且分布式的),也必须启用此通道上的观察以及此通道的使用者(订阅者)上的观察。这样,跟踪信息便会存储在消息头中,然后才传播到使用者线程或持久到数据库中。这通过前面提到的 MessageSenderContext 完成。使用 MessageReceiverContext,使用者(MessageHandler)端会从那些头中还原跟踪信息,然后启动新子 Observation

Spring Integration JMX Support

另请参见 JMX Support