Chez ForePaaS, nous expérimentons le DevOps depuis un certain temps maintenant - d'abord en équipe, et maintenant dans toute l'entreprise. La raison est simple: l'organisation grandit. Auparavant, nous n'avions qu'une seule équipe pour toutes les occasions. Elle était impliquée dans l'architecture, la conception et la sécurité des produits et était rapide à répondre à tout problÚme. Désormais, nous sommes divisés en plusieurs équipes par spécialisation: front-end, back-end, développement, opération ...
Nous nous sommes rendu compte que nos méthodes précédentes ne seraient pas si efficaces et nous devons changer quelque chose, tout en maintenant la vitesse sans sacrifier la qualité et le vice versa.
Auparavant, nous appelions l'Ă©quipe devops, qui, en fait, faisait Ops et Ă©tait Ă©galement responsable du dĂ©veloppement sur le backend. Une fois par semaine, d'autres dĂ©veloppeurs ont expliquĂ© Ă l'Ă©quipe DevOps quels nouveaux services devaient ĂȘtre dĂ©ployĂ©s en production. Cela a parfois conduit Ă des problĂšmes. D'une part, l'Ă©quipe DevOps n'a pas vraiment compris ce qui se passait avec les dĂ©veloppeurs, d'autre part, les dĂ©veloppeurs ne se sentaient pas responsables de leurs services.
Récemment, les gars de DevOps ont essayé de réveiller cette responsabilité chez les développeurs - pour la disponibilité, la fiabilité et la qualité du code de service. Pour commencer, il fallait rassurer les développeurs, alarmés par la charge qui leur était tombée dessus. Ils avaient besoin de plus d'informations pour diagnostiquer les problÚmes émergents, nous avons donc décidé de mettre en place une surveillance du systÚme.
Dans cet article, nous parlerons de ce qu'est la surveillance et de ce avec quoi elle est consommée, nous en apprendrons davantage sur les soi-disant quatre signaux dorés, et nous discuterons de la maniÚre d'utiliser les métriques et d'explorer les problÚmes actuels.
Un exemple de tableau de bord Grafana avec quatre signaux d'or pour surveiller un service.
Qu'est-ce que la surveillance?
La surveillance est la création, la collecte, l'agrégation et l'utilisation de mesures qui fournissent un aperçu de la santé d'un systÚme.
Pour surveiller un systĂšme, nous avons besoin d'informations sur ses composants logiciels et matĂ©riels. Ces informations peuvent ĂȘtre obtenues grĂące Ă des mĂ©triques collectĂ©es Ă l'aide d'un programme spĂ©cial ou d'une instrumentation de code.
L'instrumentation change votre code afin que vous puissiez mesurer ses performances. Nous ajoutons du code qui n'affecte pas la fonctionnalitĂ© du produit lui-mĂȘme, mais calcule simplement et fournit des mĂ©triques. Disons que nous voulons mesurer la latence d'une requĂȘte. Ajoutez un code qui calculera le temps nĂ©cessaire au service pour traiter la demande reçue.
La mĂ©trique ainsi crĂ©Ă©e doit encore ĂȘtre collectĂ©e et combinĂ©e avec d'autres. Cela se fait gĂ©nĂ©ralement avec Metricbeat pour la collecte et Logstash pour l'indexation des mĂ©triques dans Elasticsearch . Ensuite, ces mĂ©triques peuvent ĂȘtre utilisĂ©es Ă vos propres fins. En rĂšgle gĂ©nĂ©rale, cette pile est complĂ©tĂ©e par Kibana , qui restitue les donnĂ©es indexĂ©es dans Elasticsearch.
Pourquoi surveiller?
Vous devez surveiller le systÚme pour diverses raisons. Par exemple, nous surveillons l'état actuel du systÚme et ses variations afin de générer des alertes et de peupler les tableaux de bord. Lorsque nous recevons une alerte, nous recherchons les raisons de l'échec sur le tableau de bord. Parfois, la surveillance est utilisée pour comparer deux versions d'un service ou analyser les tendances à long terme.
Que surveiller?
L'ingénierie de fiabilité du site a un chapitre utile sur la surveillance des systÚmes distribués qui décrit l'approche de Google pour suivre les quatre signaux d'or.
Beyer, B., Jones C., Murphy, N. & Petoff, J. (2016) Ingénierie de la fiabilité du site. Comment Google gÚre les systÚmes de production. O'Reilly. Version gratuite en ligne: https://landing.google.com/sre/sre-book/toc/index.html
- â . . â , .
- â . API . , .
- . (, 500- ) . â , .
- , , . ? . . , , .
?
Prenons l'exemple de la pile technologique. Nous choisissons généralement des outils standard populaires au lieu de solutions personnalisées. Sauf lorsque les fonctionnalités disponibles ne nous suffisent pas. Nous déployons la plupart des services dans les environnements Kubernetes et instrumentons le code pour obtenir des métriques sur chaque service personnalisé. Pour collecter ces métriques et les préparer pour Prometheus, nous utilisons l' une des bibliothÚques clientes Prometheus . Il existe des bibliothÚques clientes pour presque toutes les langues courantes. Dans la documentation, vous trouverez tout ce dont vous avez besoin pour écrire votre propre bibliothÚque.
S'il s'agit d'un service open source tiers, nous prenons généralement les exportateurs suggérés par la communauté. Les exportateurs sont le code qui collecte les métriques du service et les formate pour Prometheus. Ils sont généralement utilisés avec des services qui ne génÚrent pas de métriques Prometheus.
Nous envoyons des mĂ©triques dans le pipeline et les stockons dans Prometheus sous forme de sĂ©ries chronologiques. De plus, nous utilisons des mĂ©triques d'Ă©tat kube dans Kubernetes pour collecter et soumettre des mĂ©triques Ă Prometheus. Nous pouvons ensuite crĂ©er des tableaux de bord et des alertes dans Grafana Ă l' aide des requĂȘtes Prometheus. Nous n'entrerons pas dans les dĂ©tails techniques ici, expĂ©rimentez vous-mĂȘme ces outils. Ils ont une documentation dĂ©taillĂ©e, vous pouvez facilement la comprendre.
Par exemple, regardons une API simple qui reçoit du trafic et traite les demandes reçues à l'aide d'autres services.
Retard
La latence est le temps nécessaire pour traiter une demande. Nous mesurons la latence séparément pour les demandes réussies et pour les erreurs. Nous ne voulons pas que ces statistiques se mélangent.
La latence globale est généralement prise en compte, mais ce n'est pas toujours un bon choix. Mieux vaut suivre la distribution de la latence car elle est plus conforme aux exigences de disponibilité. La proportion de demandes traitées plus rapidement qu'un seuil donné est un indicateur de niveau de service (SLI) commun. Voici un exemple d'objectif de niveau de service (SLO) pour ce SLI:
"Dans les 24 heures, 99% des demandes devraient ĂȘtre traitĂ©es en moins d'une seconde."
Le moyen le plus visuel de reprĂ©senter les mĂ©triques de latence consiste Ă utiliser un graphique de sĂ©rie chronologique. Nous mettons les mĂ©triques dans des seaux et les exportateurs les collectent toutes les minutes. De cette maniĂšre, n-quantiles pour les latences de service peuvent ĂȘtre calculĂ©s.
Si 0 <n <1 et que le graphique contient q valeurs, le n-quantile de ce graphique est égal à une valeur qui ne dépasse pas n * q sur q valeurs. Autrement dit, la médiane, 0,5 quantile d'un graphique avec x enregistrements est égale à une valeur qui ne dépasse pas la moitié de x enregistrements.
Graphique de latence de l'API
Comme vous pouvez le voir sur le graphique, l'API traite la plupart du temps 99% des requĂȘtes en moins d'une seconde. Cependant, il y a aussi des pics d'environ 2 secondes qui ne correspondent pas Ă notre SLO.
Puisque nous utilisons Prometheus, nous devons ĂȘtre trĂšs prudents lors du choix de la taille du godet. Prometheus permet des tailles de godets linĂ©aires et exponentielles. Peu importe ce que nous choisissons, tant que les erreurs d'estimation sont prises en compte .
Prometheus ne fournit pas de valeur exacte pour le quantile. Il détermine dans quel compartiment se trouve le quantile, puis utilise une interpolation linéaire et calcule une valeur approximative.
Circulation
Pour mesurer le trafic d'une API, vous devez compter le nombre de requĂȘtes qu'elle reçoit chaque seconde. Ătant donnĂ© que nous collectons des mĂ©triques une fois par minute, nous n'obtiendrons pas la valeur exacte pendant une seconde spĂ©cifique. Mais nous pouvons calculer le nombre moyen de requĂȘtes par seconde en utilisant les fonctions de dĂ©bit et de colĂšre de Prometheus.
Pour afficher ces informations, nous utilisons le panneau Grafana SingleStat. Il affiche les demandes moyennes actuelles par seconde et les tendances.
Un exemple de panneau Grafana SingleStat avec le nombre de requĂȘtes que notre API reçoit par seconde
Si le nombre de requĂȘtes par seconde change soudainement, nous le verrons. Si le trafic est divisĂ© par deux en quelques minutes, nous comprendrons qu'il y a un problĂšme.
les erreurs
Il est facile de calculer le pourcentage d'erreurs Ă©videntes - divisez les rĂ©ponses HTTP 500 par le nombre total de requĂȘtes. Comme pour le trafic, nous utilisons ici une moyenne.
L'intervalle doit ĂȘtre le mĂȘme que pour le trafic. Cela facilitera le suivi du trafic avec des erreurs sur un panneau.
Disons que le taux d'erreur est de 10% au cours des cinq derniĂšres minutes et que l'API traite 200 requĂȘtes par seconde. Il est facile de calculer qu'en moyenne, il y avait 20 erreurs par seconde.
Saturation
Pour surveiller la saturation, vous devez définir des limites de service. Pour notre API, nous avons commencé par mesurer les ressources du processeur et de la mémoire, car nous ne savions pas ce qui affecte le plus. Kubernetes et kube-state-metrics fournissent ces métriques pour les conteneurs.
Un graphique de l'utilisation du processeur pour notre
mesure de saturation API vous permet de prĂ©voir les temps d'arrĂȘt et de planifier les ressources. Par exemple, pour le stockage de base de donnĂ©es, vous pouvez mesurer l'espace disque libre et la vitesse Ă laquelle il se remplit pour comprendre quand agir.
Tableaux de bord détaillés pour surveiller les services distribués
Jetons un coup d'Ćil Ă un autre service. Par exemple, une API distribuĂ©e qui agit comme un proxy pour d'autres services. Cette API a plusieurs instances dans diffĂ©rentes rĂ©gions et plusieurs points de terminaison. Chacun d'eux dĂ©pend de son propre ensemble de services. Il devient rapidement assez difficile de lire des graphiques avec des dizaines de lignes. Nous avons besoin de la capacitĂ© de surveiller l'ensemble du systĂšme et, si nĂ©cessaire, de dĂ©tecter les pannes individuelles.
Graphique d'utilisation du processeur pour 12 instances de notre API
Pour cela, nous utilisons des tableaux de bord détaillés. Sur chaque écran d'un panneau, nous voyons une vue globale du systÚme et pouvons cliquer sur des éléments individuels pour examiner les détails. Pour la saturation, nous n'utilisons pas de graphiques, mais simplement des rectangles colorés montrant l'utilisation des ressources processeur et mémoire. Si l'utilisation des ressources dépasse le seuil spécifié, le rectangle devient orange.
Indicateurs d'utilisation du processeur et de la mémoire pour les
instances d' API Cliquez sur le rectangle, accédez aux détails et voyez plusieurs rectangles colorés représentant différentes instances d'API.
Indicateurs d'utilisation du processeur pour les instances d'API
Si une seule instance a un problÚme, nous pouvons cliquer sur le rectangle et trouver plus de détails. Ici, nous voyons la région de l'instance, les demandes reçues, etc.
Une vue granulaire de l'Ă©tat d'une instance d'API. De gauche Ă droite, de haut en bas: rĂ©gion du fournisseur, nom d'hĂŽte de l'instance, date du dernier redĂ©marrage, requĂȘtes par seconde, utilisation du processeur, utilisation de la mĂ©moire, nombre total de requĂȘtes par chemin et pourcentage d'erreur total par chemin.
Nous faisons de mĂȘme avec le pourcentage d'erreurs - nous cliquons et regardons le pourcentage d'erreurs pour chaque point de terminaison de l'API afin de comprendre oĂč se situe le problĂšme - dans l'API elle-mĂȘme ou les services auxquels elle est associĂ©e.
Nous avons fait de mĂȘme pour les retards et les erreurs de demande rĂ©ussis, bien qu'il y ait des nuances ici. L'objectif principal est de s'assurer que le service est correct Ă l'Ă©chelle mondiale. Le problĂšme est que l'API a de nombreux points de terminaison diffĂ©rents, dont chacun dĂ©pend de plusieurs services. Chaque point de terminaison a ses propres retards et trafic.
Il est difficile de configurer des SLO (et SLA) distincts pour chaque point de terminaison de service. Certains points de terminaison auront une latence nominale plus Ă©levĂ©e que d'autres. Dans ce cas, une refactorisation peut ĂȘtre nĂ©cessaire. Si des SLO distincts sont nĂ©cessaires, vous devez diviser l'ensemble du service en services plus petits. Peut-ĂȘtre verrons-nous que la couverture de notre service Ă©tait trop large.
Nous avons décidé qu'il serait préférable de surveiller la latence globale. La granularité permet simplement d'étudier le problÚme lorsque les écarts de latence sont suffisamment importants pour attirer l'attention.
Conclusion
Nous utilisons ces méthodes pour surveiller les systÚmes depuis un certain temps maintenant et avons remarqué que le temps nécessaire pour trouver des problÚmes et le temps moyen de récupération (MTTR) ont diminué. Les détails nous permettent de trouver la cause réelle d'un problÚme global, et pour nous cette capacité a beaucoup changé.
D'autres équipes de développement ont également commencé à utiliser ces méthodes et n'y voient que des avantages. Désormais, ils ne sont pas seulement responsables du fonctionnement de leurs services. Ils vont encore plus loin et peuvent déterminer comment les modifications apportées au code affectent le comportement des services.
Les quatre signaux en or ne résolvent pas du tout tous les problÚmes, mais ils sont trÚs utiles pour les plus courants. Avec presque aucun effort, nous avons pu améliorer considérablement la surveillance et réduire le MTTR. Ajoutez autant de métriques que nécessaire, tant qu'il y a quatre signaux en or parmi eux.