L’alerting dans Grafana

En plus de sa fonction première qui est la création de dashboards, Grafana depuis sa version 4.0, ajoute une corde à son arc avec une fonctionnalité d'alerting . Pour rappel, Grafana est une solution Open Source de dashboards avec l'agencement de widget via une interface Web. Grafana est souvent résumé à une interface Web pour Graphite, (solution de stockage time serie), ce qui est assez rédhibitoire  étant donnée le nombre de sources de données qui peuvent être utilisées en entrées des dashboards : 25 au moment de l'écriture de cet article, certaines native à la solution (Graphite, Elasticsearch, InfluxDB, MySQL très prochainement, ...) et d'autres issues de la communauté open source et directement intégrables via la CLI de Grafana (Google Calendar, Open NMS, Cloudera Manager...).

Installation et démarrage de Grafana

Son installation et son exécution sont on ne peut plus simples, il suffit de se rendre sur cette page https://grafana.com/grafana/download et sélectionner le système d'exploitation cible. Il y a également une image Docker. La  dernière version en release au moment de l'écriture de cet article est la 4.3.2.

Si vous choisissez la version en téléchargement, une fois cette dernière récupérée, il vous suffit de décompresser l'archive puis d'exécuter la commande :

/bin/grafana-server

Par défaut Grafana s'exécute sur le port 3000, donc dans un navigateur si vous saisissez l'adresse http://localhost:3000 vous devriez arriver sur la page de login. Par défaut le compte administrateur est :

user = admin
password = admin

Et vous arrivez sur la home de Grafana :

Faire sonner Grafana

Par défaut l'alerting est activé dans la configuration de Grafana, vous pouvez cependant le désactiver dans le fichier de configuration /conf/default.ini en modifiant cette portion

#################################### Alerting ############################
[alerting]
# Disable alerting engine & UI features
enabled = true
# Makes it possible to turn off alert rule execution but alerting UI is visible
execute_alerts = true

En passant la propriété enabled à false, l'alerting ne sera pas du tout visible dans Grafana, en passant la propriété execute_alerts à false, toutes les fonctionnalités d'alerting sont accessibles mais aucune alerte ne sonne.

Les data sources éligibles

Plus tôt j'ai indiqué que Grafana accepte 25 data sources, malheureusement l'alerting n'est pas disponible pour toute les data sources, dans la version 4.3.2 l'alerting est disponible pour :

Dans la suite de l'article j'utiliserai Graphite que vous pourrez installer simplement soit via synthesize comme indiqué dans la documentation de graphite soit grâce cette image docker. Ces deux solutions installent CollectD  qui permet de collecter des données sur les performances machines, lesquelles seront stockées dans Graphite et nous servirons à créer nos alertes.

Les canaux de notifications

L'alerting de Grafana propose de nombreux canaux de notifications dont voici la liste pour la version 4.3.2 :

  • Email
  • Slack
  • PagerDuty
  • Webhook
  • HipChat
  • VictorOps
  • Sensu
  • OpsGenie
  • Threema
  • Pushover
  • Telegram
  • LINE

Pour cette démo, j'utiliserai les notifications vers Slack.

Un soupçon de configuration

Avant de faire sonner notre première alerte, nous devons configurer quelques éléments.

Les captures d'images

Comme nous le verrons, une alerte se déclare à partir des données utilisées pour créer un widget Grafana. Par défaut les alertes n'envoient pas de capture d'image du widget au moment où la donnée du widget a atteint le seuil critique déclenchant une alerte. Pour cela il faut configurer un espace de stockage pour les captures d'images pouvant être Amazon S3 ou WebDav. Ici,  j'ai choisi le stockage sur Amazon.

Pour la configuration de votre stockage Amazon S3 je vous renvoie vers cet article expliquant de manière simple comment réaliser la configuration.

Une fois que vous aurez créé votre stockage S3, il vous faut le renseigner dans le fichier de configuration /conf/default.ini en modifiant cette portion

#################################### External Image Storage ##############
[external_image_storage]
# You can choose between (s3, webdav)
provider = S3

[external_image_storage.s3]
bucket_url = https://mon_bucket.s3-eu-west-1.amazonaws.com/
access_key = mon_access_key
secret_key = mon_secret_key

