指标和管理

本节介绍如何捕获 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 添加到应用程序上下文。

对于每个 MessageHandlerMessageChannel,都会注册计时器。对于每个 MessageSource,都会注册一个计数器。

这仅适用于扩展 AbstractMessageHandlerAbstractMessageChannelAbstractMessageSource 的对象(大多数框架组件都是这种情况)。

消息通道上发送操作的 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。当通道是分布式实现(例如 PublishSubscribeKafkaChannelZeroMqChannel)并且需要将跟踪信息添加到消息时,这样做更有意义。因此,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.为前缀!
表 1. 低基数键

名称

描述

spring.integration.name (必填)

消息网关组件的名称。

spring.integration.outcome (必填)

请求/回复执行的结果。

spring.integration.type (必填)

组件类型 - '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.为前缀!
表 2. 低基数键

名称

描述

spring.integration.name (必填)

消息处理程序组件的名称。

spring.integration.type (必填)

组件类型 - '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.为前缀!
表 3. 低基数键

名称

描述

spring.integration.name (必填)

消息处理程序组件的名称。

spring.integration.type (必填)

组件类型 - 'producer'。

可观察性 - 跨度

以下列出了此项目声明的所有跨度。

网关跨度

入站消息网关的观察。

跨度名称 spring.integration.gateway(由约定类o.s.i.support.management.observation.DefaultMessageRequestReplyReceiverObservationConvention定义)。

封闭类的完全限定名称 o.s.i.support.management.observation.IntegrationObservation

所有标签必须以spring.integration.为前缀!
表 4. 标签键

名称

描述

spring.integration.name (必填)

消息网关组件的名称。

spring.integration.outcome (必填)

请求/回复执行的结果。

spring.integration.type (必填)

组件类型 - 'gateway'。

处理程序跨度

消息处理程序的观察。

跨度名称 spring.integration.handler(由约定类o.s.i.support.management.observation.DefaultMessageReceiverObservationConvention定义)。

封闭类的完全限定名称 o.s.i.support.management.observation.IntegrationObservation

所有标签必须以spring.integration.为前缀!
表 5. 标签键

名称

描述

spring.integration.name (必填)

消息处理程序组件的名称。

spring.integration.type (必填)

组件类型 - 'handler'。

生产者跨度

消息生产者的观察,例如通道。

跨度名称 spring.integration.producer(由约定类o.s.i.support.management.observation.DefaultMessageSenderObservationConvention定义)。

封闭类的完全限定名称 o.s.i.support.management.observation.IntegrationObservation

所有标签必须以spring.integration.为前缀!
表 6. 标签键

名称

描述

spring.integration.name (必填)

消息处理程序组件的名称。

spring.integration.type (必填)

组件类型 - 'producer'。

可观察性 - 约定

以下列出了本项目声明的所有GlobalObservationConventionObservationConvention

表 7. ObservationConvention 实现

ObservationConvention 类名

适用 ObservationContext 类名

o.s.i.support.management.observation.DefaultMessageReceiverObservationConvention

MessageReceiverContext

o.s.i.support.management.observation.MessageReceiverObservationConvention

MessageReceiverContext

o.s.i.support.management.observation.DefaultMessageRequestReplyReceiverObservationConvention

MessageRequestReplyReceiverContext

o.s.i.support.management.observation.MessageRequestReplyReceiverObservationConvention

MessageRequestReplyReceiverContext

o.s.i.support.management.observation.DefaultMessageSenderObservationConvention

MessageSenderContext

o.s.i.support.management.observation.MessageSenderObservationConvention

MessageSenderContext

观测传播

为了在一个跟踪中提供一个连接的跨度链,独立于消息流的性质,即使MessageChannel是持久且分布式的,也必须在此通道及其消费者(订阅者)上启用观测。这样,跟踪信息在传播到消费者线程或持久到数据库之前存储在消息头中。这是通过上面提到的MessageSenderContext完成的。消费者(一个MessageHandler)端使用MessageReceiverContext从这些头中恢复跟踪信息,并启动一个新的子Observation

Spring Integration JMX 支持

另请参阅JMX 支持