{"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\/it\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","title":{"rendered":"Tracciamento dei servizi, OpenTracing e Jaeger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Tracciamento dei servizi, OpenTracing e Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/045800f00c8da9702f62cf3de53df7b6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNei nostri progetti utilizziamo un'architettura a microservizi. Quando si verificano colli di bottiglia nelle prestazioni, viene dedicato molto tempo al monitoraggio e all'analisi dei log. Quando si registrano i tempi di esecuzione delle singole operazioni in un file di log, di solito \u00e8 difficile capire cosa ha portato alla chiamata di queste operazioni, tracciare la sequenza delle azioni o il ritardo temporale di un'operazione rispetto a un'altra in diversi servizi. <\/p>\n<p>Per ridurre il lavoro manuale, abbiamo deciso di utilizzare uno degli strumenti di tracciamento. Di cosa si tratta e come lo abbiamo utilizzato verr\u00e0 trattato in questo articolo. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Quali problemi possono essere risolti con il tracciamento<\/h3>\n<p><\/p>\n<ol>\n<li>Identificare i colli di bottiglia nelle prestazioni sia all'interno di un singolo servizio che nell'intero albero di esecuzione tra tutti i servizi coinvolti. Ad esempio:\n<ul>\n<li>Molti brevi chiamate sequenziali tra servizi, ad esempio, per geocodifica o accesso al database.<\/li>\n<li>Lunghe attese di input\/output, ad esempio, trasferimento dati tramite rete o lettura da disco.<\/li>\n<li>Lunga analisi dei dati.<\/li>\n<li>Operazioni lunghe che richiedono CPU.<\/li>\n<li>Sezioni di codice che non sono necessarie per ottenere il risultato finale e possono essere rimosse o eseguite in modo posticipato.<\/li>\n<\/ul>\n<\/li>\n<li>Comprendere chiaramente in quale sequenza vengono effettuate le chiamate e cosa succede quando si esegue l'operazione.<br \/>\n<img decoding=\"async\" alt=\"Tracciamento dei servizi, OpenTracing e Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/f22f14599568bff5573fe59eeeaea753.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00c8 evidente che, ad esempio, una richiesta \u00e8 arrivata al servizio WS -&gt; il servizio WS ha completato i dati tramite il servizio R -&gt; quindi ha inviato una richiesta al servizio V -&gt; il servizio V ha caricato molti dati dal servizio R -&gt; si \u00e8 recato al servizio P -&gt; il servizio P \u00e8 andato di nuovo al servizio R -&gt; il servizio V ha ignorato il risultato e si \u00e8 diretto verso il servizio J -&gt; e solo dopo ha restituito la risposta al servizio WS, continuando comunque a calcolare qualcos'altro in background.<br \/>\nSenza tale tracciamento o documentazione dettagliata per l'intero processo, \u00e8 molto difficile capire cosa sta accadendo a un primo sguardo sul codice, e il codice \u00e8 sparso tra diversi servizi ed \u00e8 nascosto dietro un mucchio di bean e interfacce.\n<\/li>\n<li>Raccolta di informazioni sull'albero di esecuzione per un'analisi successiva. In ogni fase dell'esecuzione, nel tracciamento \u00e8 possibile aggiungere informazioni disponibili in quel momento e successivamente capire quali dati di input hanno portato a tale scenario. Ad esempio:\n<ul>\n<li>ID utente<\/li>\n<li>Autorizzazioni<\/li>\n<li>Tipo del metodo selezionato<\/li>\n<li>Log o errore di esecuzione<\/li>\n<\/ul>\n<\/li>\n<li>La trasformazione dei trace in un sottoinsieme di metriche e l'analisi successiva gi\u00e0 in forma di metriche.<\/li>\n<\/ol>\n<h3>Cosa pu\u00f2 registrare il tracing. Span<\/h3>\n<p>Nel tracing esiste il concetto di span, che \u00e8 l'equivalente di un log, nella console. Ogni span ha:<\/p>\n<ul>\n<li>Un nome, di solito il nome del metodo che \u00e8 stato eseguito<\/li>\n<li>Il nome del servizio in cui \u00e8 stato generato lo span<\/li>\n<li>Un ID unico proprio<\/li>\n<li>Qualche informazione meta in forma key\/value che \u00e8 stata registrata. Ad esempio, i parametri del metodo o se il metodo ha restituito un errore o meno<\/li>\n<li>Il tempo di inizio e fine dell'esecuzione di questo span<\/li>\n<li>ID dello span genitore<\/li>\n<\/ul>\n<p>\nOgni span viene inviato a un collector di span per essere salvato nel database per una successiva visualizzazione non appena ha completato la sua esecuzione. In seguito, \u00e8 possibile costruire un albero di tutti gli span collegandoli per id del genitore. Durante l'analisi, \u00e8 possibile trovare, ad esempio, tutti gli span in un determinato servizio che hanno impiegato pi\u00f9 di un certo tempo. Poi, passando a uno span specifico, si pu\u00f2 vedere l'intero albero sopra e sotto questo span.<\/p>\n<p><img decoding=\"async\" alt=\"Tracciamento dei servizi, OpenTracing e Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/9cc97f1278af60f0efd5e393cd183c5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Opentrace, Jagger e come abbiamo implementato questo per i nostri progetti<\/h3>\n<p>\nEsiste uno standard comune <noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/docs\/overview\/\">Opentrace<\/a><\/noindex>, che descrive come e cosa deve essere raccolto, senza legarsi il tracing a una specifica implementazione in un linguaggio. Ad esempio, in Java tutto il lavoro con i trace viene fatto tramite il comune API Opentrace, sotto il quale pu\u00f2 nascondersi, ad esempio, Jaeger o un'implementazione predefinita vuota che non fa nulla.<br \/>\nNoi utilizziamo <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/\">Jaeger<\/a><\/noindex> come implementazione di Opentrace. \u00c8 composto da diversi componenti:<\/p>\n<p><img decoding=\"async\" alt=\"Tracciamento dei servizi, OpenTracing e 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 agente locale, che di solito si trova su ogni macchina e in esso registrano i servizi sulla porta predefinita locale. Se l'agente non \u00e8 presente, i trace di tutti i servizi su questa macchina sono di solito disattivati.<\/li>\n<li>Jaeger-collector \u2014 a cui tutti gli agenti inviano i trace raccolti, e lui li inserisce nel database scelto.<\/li>\n<li>Il database \u2014 preferibilmente cassandra, ma noi utilizziamo elasticsearch, ci sono implementazioni anche per un paio di altri database e un'implementazione in memoria, che non salva nulla su disco.<\/li>\n<li>Jaeger-query \u2014 \u00e8 il servizio che si connette al database e restituisce i trace gi\u00e0 raccolti per l'analisi.<\/li>\n<li>Jaeger-ui \u2014 \u00e8 l'interfaccia web per la ricerca e visualizzazione dei trace, si connette a jaeger-query.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Tracciamento dei servizi, OpenTracing e Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/afc415cb5d4f19e7ba18394c2c1a9dd5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn componente separato pu\u00f2 essere considerata l'implementazione di opentrace jaeger per specifici linguaggi, attraverso cui gli span vengono inviati a jaeger-agent.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">Integrazione di Jagger in Java<\/a><\/noindex> si riduce all'implementazione dell'interfaccia io.opentracing.Tracer, dopo di che tutte le tracce attraverso di essa verranno inviate all'agente reale.<\/p>\n<p><img decoding=\"async\" alt=\"Tracciamento dei servizi, OpenTracing e Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/5ce4bdfc06def7e4645bd58163e99dab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nInoltre, \u00e8 possibile collegare <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-cloud\">opentracing-spring-cloud-starter<\/a><\/noindex> e l'implementazione di Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-jaeger\">opentracing-spring-jaeger-cloud-starter<\/a><\/noindex> che configurer\u00e0 automaticamente il tracciamento di tutto ci\u00f2 che passa attraverso questi componenti, ad esempio le richieste http ai controller, le richieste al database tramite jdbc, ecc.<\/p>\n<h3>Registrazione delle tracce in Java<\/h3>\n<p>\nDa qualche parte al livello pi\u00f9 alto deve essere creato il primo Span, questo pu\u00f2 essere fatto automaticamente ad esempio dal controller di Spring quando riceve una richiesta, oppure manualmente se non esiste. Successivamente, viene passato attraverso lo Scope sottostante. Se qualche metodo sottostante desidera aggiungere un Span, prende dallo Scope l'attuale activeSpan, crea un nuovo Span e dichiara che il suo parent \u00e8 l'activeSpan ottenuto, e rende il nuovo Span attivo. Quando chiama servizi esterni, gli viene passato l'attuale span attivo, e quei servizi creano nuovi span legati a questo span.<br \/>\nTutto il lavoro avviene tramite un'istanza di Tracer, che pu\u00f2 essere ottenuta tramite il meccanismo DI o GlobalTracer.get() come variabile globale, se il meccanismo DI non funziona. Per impostazione predefinita, se il tracer non \u00e8 stato inizializzato, verr\u00e0 restituito il NoopTracer che non fa nulla.<br \/>\nSuccessivamente, dal tracer, attraverso il ScopeManager, si recupera l'attuale scope, si crea un nuovo scope dall'attuale legato al nuovo span, e poi si chiude lo Scope creato, che chiude lo span creato e riporta nello stato attivo lo Scope precedente. Lo Scope \u00e8 legato al thread, quindi nella programmazione multithreading non si deve dimenticare di passare lo span attivo a un altro thread, per attivare ulteriormente lo Scope di un altro thread legato a questo 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        \/\/ Fai le cose.\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            \/\/ FASE 2 SOPRA: riattivare lo Span nel callback, passando true a\n            \/\/ startActive() se\/quando lo Span deve essere terminato.\n            try (Scope scope = tracer.scopeManager().activate(span, false)) {\n                ...\n            }\n        });\n    }\n}<\/code><\/pre>\n<p>Per la programmazione multithreading ci sono anche TracedExecutorService e wrapper simili, che passano automaticamente lo span corrente al thread quando si avviano task asincroni:<\/p>\n<pre><code class=\"java\">private ExecutorService executor = new TracedExecutorService(\n    Executors.newFixedThreadPool(10), GlobalTracer.get()\n);<\/code><\/pre>\n<p>Per le richieste http esterne c'\u00e8 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-apache-httpclient\">TracingHttpClient<\/a><\/noindex><\/p>\n<pre><code class=\"java\">HttpClient httpClient = new TracingHttpClientBuilder().build();<\/code><\/pre>\n<h3>Problemi con cui ci siamo imbattuti<\/h3>\n<p><\/p>\n<ul>\n<li>I bean e il DI non sempre funzionano se il tracer non \u00e8 utilizzato in un servizio o in un componente, allora <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex> Il tracer potrebbe non funzionare e sar\u00e0 necessario usare GlobalTracer.get().<\/li>\n<li>Le annotazioni non funzionano se non sono un componente o un servizio, o se la chiamata al metodo avviene da un metodo adiacente della stessa classe. \u00c8 necessario prestare attenzione, verificare cosa funziona e utilizzare la creazione manuale del trace se @Traced non funziona. \u00c8 possibile anche aggiungere un compilatore aggiuntivo per le annotazioni java, allora dovrebbero funzionare ovunque.<\/li>\n<li>Nelle versioni pi\u00f9 vecchie di spring e spring boot, l'autoconfigurazione opentracing spring cloud non funziona a causa di bug nel DI, quindi se si desidera che i trace funzionino automaticamente nei componenti di spring, si pu\u00f2 fare analogamente a <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>In groovy, il try with resources non funziona, \u00e8 necessario utilizzare obbligatoriamente try finally.<\/li>\n<li>\u00c8 necessario specificare il proprio spring.application.name per ogni servizio sotto il quale verranno registrati i trace. Inoltre, un nome separato per produzione e test, per non mescolarli insieme.<\/li>\n<li>Se si utilizza GlobalTracer e tomcat, tutti i servizi avviati in questo tomcat hanno un unico GlobalTracer, quindi avranno tutti lo stesso nome di servizio.<\/li>\n<li>Quando si aggiungono i trace al metodo, \u00e8 necessario assicurarsi che non venga chiamato in un ciclo molte volte. Bisogna aggiungere un unico trace generale per tutte le chiamate, che registrer\u00e0 il tempo totale di esecuzione. Altrimenti si creer\u00e0 un carico eccessivo.<\/li>\n<li>Una volta in jaeger-ui abbiamo effettuato richieste troppo grandi per un gran numero di trace e poich\u00e9 non aspettavamo la risposta abbiamo fatto di nuovo. Di conseguenza, jaeger-query ha iniziato a utilizzare molta memoria e a rallentare elastic. Riavviare jaeger-query ha aiutato.<\/li>\n<\/ul>\n<h3>Campionamento, archiviazione e visualizzazione dei trace<\/h3>\n<p>\nCi sono tre tipi <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.9\/sampling\/\">di campionamento dei trace<\/a><\/noindex>:<\/p>\n<ol>\n<li>Const che invia e salva tutti i trace.<\/li>\n<li>Probabilistico che filtra i trace con una certa probabilit\u00e0 stabilita.<\/li>\n<li>Il ratelimiting che limita il numero di trace al secondo. \u00c8 possibile configurare questi parametri sul client, oppure su jaeger-agent o nel collector. Attualmente nel nostro stack di validatori viene utilizzato const 1 poich\u00e9 le richieste non sono molte, ma occupano un tempo considerevole. In futuro, se questo dovesse causare un carico eccessivo sul sistema, sar\u00e0 possibile limitare.<\/li>\n<\/ol>\n<p>\nSe si utilizza Cassandra, di default conserva le trace solo per due giorni. Noi utilizziamo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger\/tree\/master\/plugin\/storage\/es\">elasticsearch<\/a><\/noindex> e le trace vengono conservate per tutto il tempo e non vengono eliminate. Viene creato un indice separato per ogni giorno, ad esempio jaeger-service-2019-03-04. In futuro sar\u00e0 necessario impostare una pulizia automatica delle trace pi\u00f9 vecchie.<\/p>\n<p>Per visualizzare le trace \u00e8 necessario:<\/p>\n<ul>\n<li>Selezionare il servizio per il quale si desidera filtrare le trace, ad esempio tomcat7-default per un servizio che \u00e8 in esecuzione su Tomcat e non pu\u00f2 avere un proprio nome.<\/li>\n<li>Successivamente, selezionare l'operazione, il periodo di tempo e il tempo minimo di operazione, ad esempio a partire da 10 secondi, per prendere solo le esecuzioni lunghe.<br \/>\n<img decoding=\"async\" alt=\"Tracciamento dei servizi, OpenTracing e Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/bc712d4aabfe9c2ae961d3b8f9396a42.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Accedere a una delle trace e verificare cosa stava rallentando.<br \/>\n<img decoding=\"async\" alt=\"Tracciamento dei servizi, OpenTracing e Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/16e9dd11903358f5498fe11034bbf848.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p>\nInoltre, se si conosce un id della richiesta, \u00e8 possibile trovare la trace tramite questo id cercando nei tag, se questo id \u00e8 registrato nello span della trace.<\/p>\n<h3>Documentazione<\/h3>\n<p><\/p>\n<ul>\n<li>Documentazione di 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>Documentazione di jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.10\/\">www.jaegertracing.io\/docs\/1.10<\/a><\/noindex><\/li>\n<li>Collegamento 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>Collegamento 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>Articoli<\/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 e Microservizi in un progetto reale su PHP e Golang<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/eng.uber.com\/distributed-tracing\/\">eng.uber.com\/distributed-tracing<\/a><\/noindex> Evoluzione del Tracing Distribuito presso 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> Esecuzione di Jaeger Agent su 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> Come abbiamo utilizzato Jaeger e Prometheus per fornire query utente lightning-fast \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, \u201cUna piccola storia di una grande vittoria: OpenTracing, AWS e Jaeger\u201d<\/li>\n<\/ul>\n<p>Fonte: <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\/it\/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=\"it_IT\" \/>\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\/it\/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\udd47 Tracciamento dei servizi, OpenTracing e Jaeger | ProHoster","description":"Nei nostri progetti utilizziamo microservizi.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","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\/it\/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\/it\/wp-json\/wp\/v2\/posts\/31014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=31014"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/31014\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/22990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=31014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=31014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=31014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}