度量和管理
本节介绍如何为 Spring Integration 捕获指标。在最新版本中,我们更多地依赖于 Micrometer,并且计划在未来的版本中更多地使用 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 添加到应用程序上下文。
对于每个 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:队列通道的大小
和
-
name:spring.integration.channel.queue.remaining.capacity -
tag:type:channel -
tag:name:<componentName> -
description:队列通道的剩余容量
禁用仪表
默认情况下,所有仪表在首次使用时都会注册。现在,借助 Micrometer,您可以将 MeterFilter 添加到 MeterRegistry,以防止注册某些或所有仪表。您可以通过提供的任何属性(name、tag 等)过滤掉(拒绝)仪表。有关更多信息,请参阅 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 Observation
从版本 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.PRODUCERAPI。当通道是分布式实现(例如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。
以下是 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。
| 在启动观测后添加的键值可能会从 *.active 指标中缺失。 |
Micrometer 内部使用 纳秒 作为基本单位。但是,每个后端确定实际的基本单位。(即 Prometheus 使用秒) |
封闭类 o.s.i.support.management.observation.IntegrationObservation 的完全限定名称。
所有标签必须以 spring.integration. 前缀开头! |
名称 |
描述 |
|
消息网关组件的名称。 |
|
请求/回复执行的结果。 |
|
组件类型 - '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。
| 在启动观测后添加的键值可能会从 *.active 指标中缺失。 |
Micrometer 内部使用 纳秒 作为基本单位。但是,每个后端确定实际的基本单位。(即 Prometheus 使用秒) |
封闭类 o.s.i.support.management.observation.IntegrationObservation 的完全限定名称。
所有标签必须以 spring.integration. 前缀开头! |
名称 |
描述 |
|
消息处理器组件的名称。 |
|
组件类型 - '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。
| 在启动观测后添加的键值可能会从 *.active 指标中缺失。 |
Micrometer 内部使用 纳秒 作为基本单位。但是,每个后端确定实际的基本单位。(即 Prometheus 使用秒) |
封闭类 o.s.i.support.management.observation.IntegrationObservation 的完全限定名称。
所有标签必须以 spring.integration. 前缀开头! |
名称 |
描述 |
|
消息处理器组件的名称。 |
|
组件类型 - 'producer'。 |
可观测性 - Span
以下是本项目声明的所有 Span 列表。
网关 Span
入站消息网关的观察。
Span 名称 spring.integration.gateway (由约定类 o.s.i.support.management.observation.DefaultMessageRequestReplyReceiverObservationConvention 定义)。
封闭类 o.s.i.support.management.observation.IntegrationObservation 的完全限定名称。
所有标签必须以 spring.integration. 前缀开头! |
名称 |
描述 |
|
消息网关组件的名称。 |
|
请求/回复执行的结果。 |
|
组件类型 - 'gateway'。 |
处理器 Span
消息处理器的观察。
Span 名称 spring.integration.handler (由约定类 o.s.i.support.management.observation.DefaultMessageReceiverObservationConvention 定义)。
封闭类 o.s.i.support.management.observation.IntegrationObservation 的完全限定名称。
所有标签必须以 spring.integration. 前缀开头! |
名称 |
描述 |
|
消息处理器组件的名称。 |
|
组件类型 - 'handler'。 |
生产者 Span
消息生产者的观察,例如通道。
Span 名称 spring.integration.producer (由约定类 o.s.i.support.management.observation.DefaultMessageSenderObservationConvention 定义)。
封闭类 o.s.i.support.management.observation.IntegrationObservation 的完全限定名称。
所有标签必须以 spring.integration. 前缀开头! |
名称 |
描述 |
|
消息处理器组件的名称。 |
|
组件类型 - 'producer'。 |
可观测性 - 约定
您可以在下面找到此项目声明的所有 GlobalObservationConvention 和 ObservationConvention 列表。
ObservationConvention 类名 |
适用的 ObservationContext 类名 |
|
|
|
|
|
|
|
|
|
|
|
|
观察传播
为了在一个跟踪中提供连接的跨度链,独立于消息流的性质,即使 MessageChannel 是持久且分布式的,也必须在此通道及其消费方(订阅者)上启用观察。这样,跟踪信息在传播到消费者线程或持久化到数据库之前存储在消息头中。这是通过上述 MessageSenderContext 完成的。消费者(MessageHandler)端使用 MessageReceiverContext 从这些头中恢复跟踪信息并开始一个新的子 Observation。
Spring Integration JMX 支持
另请参阅 JMX 支持。