Micrometer 支持
监控与度量
自 4.2 版本以来,Spring Batch 基于 Micrometer 提供了批处理监控和度量支持。本节介绍开箱即用的度量以及如何贡献自定义度量。
内置度量
度量收集默认禁用。要启用它,您需要在应用程序上下文中定义一个 Micrometer ObservationRegistry bean。通常,您需要定义要使用的 ObservationHandler。以下示例演示如何注册一个 DefaultMeterObservationHandler,它将把度量存储在 MeterRegistry 中(例如,Prometheus 注册表):
@Bean
public ObservationRegistry observationRegistry(MeterRegistry meterRegistry) {
ObservationRegistry observationRegistry = ObservationRegistry.create();
observationRegistry.observationConfig()
.observationHandler(new DefaultMeterObservationHandler(meterRegistry));
return observationRegistry;
}
Spring Batch 特定度量以 spring.batch 为前缀注册。下表详细解释了所有度量:
度量名称 |
类型 |
描述 |
标签 |
|
|
作业执行时长 |
|
|
|
当前活跃的作业 |
|
|
|
步骤执行时长 |
|
|
|
当前活跃的步骤 |
|
|
|
项目读取时长 |
|
|
|
项目处理时长 |
|
|
|
块写入时长 |
|
|
|
作业启动计数 |
不适用 |
作业和步骤的 status 标签等于退出状态。对于项目读取、处理和写入,此 status 标签可以是 SUCCESS 或 FAILURE。 |
自定义度量
如果您想在自定义组件中使用自己的度量,我们建议直接使用 Micrometer API。以下是一个如何计时 Tasklet 的示例:
import io.micrometer.observation.Observation;
import io.micrometer.observation.ObservationRegistry;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
public class MyTimedTasklet implements Tasklet {
private ObservationRegistry observationRegistry;
public MyTimedTasklet(ObservationRegistry observationRegistry) {
this.observationRegistry = observationRegistry;
}
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
Observation observation = Observation.start("my.tasklet.step", this.observationRegistry);
try (Observation.Scope scope = observation.openScope()) {
// do some work
return RepeatStatus.FINISHED;
} catch (Exception e) {
// handle exception
observation.error(exception);
} finally {
observation.stop();
}
}
}
追踪
自 5 版本以来,Spring Batch 通过 Micrometer 的 Observation API 提供追踪。默认情况下,追踪是禁用的。要启用它,您需要定义一个配置了支持追踪的 ObservationHandler(例如 TracingAwareMeterObservationHandler)的 ObservationRegistry bean。
@Bean
public ObservationRegistry observationRegistry(MeterRegistry meterRegistry, Tracer tracer) {
DefaultMeterObservationHandler observationHandler = new DefaultMeterObservationHandler(meterRegistry);
ObservationRegistry observationRegistry = ObservationRegistry.create();
observationRegistry.observationConfig()
.observationHandler(new TracingAwareMeterObservationHandler<>(observationHandler, tracer));
return observationRegistry;
}
有了这些,Spring Batch 将为每个作业执行创建一个追踪,并为每个步骤执行创建一个 span。
如果您不使用 EnableBatchProcessing 或 DefaultBatchConfiguration,则需要在应用程序上下文中注册一个 BatchObservabilityBeanPostProcessor,它将自动在可观测的批处理工件中设置 Micrometer 的观察注册表。