Select Page

NETWAYS Blog

NETWAYS GitHub Update Oktober 2023

This entry is part 9 of 14 in the series NETWAYS GitHub Update

Willkommen beim NETWAYS GitHub Update, der monatliche Überblick über unsere neuesten Releases.

Wenn du in Zukunft Updates direkt zu Release erhalten willst, folge uns einfach auf GitHub: https://github.com/NETWAYS/

go-check v0.6.0

Changelog

  • Utility Funktion hinzugefügt, um Konfiguration mit Umgebungsvariablen zu laden. Damit muss man Passwörter nicht mehr im der Kommandozeile übergeben, sondern einfach mittels Umgebungsvariablen. Ein Feature, dass wir dann in unserer Check Plugins einbauen werden.
  • Weitere Konstanten hinzugefügt (Status Text)

https://github.com/NETWAYS/go-check/releases/tag/v0.6.0

check-hp-firmware v1.3.1

Changelog

  • Buildprozess aktualisiert
  • Neues Release mit Golang 1.21

https://github.com/NETWAYS/check_hp_firmware/releases/tag/v1.3.1

check-prometheus v0.1.2

Changelog

  • Bugfix: Fehler im query Subbefehl gefixt
  • Feature: Perfdata Ausgabe um warning/critical Werte erweitert

https://github.com/NETWAYS/check_prometheus/releases/tag/v0.1.2

check-elasticsearch v0.4.0

Changelog

  • Feature: Diverse Konfiguration kann mittels Umgebungsvariablen gesetzt werden
  • Feature: TLS Konfiguration erweitert
  • Neues Release mit Golang 1.21

https://github.com/NETWAYS/check_elasticsearch/releases/tag/v0.4.0

check-hp-msa v0.1.0

Changelog

  • Feature: Option für weitere Authentifizierungsmethoden hinzugefügt

https://github.com/NETWAYS/check_hp_msa/releases/tag/v0.1.0

icinga-installer v1.2.6

Changelog

  • Bugfix: Fehlenden Parameter “Port für Director” hinzugefügt
  • Bugfix: Fehler bei IcingaDB Web-Modul Installation behoben

https://github.com/NETWAYS/icinga-installer/releases/tag/v1.2.6

Markus Opolka
Markus Opolka
Senior Consultant

Markus war nach seiner Ausbildung als Fachinformatiker mehrere Jahre als Systemadministrator tätig und hat währenddessen ein Master-Studium Linguistik an der FAU absolviert. Seit 2022 ist er bei NETWAYS als Consultant tätig. Hier kümmert er sich um die Themen Container, Kubernetes, Puppet und Ansible. Privat findet man ihn auf dem Fahrrad, dem Sofa oder auf GitHub.

NETWAYS GitHub Update September 2023

This entry is part 8 of 14 in the series NETWAYS GitHub Update

Willkommen beim NETWAYS GitHub Update, der monatliche Überblick über unsere neuesten Releases.

Wenn Du in Zukunft Updates direkt zu Release erhalten willst, folge uns einfach auf GitHub: https://github.com/NETWAYS/

check-influxdb v0.1.0

Changelog

  • Erster Release! Wir hoffen, Euch hilft das neue Plugin.

https://github.com/NETWAYS/check_influxdb/releases/tag/v0.1.0

check-logstash v0.10.0

Changelog

  • Mit Golang 1.21 kompiliert
  • Unterstützt jetzt HTTP Proxy Konfiguration mittels Umgebungsvariablen
  • Inflight Events haben jetzt keine negativen Werte mehr
  • Bugfix: Fehlerhafte Performance Daten entfernt

https://github.com/NETWAYS/check_logstash/releases/tag/v0.9.1

go-check-network v0.1.0-beta.1 Preview

Wir haben gemerkt, dass wir in letzter Zeit häufig Code in Golang Monitoring Plugins wiederholen. Das war bislang kein Problem, da “ein bisschen Kopieren besser ist, als falsche Abstraktion”, aber jetzt haben wir uns doch für ein eigenes Modul für diesen Code entschieden.

Nachdem wir mit go-check ein schickes Golang Modul haben, um Monitoring Plugins zuschreiben, dachten wir zuerst daran, den gemeinsamen Code dort zu platzieren. Das hätte aber den Nachteil, dass so auch alle Abhängigkeiten in die Downstream-Projekte inkludiert werden. Das wollten wir vermeiden. Außerdem soll das go-check Modul schlank, agnostisch und fokussiert bleiben. Daher haben wir uns für eine Sammlung an Golang Modulen entschieden.

