监控与指标

自 4.2 版本以来,Spring Batch 基于 Micrometer 提供了批处理监控和指标支持。本节介绍框架提供的内置指标以及如何贡献自定义指标。

内置指标

指标收集不需要任何特定配置。框架提供的所有指标都注册在 Micrometer 的全局注册表(global registry)中,使用 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

块写入持续时间

job.name, step.name, status

status 标签可以是 SUCCESSFAILURE

自定义指标

如果您想在自定义组件中使用自己的指标,我们建议直接使用 Micrometer API。以下是一个如何对 Tasklet 进行计时(timing)的示例:

import io.micrometer.core.instrument.Metrics;
import io.micrometer.core.instrument.Timer;

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 {

	@Override
	public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
		Timer.Sample sample = Timer.start(Metrics.globalRegistry);
		String status = "success";
		try {
			// do some work
		} catch (Exception e) {
			// handle exception
			status = "failure";
		} finally {
			sample.stop(Timer.builder("my.tasklet.timer")
					.description("Duration of MyTimedTasklet")
					.tag("status", status)
					.register(Metrics.globalRegistry));
		}
		return RepeatStatus.FINISHED;
	}
}

禁用指标

指标收集与日志记录类似。禁用日志通常通过配置日志库来完成,指标也是如此。Spring Batch 没有禁用 Micrometer 指标的功能。这应该在 Micrometer 端完成。由于 Spring Batch 使用 spring.batch 前缀将指标存储在 Micrometer 的全局注册表(global registry)中,您可以使用以下代码片段配置 Micrometer 忽略或拒绝批处理指标:

Metrics.globalRegistry.config().meterFilter(MeterFilter.denyNameStartsWith("spring.batch"))

有关更多详细信息,请参阅 Micrometer 的参考文档