このトピックでは、Managed Service for Prometheus が提供する Pushgateway 機能を使用してデータをプッシュする方法について説明します。
ソリューション概要
データソースが Prometheus サーバーによって定期的にプルできない、またはプルされるべきでない場合 (たとえば、ネットワーク接続が安定していない環境など) は、Pushgateway を使用できます。データソースはまずモニタリングデータを Pushgateway に送信し、その後、Prometheus サーバーが定期的にデータを取得します。手順は次のとおりです:
-
Pushgateway エンドポイントの取得:Managed Service for Prometheus コンソールから Pushgateway エンドポイントを取得します。
-
データのレポート:curl コマンドまたはオープンソース SDK を使用してデータをプッシュします。これにより、メトリックデータが Prometheus によって迅速かつ確実に収集および監視されるようになります。
-
データ保護設定の追加 (オプション):標準の Pushgateway プロトコルにはデータ保護機能が含まれていません。Pushgateway SDK は基本的な Basic 認証のみをサポートし、高度で標準化された認証機能がありません。これは、Pushgateway エンドポイントを取得したクライアントであれば誰でもデータをプッシュできることを意味します。データを保護するには、Managed Service for Prometheus コンソールからトークンを取得し、標準の JWT 認証を実装します。
前提条件
Prometheus インスタンスを作成済みであること。詳細については、以下をご参照ください:
ステップ 1:Push Gateway エンドポイントの取得
CloudMonitor コンソールにログインします。 左側のナビゲーションウィンドウで、を選択します。 [インスタンス] ページが表示されます。
-
ページ上部のメニューバーで、お使いの Prometheus インスタンスが存在するリージョンを選択し、送信先クラスターの 操作 列で 設定 をクリックします。
-
設定 タブで、プッシュゲートウェイアドレス セクションを見つけ、パブリック URL をコピーします。
このセクションのテーブルには、パブリックネットワークとプライベートネットワークの 2 行が含まれています。パブリック URL のフォーマットは
https://{regionId}.arms.aliyuncs.com/prometheus/{token}/{regionId}/api/v2で、プライベート URL のフォーマットはhttp://{regionId}-intranet.arms.aliyuncs.com/prometheus/{token}/{regionId}/api/v2です。
ステップ 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.", // DB バックアップが最後に成功したときのタイムスタンプ。
})
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 {
// ここにコードを記述します。
// これは成功後にのみレジストリに追加されるため、失敗時に Pushgateway での以前の成功が上書きされることはありません。
Gauge lastSuccess = Gauge.build()
.name("my_batch_job_last_success").help("Last time my batch job succeeded, in unixtime.").register(registry); // バッチジョブが最後に成功した時刻 (unixtime)。
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」を実際のジョブ名に置き換えてください。
データ保護設定の追加 (オプション)
-
トークンの取得: 左側のナビゲーションウィンドウで、設定 を選択します。設定 タブの [トークン] セクションで、トークンの生成 をクリックします。
-
トークンの受け渡し:トークンを生成した後、次のいずれかの方法でトークンを渡すことができます。
-
方法 1:クライアントのリクエストヘッダーにトークンを設定します。設定しない場合、システムは書き込みリクエストを拒否します。次のヘッダーフォーマットを使用します:
Authorization: Bearer <token> -
方法 2:Pushgateway SDK は基本的な Basic 認証のみをサポートし、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 バージョン
オープンソース 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.", // DB バックアップが最後に成功したときのタイムスタンプ。
})
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 {
// ここにコードを記述します。
// これは成功後にのみレジストリに追加されるため、失敗時に Pushgateway での以前の成功が上書きされることはありません。
Gauge lastSuccess = Gauge.build()
.name("my_batch_job_last_success").help("Last time my batch job succeeded, in unixtime.").register(registry); // バッチジョブが最後に成功した時刻 (unixtime)。
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 オペレーションは Security Token Service (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 インスタンスを選択し、データが正常にプッシュされたかどうかを確認します。