Metrics and Management
本部分介绍如何获取 Spring Integration 的指标。在最近的版本中,我们更多地依赖于 Micrometer(请参见 [role="bare"][role="bare"]https://micrometer.io),并且我们计划在将来的版本中更多地使用 Micrometer。
Disabling Logging in High Volume Environments
您可以在主消息流中控制调试日志记录。在大量应用程序中,某些日志记录子系统对 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 Integration
Overview
从 5.0.3 版本开始,应用程序上下文中 @{33} @{32} 的存在触发了对 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
数目。
可以通过提供 @{35} 子类自定义由集成组件创建的 @{34} 的名称和标记。@{37} 测试用例显示了如何执行此操作的简单示例。您还可以通过在构建器子类上重载 @{36} 方法进一步自定义仪表。
从版本 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
Disabling Meters
默认情况下,在首次使用时会注册所有仪表。现在,有了 Micrometer,您可以将 @{38} 添加到 @{39} 以防止部分或全部仪表被注册。您可以使用任何提供的属性过滤出仪表(拒绝仪表),如 @{40}、@{41} 等。请参阅 Micrometer 文档中的 @{42} 以获取详细信息。
例如,对于给定:
@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 集成利用 Micrometer 观察抽象,该抽象可以通过适当的 @{43} 配置处理指标和 @{44}。
只要应用程序上下文中存在 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
。
以下是针对观察 API 支持的指标、跨度和约定:
Unresolved include directive in modules/ROOT/pages/metrics.adoc - include::partial$metrics.adoc[]
Unresolved include directive in modules/ROOT/pages/metrics.adoc - include::partial$spans.adoc[]
Unresolved include directive in modules/ROOT/pages/metrics.adoc - include::partial$conventions.adoc[]
Observation Propagation
若要提供跟踪中连接的跨度链,该链独立于消息流的性质(即使 MessageChannel
是持久且分布式的),也必须启用此通道上的观察以及此通道的使用者(订阅者)上的观察。这样,跟踪信息便会存储在消息头中,然后才传播到使用者线程或持久到数据库中。这通过前面提到的 MessageSenderContext
完成。使用 MessageReceiverContext
,使用者(MessageHandler
)端会从那些头中还原跟踪信息,然后启动新子 Observation
。
Spring Integration JMX Support
另请参见 JMX Support。