{"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\/cs\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","title":{"rendered":"Sledov\u00e1n\u00ed slu\u017eeb, OpenTracing a Jaeger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Sledov\u00e1n\u00ed slu\u017eeb, OpenTracing a Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/045800f00c8da9702f62cf3de53df7b6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV na\u0161ich projektech pou\u017e\u00edv\u00e1me mikroservisn\u00ed architekturu. Kdy\u017e nastanou \u00fazk\u00e1 m\u00edsta v v\u00fdkonu, str\u00e1v\u00edme hodn\u011b \u010dasu sledov\u00e1n\u00edm a anal\u00fdzou log\u016f. P\u0159i logov\u00e1n\u00ed \u010dasov\u00e1n\u00ed jednotliv\u00fdch operac\u00ed je obvykle obt\u00ed\u017en\u00e9 pochopit, co vedlo k vyvol\u00e1n\u00ed t\u011bchto operac\u00ed, sledovat posloupnost akc\u00ed nebo zpo\u017ed\u011bn\u00ed jedn\u00e9 operace v\u016f\u010di jin\u00e9 v r\u016fzn\u00fdch slu\u017eb\u00e1ch. <\/p>\n<p>Abychom minimalizovali ru\u010dn\u00ed pr\u00e1ci, rozhodli jsme se vyu\u017e\u00edt jeden z n\u00e1stroj\u016f pro trasov\u00e1n\u00ed. O tom, jak a pro\u010d lze trasov\u00e1n\u00ed pou\u017e\u00edvat a jak jsme s t\u00edm pracovali, bude tato \u010dl\u00e1nek. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Jak\u00e9 probl\u00e9my lze vy\u0159e\u0161it pomoc\u00ed trasov\u00e1n\u00ed<\/h3>\n<p><\/p>\n<ol>\n<li>Naj\u00edt \u00fazk\u00e1 m\u00edsta v v\u00fdkonu jak uvnit\u0159 jedn\u00e9 slu\u017eby, tak v cel\u00e9m strom\u011b prov\u00e1d\u011bn\u00ed mezi v\u0161emi z\u00fa\u010dastn\u011bn\u00fdmi slu\u017ebami. Nap\u0159\u00edklad:\n<ul>\n<li>Mnoho kr\u00e1tk\u00fdch sekven\u010dn\u00edch vol\u00e1n\u00ed mezi slu\u017ebami, nap\u0159\u00edklad pro geok\u00f3dov\u00e1n\u00ed nebo dotazy na datab\u00e1zi.<\/li>\n<li>Dlouh\u00e1 \u010dek\u00e1n\u00ed na vstup a v\u00fdstup, nap\u0159\u00edklad p\u0159enos dat p\u0159es s\u00ed\u0165 nebo \u010dten\u00ed z disku.<\/li>\n<li>Dlouh\u00e9 zpracov\u00e1v\u00e1n\u00ed dat.<\/li>\n<li>Dlouh\u00e9 operace, kter\u00e9 vy\u017eaduj\u00ed CPU.<\/li>\n<li>\u00daseky k\u00f3du, kter\u00e9 nejsou pot\u0159ebn\u00e9 pro dosa\u017een\u00ed kone\u010dn\u00e9ho v\u00fdsledku a mohou b\u00fdt odstran\u011bny nebo spu\u0161t\u011bny pozd\u011bji.<\/li>\n<\/ul>\n<\/li>\n<li>Z\u0159eteln\u011b pochopit, v jak\u00e9m po\u0159ad\u00ed je co vol\u00e1no a co se d\u011bje, kdy\u017e se prov\u00e1d\u00ed operace.<br \/>\n<img decoding=\"async\" alt=\"Sledov\u00e1n\u00ed slu\u017eeb, OpenTracing a Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/f22f14599568bff5573fe59eeeaea753.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nJe vid\u011bt, \u017ee nap\u0159\u00edklad po\u017eadavek p\u0159i\u0161el do slu\u017eby WS -&gt; slu\u017eba WS doplnila data p\u0159es slu\u017ebu R -&gt; d\u00e1le poslala po\u017eadavek do slu\u017eby V -&gt; slu\u017eba V na\u010detla mnoho dat ze slu\u017eby R -&gt; za\u0161la do slu\u017eby P -&gt; slu\u017eba P znovu za\u0161la do slu\u017eby R -&gt; slu\u017eba V ignorovala v\u00fdsledek a \u0161la do slu\u017eby J -&gt; a a\u017e pot\u00e9 vr\u00e1tila odpov\u011b\u010f do slu\u017eby WS, p\u0159i\u010dem\u017e st\u00e1le v pozad\u00ed po\u010d\u00edtala n\u011bco dal\u0161\u00edho.<br \/>\nBez takov\u00e9ho traisu nebo podrobn\u00e9 dokumentace o cel\u00e9m procesu je velmi obt\u00ed\u017en\u00e9 pochopit, co se d\u011bje, kdy\u017e se poprv\u00e9 pod\u00edv\u00e1te na k\u00f3d, a nav\u00edc je k\u00f3d rozpt\u00fdlen po r\u016fzn\u00fdch slu\u017eb\u00e1ch a skryt za spoustou bin\u00e1rn\u00edch soubor\u016f a rozhran\u00ed.\n<\/li>\n<li>Shrom\u00e1\u017ed\u011bn\u00ed informac\u00ed o stromu prov\u00e1d\u011bn\u00ed pro n\u00e1slednou anal\u00fdzu. Na ka\u017ed\u00e9m kroku prov\u00e1d\u011bn\u00ed lze do traisu p\u0159idat informace, kter\u00e9 jsou k dispozici v tomto kroku, a d\u00e1le rozlu\u0161tit, jak\u00e9 vstupn\u00ed \u00fadaje vedly k podobn\u00e9mu sc\u00e9n\u00e1\u0159i. Nap\u0159\u00edklad:\n<ul>\n<li>ID u\u017eivatele<\/li>\n<li>Pr\u00e1va<\/li>\n<li>Typ vybran\u00e9 metody<\/li>\n<li>Log nebo chyba prov\u00e1d\u011bn\u00ed<\/li>\n<\/ul>\n<\/li>\n<li>Transformace tras na podmno\u017einu metrik a jejich n\u00e1sledn\u00e1 anal\u00fdza ji\u017e ve form\u011b metrik.<\/li>\n<\/ol>\n<h3>Co dok\u00e1\u017ee logovat trasov\u00e1n\u00ed. Span<\/h3>\n<p>V trasov\u00e1n\u00ed existuje pojem span, co\u017e je ekvivalent jednoho logu v konzoli. Span m\u00e1:<\/p>\n<ul>\n<li>N\u00e1zev, obvykle to je n\u00e1zev metody, kter\u00e1 byla vykon\u00e1na<\/li>\n<li>N\u00e1zev slu\u017eby, ve kter\u00e9 byl span generov\u00e1n<\/li>\n<li>Vlastn\u00ed unik\u00e1tn\u00ed ID<\/li>\n<li>N\u011bjak\u00e9 meta informace ve form\u00e1tu key\/value, kter\u00e9 byly do n\u011bj zalogov\u00e1ny. Nap\u0159\u00edklad parametry metody nebo zda metoda skon\u010dila chybou \u010di nikoli<\/li>\n<li>\u010cas za\u010d\u00e1tku a konce vykon\u00e1v\u00e1n\u00ed tohoto spanu<\/li>\n<li>ID rodi\u010dovsk\u00e9ho spanu<\/li>\n<\/ul>\n<p>\nKa\u017ed\u00fd span je odes\u00edl\u00e1n do collection sp\u00e1n\u016f pro ulo\u017een\u00ed do datab\u00e1ze pro dal\u0161\u00ed prohl\u00ed\u017een\u00ed, jakmile dokon\u010d\u00ed sv\u00e9 vykon\u00e1n\u00ed. Pot\u00e9 lze sestavit strom v\u0161ech span\u016f propojen\u00edm podle ID rodi\u010de. P\u0159i anal\u00fdze lze nap\u0159\u00edklad naj\u00edt v\u0161echny spany v n\u011bjak\u00e9 slu\u017eb\u011b, kter\u00e9 trvaly d\u00e9le ne\u017e n\u011bjak\u00fd \u010das. D\u00e1le, kdy\u017e p\u0159ejdete na konkr\u00e9tn\u00ed span, uvid\u00edte cel\u00e9 nad\u0159azen\u00e9 a pod\u0159azen\u00e9 stromov\u00e9 struktury tohoto spanu.<\/p>\n<p><img decoding=\"async\" alt=\"Sledov\u00e1n\u00ed slu\u017eeb, OpenTracing a Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/9cc97f1278af60f0efd5e393cd183c5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Opentrace, Jaeger a jak jsme to implementovali pro sv\u00e9 projekty<\/h3>\n<p>\nExistuje obecn\u00fd standard <noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/docs\/overview\/\">Opentrace<\/a><\/noindex>, kter\u00fd popisuje, jak a co by m\u011blo b\u00fdt shroma\u017e\u010fov\u00e1no, bez vazby trasov\u00e1n\u00ed na konkr\u00e9tn\u00ed implementaci v jak\u00e9mkoli jazyce. Nap\u0159\u00edklad v Jav\u011b se ve\u0161ker\u00e1 pr\u00e1ce s trasami prov\u00e1d\u00ed prost\u0159ednictv\u00edm obecn\u00e9ho API Opentrace, a pod n\u00edm m\u016f\u017ee b\u00fdt skryto nap\u0159\u00edklad Jaeger nebo pr\u00e1zdn\u00e1 v\u00fdchoz\u00ed implementace, kter\u00e1 nic ned\u011bl\u00e1.<br \/>\nPou\u017e\u00edv\u00e1me <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/\">Jaeger<\/a><\/noindex> jako implementaci Opentrace. Skl\u00e1d\u00e1 se z n\u011bkolika komponent\u016f:<\/p>\n<p><img decoding=\"async\" alt=\"Sledov\u00e1n\u00ed slu\u017eeb, OpenTracing a 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 m\u00edstn\u00ed agent, kter\u00fd obvykle b\u011b\u017e\u00ed na ka\u017ed\u00e9m stroji a do n\u011bj loguj\u00ed slu\u017eby na m\u00edstn\u00ed v\u00fdchoz\u00ed port. Pokud agent nen\u00ed, obvykle jsou v\u0161echny trasy v\u0161ech slu\u017eeb na tomto stroji vypnuty.<\/li>\n<li>Jaeger-collector \u2014 do n\u011bj v\u0161echny agenty pos\u00edlaj\u00ed shrom\u00e1\u017ed\u011bn\u00e9 trasy, a on je ukl\u00e1d\u00e1 do vybran\u00e9 datab\u00e1ze<\/li>\n<li>Datab\u00e1ze \u2014 preferovan\u00e1 je u nich Cassandra, ale my pou\u017e\u00edv\u00e1me Elasticsearch, existuj\u00ed implementace i pro dal\u0161\u00ed datab\u00e1ze a realizace v pam\u011bti, kter\u00e1 nic neukl\u00e1d\u00e1 na disk.<\/li>\n<li>Jaeger-query \u2014 to je slu\u017eba, kter\u00e1 se p\u0159ipojuje k datab\u00e1zi a vrac\u00ed ji\u017e shrom\u00e1\u017ed\u011bn\u00e9 trasy pro anal\u00fdzu.<\/li>\n<li>Jaeger-ui \u2014 to je webov\u00e9 rozhran\u00ed pro vyhled\u00e1v\u00e1n\u00ed a prohl\u00ed\u017een\u00ed tras, kter\u00e9 se p\u0159ipojuje k jaeger-query.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Sledov\u00e1n\u00ed slu\u017eeb, OpenTracing a Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/afc415cb5d4f19e7ba18394c2c1a9dd5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSamostatnou komponentou lze nazvat implementaci opentrace jaeger pro konkr\u00e9tn\u00ed jazyky, p\u0159es kterou jsou spany odes\u00edl\u00e1ny do jaeger-agent.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">P\u0159ipojen\u00ed Jaeger v Jav\u011b<\/a><\/noindex> to se t\u00fdk\u00e1 implementace rozhran\u00ed io.opentracing.Tracer, po kter\u00e9 v\u0161echny stopy projdou re\u00e1ln\u00edm agentem.<\/p>\n<p><img decoding=\"async\" alt=\"Sledov\u00e1n\u00ed slu\u017eeb, OpenTracing a Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/5ce4bdfc06def7e4645bd58163e99dab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTak\u00e9 pro komponenty Springu lze p\u0159ipojit <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-cloud\">opentracing-spring-cloud-starter<\/a><\/noindex> a implementaci od Jaegera <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-jaeger\">opentracing-spring-jaeger-cloud-starter<\/a><\/noindex> kter\u00e1 automaticky nakonfiguruje sledov\u00e1n\u00ed na v\u0161echno, co proch\u00e1z\u00ed t\u011bmito komponentami, nap\u0159\u00edklad HTTP po\u017eadavky v kontrolerech, dotazy k datab\u00e1zi p\u0159es JDBC atd.<\/p>\n<h3>Logov\u00e1n\u00ed stop v Jav\u011b<\/h3>\n<p>\nN\u011bkde na nejvy\u0161\u0161\u00ed \u00farovni by m\u011bl b\u00fdt vytvo\u0159en prvn\u00ed Span, co\u017e m\u016f\u017ee b\u00fdt provedeno automaticky nap\u0159\u00edklad kontrolerem Springu p\u0159i p\u0159ijet\u00ed po\u017eadavku, nebo ru\u010dn\u011b, pokud takov\u00fd neexistuje. D\u00e1le je p\u0159ed\u00e1v\u00e1n p\u0159es Scope n\u00ed\u017ee. Pokud n\u011bjak\u00e1 metoda n\u00ed\u017ee chce p\u0159idat Span, vezme z Scope aktu\u00e1ln\u00ed activeSpan, vytvo\u0159\u00ed nov\u00fd Span a \u0159ekne, \u017ee jeho rodi\u010dem je aktu\u00e1ln\u011b p\u0159ijat\u00fd activeSpan, a u\u010din\u00ed nov\u00fd Span aktivn\u00ed. P\u0159i vol\u00e1n\u00ed extern\u00edch slu\u017eeb je jim p\u0159ed\u00e1v\u00e1n aktu\u00e1ln\u00ed aktivn\u00ed span a tyto slu\u017eby vytv\u00e1\u0159ej\u00ed nov\u00e9 spany s vazbou na tento span.<br \/>\nVe\u0161ker\u00e1 pr\u00e1ce prob\u00edh\u00e1 prost\u0159ednictv\u00edm instance Tracer, kterou lze z\u00edskat p\u0159es mechanismus DI, nebo GlobalTracer.get() jako glob\u00e1ln\u00ed prom\u011bnnou, pokud mechanismus DI nefunguje. Ve v\u00fdchoz\u00edm stavu, pokud tracer nebyl inicializov\u00e1n, se vr\u00e1t\u00ed NoopTracer, kter\u00fd nic ned\u011bl\u00e1.<br \/>\nD\u00e1le se z traceru pomoc\u00ed ScopeManagera vybere aktu\u00e1ln\u00ed scope, vytv\u00e1\u0159\u00ed se nov\u00fd scope od aktu\u00e1ln\u00edho s vazbou nov\u00e9ho spanu, a n\u00e1sledn\u011b se uzav\u00edr\u00e1 vytvo\u0159en\u00fd Scope, kter\u00fd uzav\u00edr\u00e1 vytvo\u0159en\u00fd span a vrac\u00ed do aktivn\u00edho stavu p\u0159edchoz\u00ed Scope. Scope je v\u00e1z\u00e1n na vl\u00e1kno, proto p\u0159i v\u00edcet\u00e9matick\u00e9m programov\u00e1n\u00ed je t\u0159eba nezapom\u00ednat p\u0159ed\u00e1vat aktivn\u00ed span do jin\u00e9ho vl\u00e1kna, pro dal\u0161\u00ed aktivaci Scope jin\u00e9ho vl\u00e1kna s vazbou na tento 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        \/\/ D\u011blat v\u011bci.\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            \/\/ KROK 2 V\u00dd\u0160E: znovu aktivovat Span v callbacku, p\u0159ed\u00e1v\u00e1n\u00ed true do\n            \/\/ startActive(), pokud\/kdyby m\u011bl b\u00fdt Span dokon\u010den.\n            try (Scope scope = tracer.scopeManager().activate(span, false)) {\n                ...\n            }\n        });\n    }\n}<\/code><\/pre>\n<p>Pro v\u00edcevl\u00e1knov\u00e9 programov\u00e1n\u00ed existuje tak\u00e9 TracedExecutorService a podobn\u00e9 ob\u00e1lky, kter\u00e9 automaticky p\u0159en\u00e1\u0161ej\u00ed aktu\u00e1ln\u00ed span do vl\u00e1kna p\u0159i spu\u0161t\u011bn\u00ed asynchronn\u00edch \u00faloh:<\/p>\n<pre><code class=\"java\">private ExecutorService executor = new TracedExecutorService(\n    Executors.newFixedThreadPool(10), GlobalTracer.get()\n);<\/code><\/pre>\n<p>Pro extern\u00ed http po\u017eadavky existuje <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>Probl\u00e9my, se kter\u00fdmi jsme se setkali<\/h3>\n<p><\/p>\n<ul>\n<li>Beany a DI nefunguj\u00ed v\u017edy, pokud se tracer pou\u017e\u00edv\u00e1 ne v servisu nebo komponent\u011b, pot\u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex> Tracer nemus\u00ed fungovat a bude nutn\u00e9 pou\u017e\u00edt GlobalTracer.get().<\/li>\n<li>Nemaj\u00ed funk\u010dn\u00ed anotace, pokud to nen\u00ed komponenta nebo slu\u017eba, nebo pokud je vol\u00e1n\u00ed metody prov\u00e1d\u011bno z vedlej\u0161\u00ed metody t\u00e9ho\u017e t\u0159\u00eddy. Je t\u0159eba b\u00fdt opatrn\u00fd, kontrolovat co funguje, a pou\u017e\u00edt ru\u010dn\u00ed vytvo\u0159en\u00ed trace, pokud @Traced nefunguje. Tak\u00e9 lze p\u0159idat dal\u0161\u00ed kompil\u00e1tor pro java anotace, pak by m\u011bly fungovat v\u0161ude.<\/li>\n<li>Ve star\u00fdch spring a spring boot nefunguje automatick\u00e1 konfigurace opentracing spring cloud kv\u016fli chyb\u00e1m v DI, proto pokud chcete, aby trace fungovaly automaticky v komponent\u00e1ch springu, m\u016f\u017eete to ud\u011blat podle vzoru s <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 nefunguje try with resources, je t\u0159eba v\u017edy pou\u017e\u00edt try finally.<\/li>\n<li>Ka\u017ed\u00fd servis mus\u00ed m\u00edt uvedeno sv\u00e9 spring.application.name, pod kter\u00fdm budou logov\u00e1ny trace. A to nav\u00edc zvl\u00e1\u0161tn\u00ed name pro produkci a test, aby se nem\u00edchaly dohromady.<\/li>\n<li>Pokud pou\u017eijete GlobalTracer a tomcat, v\u0161echny slu\u017eby spu\u0161t\u011bn\u00e9 v tomto tomcatu maj\u00ed jeden GlobalTracer, proto budou m\u00edt v\u0161echny stejn\u00e9 jm\u00e9no slu\u017eby.<\/li>\n<li>P\u0159i p\u0159id\u00e1n\u00ed trace do metody je t\u0159eba se ujistit, \u017ee nen\u00ed vol\u00e1na v cyklu mnohokr\u00e1t. Je t\u0159eba p\u0159idat jeden spole\u010dn\u00fd trace na v\u0161echny vol\u00e1n\u00ed, kter\u00fd zachyt\u00ed celkov\u00fd \u010das b\u011bhu. Jinak dojde k p\u0159et\u00ed\u017een\u00ed.<\/li>\n<li>Jednou jsme v jaeger-ui provedli p\u0159\u00edli\u0161 velk\u00e9 po\u017eadavky na velk\u00e9 mno\u017estv\u00ed trace a proto\u017ee jsme ne\u010dekali na odpov\u011b\u010f, ud\u011blali jsme to znovu. Nakonec jaeger-query za\u010dal konzumovat hodn\u011b pam\u011bti a zpomalil elastik. Pomohlo restartov\u00e1n\u00ed jaeger-query.<\/li>\n<\/ul>\n<h3>Vzorkov\u00e1n\u00ed, ukl\u00e1d\u00e1n\u00ed a prohl\u00ed\u017een\u00ed trace<\/h3>\n<p>\nExistuj\u00ed t\u0159i typy <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.9\/sampling\/\">vzorkov\u00e1n\u00ed trace<\/a><\/noindex>:<\/p>\n<ol>\n<li>Const, kter\u00fd odes\u00edl\u00e1 a ukl\u00e1d\u00e1 v\u0161echny trace.<\/li>\n<li>Probabilistic, kter\u00fd filtruje trace s n\u011bjakou zadanou pravd\u011bpodobnost\u00ed.<\/li>\n<li>Ratelimiting, kter\u00fd omezuje po\u010det tracer\u016f za sekundu. Tyto parametry lze nastavit na klientovi, bu\u010f na jaeger-agent nebo v kolektoru. V sou\u010dasnosti m\u00e1me v na\u0161em stacku valid\u00e1tor\u016f pou\u017e\u00edv\u00e1no const 1, proto\u017ee po\u017eadavk\u016f nen\u00ed p\u0159\u00edli\u0161 mnoho, ale trvaj\u00ed v\u00fdrazn\u011b dlouho. Do budoucna, pokud to zp\u016fsob\u00ed nadm\u011brn\u00e9 zat\u00ed\u017een\u00ed syst\u00e9mu, lze to omezit.<\/li>\n<\/ol>\n<p>\nPokud pou\u017e\u00edv\u00e1te Cassandru, tak ve v\u00fdchoz\u00edm nastaven\u00ed ukl\u00e1d\u00e1 trace pouze po dobu dvou dn\u016f. Pou\u017e\u00edv\u00e1me <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger\/tree\/master\/plugin\/storage\/es\">elasticsearch<\/a><\/noindex> a trace se ukl\u00e1daj\u00ed na neur\u010dito a nema\u017eou se. Ka\u017ed\u00fd den se vytv\u00e1\u0159\u00ed samostatn\u00fd index, nap\u0159\u00edklad jaeger-service-2019-03-04. Do budoucna je t\u0159eba nastavit automatick\u00e9 \u010di\u0161t\u011bn\u00ed star\u00fdch trace.<\/p>\n<p>Aby bylo mo\u017en\u00e9 zobrazit trace, je t\u0159eba:<\/p>\n<ul>\n<li>Vybrat slu\u017ebu, podle kter\u00e9 chcete filtr pomoct s trace, nap\u0159\u00edklad tomcat7-default pro slu\u017ebu, kter\u00e1 b\u011b\u017e\u00ed v Tomcatu a nem\u016f\u017ee m\u00edt vlastn\u00ed n\u00e1zev.<\/li>\n<li>D\u00e1le vybrat operaci, \u010dasov\u00fd interval a minim\u00e1ln\u00ed \u010das operace, nap\u0159\u00edklad od 10 sekund, aby se vzaly pouze dlouh\u00e9 prov\u00e1d\u011bn\u00ed.<br \/>\n<img decoding=\"async\" alt=\"Sledov\u00e1n\u00ed slu\u017eeb, OpenTracing a Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/bc712d4aabfe9c2ae961d3b8f9396a42.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>P\u0159ej\u00edt na jeden z trace a pod\u00edvat se, co tam zpomalovalo.<br \/>\n<img decoding=\"async\" alt=\"Sledov\u00e1n\u00ed slu\u017eeb, OpenTracing a Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/16e9dd11903358f5498fe11034bbf848.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p>\nTak\u00e9 pokud zn\u00e1te n\u011bjak\u00e9 ID \u017e\u00e1dosti, m\u016f\u017eete naj\u00edt trace podle tohoto ID p\u0159es vyhled\u00e1v\u00e1n\u00ed podle tag\u016f, pokud je toto ID logov\u00e1no ve span trace.<\/p>\n<h3>Dokumentace<\/h3>\n<p><\/p>\n<ul>\n<li>Dokumentace 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>Dokumentace Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.10\/\">www.jaegertracing.io\/docs\/1.10<\/a><\/noindex><\/li>\n<li>P\u0159ipojen\u00ed 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>P\u0159ipojen\u00ed 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>\u010cl\u00e1nky<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/carprice\/blog\/340946\/\">habr.com\/cs\/company\/carprice\/blog\/340946<\/a><\/noindex> Jaeger OpenTracing a mikroslu\u017eby v re\u00e1ln\u00e9m projektu na PHP a 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> Spu\u0161t\u011bn\u00ed Jaeger Agenta na bare metal<\/li>\n<\/ul>\n<h3>Video<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=qg0ENOdP1Lo\">www.youtube.com\/watch?v=qg0ENOdP1Lo<\/a><\/noindex> Jak jsme pou\u017eili Jaeger a Prometheus k dod\u00e1n\u00ed bleskurychl\u00fdch u\u017eivatelsk\u00fdch dotaz\u016f \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> \u00davod: 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, \u201cMal\u00fd p\u0159\u00edb\u011bh velk\u00e9ho v\u00edt\u011bzstv\u00ed: OpenTracing, AWS a Jaeger\u201d<\/li>\n<\/ul>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/srg\/blog\/446752\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443. \u041f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0443\u0437\u043a\u0438\u0445 \u043c\u0435\u0441\u0442 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0440\u0430\u0437\u0431\u043e\u0440 \u043b\u043e\u0433\u043e\u0432. \u041f\u0440\u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u043e\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043b\u043e\u0433-\u0444\u0430\u0439\u043b, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a \u0432\u044b\u0437\u043e\u0432\u0443 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0438\u043b\u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445. \u0414\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":22990,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31014","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Sledov\u00e1n\u00ed slu\u017eeb, OpenTracing a Jaeger | ProHoster","description":"V na\u0161ich projektech pou\u017e\u00edv\u00e1me mikroslu\u017eby.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/31014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=31014"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/31014\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/22990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=31014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=31014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=31014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}