指标和管理
本节介绍如何捕获 Spring 集成的指标。在最近的版本中,我们更多地依赖 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)
-
描述
:发送处理时间
(失败
结果带有无
异常意味着通道的send()
操作返回了false
。)
可轮询消息通道上的接收操作的计数器
指标具有以下名称或标签
-
名称
:spring.integration.receive
-
tag
:type:channel
-
tag
:name:<componentName>
-
tag
:result:(success|failure)
-
tag
:exception:(none|exception simple class name)
-
描述
:接收到的消息
消息处理程序操作的计时器
指标具有以下名称或标签
-
name
:spring.integration.send
-
标签
:类型:处理程序
-
tag
:name:<componentName>
-
tag
:result:(success|failure)
-
tag
:exception:(none|exception simple class name)
-
描述
:发送处理时间
消息源的计数器
指标具有以下名称/标签
-
名称
:spring.integration.receive
-
标签
:类型:源
-
tag
:name:<componentName>
-
标签
:结果:成功
-
标签
:异常:无
-
描述
:接收到的消息
此外,还有三个仪表
指标
-
spring.integration.channels
: 应用程序中的消息通道
数量。 -
spring.integration.handlers
: 应用程序中的消息处理程序
数量。 -
spring.integration.sources
: 应用程序中的消息源
数量。
可以通过提供MicrometerMetricsCaptor
的子类来自定义集成组件创建的指标
的名称和标签。 MicrometerCustomMetricsTests 测试用例展示了如何执行此操作的简单示例。 您还可以通过重载构建器子类上的build()
方法来进一步自定义指标。
从版本 5.1.13 开始,QueueChannel
公开了用于队列大小和剩余容量的 Micrometer 仪表
-
名称
:spring.integration.channel.queue.size
-
tag
:type:channel
-
tag
:name:<componentName>
-
描述
:队列通道的大小
以及
-
名称
:spring.integration.channel.queue.remaining.capacity
-
tag
:type:channel
-
tag
:name:<componentName>
-
描述
:队列通道的剩余容量
禁用指标
默认情况下,所有指标在首次使用时都会注册。 现在,使用 Micrometer,您可以将MeterFilter
添加到MeterRegistry
以阻止某些或所有指标注册。 您可以通过提供的任何属性(名称
、标签
等)过滤掉(拒绝)指标。 有关更多信息,请参阅 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()
属性。 有关模式匹配算法,请参阅其 javadocs。
默认情况下,没有一个 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。
可以在 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
。
在启动观察后添加的 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 支持。