3 décembre 2024

Tuto monitoring Prometheus, partie IV : Gestion des alertes avec Alertmanager

Quatrième partie de la série de tutoriels consacrés au monitoring avec Prometheus : nous allons mettre en place de quoi nous tenir au courant des éventuels problèmes avec Alertmanager.

Pour bien comprendre : Alertmanager se nourrit de alertes (remontées par Prometheus) et dit quoi en faire.
Il est possible d’avoir différents groupes, pour différents types d’alertes, pour avoir, par exemple, les truc vraiment urgent par SMS, etc…

Les règles d’alertes se configurent côté Prometheus.

Ici, on va rester simple et n’avoir qu’un groupe et faire du mail.

Alertmanager sera ici installé sur le même serveur que Prometheus.

 

I – Installation

Et c’est reparti :

# cd
# wget https://github.com/prometheus/alertmanager/releases/download/v0.18.0/alertmanager-0.18.0.linux-amd64.tar.gz
# tar xvf alertmanager-0.18.0.linux-amd64.tar.gz
# cd alertmanager-0.18.0.linux-amd64/
# cp alertmanager /usr/local/bin/
# cp amtool /usr/local/bin/

Puis :

# mkdir /etc/alertmanager
# mkdir /var/lib/alertmanager

II – Configuration

A – Alerte Manager

La configuration se passe dans le fichier /etc/alertmanager/alertmanager.yml :

global:
  smtp_smarthost: 'IP.SERVEURMAIL'
  smtp_from: 'alertmanager@mondomaine.fr'
  smtp_require_tls: false #optionnel, mon smtp interne est en clair, le tls n'étant que pour l'exterieur
route:
  receiver: 'alert-mails'
  group_wait: 30s
  group_interval: 1m
  repeat_interval: 30m

receivers:
- name: 'alert-mails'
  email_configs:
  - to: 'moi@mondomaine.fr'

Je reviens quand même rapidement sur la notion de groupes :

Quand une alerte est déclenchée, elle fait partie d’un groupe.
La, group_wait stipule le temps d’attente pour voir si une autre alerte du même groupe se pointe éventuellement, ceci pour tout envoyer ensemble.
Si une nouvelle alerte du même groupe se présente, c’est group_interval qui va définir le temps entre chaque « batch ».
Et repeat_interval définit le temps de réémission de l’alerte si elle est toujours en cours.

On peut aussi les grouper par label avec par exemple :

  group_by: ['instance']

qui permettra de grouper tout les alertes d’une instance.

Il est possible de faire en fonction de match, de regex…

Bref, de la lecture ici : https://github.com/prometheus/alertmanager et la https://prometheus.io/docs/alerting/configuration/

Et si vous voulez bien gérer le routing, un petit outil pratique :

https://prometheus.io/webtools/alerting/routing-tree-editor/

 

De la même façon que pour Prometheus, on peut recharger la configuration avec :

# curl -X POST http://localhost:9093/-/reload

 

B – Nginx

Alertmanager dispose lui aussi d’une interface Web, et ce coup ci, ce sera https//sous.mondomaine.fr/alertmanager/

Précision : cette interface ne remonte que les alertes en cours (celles que Prometheus lui a envoyées).

Bref, pour Nginx, classique :

location /alertmanager/ {
  proxy_pass http://10.20.1.231:9093/;
  proxy_http_version 1.1;
}

et on…. recharge, c’est bien, vous suivez…

 

III – Mise en place

A – A la mimine

# alertmanager --config.file /etc/alertmanager/alertmanager.yml --storage.path /var/lib/alertmanager/

La aussi, RAS, donc on passe en service.

B – En Service

On fait ce qu’il faut :

# useradd --no-create-home --shell /bin/false alertmanager
# chown alertmanager:alertmanager /etc/alertmanager/ -R
# chown alertmanager:alertmanager /var/lib/alertmanager/ -R
# chown alertmanager:alertmanager /usr/local/bin/alertmanager
# chown alertmanager:alertmanager /usr/local/bin/amtool

