{"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\/pt\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","title":{"rendered":"Rastreamento de servi\u00e7os, OpenTracing e Jaeger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Rastreamento de servi\u00e7os, OpenTracing e Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/045800f00c8da9702f62cf3de53df7b6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEm nossos projetos, utilizamos uma arquitetura de microsservi\u00e7os. Quando surgem gargalos de desempenho, \u00e9 comum gastar muito tempo monitorando e analisando logs. Ao registrar os tempos de opera\u00e7\u00f5es individuais em um arquivo de log, geralmente \u00e9 dif\u00edcil entender o que levou \u00e0 chamada dessas opera\u00e7\u00f5es, rastrear a sequ\u00eancia de a\u00e7\u00f5es ou o deslocamento temporal de uma opera\u00e7\u00e3o em rela\u00e7\u00e3o a outra em diferentes servi\u00e7os. <\/p>\n<p>Para minimizar o trabalho manual, decidimos usar uma das ferramentas de rastreamento. Esta artigo discutir\u00e1 como e para que pode ser utilizado o rastreamento, al\u00e9m de compartilhar nossa experi\u00eancia. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Quais problemas podem ser resolvidos com o rastreamento<\/h3>\n<p><\/p>\n<ol>\n<li>Identificar gargalos de desempenho tanto dentro de um \u00fanico servi\u00e7o quanto em toda a \u00e1rvore de execu\u00e7\u00e3o entre todos os servi\u00e7os envolvidos. Por exemplo:\n<ul>\n<li>V\u00e1rios chamados curtos consecutivos entre servi\u00e7os, como em geocodifica\u00e7\u00e3o ou acesso a banco de dados.<\/li>\n<li>Longas esperas de entrada\/sa\u00edda, como a transfer\u00eancia de dados pela rede ou leitura de disco.<\/li>\n<li>Longa an\u00e1lise de dados.<\/li>\n<li>Opera\u00e7\u00f5es longas que consomem CPU.<\/li>\n<li>Trechos de c\u00f3digo que n\u00e3o s\u00e3o necess\u00e1rios para obter o resultado final e podem ser removidos ou executados de forma ass\u00edncrona.<\/li>\n<\/ul>\n<\/li>\n<li>Visualizar claramente a sequ\u00eancia em que as chamadas ocorrem e o que acontece quando uma opera\u00e7\u00e3o \u00e9 executada.<br \/>\n<img decoding=\"async\" alt=\"Rastreamento de servi\u00e7os, OpenTracing e Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/f22f14599568bff5573fe59eeeaea753.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n\u00c9 evidente que, por exemplo, a solicita\u00e7\u00e3o chegou ao servi\u00e7o WS -&gt; o servi\u00e7o WS complementou os dados atrav\u00e9s do servi\u00e7o R -&gt; em seguida, enviou uma solicita\u00e7\u00e3o ao servi\u00e7o V -&gt; o servi\u00e7o V carregou muitos dados do servi\u00e7o R -&gt; fez uma chamada ao servi\u00e7o P -&gt; o servi\u00e7o P fez mais uma chamada ao servi\u00e7o R -&gt; o servi\u00e7o V ignorou o resultado e seguiu para o servi\u00e7o J -&gt; e s\u00f3 depois retornou a resposta ao servi\u00e7o WS, enquanto continuava a calcular algo em segundo plano.<br \/>\nSem esse tra\u00e7o ou documenta\u00e7\u00e3o detalhada de todo o processo, \u00e9 muito dif\u00edcil entender o que est\u00e1 acontecendo ao olhar o c\u00f3digo pela primeira vez, sendo que o c\u00f3digo est\u00e1 distribu\u00eddo entre diferentes servi\u00e7os e oculto por v\u00e1rios beans e interfaces.\n<\/li>\n<li>Coleta de informa\u00e7\u00f5es sobre a \u00e1rvore de execu\u00e7\u00e3o para an\u00e1lise posterior. Em cada etapa da execu\u00e7\u00e3o, \u00e9 poss\u00edvel adicionar informa\u00e7\u00f5es de rastreamento que est\u00e3o dispon\u00edveis naquele momento e ent\u00e3o analisar quais dados de entrada levaram a esse cen\u00e1rio. Por exemplo:\n<ul>\n<li>ID do usu\u00e1rio<\/li>\n<li>Permiss\u00f5es<\/li>\n<li>Tipo de m\u00e9todo selecionado<\/li>\n<li>Log ou erro de execu\u00e7\u00e3o<\/li>\n<\/ul>\n<\/li>\n<li>Transformar rastros em um subconjunto de m\u00e9tricas e analisar esses dados como m\u00e9tricas.<\/li>\n<\/ol>\n<h3>O que a rastreabilidade pode registrar. Span<\/h3>\n<p>Na rastreabilidade, existe o conceito de span, que \u00e9 an\u00e1logo a um \u00fanico log na console. O span possui:<\/p>\n<ul>\n<li>Nome, geralmente o nome do m\u00e9todo que foi executado.<\/li>\n<li>Nome do servi\u00e7o em que o span foi gerado.<\/li>\n<li>Um ID \u00fanico pr\u00f3prio.<\/li>\n<li>Alguma meta informa\u00e7\u00e3o no formato chave\/valor que foi registrada nele. Por exemplo, par\u00e2metros do m\u00e9todo ou se o m\u00e9todo terminou em erro ou n\u00e3o.<\/li>\n<li>Hora de in\u00edcio e fim da execu\u00e7\u00e3o deste span.<\/li>\n<li>ID do span pai.<\/li>\n<\/ul>\n<p>\nCada span \u00e9 enviado ao coletor de spans para ser salvo em um banco de dados para visualiza\u00e7\u00e3o posterior assim que sua execu\u00e7\u00e3o \u00e9 conclu\u00edda. Posteriormente, \u00e9 poss\u00edvel construir uma \u00e1rvore de todos os spans conectando-os pelo ID do pai. Na an\u00e1lise, podemos encontrar, por exemplo, todos os spans em um determinado servi\u00e7o que levaram mais de um certo tempo. Em seguida, ao acessar um span espec\u00edfico, ver toda a \u00e1rvore acima e abaixo desse span.<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento de servi\u00e7os, OpenTracing e Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/9cc97f1278af60f0efd5e393cd183c5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Opentrace, Jaeger e como implementamos isso em nossos projetos.<\/h3>\n<p>\nH\u00e1 um padr\u00e3o geral. <noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/docs\/overview\/\">Opentrace<\/a><\/noindex>, que descreve como e o que deve ser coletado, sem vincular a rastreabilidade a uma implementa\u00e7\u00e3o espec\u00edfica em qualquer linguagem. Por exemplo, em Java, todo o trabalho com rastros \u00e9 feito atrav\u00e9s da API geral do Opentrace, e sob ela pode se esconder, por exemplo, o Jaeger ou uma implementa\u00e7\u00e3o padr\u00e3o vazia que n\u00e3o faz nada.<br \/>\nN\u00f3s usamos <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/\">Jaeger<\/a><\/noindex> como implementa\u00e7\u00e3o do Opentrace. Ele consiste em v\u00e1rios componentes:<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento de servi\u00e7os, 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 um agente local, que geralmente est\u00e1 em cada m\u00e1quina e os servi\u00e7os registram neste porta padr\u00e3o local. Se o agente n\u00e3o estiver presente, os rastros de todos os servi\u00e7os dessa m\u00e1quina geralmente est\u00e3o desativados.<\/li>\n<li>Jaeger-collector \u2014 para o qual todos os agentes enviam os rastros coletados, e ele os armazena no banco de dados escolhido.<\/li>\n<li>Banco de dados \u2014 preferencialmente Cassandra, mas usamos Elasticsearch; existem implementa\u00e7\u00f5es para mais algumas outras bases de dados e uma implementa\u00e7\u00e3o em mem\u00f3ria que n\u00e3o salva nada no disco.<\/li>\n<li>Jaeger-query \u2014 \u00e9 o servi\u00e7o que consulta o banco de dados e fornece os rastros j\u00e1 coletados para an\u00e1lise.<\/li>\n<li>Jaeger-ui \u2014 \u00e9 a interface web para busca e visualiza\u00e7\u00e3o de rastros, que consulta o jaeger-query.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Rastreamento de servi\u00e7os, OpenTracing e Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/afc415cb5d4f19e7ba18394c2c1a9dd5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUm componente separado pode ser a implementa\u00e7\u00e3o do opentrace Jaeger para linguagens espec\u00edficas, atrav\u00e9s da qual os spans s\u00e3o enviados ao jaeger-agent.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">Conex\u00e3o do Jaeger em Java.<\/a><\/noindex> basicamente envolve a implementa\u00e7\u00e3o da interface io.opentracing.Tracer, ap\u00f3s o que todos os rastros ser\u00e3o enviados para o agente real atrav\u00e9s dela.<\/p>\n<p><img decoding=\"async\" alt=\"Rastreamento de servi\u00e7os, OpenTracing e Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/5ce4bdfc06def7e4645bd58163e99dab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAl\u00e9m disso, para componentes do Spring, \u00e9 poss\u00edvel integrar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-cloud\">opentracing-spring-cloud-starter<\/a><\/noindex> e a implementa\u00e7\u00e3o da Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-jaeger\">opentracing-spring-jaeger-cloud-starter<\/a><\/noindex> que configurar\u00e1 automaticamente a rastreamento de tudo que passa por esses componentes, como requisi\u00e7\u00f5es HTTP em controladores, consultas ao banco de dados via JDBC, etc.<\/p>\n<h3>Registro de rastros em Java<\/h3>\n<p>\nEm algum lugar no n\u00edvel mais alto, o primeiro Span deve ser criado, isso pode ser feito automaticamente, por exemplo, por um controlador do Spring ao receber uma requisi\u00e7\u00e3o, ou manualmente caso n\u00e3o exista. Em seguida, ele \u00e9 passado para o Scope inferior. Se algum m\u00e9todo abaixo quiser adicionar um Span, ele pega o activeSpan atual do Scope, cria um novo Span e define que seu span pai \u00e9 o activeSpan recebido, ativando o novo Span. Ao chamar servi\u00e7os externos, o span ativo atual \u00e9 passado para eles, e esses servi\u00e7os criam novos spans vinculados a esse span.<br \/>\nTodo o trabalho \u00e9 feito atrav\u00e9s da inst\u00e2ncia Tracer, que pode ser obtida atrav\u00e9s do mecanismo DI ou GlobalTracer.get() como uma vari\u00e1vel global, caso o mecanismo DI n\u00e3o funcione. Por padr\u00e3o, se o tracer n\u00e3o foi inicializado, retornar\u00e1 NoopTracer, que n\u00e3o faz nada.<br \/>\nEm seguida, atrav\u00e9s do tracer, o ScopeManager obt\u00e9m o scope atual, um novo scope \u00e9 criado a partir do atual com a vincula\u00e7\u00e3o do novo span, depois o Scope criado \u00e9 fechado, encerrando o span criado e retornando ao estado ativo do Scope anterior. O Scope est\u00e1 vinculado \u00e0 thread, por isso, na programa\u00e7\u00e3o multithreading, \u00e9 importante lembrar de passar o span ativo para outra thread, para a ativa\u00e7\u00e3o subsequente do Scope da outra thread vinculado a esse 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        \/\/ Realizar opera\u00e7\u00f5es.\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            \/\/ ETAPA 2 ACIMA: reativar o Span no callback, passando true para\n            \/\/ startActive() se\/quando o Span deve ser finalizado.\n            try (Scope scope = tracer.scopeManager().activate(span, false)) {\n                ...\n            }\n        });\n    }\n}<\/code><\/pre>\n<p>Para programa\u00e7\u00e3o multijogos, tamb\u00e9m h\u00e1 TracedExecutorService e wrappers semelhantes que automaticamente passam o span atual para a thread ao iniciar tarefas ass\u00edncronas:<\/p>\n<pre><code class=\"java\">private ExecutorService executor = new TracedExecutorService(\n    Executors.newFixedThreadPool(10), GlobalTracer.get()\n);<\/code><\/pre>\n<p>Para chamadas http externas, existe <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>Os problemas que encontramos<\/h3>\n<p><\/p>\n<ul>\n<li>Beans e DI nem sempre funcionam se o tracer n\u00e3o for utilizado em um servi\u00e7o ou componente, ent\u00e3o <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex> O Tracer pode n\u00e3o funcionar e ser\u00e1 necess\u00e1rio usar GlobalTracer.get().<\/li>\n<li>Anota\u00e7\u00f5es n\u00e3o funcionam se n\u00e3o forem um componente ou servi\u00e7o, ou se a chamada de m\u00e9todo ocorrer de um m\u00e9todo adjacente da mesma classe. \u00c9 preciso ter cuidado, verificar o que funciona e usar a cria\u00e7\u00e3o manual do trace se @Traced n\u00e3o funcionar. Tamb\u00e9m \u00e9 poss\u00edvel adicionar um compilador adicional para anota\u00e7\u00f5es java, ent\u00e3o devem funcionar em todos os lugares.<\/li>\n<li>Em vers\u00f5es antigas do spring e spring boot, a autoconfigura\u00e7\u00e3o do opentracing spring cloud n\u00e3o funciona devido a bugs no DI, ent\u00e3o se quiser que os tra\u00e7os funcionem automaticamente nos componentes do spring, pode-se fazer de maneira semelhante 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>Em groovy, n\u00e3o funciona try with resources, \u00e9 necess\u00e1rio usar try finally.<\/li>\n<li>Cada servi\u00e7o deve ter seu pr\u00f3prio spring.application.name sob o qual os tra\u00e7os ser\u00e3o registrados. Al\u00e9m disso, um nome separado para produ\u00e7\u00e3o e teste, para n\u00e3o mistur\u00e1-los.<\/li>\n<li>Se usar GlobalTracer e tomcat, todos os servi\u00e7os iniciados nesse tomcat ter\u00e3o um \u00fanico GlobalTracer, portanto, ter\u00e3o todos um nome de servi\u00e7o id\u00eantico.<\/li>\n<li>Ao adicionar tra\u00e7os a um m\u00e9todo, deve-se ter certeza de que ele n\u00e3o \u00e9 chamado em um ciclo v\u00e1rias vezes. \u00c9 preciso adicionar um tra\u00e7o geral para todas as chamadas, que registrar\u00e1 o tempo total de execu\u00e7\u00e3o. Caso contr\u00e1rio, uma carga excessiva ser\u00e1 criada.<\/li>\n<li>Uma vez, no jaeger-ui, fizemos solicita\u00e7\u00f5es muito grandes para uma grande quantidade de tra\u00e7os e, como n\u00e3o aguardamos a resposta, fizemos novamente. No final, jaeger-query come\u00e7ou a consumir muita mem\u00f3ria e a desacelerar o elastic. Um restart do jaeger-query ajudou.<\/li>\n<\/ul>\n<h3>A amostragem, armazenamento e visualiza\u00e7\u00e3o de tra\u00e7os<\/h3>\n<p>\nExistem tr\u00eas tipos <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.9\/sampling\/\">de amostragem de tra\u00e7os<\/a><\/noindex>:<\/p>\n<ol>\n<li>Constante que envia e armazena todos os tra\u00e7os.<\/li>\n<li>Probabil\u00edstica que filtra tra\u00e7os com uma determinada probabilidade.<\/li>\n<li>O Ratelimiting que limita o n\u00famero de tra\u00e7os por segundo. \u00c9 poss\u00edvel configurar esses par\u00e2metros no cliente, ou no jaeger-agent ou no coletor. Atualmente, usamos const 1 na pilha de validadores, pois o n\u00famero de requisi\u00e7\u00f5es n\u00e3o \u00e9 muito alto, mas elas levam um tempo consider\u00e1vel. No futuro, se isso causar uma carga excessiva no sistema, podemos implementar uma limita\u00e7\u00e3o.<\/li>\n<\/ol>\n<p>\nSe usar Cassandra, por padr\u00e3o, ela armazena tra\u00e7os apenas por dois dias. Estamos usando <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger\/tree\/master\/plugin\/storage\/es\">elasticsearch<\/a><\/noindex> e os tra\u00e7os s\u00e3o mantidos por todo o tempo e n\u00e3o s\u00e3o removidos. Para cada dia, um \u00edndice separado \u00e9 criado, por exemplo, jaeger-service-2019-03-04. Futuramente, ser\u00e1 necess\u00e1rio configurar uma limpeza autom\u00e1tica de tra\u00e7os antigos.<\/p>\n<p>Para visualizar os tra\u00e7os, \u00e9 preciso:<\/p>\n<ul>\n<li>Selecionar o servi\u00e7o pelo qual se deseja filtrar os tra\u00e7os, como tomcat7-default para o servi\u00e7o que est\u00e1 sendo executado no Tomcat e que n\u00e3o possui um nome pr\u00f3prio.<\/li>\n<li>Depois, escolha a opera\u00e7\u00e3o, o intervalo de tempo e o tempo m\u00ednimo de opera\u00e7\u00e3o, como a partir de 10 segundos, para capturar apenas as execu\u00e7\u00f5es longas.<br \/>\n<img decoding=\"async\" alt=\"Rastreamento de servi\u00e7os, OpenTracing e Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/bc712d4aabfe9c2ae961d3b8f9396a42.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Acesse um dos tra\u00e7os e veja o que estava causando a lentid\u00e3o.<br \/>\n<img decoding=\"async\" alt=\"Rastreamento de servi\u00e7os, OpenTracing e Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/16e9dd11903358f5498fe11034bbf848.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p>\nAl\u00e9m disso, se algum id da requisi\u00e7\u00e3o for conhecido, pode-se encontrar o tra\u00e7o por esse id atrav\u00e9s da pesquisa por tags, se esse id estiver sendo registrado no span do tra\u00e7o.<\/p>\n<h3>Documenta\u00e7\u00e3o<\/h3>\n<p><\/p>\n<ul>\n<li>Documenta\u00e7\u00e3o opentracing <noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/docs\/overview\/what-is-tracing\/\">opentracing.io\/docs\/overview\/what-is-tracing<\/a><\/noindex><\/li>\n<li>Documenta\u00e7\u00e3o jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.10\/\">www.jaegertracing.io\/docs\/1.10<\/a><\/noindex><\/li>\n<li>Integra\u00e7\u00e3o 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>Integra\u00e7\u00e3o 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>Artigos<\/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 Microservices em um projeto real com PHP e 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> Executando o Jaeger Agent em bare metal<\/li>\n<\/ul>\n<h3>V\u00eddeo<\/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> Como usamos Jaeger e Prometheus para fornecer consultas de usu\u00e1rio incrivelmente r\u00e1pidas \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> Introdu\u00e7\u00e3o: 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, \"Pequena hist\u00f3ria de uma grande vit\u00f3ria: OpenTracing, AWS e Jaeger\"<\/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.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\/pt\/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=\"pt_PT\" \/>\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\/pt\/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\udd47Rastreamento de servi\u00e7os, OpenTracing e Jaeger | ProHoster","description":"Em nossos projetos, utilizamos arquitetura de microsservi\u00e7os.","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/31014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=31014"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/31014\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/22990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=31014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=31014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=31014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}