Monitoring mit Prometheus

Installation

Prometheus und die meisten Tools rund um Prometheus sind in der von Google entwickelten Sprache Go geschrieben.

Daher handelt es sich meist um einzelne, ausführbare, Dateien die auch keine zusätzlichen Abhängigkeiten zu weiteren Bibiotheken haben.

Auf der Homepage von Prometheus werden die bereits vorbereiteten Dateien in komprimierter Form angeboten und können direkt heruntergeladen werden.

$ wget https://github.com/prometheus/prometheus/releases/download/v2.14.0/prometheus-2.14.0.linux-amd64.tar.gz
$ tar xvzf prometheus-2.14.0.linux-amd64.tar.gz
$ cd prometheus-2.14.0.linux-amd64
$ ls -l
insgesamt 137576
drwxr-xr-x 2 mgisbers mgisbers 80 11. Nov 17:17 console_libraries
drwxr-xr-x 2 mgisbers mgisbers 180 11. Nov 17:17 consoles
-rw-r--r-- 1 mgisbers mgisbers 11357 11. Nov 17:17 LICENSE
-rw-r--r-- 1 mgisbers mgisbers 3184 11. Nov 17:17 NOTICE
-rwxr-xr-x 1 mgisbers mgisbers 80046526 11. Nov 15:29 prometheus
-rw-r--r-- 1 mgisbers mgisbers 926 11. Nov 17:17 prometheus.yml
-rwxr-xr-x 1 mgisbers mgisbers 47302797 11. Nov 15:30 promtool
-rwxr-xr-x 1 mgisbers mgisbers 13502492 11. Nov 15:30 tsdb

Das Programm prometheus kann hier auch direkt mit ./prometheus ausgeführt werden.

Für die meisten Distributionen existieren aber auch Pakete mit denen sich Prometheus direkt aus der Paketverwaltung heraus installieren lässt.

Erster Start

nach dem ersten Start über den Aufruf ./prometheus wird der Prometheus Server gestartet und über die im gleichen Verzeichnis liegende Konfigurationsdatei prometheus.yml konfiguriert.

Die mitgelieferte Datei enthält nur eine minimale Grundkonfiguration um Prometheus starten zu können. Es werden noch keine Daten abgefragt.

$ ./prometheus
level=info ts=2019-11-21T13:55:21.826Z caller=main.go:296 msg="no time or size retention was set so using the default time retention" duration=15d
level=info ts=2019-11-21T13:55:21.826Z caller=main.go:332 msg="Starting Prometheus" version="(version=2.14.0, branch=HEAD, revision=edeb7a44cbf745f1d8be4ea6f215e79e651bfe19)"
level=info ts=2019-11-21T13:55:21.826Z caller=main.go:333 build_context="(go=go1.13.4, user=root@df2327081015, date=20191111-14:27:12)"
level=info ts=2019-11-21T13:55:21.826Z caller=main.go:334 host_details="(Linux 5.3.8-arch1-1 #1 SMP PREEMPT @1572357769 x86_64 groot (none))"
level=info ts=2019-11-21T13:55:21.826Z caller=main.go:335 fd_limits="(soft=1024, hard=524288)"
level=info ts=2019-11-21T13:55:21.826Z caller=main.go:336 vm_limits="(soft=unlimited, hard=unlimited)"
level=info ts=2019-11-21T13:55:21.827Z caller=main.go:657 msg="Starting TSDB ..."
level=info ts=2019-11-21T13:55:21.827Z caller=web.go:496 component=web msg="Start listening for connections" address=0.0.0.0:9090
level=info ts=2019-11-21T13:55:21.830Z caller=head.go:535 component=tsdb msg="replaying WAL, this may take awhile"
level=info ts=2019-11-21T13:55:21.830Z caller=head.go:583 component=tsdb msg="WAL segment loaded" segment=0 maxSegment=0
level=info ts=2019-11-21T13:55:21.832Z caller=main.go:672 fs_type=TMPFS_MAGIC
level=info ts=2019-11-21T13:55:21.832Z caller=main.go:673 msg="TSDB started"
level=info ts=2019-11-21T13:55:21.832Z caller=main.go:743 msg="Loading configuration file" filename=prometheus.yml
level=info ts=2019-11-21T13:55:21.860Z caller=main.go:771 msg="Completed loading of configuration file" filename=prometheus.yml
level=info ts=2019-11-21T13:55:21.860Z caller=main.go:626 msg="Server is ready to receive web requests."

Stoppen lässt sich der Server über STRG+C.

Wie aus der Ausgabe ersichtlich ist, startet der Server auf Port 9090 der lokalen Maschine. Mit dem Webbrowser lässt sich die Webansicht aufrufen.

http://127.0.0.1:9090

Dies ist das zentrale Webinterface von Prometheus in dem Informationen über den Server im Bereich Status, Alarmmeldungen unter Alerts und Graphen in dem im Bild angezeigten Menu Graph erzeugt und angezeigt werden können.

Um eine einfache Abfrage durchzuführen kann in das Feld Expression der Text "up"eingegeben und dann Execute ausgewählt werden.

Es werden dann alle Ziele (Targets) ausgegeben, die eingerichtet sind. Ziele, die unter Value einen Wert 1 haben, sind auch erreichbar.

Das unter Element angezeigte Target ist der Server selber, der seine eigenen Daten abfragt und genau wie die Daten anderer Targets ablegt. Mit Graph und Console kann hier zwischen einem Graphen und der textuellen Ausgabe umgeschaltet werden.

Somit lassen sich schon einfache Graphen und Abfragen erzeugen.

Die Abfragesprache (PromQL) ist deutlich leistungsfähiger. Um z. B. alle aktuell erreichbaren Targets aufzulisten reicht es als Query "up == 1" zu schreiben.

Scrapen

Bei Prometheus werden die Daten nicht von irgendwelchen lokalen Checks erzeugt und dann ein Status an Prometheus geschickt. In der Regel werden auf den abzufragenden Systemen sogenannte Exporter installiert. Diese starten einen Webserver auf den dann Prometheus zugreift und über den Pfad /metrics Daten abholt. Prometheus selber bietet auch auf https://127.0.0.1:9090/metrics seine eigenen Daten an.

Die mit "#" beginnenden Zeilen sind dabei Kommentare in den Hilfen ("HELP") und Typinformationen ("TYPE") untergebracht sind. In den anderen Zeilen sind die Namen der Felder sowie deren Inhalte. Über die Feldnamen kann nach den Feldern im Webinterface als Expression gesucht werden.

So lässt sich z. B. über "prometheus_config_last_reload_successful" prüfen ob beim letzten neuladen der Konfigurationsdatei Fehler aufgetreten sind. Wenn dieser Wert ungleich 1 ist, dann gab es Fehler.

Um diese Daten regelmäßig einzulesen, wird in der Konfiguration hinterlegt, dass die Daten vom lokalen Server auf Port 9090 unter /metrics geladen werden sollen.

scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ['localhost:9090']

Achtung bei Änderungen in einer yml - Datei. Die Position der einzelnen Spalten wird durch Spaces festgelegt und muss eingehalten werden. Ansonsten werden Syntax - Fehler ausgegeben. Eigentlich sind yaml - Dateien nichts anderes als serialisierte Arrays. Und die Einrückungen stellen die jeweiligen Unterelemente eines Eintrages dar. Einträge, die mehrfach vorkommen können haben dabei einen "-" vor dem Namen. Die Inhalte stehen immer nach dem ":". Aufzählungen können auch in Klammern gesetzt werden (['localhost:9090']).

Am einfachsten könnten wir in die Klammer des Felds "targets" - durch Komma getrennt - einen weiteren Wert einfügen um einen weiteren Exporter abzufragen. Dazu müssen wir nur einen weiteren Exporter installieren.

Node Exporter

Um die Daten einer lokalen Maschine abzurufen wir häufig der "node_exporter" benutzt. Dieser lässt sich auch über den Download - Bereich der Prometheus Homepage herunterladen und mit "./node_exporter" nach dem Entpacken starten.

Nach dem Start meldet er sich mit einer Liste an gestarteten Collectoren und meldet, dass er auf Port 9100 erreichbar ist. Also mal im Browser http:127.0.0.1:9100/metrics aufrufen. Wir sehen hier deutlich mehr Werte als bei Prometheus selber, z. B. "node_filesystem_avail_bytes". Diesen Wert finden wir aktuell noch nicht, wenn wir ihn als Expression eingeben.

Damit er zur Verfügung steht ändern wir die "targets:" Zeile in der prometheus.yml wie folgt:

    - targets: ['localhost:9090','localhost:9100']

Damit Prometheus weiss, dass sich die Konfiguration geändert hat schicken wir ihm das Signal "HUP": "pkill -SIGHUP prometheus".

Ob wir alles richtig gemacht haben, können wir an der Konsolenausgabe von Prometheus oder über den Wert von "prometheus_config_last_reload_successful" nachprüfen.

Sobald Prometheus einmal die Daten bei dem Node Exporter angefragt hat, können wir auch die Anzahl der freien Bytes auf den Dateisystemen im Graph sehen.

Dabei wird uns nun für jedes Ziel (oder auch instance) und jeden Mountpoint eine eigene Zeile angezeigt. Wenn wir uns nur für einen bestimmten Wert interessieren können wir das entsprechend einschränken.

Soll z. B. nur das Root - Dateisystem geprüft werden, dann kann der Filter hinter dem Feldnamen in geschweiften Klammern angegeben werden:

node_filesystem_avail_bytes{mountpoint="/"}

Damit reduziert sich die Ausgabe auf die freien Bytes für alle Mountpoints nach / aller Instanzen.

Last modified: Thursday, 21 November 2019, 4:01 PM