バッチジョブ、短期間実行プロセス、およびネットワーク分離環境では、Prometheus によるスクレイプ用に安定した HTTP エンドポイントを公開できません。Pushgateway は、こうした課題を解決するために、メトリックデータのプッシュを受け付け、Prometheus サーバーが通常のスクレイプ間隔でプルできる状態で保持します。Managed Service for Prometheus では、ネットワークトポロジーを変更せずに、これらのデータソースからメトリックを収集するために Pushgateway をご使用ください。
仕組み
データソースが Pushgateway へメトリックをプッシュし、Prometheus サーバーが定期的に Pushgateway からデータをプルします。
この構成を設定するには、以下の手順を実行します。
Pushgateway エンドポイントを取得する Managed Service for Prometheus コンソールから。
[メトリックデータのプッシュ] を curl または Pushgateway SDK(Go、Java)を使用して実行します。
[オプション] トークン認証の有効化:プッシュ可能なユーザーを制限します。
前提条件
開始する前に、以下を確認してください。
モニタリング対象の Prometheus インスタンスが存在すること。作成方法については、以下をご参照ください。
サポートされるデータ形式
| 形式 | ステータス |
|---|---|
| テキスト形式 | サポート済み |
| Protobuf デリミテッド形式 | サポート済み(SDK のデフォルト) |
| Protobuf テキスト形式 | 非サポート |
| Protobuf コンパクトテキスト形式 | 非サポート |
| OpenMetrics | 非サポート |
メトリックのメタデータ内の Help フィールドでは、中国語文字はサポートされていません。このフィールドに中国語文字を含むメトリックをプッシュすると、データ報告が失敗します。
手順 1:Pushgateway エンドポイントの取得
ARMS コンソール にログインします。左側ナビゲーションウィンドウで、Managed Service for Prometheus → インスタンス を選択します。
Prometheus インスタンスの名前をクリックして、詳細ページを開きます。

左側ナビゲーションウィンドウで、設定項目 をクリックします。設定項目 タブの Push Gateway URL セクションから、パブリック URL をコピーします。

手順 2:メトリックデータのプッシュ
Pushgateway SDK または curl を使用してメトリックデータをプッシュします。
Pushgateway SDK の使用
以下のすべての SDK サンプルは、手順 1 で取得した Pushgateway エンドポイントにメトリックをプッシュします。SDK は自動的に、/metrics/job/<JOB_NAME>{/<LABEL_NAME>/<LABEL_VALUE>} 形式の URL サフィックスを追加します。
オープンソースの Pushgateway SDK を使用しない場合は、このサフィックスを手動で追加してください。追加しないと、404 エラーが返されます。
Go
completionTime := prometheus.NewGauge(prometheus.GaugeOpts{
Name: "db_backup_last_completion_timestamp_seconds",
Help: "The timestamp of the last successful completion of a DB backup.",
})
completionTime.SetToCurrentTime()
url := "https://cn-hangzhou.arms.aliyuncs.com/prometheus/52b12ea9cf4bb9e35****/16727530178****/1df8lj***/cn-hangzhou/api/v2"
pusher := push.New(url, "test").
Collector(completionTime).Client(http.DefaultClient).
Grouping("key1", "test1").Grouping("key2", "dfdf/sdsd/").
Format(expfmt.FmtProtoDelim)
if err := pusher.Push(); err != nil {
fmt.Println("Could not push completion time to PushGateway: ", err)
}url の値を、コンソールから取得した Pushgateway エンドポイントに置き換えてください。
Java
CollectorRegistry registry = new CollectorRegistry();
Gauge duration = Gauge.build()
.name("my_batch_job_duration_seconds")
.help("Duration of my batch job in seconds.")
.register(registry);
Gauge.Timer durationTimer = duration.startTimer();
try {
// Your code here.
// This is only added to the registry after success,
// so that a previous success in the Pushgateway isn't overwritten on failure.
Gauge lastSuccess = Gauge.build()
.name("my_batch_job_last_success")
.help("Last time my batch job succeeded, in unixtime.")
.register(registry);
lastSuccess.setToCurrentTime();
} finally {
durationTimer.setDuration();
PushGateway pg = new PushGateway(new URL(
"https://cn-hangzhou.arms.aliyuncs.com/prometheus/52b12ea9cf4bb9e35****/16727530178****/1df8lj***/cn-hangzhou/api/v2"
));
pg.pushAdd(registry, "my_batch_job");
}new PushGateway(new URL(...)) 内の URL を、コンソールから取得した Pushgateway エンドポイントに置き換えてください。
curl の使用
コンテンツタイプが application/x-www-form-urlencoded のリクエストはサポートされていません。リクエストヘッダーに Content-Type: text/plain; version=0.0.4; charset=utf-8 を設定してください。
echo "some_metric 3.14" | curl -H "Content-Type: text/plain; version=0.0.4; charset=utf-8" \
--data-binary @- \
https://cn-hangzhou.arms.aliyuncs.com/prometheus/51bbea9ck41b9e35****/16727530178****/1df8lj***/cn-hangzhou/api/v2/metrics/label_key_1/label_value_1/label_key_2/label_value_2URL を、コンソールから取得した Pushgateway エンドポイントに置き換えてください。URL パスの末尾に、キーと値のペアとしてラベルを追加します。URL 全体の長さは、適切な範囲内に保ってください。
マルチテナントクラスターへのプッシュ
複数のテナントが共有するクラスターにメトリックデータをプッシュするには、各メトリックに tenant_userid=**** タグをアタッチします。タグ値には、そのメトリックを所有する Alibaba Cloud アカウント ID を指定します。
手順 3(オプション):トークン認証による Pushgateway のセキュア化
デフォルトでは、Pushgateway エンドポイントを知っているクライアントであれば誰でもデータをプッシュできます。アクセスを制限するには、JSON Web トークン(JWT)を生成し、すべてのリクエストに含めてください。
トークンの生成
左側のナビゲーションウィンドウで、[設定項目] をクリックします。
設定項目 タブの トークン セクションで、トークンの生成 をクリックします。

リクエストへのトークンの付与
トークンを含めるには、以下のいずれかの方法をご使用ください。
方法 1:リクエストヘッダーへの追加
すべてのプッシュリクエストの Authorization ヘッダーに JWT を追加します。有効なトークンを含まないリクエストは拒否されます。

方法 2:BasicAuth(SDK 対応)の使用
方法 1 は開発コストの増加を招く可能性があります。代わりに、Pushgateway SDK は BasicAuth をサポートしていますが、JWT は直接サポートしていません。この制約を回避するため、パスワードフィールドにトークン値を設定することで、BasicAuth インターフェイス経由でトークンを渡すことができます。サーバーはこの方法を許容します。
pusher := push.New(url, "test").
Collector(completionTime).Client(http.DefaultClient).
Grouping("key1", "test1").Grouping("key2", "dfdf/sdsd/").
BasicAuth("admin", "<your-token-value>").
Format(expfmt.FmtProtoDelim)<your-token-value> を、コンソールで生成したトークンに置き換えてください。
結果の確認
Grafana でクエリを実行し、メトリックデータが正しく到着していることを確認します。
左側ナビゲーションウィンドウで、ダッシュボード をクリックし、次に ApiServer をクリックします。
左側ナビゲーションウィンドウの
アイコンにマウスを合わせて、Explore をクリックします。ドロップダウンリストからご利用のリソースを選択し、プッシュしたメトリックをクエリします。
