ishan
(Ishan Jain)
2020 年 6 月 26 日午後 8:29
1
こんにちは、皆さん!
これまでの理解では、Prometheus インスタンスが /metrics エンドポイントからデータを収集できるようにするには、DISCOURSE_PROMETHEUS_TRUSTED_IP_WHITELIST_REGEX を編集して、そのマシンの IP アドレスを許可リストに追加する必要があります。
これ以外の方法はありませんか?当社の Discourse インスタンスは Cloudflare の DNS プロキシの背後にあり、エンドユーザーの実際の IP アドレスを確認できません。できれば API キーを使ってこの問題を解決できればと考えていますが、Prometheus がデータを収集する際の制限により、それは難しいかもしれません。
pfaffman
(Jay Pfaffman)
2020 年 6 月 26 日午後 9:05
2
それでは Discourse は正しく動作しておらず、Cloudflare 用のテンプレートを追加する必要があります。
それは有効なアプローチだと思います。試されましたか?ただ、Grafana がヘッダーにキーを挿入できるかどうかは疑問です。そのため、私は当初この機能を追加しました。
「いいね!」 1
ishan
(Ishan Jain)
2020 年 6 月 27 日午前 6:21
3
では、Discourse が壊れており、Cloudflare のテンプレートを追加する必要があります。
ああ、「Cloudflare のテンプレート」とはどういう意味ですか?
それは機能すると思います。試されましたか?ああ、でも Grafana がヘッダーにキーを挿入することはできないと思うので、私が最初にこの機能を追加した理由でもあります。
はい、試しました。Prometheus は依然として、スクレイパー設定で任意のヘッダーを許可していません。そのため、Prometheus サーバーの IP アドレスをホワイトリストに登録できない場合(私のケースではそれが不可能です)、Prometheus で Discourse のメトリクスを取り込む方法はありません。
おそらく、Cloudflare などのプロキシの背後で Discourse インスタンスを運用している他の人々もいるでしょう。その前提を踏まえると、エクスポートを少し調整する必要があると信じています。
Discourse の API は、HTTP 基本認証(Prometheus スクレイパーサブシステムでサポートされています)のような「ある程度標準化された」ものではなく、独自の Api-Key と Api-Username ヘッダーを使用します。そのため、私の設定ではこれを利用する方法が本当にありません。
pfaffman
(Jay Pfaffman)
2020 年 6 月 27 日午前 6:43
4
検索する必要があります。テンプレートディレクトリ内に見つけられれば、それを app.yml に追加してください。
「いいね!」 1
ishan
(Ishan Jain)
2020 年 6 月 27 日午前 7:27
5
ありがとうございます!
cloudflare.template.yml を有効にしました。 しかし、私の理解が正しければ、これは Cloudflare の IP アドレスからのトラフィックに対するレート制限を無効にするためだけのものでした。
現時点での私の Prometheus 設定は以下の通りです。
scrape_configs:
- job_name: forum
scrape_interval: 5s
scheme: https
static_configs:
- targets:
- forum-behind-cloudflare-dns-proxy.com
さて、私が直面している問題は、Discourse がリクエストの実際の IP アドレスを認識できないことです。そのため、許可リスト方式を機能させるために、以下の試みを行いました。
app.yml 内の環境変数 DISCOURSE_PROMETHEUS_TRUSTED_IP_WHITELIST_REGEX に、Prometheus サーバーの IPv6 アドレスを追加しました。
Prometheus サーバー上の /etc/hosts に、フォーラムの実際の IPv6 アドレスをハードコードしました。これで、フォーラムは私の Prometheus サーバーの IP アドレスを認識し、アクセスを許可するようになりました。
しかし、他にもいくつかの問題があります。例えば、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 を指定することで修正できます。
pfaffman
(Jay Pfaffman)
2020 年 6 月 27 日午後 12:00
6
リバースプロキシの背後におられますか?実際のリモートホストが Discourse に到達できるよう、nginx の設定を行う必要があります。Discourse と同じマシン上で他のウェブサイトを実行する という記事が、その解決策の手がかりになるかもしれません。
「いいね!」 1
ishan
(Ishan Jain)
2020 年 6 月 28 日午前 7:51
7
Discourse のインスタンスは確かにリバースプロキシの背後で動作しています。このリバースプロキシは Cloudflare が提供しており、現在は Pro プランのみの利用のため、Cloudflare から Discourse インスタンスへ実際のクライアント IP を渡すオプションがありません。いずれにせよ、私の問題は既に解決しました
Grafana のダッシュボードは、現時点で更新されるべきでしょう。時間の経過とともに Prometheus エクスプローターが更新され、特定のメトリクスを送信しなくなったにもかかわらず、Grafana のダッシュボードはそれら(現在存在しない)メトリクスの値を読み取るように設定されたままになっています。
「いいね!」 1