{"id":52115,"date":"2019-11-01T00:00:00","date_gmt":"2019-10-31T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/monitoring-kak-servis-modulnaya-sistema-dlya-mikroservisnoj-arhitektury"},"modified":"2020-02-18T13:59:47","modified_gmt":"2020-02-18T10:59:47","slug":"monitoring-kak-servis-modulnaya-sistema-dlya-mikroservisnoj-arhitektury","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/monitoring-kak-servis-modulnaya-sistema-dlya-mikroservisnoj-arhitektury","title":{"rendered":"Monitoring en tant que service : syst\u00e8me modulaire pour une architecture microservices","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Aujourd'hui, sur notre projet, en plus du code monolithique, des dizaines de microservices fonctionnent. Chacun d'eux n\u00e9cessite une surveillance. Faire cela \u00e0 cette \u00e9chelle avec les ing\u00e9nieurs DevOps est probl\u00e9matique. Nous avons d\u00e9velopp\u00e9 un syst\u00e8me de surveillance qui fonctionne comme un service pour les d\u00e9veloppeurs. Ils peuvent eux-m\u00eames \u00e9crire des m\u00e9triques dans le syst\u00e8me de surveillance, les utiliser, construire des tableaux de bord sur cette base, y ajouter des alertes qui se d\u00e9clencheront lors de l'atteinte de valeurs seuil. Des ing\u00e9nieurs DevOps, seuls l'infrastructure et la documentation sont n\u00e9cessaires. <\/p>\n<p>Ce post est la transcription de ma pr\u00e9sentation lors de notre <noindex><a rel=\"nofollow\" href=\"http:\/\/bit.ly\/tomicro\">session<\/a><\/noindex> \u00e0 RIT++. Beaucoup d'entre vous nous ont demand\u00e9 de produire des versions \u00e9crites des expos\u00e9s pr\u00e9sent\u00e9s l\u00e0-bas. Si vous \u00e9tiez \u00e0 la conf\u00e9rence ou que vous avez regard\u00e9 la vid\u00e9o, vous ne trouverez rien de nouveau. Pour tous les autres, bienvenue sous le cut. Je vais expliquer comment nous avons cr\u00e9\u00e9 un tel syst\u00e8me, comment il fonctionne et comment nous pr\u00e9voyons de le mettre \u00e0 jour. <\/p>\n<p><img decoding=\"async\" alt=\"Monitoring en tant que service : syst\u00e8me modulaire pour une architecture microservices\" src=\"\/wp-content\/uploads\/2019\/11\/000b8fdc8fb16aa76ce545ff2aa4e767.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Le pass\u00e9 : sch\u00e9mas et plans <\/h3>\n<p>\nComment sommes-nous arriv\u00e9s au syst\u00e8me de surveillance actuel ? Pour r\u00e9pondre \u00e0 cette question, il faut remonter \u00e0 2015. Voici \u00e0 quoi cela ressemblait \u00e0 l'\u00e9poque : <\/p>\n<p><img decoding=\"async\" alt=\"Monitoring en tant que service : syst\u00e8me modulaire pour une architecture microservices\" src=\"\/wp-content\/uploads\/2019\/11\/d955f9bcdb5f5a5a54720c77113ca85d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous avions environ 24 n\u0153uds responsables de la surveillance. Ici, il y avait toute une s\u00e9rie de cron, de scripts et de d\u00e9mons qui surveillaient quelque chose quelque part d'une mani\u00e8re ou d'une autre, envoyaient des messages et ex\u00e9cutaient des fonctions. Nous avons pens\u00e9 qu'\u00e0 mesure que le temps passait, un tel syst\u00e8me deviendrait de moins en moins viable. Il n'\u00e9tait pas sens\u00e9 de continuer \u00e0 le d\u00e9velopper : il \u00e9tait trop encombrant. <br \/>\nNous avons d\u00e9cid\u00e9 de s\u00e9lectionner les \u00e9l\u00e9ments de surveillance que nous allions conserver et d\u00e9velopper, et ceux dont nous nous d\u00e9barrasserions. Au final, il y en avait 19. Seuls des graphite, des agr\u00e9gateurs et Grafana comme tableau de bord ont \u00e9t\u00e9 retenus. Mais \u00e0 quoi ressemblera le nouveau syst\u00e8me ? Voici ce que cela donnera : <\/p>\n<p><img decoding=\"async\" alt=\"Monitoring en tant que service : syst\u00e8me modulaire pour une architecture microservices\" src=\"\/wp-content\/uploads\/2019\/11\/57d220113d0b76c05874b5d774bff8af.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNous avons un stockage de m\u00e9triques : ce sont des graphite qui seront bas\u00e9s sur des disques SSD rapides, ainsi que des agr\u00e9gateurs sp\u00e9cifiques pour les m\u00e9triques. Ensuite, Grafana pour l'affichage des tableaux de bord et Moira pour les alertes. Nous souhaitions \u00e9galement d\u00e9velopper un syst\u00e8me de recherche d'anomalies. <\/p>\n<h3>Standard : Surveillance 2.0<\/h3>\n<p>\nVoici \u00e0 quoi ressemblaient les projets en 2015. Mais nous devions pr\u00e9parer non seulement l'infrastructure et le service lui-m\u00eame, mais aussi la documentation qui l'accompagne. Nous avons \u00e9labor\u00e9 un standard d'entreprise que nous avons appel\u00e9 surveillance 2.0. Quelles \u00e9taient les exigences du syst\u00e8me ? <\/p>\n<ul>\n<li>disponibilit\u00e9 permanente ; <\/li>\n<li>intervalle de stockage des m\u00e9triques = 10 secondes ; <\/li>\n<li>stockage structur\u00e9 des m\u00e9triques et des tableaux de bord; <\/li>\n<li>SLA &gt; 99,99% <\/li>\n<li>collecte de m\u00e9triques d'\u00e9v\u00e9nements via UDP (!). <\/li>\n<\/ul>\n<p>\nNous avions besoin de UDP car nous avons un grand flux de trafic et d'\u00e9v\u00e9nements qui g\u00e9n\u00e8rent des m\u00e9triques. Si nous \u00e9crivons toutes les m\u00e9triques directement dans Graphite, le stockage va tomber. Nous avons \u00e9galement choisi des pr\u00e9fixes de premier niveau pour toutes les m\u00e9triques. <\/p>\n<p><img decoding=\"async\" alt=\"Monitoring en tant que service : syst\u00e8me modulaire pour une architecture microservices\" src=\"\/wp-content\/uploads\/2019\/11\/d24c4474b19b532a48cef4d4376287ad.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nChacun des pr\u00e9fixes poss\u00e8de une certaine propri\u00e9t\u00e9. Il existe des m\u00e9triques pour les serveurs, les r\u00e9seaux, les conteneurs, les ressources, les applications, etc. Une filtration claire, stricte et typ\u00e9e a \u00e9t\u00e9 mise en place, o\u00f9 nous acceptons les m\u00e9triques de premier niveau et les autres sont simplement ignor\u00e9es. Voici comment nous avions planifi\u00e9 ce syst\u00e8me en 2015. Qu'en est-il maintenant? <\/p>\n<h3>Pr\u00e9sent : sch\u00e9ma d'interaction des composants de surveillance<\/h3>\n<p>\nTout d'abord, nous surveillons les applications : notre code PHP, les applications et les microservices - en bref, tout ce que nos d\u00e9veloppeurs \u00e9crivent. Toutes les applications envoient des m\u00e9triques \u00e0 l'agr\u00e9gateur Brubeck (statsd, r\u00e9\u00e9crit en C) via UDP. Ce dernier s'est av\u00e9r\u00e9 \u00eatre le plus rapide selon les r\u00e9sultats des tests synth\u00e9tiques. Il envoie les m\u00e9triques d\u00e9j\u00e0 agr\u00e9g\u00e9es vers Graphite via TCP. <\/p>\n<p>Il a un type de m\u00e9triques appel\u00e9 minuteries. C'est un outil tr\u00e8s pratique. Par exemple, pour chaque connexion d'utilisateur au service, vous envoyez \u00e0 Brubeck une m\u00e9trique avec le temps de r\u00e9ponse. Un million de r\u00e9ponses sont arriv\u00e9es, et l'agr\u00e9gateur a fourni seulement 10 m\u00e9triques. Vous avez le nombre de personnes arriv\u00e9es, le temps de r\u00e9ponse maximum, minimum et moyen, la m\u00e9diane et 4 percentiles. Ensuite, les donn\u00e9es sont transf\u00e9r\u00e9es dans Graphite et nous les voyons toutes en temps r\u00e9el. <\/p>\n<p>Nous avons \u00e9galement une agr\u00e9gation pour les m\u00e9triques li\u00e9es au mat\u00e9riel, aux logiciels, aux m\u00e9triques syst\u00e8me et \u00e0 notre ancien syst\u00e8me de surveillance Munin (qui a fonctionn\u00e9 jusqu'en 2015). Nous recueillons toutes ces donn\u00e9es via le d\u00e9mon CollectD, \u00e9crit en C (qui dispose d'un ensemble de plugins int\u00e9gr\u00e9, capable d'interroger toutes les ressources du syst\u00e8me h\u00f4te sur lequel il est install\u00e9, il suffit d'indiquer dans la configuration o\u00f9 \u00e9crire les donn\u00e9es) et nous envoyons ces donn\u00e9es \u00e0 Graphite. Il prend \u00e9galement en charge les plugins Python et les scripts shell, vous permettant de cr\u00e9er vos solutions personnalis\u00e9es : CollectD recueillera ces donn\u00e9es depuis un h\u00f4te local ou distant (par exemple, en utilisant Curl) et les enverra \u00e0 Graphite. <\/p>\n<p>Ensuite, toutes les m\u00e9triques que nous avons collect\u00e9es sont envoy\u00e9es \u00e0 Carbon-c-relay. C'est une solution de Carbon Relay bas\u00e9e sur Graphite, am\u00e9lior\u00e9e en C. C'est un routeur qui re\u00e7oit toutes les m\u00e9triques que nous envoyons depuis nos agr\u00e9gateurs et les achemine vers les n\u0153uds. De plus, au stade du routage, il v\u00e9rifie la validit\u00e9 des m\u00e9triques. Elles doivent, d'une part, correspondre au sch\u00e9ma de pr\u00e9fixes que j'ai montr\u00e9 pr\u00e9c\u00e9demment et, d'autre part, \u00eatre valides pour Graphite. Sinon, elles sont supprim\u00e9es. <\/p>\n<p>Ensuite, Carbon-c-relay envoie les m\u00e9triques au cluster Graphite. Nous utilisons Carbon-cache, r\u00e9\u00e9crit en Go, comme principal stockage des m\u00e9triques. Go-carbon, en raison de sa capacit\u00e9 \u00e0 g\u00e9rer plusieurs threads, surpasse largement Carbon-cache en performances. Il re\u00e7oit les donn\u00e9es et les \u00e9crit sur les disques \u00e0 l'aide du paquet whisper (standard, \u00e9crit en python). Pour lire les donn\u00e9es de nos stockages, nous utilisons l'API Graphite. Elle fonctionne beaucoup plus rapidement que le standard Graphite WEB. Que se passe-t-il ensuite avec les donn\u00e9es? <\/p>\n<p>Elles vont dans Grafana. Comme source principale de donn\u00e9es, nous utilisons nos clusters Graphite, et nous avons \u00e9galement Grafana comme interface web pour afficher les m\u00e9triques et construire des tableaux de bord. Chaque service d\u00e9veloppe son propre tableau de bord. Ensuite, ils construisent des graphiques bas\u00e9s sur les m\u00e9triques qu'ils envoient depuis leurs applications. En plus de Grafana, nous avons \u00e9galement SLAM. C'est un d\u00e9mon Python qui calcule le SLA sur la base des donn\u00e9es provenant de Graphite. Comme je l'ai d\u00e9j\u00e0 mentionn\u00e9, nous avons plusieurs dizaines de microservices, chacun ayant ses propres exigences. Avec SLAM, nous consultons la documentation et la comparons \u00e0 ce qui est disponible dans Graphite pour v\u00e9rifier \u00e0 quel point les exigences correspondent \u00e0 la disponibilit\u00e9 de nos services. <\/p>\n<p>Poursuivons : l'alerte. Elle est organis\u00e9e \u00e0 l'aide d'un syst\u00e8me robuste : Moira. Elle est ind\u00e9pendante car elle dispose de son propre Graphite en arri\u00e8re-plan. D\u00e9velopp\u00e9e par les gars de la SKB \u00ab Kontur \u00bb, \u00e9crite en python et en Go, enti\u00e8rement open-source. Moira re\u00e7oit le m\u00eame flux que celui qui est envoy\u00e9 \u00e0 Graphite. Si pour une raison quelconque votre stockage tombe en panne, votre syst\u00e8me d'alerte continuera \u00e0 fonctionner.<\/p>\n<p>Nous avons d\u00e9ploy\u00e9 Moira dans Kubernetes, utilisant un cluster de serveurs Redis comme base de donn\u00e9es principale. Au final, cela a cr\u00e9\u00e9 un syst\u00e8me r\u00e9silient. Il compare le flux des m\u00e9triques avec une liste de d\u00e9clencheurs : si elle n'y trouve aucune mention, alors elle ignore la m\u00e9trique. Elle est capable de traiter des gigaoctets de m\u00e9triques par minute. <\/p>\n<p>Nous y avons \u00e9galement int\u00e9gr\u00e9 un LDAP d'entreprise, qui permet \u00e0 chaque utilisateur du syst\u00e8me de cr\u00e9er des notifications bas\u00e9es sur des d\u00e9clencheurs existants (ou nouvellement cr\u00e9\u00e9s). Puisque Moira contient Graphite, elle prend en charge toutes ses fonctionnalit\u00e9s. Vous copiez d'abord une ligne dans Grafana pour voir comment les donn\u00e9es s'affichent sur les graphiques. Ensuite, vous copiez cette m\u00eame ligne dans Moira, que vous param\u00e9trez avec des limites pour obtenir des alertes. Pour cela, aucune connaissance sp\u00e9cifique n'est n\u00e9cessaire. Moira peut envoyer des alertes par SMS, email, dans Jira, Slack\u2026 Elle prend aussi en charge l'ex\u00e9cution de scripts personnalis\u00e9s. Lorsqu'un d\u00e9clencheur se produit et qu'elle est li\u00e9e \u00e0 un script ou un binaire, elle l'ex\u00e9cute et transmet un JSON \u00e0 ce binaire via stdin. Votre programme doit alors le parser. Que vous fassiez avec ce JSON \u2014 c'est \u00e0 vous de d\u00e9cider. Vous pouvez l'envoyer sur Telegram, ouvrir des t\u00e2ches dans Jira, ou faire ce que vous voulez. <\/p>\n<p>Pour les alertes, nous utilisons \u00e9galement notre propre d\u00e9veloppement \u2014 Imagotag. Nous avons adapt\u00e9 un panneau g\u00e9n\u00e9ralement utilis\u00e9 pour les \u00e9tiquettes de prix \u00e9lectroniques au magasin \u00e0 nos besoins. Nous y avons int\u00e9gr\u00e9 les d\u00e9clencheurs de Moira, indiquant leur \u00e9tat et le moment o\u00f9 ils se sont produites. Certaines personnes de l'\u00e9quipe de d\u00e9veloppement ont abandonn\u00e9 les notifications dans Slack et par email au profit de ce panneau. <\/p>\n<p><img decoding=\"async\" alt=\"Monitoring en tant que service : syst\u00e8me modulaire pour une architecture microservices\" src=\"\/wp-content\/uploads\/2019\/11\/bcf454c96adaa0cff81f5e56db5b715c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nComme nous sommes une entreprise progressive, nous avons \u00e9galement surveill\u00e9 Kubernetes dans ce syst\u00e8me. Nous l'avons int\u00e9gr\u00e9 gr\u00e2ce \u00e0 Heapster, install\u00e9 dans le cluster, qui collecte des donn\u00e9es et les envoie \u00e0 Graphite. Ainsi, le sch\u00e9ma se pr\u00e9sente comme suit : <\/p>\n<p><img decoding=\"async\" alt=\"Monitoring en tant que service : syst\u00e8me modulaire pour une architecture microservices\" src=\"\/wp-content\/uploads\/2019\/11\/cca0f2f9f590fc84609d48e52ebd0d21.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Composants de surveillance<\/h3>\n<p>Voici une liste de liens vers les composants que nous avons utilis\u00e9s pour cette t\u00e2che. Tous sont open source. <\/p>\n<h4>Graphite :<\/h4>\n<p><\/p>\n<ul>\n<li>go-carbon : <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lomik\/go-carbon\">github.com\/lomik\/go-carbon<\/a><\/noindex><\/li>\n<li>whisper : <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/graphite-project\/whisper\">github.com\/graphite-project\/whisper<\/a><\/noindex> <\/li>\n<li>graphite-api : <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/brutasse\/graphite-api\">github.com\/brutasse\/graphite-api<\/a><\/noindex> <\/li>\n<\/ul>\n<h4>Carbon-c-relay : <\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/grobian\/carbon-c-relay\">github.com\/grobian\/carbon-c-relay<\/a><\/noindex> <\/p>\n<h4>Brubeck : <\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/github\/brubeck\">github.com\/github\/brubeck<\/a><\/noindex> <\/p>\n<h4>Collectd :<\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/collectd.org\/\">collectd.org<\/a><\/noindex><\/p>\n<h4>Moira : <\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/moira-alert\">github.com\/moira-alert<\/a><\/noindex> <\/p>\n<h4>Grafana : <\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/grafana.com\/\">grafana.com<\/a><\/noindex> <\/p>\n<h4>Heapster : <\/h4>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/heapster\">github.com\/kubernetes\/heapster<\/a><\/noindex><\/p>\n<h3>Statistiques<\/h3>\n<p>\nVoici quelques chiffres sur le fonctionnement de notre syst\u00e8me. <\/p>\n<h4>Agr\u00e9gateur (brubeck)<\/h4>\n<p>\nNombre de m\u00e9triques : ~ 300 000 \/ sec<br \/>\nIntervalle d'envoi des m\u00e9triques \u00e0 Graphite : 30 sec<br \/>\nUtilisation des ressources serveur : ~ 6% CPU (pour des serveurs complets) ; ~ 1Go RAM ; ~ 3 Mbps LAN<\/p>\n<h4>Graphite (go-carbon)<\/h4>\n<p>\nNombre de m\u00e9triques : ~ 1 600 000 \/ min<br \/>\nIntervalle de mise \u00e0 jour des m\u00e9triques : 30 sec<br \/>\nSch\u00e9ma de stockage des m\u00e9triques : 30sec 35j, 5min 90j, 10min 365j (permet de comprendre ce qui se passe avec le service sur une longue p\u00e9riode) <br \/>\nUtilisation des ressources serveur : ~ 10% CPU ; ~ 20Go RAM ; ~ 30 Mbps LAN<\/p>\n<h3>Flexibilit\u00e9<\/h3>\n<p>\nChez Avito, nous attachons une grande importance \u00e0 la flexibilit\u00e9 de notre service de surveillance. Pourquoi est-il ainsi con\u00e7u ? Premi\u00e8rement, ses composants sont interchangeables : tant les composants eux-m\u00eames que leurs versions. Deuxi\u00e8mement, la maintenabilit\u00e9. \u00c9tant donn\u00e9 que tout le projet est bas\u00e9 sur l'open source, vous pouvez modifier le code, apporter des modifications et impl\u00e9menter des fonctionnalit\u00e9s qui ne sont pas disponibles en standard. Des piles assez courantes sont utilis\u00e9es, principalement Go et Python, ce qui rend cela relativement simple. <\/p>\n<p>Voici un exemple d'un probl\u00e8me r\u00e9el. Une m\u00e9trique dans Graphite est un fichier. Il a un nom. Le nom du fichier = le nom de la m\u00e9trique. Et il a un chemin d'acc\u00e8s. Les noms de fichiers sous Linux sont limit\u00e9s \u00e0 255 caract\u00e8res. Et nous avons (en tant que 'commanditaires internes') des gars du d\u00e9partement des bases de donn\u00e9es. Ils nous disent : 'Nous voulons surveiller nos requ\u00eates SQL. Or, elles ne font pas 255 caract\u00e8res, mais 8 Mo chacune. Nous voulons les afficher dans Grafana, voir les param\u00e8tres de cette requ\u00eate, et encore mieux, nous voulons voir le top de ces requ\u00eates. Ce serait g\u00e9nial si cela pouvait \u00eatre affich\u00e9 en temps r\u00e9el. Et ce serait encore mieux de les int\u00e9grer dans des alertes.' <\/p>\n<p><img decoding=\"async\" alt=\"Monitoring en tant que service : syst\u00e8me modulaire pour une architecture microservices\" src=\"\/wp-content\/uploads\/2019\/11\/e1136c7fd0b6156c0c3fd49bab54737e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>L'exemple de requ\u00eate SQL est pris \u00e0 titre d'exemple sur <noindex><a rel=\"nofollow\" href=\"https:\/\/postgrespro.ru\/docs\/postgrespro\/9.6\/queries-with\">le site postgrespro.ru<\/a><\/noindex> <\/i><\/p>\n<p>Nous lan\u00e7ons un serveur Redis et, avec nos plugins Collectd, qui interrogent Postgres pour r\u00e9cup\u00e9rer toutes les donn\u00e9es, nous envoyons les m\u00e9triques \u00e0 Graphite. Nous rempla\u00e7ons toutefois le nom de la m\u00e9trique par des hachages. Ce m\u00eame hachage est simultan\u00e9ment envoy\u00e9 \u00e0 Redis comme cl\u00e9, et toute la requ\u00eate SQL comme valeur. Il ne nous reste plus qu'\u00e0 faire en sorte que Grafana puisse acc\u00e9der \u00e0 Redis et r\u00e9cup\u00e9rer cette information. Nous ouvrons l'API Graphite, car c'est l'interface principale d'interaction de tous les composants de surveillance avec Graphite, et nous y ajoutons une nouvelle fonction, appel\u00e9e aliasByHash() \u2014 \u00e0 partir de Grafana, nous obtenons le nom de la m\u00e9trique et l'utilisons dans la requ\u00eate \u00e0 Redis comme cl\u00e9, et nous recevons en r\u00e9ponse la valeur de la cl\u00e9, qui est notre \"requ\u00eate SQL\". Ainsi, nous avons int\u00e9gr\u00e9 l'affichage de la requ\u00eate SQL dans Grafana, ce qui, en th\u00e9orie, aurait \u00e9t\u00e9 impossible \u00e0 afficher, avec les statistiques associ\u00e9es (appels, lignes, temps_total, \u2026). <\/p>\n<h3>R\u00e9sultats <\/h3>\n<p>\n<b>Disponibilit\u00e9.<\/b> Notre service de surveillance est disponible 24\/7 depuis n'importe quelle application et n'importe quel code. Si vous avez acc\u00e8s aux stockages, vous pouvez envoyer des donn\u00e9es au service. Le langage n'est pas important, les solutions ne comptent pas. Vous devez juste savoir comment ouvrir un socket, y envoyer la m\u00e9trique et fermer le socket. <\/p>\n<p><b>La fiabilit\u00e9.<\/b> Tous les composants sont tol\u00e9rants aux pannes et g\u00e8rent bien nos charges. <\/p>\n<p><b>Faible barri\u00e8re d'entr\u00e9e.<\/b> Pour utiliser ce syst\u00e8me, vous n'avez pas besoin d'apprendre des langages de programmation ou des requ\u00eates dans Grafana. Il vous suffit d'ouvrir votre application, d'y ins\u00e9rer un socket qui enverra des m\u00e9triques \u00e0 Graphite, de le fermer, d'ouvrir Grafana, de cr\u00e9er des tableaux de bord et d'observer le comportement de vos m\u00e9triques, en recevant des notifications via Moira.<\/p>\n<p><b>Autonomie.<\/b> Tout cela peut \u00eatre fait soi-m\u00eame, sans l'aide d'ing\u00e9nieurs DevOps. Et c'est un surco\u00fbt, car vous pouvez surveiller votre projet d\u00e8s maintenant, sans demander l'aide de personne, ni pour commencer ni pour faire des modifications. <\/p>\n<h3>Quels sont nos objectifs ? <\/h3>\n<p>\nTout ce qui est mentionn\u00e9 ci-dessous n'est pas seulement des pens\u00e9es abstraites, mais des domaines vers lesquels des premi\u00e8res \u00e9tapes ont d\u00e9j\u00e0 \u00e9t\u00e9 faites. <\/p>\n<ol>\n<li>D\u00e9tecteur d'anomalies. Nous souhaitons d\u00e9velopper un service qui interrogera nos stockages Graphite et v\u00e9rifiera chaque m\u00e9trique selon divers algorithmes. Il existe d\u00e9j\u00e0 des algorithmes que nous souhaitons examiner, des donn\u00e9es sont disponibles, nous savons les manipuler.\n<\/li>\n<li>M\u00e9tadonn\u00e9es. Nous avons de nombreux services qui \u00e9voluent avec le temps, tout comme les personnes qui y travaillent. Maintenir la documentation manuellement n'est pas une option. C'est pourquoi nous int\u00e9grons actuellement des m\u00e9tadonn\u00e9es dans nos microservices. Elles indiquent qui les a d\u00e9velopp\u00e9es, les langages avec lesquels elles interagissent, les exigences SLA, ainsi que l'adresse et le destinataire des notifications. Lors du d\u00e9ploiement du service, toutes les donn\u00e9es de l'entit\u00e9 sont cr\u00e9\u00e9es automatiquement. Au final, vous obtenez deux liens : l'un pour les d\u00e9clencheurs, l'autre pour les tableaux de bord dans Grafana.\n<\/li>\n<li>Surveillance \u00e0 domicile. Nous pensons qu'un tel syst\u00e8me doit \u00eatre utilis\u00e9 par tous les d\u00e9veloppeurs. Dans ce cas, vous comprenez toujours o\u00f9 se trouve votre trafic, ce qui lui arrive, o\u00f9 il chute et quels sont ses points faibles. Si, par exemple, quelque chose venait \u00e0 perturber votre service, vous n'en serez pas inform\u00e9 lors d'un appel du manager, mais par une alerte, et vous pourrez imm\u00e9diatement ouvrir les logs r\u00e9cents pour voir ce qui s'est pass\u00e9.\n<\/li>\n<li>Haute performance. Notre projet ne cesse de cro\u00eetre, et aujourd'hui, il traite environ 2 000 000 de valeurs de m\u00e9triques par minute. Il y a un an, ce chiffre \u00e9tait de 500 000. La croissance se poursuit, et cela signifie qu'\u00e0 un moment donn\u00e9, Graphite (whisper) commencera \u00e0 lourdement solliciter le sous-syst\u00e8me de stockage. Comme je l'ai d\u00e9j\u00e0 mentionn\u00e9, ce syst\u00e8me de surveillance est assez polyvalent gr\u00e2ce \u00e0 l'interchangeabilit\u00e9 des composants. Certains entretiennent et \u00e9tendent leur infrastructure sp\u00e9cialement pour Graphite, mais nous avons d\u00e9cid\u00e9 d'adopter une autre approche : utiliser <noindex><a rel=\"nofollow\" href=\"https:\/\/clickhouse.yandex\/\">ClickHouse<\/a><\/noindex> comme stockage de nos m\u00e9triques. Cette transition est pratiquement termin\u00e9e et je vous expliquerai bient\u00f4t plus en d\u00e9tail comment cela a \u00e9t\u00e9 r\u00e9alis\u00e9 : les difficult\u00e9s rencontr\u00e9es et comment elles ont \u00e9t\u00e9 surmont\u00e9es, le processus de migration, et je d\u00e9crirai les composants choisis comme enveloppe ainsi que leurs configurations. \n<\/li>\n<\/ol>\n<p>\nMerci de votre attention ! Posez vos questions sur le sujet, je ferai de mon mieux pour y r\u00e9pondre ici ou dans les prochains articles. Peut-\u00eatre que quelqu'un a de l'exp\u00e9rience dans la construction d'un tel syst\u00e8me de surveillance ou la migration vers Clickhouse dans des situations similaires \u2013 partagez-le dans les commentaires.<br \/>\n<br \/>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/avito\/blog\/335410\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043b\u0438. \u0414\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0442\u0430\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0441\u0438\u043b\u0430\u043c\u0438 DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e. \u041c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438\u043c\u0438, \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0438 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u044b, \u043f\u0440\u0438\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c \u043a \u043d\u0438\u043c \u0430\u043b\u0435\u0440\u0442\u044b, [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52115","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043b\u0438. \u0414\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0442\u0430\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0441\u0438\u043b\u0430\u043c\u0438 DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/monitoring-kak-servis-modulnaya-sistema-dlya-mikroservisnoj-arhitektury\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441: \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043b\u0438. \u0414\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0442\u0430\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0441\u0438\u043b\u0430\u043c\u0438 DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/monitoring-kak-servis-modulnaya-sistema-dlya-mikroservisnoj-arhitektury\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T10:59:47+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Surveillance en tant que service : syst\u00e8me modulaire pour architecture microservices | ProHoster","description":"Aujourd'hui, dans notre projet, en plus du code monolithique, des dizaines de microservices fonctionnent. Chacun d'eux n\u00e9cessite surveillance. Faire cela en grande quantit\u00e9 avec les moyens des ing\u00e9nieurs DevOps est probl\u00e9matique.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/monitoring-kak-servis-modulnaya-sistema-dlya-mikroservisnoj-arhitektury","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"fr_FR","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441: \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u043b\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b | ProHoster","og:description":"\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043f\u043e\u043c\u0438\u043c\u043e \u043c\u043e\u043d\u043e\u043b\u0438\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0438\u0440\u0443\u044e\u0442 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043b\u0438. \u0414\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0442\u0430\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043c\u0430\u0445 \u0441\u0438\u043b\u0430\u043c\u0438 DevOps-\u0438\u043d\u0436\u0435\u043d\u0435\u0440\u043e\u0432 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u0442\u0438\u0447\u043d\u043e.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/monitoring-kak-servis-modulnaya-sistema-dlya-mikroservisnoj-arhitektury","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T21:00:00+00:00","article:modified_time":"2020-02-18T10:59:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52115","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 02:30:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:49:49","updated":"2026-01-24 02:30:22","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/52115","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=52115"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/52115\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=52115"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=52115"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=52115"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}