{"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\/sq\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","title":{"rendered":"P\u00ebrcaktimi i sh\u00ebrbimeve, OpenTracing dhe Jaeger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"P\u00ebrcaktimi i sh\u00ebrbimeve, OpenTracing dhe Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/045800f00c8da9702f62cf3de53df7b6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb projektet tona p\u00ebrdorim arkitektur\u00ebn mikrosh\u00ebrbimore. Kur hasim ngusht\u00ebsi n\u00eb performanc\u00eb, shpesh shpenzohet shum\u00eb koh\u00eb n\u00eb monitorim dhe analiz\u00eb t\u00eb logeve. Duke regjistruar koh\u00ebn e operacioneve t\u00eb ve\u00e7anta n\u00eb skedarin e logut, zakonisht \u00ebsht\u00eb e v\u00ebshtir\u00eb t\u00eb kuptohet \u00e7far\u00eb \u00e7oi n\u00eb thirrjen e k\u00ebtyre operacioneve, t\u00eb ndjek\u00ebsh renditjen e veprimeve ose t\u00eb identifikosh devijimin n\u00eb koh\u00eb t\u00eb nj\u00eb operacioni n\u00eb lidhje me nj\u00eb tjet\u00ebr n\u00eb sh\u00ebrbime t\u00eb ndryshme. <\/p>\n<p>P\u00ebr t\u00eb minimizuar pun\u00ebn manuale, vendos\u00ebm t\u00eb p\u00ebrdorim nj\u00eb nga mjetet e p\u00ebrcaktimit. Ky artikull do t\u00eb flas\u00eb p\u00ebr se si dhe p\u00ebr \u00e7far\u00eb mund t\u00eb p\u00ebrdoret p\u00ebrcaktimi dhe si e kemi realizuar ne. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>\u00c7far\u00eb probleme mund t\u00eb zgjidhen me an\u00eb t\u00eb p\u00ebrcaktimit<\/h3>\n<p><\/p>\n<ol>\n<li>T\u00eb gjejm\u00eb ngusht\u00ebsit\u00eb n\u00eb performanc\u00eb si brenda nj\u00eb sh\u00ebrbimi, ashtu edhe n\u00eb t\u00eb gjith\u00eb pem\u00ebn e ekzekutimit mes t\u00eb gjith\u00eb sh\u00ebrbimeve t\u00eb p\u00ebrfshira. P\u00ebr shembull:\n<ul>\n<li>Shum\u00eb thirrje t\u00eb shkurtra nj\u00ebra pas tjet\u00ebr mes sh\u00ebrbimeve, p\u00ebr shembull, p\u00ebr gjeokodimin ose p\u00ebr baz\u00ebn e t\u00eb dh\u00ebnave.<\/li>\n<li>Pritje t\u00eb gjata t\u00eb hyrjes dhe daljes, p\u00ebr shembull, transferimi i t\u00eb dh\u00ebnave n\u00eb rrjet ose leximi nga disku.<\/li>\n<li>Analiz\u00eb e gjat\u00eb e t\u00eb dh\u00ebnave.<\/li>\n<li>Operacionet e gjata q\u00eb k\u00ebrkojn\u00eb CPU.<\/li>\n<li>Pjes\u00eb kodi q\u00eb nuk jan\u00eb t\u00eb nevojshme p\u00ebr t\u00eb marr\u00eb rezultatin p\u00ebrfundimtar dhe mund t\u00eb hiqen, ose t\u00eb ekzekutohen me vones\u00eb.<\/li>\n<\/ul>\n<\/li>\n<li>T\u00eb kuptohet qart\u00eb se n\u00eb cilin rend ndodhin thirrjet dhe \u00e7far\u00eb ndodh kur ekzekutohet nj\u00eb operacion.<br \/>\n<img decoding=\"async\" alt=\"P\u00ebrcaktimi i sh\u00ebrbimeve, OpenTracing dhe Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/f22f14599568bff5573fe59eeeaea753.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00cbsht\u00eb e dukshme se, p\u00ebr shembull, K\u00ebrkesa erdhi n\u00eb sh\u00ebrbimin WS -&gt; sh\u00ebrbimi WS e plot\u00ebsoi informacionin p\u00ebrmes sh\u00ebrbimit R -&gt; m\u00eb pas d\u00ebrgoi k\u00ebrkes\u00ebn n\u00eb sh\u00ebrbimin V -&gt; sh\u00ebrbimi V ngarkoi shum\u00eb t\u00eb dh\u00ebna nga sh\u00ebrbimi R -&gt; shkoi n\u00eb sh\u00ebrbimin P -&gt; sh\u00ebrbimi P shkoi p\u00ebrs\u00ebri n\u00eb sh\u00ebrbimin R -&gt; sh\u00ebrbimi V e injoroi rezultatin dhe shkoi n\u00eb sh\u00ebrbimin J -&gt; dhe vet\u00ebm at\u00ebher\u00eb ktheu p\u00ebrgjigjen n\u00eb sh\u00ebrbimin WS, duke vazhduar n\u00eb sfond t\u00eb llogariste di\u00e7ka tjet\u00ebr.<br \/>\nPa nj\u00eb gjurmimi t\u00eb till\u00eb ose dokumentim t\u00eb detajuar p\u00ebr t\u00eb gjith\u00eb procesin, \u00ebsht\u00eb shum\u00eb e v\u00ebshtir\u00eb t\u00eb kuptohet se \u00e7far\u00eb ndodh duke e par\u00eb p\u00ebr her\u00eb t\u00eb par\u00eb kodin, dhe kodet shpesh jan\u00eb t\u00eb shp\u00ebrndara n\u00eb sh\u00ebrbime t\u00eb ndryshme dhe t\u00eb fshehura pas shum\u00eb bin-ve dhe nd\u00ebrfaqeve.\n<\/li>\n<li>Grumbullimi i informacionit n\u00eb lidhje me pem\u00ebn e ekzekutimit p\u00ebr analiz\u00eb t\u00eb ardhshme t\u00eb vonuar. N\u00eb \u00e7do faz\u00eb t\u00eb ekzekutimit, mund t\u00eb shtohet informacion n\u00eb gjurm\u00eb i cili \u00ebsht\u00eb i disponuesh\u00ebm n\u00eb at\u00eb faz\u00eb dhe m\u00eb pas t\u00eb analizojm\u00eb se cilat t\u00eb dh\u00ebna hyr\u00ebse \u00e7uan n\u00eb nj\u00eb skenar t\u00eb till\u00eb. P\u00ebr shembull:\n<ul>\n<li>ID e p\u00ebrdoruesit<\/li>\n<li>T\u00eb drejtat<\/li>\n<li>Lloji i metod\u00ebs s\u00eb zgjedhur<\/li>\n<li>Logu ose gabim ekzekutimi<\/li>\n<\/ul>\n<\/li>\n<li>Shnd\u00ebrrimi i gjurm\u00ebve n\u00eb nj\u00eb n\u00ebnshtres\u00eb metrikash dhe analiza e m\u00ebtejshme tashm\u00eb n\u00eb form\u00ebn e metrikeve.<\/li>\n<\/ol>\n<h3>\u00c7far\u00eb mund t\u00eb regjistroj\u00eb gjurmimi. Span<\/h3>\n<p>N\u00eb gjurmim ka nj\u00eb koncept t\u00eb span-it, i cili \u00ebsht\u00eb ekuivalenti i nj\u00eb logu n\u00eb konsol\u00eb. Nj\u00eb span ka:<\/p>\n<ul>\n<li>Emrin, zakonisht emri i metod\u00ebs q\u00eb \u00ebsht\u00eb ekzekutuar<\/li>\n<li>Emri i sh\u00ebrbimit n\u00eb t\u00eb cilin \u00ebsht\u00eb gjeneruar span-i<\/li>\n<li>ID-ja unike e tij<\/li>\n<li>Nj\u00eb lloj informacioni meta n\u00eb form\u00ebn e \u00e7el\u00ebsit\/p value, t\u00eb cilin e kan\u00eb regjistruar n\u00eb t\u00eb. P.sh., parametrat e metod\u00ebs ose n\u00ebse metoda p\u00ebrfundoi me nj\u00eb gabim apo jo<\/li>\n<li>Koha e fillimit dhe p\u00ebrfundimit t\u00eb ekzekutimit t\u00eb k\u00ebtij span-i<\/li>\n<li>ID e span-it prind<\/li>\n<\/ul>\n<p>\n\u00c7do span d\u00ebrgohet n\u00eb kolektorin e span-ave p\u00ebr ruajtje n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave p\u00ebr shikim t\u00eb m\u00ebvonsh\u00ebm sapo t\u00eb p\u00ebrfundoj\u00eb ekzekutimi i tij. M\u00eb pas, mund t\u00eb nd\u00ebrtohet nj\u00eb pem\u00eb e t\u00eb gjitha span-ave duke lidhur sipas ID-s\u00eb prind. Gjat\u00eb analiz\u00ebs, mund t\u00eb gjeni, p\u00ebr shembull, t\u00eb gjitha span-at n\u00eb nj\u00eb sh\u00ebrbim t\u00eb caktuar q\u00eb kan\u00eb marr\u00eb m\u00eb shum\u00eb se nj\u00eb koh\u00eb t\u00eb caktuar. Pastaj, duke kaluar n\u00eb nj\u00eb span t\u00eb caktuar, t\u00eb shihni t\u00eb gjith\u00eb pem\u00ebn lart dhe posht\u00eb k\u00ebtij span-i.<\/p>\n<p><img decoding=\"async\" alt=\"P\u00ebrcaktimi i sh\u00ebrbimeve, OpenTracing dhe Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/9cc97f1278af60f0efd5e393cd183c5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Opentrace, Jaeger dhe si e kemi realizuar k\u00ebt\u00eb p\u00ebr projektet tona<\/h3>\n<p>\nEkziston nj\u00eb standard i p\u00ebrgjithsh\u00ebm <noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/docs\/overview\/\">Opentrace<\/a><\/noindex>, i cili p\u00ebrshkruan se si dhe \u00e7far\u00eb duhet t\u00eb mbledh\u00eb, pa lidhur gjurmimin me nj\u00eb implementim t\u00eb caktuar n\u00eb nj\u00eb gjuh\u00eb t\u00eb caktuar. P\u00ebr shembull, n\u00eb Java, t\u00eb gjitha veprimet me gjurm\u00ebt realizohen p\u00ebrmes nj\u00eb API t\u00eb p\u00ebrbashk\u00ebt Opentrace, dhe n\u00ebn t\u00eb mund t\u00eb fshihet, p.sh., Jaeger ose nj\u00eb implementim default bosh q\u00eb nuk b\u00ebn asgj\u00eb.<br \/>\nNe p\u00ebrdorim <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/\">Jaeger<\/a><\/noindex> si implementim t\u00eb Opentrace. Ai p\u00ebrb\u00ebhet nga disa komponent\u00eb:<\/p>\n<p><img decoding=\"async\" alt=\"P\u00ebrcaktimi i sh\u00ebrbimeve, OpenTracing dhe 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 agjenti lokal, i cili zakonisht gjendet n\u00eb \u00e7do makin\u00eb dhe n\u00eb t\u00eb regjistrohen sh\u00ebrbimet n\u00eb portin e tij default lokal. N\u00ebse agjenti mungon, at\u00ebher\u00eb gjurm\u00ebt e t\u00eb gjitha sh\u00ebrbimeve n\u00eb k\u00ebt\u00eb makin\u00eb zakonisht jan\u00eb t\u00eb fikura.<\/li>\n<li>Jaeger-collector \u2014 t\u00eb gjith\u00eb agjent\u00ebt d\u00ebrgojn\u00eb gjurm\u00ebt e mbledhura n\u00eb t\u00eb, dhe ai i ruan ato n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave t\u00eb zgjedhur.<\/li>\n<li>Baza e t\u00eb dh\u00ebnave \u2014 e preferuara p\u00ebr ta \u00ebsht\u00eb Cassandra, por ne p\u00ebrdorim Elasticsearch, ka implementime edhe p\u00ebr disa baza t\u00eb tjera t\u00eb dh\u00ebnash dhe nj\u00eb implementim n\u00eb memorie, i cili nuk ruan asgj\u00eb n\u00eb disk.<\/li>\n<li>Jaeger-query \u2014 \u00ebsht\u00eb nj\u00eb sh\u00ebrbim q\u00eb shkon n\u00eb baz\u00ebn e t\u00eb dh\u00ebnave dhe jep gjurm\u00ebt e mbledhura p\u00ebr analiz\u00eb.<\/li>\n<li>Jaeger-ui \u2014 \u00ebsht\u00eb nd\u00ebrfaqja web p\u00ebr k\u00ebrkimin dhe shikimin e gjurm\u00ebve, ajo shkon tek jaeger-query.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"P\u00ebrcaktimi i sh\u00ebrbimeve, OpenTracing dhe Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/afc415cb5d4f19e7ba18394c2c1a9dd5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNj\u00eb komponent i ve\u00e7ant\u00eb mund t\u00eb quhet implementimi i opentrace jaeger p\u00ebr gjuh\u00eb t\u00eb caktuara, p\u00ebrmes s\u00eb cil\u00ebs span-at d\u00ebrgohen tek jaeger-agent.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">Konfigurimi i Jaeger n\u00eb Java<\/a><\/noindex> duhet t\u00eb implementohet nd\u00ebrfaqja io.opentracing.Tracer, pas s\u00eb cil\u00ebs t\u00eb gjitha gjurm\u00ebt do t\u00eb d\u00ebrgohen p\u00ebrmes saj n\u00eb agjentin e v\u00ebrtet\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"P\u00ebrcaktimi i sh\u00ebrbimeve, OpenTracing dhe Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/5ce4bdfc06def7e4645bd58163e99dab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPo ashtu p\u00ebr komponent\u00ebt e Spring mund t\u00eb lidhni <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-cloud\">opentracing-spring-cloud-starter<\/a><\/noindex> dhe implementimin nga Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-jaeger\">opentracing-spring-jaeger-cloud-starter<\/a><\/noindex> e cila do t\u00eb konfiguroj\u00eb automatikisht gjurmimin p\u00ebr \u00e7do gj\u00eb q\u00eb kalon p\u00ebrmes k\u00ebtyre komponent\u00ebve, p\u00ebr shembull k\u00ebrkesat http n\u00eb kontrollet, k\u00ebrkesat p\u00ebr databaz\u00ebn p\u00ebrmes jdbc, etj.<\/p>\n<h3>Logging i gjurm\u00ebve n\u00eb Java<\/h3>\n<p>\nDiku n\u00eb nivelin m\u00eb t\u00eb lart\u00eb duhet t\u00eb krijohet Span-i i par\u00eb, kjo mund t\u00eb b\u00ebhet automatikisht p\u00ebr shembull nga kontrolluesi i Spring kur merr nj\u00eb k\u00ebrkes\u00eb, ose manualisht n\u00ebse nuk ka t\u00eb till\u00eb. M\u00eb pas ai kalon p\u00ebrmes Scope-it posht\u00eb. N\u00ebse ndonj\u00eb metod\u00eb posht\u00eb d\u00ebshiron t\u00eb shtoj\u00eb nj\u00eb Span, ajo merr nga Scope-i current activeSpan, krijon nj\u00eb Span t\u00eb ri dhe tregon q\u00eb parent-i i tij \u00ebsht\u00eb activeSpan i marr\u00eb, dhe e b\u00ebn Span-in e ri aktiv. Kur thirren sh\u00ebrbime t\u00eb jashtme, atyre u kalon aktuali active span, dhe ato sh\u00ebrbime krijojn\u00eb Spans t\u00eb reja n\u00eb lidhje me k\u00ebt\u00eb span.<br \/>\nE gjith\u00eb puna b\u00ebhet p\u00ebrmes instanc\u00ebs Tracer, mund ta merrni at\u00eb p\u00ebrmes mekanizmit DI, ose GlobalTracer.get() si nj\u00eb variab\u00ebl globale, n\u00ebse mekanizmi DI nuk funksionon. N\u00ebse traci nuk \u00ebsht\u00eb inicializuar, do t\u00eb kthehet NoopTracer q\u00eb nuk b\u00ebn asgj\u00eb.<br \/>\nM\u00eb pas nga traci p\u00ebrmes ScopeManager merret scope-i aktual, krijohet nj\u00eb scope i ri nga ai aktual me lidhje nga nj\u00eb span i ri, dhe m\u00eb pas mbyllet Scope-i i krijuar, i cili mbyll span-in e krijuar dhe kthen n\u00eb gjendje aktive Scope-in e m\u00ebparsh\u00ebm. Scope-i \u00ebsht\u00eb i lidhur me thread-in, prandaj gjat\u00eb programimit me shum\u00eb threads nuk duhet t\u00eb harrohet t\u00eb kaloni active span-in n\u00eb thread tjet\u00ebr, p\u00ebr aktivizimin m\u00eb t\u00eb tutjesh\u00ebm t\u00eb Scope-it t\u00eb thread-it tjet\u00ebr me lidhje me k\u00ebt\u00eb 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        \/\/ B\u00ebni gj\u00ebra.\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            \/\/ HAPI 2 M\u00cb SIP\u00cbR: rikthe Span-in n\u00eb callback, duke kaluar true n\u00eb\n            \/\/ startActive() n\u00ebse\/koh\u00eb kur duhet p\u00ebrfunduar Span-i.\n            try (Scope scope = tracer.scopeManager().activate(span, false)) {\n                ...\n            }\n        });\n    }\n}<\/code><\/pre>\n<p>P\u00ebr programimin me shum\u00eb p\u00ebrgjegj\u00ebsi, ekziston gjithashtu TracedExecutorService dhe mb\u00ebshtetje t\u00eb ngjashme, t\u00eb cilat automatikisht p\u00ebr\u00e7ojn\u00eb spanin aktual n\u00eb thread kur fillojn\u00eb detyrat asinkrone:<\/p>\n<pre><code class=\"java\">private ExecutorService executor = new TracedExecutorService(\n    Executors.newFixedThreadPool(10), GlobalTracer.get()\n);<\/code><\/pre>\n<p>P\u00ebr k\u00ebrkesat http t\u00eb jashtme, ka <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>Problemet me t\u00eb cilat u p\u00ebrball\u00ebm<\/h3>\n<p><\/p>\n<ul>\n<li>Bean-\u00ebt dhe DI nuk funksionojn\u00eb gjithmon\u00eb n\u00ebse tracer p\u00ebrdoret jasht\u00eb sh\u00ebrbimit ose komponentit, n\u00eb at\u00eb rast <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex> Tracer mund t\u00eb mos funksionoj\u00eb dhe do t\u00eb duhet t\u00eb p\u00ebrdorim GlobalTracer.get().<\/li>\n<li>Anotacionet nuk funksionojn\u00eb n\u00ebse nuk \u00ebsht\u00eb nj\u00eb komponent ose sh\u00ebrbim, ose n\u00ebse thirrja e metod\u00ebs ndodh nga nj\u00eb metod\u00eb tjet\u00ebr e s\u00eb nj\u00ebjt\u00ebs klas\u00eb. Duhet t\u00eb jemi t\u00eb kujdessh\u00ebm, t\u00eb kontrollojm\u00eb \u00e7far\u00eb funksionon dhe t\u00eb p\u00ebrdorim krijimin manual t\u00eb traces n\u00ebse @Traced nuk funksionon. Gjithashtu mund t\u00eb lidhim nj\u00eb kompajler shtes\u00eb p\u00ebr anotacionet java, at\u00ebher\u00eb duhet t\u00eb funksionojn\u00eb n\u00eb \u00e7do vend.<\/li>\n<li>N\u00eb versionet e vjetra t\u00eb spring dhe spring boot, konfigurimi automatik i opentracing spring cloud nuk funksionon p\u00ebr shkak t\u00eb defekteve n\u00eb DI, k\u00ebshtu q\u00eb n\u00ebse d\u00ebshirojm\u00eb q\u00eb traces n\u00eb komponentet e springut t\u00eb funksionojn\u00eb automatikisht, mund t\u00eb veprojm\u00eb si te <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>N\u00eb groovy, nuk funksionon try with resources, duhet t\u00eb p\u00ebrdorim gjithmon\u00eb try finally.<\/li>\n<li>\u00c7do sh\u00ebrbim duhet t\u00eb ket\u00eb emrin e vet spring.application.name n\u00ebn t\u00eb cilin do t\u00eb regjistrohen traces. Po ashtu nj\u00eb em\u00ebr t\u00eb ve\u00e7ant\u00eb p\u00ebr prodhimin dhe testin, p\u00ebr t\u00eb mos e nd\u00ebrthurur ato s\u00eb bashku.<\/li>\n<li>N\u00ebse p\u00ebrdorim GlobalTracer dhe tomcat, t\u00eb gjitha sh\u00ebrbimet e nisura n\u00eb k\u00ebt\u00eb tomcat kan\u00eb nj\u00eb GlobalTracer, ndaj do t\u00eb ken\u00eb t\u00eb gjith\u00eb t\u00eb nj\u00ebjtin em\u00ebr sh\u00ebrbimi.<\/li>\n<li>N\u00eb momentin q\u00eb shtojm\u00eb traces n\u00eb metod\u00eb, duhet t\u00eb jemi t\u00eb sigurt q\u00eb ajo nuk thirret n\u00eb nj\u00eb cik\u00ebl shum\u00eb her\u00eb. Duhet t\u00eb shtojm\u00eb nj\u00eb trace t\u00eb p\u00ebrbashk\u00ebt p\u00ebr t\u00eb gjitha thirrjet, e cila do t\u00eb regjistroj\u00eb koh\u00ebn totale t\u00eb pun\u00ebs. Ndryshe do t\u00eb krijohet nj\u00eb ngarkes\u00eb e tep\u00ebrt.<\/li>\n<li>Nj\u00eb her\u00eb n\u00eb jaeger-ui b\u00ebm\u00eb k\u00ebrkesa shum\u00eb t\u00eb m\u00ebdha p\u00ebr nj\u00eb sasi t\u00eb madhe traces dhe pasi nuk prisnim p\u00ebrgjigjen, b\u00ebm\u00eb at\u00eb p\u00ebrs\u00ebri. Si rezultat jaeger-query filloi t\u00eb hante shum\u00eb memorje dhe ngadal\u00ebsonte elastikun. E ndihmoi rinovimi i jaeger-query.<\/li>\n<\/ul>\n<h3>Sampling, ruajtja dhe shikimi i traces<\/h3>\n<p>\nEkzistojn\u00eb tre tipe <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.9\/sampling\/\">sampling-u i traces<\/a><\/noindex>:<\/p>\n<ol>\n<li>Const i cili d\u00ebrgon dhe ruan t\u00eb gjitha traces.<\/li>\n<li>Probabilistic i cili filtrin traces me nj\u00eb probabilitet t\u00eb caktuar.<\/li>\n<li>Ratelimiting q\u00eb kufizon numrin e trasheve n\u00eb sekond\u00eb. K\u00ebto parametra mund t\u00eb konfigurohen n\u00eb klient, ose n\u00eb jaeger-agent ose n\u00eb kolektor. Tani n\u00eb stack-un ton\u00eb t\u00eb validuesve p\u00ebrdorim const 1 pasi k\u00ebrkesat nuk jan\u00eb shum\u00eb, por ato zgjatin nj\u00eb koh\u00eb t\u00eb gjat\u00eb. N\u00eb t\u00eb ardhmen, n\u00ebse kjo do t\u00eb shkaktoj\u00eb nj\u00eb ngarkes\u00eb t\u00eb tepruar n\u00eb sistem, mund t\u00eb kufizojm\u00eb.<\/li>\n<\/ol>\n<p>\nN\u00ebse p\u00ebrdorim Cassandra, at\u00ebher\u00eb p\u00ebr default ajo ruan trashet vet\u00ebm p\u00ebr dy dit\u00eb. Ne p\u00ebrdorim <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger\/tree\/master\/plugin\/storage\/es\">elasticsearch<\/a><\/noindex> dhe trashet ruhen gjithmon\u00eb dhe nuk fshihen. P\u00ebr \u00e7do dit\u00eb krijohet nj\u00eb indeks i ve\u00e7ant\u00eb, p\u00ebr shembull jaeger-service-2019-03-04. N\u00eb t\u00eb ardhmen duhet t\u00eb konfigurojm\u00eb pastrimin automatik t\u00eb trasheve t\u00eb vjetra.<\/p>\n<p>P\u00ebr t\u00eb par\u00eb trashet, duhet:<\/p>\n<ul>\n<li>T\u00eb zgjedhim sh\u00ebrbimin p\u00ebr t\u00eb cilin d\u00ebshirojm\u00eb t\u00eb filtrojm\u00eb trashet, p\u00ebr shembull tomcat7-default p\u00ebr sh\u00ebrbimin q\u00eb \u00ebsht\u00eb aktivizuar n\u00eb Tomcat dhe nuk mund t\u00eb ket\u00eb emrin e tij.<\/li>\n<li>Pastaj t\u00eb zgjedhim operacionin, intervalin kohor dhe koh\u00ebn minimale t\u00eb operacionit, p\u00ebr shembull nga 10 sekonda, p\u00ebr t\u00eb marr\u00eb vet\u00ebm ekzekutimet e gjata.<br \/>\n<img decoding=\"async\" alt=\"P\u00ebrcaktimi i sh\u00ebrbimeve, OpenTracing dhe Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/bc712d4aabfe9c2ae961d3b8f9396a42.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>T\u00eb kalojm\u00eb n\u00eb nj\u00eb nga trashet dhe t\u00eb shikojm\u00eb \u00e7far\u00eb e ngadal\u00ebsonte atje.<br \/>\n<img decoding=\"async\" alt=\"P\u00ebrcaktimi i sh\u00ebrbimeve, OpenTracing dhe Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/16e9dd11903358f5498fe11034bbf848.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p>\nPo ashtu, n\u00ebse dihet nj\u00eb id e caktuar e k\u00ebrkes\u00ebs, at\u00ebher\u00eb mund t\u00eb gjejm\u00eb trashe t\u00eb dh\u00ebn\u00eb p\u00ebrmes k\u00ebtij id n\u00ebp\u00ebrmjet k\u00ebrkimit sipas etiketeve, n\u00ebse ky id logarohet n\u00eb span e trashe.<\/p>\n<h3>Dokumentacioni<\/h3>\n<p><\/p>\n<ul>\n<li>Dokumentacioni 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>Dokumentacioni jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.10\/\">www.jaegertracing.io\/docs\/1.10<\/a><\/noindex><\/li>\n<li>Kufizimi 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>Kufizimi 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>Artikuj<\/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 dhe Microservices n\u00eb nj\u00eb projekt real n\u00eb PHP dhe 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> Running Jaeger Agent on 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, \u201cNj\u00eb histori e vog\u00ebl e nj\u00eb fitore t\u00eb madhe: OpenTracing, AWS dhe Jaeger\u201d<\/li>\n<\/ul>\n<p>Burimi: <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.1.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\/sq\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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\udd47Trafikimi i sh\u00ebrbimeve, OpenTracing dhe Jaeger | ProHoster","description":"N\u00eb projektet tona ne p\u00ebrdorim mikrosh\u00ebrbimin.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/31014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=31014"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/31014\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/22990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=31014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=31014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=31014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}