In go-check-network findet sich in Zukunft Code, der für Golang Monitoring Plugins im Netzwerkbereich eingesetzt werden kann.

https://github.com/NETWAYS/go-check-network

Markus Opolka
Markus Opolka
Senior Consultant

Markus war nach seiner Ausbildung als Fachinformatiker mehrere Jahre als Systemadministrator tätig und hat währenddessen ein Master-Studium Linguistik an der FAU absolviert. Seit 2022 ist er bei NETWAYS als Consultant tätig. Hier kümmert er sich um die Themen Container, Kubernetes, Puppet und Ansible. Privat findet man ihn auf dem Fahrrad, dem Sofa oder auf GitHub.

check_influxdb ist jetzt öffentlich verfügbar!

InfluxDB ist eine Zeitreihendatenbank, die gerne für Performance Monitoring genutzt wird. Zusammen mit dem Telegraf Agenten, kann man so ziemlich alle vorstellbaren Formate einliefern und diese in Metriken oder Logs transformieren. Hat man die Daten einmal in der Datenbank, kann man entweder direkt in InfluxDB mittels “Checks” gegen Schwellwerte prüfen, oder man hat dafür ein zusätzliches Monitoring Tool im Einsatz, beispielsweise Icinga. Für letzteres braucht man aber ein Check-Plugin.

Mit check_influxdb lässt sich der Zustand von InfluxDB v1 und v2 Instanzen prüfen. Außerdem können flux Abfragen an InfluxDB v2 geschickt werden und ausgewertet werden. Das Check-Plugin haben wir in Golang geschrieben, das heißt, es werden keine weiteren Abhängigkeiten auf der Icinga Instanz benötigt.

https://github.com/NETWAYS/check_influxdb

Hier einige Beispiele für die Nutzung:

Wir können zunächst mal grundlegend prüfen, ob unsere InfluxDB Instanz erreichbar ist. Dafür nutzen wir den health Unterbefehl:

$ check_influxdb health 
[OK] - InfluxDB Status: pass

$ check_influxdb health 
[CRITICAL] - InfluxDB Status: fail

Mit dem query Unterbefehl können wir direkt flux Abfragen auswerten lassen und gegen Schwellwerte prüfen. Dabei können wir die flux Abfrage entweder direkt in der Kommandozeile übergeben, oder in einer Datei ablegen:

check_influxdb query --token "${INFLUX_TOKEN}" --org myorg --bucket telegraf --warning 1 --critical 2 \
--flux-string 'from(bucket:"monitor")|>range(start:-1h)|>filter(fn:(r)=>r["_measurement"]=="cpu")|>filter(fn:(r)=>r["_field"]=="usage_user")|>aggregateWindow(every:1h,fn:mean)'

[CRITICAL] - InfluxDB Query Status | cpu.usage_user=0.04;1;2
exit status 2

check_influxdb query --token "${INFLUX_TOKEN}" --org myorg --bucket telegraf --warning 50 --critical 100 \
--flux-file mem.flux

[WARNING] - InfluxDB Query Status | mem.active=68.9;50;100
exit status 1

Natürlich können bei beiden Befehlen Adresse, TLS Konfiguration und Authentifizierung als Parameter angeben. Außerdem lässt sich Unterstützung für InfluxDB v3 einbauen, sobald diese Version öffentlich verfügbar ist.

Das Plugin ist ab sofort verfügbar und wir freuen uns über Feedback. Und hast du einen Bug gefunden, oder brauchst ein neues Feature? Melde dich einfach auf GitHub!

Markus Opolka
Markus Opolka
Senior Consultant

Markus war nach seiner Ausbildung als Fachinformatiker mehrere Jahre als Systemadministrator tätig und hat währenddessen ein Master-Studium Linguistik an der FAU absolviert. Seit 2022 ist er bei NETWAYS als Consultant tätig. Hier kümmert er sich um die Themen Container, Kubernetes, Puppet und Ansible. Privat findet man ihn auf dem Fahrrad, dem Sofa oder auf GitHub.

NETWAYS GitHub Update August 2023

This entry is part 7 of 14 in the series NETWAYS GitHub Update

Willkommen beim NETWAYS GitHub Update, der monatliche Überblick über unsere neuesten Releases.

Trotz Sommer- und Urlaubszeit waren wir auch im August 2023 fleißig. Besonders spannend sind für viele sicher die Checks für Gitlab und Prometheus.
Aber auch weitere Check-Plugins, etwa für Mumble oder VMWare haben Updates spendiert bekommen.