Une fois votre configuration modifiée, n'oubliez pas de redémarrer Grafana!

Configuration de Slack

En premier lieu il faut avoir créé un compte sur Slack et avoir créé une room. Vous devez également télécharger le client Slack pour recevoir les alertes.

Pour permettre à Grafana d'émettre des alertes vers Slack il faut configurer un "incoming webhook" qui fournira une url avec laquelle nous pourrons envoyer des alertes vers Slack. Une fois connecté sur Slack, vous pouvez accéder à la page Incoming webhooks, il vous suffit alors de  :

  • cliquer sur "Add configuration"
  • sélectionner un nom de chaîne ou bien de cliquer sur le lien "create a new channel"dans la combo "Choose a channel"
  • cliquer sur le bouton "Add incoming webhooks integration"

Voilà vous obtenez une Webhook URL du type "https://hooks.slack.com/services/XXX/YYY/ZZZZ" qui nous servira pour nos alertes.

Configuration de Grafana

Encore de la configuration, pas de panique, nous approchons du but !

Allez sur votre home de Grafana http://localhost:3000 et connectez-vous en admin.

Configuration de la Data Source

En cliquant sur le logo de Grafana vous faites apparaître un menu dans lequel vous avez une entrée "Data Sources".

Cliquez dessus, puis cliquez sur le bouton "+ Add data source"'.

Dans le formulaire :
- donnez un nom à votre data source, par exemple "graphite local"
- pour le type sélectionné "Graphite"
- dans URL "http://localhost:2003"

Puis cliquez sur "ADD". Si la configuration fonctionne un message sur fond vert s'affiche sinon un message sur fond orange remonte une erreur.

Configuration du canal de notification

Dans le menu déroulant au même niveau que les data sources, vous avez une entrée "Alerting" dans laquelle vous devez sélectionner "Notification channels" cliquez dessus, puis cliquez sur le bouton "+ New Channel"'.

Dans le formulaire :
- donnez un nom à votre canal, par exemple "notification slack"
- pour le type sélectionné "Slack"
- cochez la case "Include image"
- dans Url copier l'Url du webhook que vous avez créé dans Slack

Vous pouvez tester votre configuration avec le bouton "Send Test". Si tout est bien configuré vous devriez voir dans votre client Slack une nouvelle notification.

Alerte !

Créer un nouveau dashboard

Nous arrivons arriv à la création de notre alerte. Pour cela il vous faut créer un dashboard dans lequel nous allons ajouter un widget. Une alerte se déclare en effet en fonction des données affichées par le widget. Vous pouvez ainsi passer par le menu déroulant, comme pour la data source et la notification, cliquer sur "Dashboards" puis sur "+ New". Vous arriverez sur une nouvelle page dans laquelle vous pouvez sélectionner le type de widget à ajouter. Nous ajoutons ici un widget "Graph":

Par défaut le widget est initialisé avec des données mockées pour donner un aperçu du graph. Pour notre exemple, nous allons surveiller le taux d'occupation des processeurs de la machine et déclarer une alerte quand le taux atteint un certain niveau. Pour éditer un widget il faut cliquer sur son titre ici "Panel title" ce qui fait apparaître un petit menu dans lequel vous avez un bouton "edit":

Une nouvelle zone à onglets s'affiche ouverte sur "Metrics" c'est là que nous allons indiquer les données affichée par notre widget :

Il faut ensuite sélectionner la data source que vous avez déclaré précédemment, via la combobox "Panel data source", par défaut sur "Default".

Ensuite vous pourrez saisir la requête qui va aller sélectionner les données relatives à votre consommation CPU dans Graphite  sur la ligne ayant le label "A". Grafana vous permet de saisir votre requête avec des aides à la saisie, sous forme de combobox pour chaque élément. Vous pouvez également saisir directement la requête en basculant le mode saisie de la ligne via le bouton en bout de ligne et cliquer sur "Toggle Edit Mode". Maintenant vous allez pouvoir coller cette requête :

aliasByMetric(summarize(averageSeries(collectd.graphite.*.cpu-system), '10min', 'avg', false))

 

