Help build the future of open source observability software Open positions

Check out the open source projects we support Downloads

We cannot remember your choice unless you click the consent notice at the bottom.

Schritt-für-Schritt-Anleitung zum Einrichten des Prometheus Alertmanager für Slack, PagerDuty, und Gmail

Schritt-für-Schritt-Anleitung zum Einrichten des Prometheus Alertmanager für Slack, PagerDuty, und Gmail

2020-02-25 8 min

In meinem vorherigen Blogbeitrag, “How to explore Prometheus with easy ‘Hello World’ projects” habe ich drei Projekte beschrieben, mit denen ich ein besseres Verständnis dafür bekam, was Prometheus eigentlich alles kann. In diesem Beitrag zeige ich euch, wie ich mich mit dem Prometheus Alertmanager vertraut gemacht habe und wie ich Benachrichtigungen für Slack, PagerDuty, und Gmail eingerichtet habe.

(Ich beziehe mich öfters auf meinen vorherigen Blogbeitrag, also empfehle ich euch, diesen durchzulesen, bevor ihr hier weiterlest.)

Grundlegendes

Mit Grafana Cloud könnt ihr schon nach wenigen Minuten mit Prometheus loslegen. Wir haben neue, kostenlose und kostenpflichtige Grafana-Cloud-Pläne für jeden Anwendungsbereich – meldet euch jetzt kostenlos an.

Für das Einrichten von Alarms mit Prometheus sind zwei Schritte notwendig:

Zunächst müsst ihr Alarmregeln in Prometheus erstellen und festlegen, bei welchen Bedingungen ihr benachrichtigt werden wollt (wenn zum Beispiel eine Instanz ausfällt).

Danach müsst ihr den Alertmanager einrichten, der die in Prometheus festgelegten Alarms erhält. Der Alertmanager kann dann verschiedenste Dinge tun, unter anderem Folgendes:

  • Er kann ähnliche Alarms in einer Benachrichtigung zusammenfassen.
  • Er kann Alarms eine bestimmte Zeit lang stumm schalten.
  • Er kann Benachrichtigungen für bestimmte Alarms stummschalten, wenn andere bestimmte Alarms bereits ausgelöst wurden.
  • Er kann auswählen, welche Empfänger eine bestimmte Alarm erhalten.

Schritt 1: Alarmregeln in Prometheus erstellen

Wir beginnen mit vier Unterordnern, die wir zuvor für jedes Projekt erstellt haben: server, node_exporter, github_exporter, and prom_middleware. Diesen Vorgang erkläre ich in diesem Blogbeitrag an einfachen Projekten in Prometheus.

Wir gehen zum Unterordner server, öffnen den Inhalt im Code-Editor und erstellen eine neue Regeldatei. In der Datei rules.yml gebt ihr die Bedingungen an, zu denen ihr alamiert werden möchtet.

cd Prometheus/server
touch rules.yml

