{"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\/hr\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","title":{"rendered":"Pra\u0107enje usluga, OpenTracing i Jaeger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Pra\u0107enje usluga, OpenTracing i Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/045800f00c8da9702f62cf3de53df7b6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nU na\u0161im projektima koristimo mikroservisnu arhitekturu. Kada do\u0111e do uskih grla u performansama, obi\u010dno se tro\u0161i puno vremena na pra\u0107enje i analizu logova. Kada se bilje\u017ee vremenski okviri pojedina\u010dnih operacija u log datoteku, obi\u010dno je te\u0161ko shvatiti \u0161to je uzrokovalo poziv tih operacija, pratiti redoslijed radnji ili vremensko pomjeranje jedne operacije u odnosu na drugu u razli\u010ditim servisima. <\/p>\n<p>Kako bismo smanjili ru\u010dni rad, odlu\u010dili smo iskoristiti jedan od alata za pra\u0107enje. O tome kako i za \u0161to se mo\u017ee koristiti pra\u0107enje i kako smo to mi radili, bit \u0107e govora u ovom \u010dlanku. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Koje se probleme mo\u017ee rije\u0161iti pomo\u0107u pra\u0107enja<\/h3>\n<p><\/p>\n<ol>\n<li>Prona\u0107i uska grla u performansama kako unutar jednog servisa, tako i u cijelom stablu izvr\u0161avanja izme\u0111u svih uklju\u010denih servisa. Na primjer:\n<ul>\n<li>Mnogo kratkih uzastopnih poziva izme\u0111u servisa, primjerice, za geokodiranje ili za bazu podataka.<\/li>\n<li>Dugotrajna \u010dekanja ulaza i izlaza, kao \u0161to su prijenos podataka preko mre\u017ee ili \u010ditanje s diska.<\/li>\n<li>Dugo parsiranje podataka.<\/li>\n<li>Duge operacije koje zahtijevaju CPU.<\/li>\n<li>Dijelovi koda koji nisu potrebni za dobivanje kona\u010dnog rezultata i mogu se ukloniti ili pokrenuti odlo\u017eeno.<\/li>\n<\/ul>\n<\/li>\n<li>Jasno razumjeti u kojem redoslijedu se \u0161to poziva i \u0161to se doga\u0111a kada se izvr\u0161ava operacija.<br \/>\n<img decoding=\"async\" alt=\"Pra\u0107enje usluga, OpenTracing i Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/f22f14599568bff5573fe59eeeaea753.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVidljivo je da je, primjerice, Upit stigao u servis WS -&gt; servis WS je dopunio podatke putem servisa R -&gt; zatim je poslao upit u servis V -&gt; servis V je preuzeo puno podataka iz servisa R -&gt; oti\u0161ao je u servis P -&gt; servis P je jo\u0161 jednom oti\u0161ao u servis R -&gt; servis V je ignorirao rezultat i oti\u0161ao u servis J -&gt; i tek tada vratio odgovor u servis WS, pri \u010demu je nastavio u pozadini izra\u010dunavati ne\u0161to drugo.<br \/>\nBez takvog pra\u0107enja ili detaljne dokumentacije o cijelom procesu vrlo je te\u0161ko shvatiti \u0161to se doga\u0111a kada prvi put pogledate kod, a kod je tako\u0111er raspr\u0161en po razli\u010ditim servisima i skriven iza mno\u0161tva binova i su\u010delja.\n<\/li>\n<li>Prikupljanje informacija o stablu izvr\u0161avanja za kasniju odgo\u0111enu analizu. U svakoj fazi izvr\u0161avanja u pra\u0107enje se mo\u017ee dodati informacija koja je dostupna u toj fazi, a zatim istra\u017eiti koje su ulazne informacije dovele do takvog scenarija. Na primjer:\n<ul>\n<li>ID korisnika<\/li>\n<li>Prava<\/li>\n<li>Tip odabrane metode<\/li>\n<li>Log ili gre\u0161ka izvr\u0161avanja<\/li>\n<\/ul>\n<\/li>\n<li>Pretvaranje tragova u podskup metrika i daljnja analiza u obliku metrika.<\/li>\n<\/ol>\n<h3>\u0160to mo\u017ee bilje\u017eiti trag. Span<\/h3>\n<p>U tragovima postoji pojam span, koji je ekvivalent jednoj zabilje\u017eenoj stavci u konzoli. Span ima:<\/p>\n<ul>\n<li>Naziv, obi\u010dno je to naziv metode koja se izvodila<\/li>\n<li>Naziv servisa u kojem je generiran span<\/li>\n<li>Vlastiti jedinstveni ID<\/li>\n<li>Neka metainformacija u obliku key\/value koja je zabilje\u017eena. Na primjer, parametri metode ili je metoda zavr\u0161ila gre\u0161kom ili ne<\/li>\n<li>Vrijeme po\u010detka i zavr\u0161etka izvr\u0161avanja ovog spana<\/li>\n<li>ID roditeljskog spana<\/li>\n<\/ul>\n<p>\nSvaki span se \u0161alje u kolektor spanova radi pohrane u bazu za kasniji pregled \u010dim zavr\u0161i svoje izvr\u0161avanje. Kasnije, mo\u017ee se izgraditi stablo svih spanova povezuju\u0107i ih po id roditelja. Tijekom analize mo\u017ee se prona\u0107i, na primjer, svi spanovi u nekom servisu koji su trajali du\u017ee od nekog vremena. Zatim, odlaskom na odre\u0111eni span, mo\u017ee se vidjeti cijelo stablo iznad i ispod tog spana.<\/p>\n<p><img decoding=\"async\" alt=\"Pra\u0107enje usluga, OpenTracing i Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/9cc97f1278af60f0efd5e393cd183c5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Opentrace, Jagger i kako smo to implementirali za svoje projekte<\/h3>\n<p>\nPostoji op\u0107i standard <noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/docs\/overview\/\">Opentrace<\/a><\/noindex>, koji opisuje kako i \u0161to treba prikupljati, ne vezuju\u0107i tragove za konkretnu implementaciju na nekom jeziku. Na primjer, u Javi se sav rad s tragovima obavlja putem zajedni\u010dkog API-ja Opentrace, a ispod njega mo\u017ee se skrivati, primjerice, Jaeger ili prazna zadana implementacija koja ne radi ni\u0161ta.<br \/>\nKod nas se koristi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/\">Jaeger<\/a><\/noindex> kao implementacija Opentrace. Sastoji se od nekoliko komponenti:<\/p>\n<p><img decoding=\"async\" alt=\"Pra\u0107enje usluga, OpenTracing i 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 lokalni agent koji obi\u010dno radi na svakoj ma\u0161ini i u njega zabilje\u017eavaju servisi na lokalni zadani port. Ako agenta nema, tragovi svih servisa na toj ma\u0161ini obi\u010dno su isklju\u010deni.<\/li>\n<li>Jaeger-collector \u2014 u njega svi agenti \u0161alju prikupljene tragove, a on ih pohranjuje u odabranu bazu podataka.<\/li>\n<li>Baza podataka \u2014 njihova preferirana je Cassandra, ali kod nas se koristi Elasticsearch, postoji implementacija i za nekoliko drugih baza i in-memory implementacija koja ne pohranjuje ni\u0161ta na disk.<\/li>\n<li>Jaeger-query \u2014 to je servis koji pristupa bazi podataka i isporu\u010duje ve\u0107 prikupljene tragove za analizu.<\/li>\n<li>Jaeger-ui \u2014 web su\u010delje za pretra\u017eivanje i pregled tragova, koje se povezuje s jaeger-query.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Pra\u0107enje usluga, OpenTracing i Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/afc415cb5d4f19e7ba18394c2c1a9dd5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOdvojena komponenta mo\u017ee se smatrati implementacijom opentrace jaeger za konkretne jezike, kroz koju se spanovi \u0161alju u jaeger-agent.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">Povezivanje Jaggera u Javi<\/a><\/noindex> sve se svodi na implementaciju su\u010delja io.opentracing.Tracer, nakon \u010dega \u0107e svi tragovi prolaziti kroz njega do pravog agenta.<\/p>\n<p><img decoding=\"async\" alt=\"Pra\u0107enje usluga, OpenTracing i Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/5ce4bdfc06def7e4645bd58163e99dab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTako\u0111er se za Spring komponente mo\u017ee povezati <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-cloud\">opentracing-spring-cloud-starter<\/a><\/noindex> i implementacija od Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-jaeger\">opentracing-spring-jaeger-cloud-starter<\/a><\/noindex> koja automatski konfigurira pra\u0107enje za sve \u0161to prolazi kroz ove komponente, poput http zahtjeva u kontrolere, zahtjeva prema bazi podataka putem jdbc itd.<\/p>\n<h3>Zapisivanje tragova u Javi<\/h3>\n<p>\nNegdje na najvi\u0161oj razini treba biti stvoren prvi Span, \u0161to se mo\u017ee u\u010diniti automatski, primjerice, kontrolerom Springa prilikom primanja zahtjeva, ili ru\u010dno ako takvog nema. Zatim se proslje\u0111uje kroz Scope ni\u017ee. Ako neki metod \u017eeli dodati Span, uzima iz Scope trenutni activeSpan, stvara novi Span i postavlja da mu je roditelj trenutni activeSpan, te \u010dini novi Span aktivnim. Prilikom pozivanja vanjskih servisa, trenutni aktivni span se proslje\u0111uje njima, a ti servisi kreiraju nove spane povezane s tim spanom.<br \/>\nSav rad se odvija kroz instancu Tracer, koju mo\u017eete dobiti putem mehanizma DI, ili GlobalTracer.get() kao globalnu varijablu, ako mehanizam DI ne radi. Ako tracer nije inicijaliziran, prema zadanim postavkama vratit \u0107e se NoopTracer koji ne radi ni\u0161ta.<br \/>\nNakon toga se iz tracer-a preko ScopeManager-a dobiva trenutni scope, stvara se novi scope od trenutnog s povezanim novim spanom, a potom se zatvara stvoreni Scope, koji zatvara stvoreni span i vra\u0107a prethodni Scope u aktivno stanje. Scope je vezan uz nit, stoga kod vi\u0161edretvenog programiranja treba imati na umu da se aktivni span mora prenositi u drugu nit, radi daljnje aktivacije Scope-a druge niti povezano s tim spanom.<\/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        \/\/ Radite stvari.\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            \/\/ KORAK 2 IZGORE: ponovo aktivirajte Span u povratnom pozivu, proslijedite true da\n            \/\/ startActive() ako\/kada se Span treba zavr\u0161iti.\n            try (Scope scope = tracer.scopeManager().activate(span, false)) {\n                ...\n            }\n        });\n    }\n}<\/code><\/pre>\n<p>Za vi\u0161ekratno programiranje postoje TracedExecutorService i sli\u010dni omota\u010di koji automatski proslje\u0111uju trenutni span u niti prilikom pokretanja asinkronih zadataka:<\/p>\n<pre><code class=\"java\">private ExecutorService executor = new TracedExecutorService(\n    Executors.newFixedThreadPool(10), GlobalTracer.get()\n);<\/code><\/pre>\n<p>Za vanjske http zahtjeve postoji <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>Problemi s kojima smo se susreli<\/h3>\n<p><\/p>\n<ul>\n<li>Bini i DI ne rade uvijek ako se tracer ne koristi u servisu ili komponenti, tada <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex> Tracer mo\u017eda ne\u0107e raditi i bit \u0107e potrebno koristiti GlobalTracer.get().<\/li>\n<li>Anotacije ne rade ako to nije komponenta ili servis, ili ako se poziv metode doga\u0111a iz susjedne metode iste klase. Treba biti oprezan, provjeriti \u0161to radi, i koristiti ru\u010dno stvaranje tra\u010dnica ako @Traced ne funkcioni\u0161e. Tako\u0111er se mo\u017ee priklju\u010diti dodatni kompajler za java anotacije, onda bi trebali raditi svugdje.<\/li>\n<li>U starim spring i spring boot verzijama automatska konfiguracija opentracing spring clouda ne radi zbog bugova u DI, tako da ako \u017eelite da automatski rade tra\u010dnice u komponentama springa mo\u017eete napraviti po analogiji sa <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>U groovyju ne radi try with resources, mora se obavezno koristiti try finally.<\/li>\n<li>Za svaki servis treba navesti svoj spring.application.name pod kojim \u0107e se logirati tra\u010dnice. Osim toga, treba imati odvojeni naziv za produkciju i testiranje, kako se ne bi mije\u0161ali.<\/li>\n<li>Ako se koristi GlobalTracer i tomcat, svi servisi pokrenuti u tom tomcatu imaju jedan GlobalTracer, stoga \u0107e imati isto ime servisa.<\/li>\n<li>Pri dodavanju tra\u010dnica u metodu, treba biti siguran da se ne poziva u petlji vi\u0161e puta. Treba dodati jedan zajedni\u010dki tra\u010d za sve pozive, koji \u0107e zabilje\u017eiti ukupno vrijeme trajanja. Ina\u010de \u0107e do\u0107i do prekomjernog optere\u0107enja.<\/li>\n<li>Jednom smo u jaeger-ui napravili prevelike zahtjeve za veliku koli\u010dinu tra\u010dnica i budu\u0107i da nismo \u010dekali odgovor, ponovno smo to u\u010dinili. Kao rezultat, jaeger-query je po\u010deo tro\u0161iti puno memorije i usporavao elasti\u010dan sustav. Pomoglo je ponovno pokretanje jaeger-query-a.<\/li>\n<\/ul>\n<h3>Uzorak, pohrana i pregled tra\u010dnica<\/h3>\n<p>\nPostoje tri tipa <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.9\/sampling\/\">uzorkovanja tra\u010dnica<\/a><\/noindex>:<\/p>\n<ol>\n<li>Const koji \u0161alje i pohranjuje sve tra\u010dnice.<\/li>\n<li>Probabilisti\u010dki koji filtrira tra\u010dnice s nekom zadatom vjerojatno\u0161\u0107u.<\/li>\n<li>Limitiranje brzine koje ograni\u010dava broj tragova u sekundi. Ove postavke mogu se konfigurirati na klijentu, ili na jaeger-agentu ili u kolektoru. Trenutno u na\u0161em stogu validatora koristimo const 1, jer nema mnogo zahtjeva, ali oduzimaju du\u017ee vrijeme. U budu\u0107nosti, ako ovo po\u010dne prekomjerno optere\u0107ivati sustav, mo\u017eemo postaviti ograni\u010denje.<\/li>\n<\/ol>\n<p>\nAko koristite Cassandru, po defaultu ona \u010duva tragove samo dva dana. Mi koristimo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger\/tree\/master\/plugin\/storage\/es\">elasticsearch<\/a><\/noindex> i tragovi se \u010duvaju zauvijek i ne bri\u0161u se. Za svaki dan kreira se jedan indeks, na primjer jaeger-service-2019-03-04. Kasnije je potrebno postaviti automatsko \u010di\u0161\u0107enje starih tragova.<\/p>\n<p>Da biste vidjeli tragove, potrebno je:<\/p>\n<ul>\n<li>Odabrati servis prema kojem \u017eelite filtrirati tragove, na primjer tomcat7-default za servis koji je pokrenut u Tomcat-u i ne mo\u017ee imati svoje ime.<\/li>\n<li>Zatim odabrati operaciju, vremenski okvir i minimalno trajanje operacije, na primjer od 10 sekundi, kako bismo uzeli samo du\u017ea izvr\u0161enja.<br \/>\n<img decoding=\"async\" alt=\"Pra\u0107enje usluga, OpenTracing i Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/bc712d4aabfe9c2ae961d3b8f9396a42.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Pre\u0107i u jedan od tragova i provjeriti \u0161to je izazvalo usporavanje.<br \/>\n<img decoding=\"async\" alt=\"Pra\u0107enje usluga, OpenTracing i Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/16e9dd11903358f5498fe11034bbf848.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p>\nTako\u0111er, ako je poznat neki id zahtjeva, mo\u017ee se prona\u0107i trag prema tom id-u putem pretra\u017eivanja prema oznakama, ako je taj id evidentiran u span trag.<\/p>\n<h3>Dokumentacija<\/h3>\n<p><\/p>\n<ul>\n<li>Dokumentacija 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>Dokumentacija jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.10\/\">www.jaegertracing.io\/docs\/1.10<\/a><\/noindex><\/li>\n<li>Povezivanje 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>Povezivanje 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>\u010clanci<\/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 i mikroservisi u pravom projektu na PHP-u i Golangu<\/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> Pokretanje Jaeger Agenata na 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> Kako smo koristili Jaeger i Prometheus za isporuku ultra brzih korisni\u010dkih upita \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, \u201cMala pri\u010da o velikoj pobjedi: OpenTracing, AWS i Jaeger\u201d<\/li>\n<\/ul>\n<p>Izvor: <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.4 - 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\/hr\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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\udd47Trazivanje servisa, OpenTracing i Jaeger | ProHoster","description":"U na\u0161im projektima koristimo mikroservisnu arhitekturu.","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/31014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=31014"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/31014\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/22990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=31014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=31014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=31014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}