Wenn du in Zukunft Updates direkt zu Release erhalten willst, folge uns einfach auf GitHub: https://github.com/NETWAYS/

check-hwgroup v1.2.0

Changelog

  • Großer Refactor für zukünftige Wartbarkeit
  • Bugfix: Kleine Schreibfehler in CLI Parameter gefixt

https://github.com/NETWAYS/check_hwgroup/releases/tag/v1.2.0

check-mumble-ping v1.0.0

Changelog

  • Hinzugefügt: Formatierte Ausgabe für Icingaweb2
  • Hinzugefügt: Viele neue Unittests!
  • Robustere Fehlerbehandlung

https://github.com/NETWAYS/check_mumble_ping/releases/tag/v1.0.0

check-gitlab-version v0.1.0

Changelog

  • Großer Refactor für zukünftige Wartbarkeit
  • Hinzugefügt: Option die Upstream GitLab URL anzupassen

https://github.com/NETWAYS/check_gitlab_version/releases/tag/v0.1.0

check-brevisone v3.0.0

Changelog

  • Großer Refactor für zukünftige Wartbarkeit
  • Robustere Fehlerbehandlung und Statusausgabe

https://github.com/NETWAYS/check_brevisone/releases/tag/v3.0.0

check-vmware-nsxt v0.2.0

Changelog

  • Hilfetexte verbessert
  • Hinzugefügt: Performance Data Ausgabe erweitert
  • Hinzugefügt: Option um Alarme zu deaktivieren
  • Hinzugefügt: Viele neue Unittests!

https://github.com/NETWAYS/check_vmware_nsxt/releases/tag/v0.2.0

check-prometheus v0.1.1

Changelog

  • Bugfix: Funktioniert nun auch mit älteren Prometheus Versionen
  • Bugfix: Unterstützt nun Proxy Konfiguration via Umgebungsvariablen

https://github.com/NETWAYS/check_prometheus/releases/tag/v0.1.1

Markus Opolka
Markus Opolka
Senior Consultant

Markus war nach seiner Ausbildung als Fachinformatiker mehrere Jahre als Systemadministrator tätig und hat währenddessen ein Master-Studium Linguistik an der FAU absolviert. Seit 2022 ist er bei NETWAYS als Consultant tätig. Hier kümmert er sich um die Themen Container, Kubernetes, Puppet und Ansible. Privat findet man ihn auf dem Fahrrad, dem Sofa oder auf GitHub.

Herausforderungen beim Prometheus Scaling

Prometheus ist eine ausgezeichnete Monitoring-Lösung, wenn es um die Überwachung von Verfügbarkeit und Performance geht. Das initiale Deployment geht schnell und mit ein bisschen PromQL KnowHow hat man die Dashboards und Alarme schnell am Laufen. Schon steht die Prometheus Monitoring Lösung. Aber wie skaliert das Ganze?

In größeren oder wachsenden Umgebungen ergeben sich einige Herausforderungen, die es zu überwinden gilt. Im ersten Teil dieses Artikels sollen diese zunächst problematisiert werden. Der zweite Teil stellt dann im Prometheus Ökosystem etablierte Werkzeuge vor, die diese Herausforderungen lösen können.

 

Zentrale Oberfläche für mehrere Prometheus Instanzen

Eine häufige Anforderung ist, eine zentrale Anlaufstelle für mehrere Prometheus Instanzen abzubilden. Soll heißen, dass über die Zeit mehr und mehr Instanzen in Betrieb genommen werden und keine zentralen Abfragen möglich sind. Gründe dafür können sein, dass mehrere unabhängige Systeme jeweils eine oder mehrere Prometheus Instanzen bekommen (beispielsweise Kubernetes Cluster). Außerdem könnten verschiedene Teams oder Netzwerkzonen eigenständige Instanzen benötigen. Häufig zeigt sich: ein Prometheus kommt selten allein.

Fun Fact: der Plural von “Prometheus” ist “Prometheis”. Im Deutschen wird aber auch gerne “die Prometheus” als Plural genutzt. Vermutlich auch, weil der dentale Frikative “th” des Englischen im Deutschen aber als Plosiv zur Geltung kommt und /pʁoˈmeːtaɪ̯s/ komisch klingt.

Auch wenn dank Federation und Remote Write verschiedene zentrale, dezentrale oder hochverfügbare Prometheus Architekturen möglich sind, haben diese oft hohen operativen Aufwand. In zentralen Architekturen könnten zudem einzelne Instanzen, die sich “danebenbenehmen”, das Gesamtkonstrukt stören. Damit sind beispielsweise Daten mit hoher Kardinalität gemeint, oder Instanzen, die hohe Last erzeugen. Es kann also durchaus sinnvoll sein, eigenständige Prometheus Instanzen zu betreiben.

