{"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\/ro\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","title":{"rendered":"Trasabilitatea serviciilor, OpenTracing \u0219i Jaeger.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Trasabilitatea serviciilor, OpenTracing \u0219i Jaeger.\" src=\"\/wp-content\/uploads\/2019\/04\/045800f00c8da9702f62cf3de53df7b6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen proiectele noastre folosim arhitectura de microservicii. Atunci c\u00e2nd apar puncte slabe \u00een performan\u021b\u0103, se pierde destul de mult timp cu monitorizarea \u0219i analiza logurilor. C\u00e2nd log\u0103m timpii opera\u021biunilor individuale \u00een fi\u0219ierul de log, de obicei este dificil s\u0103 \u00een\u021belegem ce a condus la apelarea acestor opera\u021biuni, s\u0103 urm\u0103rim secven\u021ba de ac\u021biuni sau s\u0103 observ\u0103m decalajul temporal al unei opera\u021biuni fa\u021b\u0103 de alta \u00een diferite servicii. <\/p>\n<p>Pentru a minimiza munca manual\u0103, am decis s\u0103 folosim unul dintre instrumentele de trasare. Despre cum \u0219i pentru ce se poate folosi trasarea \u0219i cum am procedat noi, va fi vorba \u00een acest articol. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Ce probleme pot fi rezolvate cu ajutorul tras\u0103rii<\/h3>\n<p><\/p>\n<ol>\n<li>Identificarea punctelor slabe \u00een performan\u021b\u0103, at\u00e2t \u00een cadrul unui singur serviciu, c\u00e2t \u0219i \u00een \u00eentregul arbore de execu\u021bie \u00eentre toate serviciile implicate. De exemplu:\n<ul>\n<li>Multitudinea de apeluri scurte \u0219i secven\u021biale \u00eentre servicii, de exemplu, pentru geocodare sau c\u0103tre baza de date.<\/li>\n<li>A\u0219tept\u0103ri lungi \u00een I\/O, de exemplu, transferul de date prin re\u021bea sau citirea de pe disc.<\/li>\n<li>Parseuri lungi de date.<\/li>\n<li>Opera\u021biuni lungi care necesit\u0103 CPU.<\/li>\n<li>Segmente de cod care nu sunt necesare pentru ob\u021binerea rezultatului final \u0219i pot fi eliminate sau executate diferit.<\/li>\n<\/ul>\n<\/li>\n<li>A \u00een\u021belege clar \u00een ce ordine sunt apelate opera\u021biunile \u0219i ce se \u00eent\u00e2mpl\u0103 c\u00e2nd se execut\u0103 o opera\u021biune.<br \/>\n<img decoding=\"async\" alt=\"Trasabilitatea serviciilor, OpenTracing \u0219i Jaeger.\" src=\"\/wp-content\/uploads\/2019\/04\/f22f14599568bff5573fe59eeeaea753.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSe poate observa c\u0103, de exemplu, cererea a ajuns la serviciul WS -&gt; serviciul WS a completat datele prin serviciul R -&gt; apoi a trimis cererea c\u0103tre serviciul V -&gt; serviciul V a \u00eenc\u0103rcat multe date din serviciul R -&gt; a accesat serviciul P -&gt; serviciul P a accesat din nou serviciul R -&gt; serviciul V a ignorat rezultatul \u0219i a solicitat serviciul J -&gt; \u0219i abia apoi a returnat r\u0103spunsul serviciului WS, continu\u00e2nd \u00een paralel s\u0103 calculeze ceva.<br \/>\nF\u0103r\u0103 o astfel de trasare sau o documenta\u021bie detaliat\u0103 a \u00eentregului proces, este foarte greu s\u0103 \u00een\u021belegi ce se \u00eent\u00e2mpl\u0103, mai ales la prima vizionare a codului, care este dispersat pe diverse servicii \u0219i ascuns \u00een spatele multor bean-uri \u0219i interfe\u021be.\n<\/li>\n<li>Colectarea informa\u021biilor despre arborele de execu\u021bie pentru o analiz\u0103 ulterioar\u0103 am\u00e2nat\u0103. La fiecare etap\u0103 de execu\u021bie \u00een trasare se pot ad\u0103uga informa\u021bii care sunt disponibile \u00een acel moment, pentru a analiza ulterior ce date de intrare au condus la un astfel de scenariu. De exemplu:\n<ul>\n<li>ID-ul utilizatorului<\/li>\n<li>Drepturile<\/li>\n<li>Tipul metodei selectate<\/li>\n<li>Log sau eroare de execu\u021bie<\/li>\n<\/ul>\n<\/li>\n<li>Transformarea traselor \u00eentr-un subset de metrici \u0219i analiza ulterioar\u0103 \u00een form\u0103 de metrici.<\/li>\n<\/ol>\n<h3>Ce poate loga trasarea. Span<\/h3>\n<p>\u00cen trasare exist\u0103 no\u021biunea de span, care este un echivalent al unui log, \u00een consol\u0103. Un span are:<\/p>\n<ul>\n<li>Un nume, de obicei denumirea metodei care a fost executat\u0103<\/li>\n<li>Numele serviciului \u00een care a fost generat span-ul<\/li>\n<li>Un ID unic propriu<\/li>\n<li>Informa\u021bii meta sub form\u0103 de key\/value, pe care le-am logat \u00een el. De exemplu, parametrii metodei sau dac\u0103 metoda a terminat cu o eroare sau nu<\/li>\n<li>Timpul de \u00eenceput \u0219i sf\u00e2r\u0219it al execu\u021biei acestui span<\/li>\n<li>ID-ul span-ului p\u0103rinte<\/li>\n<\/ul>\n<p>\nFiecare span este trimis la collector-ul de span-uri pentru a fi salvat \u00een baz\u0103 pentru vizualizare ulterioar\u0103 imediat ce \u0219i-a terminat execu\u021bia. Ulterior, se poate construi un arbore al tuturor span-urilor conect\u00e2ndu-le dup\u0103 id-ul p\u0103rintelui. La analiz\u0103, se pot g\u0103si, de exemplu, toate span-urile dintr-un anumit serviciu care au durat mai mult de un anumit timp. Apoi, trec\u00e2nd la un span specific, se poate vedea tot arborele deasupra \u0219i dedesubtul acestui span.<\/p>\n<p><img decoding=\"async\" alt=\"Trasabilitatea serviciilor, OpenTracing \u0219i Jaeger.\" src=\"\/wp-content\/uploads\/2019\/04\/9cc97f1278af60f0efd5e393cd183c5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Opentrace, Jaeger \u0219i cum am implementat asta pentru proiectele noastre<\/h3>\n<p>\nExist\u0103 un standard comun <noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/docs\/overview\/\">Opentrace<\/a><\/noindex>, care descrie cum \u0219i ce trebuie colectat, f\u0103r\u0103 a lega trasarea de o anumit\u0103 implementare \u00eentr-un limbaj specific. De exemplu, \u00een Java, toat\u0103 activitatea cu tras\u0103rile este realizat\u0103 printr-un API comun Opentrace, iar sub acesta poate fi ascuns, de exemplu, Jaeger sau o implementare implicit\u0103 goal\u0103 care nu face nimic.<br \/>\nNoi folosim <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/\">Jaeger<\/a><\/noindex> ca implementare a Opentrace. Acesta const\u0103 din mai multe componente:<\/p>\n<p><img decoding=\"async\" alt=\"Trasabilitatea serviciilor, OpenTracing \u0219i Jaeger.\" src=\"\/wp-content\/uploads\/2019\/04\/1fd4ae8563569271b067861c81101d71.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Jaeger-agent \u2014 un agent local, care, de obicei, se afl\u0103 pe fiecare ma\u0219in\u0103 \u0219i \u00een care logheaz\u0103 serviciile pe un port implicit local. Dac\u0103 agentul nu este disponibil, tras\u0103rile tuturor serviciilor de pe aceast\u0103 ma\u0219in\u0103 sunt, de obicei, dezactivate.<\/li>\n<li>Jaeger-collector \u2014 \u00een care to\u021bi agen\u021bii trimit tras\u0103rile colectate, iar acesta le stocheaz\u0103 \u00een baza de date aleas\u0103.<\/li>\n<li>Baza de date \u2014 preferata lor este Cassandra, dar noi folosim Elasticsearch, exist\u0103 implement\u0103ri \u0219i pentru c\u00e2teva alte baze de date \u0219i o implementare \u00een memorie care nu salveaz\u0103 nimic pe disc.<\/li>\n<li>Jaeger-query \u2014 este un serviciu care acceseaz\u0103 baza de date \u0219i returneaz\u0103 deja tras\u0103rile colectate pentru analiz\u0103.<\/li>\n<li>Jaeger-ui \u2014 este o interfa\u021b\u0103 web pentru c\u0103utarea \u0219i vizualizarea tras\u0103rilor, care acceseaz\u0103 jaeger-query.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Trasabilitatea serviciilor, OpenTracing \u0219i Jaeger.\" src=\"\/wp-content\/uploads\/2019\/04\/afc415cb5d4f19e7ba18394c2c1a9dd5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn component separat \u00eel reprezint\u0103 implementarea opentrace jaeger pentru limbaje specifice, prin care span-urile sunt trimise la jaeger-agent.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">Conectarea Jaeger \u00een Java<\/a><\/noindex> se reduce la implementarea interfe\u021bei io.opentracing.Tracer, dup\u0103 care toate traseele vor fi trimise prin intermediul s\u0103u c\u0103tre agentul real.<\/p>\n<p><img decoding=\"async\" alt=\"Trasabilitatea serviciilor, OpenTracing \u0219i Jaeger.\" src=\"\/wp-content\/uploads\/2019\/04\/5ce4bdfc06def7e4645bd58163e99dab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe asemenea, pentru componentele Spring se poate conecta <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-cloud\">opentracing-spring-cloud-starter<\/a><\/noindex> \u0219i implementarea de la Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-jaeger\">opentracing-spring-jaeger-cloud-starter<\/a><\/noindex> care va configura automat trasarea pentru tot ce trece prin aceste componente, de exemplu, cererile HTTP \u00een controlere, interog\u0103rile c\u0103tre baza de date prin jdbc etc.<\/p>\n<h3>Logarea traseelor \u00een Java<\/h3>\n<p>\nLa un nivel superior trebuie creat primul Span, acesta poate fi realizat automat, de exemplu, de un controler Spring la primirea unei cereri, sau manual dac\u0103 nu exist\u0103. Apoi, acesta este transmis prin Scope mai de jos. Dac\u0103 vreo metod\u0103 de mai jos vrea s\u0103 adauge un Span, ea ia din Scope currentul activeSpan, creeaz\u0103 un nou Span \u0219i indic\u0103 c\u0103 p\u0103rintele s\u0103u este activeSpan primit, \u0219i face noul Span activ. Atunci c\u00e2nd apeleaz\u0103 servicii externe, acestea primesc actualul activeSpan \u0219i acele servicii creeaz\u0103 noi spane legate de acest span.<br \/>\nToat\u0103 activitatea se desf\u0103\u0219oar\u0103 prin instan\u021ba Tracer, care poate fi ob\u021binut\u0103 prin mecanismul DI sau GlobalTracer.get() ca o variabil\u0103 global\u0103, dac\u0103 mecanismul DI nu func\u021bioneaz\u0103. \u00cen mod implicit, dac\u0103 tracer nu a fost ini\u021bializat, va returna NoopTracer, care nu face nimic.<br \/>\nApoi, din tracer, prin ScopeManager se ob\u021bine currentul scope, se creeaz\u0103 un nou scope din cel curent legat de noul span, iar mai apoi se \u00eenchide Scope-ul creat, care \u00eenchide spanul creat \u0219i revine la starea activ\u0103 a Scope-ului anterior. Scope-ul este legat de fir, prin urmare, \u00een programarea multi-threaded, nu trebuie uitat s\u0103 se transmit\u0103 activeSpan-ul \u00een alt fir, pentru a activa ulterior Scope-ul altui fir legat de acest 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        \/\/ Facem lucruri.\n    } catch(Exception ex) {\n        Tags.ERROR.set(span, true);\n        span.log(Map.of(Fields.EVENT, \"eroare\", 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            \/\/ PASUL 2 DE MAI SUS: reactiv\u0103m Span \u00een callback, trec\u00e2nd true la\n            \/\/ startActive() dac\u0103 c\u00e2nd trebuie s\u0103 \u00eencheiem Span-ul.\n            try (Scope scope = tracer.scopeManager().activate(span, false)) {\n                ...\n            }\n        });\n    }\n}<\/code><\/pre>\n<p>Pentru programarea multi-thread, exist\u0103, de asemenea, TracedExecutorService \u0219i wrapper-uri similare care transmit automat span-ul curent \u00een firul de execu\u021bie atunci c\u00e2nd ruleaz\u0103 sarcini asincrone:<\/p>\n<pre><code class=\"java\">private ExecutorService executor = new TracedExecutorService(\n    Executors.newFixedThreadPool(10), GlobalTracer.get()\n);<\/code><\/pre>\n<p>Pentru cererile HTTP externe exist\u0103 <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>Problemele cu care ne-am confruntat<\/h3>\n<p><\/p>\n<ul>\n<li>Beans \u0219i DI nu func\u021bioneaz\u0103 \u00eentotdeauna dac\u0103 tracer-ul nu este folosit \u00een serviciu sau component\u0103, atunci <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex> Tracer-ul poate s\u0103 nu func\u021bioneze \u0219i va trebui s\u0103 folose\u0219ti GlobalTracer.get().<\/li>\n<li>Anota\u021biile nu func\u021bioneaz\u0103 dac\u0103 nu este o component\u0103 sau un serviciu, sau dac\u0103 apelul metodei se face dintr-o metod\u0103 vecin\u0103 a acelea\u0219i clase. Trebuie s\u0103 fii atent, s\u0103 verifici ce func\u021bioneaz\u0103 \u0219i s\u0103 folose\u0219ti crearea manual\u0103 a trace-ului dac\u0103 @Traced nu func\u021bioneaz\u0103. De asemenea, po\u021bi ad\u0103uga un compilator suplimentar pentru anota\u021biile java, atunci ar trebui s\u0103 func\u021bioneze peste tot.<\/li>\n<li>\u00cen versiunile mai vechi de spring \u0219i spring boot, auto-configurarea opentracing spring cloud nu func\u021bioneaz\u0103 din cauza erorilor \u00een DI, atunci dac\u0103 dore\u0219ti ca trace-urile s\u0103 func\u021bioneze automat \u00een componentele spring, po\u021bi face analogic cu <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>\u00cen groovy, nu func\u021bioneaz\u0103 try with resources, trebuie folosit neap\u0103rat try finally.<\/li>\n<li>Fiecare serviciu trebuie s\u0103 aib\u0103 propriul spring.application.name sub care vor fi logate trace-urile. De fapt, un nume separat pentru produc\u021bie \u0219i test, pentru a nu se amesteca.<\/li>\n<li>Dac\u0103 folose\u0219ti GlobalTracer \u0219i tomcat, toate serviciile lansate \u00een acest tomcat au un singur GlobalTracer, a\u0219a c\u0103 toate vor avea acela\u0219i nume de serviciu.<\/li>\n<li>C\u00e2nd adaugi trace-uri \u00eentr-o metod\u0103, trebuie s\u0103 te asiguri c\u0103 nu este apelat\u0103 \u00een bucl\u0103 de prea multe ori. Trebuie s\u0103 adaugi un singur trace comun pentru toate apelurile, care va loga timpul total de execu\u021bie. Altfel, va ap\u0103rea o \u00eenc\u0103rcare excesiv\u0103.<\/li>\n<li>Odat\u0103, \u00een jaeger-ui, am f\u0103cut cereri prea mari pentru un num\u0103r mare de trace-uri \u0219i, deoarece nu a\u0219teptam r\u0103spunsul, le-am f\u0103cut din nou. \u00cen consecin\u021b\u0103, jaeger-query a \u00eenceput s\u0103 consume mult\u0103 memorie \u0219i s\u0103 \u00eencetineasc\u0103 elastic. A ajutat un restart al jaeger-query.<\/li>\n<\/ul>\n<h3>E\u0219antionarea, stocarea \u0219i vizualizarea trace-urilor<\/h3>\n<p>\nExist\u0103 trei tipuri <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.9\/sampling\/\">de e\u0219antionare a trace-urilor<\/a><\/noindex>:<\/p>\n<ol>\n<li>Const care trimite \u0219i salveaz\u0103 toate trace-urile.<\/li>\n<li>Probabilistic care filtreaz\u0103 trace-urile cu o probabilitate specificat\u0103.<\/li>\n<li>Limitarea ratei care restric\u021bioneaz\u0103 num\u0103rul de trace-uri pe secund\u0103. Aceste set\u0103ri pot fi configurate fie la client, fie pe jaeger-agent sau \u00een colector. \u00cen prezent, \u00een stiva noastr\u0103 de validatori se utilizeaz\u0103 const 1, deoarece cererile nu sunt foarte multe, dar dureaz\u0103 mult timp. \u00cen viitor, dac\u0103 aceasta va pune o presiune excesiv\u0103 asupra sistemului, putem limita.<\/li>\n<\/ol>\n<p>\nDac\u0103 folose\u0219ti Cassandra, \u00een mod implicit ea stocheaz\u0103 trace-urile doar timp de dou\u0103 zile. La noi se folose\u0219te <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger\/tree\/master\/plugin\/storage\/es\">elasticsearch<\/a><\/noindex> \u0219i trace-urile sunt p\u0103strate pe termen nelimitat \u0219i nu sunt \u0219terse. Pentru fiecare zi se creeaz\u0103 un index separat, de exemplu, jaeger-service-2019-03-04. \u00cen continuare, trebuie configurat\u0103 o cur\u0103\u021bare automat\u0103 a trace-urilor vechi.<\/p>\n<p>Pentru a vizualiza trace-urile, trebuie s\u0103:<\/p>\n<ul>\n<li>Selectezi serviciul pe care vrei s\u0103-l filtrezi, de exemplu, tomcat7-default pentru serviciul care ruleaz\u0103 \u00een Tomcat \u0219i care nu poate avea un nume propriu.<\/li>\n<li>Apoi, s\u0103 alegi opera\u021bia, intervalul de timp \u0219i timpul minim al opera\u021biei, de exemplu, de la 10 secunde, pentru a lua doar execu\u021biile lungi.<br \/>\n<img decoding=\"async\" alt=\"Trasabilitatea serviciilor, OpenTracing \u0219i Jaeger.\" src=\"\/wp-content\/uploads\/2019\/04\/bc712d4aabfe9c2ae961d3b8f9396a42.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Accesezi unul dintre trace-uri \u0219i vezi ce a \u00eencetinit acolo.<br \/>\n<img decoding=\"async\" alt=\"Trasabilitatea serviciilor, OpenTracing \u0219i Jaeger.\" src=\"\/wp-content\/uploads\/2019\/04\/16e9dd11903358f5498fe11034bbf848.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p>\nDe asemenea, dac\u0103 se cunoa\u0219te un id al cererii, se poate g\u0103si trace-ul dup\u0103 acest id prin c\u0103utarea tag-urilor, dac\u0103 acest id este logat \u00een span-ul trace-ului.<\/p>\n<h3>Documenta\u021bie<\/h3>\n<p><\/p>\n<ul>\n<li>Documenta\u021bia 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>Documenta\u021bia Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.10\/\">www.jaegertracing.io\/docs\/1.10<\/a><\/noindex><\/li>\n<li>Conectarea 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>Conectarea 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>Articole<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/carprice\/blog\/340946\/\">habr.com\/ro\/company\/carprice\/blog\/340946<\/a><\/noindex> Jaeger OpenTracing \u0219i Microservicii \u00een proiecte reale folosind PHP \u0219i Golang<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/eng.uber.com\/distributed-tracing\/\">eng.uber.com\/distributed-tracing<\/a><\/noindex> Evolu\u021bia Tracer-ului Distribuit la 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> Rularea Jaeger Agent pe hardware dedicat<\/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> Cum am folosit Jaeger \u0219i Prometheus pentru a oferi interog\u0103ri ultra-rapide utilizatorilor \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, \"O mic\u0103 poveste despre o mare victorie: OpenTracing, AWS \u0219i Jaeger\"<\/li>\n<\/ul>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/srg\/blog\/446752\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443. \u041f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0443\u0437\u043a\u0438\u0445 \u043c\u0435\u0441\u0442 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0440\u0430\u0437\u0431\u043e\u0440 \u043b\u043e\u0433\u043e\u0432. \u041f\u0440\u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u043e\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043b\u043e\u0433-\u0444\u0430\u0439\u043b, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a \u0432\u044b\u0437\u043e\u0432\u0443 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0438\u043b\u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445. \u0414\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":22990,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31014","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2.1 - 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\/ro\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Tracing servicii, OpenTracing \u0219i Jaeger | ProHoster","description":"\u00cen proiectele noastre folosim microservicii.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/31014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=31014"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/31014\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/22990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=31014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=31014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=31014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}