このバージョンはまだ開発中であり、まだ安定しているとは見なされていません。最新の安定バージョンについては、Spring Batch ドキュメント 6.0.6 を使用してください!

Micrometer サポート

監視とメトリクス

バージョン 4.2 以降、Spring Batch は Micrometer (英語) に基づいたバッチ監視およびメトリクスのサポートを提供します。このセクションでは、すぐに使用できるメトリクスと、カスタムメトリクスの提供方法について説明します。

組み込みメトリクス

メトリクス収集はデフォルトで無効になっています。有効にするには、アプリケーションコンテキストで Micrometer、ObservationRegistry、Bean を定義する必要があります。通常は、使用する ObservationHandler を定義する必要があります。次の例は、MeterRegistry (たとえば Prometheus レジストリ)にメトリクスを保存する DefaultMeterObservationHandler を登録する方法を示しています。

@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

ジョブ起動数

なし

ジョブとステップの status タグは終了ステータスと同じです。アイテムの読み取り、処理、書き込みの場合、この status タグは SUCCESS または FAILURE のいずれかになります。

観測登録簿の選択

By default, Spring Batch uses the ObservationRegistry bean of the application context for the job operator and for all jobs and steps. You can use a different registry for a specific job or step by setting it on its builder:

@Bean
public Job job(JobRepository jobRepository, Step step) {
    return new JobBuilder("job", jobRepository)
            .observationRegistry(myJobObservationRegistry)
            .start(step)
            .build();
}

@Bean
public Step step(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
    return new StepBuilder("step", jobRepository)
            .tasklet(new MyTasklet(), transactionManager)
            .observationRegistry(myStepObservationRegistry)
            .build();
}

次の規則が適用されます。

  • An observation registry that is set explicitly on a job, a step, or the job operator is never replaced by the one of the application context.

  • To disable observations for a specific job or step, set ObservationRegistry.NOOP on it. This is treated as an explicit choice, like any other registry.

  • Jobs, steps, and job operators without an explicit observation registry use the ObservationRegistry bean of the application context, if there is one. Otherwise, no observations are created.

  • If the application context contains several ObservationRegistry beans, mark one of them as @Primary to use it by default. Without a primary bean, no registry is applied by default (and a warning is logged), so only the artifacts with an explicit registry are observed.

  • For the job operator, you can also use the observationRegistryRef attribute of @EnableBatchProcessing, or override the getObservationRegistry() method of DefaultBatchConfiguration, to select a specific registry.

カスタムメトリクス

カスタムコンポーネントで独自のメトリクスを使用する場合は、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 を介してトレース機能を提供します。デフォルトでは、トレースは無効になっています。有効にするには、DefaultTracingObservationHandler などの TracingObservationHandler で構成された ObservationRegistry Bean を定義する必要があります。次の例では、上記のメトリクスハンドラーの隣にこれを登録し、同じレジストリでメトリクスとトレースの両方を収集します。

@Bean
public ObservationRegistry observationRegistry(MeterRegistry meterRegistry, Tracer tracer) {
    DefaultMeterObservationHandler observationHandler = new DefaultMeterObservationHandler(meterRegistry);
    ObservationRegistry observationRegistry = ObservationRegistry.create();
    observationRegistry.observationConfig()
            .observationHandler(new DefaultTracingObservationHandler(tracer))
            .observationHandler(new TracingAwareMeterObservationHandler<>(observationHandler, tracer));
    return observationRegistry;
}
TracingAwareMeterObservationHandler はスパンを作成しません。トレースデータ(たとえば、サンプルデータ)を利用できるようにするために MeterObservationHandler をラップするため、TracingObservationHandler も登録する必要があります。

これを設定すると、Spring Batch はジョブ実行ごとにトレースを作成し、ステップ実行ごとにスパンを作成します。

EnableBatchProcessing または DefaultBatchConfiguration を使用しない場合は、アプリケーションコンテキストに BatchObservabilityBeanPostProcessor を登録する必要があります。これにより、明示的に設定されていない観測可能なバッチアーティファクトの Micrometer の観測レジストリが自動的に設定されます ( 観測登録簿の選択を参照)。