Prometheus AlertManager

Photo by Fabiano Rodrigues from Pexels

TL;DR AlertManager permet de récupérer les alertes envoyées par des applications telles que Prometheus. Il est capable de prendre en charge la déduplication, le regroupement et la notification via des emails ou des services de messagerie instantanée tels que Slack. Cet article montre comment utiliser AlertManager avec Prometheus. Il propose une configuration simple pour notifier des utilisateurs par mail.

Avant d'aller plus loin, n'hésitez pas à prendre connaissance des articles ci-dessous:

Prometheus propose dans sa documentation une section Alerting qui permet de prendre en main la configuration d'AlertManager. Vous trouverez ci-dessous :

  • Comment installer et configurer AlertManager, Prometheus et Grafana en quelques commandes
  • La description des ressources Kubernetes spécifique à AlertManager
  • La configuration de notification via mail et via Slack
  • L'intégration entre AlertManager et Prometheus
  • La définition d'une règle d'alerte dans Prometheus
  • Le test d'une alerte et d'une notification

Installer et configurer AlertManager

Les configurations de Prometheus et Grafana sont disponibles dans le répertoire blog/kubernetes-prometheus du projet easyteam-fr/side-effects

Pour l'installer, procédez comme suit:

git clone https://github.com/easyteam-fr/side-effects.git
cd side-effects/blog/kubernetes-prometheus
kubectl create namespace monitoring
kubectl apply -k .

Cette configuration déploient également un exemple d'AlertManager et les paramétrages associés.

Vérifier les ressources Kubernetes pour AlertManager

Le fichier alertmanager-deployment.yaml inclus dans le dossier side-effects/blog/kubernetes-prometheus contient un deployment qui correspond à AlertManager :

apiVersion: apps/v1
kind: Deployment
metadata:
name: alertmanager-deployment
labels:
    app: alertmanager
spec:
selector:
    matchLabels:
    app: alertmanager
template:
    metadata:
    labels:
        app: alertmanager
    spec:
    containers:
    - name: alertmanager
        image: prom/alertmanager:latest
        ports:
        - containerPort: 9093

Ce deployment gère un pod avec la dernière version d'Alertmanager qui est publiée dans le Hub Docker. AlertManager est exposé sur son port par défaut, c'est à dire le port 9093. Afin d'accéder au service localement, utilisez la commande port-forward:

kubectl port-forward deploy/alertmanager-deployment 9093 -n monitoring

Vous pouvez vérifier sur votre navigateur qu'il est bien lancé à l'adresse localhost:9093. Ci-dessous un exemple d'affichage:

Alertmanager sur votre navigateur

Note: la configuration d'AlertManager inclut également un service et un fichier de configuration. Pour en savoir plus, n'hésitez pas regarder le contenu de la configuration

Configurer différents types de notifications

Le fichier de configuration d'AlertManager contient notamment informations utiles pour envoyer des notifications.

Voici un exemple de fichier de configuration pour envoyer des notifications par mail. Vous l'adapterez à votre configuration et précisant en particulier les éléments d'authentification:

global:
route:
  group_by: [alertname]
  receiver: email

receivers:
- name: email
  email_configs:
  - to: "admin@localhost"
    from: "admin@localhost"
    auth_username: "smtpusername"
    auth_password: "smtppassword"
    smarthost: smtp.localhost:25

Les éléments clé du paramétrage sont:

  • global: définit les variables globales,
  • route: contient un arbre de routage en commençant par la règle par défaut
  • receivers: liste des destinataires possibles et servent de base à la section route
  • templates: précise le template, en particulier pour les notifications par mail.

Si vous préférez être notifié sur un channel Slack, utilisez un paramétrage comme celui ci-dessous dans la section receivers:

- name: slack
  slack_configs:
  - api_url: 'https://hooks.slack.com/services/foo'
    channel: '#prod_health'
    send_resolved: true
  • api_url: definit le webhook que vous avez généré
  • channel: précise le channel slack vous ou souhaitez recevoir les alertes

Tester les notifications

Vous pouvez tester les notifications. Pour cela exécutez le script suivant, une fois AlertManager exposé sur le port 9093 local:

alert='[
  {
    "labels": {
       "alertname": "CPUConsumption",
       "instance": "ec2-user"
     },
     "annotations": {
        "info": "The CPU usage is above 80 percent",
        "summary": "please check the service usage"
      }
  }
]'
curl -XPOST -d"$alert" http://localhost:9093/api/v1/alerts

Ce script crée une alerte avec un label et un message et l'envoie vers l'API d'AlertManager comme dans la copie d'écran ci-dessous:

Mail sent by Alertmanager

Configurer Prometheus avec Alertmanager

Grace au service associé à AlertManager, Prometheus peut y accéder via l'alias DNS alertmanager. Vérifiez que le service est opérationnel, pour cela, Connectez-vous au container prometheus:

kubectl exec -itn monitoring prometheus-0 -- sh

Effectuez une requête vers alertmanager:9093 à l'aide de la commande curl ou wget:

wget alertmanager:9093

La section ci-dessous définit l'adresse de AlertManager dans le fichier de configuration de Prometheus:

alerting:
  alertmanagers:
    - static_configs:
      - targets:
        - 'alertmanager:9093'

Définir une règle d'alerte dans Prometheus

Vous pourrez ensuite ajouter des règles d'alerte Prometheus dans un fichier dédié, ici alert.rules.yaml. Pour cela, ajoutez la directive ci-dessous au fichier de configuration prometheus-config.yaml :

rule_files:
  - '/etc/prometheus/alert.rules.yaml'

Ci-dessous un exemple de règle qui envoie une alerte lorsque la mesure up pour le service prometheus-app est absent:

groups:
- name: Instance_down
  - alert: prometheus_app_down
    expr: absent(up{service="prometheus-app"}) == 1
    labels:
      severity: critical
    annotations:
      summary: "Prometheus-app is down"
      description: "Prometheus-app is down" 

Les paramètres clé de la règle sont:

  • alert: est un nom arbitraire que vous donnerez à votre alerte,
  • expr: est la condition pour déclencher une alerte,
  • for: correspond à la durée de pendant laquelle expr est vérifiée pour déclencher l'alerte
  • label: définit la criticité de l'alerte associée, par exemple, info, warning ou critical
  • annotations: est un message associé à l'alerte

Tester les alertes Prometheus

La commande ci-dessous permet de vérifier que les règles définies dans Prometheus sont valides:

promtool check rules /etc/prometheus/alert.rules.yaml

Pour tester l'alerting, vous pouvez créer l'application prometheus-app en appliquant le manifeste kubernetes.yaml situé dans le répertoire blog/prometheus-app du projet easyteam-fr/side-effects:

kubectl apply -f kubernetes.yaml

La suppression de la ressource doit créer l'alerte et la notification

kubectl delete -f kubernetes.yaml

Pour aller plus loin

Cet article montre qu'AlertManager et Prometheus sont simples à mettre en oeuvre. Cela permet d'avoir un système d'alertes et de notifications avec quelques lignes de code.

Pour en savoir plus, n'hésitez pas à visionner Understanding and Extending Prometheus AlertManager et regarder le support de présentation associé

Easyteam DevOps

Easyteam DevOps