Ihr stimmt mir sicher zu, wenn ich sage, dass es äußerst wichtig ist zu wissen, wenn eine Instanz ausfällt. Daher setze ich das als Bedingung, indem ich die Metrik up verwende. Wird diese Metrik in der Prometheus-Benutzeroberfläche evaluiert (http://localhost:9090), sieht man, dass alle laufenden Instanzen den Wert 1 haben, während alle derzeit nicht laufenden Instanzen den Wert 0 haben (derzeit läuft nur unsere Prometheus-Instanz).

Evaluierung der Metrik „Up” in der Prometheus-Benutzeroberfläche, um zu sehen, welche Instanzen laufen

Nachdem ihr euch für die Bedingungen, zu denen ihr gewarnt werden möchtet, entschieden habt, müssen diese in rules.yml festgelegt werden. Der Inhalt muss folgendermaßen aussehen:

groups:
- name: AllInstances
  rules:
  - alert: InstanceDown
    # Condition for alerting
    expr: up == 0
    for: 1m
    # Annotation - additional informational labels to store more information
    annotations:
      title: 'Instance {{ $labels.instance }} down'
      description: '{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minute.'
    # Labels - additional labels to be attached to the alert
    labels:
      severity: 'critical'

Zusammenfassend heißt das, dass eine Alarm ausgelöst wird, wenn eine der Instanzen für eine Minute ausfällt (up == 0). Ich habe auch Anmerkungen und Labels hinzugefügt, in denen zusätzliche Informationen zur Alarm angegeben werden können. Für diese können Variablenvorlagen wie {{ $labels.instance }} verwendet werden, die dann in spezifische Instanzen interpoliert werden (wie localhost:9100).

(Weitere Infos zu Alarmregeln in Prometheus findet ihr hier.)

Sobald rules.yml entsprechend angepasst wurde, müsst ihr die Datei mit prometheus.yml verknüpfen und eine Warnkonfiguration hinzufügen. Euer prometheus.yml sollte folgendermaßen aussehen:

global:
  # How frequently to scrape targets
  scrape_interval:     10s
  # How frequently to evaluate rules
  evaluation_interval: 10s

# Rules and alerts are read from the specified file(s)
rule_files:
  - rules.yml

# Alerting specifies settings related to the Alertmanager
alerting:
  alertmanagers:
    - static_configs:
      - targets:
        # Alertmanager's default port is 9093
        - localhost:9093

# A list of scrape configurations that specifies a set of
# targets and parameters describing how to scrape them.
scrape_configs:
  - job_name: 'prometheus'
    scrape_interval: 5s
    static_configs:
      - targets:
        - localhost:9090
  - job_name: 'node_exporter'
    scrape_interval: 5s
    static_configs:
      - targets:
        - localhost:9100

Wenn ihr Prometheus mit der Flagge --web.enable-lifecycle gestartet habt, könnt ihr die Konfiguration neu laden, indem eine POST-Anfrage an den /-/reload-Endpunkt curl -X POST http://localhost:9090/-/reload geschickt wird. Startet danach die Anwendung prom_middleware (node index.js im Ordner prom_middleware) und node_exporter (./node_exporter im Ordner node_exporter). Sobald dies geschehen ist, könnt ihr jedes Mal, wenn ihr eine Alarm erstellen möchtet, einfach die Anwendung node_exporter oder prom_middleware stoppen.

Schritt 2: Alertmanager einrichten

Erstellt den Unterordner alert_manager im Prometheus-Ordner mkdir alert_manager. Ladet dann in diesen Ordner den Alertmanager von der Website von Prometheus herunter, extrahiert ihn, nehmt keine Änderungen an alertmanager.yml vor, führt `./alertmanager –config.file=alertmanager.yml` aus und öffnet localhost:9093.

Abhängig davon, ob aktive Alarms vorliegen oder nicht, sollte der Alertmanager richtig eingerichtet sein und in etwa wie der folgende Screenshot aussehen. Um die Annotationen anzuzeigen, die im vorherigen Schritt hinzugefügt wurden, klickt man auf die Schaltfläche +Info.

*Prometheus Alertmanager mit 2 aktiven Alarms.*
Prometheus Alertmanager mit 2 aktiven Alarms.

Wenn all dies abgeschlossen ist, sehen wir uns nun die verschiedenen Möglichkeiten an, den Alertmanager zu nutzen und Benachrichtigungen zu Alarm zu versenden.

So werden Slack-Alarms eingerichtet

Wenn ihr Benachrichtigungen über Slack erhalten möchtet, müsst ihr Teil eines Workspaces auf Slack sein. Wenn ihr derzeit nicht Teil eines Slack-Workspaces seid oder die Funktion in einem anderen Workspace ausprobieren möchtet, könnt ihr hier schnell einen erstellen.

Um Alarms in eurem Workspace in Slack einzurichten, braucht ihr eine Slack-API-URL. Geht dazu zu Slack -> Administration -> Apps verwalten.

*Öffnet **Apps verwalten** in eurem Slack-Workspace.*
Öffnet Apps verwalten in eurem Slack-Workspace.

Sucht im Verzeichnis nach Incoming WebHooks und fügt es zu eurem Slack-Workspace hinzu.

*Fügt „Incoming WebHooks“ zu eurem Slack-Workspace hinzu.*
Fügt „Incoming WebHooks“ zu eurem Slack-Workspace hinzu.

Gebt anschließend an, in welchem Kanal ihr Benachrichtigungen vom Alertmanager erhalten möchtet. (Ich habe dazu den Kanal #monitoring-infrastructre erstellt.) Wenn ihr die Incoming-WebHooks-Intergration bestätigt und hinzugefügt habt, wird eine Webhook-URL (dies ist eure Slack-API-URL) angezeigt. Kopiert sie.

*Angezeigte Webhook-URL.*
Angezeigte Webhook-URL.

Danach müsst ihr die Datei alertmanager.yml anpassen. Öffnet zunächst den Unterordner alert_manager in eurem Code-Editor und füllt die Datei alertmanager.yml anhand der unten stehenden Vorlage aus. Gebt die URL, die ihr gerade kopiert habt, als slack_api_url an.

global:
resolve_timeout: 1m
slack_api_url: 'https://hooks.slack.com/services/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'

route:
receiver: 'slack-notifications'

receivers:
- name: 'slack-notifications'
slack_configs:
- channel: '#monitoring-instances'
send_resolved: true

Ladet die Konfiguration neu, indem ihr eine POST-Anfrage an den /-/reload -Endpunkt curl -X POST http://localhost:9093/-/reload sendet. In ein paar Minuten (sobald mindestens eine eurer Instanzen gestoppt wird), solltet ihr eine Warnmeldung über Slack bekommen, die etwa folgendermaßen aussieht:

*Warnmeldung über Slack.*
Warnmeldung über Slack.

Wenn ihr eure Benachrichtigungen verbessern und sie etwas hübscher aussehen lassen wollt, könnt ihr die folgende Vorlage nutzen oder dieses Tool ausprobieren und eigene Vorlagen erstellen.

global:
resolve_timeout: 1m
slack_api_url: 'https://hooks.slack.com/services/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'

route:
receiver: 'slack-notifications'

receivers:
- name: 'slack-notifications'
slack_configs:
- channel: '#monitoring-instances'
send_resolved: true
icon_url: https://avatars3.githubusercontent.com/u/3380462
title: |-
     [{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .CommonLabels.alertname }} for {{ .CommonLabels.job }}
{{- if gt (len .CommonLabels) (len .GroupLabels) -}}
       {{" "}}(
{{- with .CommonLabels.Remove .GroupLabels.Names }}
{{- range $index, $label := .SortedPairs -}}
           {{ if $index }}, {{ end }}
{{- $label.Name }}="{{ $label.Value -}}"
         {{- end }}
       {{- end -}}
       )
     {{- end }}
text: >-
{{ range .Alerts -}}
*Alert:* {{ .Annotations.title }}{{ if .Labels.severity }} - `{{ .Labels.severity }}`{{ end }}

*Description:* {{ .Annotations.description }}

*Details:*
{{ range .Labels.SortedPairs }} • *{{ .Name }}:* `{{ .Value }}`
       {{ end }}
     {{ end }}

So sieht das Endergebnis aus:

*Verschönerte Warnmeldung.*
Verschönerte Warnmeldung.

So richtet ihr PagerDuty-Alarms ein

PagerDuty ist eine der bekanntesten Incident-Response-Platform für IT-Abteilungen. Um Alarms über PagerDuty einzurichten, müsst ihr zunächst ein Konto auf der Plattform erstellen. (PagerDuty ist kostenpflichtig, aber ihr könnt zumindest die 14-tägige Testversion nutzen.) Sobald ihr angemeldet seid, geht zu Konfiguration -> Services -> +Neuer Service.

*PagerDuty-Startbildschirm*
PagerDuty-Startbildschirm

Wählt Prometheus aus der Liste der Integrationen aus und vergebt einen Namen für den Service. Ich habe meinen Prometheus Alertmanager genannt. (Ihr könnt auch die Incident-Einstellungen anpassen, ich habe mich jedoch hier für die Standardeinrichtung entschieden.) Klickt dann auf „Speichern“

*Einen Service zu PagerDuty hinzufügen.*
Einen Service zu PagerDuty hinzufügen.

Der Integrationsschlüssel wird angezeigt. Kopiert ihn.

*PagerDuty-Integrationsschlüssel.*
PagerDuty-Integrationsschlüssel.

Ihr müsst dann den Inhalt von alertmanager.yml anpassen. Es sollte wie das folgende Beispiel aussehen, jedoch mit eurem eigenen service_key (d. h. eurem Integrationsschlüssel aus PagerDuty). Pagerduty_url sollte gleich bleiben und auf https://events.pagerduty.com/v2/enqueue gesetzt werden. Speichert die Datei und startet den Alertmanager neu.

global:
resolve_timeout: 1m
pagerduty_url: 'https://events.pagerduty.com/v2/enqueue'

route:
receiver: 'pagerduty-notifications'

receivers:
- name: 'pagerduty-notifications'
pagerduty_configs:
- service_key: 0c1cc665a594419b6d215e81f4e38f7
send_resolved: true

Stoppt eine eurer Instanzen. Nach einigen Minuten sollte eine Warnmeldung in PagerDuty angezeigt werden.

*Alarm an PagerDuty gesendet.*
Alarm an PagerDuty gesendet.

In den PagerDuty-Benutzereinstellungen könnt ihr entscheiden, wie ihr benachrichtigt werden möchtet, also per E-Mail und/oder Telefonanruf. Ich habe mich für beides entschieden, und beide Optionen funktionieren.

So richtet ihr Gmail-Alarms ein

Wenn ihr eure Benachrichtigungen lieber direkt per E-Mail bekommt, ist die Einrichtung noch einfacher. Alertmanager kann Nachrichten einfach an euren Provider – in diesem Fall Gmail – weiterleiten, der dann in eurem Namen entsprechende Nachrichten schickt.

Es wird nicht empfohlen, dafür dein persönliches Passwort zu verwenden. Ihr solltet daher ein App-Passwort erstellen. Geht dazu zu Kontoeinstellungen -> Sicherheit -> Bei Google anmelden -> App-Passwort (wenn die Option „App-Passwort“ nicht angezeigt wird, habt ihr vermutlich die 2-Faktor-Authentifizierung noch nicht eingerichtet. Dann müsst ihr diese zuerst einrichten). Kopiert das neu erstellte Passwort.

*App-Passwort für Gmail erstellen.*
App-Passwort für Gmail erstellen.

Ihr müsst den Inhalt der Datei alertmanager.yml erneut aktualisieren. Der Inhalt sollte wie auf dem folgenden Beispiel aussehen. Vergesst nicht, die E-Mail-Adresse mit eurer eigenen E-Mail-Adresse und das Passwort mit eurem neuen App-Passwort zu ersetzen.

global:
resolve_timeout: 1m

route:
receiver: 'gmail-notifications'

receivers:
- name: 'gmail-notifications'
email_configs:
- to: monitoringinstances@gmail.com
from: monitoringinstances@gmail.com
smarthost: smtp.gmail.com:587
auth_username: monitoringinstances@gmail.com
auth_identity: monitoringinstances@gmail.com
auth_password: password
send_resolved: true

Auch hier solltet ihr nach ein paar Minuten (nachdem mindestens eine eurer Instanzen gestoppt wurde) eine Warnmeldung auf eure Gmail-Adresse bekommen.

*Warnmeldung an Gmail gesendet.*
Warnmeldung an Gmail gesendet.

Und das ist auch schon alles!