Cette requête récupère la moyenne de la consommation de tous les processeurs de la machine sur un laps de temps de 10 minutes :

Avant de créer notre alerte nous allons sauvegarder notre Dashboard, afin qu'aucune erreur ne soit remontée par Grafana. En haut de l'écran, vous avez un bouton en forme de disquette pour sauvegarder.

Mon alerte

Toujours dans l'écran d'édition du widget, vous avez un onglet "Alert", cliquez dessus puis sur le bouton "Create Alert"

Un nouveau formulaire s'affiche ainsi que de nouveaux liens sur la gauche du formulaire. Dans le formulaire vous pouvez donner un nom et une fréquence de d'évaluation à votre alerte. Dans la partie "Conditions" vous pouvez également sélectionner la ou les conditions de déclenchement de votre alerte. Dans mon exemple j'ai indiqué :

WHEN avg() OF query(A, 10m, now) IS ABOVE 0.5

Ici je dis que si la valeur moyenne  sur les 10 dernière minutes de la requête A est au dessus de 0.5 je lève une alerte :

Sur notre graph, une ligne rouge est apparue indiquant le seuil de l'alerte. Une poignée vous permet de faire varier le seuil. En bas du formulaire vous avez un bouton test vous permettant de vérifier le comportement de votre alertes.

Dans cet exemple le seuil n'est pas atteint d'où le "conditionEvals: false=false"

Si vous modifié le seuil de façon à ce que la condition soit remplie vous obtiendrez "conditionEvals: false=true".

Pour l'instant notre alerte ne fait que reporter un état sur la graph. Si nous voulons envoyer une notification vers slack, il faut cliquer sur le lien "Notifications" à gauche du formulaire. Dans le champ "Send to" vous pouvez sélectionner une ou plusieurs configurations de notification. Par exemple, l'alerte concernant slack précédemment déclarée. Puis vous pouvez ajouter un message à votre alerte. Pensez bien à sauvegarder votre dashboard. Dorénavant, dés que votre seuil d'alerte sera atteint, vous obtiendrez une notification slack de ce style :

Avec sur le graph un flag pour chaque changement d'état de votre alerte :

Voilà votre alerte est créée, vous pouvez suivre l'évolution des changements d'état de votre alerte via le lien "State history" à gauche du formulaire de l'alerte, de même que vous pouvez la supprimer. Vous pouvez modifier la configuration de votre alerte, notamment sur le seuil en définissant une plage devaleurs de tests par exemple plutôt qu'un seuil fixe. La documentation de Grafana sur l'alerting décrit bien le fonctionnement.

En bonus

Grafana met à disposition une API Rest pour l'alerting dont vous trouverez le détail dans la documentation. Cette API fournie les ressources suivantes :

  • Get alerts
  • Get one alert
  • Pause alert
  • Get alert notifications
  • Create alert notification
  • Update alert notification
  • Delete alert notification

Pour les alertes les actions possibles sont :

  • Lister les alertes
  • Détails d'une alerte
  • Mettre en pause / activer une alerte

Les actions non disponibles :

  • créer une alerte
  • modifier une alerte
  • supprimer une alerte
  • obtenir l'historique d'une alerte
  • tester une alerte

Conclusion

L'alerting proposé par Grafana est très simple à mettre en place. Elle est directement intégrée dans Grafana 4, pas besoin de plugin. Très peu de configurations sont requises pour utiliser les nombreux canaux de notifications disponibles. La création d'alertes avec cette première mouture de l'outil est facile à utiliser et offre des options intéressantes notamment dans les conditions de tests de valeurs.

Cependant on ne peut que définir un niveau "alert". Il n'y a aucun possibilité d'avoir un niveau "warning". L'accès à l'historique de l'alerte n'offre que trop peu d'informations sur chaque changement d'état. Il n'est pas possible de planifier quand les notifications doivent être émises de façon générale ou même par alerte. L'API est quant à elle plutôt rudimentaire.

L'alerting de Grafana est une fonctionnalité récente qui évolue à chaque version de la solution, c'est donc une bonne solution d'alerting simple qui ne demande qu'à être améliorée Je vous invite à faire un petit tour sur github si vous voulez contribuer.

Un commentaire

Laisser un commentaire

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

Captcha *