Discourse が Prometheus サーバーの IP を認識させる方法

こんにちは、皆さん!

これまでの理解では、Prometheus インスタンスが /metrics エンドポイントからデータを収集できるようにするには、DISCOURSE_PROMETHEUS_TRUSTED_IP_WHITELIST_REGEX を編集して、そのマシンの IP アドレスを許可リストに追加する必要があります。

これ以外の方法はありませんか?当社の Discourse インスタンスは Cloudflare の DNS プロキシの背後にあり、エンドユーザーの実際の IP アドレスを確認できません。できれば API キーを使ってこの問題を解決できればと考えていますが、Prometheus がデータを収集する際の制限により、それは難しいかもしれません。

それでは Discourse は正しく動作しておらず、Cloudflare 用のテンプレートを追加する必要があります。

それは有効なアプローチだと思います。試されましたか?ただ、Grafana がヘッダーにキーを挿入できるかどうかは疑問です。そのため、私は当初この機能を追加しました。

「いいね!」 1

では、Discourse が壊れており、Cloudflare のテンプレートを追加する必要があります。

ああ、「Cloudflare のテンプレート」とはどういう意味ですか?

それは機能すると思います。試されましたか?ああ、でも Grafana がヘッダーにキーを挿入することはできないと思うので、私が最初にこの機能を追加した理由でもあります。

はい、試しました。Prometheus は依然として、スクレイパー設定で任意のヘッダーを許可していません。そのため、Prometheus サーバーの IP アドレスをホワイトリストに登録できない場合(私のケースではそれが不可能です)、Prometheus で Discourse のメトリクスを取り込む方法はありません。

おそらく、Cloudflare などのプロキシの背後で Discourse インスタンスを運用している他の人々もいるでしょう。その前提を踏まえると、エクスポートを少し調整する必要があると信じています。

Discourse の API は、HTTP 基本認証(Prometheus スクレイパーサブシステムでサポートされています)のような「ある程度標準化された」ものではなく、独自の Api-KeyApi-Username ヘッダーを使用します。そのため、私の設定ではこれを利用する方法が本当にありません。

検索する必要があります。テンプレートディレクトリ内に見つけられれば、それを app.yml に追加してください。

「いいね!」 1

ありがとうございます!

cloudflare.template.yml を有効にしました。 :slight_smile: しかし、私の理解が正しければ、これは Cloudflare の IP アドレスからのトラフィックに対するレート制限を無効にするためだけのものでした。

現時点での私の Prometheus 設定は以下の通りです。

scrape_configs:
        - job_name: forum
          scrape_interval: 5s
          scheme: https
          static_configs:
                  - targets:
                          - forum-behind-cloudflare-dns-proxy.com

さて、私が直面している問題は、Discourse がリクエストの実際の IP アドレスを認識できないことです。そのため、許可リスト方式を機能させるために、以下の試みを行いました。

  1. app.yml 内の環境変数 DISCOURSE_PROMETHEUS_TRUSTED_IP_WHITELIST_REGEX に、Prometheus サーバーの IPv6 アドレスを追加しました。
  2. Prometheus サーバー上の /etc/hosts に、フォーラムの実際の IPv6 アドレスをハードコードしました。これで、フォーラムは私の Prometheus サーバーの IP アドレスを認識し、アクセスを許可するようになりました。 :slight_smile:

しかし、他にもいくつかの問題があります。例えば、Prometheus をコンテナ内で実行しているため、ホストの /etc/hosts がコンテナ内部で共有されていません。その結果、フォーラムのアドレスが Cloudflare の IP に解決され続け、認証中にエラーが発生します。

Prometheus の起動時に -v /etc/hosts:/etc/hosts を指定してホストの /etc/hosts を Docker コンテナに共有することもできますが、その場合、以下のようなエラーが発生します。

Get "https://forum-behind-cloudflare-dns-proxy.com:443/metrics": dial tcp [<ipv6-address>]:443: connect: cannot assign requested address

今後は、この問題を解決する必要があります。

編集 #1: これも解決できました。Docker コンテナ内で IPv6 が無効化されていました。Docker コンテナで IPv6 を有効にするか、単に --net=host を指定することで修正できます。

リバースプロキシの背後におられますか?実際のリモートホストが Discourse に到達できるよう、nginx の設定を行う必要があります。Discourse と同じマシン上で他のウェブサイトを実行するという記事が、その解決策の手がかりになるかもしれません。

「いいね!」 1

Discourse のインスタンスは確かにリバースプロキシの背後で動作しています。このリバースプロキシは Cloudflare が提供しており、現在は Pro プランのみの利用のため、Cloudflare から Discourse インスタンスへ実際のクライアント IP を渡すオプションがありません。いずれにせよ、私の問題は既に解決しました :slight_smile:

Grafana のダッシュボードは、現時点で更新されるべきでしょう。時間の経過とともに Prometheus エクスプローターが更新され、特定のメトリクスを送信しなくなったにもかかわらず、Grafana のダッシュボードはそれら(現在存在しない)メトリクスの値を読み取るように設定されたままになっています。

「いいね!」 1