フェデレーション

フェデレーションにより、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'

このドキュメントはオープンソースです。問題点やプルリクエストを送信して、改善にご協力ください。