Dadurch hat man aber nun keine zentrale API, um die Daten abzufragen. Heißt, eine Lösung, die eine globale Sicht auf mehrere Instanzen bereitstellt, muss her.

 

Prometheus Mandantenfähigkeit

Da sich, wie eben beschrieben, schnell mehrere Instanzen in der Infrastruktur tummeln, die an einer zentralen Stelle zusammenlaufen sollen, sollte diese Stelle idealerweise Mandantentrennung unterstützen. Heißt beispielsweise, Team A und B möchten sich beim Schreiben und Lesen von Daten nicht über die Füße laufen, aber dennoch die zentrale Infrastruktur nutzen. Daten sollen im besten Fall getrennt voneinander gespeichert werden und Abfragen isoliert voneinander sein.

Mandantenfähigkeit soll also dafür sorgen, dass wir zentrale Infrastruktur gemeinsam nutzen können. Wenn sich diese dann noch in bestehenden Authentifizierungslösung integrieren lässt, wäre das natürlich optimal.

 

Langzeitspeicherung von Daten

Die Anforderungen, für wie lange Metriken aufbewahrt werden müssen, unterscheiden sich je nach Anwendungsfall sehr stark. Dabei sind verschiedenste Faktoren ausschlaggebend.

Für produktive Systeme oder Testumgebungen möchte man vielleicht verschiedene Aufbewahrungsfristen. Daneben ist natürlich die Größe der jeweiligen Umgebung zu beachten, eine handvoll Nodes erzeugen wesentlich weniger Daten, als hunderte. Selbstverständlich spielen auch hier Netzwerkzonen oder Teams eine Rolle. Oder auch ganz einfach der Kostenfaktor, Speicher ist zwar günstig, aber nicht umsonst.

Man möchte also womöglich Daten von Prometheus Instanzen nur für 30 Tage lokal aufbewahren, um das tagtägliche Monitoring zu bewerkstelligen, aber gleichzeitig 6 oder 12 Monate historische Daten, um längerfristige oder wiederkehrende Trends zu erkennen.

Im Folgenden werden einige etablierte Lösungen für die eben beschriebenen Herausforderungen beim Prometheus Scaling beschreiben.

 

Thanos

