|
如需使用最新稳定版本,请使用 Spring Integration 7.0.4! |
指标与管理
本节介绍如何为 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 添加到应用程序上下文中。
对于每个 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
(带有 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的数量。
可以通过提供 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,您可以在 MeterRegistry 中添加 MeterFilter,以防止部分或全部指标被注册。
您可以通过提供的任意属性(如 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 观测
从 6.0 版本开始,Spring Integration 利用 Micrometer Observation 抽象,可通过适当的 ObservationHandler 配置处理指标以及 链路追踪。
当应用程序上下文中存在 ObservationRegistry bean 且配置了 @EnableIntegrationManagement 时,IntegrationManagement 组件上的观察处理将被启用。
要自定义应被仪器化的组件集合,@EnableIntegrationManagement 注解上公开了 observationPatterns() 属性。
请参阅其 Javadoc 以了解模式匹配算法。
默认情况下,没有任何 IntegrationManagement 组件被配置为 ObservationRegistry Bean。
可以将其配置为 * 以匹配所有组件。 |
在这种情况下,指标并非独立收集,而是委托给在提供的 ObservationRegistry 上配置的适当 ObservationHandler。
以下 Spring Integration 组件均配备了观测逻辑,每个组件都有相应的约定:
-
MessageProducerSupport作为流程的入口端点,被视为1类型的span,并使用2 API; -
MessagingGatewaySupport` 是一个入站请求 - 响应端点,被视为
SERVER类型的跨度。 它使用IntegrationObservation.GATEWAYAPI; -
AbstractMessageChannel.send()操作是唯一生成消息的 Spring Integration API。 因此,它被视为PRODUCER跨度类型,并使用IntegrationObservation.PRODCUERAPI。 当通道是分布式实现(例如PublishSubscribeKafkaChannel或ZeroMqChannel)且需要向消息添加跟踪信息时,这样做更有意义。 因此,IntegrationObservation.PRODUCER观察基于MessageSenderContext,其中 Spring Integration 提供MutableMessage,以便后续的跟踪Propagator可以添加标头,从而使消费者能够使用这些标头; -
一个
AbstractMessageHandler是CONSUMER类型的 span,并使用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。
| 在启动 Observation 后添加的 KeyValues 可能会缺失于 *.active 指标中。 |
Micrometer 内部使用 nanoseconds 作为基本单位。然而,每个后端决定实际的基本单位。(即 Prometheus 使用秒) |
封闭类 o.s.i.support.management.observation.IntegrationObservation 的全限定名。
所有标签都必须以 spring.integration. 前缀开头! |
姓名 |
描述 |
|
消息网关组件的名称。 |
|
请求/响应执行的结果。 |
|
组件类型 - '网关'。 |
处理器
消息处理器的观察功能。
指标名称 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。
| 在启动 Observation 后添加的 KeyValues 可能会缺失于 *.active 指标中。 |
Micrometer 内部使用 nanoseconds 作为基本单位。然而,每个后端决定实际的基本单位。(即 Prometheus 使用秒) |
封闭类 o.s.i.support.management.observation.IntegrationObservation 的全限定名。
所有标签都必须以 spring.integration. 前缀开头! |
姓名 |
描述 |
|
消息处理组件的名称。 |
|
组件类型 - '处理器'。 |
生产者
为消息生产者(例如通道)提供的观察功能。
指标名称 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。
| 在启动 Observation 后添加的 KeyValues 可能会缺失于 *.active 指标中。 |
Micrometer 内部使用 nanoseconds 作为基本单位。然而,每个后端决定实际的基本单位。(即 Prometheus 使用秒) |
封闭类 o.s.i.support.management.observation.IntegrationObservation 的全限定名。
所有标签都必须以 spring.integration. 前缀开头! |
姓名 |
描述 |
|
消息处理组件的名称。 |
|
组件类型 - '生产者'。 |
可观测性 - 跨度
以下列出了本项目声明的所有 span。
网关跨度
入站消息网关的观测。
Span 名称 spring.integration.gateway(由约定类 o.s.i.support.management.observation.DefaultMessageRequestReplyReceiverObservationConvention 定义)。
封闭类 o.s.i.support.management.observation.IntegrationObservation 的全限定名。
所有标签都必须以 spring.integration. 前缀开头! |
姓名 |
描述 |
|
消息网关组件的名称。 |
|
请求/响应执行的结果。 |
|
组件类型 - '网关'。 |
处理器跨度
消息处理器的观察功能。
Span 名称 spring.integration.handler(由约定类 o.s.i.support.management.observation.DefaultMessageReceiverObservationConvention 定义)。
封闭类 o.s.i.support.management.observation.IntegrationObservation 的全限定名。
所有标签都必须以 spring.integration. 前缀开头! |
姓名 |
描述 |
|
消息处理组件的名称。 |
|
组件类型 - '处理器'。 |
生产者 Span
为消息生产者(例如通道)提供的观察功能。
Span 名称 spring.integration.producer(由约定类 o.s.i.support.management.observation.DefaultMessageSenderObservationConvention 定义)。
封闭类 o.s.i.support.management.observation.IntegrationObservation 的全限定名。
所有标签都必须以 spring.integration. 前缀开头! |
姓名 |
描述 |
|
消息处理组件的名称。 |
|
组件类型 - '生产者'。 |
可观测性 - 约定
以下列出了本项目声明的所有 GlobalObservationConvention 和 ObservationConvention。
ObservationConvention 类名 |
适用的 ObservationContext 类名 |
|
|
|
|
|
|
|
|
|
|
|
|
观测传播
为了在一条跟踪中提供连接的跨度链,无论消息流的性质如何,即使 MessageChannel 是持久化且分布式的,也必须在此通道以及该通道的消费者(订阅者)上启用观察功能。
通过这种方式,跟踪信息会被存储在消息头中,然后再传播到消费者线程或持久化到数据库中。
这是通过上述提到的 MessageSenderContext 完成的。
消费者(MessageHandler)端使用 MessageReceiverContext 从这些消息头中恢复跟踪信息,并启动一个新的子 Observation。
Spring Integration JMX 支持
另请参阅 JMX 支持。