Discourse dazu bringen, die Prometheus-Server-IP zu erkennen

Hallo zusammen!

Soweit ich das verstehe, müssen wir, um sicherzustellen, dass eine Prometheus-Instanz Daten vom Endpunkt /metrics abrufen kann, die IP-Adresse dieser Maschine in die Whitelist aufnehmen, indem wir DISCOURSE_PROMETHEUS_TRUSTED_IP_WHITELIST_REGEX bearbeiten.

Gibt es eine andere Möglichkeit, dies zu tun? Unsere Discourse-Instanz befindet sich hinter dem DNS-Proxy von Cloudflare und sieht nicht die tatsächliche IP-Adresse der Endnutzer. Ich würde es vorziehen, wenn wir einen Weg finden könnten, dies mit API-Schlüsseln zu lösen, obwohl dies aufgrund der Einschränkungen bei der Datenerfassung durch Prometheus unwahrscheinlich erscheint.

Dann ist Discourse defekt, und du musst die Cloudflare-Vorlage hinzufügen.

Ich denke, das würde funktionieren. Hast du es versucht? Ach, aber ich glaube nicht, dass du Grafana dazu bringen kannst, die Schlüssel in den Header zu setzen, weshalb ich diese Funktion überhaupt erst hinzugefügt habe.

1 „Gefällt mir“

Dann ist Discourse kaputt, und du musst die Cloudflare-Vorlage hinzufügen.

Ah, was meinst du mit „Cloudflare-Vorlage"?

Ich denke, das würde funktionieren. Hast du es versucht? Oh, aber ich glaube nicht, dass Grafana die Schlüssel in den Header setzen kann. Deshalb habe ich diese Funktion ursprünglich hinzugefügt.

Ja, das habe ich. Prometheus erlaubt in den Scraper-Konfigurationen immer noch keine beliebigen Header. Es gibt also keine Möglichkeit, Discourse-Metriken in Prometheus aufzunehmen, wenn ich die IP-Adresse des Prometheus-Servers nicht whitelisten kann, was in meinem Fall nicht möglich ist.

Es gibt wahrscheinlich andere Leute, die ihre Discourse-Instanzen hinter Proxys wie Cloudflare betreiben. Unter dieser Annahme müssen wir den Exporter ein wenig anpassen.

Die Discourse-API verwendet eigene Header namens Api-Key und Api-Username anstelle von etwas, das mehr oder weniger standardisiert ist, wie die HTTP-Basisauthentifizierung (die vom Prometheus-Scraper-Subsystem unterstützt wird). Daher habe ich in meinem Setup wirklich keine Möglichkeit, dies zu nutzen.

Du musst danach suchen. Du findest sie jedoch im Verzeichnis templates und kannst sie zu deiner app.yml hinzufügen.

1 „Gefällt mir“

Danke!

cloudflare.template.yml aktiviert. :slight_smile: Aber wenn ich das richtig verstehe, diente das nur dazu, die Ratenbegrenzung für den Datenverkehr von Cloudflare-IP-Adressen zu deaktivieren.

Momentan sieht meine Prometheus-Konfiguration so aus:

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

Das Problem, das ich derzeit habe, ist, dass Discourse die tatsächliche IP-Adresse einer Anfrage nicht sieht. Damit der Ansatz mit der Zulassungsliste funktioniert, habe ich Folgendes versucht:

  1. Ich habe die IPv6-Adresse meines Prometheus-Servers zur Umgebungsvariable DISCOURSE_PROMETHEUS_TRUSTED_IP_WHITELIST_REGEX in app.yml hinzugefügt.

  2. Ich habe die tatsächliche IPv6-Adresse des Forums in /etc/hosts auf dem Prometheus-Server hart kodiert. Jetzt kann das Forum die IP-Adresse meines Prometheus-Servers sehen und den Zugriff darauf zulassen. :slight_smile:

Ich habe jedoch noch einige andere Probleme. Da Prometheus in einem Container läuft, wird /etc/hosts vom Host nicht innerhalb des Containers geteilt. Daher wird die Forum-Adresse weiterhin auf eine Cloudflare-IP aufgelöst, und die Authentifizierung schlägt fehl.

Ich könnte /etc/hosts vom Host im Docker-Container freigeben, z. B. mit -v /etc/hosts:/etc/hosts beim Start von Prometheus. Das führt jedoch zu einem Fehler wie:

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

Jetzt muss ich nur noch dieses Problem lösen.

Bearbeitung #1: Das habe ich auch herausgefunden. IPv6 war im Docker-Container deaktiviert. Ich kann das beheben, indem ich IPv6 im Docker-Container aktiviere oder einfach --net=host verwende.

Bist du hinter einem Reverse-Proxy? Du musst nginx so konfigurieren, dass die echte Remote-IP an Discourse weitergegeben wird. Ich denke, der Artikel Andere Websites auf demselben Server wie Discourse betreiben könnte dir einen Hinweis geben, wie du das hinbekommst.

1 „Gefällt mir“

Die Discourse-Instanz läuft tatsächlich hinter einem Reverse-Proxy. Der Reverse-Proxy wird von Cloudflare bereitgestellt, und wir befinden uns nur im Pro-Plan, sodass wir keine Möglichkeit haben, die echte Client-IP von Cloudflare an die Discourse-Instanz weiterzuleiten. Wie auch immer, mein Problem ist bereits gelöst. :slight_smile:

Das Grafana-Dashboard sollte zu diesem Zeitpunkt wahrscheinlich aktualisiert werden. Im Laufe der Zeit wurde der Prometheus-Exporter aktualisiert, sodass er bestimmte Metriken nicht mehr aussendet, das Grafana-Dashboard jedoch weiterhin so konfiguriert ist, dass es Werte dieser (jetzt) nicht existierenden Metriken liest.

1 „Gefällt mir“