Slow and periodic feedback kills

Publié le 24 août 2023

Les notes ci-dessous sont tirées du DevOps Handbook, dont j’avais déjà parlé il y a quelques temps, et touchent principalement à l’agrégation des journaux et des métriques.

In short, slow and periodic feedback kills.
– The Principles of Flow

La récupération de métriques augmente la confiance que l’on peut avoir dans la solution. L’analyse de ces métriques garantit un juste retour d’informations, sous réserve qu’elles soient exploitées correctement. Ceci peut être réalisé en deux étapes:

Collecte des données

La collecte des données doit récupérer des données des couches métiers, applicatives et d’environnement. Ces données couvrent les évènements, les journaux et les métriques - indépendamment de leur source - le pourcentage d’utilisation du processeur, la mémoire utilisée, les disques systèmes, l’utilisation du réseau, …

Côté client, il convient de récupérer les erreurs applicatives, les transactions que l’utilisateur effectue, …

Au niveau du développement, on est parti pour agréger les informations liées aux pipelines de déploiement: statuts des builds, temps de mise à disposition d’une fonctionnalité, fréquence des déploiements, statuts des environnements, …

Outil d’agrégation

Le choix de l’outil d’agrégation doit permettre de collecter, enregistrer, visualiser, alerter, détecter des anomalies et appliquer des transformations statistiques. Par exemple : Nagios, Zabbix, LogStash, Datadog ou Riemann. Il faut aussi voir aussi du côté de StatsD, Grafana et Graphite.

As Adrian Cockcroft pointed out, “Monitoring is so important that our monitoring systems need to be more available and scalable than the systems being monitored.

– Part IV - The Technical Practice of Feedback - Create Telemetry to enable seeing and solving problems (page 200)

Par exemple, si un serveur Nginx arrête de répondre aux requêtes, il serait possible de corréler cet incident avec d’autres métriques : augmentation du temps de réponse (Application), mémoire disponible en baisse sur le serveur (Infrastructure) ou temps nécessaire à la réalisation d’une transaction sur la base de données.

Histoire de schématiser, toute équipe se retrouve à un moment où un autre dans la situation suivante : personne ne veut appuyer sur le gros bouton rouge issu de l’automatisation de la chaîne de production et qui dit “Déploiement” (en clignotant). Et pour cause : une fois que nous aurons trouvé une joyeuse victime qui osera braver le danger, il y aura systématiquement des imprévus, des petits détails qui auront été oubliés sur le côté de la route, et qui feront lâchement planter les environnements. Et puisque nous n’aurons pas (encore) de télémétrie, le seul moment où nous comprendrons qu’il y a un problème, sera quand un utilisateur viendra se plaindre.

D’où l’intérêt d’avoir une source de données mettant à disposition une agrégation de données de télémétrie.

Métriques, monitoring & alerting

Les métriques, le monitoring et l’alerting sont trois concepts interconnectés qui forment ensemble la base d’un système de monitoring. Ils fournissent un aperçu sur la santé des systèmes et permettent de comprendre :

Pour résumé, les métriques sont des données brutes, non-interprétées et non traitées, tandis que le monitoring consiste à ajouter une couche d’informations sur ces métriques.

Métriques

Les métriques représentent les mesures brutes pouvant être observées et collectées. Ces mesures peuvent être des ressources de bas-niveau (RAM, CPU, espace de stockage, utilisation de l’espace de swap, …) ou plus haut-niveau (unité de travail, fonctionnalités spécifiques, nombre de requêtes services par seconde, …).

Monitoring

Les métriques représentent les données de nos systèmes ; le monitoring consiste à collecter, agréger, visualiser et analyser ces valeurs récupérées, en vue d’améliorer la compréhension de nos composants, ainsi que leurs caractéristiques, puis d’initier l’envoi automatique d’informations lorsque certaines valeurs atteignent des seuils spécifiques.

La différence entre les métriques et le monitoring revient à différencier les données des informations.

Le système de monitoring doit permettre :

Dans le cas d’un système de type push, la récolte a besoin d’autant d’agents installés sur chacune des ressources à surveiller. Idéalement, l’installation d’un agent doit se passer sans douleur et être la plus simple possible. Comme les évènements se passent en continu, le système de réception doit être le plus robuste possible : il doit être capable de supporter la charge de toutes les données que chacune des ressources envoie vers lui.

Dans le cas d’un système pull, le serveur doit pouvoir contacter chaque ressource et récupérer les mêmes métriques que s’il s’agissait d’un agent indépendant. Certaines responsabilités d’agrégation sont inversées, mais un certain niveau de complexité subsiste, surtout sur certaines ressources nécessitent des mécanismes d’authentification.

Alerting

L’objectif premier de l’alerting est d’amener l’attention d’un opérateur sur le statut d’un des systèmes.

L’alerting consiste à interpréter des changements dans les métriques. Une alerte est composée de deux éléments :

Informations à tracer

Les informations que l’on collectera suivront les évolutions de notre infrastructure. Pour schématiser, on peut placer des métriques à plusieurs niveaux :

Dans le livre Google SRE (Site Reliability Engineering), il est question des four golden signals of monitoring :

Métrique du système hôte

Métriques applicatives

Il s’agit de métriques associées litérallement au bon fonctionnement de l’application :

Pour la plupart des infrastructures, la connectivité réseau est un ensemble de données à explorer : il s’agit de jauges quant à la disponibilité des services, permettant également de s’assurer que les systèmes restent accessibles. Le réseau doit être vérifié pour assurer les performances requises :

Connectivité

Ceci autant pour les services internes qu’externes.

Pool/collections de serveurs

(Ce point concerne surtout la mise à l’échelle horizontale d’un parc de serveurs). Pour résumer, il s’agit de l’utilisation du parc de ressources, des indicateurs d’ajustements et du nombre d’instances dégradées.

Dépendances externes

L’idée ici est simplement d’utiliser les endpoints d’API pouvant être disponibles (statuts d’un service et disponibilité, etc.).

Expérience utilisateur

Ici, on est surtout sur la réactivité d’une interface, et donc sur la couche la plus élevée/proche de l’utilisateur.

Conclusions

J’avoue être encore un peu perdu sur le ou les outils à déployer pour arriver à un tel résultat. Sentry + Zabbix devraient former un bon duo, mais je ne suis pas sûr qu’ils arrivent à un résultat aussi complet que toute la documentation que j’ai pu trouver ci-dessus.