{"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\/da\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","title":{"rendered":"Sporing af tjenester, OpenTracing og Jaeger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Sporing af tjenester, OpenTracing og Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/045800f00c8da9702f62cf3de53df7b6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI vores projekter bruger vi mikroservicearkitektur. N\u00e5r der opst\u00e5r flaskehalse i ydeevnen, bruges der ofte meget tid p\u00e5 overv\u00e5gning og analyse af logfiler. N\u00e5r man logger tider for specifikke operationer til logfilen, kan det som regel v\u00e6re sv\u00e6rt at forst\u00e5, hvad der f\u00f8rte til opkald af disse operationer, f\u00f8lge r\u00e6kkef\u00f8lgen af handlinger eller tidsforskydningen af en operation i forhold til en anden p\u00e5 tv\u00e6rs af forskellige tjenester. <\/p>\n<p>For at minimere manuelt arbejde besluttede vi at bruge et af trace-v\u00e6rkt\u00f8jerne. Denne artikel vil diskutere, hvordan og hvorfor man kan bruge tracing, og hvordan vi har gjort det. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Hvilke problemer kan l\u00f8ses med hj\u00e6lp af tracing<\/h3>\n<p><\/p>\n<ol>\n<li>At finde flaskehalse i ydeevnen b\u00e5de inden for en enkelt tjeneste og i hele udf\u00f8relsestr\u00e6et mellem alle involverede tjenester. For eksempel:\n<ul>\n<li>Mange korte sekventielle opkald mellem tjenester, for eksempel til geokodning eller til databasen.<\/li>\n<li>Lange ventetider for ind- og uddata, for eksempel dataoverf\u00f8rsel over netv\u00e6rket eller l\u00e6sning fra disk.<\/li>\n<li>Lang parsing af data.<\/li>\n<li>Lange operationer, der kr\u00e6ver CPU.<\/li>\n<li>Kodeomr\u00e5der, der ikke er n\u00f8dvendige for at opn\u00e5 det endelige resultat og kan fjernes eller k\u00f8res forsinket.<\/li>\n<\/ul>\n<\/li>\n<li>At f\u00e5 en klar forst\u00e5else af i hvilken r\u00e6kkef\u00f8lge tingene kaldes, og hvad der sker, n\u00e5r en operation udf\u00f8res.<br \/>\n<img decoding=\"async\" alt=\"Sporing af tjenester, OpenTracing og Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/f22f14599568bff5573fe59eeeaea753.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nDet fremg\u00e5r klart, at for eksempel en anmodning kom til tjenesten WS -&gt; tjenesten WS fyldte data via tjenesten R -&gt; derefter sendte den en anmodning til tjenesten V -&gt; tjenesten V hentede mange data fra tjenesten R -&gt; gik til tjenesten P -&gt; tjenesten P gik igen til tjenesten R -&gt; tjenesten V ignorerede resultatet og gik til tjenesten J -&gt; og f\u00f8rst derefter returnerede svaret til tjenesten WS, mens den samtidig fortsatte med at beregne noget i baggrunden.<br \/>\nUden en s\u00e5dan trace eller detaljeret dokumentation for hele processen er det meget sv\u00e6rt at forst\u00e5, hvad der sker, ved f\u00f8rste \u00f8jekast p\u00e5 koden, og koden er desuden spredt ud over forskellige tjenester og skjult bag en masse biner og interfaces.\n<\/li>\n<li>Indsamling af oplysninger om udf\u00f8relsestr\u00e6et til efterf\u00f8lgende analyse. P\u00e5 hvert trin i udf\u00f8relsen kan der tilf\u00f8jes oplysninger til trace, som er tilg\u00e6ngelige p\u00e5 det p\u00e5g\u00e6ldende trin, og derefter unders\u00f8ges, hvilke inputdata der f\u00f8rte til et s\u00e5dant scenarie. For eksempel:\n<ul>\n<li>Bruger-ID<\/li>\n<li>Rettigheder<\/li>\n<li>Type af valgt metode<\/li>\n<li>Log eller udf\u00f8relsesfejl<\/li>\n<\/ul>\n<\/li>\n<li>Transformation of traces into a subset of metrics and subsequent analysis in the form of metrics.<\/li>\n<\/ol>\n<h3>What tracing can log. Span<\/h3>\n<p>In tracing, there is a concept of a span, which is analogous to a single log in the console. A span has:<\/p>\n<ul>\n<li>A name, usually the name of the method that was executed<\/li>\n<li>The name of the service where the span was generated<\/li>\n<li>A unique ID of its own<\/li>\n<li>Some meta information in the form of key\/value that was logged into it. For example, method parameters or whether the method ended with an error or not<\/li>\n<li>The start and end time of the execution of this span<\/li>\n<li>The ID of the parent span<\/li>\n<\/ul>\n<p>\nEach span is sent to the span collector for storage in a database for subsequent viewing as soon as it finishes execution. In the future, it is possible to build a tree of all spans connecting by parent ID. During analysis, it is possible to find, for example, all spans in a specific service that took more than a certain amount of time. Then, by going to a specific span, you can see the entire tree above and below that span.<\/p>\n<p><img decoding=\"async\" alt=\"Sporing af tjenester, OpenTracing og Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/9cc97f1278af60f0efd5e393cd183c5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Opentrace, Jaeger and how we implemented this for our projects<\/h3>\n<p>\nThere is a common standard <noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/docs\/overview\/\">Opentrace<\/a><\/noindex>, which describes how and what should be collected, without tying tracing to a specific implementation in any language. For example, in Java, all work with traces is done through the common Opentrace API, and underneath it can hide, for example, Jaeger or an empty default implementation that does nothing.<br \/>\nWe use <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/\">Jaeger<\/a><\/noindex> as the implementation of Opentrace. It consists of several components:<\/p>\n<p><img decoding=\"async\" alt=\"Sporing af tjenester, OpenTracing og 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 a local agent that usually runs on each machine and logs into it from services on a local default port. If no agent is present, traces from all services on this machine are usually disabled.<\/li>\n<li>Jaeger-collector \u2014 all agents send collected traces to it, and it places them in the selected database.<\/li>\n<li>The database \u2014 their preferred choice is Cassandra, but we use Elasticsearch. There are implementations for a couple of other databases and an in-memory implementation that doesn't save anything to disk.<\/li>\n<li>Jaeger-query \u2014 this service accesses the database and provides collected traces for analysis.<\/li>\n<li>Jaeger-ui \u2014 this is a web interface for searching and viewing traces, which accesses jaeger-query.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Sporing af tjenester, OpenTracing og Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/afc415cb5d4f19e7ba18394c2c1a9dd5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA separate component can be called the Opentrace Jaeger implementation for specific languages, through which spans are sent to the jaeger-agent.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">Integrating Jaeger in Java<\/a><\/noindex> det handler om at implementere gr\u00e6nsefladen io.opentracing.Tracer, hvorefter alle traces vil blive sendt til den rigtige agent gennem den.<\/p>\n<p><img decoding=\"async\" alt=\"Sporing af tjenester, OpenTracing og Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/5ce4bdfc06def7e4645bd58163e99dab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSamtidig kan komponenter i Spring tilsluttes <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-cloud\">opentracing-spring-cloud-starter<\/a><\/noindex> og implementeringen fra Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-jaeger\">opentracing-spring-jaeger-cloud-starter<\/a><\/noindex> som automatisk konfigurerer tracing for alt, hvad der g\u00e5r gennem disse komponenter, for eksempel HTTP-anmodninger i controllere, anmodninger til databasen via jdbc osv.<\/p>\n<h3>Logning af traces i Java<\/h3>\n<p>\nEt sted p\u00e5 det \u00f8verste niveau skal den f\u00f8rste Span oprettes; dette kan g\u00f8res automatisk, for eksempel af en Spring-kontroller ved modtagelse af en anmodning, eller manuelt hvis der ikke er en. Derefter overf\u00f8res den gennem Scope nedenfor. Hvis en metode nedenunder \u00f8nsker at tilf\u00f8je en Span, henter den den nuv\u00e6rende activeSpan fra Scope, opretter en ny Span og angiver, at dens for\u00e6lder er den ekstraherede activeSpan, og g\u00f8r den nye Span aktiv. Ved kald af eksterne tjenester videresendes den nuv\u00e6rende aktive Span til dem, og de tjenester opretter nye spans knyttet til denne span.<br \/>\nAlt arbejde udf\u00f8res gennem en instans af Tracer, som kan f\u00e5s gennem DI-mekanismen, eller GlobalTracer.get() som en global variabel, hvis DI-mekanismen ikke fungerer. Som standard, hvis tracer ikke er blevet initialiseret, returneres NoopTracer, som ikke g\u00f8r noget.<br \/>\nDerefter hentes den nuv\u00e6rende scope fra tracer via ScopeManager, en ny scope oprettes fra den nuv\u00e6rende med knytning til den nye span, og derefter lukkes den oprettede Scope, som lukker den oprettede span og returnerer den tidligere Scope til den aktive tilstand. Scope er knyttet til tr\u00e5den, s\u00e5 ved flertr\u00e5det programmering skal man huske at overf\u00f8re den aktive span til en anden tr\u00e5d for senere at aktivere Scope for den anden tr\u00e5d med knytning til denne 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        \/\/ G\u00f8r ting.\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            \/\/ TRIN 2 OVENFOR: genaktiver span i callback'et, ved at sende true til\n            \/\/ startActive(), hvis\/n\u00e5r span skal afsluttes.\n            try (Scope scope = tracer.scopeManager().activate(span, false)) {\n                ...\n            }\n        });\n    }\n}<\/code><\/pre>\n<p>Til multitr\u00e5det programmering er der ogs\u00e5 TracedExecutorService og lignende indpakninger, som automatisk videregiver den nuv\u00e6rende spand til tr\u00e5den, n\u00e5r asynkrone opgaver startes:<\/p>\n<pre><code class=\"java\">private ExecutorService executor = new TracedExecutorService(\n    Executors.newFixedThreadPool(10), GlobalTracer.get()\n);<\/code><\/pre>\n<p>Til eksterne http-anmodninger er der <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>Problemer, vi st\u00f8dte p\u00e5<\/h3>\n<p><\/p>\n<ul>\n<li>Beans og DI fungerer ikke altid, hvis tracer ikke bruges i en service eller komponent, s\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex> Tracer m\u00e5ske ikke fungerer, og det bliver n\u00f8dvendigt at bruge GlobalTracer.get().<\/li>\n<li>Annotationer virker ikke, hvis det ikke er en komponent eller service, eller hvis metodeopkaldet sker fra en nabometode i samme klasse. Man skal v\u00e6re forsigtig, kontrollere hvad der virker og bruge manuel oprettelse af trace, hvis @Traced ikke fungerer. Man kan ogs\u00e5 tilf\u00f8je en ekstra compiler til java-annotationer, s\u00e5 de b\u00f8r fungere overalt.<\/li>\n<li>I gamle spring og spring boot fungerer automatisk konfiguration af opentracing spring cloud ikke p\u00e5 grund af fejl i DI, s\u00e5 hvis man \u00f8nsker, at traces automatisk skal fungere i spring-komponenter, kan man g\u00f8re det efter m\u00f8nsteret med <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>I groovy fungerer try with resources ikke, man skal n\u00f8dvendigvis bruge try finally.<\/li>\n<li>Hver service skal have sit eget spring.application.name, under hvilket traces vil blive logget. Desuden et separat navn for produktion og test, s\u00e5 de ikke blandes sammen.<\/li>\n<li>Hvis man bruger GlobalTracer og tomcat, s\u00e5 har alle services, der k\u00f8res i denne tomcat, \u00e9n GlobalTracer, s\u00e5 de vil alle have det samme servicenavn.<\/li>\n<li>N\u00e5r man tilf\u00f8jer traces i en metode, skal man v\u00e6re sikker p\u00e5, at den ikke kaldes i en l\u00f8kke flere gange. Man skal tilf\u00f8je \u00e9n f\u00e6lles trace for alle opkald, der logger den samlede tid for behandlingen. Ellers vil der blive skabt en overfl\u00f8dig belastning.<\/li>\n<li>Engang i jaeger-ui lavede de for store anmodninger om et stort antal traces, og fordi de ikke ventede p\u00e5 svar, blev der lavet endnu en anmodning. I sidste ende begyndte jaeger-query at bruge meget hukommelse og bremse elastic. Et genstart af jaeger-query hjalp.<\/li>\n<\/ul>\n<h3>Sampling, lagring og visning af traces<\/h3>\n<p>\nDer er tre typer <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.9\/sampling\/\">traces sampling<\/a><\/noindex>:<\/p>\n<ol>\n<li>Const, der sender og gemmer alle traces.<\/li>\n<li>Probabilistic, der filtrerer traces med en given sandsynlighed.<\/li>\n<li>Ratelimiting, som begr\u00e6nser antallet af traces pr. sekund. Disse parametre kan konfigureres p\u00e5 klienten, p\u00e5 jaeger-agenten eller i samleren. I \u00f8jeblikket bruger vi i vores validator-stack const 1, da der ikke er mange anmodninger, men de tager lang tid. Hvis dette i fremtiden l\u00e6gger for meget pres p\u00e5 systemet, kan vi begr\u00e6nse det.<\/li>\n<\/ol>\n<p>\nHvis man bruger Cassandra, gemmer den som standard traces kun i to dage. Vi bruger <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger\/tree\/master\/plugin\/storage\/es\">elasticsearch<\/a><\/noindex> og traces gemmes for al tid og slettes ikke. Der oprettes et separat indeks for hver dag, for eksempel jaeger-service-2019-03-04. I fremtiden skal vi konfigurere automatisk oprydning af gamle traces.<\/p>\n<p>For at se traces, skal du:<\/p>\n<ul>\n<li>V\u00e6lg den service, du vil filtrere traces efter, for eksempel tomcat7-default for en service, der k\u00f8rer i Tomcat og ikke kan have et eget navn.<\/li>\n<li>V\u00e6lg derefter operation, tidsinterval og den minimale operationstid, for eksempel fra 10 sekunder, for kun at tage de lange udf\u00f8relser.<br \/>\n<img decoding=\"async\" alt=\"Sporing af tjenester, OpenTracing og Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/bc712d4aabfe9c2ae961d3b8f9396a42.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>G\u00e5 til en af tracesene og se, hvad der for\u00e5rsagede forsinkelsen.<br \/>\n<img decoding=\"async\" alt=\"Sporing af tjenester, OpenTracing og Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/16e9dd11903358f5498fe11034bbf848.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p>\nHvis en anmodnings-ID er kendt, kan man finde tracen ved hj\u00e6lp af denne ID gennem s\u00f8gning p\u00e5 tags, hvis denne ID logges i trace span.<\/p>\n<h3>Dokumentation<\/h3>\n<p><\/p>\n<ul>\n<li>Dokumentation for 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>Dokumentation for Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.10\/\">www.jaegertracing.io\/docs\/1.10<\/a><\/noindex><\/li>\n<li>Tilslutning af 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>Tilslutning af 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>Artikler<\/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 og Microservices i et rigtig projekt p\u00e5 PHP og 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> K\u00f8rsel af Jaeger Agent p\u00e5 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> How We Used Jaeger and Prometheus to Deliver Lightning-Fast User Queries \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, \u201cEn lille historie om en stor sejr: OpenTracing, AWS og Jaeger\u201d<\/li>\n<\/ul>\n<p>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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\udd47Tjenestetracering, OpenTracing og Jaeger | ProHoster","description":"I vores projekter bruger vi mikrotjenester.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/31014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=31014"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/31014\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/22990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=31014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=31014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=31014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}