Spring Batch で Prometheus 向けメトリクスを作成
Spring Batch フレームワークを使って Prometheus で扱えるメトリクスを作成します。
構築手順
PushGateway
Spring Batch はエンドポイントを持たないため、java で作ったメトリクスを Prometheus がプルできるように別途エンドポイントを用意する必要があります。
下記docker-compose.yamlで PushGateway を起動すると、後述のバッチ処理で作られたメトリクスを取得する用のエンドポイントを提供してくれます:
services:
pushgateway:
container_name: nob-pushgateway
image: prom/pushgateway:latest
ports:
- 9091:9091
Spring Batch
cf. https://prometheus.github.io/client_java/exporters/pushgateway/
pom.xmlに PushGateway 向けの依存関係を追加します:
<!-- https://mvnrepository.com/artifact/io.prometheus/prometheus-metrics-core -->
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>prometheus-metrics-core</artifactId>
<version>1.3.4</version>
</dependency>
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>prometheus-metrics-exporter-pushgateway</artifactId>
<version>1.3.5</version>
</dependency>
PushGatewayクラスを Bean として宣言するコンフィグクラスを作成します:
@Configuration
public class PushGatewayConfig {
/**
* PushGatewayのアドレス
*/
private static final String PUSH_GATEWAY_ADDRESS = "localhost:9091";
@Bean
PushGateway pushGateway() {
return PushGateway.builder()
.address(PUSH_GATEWAY_ADDRESS)
.job("first-batch")
.build();
}
}
Writer クラスにてメトリクスの作成処理を実装します:
public class SampleMetricsWriter implements ItemWriter<Long> {
@Autowired
private PushGateway pushGateway;
private static Gauge gauge = Gauge.builder()
.name("data_processed")
.help("data processed in the last batch job run")
.labelNames("test1", "test2") // ラベルのキー
.register();
@Override
public void write(Chunk<? extends Long> chunk) throws Exception {
try {
gauge.labelValues("value1", "value2").set(Long.valueOf(chunk.getItems().get(0))); // ラベルの値およびメトリクスの値
} finally {
pushGateway.push();
}
}
}
動作確認手順
PushGateway を起動した上で Spring Batch を動かすと、上の例であればlocalhost:9091で PushGateway のページが確認できます。
また、localhost:9091/metricsにてメトリクスが取得できます。