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 前缀下。下表详细解释了所有指标:
| 指标名称 | 类型 | 描述 | 标签 |
|---|---|---|---|
spring.batch.job | TIMER | 作业执行时长 | name, status |
spring.batch.job.active | LONG_TASK_TIMER | 当前活跃的作业 | name |
spring.batch.step | TIMER | 步骤执行时长 | name, job.name, status |
spring.batch.step.active | LONG_TASK_TIMER | 当前活跃的步骤 | name |
spring.batch.item.read | TIMER | 项目读取时长 | job.name, step.name, status |
spring.batch.item.process | TIMER | 项目处理时长 | job.name, step.name, status |
spring.batch.chunk.write | TIMER | 块写入时长 | job.name, step.name, status |
spring.batch.job.launch.count | COUNTER | 作业启动次数 | N/A |
作业和步骤的 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 将为每次作业执行创建一个跟踪记录,并为每个步骤执行创建一个跨度。
如果你不使用 EnableBatchProcessing 或 DefaultBatchConfiguration,则需要在应用程序上下文中注册一个 BatchObservabilityBeanPostProcessor,它会在可观察的批处理构件中自动设置 Micrometer 的观察注册表。