定期的なスクレイプが困難なデータソース向けに、Pushgateway を使用してモニタリングデータを Managed Service for Prometheus にプッシュします。
ソリューション概要
Prometheus Server による定期的なスクレイプが不可能または望ましくない環境(ネットワーク接続が不安定な環境など)では、代わりに Pushgateway を使用できます。データソースはモニタリングデータを Pushgateway に送信し、Prometheus Server が定期的にそのデータを取得します。以下の手順に従ってください。
-
Pushgateway エンドポイントの取得: Managed Service for Prometheus コンソールから Pushgateway エンドポイントを取得します。
-
データのレポート: curl コマンドまたはオープンソース SDK を使用してデータをプッシュします。メトリックが Prometheus によって迅速かつ確実に収集・監視されることを保証します。
-
データ保護構成の追加(オプション): 標準の Pushgateway プロトコルにはデータ保護機能が含まれていません。Pushgateway SDK は Basic Auth のみをサポートしており、高度で標準化された認証方式を備えていません。Pushgateway エンドポイントを取得したクライアントであれば誰でもデータをプッシュできます。データを保護するには、Managed Service for Prometheus コンソールからトークンを取得し、標準的な JWT ベースの認証を実装してください。
前提条件
Prometheus インスタンス を作成済みである必要があります。詳細については、以下をご参照ください。
ステップ 1:Push Gateway エンドポイントの取得
Cloud Monitor コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。Instances ページが表示されます。
-
ページ上部のメニューバーで、ご利用の Prometheus インスタンスが存在するリージョンを選択します。対象クラスターの 操作 列で、設定 をクリックします。
-
設定 タブで、プッシュゲートウェイアドレス セクションを見つけ、パブリック URL をコピーします。
このセクションには プライベートネットワーク 向けの Push Gateway URL も提供されています。実際のネットワーク環境に応じて適切な URL を選択してください。
ステップ 2:データのレポート
V1 バージョン
オープンソース SDK を使用したデータのプッシュ
-
データプロトコルは現在、Text Format および Protobuf Delimited をサポートしています。Protobuf Text、Protobuf Compact-Text、OpenMetrics はサポートされていません。SDK は通常、Protobuf Delimited をデフォルトとしています。
-
メトリックの HELP メタデータは中国語文字をサポートしていません。HELP に中国語文字が含まれている場合、データレポートは失敗します。
以下の Go および Java の例は、オープンソース SDK を使用してメトリックをプッシュする方法を示しています。
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)
}
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");
}
-
オープンソース SDK を使用して Prometheus Monitoring コンソールから取得した Pushgateway エンドポイントを入力すると、システムは自動的に
/metrics/job/<JOB_NAME>{/<LABEL_NAME>/<LABEL_VALUE>}のようなサフィックスを追加します。オープンソース SDK を使用しない場合は、このサフィックスを自分で追加する必要があります。追加しないと、404 エラーが返されます。 -
Managed Service for Prometheus の共有テナントクラスターにデータをプッシュする場合、すべてのメトリックにラベル
tenant_userid=****を含める必要があります。タグ値は、当該メトリックが属する Alibaba Cloud アカウント ID(つまりルートアカウント ID)でなければなりません。これにより、メトリックの所有権を区別できます。
curl コマンドを使用したデータのプッシュ
リクエストタイプ application/x-www-form-urlencoded はサポートされていません。curl コマンドでは、ヘッダーに 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/job/job_name/label_key_1/label_value_1/label_key_2/label_value_2
-
URL に複数のラベルを追加できますが、URL の全長が制限内に収まるようにしてください。
-
URL 内の “job_name” は、実際のジョブ名に置き換えてください。
データ保護構成の追加(オプション)
-
トークンの取得: 左側のナビゲーションウィンドウで、設定 を選択します。設定 タブの Token セクションで、トークンの生成 をクリックします。
-
トークンの渡し方: トークンを生成したら、以下のいずれかの方法でトークンを渡します。
-
方法 1: クライアントのリクエストヘッダーにトークンを設定して、通常どおりデータをプッシュします。設定しない場合、書き込みリクエストは拒否されます。以下のヘッダー形式を使用します。
Authorization: Bearer <token> -
方法 2: Pushgateway SDK は Basic Auth のみをサポートしており、JWT をサポートしていません。SDK を認証付きで使用するには、BasicAuth インターフェイスを使用し、パスワードにトークンを設定します。サーバー側はこの認証方式をサポートしています。方法 1 は追加の開発作業が必要です。以下の例は Go SDK を使用しています。
pusher := push.New(url, "test"). Collector(completionTime).Client(http.DefaultClient). Grouping("key1", "test1").Grouping("key2", "dfdf/sdsd/"). .BasicAuth("admin", "actual token value"). Format(expfmt.FmtProtoDelim)
-
V2 バージョン
1. RAM ユーザーへの CMS 読み取り/書き込み権限の付与
ご利用の Alibaba Cloud Prometheus インスタンスが Alibaba Cloud アカウントによって作成されており、リモート読み取り/書き込み操作に RAM ユーザーの AccessKey ID および AccessKey Secret を使用する必要がある場合は、まずその RAM ユーザーに CMS 読み取り/書き込み権限を付与する必要があります。
-
Alibaba Cloud アカウントまたは RAM 管理者として Resource Access Management (RAM) コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
-
承認 ページで、権限を新規付与する をクリックします。権限を新規付与する ページで、以下のパラメーターを設定します。
パラメーター
説明
リソーススコープ
必要に応じてリソーススコープを選択します。
権限付与の対象
権限を付与する RAM ユーザーを選択します。
権限ポリシー
AliyunPrometheusMetricWriteAccess または AliyunCloudMonitorFullAccess を選択します。
-
OK をクリックし、次に 閉じる をクリックします。
2. データのプッシュ
オープンソース SDK を使用したデータのプッシュ
-
データプロトコルは現在、Text Format および Protobuf Delimited をサポートしています。Protobuf Text、Protobuf Compact-Text、OpenMetrics はサポートされていません。SDK は通常、Protobuf Delimited をデフォルトとしています。
-
メトリックの HELP メタデータは中国語文字をサポートしていません。HELP に中国語文字が含まれている場合、データレポートは失敗します。
以下の Go および Java の例は、オープンソース SDK を使用してメトリックをプッシュする方法を示しています。
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://k8s-log-c8b5d0a212ffa41cxxxx.cn-hangzhou.log.aliyuncs.com/prometheus/k8s-log-c8b5d0a212ffa41c0a5xxxx/aliyun-prom-c8b5d0a212ffa41c0xxxx/api/v1/pushgateway"
pusher := push.New(url, "test").
Collector(completionTime).Client(http.DefaultClient).
Grouping("key1", "test1").Grouping("key2", "dfdf/sdsd/").
BasicAuth("ak", "sk").
Format(expfmt.FmtProtoDelim)
if err := pusher.Push(); err != nil {
fmt.Println("Could not push completion time to PushGateway: ", err)
}
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://k8s-log-c8b5d0a212ffa41cxxxx.cn-hangzhou.log.aliyuncs.com/prometheus/k8s-log-c8b5d0a212ffa41c0a5xxxx/aliyun-prom-c8b5d0a212ffa41c0xxxx/api/v1/pushgateway"));
pg.setConnectionFactory(new BasicAuthHttpConnectionFactory("ak", "sk"));
pg.pushAdd(registry, "my_batch_job");
}
-
オープンソース SDK を使用して Prometheus Monitoring コンソールから取得した Pushgateway エンドポイントを入力すると、システムは自動的に
/metrics/job/<JOB_NAME>{/<LABEL_NAME>/<LABEL_VALUE>}のようなサフィックスを追加します。オープンソース SDK を使用しない場合は、このサフィックスを自分で追加する必要があります。追加しないと、404 エラーが返されます。 -
Managed Service for Prometheus の共有テナントクラスターにデータをプッシュする場合、すべてのメトリックにラベル
tenant_userid=****を含める必要があります。タグ値は、当該メトリックが属する Alibaba Cloud アカウント ID(つまりルートアカウント ID)でなければなりません。これにより、メトリックの所有権を区別できます。 -
API オペレーションはセキュリティトークンサービス (STS) 認証をサポートしています。この場合、BasicAuth のパスワードは
{AccessKey Secret}${STS Token}の形式を使用します。
curl コマンドを使用したデータのプッシュ
リクエストタイプ application/x-www-form-urlencoded はサポートされていません。curl コマンドでは、ヘッダーに Content-Type: text/plain; version=0.0.4; charset=utf-8 を指定してください。
echo "some_metric 3.14" | curl -u 'ak:sk' -H "Content-Type: text/plain; version=0.0.4; charset=utf-8" --data-binary @- https://k8s-log-c8b5d0a212ffa41cxxxx.cn-hangzhou.log.aliyuncs.com/prometheus/k8s-log-c8b5d0a212ffa41c0a5xxxx/aliyun-prom-c8b5d0a212ffa41c0xxxx/api/v1/pushgateway/metrics/job/job_name/label_key_1/label_value_1/label_key_2/label_value_2
-
URL に複数のラベルを追加できますが、URL の全長が制限内に収まるようにしてください。
-
URL 内の “job_name” は、実際のジョブ名に置き換えてください。
結果の確認
Grafana を使用して、データが正常にプッシュされたことを確認します。
-
ApiServer ダッシュボードへの移動: 左側のナビゲーションウィンドウで、ダッシュボードリスト を選択します。次に、ApiServer ダッシュボードのハイパーリンクをクリックします。ダッシュボードページにリダイレクトされます。
-
Explore を選択してデータを表示: ダッシュボードページで、左側のナビゲーションウィンドウの
アイコンにカーソルを合わせます。表示されたポップアップボックスで、Explore をクリックします。Explore ページの右側で、ドロップダウンメニューから対応する Explore インスタンスを選択し、データが正常にプッシュされたかどうかを確認します。Metrics フィールドにプッシュしたメトリック名(例:
db_backup_last_completion_timestamp_seconds)を入力します。Query type を Range に設定します。[実行] をクリック後、下部の Graph エリアに曲線が表示されれば、データは正常にプッシュされています。