La capacité à connaître l'état interne d'un système à partir des données que cette dernière émet. Ces données émises sont classées en 3 (désormais 4) catégories. On parle des piliers de l'observabilité : logs, métriques, traces et profiles (le tout nouveau).
Introduction
Observabilité des systèmes
Pour observer un système, il faut collecter et analyser les données qu'il emet. Les systèmes modernes émettent automatiquement (ou via l'activation dans sa configuration) ces données. Pour les autres, on dit qu'il faut les rendre observable. Pour cela, on va, en fonction des systèmes leurs ajouter des SDK, des plugins, interoger leurs API ... Au final, quelque soit la méthode, ces données peuvent être classées en trois catégories. On parle des piliers de l'observabilité :
Logs
Les logs encore appelé journal est le mécanimse utilisé par un système pour informer sur son état de fonctionnement. Dans la majorité des cas, ces derniers sont stockées dans des fichiers qu'on appelle fichier de logs.Un fichier de logs est donc constitué de plusieurs lignes dont chacune représente un changement d'état : on parle d'événements :- démarrage/arrêt de l'application
- connexion/deconnexion d'un utilisateur
- ajout/suppression d'une image
- ...
- horodater chaque événement.
- disposer d'un format de log : il s'agit du schéma qui va permettre de comprendre la strcuture d'un événement.
- disposer d'un format de log
Métriques
Les métriques sont des mesures quantifiables qui permettent d'avoir une visibilité sur l'utilisation des systèmes. Les métriques vont varier en fonction du système. On va en général associer des seuils à chaque métrique pour déclencher des actions paliatives avant d'arriver au point de ruptue.Par exemple pour un système de type :- serveur : on va surveiller la consommation CPU, RAM, disque...
- serveur web : on va surveiller le nombre d'accès, le nombre de requêtes par seconde, l'état des workers
Assez souvent les serveurs de test et recette sont sous dimensionnés par rapprt aux équivalents en PRODUCTION. Cela pose un problème pour définir des seuils car la valeur risque de changer par environnement. Pour résoudre ce problème, on va quand c'est possible plutôt travailler avec des pourcentages ce qui uniformise le seuil quelque soit l'environnement. Par exemple, on a le seuil d'utilisation CPU défini à 80%.
Traces
Profiles
Le profilage en continu (Continuous Profiling) est souvent considéré comme le 4ème pilier de l'observabilité. Contrairement aux traces qui suivent une requête de bout en bout, les profils permettent de comprendre l'exécution du code au niveau du processeur (CPU) et de la mémoire (RAM) ligne par ligne. Ils répondent à la question : 'Quelle fonction ou ligne de code consomme le plus de ressources en production ?'Des outils comme Grafana Pyroscope permettent de collecter ces profils avec une très faible empreinte sur les performances, facilitant ainsi l'optimisation du code, la réduction des coûts d'infrastructure et l'amélioration des temps de réponse.
Observabilité des données
Fraîcheur des Données
- Âge des données : Temps écoulé depuis la dernière mise à jour.
- Latence de traitement : Délai entre l'apparition de nouvelles données dans la source et leur disponibilité dans le système cible.
Distribution des Données
- Moyenne : Valeur moyenne des données dans une colonne.
- Écart-type : Mesure de la dispersion des données autour de la moyenne.
- Valeurs aberrantes : Pourcentage de valeurs hors d’un intervalle attendu.
Volume des Données
- Nombre d’enregistrements : Total d'enregistrements dans une table ou un dataset.
- Taille en octets : Taille totale des données dans le stockage (Mo, Go, etc.).
Schéma des Données
- Validation de schéma : Vérifier que le schéma actuel correspond aux attentes en termes de types de colonnes, noms et relations.
- Évolution de schéma : Suivre les modifications dans le schéma des tables (ajouts/suppressions de colonnes).
Lignage des Données
- Source de la donnée : Identifier l’origine des données.
- Transformation : Enregistrer toutes les transformations appliquées aux données.
- Destination finale : Vérifier que les données atteignent leur destination prévue.