Puis le fichier de service /etc/systemd/system/alertmanager.service :

[Unit]
Description=AlertManager
Wants=network-online.target
After=network-online.target

[Service]
User=alertmanager
Group=alertmanager
Type=simple
ExecStart=/usr/local/bin/alertmanager \
    --config.file /etc/alertmanager/alertmanager.yml \
    --storage.path /var/lib/alertmanager/ \
    --web.external-url=https://sous.mondomaine.fr/alertmanager/ \
    --web.route-prefix="/"

[Install]
WantedBy=multi-user.target

La aussi, j’ai ajouté les deux flags web.external-url et web.route-prefix.

Et pour finir :

# systemctl daemon-reload
# systemctl enable alertmanager.service
# service alertmanager start

Puis :

# service alertmanager status

C – Ménage

# cd
# rm alertmanager-0.18.0.linux-amd64 -r
# rm alertmanager-0.18.0.linux-amd64.tar.gz

IV – Utilisation

La première chose à faire est déjà de s’assurer que l’envoi des alertes fonctionne correctement.

Une fois de plus, on va « Curler » avec :

# curl -H "Content-Type: application/json" -d '[{"labels":{"alertname":"Test"}}]' localhost:9093/api/v1/alerts

C’est d’ailleurs de cette façon que Prometheus déclenchera Alertmanager.

Et peu de temps après, un p’tit mail doit arriver.

 

V – Liaison avec Prometheus

On va connecter Prometheus et Alertmanager dans /etc/prometheus/prometheus.yml, où l’on va modifier la partie alerting et la partie rules:

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - localhost:9093
    scheme: http
    timeout: 10s

rule_files:
  - 'rules/*'

Je pense que des explications seront superflues…

Et on recharge Prometheus :

# curl -X POST http://localhost:9090/-/reload

 

VI – Règles

On va d’abord créer un répertoire pour les accueillir :

# mkdir /etc/prometheus/rules

Puis dans ce répertoire, un fichier alerts.yml ou n’importe quel autre nom… :

groups:
  - name: toto
    rules:
    - alert: InstanceDown
      expr: up == 0
      for: 1m
      labels:
        severity: critical
      annotations:
        summary: "L'instance {{ $labels.instance }} est down"
        description: "Le Job: {{ $labels.job }} signale que {{ $labels.instance}} est down depuis deja 1 minute. Tu attends quoi ?"
    - alert: DiskFull
      expr: node_filesystem_free_bytes{mountpoint ="/stockage",instance="serveurparticulier:9100"} / 1024 / 1024 / 1024 < 20
      for: 1m
      labels:
        severity: warning
      annotations:
        summary: "Et zut, on arrive a moins de 20Go sur {{ $labels.instance }}"
        description: "Il reste precisement {{ $value }}"

Dans ce fichier, deux alertes simples pour l’exemple. On peut en mettre autant qu’on veut. Ce que je fait, à titre personnel, c’est un fichier par groupe.

Pour le groupe, rien de sorcier, on lui donne un nom et ensuite les alertes associées.

Pour les alertes, chaque fois la même structure :

  • Le nom de l’alerte, sans espace.
  • L’expression sur laquelle filtrer. Pour la première, c’est simple. Pour la seconde, je filtre sur un serveur en particulier et l’alerte se déclenche si le résultat est inférieur à 20.
  • For indique pendant combien de temps la condition doit être remplies pour que l’alerte soit déclenchées. Elle est Pending pendant ce laps de temps.
  • Ensuite, on peut rajouter des labels.
  • Puis le contenu ou il est possible de reprendre les variables.

On peut vérifier le fichier avec :

# promtool check rules /etc/prometheus/rules/alerts.yml

promtool a été copié avec l’exécutable prometheus dans la partie I si vous avez bien suivi …

On peut remettre les permissions :

# chown prometheus:prometheus /etc/prometheus/ -R

Puis on recharge Prometheus :

