Proxmox: Metriken in Prometheus laden


Proxmox hat eine Menge zu bieten. Vor allem eine Menge Daten. Es fallen gigantische Daten an Metriken zu den virtuellen Maschinen und Containern (LXC) an, die ausgewertet werden wollen. Hierfür existiert eine Standard-Schnittstelle zu InfluxDB, einer quelloffenen time series database (= zeitbasierte Datenbank). Solche Datenbanken speichern ihre Werte nicht wie ihre SQL-Pendants in Tabellen, die nach Indizes aufgeschlüsselt sind. Sie speichern Metriken immer entlang eines Zeitstrahls. Das ist besonders für die Überwachung von Computersystemen oder in einem Smart Home nützlich.

InfluxDB vs. Prometheus

Die erwähnte InfluxDB ist die wohl bekannteste time series database, die es derzeit gibt. Allerdings geht gerade der Stern einer weiteren Open Source-Alternative auf: Prometheus. Prinzipbedingt können beide Datenbanken dasselbe. InfluxDB ist ein wenig schicker in der Optik und verfügt über einen Abfragegenerator, der schöne Ergebnisse, Alerts und Dashboards zaubert. Prometheus hingegen versprüht puren, typischen OSS-Charme. Auch das Alerting und die Darstellung in Dashboards überlässt Prometheus anderen Tools. Hier kommt Grafana ins Spiel. Die Konfiguration erfolgt stilecht in einer Konfigurationsdatei.

Ein grundlegender Unterschied zwischen den beiden Systemen ist aber die Datenbeschaffung. InfluxDB setzt darauf, dass Systeme ihre Daten in die DB schreiben, Prometheus holt die Daten selbstständig per Job ab. Meiner Erfahrung nach ist Prometheus auch bescheidener im CPU-„Verbrauch“ und den Ansprüchen an die Hardware. Das ist aber rein subjektiv.

Ein kleiner Nachteil von Prometheus ist, dass das System (noch) keine Standardschnittstelle in Proxmox hat. Allerdings kann man das selber mit wenigen Klicks nachrüsten. Auf GitHub gibt es das passende Repository.

Wer ohnehin schon eine Docker-Umgebung am Laufen hat, der kann mit wenigen Zeilen docker-compose.yaml einen Datenextraktor installieren. Dieser ruft die Daten von Proxmox ab und lädt sie in die Datenbank. Ich gehe jetzt davon aus, dass du Prometheus bereits installiert hast. Falls nicht, genügt unter Debian-basierten Installationen ein einfaches:

sudo apt install prometheus

Den Rest erledigt dann deine Distribution. Erreichbar ist Prometheus dann unter http://IP_ADRESSE:9090.

Daten extrahieren: Exporter

Um den Exporter ans Laufen zu bekommen sollte Docker lauffähig sein. Hierzu findest du im Netz eine Menge Anleitungen. Ist das erledigt, kannst du mit folgendem Code in einer docker-compose.yaml den Extraktor konfigurieren:

version: "3.3"
services:
  prometheus-pve-exporter:
    init: true
    container_name: prometheus-pve-exporter
    ports:
      - IP_DER_DOCKERINSTANZ:9619:9221
    volumes:
      - /opt/pve_prometheus_exporter/config/pve.yml:/etc/prometheus/pve.yml
    image: prompve/prometheus-pve-exporter
    restart: unless-stopped
networks: {}

Aus Sicherheitsgründen solltest du die Zugangsdaten zu deinem Proxmox-Exporter einschränken. Lege hierzu einen User mit Namen „api“ an. Dann ordnest du dem User die Berechtigung PVE_AUDIT (damit kann ausschließlich lesend auf die Daten zugegriffen werden) zu und vergibst ein sicheres Passwort.

Dieses legst du dann in unserem Beispiel unter:
/opt/pve_prometheus_exporter/config/pve.yml mit folgendem Code ab:

default:
    user: api@pam
    password: DEIN_SICHERES_PASSWORT
    # Optional: set to false to skip SSL/TLS verification
    verify_ssl: false

Nach einem „docker-compose up -d“ läuft der Container und wir können nun daran gehen, einen Job in Prometheus einzurichten, der die Daten mit dem gerade gestarteten Exporter regelmäßig abgreift.

Prometheus einrichten

Dazu passt du nun die prometheus.yml an, die du in einem Debian-System unter /etc/prometheus findest. Im Abschnitt scrape-configs findest du die Jobs, die schon eingerichtet sind. Hier kannst du folgenden Code (angepasst natürlich) einfügen:

  - job_name: 'pve01'
    static_configs:
      - targets:
        - IP_DEINES_PROXMOX_SERVERS
    metrics_path: /pve
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: IP_DES_PVE_EXPORTER:9619  # PVE exporter.

Das war es dann schon. Beim nächsten run des Prometheus-Jobs solltest du in der Datenbank Einträge finden, die mit pve_ beginnen. Das sieht in Prometheus dann so aus:

Auswahlmenü in Prometheus. Es werden die Einträge von Proxmox angezeigt.
Prometheus und Proxmox kennen sich jetztz

In Grafana kann man die Werte dann natürlich sehr schön auswerten. Aber das ist dann eine andere Geschichte und Thema eines weiteren Blog-Eintrags.

Fazit

Ob man nun InfluxDB oder Prometheus bevorzugt, ist Geschmackssache. Ich persönlich halte Prometheus für etwas spröder, es konzentriert sich aber auf den Kern der Sache und überlässt Darstellung etc. anderen Tools. Das entspricht klassischer Open-Source-Denkweise und liegt mir persönlich eher. Außerdem gibt es mittlerweile eine Menge Exporter, die Metriken für Prometheus aufbereiten. So kann man unterschiedlichste Systeme in die Datenbank integrieren, die keine InfluxDB-Schnittstelle bereitstellen. bei mir sind das beispielsweise

  • Paperless NGX
  • Pi-Hole
  • AdGuard Home
  • Jellyfin

Punkt für Prometheus.