当前版本仍在开发中,尚不被视为稳定版本。最新稳定版请使用 Spring Batch 文档 6.0.2!

Micrometer 支持

监控与指标

从 4.2 版本开始,Spring Batch 提供了基于 Micrometer 的批处理监控与指标支持。 本节介绍了框架默认提供了哪些指标,以及如何贡献自定义指标。

内置指标

指标采集默认是关闭的。要启用它,你需要在应用上下文中定义一个 Micrometer ObservationRegistry Bean。通常还需要指定要使用哪个 ObservationHandler。下面的示例展示了如何注册 DefaultMeterObservationHandler,以便将指标存储到 MeterRegistry 中,例如 Prometheus registry:

@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

Step 执行耗时

name, job.name, status

spring.batch.step.active

LONG_TASK_TIMER

当前活跃的 Step

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

Chunk 写出耗时

job.name, step.name, status

spring.batch.job.launch.count

COUNTER

作业启动次数

N/A

作业和 Step 的 status 标签等同于退出状态。对于条目读取、处理和写出, 该 status 标签只能是 SUCCESSFAILURE

自定义指标

如果你希望在自定义组件中使用自己的指标,建议直接使用 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.x 版本开始,Spring Batch 通过 Micrometer 的 Observation API 提供追踪能力。 默认情况下,追踪是关闭的。要启用它,你需要定义一个 ObservationRegistry Bean,并为其配置支持追踪的 ObservationHandler,例如 TracingAwareMeterObservationHandler

@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 会为每次作业执行创建一个 trace, 并为每次 Step 执行创建一个 span。

如果你没有使用 EnableBatchProcessingDefaultBatchConfiguration,则需要在应用上下文中注册 BatchObservabilityBeanPostProcessor,它会自动为可观测的批处理组件设置 Micrometer 的 observation registry。