{"id":31014,"date":"2019-10-31T21:38:54","date_gmt":"2019-10-31T18:38:54","guid":{"rendered":"https:\/\/prohoster.info\/blog\/trassirovka-servisov-opentracing-i-jaeger\/"},"modified":"2019-10-31T21:38:54","modified_gmt":"2019-10-31T18:38:54","slug":"trassirovka-servisov-opentracing-i-jaeger","status":"publish","type":"post","link":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","title":{"rendered":"Tra\u00e7age des services, OpenTracing et Jaeger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Tra\u00e7age des services, OpenTracing et Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/045800f00c8da9702f62cf3de53df7b6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDans nos projets, nous utilisons une architecture de microservices. Lorsqu'il y a des goulets d'\u00e9tranglement en termes de performance, beaucoup de temps est consacr\u00e9 \u00e0 la surveillance et \u00e0 l'analyse des journaux. Lors de la journalisation des d\u00e9lais des op\u00e9rations individuelles dans un fichier journal, il est souvent difficile de comprendre ce qui a conduit \u00e0 l'appel de ces op\u00e9rations, de suivre la s\u00e9quence des actions ou de comprendre le d\u00e9calage temporel d'une op\u00e9ration par rapport \u00e0 une autre dans diff\u00e9rents services. <\/p>\n<p>Pour minimiser le travail manuel, nous avons d\u00e9cid\u00e9 d'utiliser l'un des outils de tra\u00e7age. Cet article parlera de la mani\u00e8re dont et pour quelles raisons nous pouvons utiliser le tra\u00e7age. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Quels probl\u00e8mes peut-on r\u00e9soudre gr\u00e2ce au tra\u00e7age<\/h3>\n<p><\/p>\n<ol>\n<li>Identifier les goulets d'\u00e9tranglement en performance, tant au sein d'un service que dans l'ensemble de l'arbre d'ex\u00e9cution entre tous les services impliqu\u00e9s. Par exemple :\n<ul>\n<li>De nombreux appels cons\u00e9cutifs courts entre les services, par exemple, pour la g\u00e9ocodification ou l'acc\u00e8s \u00e0 la base de donn\u00e9es.<\/li>\n<li>De longs temps d'attente pour les entr\u00e9es\/sorties, par exemple, le transfert de donn\u00e9es sur le r\u00e9seau ou la lecture sur disque.<\/li>\n<li>Un long parsing de donn\u00e9es.<\/li>\n<li>Des op\u00e9rations longues n\u00e9cessitant une CPU.<\/li>\n<li>Des segments de code qui ne sont pas n\u00e9cessaires pour obtenir le r\u00e9sultat final et qui peuvent \u00eatre supprim\u00e9s ou ex\u00e9cut\u00e9s de mani\u00e8re diff\u00e9r\u00e9e.<\/li>\n<\/ul>\n<\/li>\n<li>Comprendre clairement dans quel ordre les appels sont effectu\u00e9s et ce qui se passe lors de l'ex\u00e9cution d'une op\u00e9ration.<br \/>\n<img decoding=\"async\" alt=\"Tra\u00e7age des services, OpenTracing et Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/f22f14599568bff5573fe59eeeaea753.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nOn voit que, par exemple, la requ\u00eate est arriv\u00e9e au service WS -&gt; le service WS a compl\u00e9t\u00e9 les donn\u00e9es via le service R -&gt; ensuite a envoy\u00e9 une requ\u00eate au service V -&gt; le service V a charg\u00e9 beaucoup de donn\u00e9es depuis le service R -&gt; a fait appel au service P -&gt; le service P a encore une fois consult\u00e9 le service R -&gt; le service V a ignor\u00e9 le r\u00e9sultat et est all\u00e9 au service J -&gt; et a finalement renvoy\u00e9 la r\u00e9ponse au service WS, tout en continuant en arri\u00e8re-plan \u00e0 calculer autre chose.<br \/>\nSans ce tra\u00e7age ou une documentation d\u00e9taill\u00e9e sur l'ensemble du processus, il est tr\u00e8s difficile de comprendre ce qui se passe au premier coup d'\u0153il sur le code, surtout lorsque le code est dispers\u00e9 dans diff\u00e9rents services et cach\u00e9 derri\u00e8re de nombreux bins et interfaces.\n<\/li>\n<li>Collecter des informations sur l'arbre d'ex\u00e9cution pour une analyse ult\u00e9rieure diff\u00e9r\u00e9e. \u00c0 chaque \u00e9tape d'ex\u00e9cution, il est possible d'ajouter des informations disponibles \u00e0 ce stade dans le tra\u00e7age et de comprendre ensuite quelles donn\u00e9es d'entr\u00e9e ont conduit \u00e0 un tel sc\u00e9nario. Par exemple :\n<ul>\n<li>ID utilisateur<\/li>\n<li>Droits<\/li>\n<li>Type de m\u00e9thode s\u00e9lectionn\u00e9e<\/li>\n<li>Journal ou erreur d'ex\u00e9cution<\/li>\n<\/ul>\n<\/li>\n<li>La transformation des traces en un sous-ensemble de m\u00e9triques et l'analyse ult\u00e9rieure sous forme de m\u00e9triques.<\/li>\n<\/ol>\n<h3>Ce que la tra\u00e7abilit\u00e9 peut enregistrer. Span<\/h3>\n<p>Dans le tra\u00e7age, il y a le concept de span, qui est l'\u00e9quivalent d'un log dans la console. Un span a :<\/p>\n<ul>\n<li>Un nom, g\u00e9n\u00e9ralement le nom de la m\u00e9thode ex\u00e9cut\u00e9e<\/li>\n<li>Le nom du service dans lequel le span a \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9<\/li>\n<li>Un identifiant unique propre<\/li>\n<li>Une certaine m\u00e9ta-information sous forme de key\/value, qui a \u00e9t\u00e9 enregistr\u00e9e dans ce span. Par exemple, les param\u00e8tres de la m\u00e9thode ou si la m\u00e9thode s'est termin\u00e9e par une erreur ou non.<\/li>\n<li>Le temps de d\u00e9but et de fin de l'ex\u00e9cution de ce span<\/li>\n<li>L'identifiant du span parent<\/li>\n<\/ul>\n<p>\nChaque span est envoy\u00e9 au collector de spans pour \u00eatre sauvegard\u00e9 dans la base de donn\u00e9es pour consultation ult\u00e9rieure d\u00e8s qu'il a termin\u00e9 son ex\u00e9cution. Par la suite, il est possible de construire un arbre de tous les spans en les reliant par l'ID du parent. Lors de l'analyse, on peut trouver, par exemple, tous les spans dans un service donn\u00e9 qui ont pris plus d'un certain temps. Ensuite, en consultant un span sp\u00e9cifique, on peut voir tout l'arbre au-dessus et en dessous de ce span.<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age des services, OpenTracing et Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/9cc97f1278af60f0efd5e393cd183c5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Opentrace, Jaeger et comment nous l'avons mis en \u0153uvre pour nos projets<\/h3>\n<p>\nIl existe une norme g\u00e9n\u00e9rale <noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/docs\/overview\/\">Opentrace<\/a><\/noindex>, qui d\u00e9crit comment et quoi collecter, sans lier la tra\u00e7abilit\u00e9 \u00e0 une mise en \u0153uvre sp\u00e9cifique dans un langage donn\u00e9. Par exemple, en Java, tout le travail avec les traces se fait par le biais d'une API commune Opentrace, tandis qu'en dessous peut se cacher, par exemple, Jaeger ou une impl\u00e9mentation par d\u00e9faut vide qui ne fait rien.<br \/>\nNous utilisons <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/\">Jaeger<\/a><\/noindex> comme impl\u00e9mentation d'Opentrace. Il se compose de plusieurs composants :<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age des services, OpenTracing et Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/1fd4ae8563569271b067861c81101d71.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Jaeger-agent \u2014 un agent local, qui est g\u00e9n\u00e9ralement install\u00e9 sur chaque machine et dans lequel les services enregistrent sur le port par d\u00e9faut local. Si l'agent est absent, les traces de tous les services sur cette machine sont g\u00e9n\u00e9ralement d\u00e9sactiv\u00e9es.<\/li>\n<li>Jaeger-collector \u2014 tous les agents y envoient les traces collect\u00e9es, et il les place dans la base de donn\u00e9es choisie.<\/li>\n<li>La base de donn\u00e9es \u2014 leur pr\u00e9f\u00e9rence est Cassandra, mais nous utilisons Elasticsearch, il existe des implementations pour quelques autres bases de donn\u00e9es et une implementation en m\u00e9moire qui ne sauvegarde rien sur disque.<\/li>\n<li>Jaeger-query \u2014 c'est un service qui interroge la base de donn\u00e9es et restitue les traces collect\u00e9es pour analyse.<\/li>\n<li>Jaeger-ui \u2014 c'est une interface web pour rechercher et visualiser les traces, elle interroge jaeger-query.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age des services, OpenTracing et Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/afc415cb5d4f19e7ba18394c2c1a9dd5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn composant distinct peut \u00eatre consid\u00e9r\u00e9 comme l'impl\u00e9mentation d'opentrace Jaeger pour des langages sp\u00e9cifiques, \u00e0 travers laquelle les spans sont envoy\u00e9s au jaeger-agent.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">Int\u00e9gration de Jaeger en Java<\/a><\/noindex> Il s'agit d'impl\u00e9menter l'interface io.opentracing.Tracer, apr\u00e8s quoi toutes les traces passeront par elle vers un v\u00e9ritable agent.<\/p>\n<p><img decoding=\"async\" alt=\"Tra\u00e7age des services, OpenTracing et Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/5ce4bdfc06def7e4645bd58163e99dab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl est \u00e9galement possible de connecter des composants Spring <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-cloud\">opentracing-spring-cloud-starter<\/a><\/noindex> et l'impl\u00e9mentation de Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-jaeger\">opentracing-spring-jaeger-cloud-starter<\/a><\/noindex> qui configurera automatiquement la tra\u00e7abilit\u00e9 de tout ce qui passe par ces composants, comme les requ\u00eates HTTP dans les contr\u00f4leurs, les requ\u00eates \u00e0 la base de donn\u00e9es via JDBC, etc.<\/p>\n<h3>Journalisation des traces en Java<\/h3>\n<p>\n\u00c0 un niveau sup\u00e9rieur, le premier Span doit \u00eatre cr\u00e9\u00e9. Cela peut \u00eatre fait automatiquement par exemple par le contr\u00f4leur Spring lors de la r\u00e9ception d'une requ\u00eate, ou manuellement s'il n'y a pas de contr\u00f4leur. Ensuite, il est transmis par l'interm\u00e9diaire du Scope inf\u00e9rieur. Si un quelconque m\u00e9thode souhaite ajouter un Span, elle prend l'activeSpan actuel \u00e0 partir du Scope, cr\u00e9e un nouveau Span et indique que son parent est l'activeSpan re\u00e7u, puis rend le nouveau Span actif. Lors de l'appel de services externes, l'actuel active span est transmis, et ces services cr\u00e9ent de nouveaux spans li\u00e9s \u00e0 ce span.<br \/>\nTout fonctionne via une instance de Tracer, que l'on peut obtenir par le biais du m\u00e9canisme DI, ou via GlobalTracer.get() comme une variable globale, si le m\u00e9canisme DI ne fonctionne pas. Par d\u00e9faut, si le tracer n'a pas \u00e9t\u00e9 initialis\u00e9, un NoopTracer sera retourn\u00e9, qui ne fait rien.<br \/>\nEnsuite, \u00e0 partir du tracer, le ScopeManager r\u00e9cup\u00e8re le Scope actuel, cr\u00e9e un nouveau Scope \u00e0 partir de l'actuel, li\u00e9 au nouveau span, puis le Scope cr\u00e9\u00e9 est ferm\u00e9, ce qui ferme le span cr\u00e9\u00e9 et restaure l'\u00e9tat actif de l'ancien Scope. Le Scope est li\u00e9 \u00e0 un thread, donc en programmation multithread, il ne faut pas oublier de transmettre l'active span dans un autre thread, pour permettre l'activation du Scope de cet autre thread li\u00e9 \u00e0 ce span.<\/p>\n<pre><code class=\"java\">io.opentracing.Tracer tracer = ...; \/\/ GlobalTracer.get()\n\nvoid DoSmth () {\n   try (Scope scope = tracer.buildSpan(\"DoSmth\").startActive(true)) {\n      ...\n   }\n}\nvoid DoOther () {\n    Span span = tracer.buildSpan(\"someWork\").start();\n    try (Scope scope = tracer.scopeManager().activate(span, false)) {\n        \/\/ Effectuer des actions.\n    } catch(Exception ex) {\n        Tags.ERROR.set(span, true);\n        span.log(Map.of(Fields.EVENT, \"error\", Fields.ERROR_OBJECT, ex, Fields.MESSAGE, ex.getMessage()));\n    } finally {\n        span.finish();\n    }\n}\n\nvoid DoAsync () {\n    try (Scope scope = tracer.buildSpan(\"ServiceHandlerSpan\").startActive(false)) {\n        ...\n        final Span span = scope.span();\n        doAsyncWork(() -&gt; {\n            \/\/ \u00c9TAPE 2 CI-DESSUS : r\u00e9activer le Span dans le rappel, en passant vrai \u00e0\n            \/\/ startActive() si\/quan le Span doit \u00eatre termin\u00e9.\n            try (Scope scope = tracer.scopeManager().activate(span, false)) {\n                ...\n            }\n        });\n    }\n}<\/code><\/pre>\n<p>Pour la programmation multithread, il existe \u00e9galement TracedExecutorService et des wrappers similaires qui transmettent automatiquement le span actuel dans le thread lors de l'ex\u00e9cution de t\u00e2ches asynchrones :<\/p>\n<pre><code class=\"java\">private ExecutorService executor = new TracedExecutorService(\n    Executors.newFixedThreadPool(10), GlobalTracer.get()\n);<\/code><\/pre>\n<p>Pour les requ\u00eates http externes, il y a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-apache-httpclient\">TracingHttpClient<\/a><\/noindex><\/p>\n<pre><code class=\"java\">HttpClient httpClient = new TracingHttpClientBuilder().build();<\/code><\/pre>\n<h3>Les probl\u00e8mes auxquels nous avons \u00e9t\u00e9 confront\u00e9s<\/h3>\n<p><\/p>\n<ul>\n<li>Les beans et DI ne fonctionnent pas toujours si le tracer est utilis\u00e9 en dehors d'un service ou d'un composant, alors <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex> Le Tracer peut ne pas fonctionner et il faudra utiliser GlobalTracer.get().<\/li>\n<li>Les annotations ne fonctionnent pas si ce n'est pas un composant ou un service, ou si l'appel de m\u00e9thode se fait depuis une m\u00e9thode adjacente de la m\u00eame classe. Il faut faire attention, v\u00e9rifier ce qui fonctionne, et utiliser la cr\u00e9ation manuelle de trace si @Traced ne fonctionne pas. On peut \u00e9galement ajouter un compilateur suppl\u00e9mentaire pour les annotations java, alors elles devraient fonctionner partout.<\/li>\n<li>Dans les anciennes versions de spring et spring boot, l'autoconfiguration opentracing spring cloud ne fonctionne pas \u00e0 cause de bugs dans la DI, alors si l'on veut que les traces fonctionnent automatiquement dans les composants Spring, on peut le faire par analogie avec <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-jaeger\/blob\/master\/opentracing-spring-jaeger-starter\/src\/main\/java\/io\/opentracing\/contrib\/java\/spring\/jaeger\/starter\/JaegerAutoConfiguration.java\">github.com\/opentracing-contrib\/java-spring-jaeger\/blob\/master\/opentracing-spring-jaeger-starter\/src\/main\/java\/io\/opentracing\/contrib\/java\/spring\/jaeger\/starter\/JaegerAutoConfiguration.java<\/a><\/noindex><\/li>\n<li>En groovy, le try avec ressources ne fonctionne pas, il faut absolument utiliser try finally.<\/li>\n<li>Chaque service doit sp\u00e9cifier son propre spring.application.name sous lequel les traces seront enregistr\u00e9es. De plus, un nom distinct pour la production et le test, afin de ne pas les m\u00e9langer.<\/li>\n<li>Si l'on utilise GlobalTracer et tomcat, tous les services lanc\u00e9s dans ce tomcat partagent un seul GlobalTracer, donc ils auront tous le m\u00eame nom de service.<\/li>\n<li>Lors de l'ajout de traces \u00e0 une m\u00e9thode, il faut s'assurer qu'elle n'est pas appel\u00e9e en boucle plusieurs fois. Il est n\u00e9cessaire d'ajouter une trace commune pour tous les appels, qui enregistrera le temps total d'ex\u00e9cution. Sinon, une charge excessive sera g\u00e9n\u00e9r\u00e9e.<\/li>\n<li>Une fois, dans jaeger-ui, nous avons effectu\u00e9 des requ\u00eates trop volumineuses sur un grand nombre de traces et, ne pouvant pas attendre la r\u00e9ponse, nous avons r\u00e9it\u00e9r\u00e9. En fin de compte, jaeger-query a utilis\u00e9 beaucoup de m\u00e9moire et a ralenti elastik. Un red\u00e9marrage de jaeger-query a r\u00e9solu le probl\u00e8me.<\/li>\n<\/ul>\n<h3>\u00c9chantillonnage, stockage et visualisation des traces<\/h3>\n<p>\nIl y a trois types <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.9\/sampling\/\">d'\u00e9chantillonnage des traces<\/a><\/noindex>:<\/p>\n<ol>\n<li>Const qui envoie et enregistre toutes les traces.<\/li>\n<li>Probabilistic qui filtre les traces avec une certaine probabilit\u00e9 d\u00e9finie.<\/li>\n<li>Le ratelimit qui limite le nombre de traces par seconde. Ces param\u00e8tres peuvent \u00eatre configur\u00e9s sur le client, soit sur jaeger-agent soit dans le collecteur. Actuellement, dans notre pile de validateurs, nous utilisons const 1 car le nombre de requ\u00eates n'est pas tr\u00e8s \u00e9lev\u00e9 mais elles prennent beaucoup de temps. \u00c0 l'avenir, si cela entra\u00eene une charge excessive sur le syst\u00e8me, il faudra limiter.<\/li>\n<\/ol>\n<p>\nSi l'on utilise Cassandra, par d\u00e9faut, elle ne conserve les traces que pendant deux jours. Nous utilisons <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger\/tree\/master\/plugin\/storage\/es\">elasticsearch<\/a><\/noindex> et les traces sont conserv\u00e9es ind\u00e9finiment et ne sont pas supprim\u00e9es. Un index distinct est cr\u00e9\u00e9 pour chaque jour, par exemple jaeger-service-2019-03-04. \u00c0 l'avenir, il faudra configurer un nettoyage automatique des anciennes traces.<\/p>\n<p>Pour visualiser les traces, il faut :<\/p>\n<ul>\n<li>Choisir le service en fonction duquel vous souhaitez filtrer les traces, par exemple tomcat7-default pour un service qui fonctionne dans Tomcat et qui ne peut pas avoir son propre nom.<\/li>\n<li>Ensuite, s\u00e9lectionnez l'op\u00e9ration, la p\u00e9riode de temps et la dur\u00e9e minimale de l'op\u00e9ration, par exemple \u00e0 partir de 10 secondes, afin de ne r\u00e9cup\u00e9rer que les ex\u00e9cutions longues.<br \/>\n<img decoding=\"async\" alt=\"Tra\u00e7age des services, OpenTracing et Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/bc712d4aabfe9c2ae961d3b8f9396a42.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Acc\u00e9dez \u00e0 l'une des traces et v\u00e9rifiez ce qui a caus\u00e9 des ralentissements.<br \/>\n<img decoding=\"async\" alt=\"Tra\u00e7age des services, OpenTracing et Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/16e9dd11903358f5498fe11034bbf848.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p>\nDe plus, si un identifiant de requ\u00eate est connu, il est possible de trouver la trace par cet identifiant via la recherche par balises, si cet identifiant est consign\u00e9 dans le span de la trace.<\/p>\n<h3>Documentation<\/h3>\n<p><\/p>\n<ul>\n<li>Documentation opentracing <noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/docs\/overview\/what-is-tracing\/\">opentracing.io\/docs\/overview\/what-is-tracing<\/a><\/noindex><\/li>\n<li>Documentation jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.10\/\">www.jaegertracing.io\/docs\/1.10<\/a><\/noindex><\/li>\n<li>Connexion jaeger java <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">github.com\/jaegertracing\/jaeger-client-java<\/a><\/noindex><\/li>\n<li>Connexion spring opentracing<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">github.com\/jaegertracing\/jaeger-client-java<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-cloud\">github.com\/opentracing-contrib\/java-spring-cloud<\/a><\/noindex><\/li>\n<\/ul>\n<h3>Articles<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/carprice\/blog\/340946\/\">habr.com\/ru\/company\/carprice\/blog\/340946<\/a><\/noindex> Jaeger Opentracing et Microservices dans un projet r\u00e9el en PHP et Golang<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/eng.uber.com\/distributed-tracing\/\">eng.uber.com\/distributed-tracing<\/a><\/noindex> Evolving Distributed Tracing at Uber Engineering<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/guides\/java\/\">opentracing.io\/guides\/java<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/jaegertracing\/running-jaeger-agent-on-bare-metal-d1fc47d31fab\">medium.com\/jaegertracing\/running-jaeger-agent-on-bare-metal-d1fc47d31fab<\/a><\/noindex> Ex\u00e9cution de l'agent Jaeger sur du mat\u00e9riel nu<\/li>\n<\/ul>\n<h3>Vid\u00e9o<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=qg0ENOdP1Lo\">www.youtube.com\/watch?v=qg0ENOdP1Lo<\/a><\/noindex> Comment nous avons utilis\u00e9 Jaeger et Prometheus pour offrir des requ\u00eates utilisateur ultra-rapides \u2014 Bryan Boreham<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=WRntQsUajow\">www.youtube.com\/watch?v=WRntQsUajow<\/a><\/noindex> Introduction : Jaeger \u2014 Yuri Shkuro, Uber &amp; Pavol Loffay, Red Hat<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=fsHb0qK37bc\">www.youtube.com\/watch?v=fsHb0qK37bc<\/a><\/noindex> Serghei Iakovlev, \"Une petite histoire d'un grand succ\u00e8s : OpenTracing, AWS et Jaeger\"<\/li>\n<\/ul>\n<p>Source : <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/srg\/blog\/446752\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443. \u041f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0443\u0437\u043a\u0438\u0445 \u043c\u0435\u0441\u0442 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0440\u0430\u0437\u0431\u043e\u0440 \u043b\u043e\u0433\u043e\u0432. \u041f\u0440\u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u043e\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043b\u043e\u0433-\u0444\u0430\u0439\u043b, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a \u0432\u044b\u0437\u043e\u0432\u0443 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0438\u043b\u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445. \u0414\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":22990,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31014","post","type-post","status-publish","format-standard","has-post-thumbnail","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=\"\u0412 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e.\" \/>\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\/trassirovka-servisov-opentracing-i-jaeger\" \/>\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\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, OpenTracing \u0438 Jaeger | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger\" \/>\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-31T18:38:54+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:38:54+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\udd47Tra\u00e7abilit\u00e9 des services, OpenTracing et Jaeger | ProHoster","description":"Dans nos projets, nous utilisons des microservices.","canonical_url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","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\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, OpenTracing \u0438 Jaeger | ProHoster","og:description":"\u0412 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e.","og:url":"https:\/\/prohoster.info\/fr\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","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-31T18:38:54+00:00","article:modified_time":"2019-10-31T18:38:54+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31014","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-21 04:06:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:26:04","updated":"2026-01-21 04:06:20","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\/31014","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=31014"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/31014\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/22990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=31014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=31014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=31014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}