{"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\/nl\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","title":{"rendered":"Service tracing, OpenTracing en Jaeger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Service tracing, OpenTracing en Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/045800f00c8da9702f62cf3de53df7b6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn onze projecten maken we gebruik van microservicesarchitectuur. Wanneer er prestatieknelpunten optreden, wordt er veel tijd besteed aan monitoring en het analyseren van logs. Bij het loggen van de timing van afzonderlijke operaties in een logbestand is het vaak moeilijk te begrijpen wat heeft geleid tot het aanroepen van deze operaties, de volgorde van acties te traceren of de tijdverschuiving van de ene operatie ten opzichte van de andere in verschillende services te volgen. <\/p>\n<p>Om handmatig werk te minimaliseren, hebben we besloten gebruik te maken van een van de traceertools. In dit artikel wordt besproken hoe en waarvoor traceering kan worden gebruikt en hoe wij dit hebben gedaan. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Welke problemen kunnen worden opgelost met traceering<\/h3>\n<p><\/p>\n<ol>\n<li>Identificeer knelpunten in de prestaties, zowel binnen \u00e9\u00e9n service als in de gehele uitvoeringstroom tussen alle betrokken services. Bijvoorbeeld:\n<ul>\n<li>Vele korte opeenvolgende aanroepen tussen services, bijvoorbeeld voor geocodering of naar een database.<\/li>\n<li>Langdurige invoer- en uitvoerwachttijden, bijvoorbeeld het verzenden van gegevens via het netwerk of het lezen van gegevens van de schijf.<\/li>\n<li>Langdurige gegevensparsering.<\/li>\n<li>Langdurige operaties die veel CPU vereisen.<\/li>\n<li>Codefragmenten die niet nodig zijn voor het verkrijgen van het uiteindelijke resultaat en kunnen worden verwijderd, of uitgesteld kunnen worden uitgevoerd.<\/li>\n<\/ul>\n<\/li>\n<li>Duidelijk begrijpen in welke volgorde dingen worden aangeroepen en wat er gebeurt wanneer een operatie wordt uitgevoerd.<br \/>\n<img decoding=\"async\" alt=\"Service tracing, OpenTracing en Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/f22f14599568bff5573fe59eeeaea753.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nHet is zichtbaar dat, bijvoorbeeld, het verzoek aankomt bij de WS-service -&gt; de WS-service vulde gegevens aan via de R-service -&gt; vervolgens werd een verzoek naar de V-service gestuurd -&gt; de V-service laadde veel gegevens van de R-service -&gt; ging naar de P-service -&gt; de P-service ging nogmaals naar de R-service -&gt; de V-service negeerde het resultaat en ging naar de J-service -&gt; en slechts daarna werd het antwoord teruggestuurd naar de WS-service, terwijl er in de achtergrond nog steeds iets anders werd berekend.<br \/>\nZonder dergelijke tracering of gedetailleerde documentatie van het hele proces is het erg moeilijk te begrijpen wat er gebeurt wanneer je voor het eerst naar de code kijkt, en de code is verspreid over verschillende services en verstopt achter talloze beans en interfaces.\n<\/li>\n<li>Verzameling van informatie over de uitvoeringsstroom voor latere analyse. In elke fase van de uitvoering kan informatie worden toegevoegd aan de trace die beschikbaar is op dat moment, en vervolgens kan worden onderzocht welke invoergegevens hebben geleid tot een dergelijk scenario. Bijvoorbeeld:\n<ul>\n<li>Gebruikers-ID<\/li>\n<li>Rechten<\/li>\n<li>Type geselecteerde methode<\/li>\n<li>Log of execution or error<\/li>\n<\/ul>\n<\/li>\n<li>Het omzetten van traces naar een subset van metrics en verdere analyse in de vorm van metrics.<\/li>\n<\/ol>\n<h3>Wat logging van tracing kan doen. Span<\/h3>\n<p>In tracing is er het begrip span, dit is het equivalent van \u00e9\u00e9n log in de console. Een span heeft:<\/p>\n<ul>\n<li>Een naam, meestal de naam van de uitgevoerde methode<\/li>\n<li>De naam van de service waarin de span is gegenereerd<\/li>\n<li>Een unieke ID<\/li>\n<li>Enige meta-informatie in de vorm van key\/value die daarin is gelogd. Bijvoorbeeld, de parameters van de methode of of de methode met een fout is afgelopen of niet<\/li>\n<li>De start- en eindtijd van de uitvoering van deze span<\/li>\n<li>ID van de bovenliggende span<\/li>\n<\/ul>\n<p>\nElke span wordt naar de collector van spans gestuurd voor opslag in de database voor latere weergave zodra deze zijn uitvoering heeft voltooid. Later kan een boom van alle spans worden opgebouwd door te verbinden op basis van de ID van de ouder. Bij de analyse kunnen bijvoorbeeld alle spans in een bepaalde service worden gevonden die langer dan een bepaalde tijd hebben geduurd. Vervolgens, door naar een specifieke span te gaan, kan de volledige boom boven en onder deze span worden bekeken.<\/p>\n<p><img decoding=\"async\" alt=\"Service tracing, OpenTracing en Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/9cc97f1278af60f0efd5e393cd183c5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Opentrace, Jaeger en hoe we dit hebben ge\u00efmplementeerd voor onze projecten<\/h3>\n<p>\nEr is een gemeenschappelijke standaard <noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/docs\/overview\/\">Opentrace<\/a><\/noindex>, die beschrijft hoe en wat verzameld moet worden, zonder de tracing te koppelen aan een specifieke implementatie in een bepaalde taal. Bijvoorbeeld, in Java wordt alle interactie met traces gedaan via de gezamenlijke API Opentrace, en daarachter kan bijvoorbeeld Jaeger of een lege standaardimplementatie zitten die niets doet.<br \/>\nWij gebruiken <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/\">Jaeger<\/a><\/noindex> als implementatie van Opentrace. Het bestaat uit verschillende componenten:<\/p>\n<p><img decoding=\"async\" alt=\"Service tracing, OpenTracing en Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/1fd4ae8563569271b067861c81101d71.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Jaeger-agent \u2013 een lokale agent die meestal op elke machine staat en waarin de services rapporteren naar de lokale standaardpoort. Als er geen agent is, zijn de traces van alle services op deze machine meestal uitgeschakeld.<\/li>\n<li>Jaeger-collector \u2013 dit is waar alle agents de verzamelde traces naar verzenden, en deze plaatst ze in de gekozen database.<\/li>\n<li>Database \u2013 hun voorkeur gaat uit naar Cassandra, maar wij gebruiken Elasticsearch, er zijn implementaties voor nog een paar andere databases en een in-memory implementatie die niets op disk opslaat.<\/li>\n<li>Jaeger-query \u2013 dit is een service die de database aanspreekt en de verzamelde traces voor analyse teruggeeft.<\/li>\n<li>Jaeger-ui \u2013 dit is een webinterface voor het zoeken en bekijken van traces, deze spreekt jaeger-query aan.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Service tracing, OpenTracing en Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/afc415cb5d4f19e7ba18394c2c1a9dd5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAls aparte component kan de implementatie van opentrace jaeger voor specifieke talen worden genoemd, via welke spans naar jaeger-agent worden verzonden.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">Verbinden van Jaeger in Java<\/a><\/noindex> het komt erop neer een interface io.opentracing.Tracer te implementeren, waarna alle traceringen via deze interface naar de daadwerkelijke agent zullen worden verzonden.<\/p>\n<p><img decoding=\"async\" alt=\"Service tracing, OpenTracing en Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/5ce4bdfc06def7e4645bd58163e99dab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOok voor Spring-componenten kan men aansluiten <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-cloud\">opentracing-spring-cloud-starter<\/a><\/noindex> en de implementatie van Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-jaeger\">opentracing-spring-jaeger-cloud-starter<\/a><\/noindex> die automatisch de tracering zal configureren voor alles wat door deze componenten gaat, bijvoorbeeld HTTP-verzoeken naar controllers, databaseverzoeken via JDBC, enzovoort.<\/p>\n<h3>Logging van traceringen in Java<\/h3>\n<p>\nEr moet op het hoogste niveau de eerste Span worden aangemaakt, dit kan automatisch gebeuren bijvoorbeeld door de Spring-controller bij ontvangst van de aanvraag, of handmatig als dit niet het geval is. Vervolgens wordt deze doorgegeven aan de Scope eronder. Als een methode verderop een Span wil toevoegen, neemt hij de huidige activeSpan uit de Scope, cre\u00ebert een nieuwe Span en geeft aan dat zijn ouder de ontvangen activeSpan is, en maakt de nieuwe Span actief. Bij het aanroepen van externe diensten wordt de huidige actieve Span doorgegeven, en die diensten cre\u00ebren nieuwe spannen die aan deze span zijn gekoppeld.<br \/>\nHet hele werk gebeurt via een Tracer-instant, deze kan verkregen worden via het DI-mechanisme of GlobalTracer.get() als een globale variabele, als het DI-mechanisme niet werkt. Standaard, als de tracer niet is ge\u00efnitialiseerd, zal NoopTracer worden geretourneerd, die niets doet.<br \/>\nVervolgens wordt de huidige scope uit de tracer via ScopeManager gehaald, wordt er een nieuwe scope aangemaakt van de huidige met de nieuwe span eraan gekoppeld, en later wordt de aangemaakte Scope gesloten, wat de gemaakte span sluit en de vorige Scope weer actief maakt. De Scope is aan de thread gekoppeld, dus bij multithreaded programmeren moet men niet vergeten de actieve span naar de andere thread door te geven, voor de verdere activatie van de Scope van de andere thread met koppeling aan deze 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        \/\/ Doe dingen.\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            \/\/ STAP 2 BOVEN: heractiveer de Span in de callback, geef true door\n            \/\/ startActive() als\/wanneer de Span moet worden voltooid.\n            try (Scope scope = tracer.scopeManager().activate(span, false)) {\n                ...\n            }\n        });\n    }\n}<\/code><\/pre>\n<p>Voor multithreading-programmering zijn er ook TracedExecutorService en soortgelijke wrappers die automatisch de huidige span doorgeven aan de thread wanneer asynchrone taken worden gestart:<\/p>\n<pre><code class=\"java\">private ExecutorService executor = new TracedExecutorService(\n    Executors.newFixedThreadPool(10), GlobalTracer.get()\n);<\/code><\/pre>\n<p>Voor externe http-aanroepen zijn er <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>Problemen waarmee we geconfronteerd werden<\/h3>\n<p><\/p>\n<ul>\n<li>Beans en DI werken niet altijd als de tracer niet in een service of component wordt gebruikt, dan <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex> kan de Tracer niet werken en moet GlobalTracer.get() worden gebruikt.<\/li>\n<li>Annotaties werken niet als het geen component of service is, of als de methode vanuit een buurman is aangeroepen in dezelfde klasse. We moeten voorzichtig zijn, controleren wat werkt en handmatig een trace maken als @Traced niet werkt. Ook kan er een extra compiler voor java-annotaties worden toegevoegd, dan zouden ze overal moeten werken.<\/li>\n<li>In oudere versies van spring en spring boot werkt de autoconfiguratie van opentracing spring cloud niet vanwege bugs in DI, als we willen dat de trace automatisch in spring-componenten werken, kan dit worden gedaan volgens <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>In groovy werkt try with resources niet, we moeten altijd try finally gebruiken.<\/li>\n<li>Elke service moet zijn eigen spring.application.name hebben waaronder de traces worden gelogd. En een aparte naam voor productie en test, zodat ze elkaar niet in de weg zitten.<\/li>\n<li>Als GlobalTracer en tomcat worden gebruikt, hebben alle services die in deze tomcat zijn gestart dezelfde GlobalTracer, dus hebben ze allemaal dezelfde servicenaam.<\/li>\n<li>Bij het toevoegen van traces aan een methode, moet je er zeker van zijn dat deze niet meerdere keren in een loop wordt aangeroepen. Voeg \u00e9\u00e9n gemeenschappelijke trace toe voor alle aanroepen, die de totale verwerkingstijd logt. Anders wordt er overmatige belasting gecre\u00eberd.<\/li>\n<li>E\u00e9n keer in jaeger-ui deden we te grote aanvragen voor een groot aantal traces en aangezien we niet op het antwoord wachtten, deden we het nog een keer. Uiteindelijk begon jaeger-query veel geheugen te gebruiken en vertragend te werken met elastic. Herstarten van jaeger-query hielp.<\/li>\n<\/ul>\n<h3>Sampling, opslag en weergave van traces<\/h3>\n<p>\nEr zijn drie typen <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.9\/sampling\/\">sampling van traces<\/a><\/noindex>:<\/p>\n<ol>\n<li>Const die alle traces verzendt en opslaat.<\/li>\n<li>Probabilistic die traces filtert met een bepaalde kans.<\/li>\n<li>Rate limiting dat het aantal trac\u00e9s per seconde beperkt. Deze parameters kunnen op de client, op de jaeger-agent of in de collector worden ingesteld. Momenteel gebruiken we in onze stack van validators const 1, omdat er niet veel aanvragen zijn, maar ze nemen wel een aanzienlijke tijd in beslag. Als dit in de toekomst een te grote belasting voor het systeem veroorzaakt, kunnen we dit beperken.<\/li>\n<\/ol>\n<p>\nAls je Cassandra gebruikt, slaat het standaard alleen trace data voor twee dagen op. Wij gebruiken <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger\/tree\/master\/plugin\/storage\/es\">elasticsearch<\/a><\/noindex> en de trac\u00e9s worden opgeslagen voor onbeperkte tijd en worden niet verwijderd. Voor elke dag wordt er een aparte index aangemaakt, bijvoorbeeld jaeger-service-2019-03-04. In de toekomst moet er automatische opruiming van oude trac\u00e9s worden ingesteld.<\/p>\n<p>Om de trac\u00e9s te bekijken, moet je:<\/p>\n<ul>\n<li>Een service selecteren waar je de trac\u00e9s op wilt filteren, bijvoorbeeld tomcat7-default voor de service die in Tomcat draait en niet zijn eigen naam kan hebben.<\/li>\n<li>Vervolgens een operatie, tijdsinterval en minimale bewerkingstijd selecteren, bijvoorbeeld vanaf 10 seconden, om alleen lange uitvoeringen te nemen.<br \/>\n<img decoding=\"async\" alt=\"Service tracing, OpenTracing en Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/bc712d4aabfe9c2ae961d3b8f9396a42.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Ga naar een van de trac\u00e9s en kijk wat daar de vertraging veroorzaakte.<br \/>\n<img decoding=\"async\" alt=\"Service tracing, OpenTracing en Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/16e9dd11903358f5498fe11034bbf848.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p>\nAls er een bepaalde aanvraag ID bekend is, kan de trace met deze ID via de tag-zoekfunctie worden gevonden, als deze ID in de span van de trace wordt gelogd.<\/p>\n<h3>Documentation<\/h3>\n<p><\/p>\n<ul>\n<li>Documentatie 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>Documentatie Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.10\/\">www.jaegertracing.io\/docs\/1.10<\/a><\/noindex><\/li>\n<li>Jaeger Java aansluiting <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">github.com\/jaegertracing\/jaeger-client-java<\/a><\/noindex><\/li>\n<li>Spring OpenTracing aansluiting<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>Artikelen<\/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 en Microservices in een echt project in PHP en 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> Jaeger Agent draaien op bare metal<\/li>\n<\/ul>\n<h3>Video<\/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> Hoe We Jaeger en Prometheus Gebruikten om Bliksemsnelle Gebruiksvragen te Leveren \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> Intro: 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, \u201cEen Klein Verhaal van een Grote Overwinning: OpenTracing, AWS en Jaeger\u201d<\/li>\n<\/ul>\n<p>Bron: <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.3 - 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\/nl\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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\udd47Service tracing, OpenTracing en Jaeger | ProHoster","description":"In onze projecten maken we gebruik van microservices.","canonical_url":"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/31014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=31014"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/31014\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/22990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=31014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=31014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=31014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}