Meine IT-Infrastruktur bei mir zu Hause wächst. „My home is my Rechenzentrum“ oder so. Leider kommt es auch immer wieder mal zu scheinbar unerklärlichen Verbindungsabbrüchen im WLAN oder auch im LAN, wenn mal ein Switch ausgestiegen ist.
Damit ich nicht alle beteiligten Komponenten von Client bis zum Router mittels Trial-and-Error durchtesten muss, habe ich mir ein rudimentäres Monitoring zusammengebaut.
Hauptkomponente ist hierbei Prometheus, hübsch aufbereitet und dargestellt mit Grafana. Als Hardware-Plattform habe ich einen Raspberry Pi 4B mit 4GB Ram ausgewählt, mit Docker bestückt und begonnen, die Services zu monitoren.
Doch eins nach dem anderen.
Der Raspberry Pi wird mit einem Raspbian-Image der Wahl bestückt, ich habe das Raspberry Pi OS (64-bit) genommen, das Raspberry Pi OS Lite tut es sicherlich auch. Unter Windows, Mac OS und Ubuntu geht das Bespielen der Micro-SD-Card sehr komfortabel mit dem Raspberry Pi Imager.
Nach der Grundkonfiguration (SSH nicht vergessen!) habe ich nach der sehr guten Anleitung auf Berrybase von Jörn Welse die Applikationen Docker, Portainer und Heimdall installiert und konfiguriert.
Damit existiert also eine Grundlage, um verschiedenste Services in Containern bereitzustellen (-> Docker) , diese mit einer GUI zu administrieren (->Portainer) und die resultierenden Service-Webseiten übersichtlich darzustellen (-> Heimdall).
Bezüglich des Monitorings habe ich mich für Prometheus entschieden und das Container-Image „ubuntu/prometheus“ vom Docker Hub gewählt. Den Port habe ich auf Standard (9090) belassen und so konfiguriert, dass der Port auf den Raspberry durchgereicht wird, ebenso auf Port 9090.
Als nächstes folgt die Installation der Container-Images „prom/node-exporter“ und „prom/snmp-exporter“. Hier habe ich auch die Standard-Ports 9100 und 9116 genutzt und an den Raspberry durchgereicht. Wenn alles gut gelaufen ist, kann man jetzt die Webseiten unter der IP-Adresse des Rasperrys und des passenden Ports (also 9090 für Prometheus selbst, 9100 für den Node-Exporter und 9116 für den SNMP-Exporter) aufrufen.
Sieht aber noch wenig spektakulär aus.
Um Metriken zu erhalten, muss ich im Falle des SNMP-Exporters sowohl die Adresse des zu monitorenden Geräts als auch das Modul angeben, welches ich mir ansehen möchte. Für Switche ist das standardmäßig ausgewählte „if_mib“-Modul sicher richtig, aber wenn man damit sein NAS monitoren möchte, braucht man andere Datenpunkte. In meinem Fall ist das ein Synology NAS und das Modul „Synology“ ist in der „snmp.yml“ (neben etlichen anderen) enthalten.
In dem File „prometheus.yml“ im Prometheus Container muss man jetzt die Jobs für den SNMP-Exporter anlegen, damit die Komponenten abgefragt werden können. Nach einem Neustart des Prometheus-Containers sollten dann auch die ersten Targets mit ihren Metriken sichtbar sein.
Da ich als Router eine Fritz!Box habe und diese etwas anders abgefragt wird als mit dem SNMP-Exporter, muss ich noch den fritzbox-prometheus-exporter installieren. Das Containerimage hierzu gibt es nicht auf Docker Hub, sondern auf ghcr.io. Dazu muss ich zunächst in Portainer die Registry anlegen, das geht über Settings -> Registries. Mit dem Button „+ Add registry“ und der Auswahl „Custom registry“ kann man dann einen Namen vergeben und die URL der Registry angeben.
Die neu angelegte Registry ist dann unter Images verfügbar und kann in dem Drop-down-Menü ausgewählt werden. Danach kann man das Image kaiehrhardt/fritzbox-prometheus-exporter:7c629ec pullen. Hierbei ist das Manifest für die zu installierende Architekturversion auch anzugeben, in meinem Fall eben 7c629ec für ARM64. Die Manifeste für weitere Architekturen findet Ihr auf der GitHub-Seite des Projektes fritzbox-prometheus-exporter von Kai Ehrhardt. Beim Erstellen des Containers bitte noch den Port 9042 freigeben, damit Prometheus die Daten abfassen kann.
Wichtig: Für das Funktionieren des fritzbox-exporters müsst ihr in eurer Fritzbox unter Heimnetz -> Heimnetzübersicht -> Netzwerkeinstellungen den Haken vor „Statusinformationen über UPnP übertragen“ setzen!
Die Konfiguration des fritzbox-exporters geschieht über Environment-Variablen, die folgenden Variablen müssen beim Erstellen des Containers in Portainer gesetzt sein:
GATEWAY_LUAURL | http://IP-Adresse der Fritzbox |
GATEWAY_URL | http://IP-Adresse der Fritzbox:49000 |
LISTEN_ADDRESS | 0.0.0.0:9042 |
USERNAME | Username auf der Fritzbox |
PASSWORD | zugehöriges Passwort auf der Fritzbox |
Im prometheus.yml muss auch dieser Job angelegt werden, ich habe hierbei das scrape_interval und das scrape_timeout etwas großzügiger bemessen, weil das Abrufen der Daten von der Fritzbox auch mal mehr als die bei mir standardmäßig eingestellten 15 Sekunden dauern kann.
Was jetzt noch fehlt, ist die Überwachung des Raspberry Pi selbst. Das wird mit dem node-exporter realisiert, dem man auch einfach einen Eintrag in der prometheus.yml spendiert:
Damit wäre auf Seiten des Raspberrys und Prometheus bereits alles getan, einzig die SSL-Verbindung von / zu Prometheus steht noch aus. Ich möchte nämlich gerne auf die von Prometheus gesammelten Daten von aussen zugreifen, und da bevorzuge ich verschlüsselte Kommunikation. Glücklicherweise hat Prometheus eine Anleitung erstellt, wie man TLS mit Prometheus ans Fliegen bringt.
Ihr loggt euch auf der Shell des Prometheus-Containers ein und befolgt dort die Schritte aus der Anleitung „SECURING PROMETHEUS API AND UI ENDPOINTS USING TLS ENCRYPTION“. Danach startet ihr den Prometheus-Container neu, aber mit den Argumenten:
--config.file=/path/to/prometheus.yml
und
--web.config.file=/path/to/web-config.yml
(wobei "path/to" natürlich durch euren Pfad zu den Dateien ersetzt werden muss.)
Weil Prometheus jetzt freundlicherweise den Datenverkehr verschlüsselt, müsst ihr in der prometheus.yml noch im Job Prometheus noch „scheme: https“ hinzufügen.
Der nächste Schritt ist die Visualisierung mit Grafana. Ich habe mich dafür entschlossen, Grafana nicht lokal (neudeutsch „on-premise“) laufen zu lassen, sondern mich des kostenlosen Services von Grafana Cloud zu bedienen. Nach Registrierung bekommt ihr Zugriff auf Eure Grafana-Instanz unter https://[USERNAME].grafana.net, wo ihr euch eure Dashboards bauen könnt.
Zunächst einmal müsst ihr aber eure Datenquelle einrichten. Bei mir ist das der Raspberry, dessen Port 9090 ich über „Freigaben“ auf der Fritzbox noch aus dem Internet erreichbar machen muss.
Danach kann ich die Datenquelle in Grafana Cloud einrichten, dazu gehe ich in „Configuration -> Data sources“ und klicke auf den blauen „Add data source“-Button. In der Liste wähle ich „prometheus“ und gebe unter „HTTP“ die URL meiner Freigabe an.
Bei der Fritzbox gibt es dafür den DynDNS-Service „myfritz“, unter der mein Router und dessen Freigaben erreichbar sind. Solltet ihr keine Fritzbox haben, müsst ihr euch entweder um einen anderen DynDNS-Provider bemühen oder aber die Prometheus-Daten nicht von Grafana abholen lassen, sondern sie auf euren Grafana-Cloud-Account hochladen (push).
In der Sektion „Auth“ müsst ihr „Skip TLS Verify“ anhaken, weil das selbsterstellte SSL-Zertifikat nicht bei einer CA angemeldet ist. Das reicht für unsere Zwecke aber komplett aus.
Bei „Type and version“ wählt ihr noch „Prometheus“ aus und die von euch verwendete Version und mit „save and test“ könnt ihr überprüfen, ob Grafana Cloud Daten von eurer Prometheus-Instanz erhält.
Wenn alles gut ist, könnt ihr euch jetzt euer erstes Dashboard bauen. Da das ein recht aufwändiger Task ist, es eine aktive Community gibt und ihr wahrscheinlich bei den meisten Appliances nicht die ersten seid, die das mit Grafana überwachen wollen, bestehen gute Chancen, dass ihr ein passendes Dashboard auf GrafanaLabs findet. Der „Node Exporter Full“ hat die ID 1860, der „Internet Dashboard Prometheus“ für das Monitoring der Fritzbox die ID 13848 und für unsere SNMP-Devices bietet sich das Dashboard „SNMP Stats“ mit der ID 11169 an.
Während bei dem Fritzbox-Dashboard an sich alles out-of-the-box laufen sollte, sind bei den Node-Exporter und Snmp-Exporter Dashboards noch ein paar Anpassungen vorzunehmen.
Node-Exporter: Wenn ihr mehrere Jobs für den Node-Exporter habet (also mehrere Rechner überwachen wollt), müsst ihr im Dashboard oben unter „job“ den passenden Namen aus dem Drop-Down-Menü auswählen.
SNMP-Exporter: Hier müsst ihr ebenso den betreffenden Job-Namen auswählen und ggf. noch Filter anwenden, um nur die Daten zu sehen, die euch interessieren, z. B. interessieren mich bei meinem Cisco-Switch zwar die IfNames GigabitEthernet1 – 10, nicht aber LAG1 -LAG0. Die werden durch Filter herausgenommen.
Die resultierenden URLs legt ihr euch am besten als Bookmarks / Favoriten ab, da die Dashboards selber sich die Filter nicht merken, sondern in der URL hinterlegen: https://[USERNAME].grafana.net/[ID]/cisco-sg300-snmp?orgId=1&refresh=10s&var-Job=Cisco-SG300&var-Filters=ifName%7C%21%3D%7CLAG1
Jetzt haben wir ein paar Applikationen, die wir in Heimdall schön übersichtlich darstellen können. Dazu ruft ihr Euren Host mit https und der Portnummer 8443 auf und klickt auf das Listen-Icon im Seitenmenü:
Unter „Application Type gebt ihr für die Grafana-Dashboards „Grafana“ an und in der Mitte unter URL gebt ihr die Adresse des Dashboards an. Vergebt noch einen sprechenden Titel und ihr habt eure erste Applikation in Heimdall veröffentlicht. Analog verfahrt ihr mit den weiteren Dashboards und was ihr sonst noch im Schnellzugriff haben wollt – bei mir sind das die Konfigurationsseiten der überwachten und sonstigen Applikationen / Services, die ich öfters mal aufrufe.