{"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\/es\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","title":{"rendered":"Trazado de servicios, OpenTracing y Jaeger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Trazado de servicios, OpenTracing y Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/045800f00c8da9702f62cf3de53df7b6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn nuestros proyectos utilizamos una arquitectura de microservicios. Cuando surgen cuellos de botella en el rendimiento, se gasta mucho tiempo en la monitorizaci\u00f3n y el an\u00e1lisis de los registros. Al registrar los tiempos de operaciones individuales en el archivo de registro, generalmente es dif\u00edcil entender qu\u00e9 condujo a la llamada de estas operaciones, rastrear la secuencia de acciones o el desfase en el tiempo de una operaci\u00f3n con respecto a otra en diferentes servicios. <\/p>\n<p>Para minimizar el trabajo manual, decidimos utilizar una de las herramientas de trazado. De qu\u00e9 manera y para qu\u00e9 se puede utilizar el trazado y c\u00f3mo lo hicimos, es de lo que trata este art\u00edculo. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Qu\u00e9 problemas se pueden resolver con el trazado<\/h3>\n<p><\/p>\n<ol>\n<li>Encontrar cuellos de botella en el rendimiento tanto dentro de un solo servicio como en todo el \u00e1rbol de ejecuci\u00f3n entre todos los servicios involucrados. Por ejemplo:\n<ul>\n<li>Muchas llamadas secuenciales cortas entre servicios, por ejemplo, para geocodificaci\u00f3n o a una base de datos.<\/li>\n<li>Largas esperas de entrada\/salida, por ejemplo, la transferencia de datos a trav\u00e9s de la red o la lectura desde el disco.<\/li>\n<li>Un an\u00e1lisis prolongado de datos.<\/li>\n<li>Operaciones largas que requieren CPU.<\/li>\n<li>Secciones de c\u00f3digo que no son necesarias para obtener el resultado final y que pueden ser eliminadas, o ejecutadas de forma diferida.<\/li>\n<\/ul>\n<\/li>\n<li>Comprender visualmente en qu\u00e9 secuencia se llaman las operaciones y qu\u00e9 sucede cuando se ejecuta una operaci\u00f3n.<br \/>\n<img decoding=\"async\" alt=\"Trazado de servicios, OpenTracing y Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/f22f14599568bff5573fe59eeeaea753.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nSe puede ver que, por ejemplo, la Solicitud lleg\u00f3 al servicio WS -&gt; el servicio WS complement\u00f3 los datos a trav\u00e9s del servicio R -&gt; luego envi\u00f3 una solicitud al servicio V -&gt; el servicio V carg\u00f3 muchos datos del servicio R -&gt; consult\u00f3 al servicio P -&gt; el servicio P volvi\u00f3 a consultar al servicio R -&gt; el servicio V ignor\u00f3 el resultado y fue al servicio J -&gt; y solo despu\u00e9s devolvi\u00f3 la respuesta al servicio WS, mientras continuaba calculando algo m\u00e1s en segundo plano.<br \/>\nSin este trazado o documentaci\u00f3n detallada sobre todo el proceso, es muy dif\u00edcil entender lo que est\u00e1 sucediendo al mirar el c\u00f3digo por primera vez, adem\u00e1s, el c\u00f3digo est\u00e1 disperso en diferentes servicios y est\u00e1 oculto tras una multitud de beans e interfaces.\n<\/li>\n<li>Recopilaci\u00f3n de informaci\u00f3n sobre el \u00e1rbol de ejecuci\u00f3n para un an\u00e1lisis diferido posterior. En cada etapa de la ejecuci\u00f3n, se puede a\u00f1adir informaci\u00f3n al trazado que est\u00e9 disponible en esa etapa y luego entender qu\u00e9 datos de entrada llevaron a dicho escenario. Por ejemplo:\n<ul>\n<li>ID del usuario<\/li>\n<li>Derechos<\/li>\n<li>Tipo de m\u00e9todo seleccionado<\/li>\n<li>Registro o error de ejecuci\u00f3n<\/li>\n<\/ul>\n<\/li>\n<li>La transformaci\u00f3n de las trazas en un subconjunto de m\u00e9tricas y el posterior an\u00e1lisis ya en forma de m\u00e9tricas.<\/li>\n<\/ol>\n<h3>Qu\u00e9 es capaz de registrar la trazabilidad. Span<\/h3>\n<p>En la trazabilidad existe el concepto de span, que es an\u00e1logo a un registro en la consola. Un span tiene:<\/p>\n<ul>\n<li>Nombre, que generalmente es el nombre del m\u00e9todo que se ejecut\u00f3<\/li>\n<li>Nombre del servicio en el que se gener\u00f3 el span<\/li>\n<li>Identificador \u00fanico propio<\/li>\n<li>Alguna informaci\u00f3n meta en forma de key\/value que se registr\u00f3 en \u00e9l. Por ejemplo, par\u00e1metros del m\u00e9todo o si el m\u00e9todo termin\u00f3 con un error o no<\/li>\n<li>Tiempo de inicio y fin de la ejecuci\u00f3n de este span<\/li>\n<li>ID del span padre<\/li>\n<\/ul>\n<p>\nCada span se env\u00eda al collector de spans para ser guardado en la base de datos para su posterior revisi\u00f3n tan pronto como haya terminado su ejecuci\u00f3n. Posteriormente, se puede construir un \u00e1rbol de todos los spans conect\u00e1ndolos por el ID del padre. En el an\u00e1lisis, se puede encontrar, por ejemplo, todos los spans en un servicio que tardaron m\u00e1s de un tiempo espec\u00edfico. Luego, al acceder a un span concreto, se puede ver todo el \u00e1rbol por encima y por debajo de ese span.<\/p>\n<p><img decoding=\"async\" alt=\"Trazado de servicios, OpenTracing y Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/9cc97f1278af60f0efd5e393cd183c5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Opentrace, Jaeger y c\u00f3mo lo implementamos en nuestros proyectos<\/h3>\n<p>\nHay un est\u00e1ndar com\u00fan <noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/docs\/overview\/\">Opentrace<\/a><\/noindex>, que describe c\u00f3mo y qu\u00e9 debe ser recopilado, sin estar atado la trazabilidad a una implementaci\u00f3n espec\u00edfica en un lenguaje determinado. Por ejemplo, en Java, todo el trabajo con las trazas se realiza a trav\u00e9s de una API com\u00fan de Opentrace, y debajo de eso puede estar, por ejemplo, Jaeger o una implementaci\u00f3n por defecto vac\u00eda que no hace nada.<br \/>\nUsamos <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/\">Jaeger<\/a><\/noindex> como implementaci\u00f3n de Opentrace. Consiste en varios componentes:<\/p>\n<p><img decoding=\"async\" alt=\"Trazado de servicios, OpenTracing y 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 local que normalmente se encuentra en cada m\u00e1quina y al que los servicios registran en el puerto local por defecto. Si no hay agente, las trazas de todos los servicios en esta m\u00e1quina est\u00e1n normalmente desactivadas.<\/li>\n<li>Jaeger-collector \u2014 recibe todas las trazas recopiladas de los agentes y las coloca en la base de datos seleccionada.<\/li>\n<li>Base de datos \u2014 la preferida es Cassandra, pero nosotros usamos Elasticsearch, tiene implementaciones tambi\u00e9n para un par de otras bases de datos y una implementaci\u00f3n en memoria que no guarda nada en el disco.<\/li>\n<li>Jaeger-query \u2014 es el servicio que accede a la base de datos y proporciona las trazas ya recopiladas para an\u00e1lisis.<\/li>\n<li>Jaeger-ui \u2014 es la interfaz web para buscar y visualizar trazas, accede a jaeger-query.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Trazado de servicios, OpenTracing y Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/afc415cb5d4f19e7ba18394c2c1a9dd5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nUn componente aparte se puede considerar como la implementaci\u00f3n de opentrace Jaeger para lenguajes espec\u00edficos, a trav\u00e9s de los cuales los spans se env\u00edan al jaeger-agent.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">Conexi\u00f3n de Jaeger en Java<\/a><\/noindex> se reduce a implementar la interfaz io.opentracing.Tracer, despu\u00e9s de lo cual todos los rastros se enviar\u00e1n a un agente real a trav\u00e9s de \u00e9l.<\/p>\n<p><img decoding=\"async\" alt=\"Trazado de servicios, OpenTracing y Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/5ce4bdfc06def7e4645bd58163e99dab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTambi\u00e9n se puede conectar para componentes de Spring <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-cloud\">opentracing-spring-cloud-starter<\/a><\/noindex> y la implementaci\u00f3n de Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-jaeger\">opentracing-spring-jaeger-cloud-starter<\/a><\/noindex> que configurar\u00e1 autom\u00e1ticamente el rastreo en todo lo que pase a trav\u00e9s de estos componentes, como las solicitudes http en los controladores, las consultas a la base de datos a trav\u00e9s de jdbc, etc.<\/p>\n<h3>Registro de rastros en Java<\/h3>\n<p>\nEn alg\u00fan lugar en el nivel m\u00e1s alto se debe crear el primer Span, esto puede hacerse autom\u00e1ticamente por ejemplo mediante un controlador de Spring al recibir una solicitud, o manualmente si no hay uno. Luego se pasa a trav\u00e9s del Scope hacia abajo. Si alg\u00fan m\u00e9todo inferior quiere a\u00f1adir un Span, toma el activeSpan actual del Scope, crea un nuevo Span y le indica que su padre es el activeSpan recibido, y hace que el nuevo Span sea activo. Al llamar a servicios externos, se les pasa el span activo actual, y esos servicios crean nuevos spans vinculados a este span.<br \/>\nTodo el trabajo se realiza a trav\u00e9s de una instancia de Tracer, que se puede obtener a trav\u00e9s del mecanismo DI, o GlobalTracer.get() como una variable global, si el mecanismo DI no funciona. Por defecto, si el tracer no ha sido inicializado, regresar\u00e1 NoopTracer que no hace nada.<br \/>\nLuego, del tracer a trav\u00e9s de ScopeManager se obtiene el scope actual, se crea un nuevo scope desde el actual vinculando el nuevo span, y m\u00e1s adelante se cierra el Scope creado, que cierra el span creado y regresa al estado activo el Scope anterior. El Scope est\u00e1 vinculado al hilo, por lo que al programar en m\u00faltiples hilos, no se debe olvidar pasar el span activo a otro hilo, para la posterior activaci\u00f3n del Scope de otro hilo vinculado a este 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        \/\/ Hacer cosas.\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            \/\/ PASO 2 ARRIBA: reactivar el Span en la llamada de retorno, pasando true a\n            \/\/ startActive() si\/cuando el Span debe ser finalizado.\n            try (Scope scope = tracer.scopeManager().activate(span, false)) {\n                ...\n            }\n        });\n    }\n}<\/code><\/pre>\n<p>Para la programaci\u00f3n multihilo tambi\u00e9n existen TracedExecutorService y envoltorios similares que autom\u00e1ticamente propagan el span actual en el hilo al ejecutar tareas as\u00edncronas:<\/p>\n<pre><code class=\"java\">private ExecutorService executor = new TracedExecutorService(\n    Executors.newFixedThreadPool(10), GlobalTracer.get()\n);<\/code><\/pre>\n<p>Para solicitudes http externas hay <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>Los problemas que hemos encontrado<\/h3>\n<p><\/p>\n<ul>\n<li>Los beans y DI no siempre funcionan si el tracer no se usa en un servicio o componente, entonces <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex> Tracer puede no funcionar y habr\u00e1 que usar GlobalTracer.get().<\/li>\n<li>Las anotaciones no funcionan si no son un componente o servicio, o si la llamada al m\u00e9todo se realiza desde otro m\u00e9todo de la misma clase. Debes tener cuidado, verificar qu\u00e9 funciona y usar la creaci\u00f3n manual del trace si @Traced no funciona. Tambi\u00e9n se puede a\u00f1adir un compilador adicional para las anotaciones java, y entonces deber\u00edan funcionar en todas partes.<\/li>\n<li>En las versiones antiguas de spring y spring boot no funciona la autoconfiguraci\u00f3n de opentracing spring cloud debido a errores en DI, entonces si se quiere que los traces funcionen autom\u00e1ticamente en los componentes de spring se puede hacer por analog\u00eda con <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>En groovy no funciona try with resources, es necesario usar try finally.<\/li>\n<li>Cada servicio debe especificar su spring.application.name bajo el cual se registrar\u00e1n los traces. Adem\u00e1s, un nombre separado para producci\u00f3n y prueba, para no mezclarlos entre s\u00ed.<\/li>\n<li>Si se utiliza GlobalTracer y tomcat, todos los servicios ejecutados en este tomcat tendr\u00e1n un \u00fanico GlobalTracer, por lo que tendr\u00e1n el mismo nombre de servicio en todos.<\/li>\n<li>Al a\u00f1adir traces en un m\u00e9todo, hay que estar seguro de que no se llama en un bucle muchas veces. Hay que a\u00f1adir un trace com\u00fan para todas las llamadas, que registre el tiempo total de ejecuci\u00f3n. De lo contrario, se generar\u00e1 una carga excesiva.<\/li>\n<li>Una vez en jaeger-ui hicimos solicitudes demasiado grandes sobre una gran cantidad de traces y, como no esper\u00e1bamos la respuesta, hicimos otra vez. Como resultado, jaeger-query empez\u00f3 a consumir mucha memoria y ralentiz\u00f3 elastic. Ayud\u00f3 reiniciar jaeger-query.<\/li>\n<\/ul>\n<h3>Muestreo, almacenamiento y visualizaci\u00f3n de traces<\/h3>\n<p>\nHay tres tipos <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.9\/sampling\/\">de muestreo de traces<\/a><\/noindex>:<\/p>\n<ol>\n<li>Constante que env\u00eda y guarda todos los traces.<\/li>\n<li>Probabil\u00edstico que filtra los traces con alguna probabilidad dada.<\/li>\n<li>Limitaci\u00f3n de tasa que restringe el n\u00famero de trazas por segundo. Se pueden configurar estos par\u00e1metros en el cliente, en jaeger-agent o en el colector. Actualmente, en nuestra pila de validadores se utiliza const 1 ya que no hay muchas solicitudes, pero estas tardan un tiempo considerable. En el futuro, si esto ejerce una carga excesiva en el sistema, se puede limitar.<\/li>\n<\/ol>\n<p>\nSi se utiliza Cassandra, por defecto solo almacena trazas durante dos d\u00edas. Nosotros usamos <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger\/tree\/master\/plugin\/storage\/es\">elasticsearch<\/a><\/noindex> y las trazas se almacenan indefinidamente y no se eliminan. Para cada d\u00eda se crea un \u00edndice separado, por ejemplo, jaeger-service-2019-03-04. En el futuro, es necesario configurar una limpieza autom\u00e1tica de trazas antiguas.<\/p>\n<p>Para ver las trazas, es necesario:<\/p>\n<ul>\n<li>Seleccionar el servicio por el cual se desea filtrar las trazas, por ejemplo, tomcat7-default para el servicio que se est\u00e1 ejecutando en Tomcat y que no puede tener su propio nombre.<\/li>\n<li>Luego, seleccionar la operaci\u00f3n, el rango de tiempo y el tiempo m\u00ednimo de operaci\u00f3n, por ejemplo, a partir de 10 segundos, para obtener solo las ejecuciones largas.<br \/>\n<img decoding=\"async\" alt=\"Trazado de servicios, OpenTracing y Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/bc712d4aabfe9c2ae961d3b8f9396a42.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>Acceder a una de las trazas y ver qu\u00e9 estaba causando la ralentizaci\u00f3n.<br \/>\n<img decoding=\"async\" alt=\"Trazado de servicios, OpenTracing y Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/16e9dd11903358f5498fe11034bbf848.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p>\nAdem\u00e1s, si se conoce alg\u00fan id de solicitud, se puede encontrar la traza por este id a trav\u00e9s de b\u00fasqueda por etiquetas, siempre y cuando este id est\u00e9 registrado en la traza del span.<\/p>\n<h3>La documentaci\u00f3n<\/h3>\n<p><\/p>\n<ul>\n<li>Documentaci\u00f3n de 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>Documentaci\u00f3n de jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.10\/\">www.jaegertracing.io\/docs\/1.10<\/a><\/noindex><\/li>\n<li>Conexi\u00f3n de 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>Conexi\u00f3n de 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>Art\u00edculos<\/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 y Microservicios en un proyecto real en PHP y Golang<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/eng.uber.com\/distributed-tracing\/\">eng.uber.com\/distributed-tracing<\/a><\/noindex> Evoluci\u00f3n de la Trazabilidad Distribuida en 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> Ejecutando el Agente Jaeger en metal desnudo<\/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> C\u00f3mo Usamos Jaeger y Prometheus para Entregar Consultas de Usuario Ultrarr\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> 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, \u201cPeque\u00f1a historia de una gran victoria: OpenTracing, AWS y Jaeger\u201d<\/li>\n<\/ul>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/srg\/blog\/446752\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443. \u041f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0443\u0437\u043a\u0438\u0445 \u043c\u0435\u0441\u0442 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0440\u0430\u0437\u0431\u043e\u0440 \u043b\u043e\u0433\u043e\u0432. \u041f\u0440\u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u043e\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043b\u043e\u0433-\u0444\u0430\u0439\u043b, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a \u0432\u044b\u0437\u043e\u0432\u0443 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0438\u043b\u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445. \u0414\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":22990,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31014","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - 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\/es\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Trazabilidad de servicios, OpenTracing y Jaeger | ProHoster","description":"En nuestros proyectos usamos microservicios.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/31014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=31014"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/31014\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/22990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=31014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=31014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=31014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}