+ 33 6 68 40 27 75 contact@odeven.fr

Les Secrets de la Scalabilité : 5. Le Monitoring

par | Mai 3, 2024 | DevOps

Préambule

Dans l’univers du développement logiciel, la scalabilité d’une application est une pierre angulaire déterminante de son succès à long terme. Alors que les entreprises cherchent constamment à optimiser leurs systèmes pour gérer des charges d’utilisateurs croissantes et des volumes de données en augmentation, l’architecture de ces systèmes joue un rôle crucial.

Nous verrons ensemble comment concevoir votre application de manière à ce qu’elle soit scalable, et les solutions possibles qui vous permettront de dormir sur vos deux oreilles !

Cet article est le dernier d’une liste de 5 chapitres, concernant les secrets de la scalabilité :

  1. Les Pratiques de Développement
  2. L’Infrastructure
  3. Les Performances et l’Optimisation
  4. La Fiabilité et la résilience
  5. Le Monitoring

Scalabilité : Surveiller l’application et le système

La scalabilité consiste principalement à pouvoir traiter la charge de travail en tout temps. Pour être capable de tenir cette promesse, il est indispensable d’effectuer une surveillance minimale, et idéalement automatisée. Bien que différents mécanismes permettent un déploiement plus serein, il peut toujours subsister des cas critiques non anticipés.

Ce chapitre explore des solutions visant à obtenir tous les éléments nécessaires à la restauration optimale d’une application, grâce à la surveillance proactive, la journalisation, et la mise en place de systèmes d’alertes.

Surveillance proactive

Plutôt que d’attendre qu’un cas critique ne survienne, il est préférable de surveiller vos applications avant que les problèmes n’aient lieu. Pour être en mesure de faire cette surveillance proactive, il est nécessaire d’avoir les bons outils. Heureusement, il en existe de nombreux, gratuits et open source.

Une solution complète et flexible que nous utilisons à Odeven est Grafana. Cette application open source, simple à installer, est une interface web, permettant de visualiser des données sous forme de graphiques. Très utile pour étudier l’état d’un système, Grafana propose également un système d’alertes que nous verrons un peu plus bas dans cet article.

Mais Grafana à lui seul ne suffit pas. En effet, il se connecte à des bases de données afin de pouvoir générer les graphiques. C’est là toute la puissance de l’outil. Compatible avec un panel très large de bases de données en tout genre, c’est à vous de définir vos requêtes. Un peu comme un outil de BI, vous allez pouvoir utiliser n’importe quelle donnée produite par votre application, et vos systèmes.

Un cas d’usage très courant consiste à le configurer afin de surveiller les ressources de vos serveurs (collectées avec Telegraf par exemple). Vous pouvez également descendre à une granularité plus fine afin d’analyser la consommation de chaque container individuellement. Et plus encore, vous pouvez exploiter directement les données produites par votre application (ex: nombre d’utilisateurs, nombre de messages dans la file d’attente, etc…). Cette souplesse vous donne la possibilité d’obtenir des dashboards parfaitement adaptés à une surveillance efficace d’un système précis.

Une fois un tel système mis en place, vous pourrez l’exploiter pour :

  • Visualiser la consommation de ressources (CPU, RAM, stockage, réseau, etc…)
  • Identifier les pics de charge (les moments de la journée, et la quantité de ressource maximale utilisée)
  • Adapter votre système à la situation

Pour cette dernière étape, c’est à vous d’analyser les données, et de déterminer les solutions adaptées visant à résoudre de potentiels problèmes (ex: ajustement des réplicas, des ressources système, correction des fuites mémoire, etc…)

Journalisation

Les logs ne sont pas indispensables au bon fonctionnement d’une application, mais ils le deviennent lorsqu’il s’agit d’identifier la source d’un problème. Même si vous consacrez toute votre énergie à mettre en place un environnement similaire à la production, il y aura toujours des cas qui vous échapperont.

Très souvent, ce sont les utilisateurs d’une application qui rencontrent les problèmes en production. Malheureusement, ils sont souvent imprécis pour donner toutes les informations nécessaires à la reproduction du problème.

