指标和管理
本节描述了如何为 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 添加到应用程序上下文。
为每个 MessageHandler 和 MessageChannel 注册计时器。为每个 MessageSource 注册一个计数器。
这仅适用于扩展 AbstractMessageHandler、AbstractMessageChannel 和 AbstractMessageSource 的对象(大多数框架组件都是这种情况)。
消息通道上发送操作的 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 中,以阻止某些或所有表计的注册。您可以通过提供的任何属性(name、tag 等)过滤掉(拒绝)表计。有关更多信息,请参阅 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作为流的入站端点,被视为CONSUMERspan 类型并使用IntegrationObservation.HANDLERAPI; -
MessagingGatewaySupport是一个入站请求-回复端点,被视为SERVERspan 类型。它使用IntegrationObservation.GATEWAYAPI; -
AbstractMessageChannel.send()操作是 Spring Integration API 中唯一产生消息的地方。因此,它被视为PRODUCERspan 类型并使用IntegrationObservation.PRODCUERAPI。当通道是分布式实现(例如PublishSubscribeKafkaChannel或ZeroMqChannel)并且跟踪信息必须添加到消息中时,这更有意义。因此,IntegrationObservation.PRODUCER观测基于MessageSenderContext,其中 Spring Integration 提供MutableMessage以允许后续的跟踪Propagator添加头,以便消费者可以使用它们; -
AbstractMessageHandler是一个CONSUMERspan 类型并使用IntegrationObservation.HANDLERAPI; -
SourcePollingChannelAdapter(从版本 6.5 开始)作为流的入站端点,被视为CONSUMERspan 类型并使用IntegrationObservation.HANDLERAPI。
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 支持。