{"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\/sl\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","title":{"rendered":"Sledenje storitvam, OpenTracing in Jaeger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Sledenje storitvam, OpenTracing in Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/045800f00c8da9702f62cf3de53df7b6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV na\u0161ih projektih uporabljamo mikrostoritveno arhitekturo. Ko pride do o\u017ejih grl pri zmogljivosti, je veliko \u010dasa porabljenega za spremljanje in analizo logov. Pri bele\u017eenju \u010dasovnih oznak posameznih operacij v log datoteko je obi\u010dajno te\u017eko razumeti, kaj je povzro\u010dilo klic teh operacij, slediti zaporedju dejanj ali \u010dasovnemu odklonu ene operacije glede na drugo v razli\u010dnih storitvah. <\/p>\n<p>Za zmanj\u0161anje ro\u010dnega dela smo se odlo\u010dili uporabiti eno izmed orodij za sledenje. O tem, kako in za kaj se lahko uporablja sledenje ter kako smo to po\u010deli mi, bo govora v tem \u010dlanku. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Katere te\u017eave lahko re\u0161imo s pomo\u010djo sledenja<\/h3>\n<p><\/p>\n<ol>\n<li>Najti o\u017eja grla v zmogljivosti tako znotraj ene storitve kot v celotnem drevesu izvajanja med vsemi sodelujo\u010dimi storitvami. Na primer:\n<ul>\n<li>Mnogi kratki zaporedni klici med storitvami, na primer, za geokodiranje ali za dostop do baze podatkov.<\/li>\n<li>Dolga \u010dakanja na vhodno-izhodne operacije, na primer, prenos podatkov preko omre\u017eja ali branje iz diska.<\/li>\n<li>Dolgo analiziranje podatkov.<\/li>\n<li>Dolge operacije, ki zahtevajo CPU.<\/li>\n<li>Odseki kode, ki niso potrebni za pridobitev kon\u010dnega rezultata in jih je mogo\u010de odstraniti ali pa jih zagnati odlo\u017eeno.<\/li>\n<\/ul>\n<\/li>\n<li>Jasno razumeti, v kak\u0161nem zaporedju se kaj kli\u010de in kaj se zgodi, ko se operacija izvaja.<br \/>\n<img decoding=\"async\" alt=\"Sledenje storitvam, OpenTracing in Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/f22f14599568bff5573fe59eeeaea753.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nVidimo, da je, na primer, zahteva pri\u0161la v storitev WS -&gt; storitev WS je dopolnila podatke preko storitve R -&gt; nato je poslala zahtevo v storitev V -&gt; storitev V je nalo\u017eila veliko podatkov iz storitve R -&gt; obiskala storitev P -&gt; storitev P je \u0161e enkrat obiskala storitev R -&gt; storitev V je ignorirala rezultat in \u0161la v storitev J -&gt; in \u0161ele nato vrnila odgovor v storitev WS, medtem pa \u0161e naprej v ozadju izra\u010dunava nekaj drugega.<br \/>\nBrez tak\u0161nega sledenja ali podrobne dokumentacije za celoten proces je zelo te\u017eko razumeti, kaj se dogaja, ko prvi\u010d pogledamo kodo, pa tudi koda je razmetana po razli\u010dnih storitvah in skrita za kupom binov in vmesnikov.\n<\/li>\n<li>Zbiranje informacij o drevesu izvajanja za nadaljnjo odlo\u017eeno analizo. V vsakem koraku izvajanja lahko v sleditev dodate informacije, ki so na voljo v tem koraku, in se nato razjasnite, kateri vhodni podatki so povzro\u010dili tak\u0161no situacijo. Na primer:\n<ul>\n<li>ID uporabnika<\/li>\n<li>Pravna pooblastila<\/li>\n<li>Vrsta izbrane metode<\/li>\n<li>Dnevnik ali napaka pri izvajanju<\/li>\n<\/ul>\n<\/li>\n<li>Pretvorba zapisnika u podskup metrika i daljnja analiza u obliku metrika.<\/li>\n<\/ol>\n<h3>\u0160to mo\u017ee zabilje\u017eiti pra\u0107enje. Span<\/h3>\n<p>U pra\u0107enju postoji pojam spana, \u0161to je analog jedan logu u konzoli. Span ima:<\/p>\n<ul>\n<li>Naziv, obi\u010dno naziv metode koja je izvr\u0161ena<\/li>\n<li>Naziv servisa u kojem je span generiran<\/li>\n<li>Vlastiti jedinstveni ID<\/li>\n<li>Neka meta informacija u obliku key\/value koja je zabilje\u017eena u njemu. Na primjer, parametri metode ili je li 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 za pohranu u bazu za kasnije pregledavanje \u010dim zavr\u0161i svoje izvr\u0161avanje. Mogu\u0107e je izgraditi stablo svih spanova povezuju\u0107i ih prema ID-u roditelja. Tijekom analize mo\u017ee se prona\u0107i, na primjer, svi spanovi u nekom servisu koji su trajali du\u017ee od odre\u0111enog vremena. Zatim, prelaskom na odre\u0111eni span, vidjeti cijelo stablo iznad i ispod tog spana.<\/p>\n<p><img decoding=\"async\" alt=\"Sledenje storitvam, OpenTracing in Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/9cc97f1278af60f0efd5e393cd183c5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Opentrace, Jaeger 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 povezuju\u0107i pra\u0107enje s odre\u0111enom implementacijom u bilo kojem jeziku. Na primjer, u Javi se sav rad sa tragovima obavlja putem zajedni\u010dkog API-ja Opentrace, a ispod njega mo\u017ee se skrivati, na primjer, Jaeger ili prazna defaultna implementacija koja ni\u0161ta ne radi.<br \/>\nKoristimo <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/\">Jaeger<\/a><\/noindex> kao implementaciju Opentrace. Sastoji se od nekoliko komponenti:<\/p>\n<p><img decoding=\"async\" alt=\"Sledenje storitvam, OpenTracing in 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 stoji na svakoj ma\u0161ini i u njega se logiraju servisi na lokalni defaultni port. Ako agenta nema, tada su svi tragovi svih servisa na toj ma\u0161ini obi\u010dno 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 preferiraju cassandra, ali mi koristimo elasticsearch, postoji implementacija jo\u0161 za nekoliko drugih baza podataka i in memory implementacija koja ni\u0161ta ne pohranjuje na disk<\/li>\n<li>Jaeger-query \u2014 to je servis koji pristupa bazi podataka i vra\u0107a ve\u0107 prikupljene tragove za analizu<\/li>\n<li>Jaeger-ui \u2014 to je web su\u010delje za pretra\u017eivanje i pregledavanje tragova, pristupa jaeger-query<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Sledenje storitvam, OpenTracing in Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/afc415cb5d4f19e7ba18394c2c1a9dd5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nOdre\u0111enom komponentom mo\u017ee se smatrati implementacija opentrace Jaeger za odre\u0111ene jezike, putem koje se spanovi \u0161alju u jaeger-agent.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">Povezivanje Jaegera u Javi<\/a><\/noindex> se zmanj\u0161uje na implementacijo vmesnika io.opentracing.Tracer, po katerem bodo vsi sledovi skozi njega oddani resni\u010dnemu agentu.<\/p>\n<p><img decoding=\"async\" alt=\"Sledenje storitvam, OpenTracing in Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/5ce4bdfc06def7e4645bd58163e99dab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPrav tako je mogo\u010de povezati komponente Springa <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-cloud\">opentracing-spring-cloud-starter<\/a><\/noindex> in implementacijo Jaegerja <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-jaeger\">opentracing-spring-jaeger-cloud-starter<\/a><\/noindex> ki bo samodejno konfigurirala sledenje vsega, kar poteka skozi te komponente, na primer http poizvedbe v kontrolerje, poizvedbe v bazo podatkov preko jdbc itd.<\/p>\n<h3>Logiranje sledov v Javi<\/h3>\n<p>\nNekje na najvi\u0161ji ravni mora biti ustvarjen prvi Span, to lahko izvede avtomatsko na primer kontroler Springa ob prejemu poizvedbe, ali ro\u010dno, \u010de tak ni na voljo. Nato se prenese skozi Scope ni\u017eje. \u010ce \u017eeli kak\u0161na metoda spodaj dodati Span, vzame iz Scope trenutni activeSpan, ustvari nov Span in pove, da je njegov nadrejeni prejeti activeSpan, in naredi nov Span aktiven. Pri klicanju zunanjih storitev jim posredujejo trenutni aktivni span, te storitve pa ustvarijo nove spane, ki so povezani s tem spanom.<br \/>\nVsa dela potekajo prek instance Tracer, pridobiti ga je mogo\u010de preko mehanizma DI ali GlobalTracer.get() kot globalno spremenljivko, \u010de mehanizem DI ne deluje. Po privzetku, \u010de tracer ni bil inicializiran, se vrne NoopTracer, ki ni\u010d ne po\u010dne.<br \/>\nNato se iz tracerja preko ScopeManagerja pridobi trenutni scope, ustvari se nov scope iz trenutnega s povezovanjem novega spana, v nadaljevanju pa se zapre ustvarjeni Scope, ki zapre ustvarjeni span in vrne prej\u0161nji Scope v aktivno stanje. Scope je povezan s tokom, zato pri ve\u010dnitnem programiranju ne smemo pozabiti prenesti aktivnega spana v drug tok, za nadaljnjo aktivacijo Scope drugega toka s povezovanjem k temu spanu.<\/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        \/\/ Naredite 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 ZGORNJE: ponastavite Span v povratnem klicu, ko bo\n            \/\/ startActive() moralo dokon\u010dati.\n            try (Scope scope = tracer.scopeManager().activate(span, false)) {\n                ...\n            }\n        });\n    }\n}<\/code><\/pre>\n<p>Za ve\u010dnoto\u010dnega programiranja obstajajo TracedExecutorService in podobne obloge, ki samodejno prenesejo trenutni span v nit pri zagonu asinhronih nalog:<\/p>\n<pre><code class=\"java\">private ExecutorService executor = new TracedExecutorService(\n    Executors.newFixedThreadPool(10), GlobalTracer.get()\n);<\/code><\/pre>\n<p>Za zunanje http poizvedbe obstaja <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 katerimi smo se sre\u010dali<\/h3>\n<p><\/p>\n<ul>\n<li>Bini in DI ne delujejo vedno, \u010de se tracer ne uporablja v storitvi ali komponenti, zato <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex> Tracer morda ne deluje in morate uporabiti GlobalTracer.get().<\/li>\n<li>Annotations ne delujejo, \u010de to ni komponenta ali storitev, ali \u010de se klic metode zgodi iz sosednje metode istega razreda. Treba je biti previden, preveriti, kaj deluje, in uporabljati ro\u010dno ustvarjanje trace, \u010de @Traced ne deluje. Prav tako lahko dodate dodatni prevajalnik za java anotacije, takrat bi morale delovati povsod.<\/li>\n<li>V starih spring in spring boot ne deluje samodejna konfiguracija opentracing spring cloud zaradi napak v DI, zato, \u010de \u017eelite, da samodejno delujejo trace v komponentah springa, lahko to storite po analogiji z <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>V groovy ne deluje try with resources, nujno je potrebno uporabiti try finally.<\/li>\n<li>Vsaka storitev mora imeti svoj spring.application.name, pod katerim bodo bele\u017eeni trace. Pri \u010demer je lo\u010deno ime za produkcijo in testiranje, da se ne me\u0161ata skupaj.<\/li>\n<li>\u010ce uporabite GlobalTracer in tomcat, potem imajo vse storitve, zagnane v tem tomcat, en GlobalTracer, zato bo na vseh ime storitve enako.<\/li>\n<li>Pri dodajanju trace v metodo morate biti prepri\u010dani, da se ne kli\u010de v zanki mnogokrat. Treba je dodati en skupni trace za vse klice, ki bo bele\u017eil skupni \u010das delovanja. V nasprotnem primeru bo ustvarjala odve\u010dno obremenitev.<\/li>\n<li>Enkrat smo v jaeger-ui opravili prevelike poizvedbe za veliko \u0161tevilo trace in ker nismo \u010dakali na odgovor, smo jih izvedli \u0161e enkrat. Na koncu je jaeger-query za\u010del porabiti veliko pomnilnika in upo\u010dasnil elastic. Pomagalo je z reinicializacijo jaeger-query.<\/li>\n<\/ul>\n<h3>Vzorec, shranjevanje in ogled trace<\/h3>\n<p>\nObstajajo trije tipi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.9\/sampling\/\">vzorcev trace<\/a><\/noindex>:<\/p>\n<ol>\n<li>Const, ki po\u0161ilja in shranjuje vse trace.<\/li>\n<li>Probabilistic, ki filtrira trace z dolo\u010deno verjetnostjo.<\/li>\n<li>Ratelimiting, ki omejuje \u0161tevilo sledi na sekundo. Te parametre je mogo\u010de nastaviti na odjemalcu, ali na jaeger-agentu ali v kolektorju. Trenutno imamo v kupcih uporabljeno const 1, saj ni veliko zahtevkov, vendar ti trajajo dolgo. V prihodnosti, \u010de bo to preobremenilo sistem, lahko omejimo.<\/li>\n<\/ol>\n<p>\n\u010ce uporabljate Cassandro, ta privzeto hrani sledi le za dva dni. Pri nas se uporablja <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger\/tree\/master\/plugin\/storage\/es\">elasticsearch<\/a><\/noindex> in sledi se hranijo za ves \u010das in se ne bri\u0161ejo. Za vsak dan se ustvari lo\u010den indeks, na primer jaeger-service-2019-03-04. V prihodnosti bo treba nastaviti avtomatsko \u010di\u0161\u010denje starih sledov.<\/p>\n<p>Da bi si ogledali sledi, morate:<\/p>\n<ul>\n<li>Izbrati storitev, po kateri \u017eelite filtrirati sledi, na primer tomcat7-default za storitev, ki te\u010de v Tomcatu in ne more imeti svojega imena.<\/li>\n<li>Nato izberite operacijo, \u010dasovno obdobje in minimalni \u010das operacije, na primer od 10 sekund, da vzamete le dolge izvajanja.<br \/>\n<img decoding=\"async\" alt=\"Sledenje storitvam, OpenTracing in Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/bc712d4aabfe9c2ae961d3b8f9396a42.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Pojdite v eno od sledi in poglejte, kaj je tam povzro\u010dalo te\u017eave.<br \/>\n<img decoding=\"async\" alt=\"Sledenje storitvam, OpenTracing in Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/16e9dd11903358f5498fe11034bbf848.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p>\nPrav tako, \u010de je poznan kak\u0161en id zahtevka, lahko najdete sled po tem id-ju preko iskanja po oznakah, \u010de je ta id bele\u017een v sledi.<\/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>Povezava 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>Povezava 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>\u010clanki<\/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 in mikroservisi v realnem projektu na PHP in 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> Za\u017eeni Jaeger Agent na golih stre\u017enikih<\/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 uporabili Jaeger in Prometheus za zagotavljanje izjemno hitrih uporabni\u0161kih poizvedb \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, \"Majhna zgodba o veliki zmagi: OpenTracing, AWS in Jaeger\"<\/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\/sl\/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=\"sl_SI\" \/>\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\/sl\/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\udd47Sledenje storitvam, OpenTracing in Jaeger | ProHoster","description":"V na\u0161ih projektih uporabljamo mikroservisno.","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/31014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=31014"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/31014\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media\/22990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=31014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=31014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=31014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}