# curl -X POST http://localhost:9090/-/reload

Envie d’idée pour de nouvelles règles ?

Allez voir par la : https://awesome-prometheus-alerts.grep.to/rules.html

VII – Tests

Il n’y a plus qu’à tester et rien de plus simple !

Coupons Node Exporter sur une machine ou il est installé.

# service node_exporter stop

On attend quelques instants et dans l’interface de Prometheus https//sous.mondomaine.fr/prometheus/, dans la section Alerts, on doit voir l’alerte passer en orange (et le détail indique Pending)

Puis, une fois le délai for dépassé, elle passe en rouge (Firing) et est transmise à Alertmanager. Elle sera visible dans l’interface https//sous.mondomaine.fr/alertmanager/ et on reçoit le mail également.

 

VIII – Les alertes dans Grafana ?

Oui, c’est possible !

Il faut au préalable installer un plugin Grafana. Les plugins sont disponibles ici : https://grafana.com/grafana/plugins

Et pour l’installer, sur la machine ou est installé grafana :

# grafana-cli plugins install camptocamp-prometheus-alertmanager-datasource
# service grafana restart

On retourne dans Grafana, on ajoute une source de données : Configuration, Data Sources, Add data sources.

Puis : Prometheus AlertManager.

Dans la config : http://IP.ALERTEMANAGER:9093 et le reste par défaut.

Une fois enregistré, faites un nouveau panel et une nouvelle requête.

A côté de Query est indiqué default (qui est la base prometheus). Et bien, tout simplement, vous allez choisir prometheus-alertmanager.

Passez le graphique en mode tableau… et rien….

Il faut en effet rajouter une légende pour que cela fonctionne.
Autre petit bug, la severity n’apparait pas,bien qu’on puisse filtrer dessus dans la requête avec par exemple : severity= »critical ». On peut bien évidement filtrer sur les champs que l’on veut.
Et pour n’afficher que certaines colonnes, c’est dans Labels avec par exemple : alertname, instance, description

Après, on peut mettre en couleur, faire des seuils, etc…

Pour en savoir plus, c’est ici : https://grafana.com/grafana/plugins/camptocamp-prometheus-alertmanager-datasource

Ha, et je viens de voir qu’il existe un dashboard : https://grafana.com/grafana/dashboards/8010

A vous de tester !

 

IX – Conclusion

Une fois de plus, rien de bien sorcier au final. C’est rapidement mis en place, facile à comprendre et donc facile à mettre en production.

Avec tout ce qu’on a installé jusque la, on a déjà de quoi bien s’amuser. Mais il est encore des choses dont je veux vous parler…

Et pour commencer, on va causer de Blackbox, la sonde « boite noire »

 


Envie de me soutenir et de me payer un café ? C’est sur la page Don !

3 réflexions sur « Tuto monitoring Prometheus, partie IV : Gestion des alertes avec Alertmanager »

  1. Tout marche trés bien, (pour la messagerie, n’ayant pas de service interne, je verrais plus tard, votre partie sur postfix m’interesse bien) par contre, les alerts ne sont pas en directe, je dois réactualiser la page, est ce normal ou j’ai conclu trop vite ?

    1. Oui, c’est normal, la page d’Alertmanager n’est pas dynamique. A dire vrai, je ne m’en sers jamais, car les alertes arrivent correctement par mail (et en direct 😉 )

      Et pour le mail, y’a en effet le tuto Messagerie qui te permettra d’installer une solution complète.

  2. Tu as juste oublié de spécifier qu’il faut donner le port du « smtp_smarthost » (XXX.XXX.XXX.XXX:25 par défaut).
    Je pensais qu’il le trouverait tout seul étant donné qu’il s’agit de SMTP, mais non, j’ai ça dans les logs :
    file=/etc/alertmanager/alertmanager.yml err= »address XXX.XXX.XXX.XXX: missing port in address »

    Pas très malin le truc…

    Sinon, encore un grand merci pour le travail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *