この記事の概要
- バッチの起動監視をどうしようかと悩んでいた時にPushGatewayというものを見つけた
- 導入からPrometheusでメトリクスが見れるところまでをまとめてみた
構成
- PushGatewayとPrometheusはDockerで起動
- 仕組みとしては
- BatchがPushGatewayにメトリクスを送信
- PrometheusがPushGatewayからメトリクスを取得
- すべてローカルに存在するものとして進めます
PushGateway構築
※Dockerが使える環境は整っている前提です
起動
docker pull prom/pushgateway
docker run -d \
-p 9091:9091 \
--name pushgateway \
prom/pushgateway
-d : デタッチドモードで起動。あまり詳しくないのでバックグラウンドで実行しれくれるくらいの認識
-p : ポートフォワードの設定
-name : コンテナ名の指定
動作確認
-
http://localhost:9091
にアクセス

バッチ(雑)の作成
build.gradle
apply plugin: 'java'
repositories {
mavenCentral()
}
dependencies {
compile('io.prometheus:simpleclient_pushgateway:0.6.0')
}
SampleBatch.java
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class SampleBatch {
public static void main(String[] args) {
String url = "localhost:9091";
PushGateway pushGateway = new PushGateway(url);
long now = System.currentTimeMillis();
// メトリクスを収集(ここでは起動時間としてシステムミリ秒をセット)
CollectorRegistry registry = new CollectorRegistry();
Gauge lastStartAt = Gauge.build()
.name("batch_start_time")
.help("batch start time")
.register(registry);
lastStartAt.set(now);
// メトリクスにタグを設定
Map<String, String> key = new HashMap<>();
key.put("tagName", "tagValue");
try {
// メトリクスを登録
pushGateway.pushAdd(registry, "sample-batch", key);
} catch (IOException e) {
// 例外処理
e.printStackTrace();
}
}
}
実行!
- 実行後、PushGatewayのUIを見てみると、、、

Prometheusの構築
起動
prometheus.yml
# /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
alerting:
alertmanagers:
- static_configs:
- targets:
rule_files:
scrape_configs:
- job_name: 'pushgateway'
scrape_interval: 1m
metrics_path: /metrics
static_configs:
- targets: ['localhost:9091']
docker pull prom/prometheus
docker run -d \
-p 9090:9090 \
-v prometheus.yml:/etc/prometheus/prometheus.yml \
--name prometheus \
prom/prometheus
動作確認
- UI(
http://localhost:9090
)で確認

実際の運用
- 現場ではGrafanaを用いて可視化&アラートを飛ばしている