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 !
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 ?
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.
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