https://docs.spring.io/spring-batch/docs/current/reference/html/monitoring-and-metrics.html を試す。
Spring Batch 4.2はMicrometerベースのメトリクスを自動的に収集する。なので、プロパティでそのメトリクスの送信設定をすれば、データがそちらに送られる。
ここではPrometheus Pushgatewayにメトリクスを送信する。
Prometheus Pushgatewayの準備
dockerで起動する。
docker run -d -p 9091:9091 prom/pushgateway
起動するとhttp://localhost:9091/#
でpushgatewayの画面が見れる。
コード
build.gradle。spring-batchに加えて、actuator, prometheus, pushgatewayクライアントの依存性を入れる。
plugins { id 'org.springframework.boot' version '2.3.0.RELEASE' id 'io.spring.dependency-management' version '1.0.9.RELEASE' id 'java' } configurations { developmentOnly runtimeClasspath { extendsFrom developmentOnly } compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } dependencies { implementation 'org.springframework.boot:spring-boot-starter-batch' implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'io.micrometer:micrometer-registry-prometheus' implementation 'io.prometheus:simpleclient_pushgateway' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation('org.springframework.boot:spring-boot-starter-test') { exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' } testImplementation 'org.springframework.batch:spring-batch-test' implementation 'com.h2database:h2' } test { useJUnitPlatform() }
src/main/resources/application.properties
でpushgateway関連の設定をする。とりあえず動いた、というレベルなので設定の詳細までは良く調べていない。
management.metrics.export.prometheus.pushgateway.enabled=true management.metrics.export.prometheus.pushgateway.grouping-key.app_name=demo-batch-hoge management.metrics.export.prometheus.pushgateway.job=demo-batch management.metrics.export.prometheus.pushgateway.shutdown-operation=push
適当にspring-batchのアプリを作る。
import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.repeat.RepeatStatus; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @EnableBatchProcessing @SpringBootApplication public class Main { @Bean public Job job(JobBuilderFactory jobs, @Qualifier("myjobstep1") Step s1) { return jobs.get("demo-batch-job").incrementer(new RunIdIncrementer()).start(s1).build(); } @Bean(name = "myjobstep1") public Step step1(StepBuilderFactory steps) { return steps.get("myjobstep1").tasklet((contribution, chunkContext) -> { System.out.println("hoge"); return RepeatStatus.FINISHED; }).build(); } public static void main(String[] args) { SpringApplication.run(Main.class, args); } }
実行後にhttp://localhost:9091/#
を見ると以下のようなメトリクスが確認できる。