Erste Schritte mit Prometheus

19.10.2020 Raffael Schneider
Cloud Tech cloud-native monitoring microservices handson

Prometheus ist ein Event Monitoring und Alerting Anwendung für Cloud-Infrastrukturen. Das Projekt ist in Go geschrieben und zählt zu den Graduated Projects in der Cloud Native Computing Foundation. Es gilt als das de-facto Monitoring in der Cloud.

Die Idee bei Prometheus ist, dass eine zentrale Node Metriken und Alerting-Informationen aggregiert. Dabei werden die Metriken per HTTP-Pulling von einer im Vorfeld deklarierten Anzahl Nodes gezogen. Diese Nodes, auch Targets genannt, exponiert diese Informationen. Der Prometheus Server aggregiert diese in einer Zeitreihen-Datenbank, triggert wenn vorhanden push alerts, und kann die Daten zur Weiterverarbeitung durch Data visualization tools wie Grafana exposen.

Architektur in Kürze

prometheus-architecture

Prometheus lokal ausprobieren

Dank seiner minimalistischen Architektur und seiner unkomplizierten Installation lässt sich Prometheus einfach ausprobieren.

Prometheus Server starten

Laden Sie die letzte Version von Prometheus herunter. Beispielsweise in der Version 2.22.2 direkt über das Terminal wie hier gezeigt:

$ wget https://github.com/prometheus/prometheus/releases/download/v2.22.2/prometheus-2.22.2.linux-amd64.tar.gz

Entpacken Sie nun das Archiv, switchen Sie in das entpackte Verzeichnis und starten Sie Prometheus per prometheus-Binary:

$ tar xzvf prometheus-2.22.2.linux-amd64.tar.gz
$ cd prometheus-2.22.2.linux-amd64
$ ./prometheus

Nun kann der Prometheus Server über localhost:9090 aufgerufen werden. Dieser redirectet gleich auf eine UI-Oberfläche unter /graph. Ein weiterer Endpunkt der alle aggregierten Metrics exponiert ist unter /metrics einsehbar. Das UI sieht so aus: prometheus-ui

In der UI kann man mit der hauseigenen Query-Language PromQL Abfragen ausführen. Zurzeit werden bis auf die Server eigenen Metriken keine anderen aggregiert. Um die PromQL zu testen, können Sie eine sum(prometheus_http_requests_total) -Query laufen lassen die uns die Anzahl von HTTP-Aufrufe summiert.

Herzstück der Konfiguration von Prometheus ist die prometheus.yml die sich im extrahierten Verzeichnis befindet. Per Default sieht diese wie folgt aus:

# my global config
global:
  scrape_interval:     15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
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']

Darin erkennt man, dass Prometheus alle 15 Sekunden das Scraping auslöst, was wiederum alle Metriken aller Targets zieht (pull). Targets sind die Zielsysteme woraus die Metriken aggregiert werden. Nun, wir haben noch keine Targets die gescraped werden, da wir erst noch welche exponieren müssen. Dies können Sie erreichen, in dem Sie auf den Zielsystemen einen sogenannten node_exporter laufen lassen.

Targets exponieren

Da wir Prometheus lokal ausprobieren, werden wir das Target auf dem gleichen Rechner laufen lassen worauf auch der Prometheus Server läuft.

Laden Sie die letzte Version vom node_exporer herunter. Hier noch in der Version 1.0.1:

$ wget https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz

Genau gleich wie vorhin, entpacken Sie das Archiv, switchen Sie in das Verzeichnis und lassen Sie den node_exporter wie folgt laufen:

$ tar xzvf node_exporter-1.0.1.linux-amd64.tar.gz
$ cd node_exporter-1.0.1.linux-amd64
$ ./node_exporter

Sobald dieser läuft, können die Metriken unter localhost:9100/metrics eingesehen werden.

$ curl http://localhost:9100/metrics

Der Output des obigen curl sollte in etwa sowas ausgeben:

go_gc_duration_seconds{quantile="0"} 3.8996e-05
go_gc_duration_seconds{quantile="0.25"} 4.5926e-05
go_gc_duration_seconds{quantile="0.5"} 5.846e-05
...

Dieser exponiert per Default in dieser Form lediglich Maschinenmetriken. Um weitere Informationen auf Prozess- oder Applikationsebene zu exponieren müssen diese dem node_exporter explizit gegeben werden.

Jetzt müssen Sie noch dem Prometheus Server sagen, dass er diese Node pullen kann. Hierzu muss die oben exponierte Node dem prometheus.yml hinzugefügt werden:

scrape_configs:
- job_name: node
  static_configs:
  - targets: ['localhost:9100']

Nach jedem Pull aggregiert nun der Prometheus Server die Metriken die über die Node hineinkommen.

Next Steps

Der nächste Schritt wären, wie man Grafana mit Monitoring aus Prometheus visuell darstellen kann. Das folgt im nächsten Blog-Beitrag dazu.

Weiterführende Links:

Prometheus | GitHub

Prometheus | Cloud Computin 2020 Exercises

Prometheus in Kubernetes | CoreOS Blog

Raffael Schneider – crafter, disruptor, free spirit. As a fervent software craftsmanship, Raffael likes to write about programming languages and software resilience in modern distributed systems. Be it DevOps, SRE or systems architecture, he always got a new way of approaching things.