Thanos (https://thanos.io/) besteht aus einer handvoll Komponenten, die zusätzlich zu Prometheus Instanzen laufen, um so ein skalierbares und hochverfügbares Gesamtkonstrukt zu bauen. Jede Komponente hat hier eine sehr spezifische Aufgabe und versucht diese so gut wie möglich zu lösen (KISS-Prinzip).

Anmerkung des Autors: auch wenn sich einzelne Komponenten eines Systems nach dem “Keep It Simple” Prinzip ausrichten, heißt das nicht, dass das daraus resultierende Konstrukt nicht durchaus komplex sein kann.

Dieses modulare Design von Thanos hat einige Vorteile. Nicht alle Komponenten müssen zum Einsatz kommen, viele davon sind “stateless” (speichern also keinen Zustand) und sie skalieren unabhängig voreinander.

Als ein Kernstück von Thanos könnte man das “Store Gateway” sehen. Diese Komponente spricht mit einem Objektspeicher (beispielsweise S3), um historische Daten zu speichern und stellt eine gRPC API bereit, über welche die Daten angefragt werden können.

Bestehende Prometheus Instanzen können unverändert weiterlaufen und werden jeweils mit der Thanos Sidecar Komponente ausgestattet. Diese schiebt die Prometheus Zeitserienblöcke regelmäßig in den Objektspeicher. Gleichzeitig können mehrere Sidecars über die “Query Frontend” Komponente gebündelt werden, damit wird eine zentrale API erzeugt, die alle Prometheus Instanzen so wie die historischen Daten abfragen kann.

Eine optionale Downsampling Komponente kann die historischen Daten im Objektspeicher in regelmäßigen Intervallen komprimieren. Außerdem kann eine “Receiver” Komponente genutzt werden, um Metriken direkt aus Prometheus mittels Remote Write abzuliefern, so vermeidet man die Sidecar Komponente.

Mit Thanos lässt sich problemlos eine zentrale Oberfläche für mehrere Prometheus Instanzen erstellen und auch Langzeitspeicherung von Daten ist machbar. Die Mandantenfähigkeit ist jedoch (Stand August 2023) noch nicht ganz ausgereift. Zwar kennen einige Komponenten das Konzept von Mandanten, die Implementierung ist aber noch nicht sehr einheitlich (ist aber in Arbeit). Dazu muss man fairerweise auch sagen, dass Thanos eine Apache-2.0-lizenzierte freie Software ist, hinter der keine Firma steht, sondern die CNCF.

 

Cortex

Cortex (https://cortexmetrics.io/) basiert in Teilen auf Thanos/Prometheus Code und hat ähnliche Features wie Thanos. Ein wesentlicher Unterschied ist, dass Prometheus Instanzen die Daten immer mittels Remote Write selbst einliefern. Es gibt also keine Sidecar Komponente, aber die Prometheus Konfiguration muss angepasst werden. Diese Anpassung ist jedoch trivial.

Interessant am Cortex Design ist auch, dass es sich um eine einzelne Binärdatei handelt, die alle Komponenten beinhalten. Heißt, Cortex kann im einfachsten Fall als ein Prozess laufen. Ändern sich die Anforderungen, kann man entweder mehrere Instanzen starten, die auf den gleichen Objektspeicher zugreifen, oder einzelne Komponenten skalieren. Sind die Daten einmal im Objektspeicher ist die Architektur sehr ähnlich zu Thanos.

Es gibt aber auch entscheidende Unterschiede. Beispielsweise ist das Downsampling von historischen Daten noch auf der Roadmap (Stand August 2023). Ein vorteilhafter Unterschied ist aber, dass die Mandantenfähigkeit in allen Komponenten verfügbar ist.

Cortex unterstützt Mandantenfähigkeit mittels einem HTTP-Header (X-Scope-OrgID), welcher den jeweiligen Tenant beinhaltet. Jeder Tenant hat dann eine eigene Zeitseriendatenbank im Cortex Objektspeicher und auch jede Abfrage muss diesen HTTP-Header mit der Tenant-ID schicken. Cortex vertraut diesem HTTP-Header, heißt, externe Tools (beispielsweise ein Reverse Proxy) müssen für die Authentifizierung sorgen. HTTP Authentifizierung ist immerhin ein gut verstandenes Problem mit vielen Lösungen.

 

Grafana Mimir

Grafana Mimir (https://grafana.com/oss/mimir/) basiert auf dem Cortex Code. Grafana Labs – ein Haupt-Contributor bei Cortex – hat hier zusätzliche Features zum Produkt “Mimir” entwickelt. Die Architektur ist großteils identisch und Mimir wurde bewusst in der Version 2.0 veröffentlicht, um den Fork und dessen Features zu differenzieren. Außerdem wurde, basierend auf der Grafana Mimir Code-Base, das Produkt “Grafana Enterprise Metrics (GEM)” entwickelt, was nochmals weitere Features für den Enterprise-Bereich enthält.

In den Versionen nach dem Fork wurde der Fokus auf Performance-Optimierung und Mandantenfähigkeit gelegt. Erwähnenswert ist allerdings auch, dass Grafana Mimir unter der AGPL-3.0 Lizenz veröffentlicht wurde.

 

Fazit

Monitoring mit Prometheus bringt einige Herausforderungen mit sich. Nicht nur, dass man PromQL verstehen und schreiben lernen muss, bei wachsender Infrastruktur hat man operative Hürden zu bewältigen. Meine persönliche Empfehlung ist aktuell Cortex oder Mimir. Zum einen ist die elegante Deployment Option mit einer (Golang) Binärdatei ein Faktor, und zum anderen die durchgängige Mandantenfähigkeit mittels HTTP-Header. Trotzdem muss man auch sagen, dass die Authentifizierung mit HTTP eigene Herausforderungen mitbringt. Technologisch könnte man das Ganze als gelöstes Problem sehen, Authentifizierung/Autorisierung/Verschlüsselung mit HTTP sind gut verstandene Probleme. Aus einer organisatorischen Perspektive ist das Thema aber immer noch trickreich, da viele Komponenten integriert und betreut werden müssen.

Alles in allem ist Prometheus Monitoring ein spannender Bereich, in dem es noch viele spannende Probleme zu lösen gibt.

Markus Opolka
Markus Opolka
Senior Consultant

Markus war nach seiner Ausbildung als Fachinformatiker mehrere Jahre als Systemadministrator tätig und hat währenddessen ein Master-Studium Linguistik an der FAU absolviert. Seit 2022 ist er bei NETWAYS als Consultant tätig. Hier kümmert er sich um die Themen Container, Kubernetes, Puppet und Ansible. Privat findet man ihn auf dem Fahrrad, dem Sofa oder auf GitHub.