指标和管理
本节介绍如何捕获 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
:发送处理时间
(具有 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
:接收到的消息
消息处理程序操作的 Timer
指标具有以下名称或标签
-
name
:spring.integration.send
-
tag
:type:handler
-
tag
:name:<componentName>
-
tag
:result:(success|failure)
-
tag
:exception:(none|exception simple class name)
-
description
:发送处理时间
消息源的 Counter
指标具有以下名称/标签
-
name
:spring.integration.receive
-
tag
:type:source
-
tag
:name:<componentName>
-
tag
:result:success
-
tag
:exception:none
-
description
:接收到的消息
此外,还有三个 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 观察
从 6.0 版本开始,Spring Integration 利用 Micrometer 观察抽象,该抽象可以处理指标以及通过适当的 ObservationHandler
配置处理 跟踪。
只要应用程序上下文中存在 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。当通道是分布式实现(例如PublishSubscribeKafkaChannel
或ZeroMqChannel
)并且必须将跟踪信息添加到消息时,这样做更有意义。因此,IntegrationObservation.PRODUCER
观察基于MessageSenderContext
,其中 Spring Integration 提供MutableMessage
以允许后续跟踪Propagator
添加标头,以便它们可供使用者使用; -
AbstractMessageHandler
是CONSUMER
跨度类型,并使用IntegrationObservation.HANDLER
API。
可以通过 ObservationConvention
配置自定义 IntegrationManagement
组件上的观察生成。例如,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
。
在启动观察后添加的 KeyValues 可能会从 *.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
。
在启动观察后添加的 KeyValues 可能会从 *.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
。
在启动观察后添加的 KeyValues 可能会从 *.active 指标中丢失。 |
Micrometer 在内部使用 纳秒 作为基本单位。但是,每个后端都会确定实际的基本单位。(例如,Prometheus 使用秒) |
封闭类的完全限定名称 o.s.i.support.management.observation.IntegrationObservation
。
所有标签都必须以 spring.integration. 前缀开头! |
名称 |
描述 |
|
消息处理程序组件的名称。 |
|
组件的类型 - 'producer'。 |
可观察性 - 跨度
下面您可以找到此项目声明的所有跨度的列表。
网关跨度
入站消息网关的观察。
跨度名称 spring.integration.gateway
(由约定类 o.s.i.support.management.observation.DefaultMessageRequestReplyReceiverObservationConvention
定义)。
封闭类的完全限定名称 o.s.i.support.management.observation.IntegrationObservation
。
所有标签都必须以 spring.integration. 前缀开头! |
名称 |
描述 |
|
消息网关组件的名称。 |
|
请求/回复执行的结果。 |
|
组件的类型 - 'gateway'。 |
处理程序跨度
消息处理程序的观察。
跨度名称 spring.integration.handler
(由约定类 o.s.i.support.management.observation.DefaultMessageReceiverObservationConvention
定义)。
封闭类的完全限定名称 o.s.i.support.management.observation.IntegrationObservation
。
所有标签都必须以 spring.integration. 前缀开头! |
名称 |
描述 |
|
消息处理程序组件的名称。 |
|
组件的类型 - 'handler'。 |
生产者跨度
消息生产者的观察,例如通道。
跨度名称 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 支持。