フェデレーション
フェデレーションにより、Prometheusサーバーは、別のPrometheusサーバーから選択された時系列をスクレイピングできます。
ネイティブヒストグラム(実験的機能)に関する注意: フェデレーションを介してネイティブヒストグラムをスクレイピングするには、スクレイピング側のPrometheusサーバーがネイティブヒストグラムを有効にして実行されている必要があります(コマンドラインフラグ `--enable-feature=native-histograms` を使用)。これは、protobuf形式がスクレイピングに使用されることを意味します。フェデレートされたメトリックに、同じメトリック名に対して異なるサンプルタイプ(float64、カウンタヒストグラム、ゲージヒストグラム)が混在している場合、フェデレーションペイロードには、同じ名前(ただし異なるタイプ)を持つ複数のメトリックファミリーが含まれます。技術的には、これはprotobufの公開形式のルールに違反しますが、Prometheusはそれでもすべてのメトリックを正しく取り込むことができます。
ユースケース
フェデレーションにはさまざまなユースケースがあります。一般的には、スケーラブルなPrometheus監視設定を実現するため、またはあるサービスのPrometheusから関連するメトリックを別のサービスにプルするために使用されます。
階層的フェデレーション
階層的フェデレーションにより、Prometheusは数十のデータセンターと数百万のノードを持つ環境に拡張できます。このユースケースでは、フェデレーションのトポロジはツリーに似ており、上位のPrometheusサーバーは、多数の下位サーバーから集約された時系列データを収集します。
例えば、多くのデータセンターごとのPrometheusサーバーが詳細なデータ(インスタンスレベルのドリルダウン)を収集し、グローバルなPrometheusサーバーのセットが、それらのローカルサーバーから集約されたデータ(ジョブレベルのドリルダウン)のみを収集および保存する設定が考えられます。これにより、集約されたグローバルビューと詳細なローカルビューの両方が提供されます。
サービス間フェデレーション
サービス間フェデレーションでは、あるサービスのPrometheusサーバーが、別のサービスのPrometheusサーバーから選択されたデータをスクレイピングするように設定され、単一のサーバー内で両方のデータセットに対するアラートとクエリを可能にします。
たとえば、複数のサービスを実行するクラスタスケジューラは、クラスタ上で実行されているサービスインスタンスに関するリソース使用量情報(メモリやCPU使用量など)を公開する場合があります。一方、そのクラスタ上で実行されているサービスは、アプリケーション固有のサービスメトリックのみを公開します。これらの2つのメトリックセットは、通常、別々のPrometheusサーバーによってスクレイピングされます。フェデレーションを使用すると、サービスレベルのメトリックを含むPrometheusサーバーは、クラスタのPrometheusからその特定のサービスに関するクラスタリソース使用量メトリックをプルできるため、両方のメトリックセットをそのサーバー内で使用できます。
フェデレーションの構成
任意のPrometheusサーバーでは、`/federate` エンドポイントにより、そのサーバー内の選択された時系列の現在の値を取得できます。公開する時系列を選択するには、少なくとも1つの `match[]` URLパラメータを指定する必要があります。各 `match[]` 引数は、`up` や `{job="api-server"}` のようなインスタントベクトルセレクタを指定する必要があります。複数の `match[]` パラメータが指定された場合、一致するすべての時系列の和集合が選択されます。
あるサーバーから別のサーバーにメトリックをフェデレートするには、宛先のPrometheusサーバーを、ソースサーバーの `/federate` エンドポイントからスクレイピングするように設定し、同時に `honor_labels` スクレイピングオプション(ソースサーバーによって公開されたラベルを上書きしないようにするため)を有効にし、目的の `match[]` パラメータを渡します。例えば、以下の `scrape_configs` は、`source-prometheus-{1,2,3}:9090` にあるPrometheusサーバーから、ラベル `job="prometheus"` またはメトリック名が `job:` で始まる任意の時系列を、スクレイピング側のPrometheusにフェデレートします。
scrape_configs:
- job_name: 'federate'
scrape_interval: 15s
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job="prometheus"}'
- '{__name__=~"job:.*"}'
static_configs:
- targets:
- 'source-prometheus-1:9090'
- 'source-prometheus-2:9090'
- 'source-prometheus-3:9090'