Un système de journalisation permet de conserver une trace. Ce sont généralement des systèmes très simples, qui au lieu de permettre une véritable navigation, se contentent de proposer une lecture du fichier, avec une éventuelle recherche, parfois restreinte à quelques critères très basiques.

C’est là toute la « puissance » du système. Il ne s’agit que de fichiers textes, simples à lire, et à stocker. L’écriture y est généralement très simple également. Le but étant de servir de système de « dernier recours », afin d’avoir les informations nécessaires. Même si la lecture de ces fichiers peut être longue est fastidieuse, il est possible grâce à ces système d’obtenir l’information recherchée.

Le but de ces système est d’être simple à utiliser. Depuis votre application, vous pourrez écrire dans ce fichier afin de conserver une trace d’un traitement, le tout bien souvent avec une simple ligne de code.

Au delà des problèmes critiques, ces fichiers peuvent également servir d’historique afin de pouvoir retrouver les actions effectuées par un utilisateur. Apprenez à les utiliser, et pensez à y ajouter vos propres logs afin de couvrir un maximum de cas d’utilisation.

Bien que le concept soit basique, il existe des solutions telles que ELK (Elasticsearch, Logstash et Kibana), permettant d’analyser les logs de manière approfondie, créer des dashboards, etc… Ces outils peuvent être d’une aide précieuse et apporter de la valeur ajoutée en matière de monitoring pour détecter les problèmes (erreurs, soucis de performance, etc…).

Système d’alertes

Un système d’alertes est étroitement lié à la surveillance proactive, puisqu’il consiste à prévenir automatiquement un administrateur lorsqu’un problème survient, ou lorsque certaines conditions sont réunies.

Ici encore, Grafana peut être un excellent outil agissant sur cet aspect, d’autant plus si vous l’utilisez déjà pour créer des dashboards et surveiller vos applications.

Quel que soit le système d’alertes sélectionné, le principe reste le même : définir des seuils, basés sur des données, qui doivent envoyer une notification lorsqu’ils sont franchis. Voici une liste non exhaustive d’alertes que vous pourriez configurer.

Pour un serveur :

  • Lorsque l’espace de stockage utilisé dépasse un certain pourcentage
  • Lorsque l’utilisation du CPU dépasse un certain pourcentage
  • Lorsque la RAM utilisée dépasse un certain pourcentage
  • Lorsque le trafic réseau dépasse un certain seuil
  • Etc…

Pour une application :

  • Lorsque le nombre de messages dans une file d’attente dépasse un certain seuil
  • Lorsque le nombre de réplicas d’un service descend en dessous d’un certain nombre (ex: lorsqu’il ne reste plus qu’une instance)
  • Etc…

A vous de définir les alertes qui sont pertinentes. Le but étant de pouvoir intervenir au plus vite, et idéalement avant que la situation ne devienne vraiment problématique, pensez bien à définir des seuils pas trop élevés afin d’avoir le temps nécessaire pour intervenir. A l’inverse, si vous définissez des seuils trop bas, vous aurez alors trop d’alertes pour qu’elles soient réellement pertinentes.

Pensez également à prévoir des alertes dans les cas où le système serait hors service (lorsqu’aucune donnée n’est disponible depuis un certain temps par exemple).

Généralement, les systèmes d’alertes permettent la configuration de différents canaux de communication (par e-mail, SMS, Discord, etc…). Il peut être utile de configurer au minimum deux canaux de communication, au cas où l’un d’eux rencontrerait un problème.

Conclusion

Le monitoring est un aspect très important pour les applications de grande envergure. Qu’il s’agisse d’identifier les pannes avant qu’elles ne surviennent, d’obtenir des pistes pour des optimisations, ou d’être alerté pour répondre rapidement à une situation délicate, le monitoring fait parti des indispensables.

Dans une stratégie de scalabilité optimale, cet aspect ne doit pas être négligé, et vient compléter toutes les notions vues précédemment, afin d’être en mesure de fournir une qualité de service irréprochable.

Cet article est le dernier de la série concernant les secrets de la scalabilité. J’espère qu’ils vous seront utiles dans l’élaboration d’une stratégie de déploiement efficace. Si vous avez des questions, n’hésitez pas à les poser en commentaire.