Capítulo 1. El problema del rastreo distribuido
Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com
NO TENGO HERRAMIENTAS PORQUE HE DESTRUIDO MIS HERRAMIENTAS CON MIS HERRAMIENTAS.
James Mickens1
El concepto de rastrear la ejecución de un programa informático no es nuevo en ningún sentido. Ser capaz de comprender la pila de llamadas de un programa es bastante crítico, se podría decir, para todo tipo de tareas de perfilado, depuración y monitoreo. De hecho, es probable que las trazas de pila sean la segunda herramienta de depuración más utilizada del mundo, justo detrás de las sentencias print
esparcidas generosamente por toda una base de código. Sin embargo, nuestras herramientas, procesos y tecnologías han mejorado en las dos últimas décadas y exigen nuevas metodologías y patrones de pensamiento. Como recordamos en la Introducción, las arquitecturas modernas, como los microservicios, han roto fundamentalmente estos métodos clásicos de perfilado, depuración y monitoreo. El rastreo distribuido está listo para aliviar estos problemas y arreglar los agujeros que hemos destruido con nuestras herramientas.
Sólo hay un problema: el rastreo distribuido puede ser difícil. ¿Por qué ocurre esto? Cuando intentas iniciarte en el rastreo distribuido suelen surgir tres problemas fundamentales.
En primer lugar, necesitas poder generar datos de rastreo. El soporte para el rastreo distribuido como ciudadano de primera clase en tu tiempo de ejecución puede ser irregular o inexistente. Puede que tu software no esté estructurado para aceptar fácilmente el código de instrumentación necesario para emitir datos de seguimiento. Puede que utilices patrones que son antitéticos al estilo basado en peticiones de la mayoría de las plataformas de seguimiento distribuido. A menudo, las iniciativas de rastreo distribuido mueren al llegar debido a las dificultades de instrumentar una base de código existente.
Otro problema es cómo recopilar y almacenar los datos de rastreo generados por tu software. Imagina cientos o miles de servicios, cada uno de los cuales emite pequeños fragmentos de datos de rastreo por cada solicitud, potencialmente millones de veces por segundo. ¿Cómo capturas esos datos y los almacenas para su análisis y recuperación? ¿Cómo decides qué guardar y durante cuánto tiempo? ¿Cómo escalas la recogida de tus datos en el tiempo con las peticiones a tus servicios?
Por último, una vez que tienes todos estos datos, ¿cómo obtienes realmente valor de ellos? ¿Cómo traduces los datos de seguimiento en bruto que recibes en ideas y acciones procesables? ¿Cómo utilizas los datos de seguimiento para proporcionar contexto a otra telemetría de servicio, reduciendo el tiempo necesario para diagnosticar problemas? ¿Puedes convertir tus datos de seguimiento en valor para otras partes de la empresa, aparte de los ingenieros? Estas preguntas, y otras más, bloquean y confunden a muchos que intentan iniciarse en el rastreo distribuido.
El resultado de una implementación de rastreo distribuido es una herramienta que te otorga visibilidad de tu sistema profundo y la capacidad de comprender fácilmente cómo contribuyen los servicios individuales de una petición al rendimiento global de cada petición. Los datos de rastreo que generarás pueden utilizarse no sólo para mostrar la forma general de tu sistema distribuido (ver Figura 1-1), sino también para ver el rendimiento de los servicios individuales dentro de una única petición.
Como muestra la Figura 1-2, podrás inspeccionar las solicitudes a medida que pasan de los clientes del frontend a los servicios del backend y comprender cómo -y por qué- se producen latencias o errores, y qué impacto tienen en toda la solicitud. Estas trazas proporcionan una gran cantidad de información que te resultará muy valiosa a la hora de solucionar problemas en producción, como los metadatos que indican en qué host o región se está ejecutando un servicio concreto. Tendrás la posibilidad de buscar, ordenar, filtrar, agrupar y, en general, cortar y trocear estos datos de rastreo como te plazca para solucionar rápidamente los problemas o comprender cómo las diferentes dimensiones están afectando al rendimiento de tu servicio.
Entonces, ¿cómo se llega de aquí a allí? ¿Qué necesitas para crear una implementación de trazado distribuido con éxito?
Las Piezas de una Implementación de Rastreo Distribuido
Para responder a estas preguntas y ayudarte a organizar tus ideas sobre el tema, hemos dividido las Implementaciones de trazado distribuido en tres áreas principales de interés, que es también como hemos organizado el libro. Estas tres partes se complementan entre sí, pero en general pueden ser útiles para distintas personas en distintos momentos, ¡no es necesario que seas un experto en las tres! Dentro de cada sección encontrarás explicaciones útiles, lecciones y ejemplos de cómo construir y ofrecer una implementación de rastreo distribuido en tu organización, que debería ayudar a crear confianza en tus sistemas y software.
- Instrumentación, Capítulo 2
-
El rastreo distribuido requiere trazas. Los datos de rastreo pueden generarse mediantela instrumentación de los procesos de tus servicios o transformando los datos de telemetría existentes en datos de rastreo. En esta sección, aprenderás sobre los tramos, los bloques de construcción de las trazas distribuidas basadas en peticiones, y cómo pueden ser generados por tus servicios. Discutiremos el estado de la técnica en marcos de instrumentación como OpenTelemetry, un proyecto de código abierto ampliamente respaldado que ofrece una API de instrumentación (y más) que permite arrancar fácilmente el rastreo distribuido en tu software. Además, hablaremos de las buenas prácticas para instrumentar el código heredado, así como el desarrollo nuevo.
- Implementación, Capítulo 5
-
Una vez que generas datos de rastreo, necesitas enviarlos a algún sitio. La implementación del rastreo en tu organización requiere comprender dónde se ejecuta tu software -para los usuarios finales y sus clientes, así como en los servidores- y cómo funciona. Tendrás que comprender las implicaciones de la recogida y almacenamiento de datos de rastreo para la seguridad, la privacidad y el cumplimiento normativo. Es posible que encuentres compensaciones en los gastos generales relacionados con la cantidad de datos que se conservan y la cantidad que se descarta mediante un proceso conocido como muestreo. Discutiremos las buenas prácticas en torno a todos estos temas y te ayudaremos a descubrir cómo implementar rápidamente una infraestructura de rastreo para tu sistema.
- Aportar valor, capítulo 7
-
Una vez que tus servicios están generando datos de rastreo y has desplegado la infraestructura necesaria para recopilarlos, ¡empieza la verdadera diversión! ¿Cómo combinas las trazas con tus otras herramientas y técnicas de observabilidad, como las métricas y los registros? ¿Cómo mides lo que importa y cómo defines lo que importa para empezar? El rastreo distribuido proporciona las herramientas que necesitarás para responder a estas preguntas, y te ayudaremos a descubrirlo en esta sección. Aprenderás a utilizar las trazas para mejorar tu línea de base de rendimiento, así como la forma en que el trazado te ayuda a volver a esa línea de base cuando las cosas se incendian.
Dicho todo esto, aún queda una pregunta abierta: ¿cómo se relaciona el rastreo distribuido con los microservicios y, en general, con las arquitecturas distribuidas? Ya hablamos de ello en Introducción: ¿Qué es el seguimiento distribuido?, pero hagamos una digresión por un momento para revisar la relación entre estas cosas.
Rastreo distribuido, microservicios, sin servidor, ¡oh cielos!
Hay una cierta línea de pensamiento sobre los microservicios, ahora que hace varios años que dejaron de ser la "cosa caliente" en la cartera de "Tendencias principales para 20XX" de todos los analistas, a saber, que la batalla se ha ganado. La explosión de popularidad de la computación en nube, Kubernetes, la contenedorización y otras herramientas de desarrollo que permiten un rápido aprovisionamiento e implementación de hardware (o abstracciones similares al hardware) ha transformado la industria, sin duda. Estos factores pueden dar la sensación de que plantearse la pregunta "¿Debería utilizar microservicios?" sería tacharse a uno mismo de tonto o charlatán.
Demos un paso atrás y veamos algunos datos del mundo real. En primer lugar, hay algunas pruebas de que los contenedores no son exactamente tan populares en producción como el bombo publicitario puede hacerlos parecer: sólo el 25% de los desarrolladores los utilizan en producción.2 Bastantes organizaciones de ingeniería siguen utilizando monolitos tradicionales para gran parte de su trabajo. ¿Por qué? Una razón puede ser, irónicamente, la falta de herramientas accesibles de trazado distribuido.
El desarrollador y autor Martin Fowler identifica tres consideraciones principales para quienes adoptan microservicios: la capacidad de aprovisionar rápidamente el hardware, la capacidad de implementar rápidamente el software y un régimen de monitoreo que pueda detectar rápidamente los problemas graves.3 Las cosas que nos encantan de los microservicios (independencia, idempotencia, etc.) son también las que los hacen difíciles de entender, especialmente cuando las cosas van mal. Las tecnologías sin servidor añaden más confusión a esta ecuación al darte menos visibilidad del entorno de ejecución de una función concreta y, a menudo, al resistirse obstinadamente al monitoreo a través de tus herramientas favoritas.
Entonces, ¿cómo debemos considerar el rastreo distribuido frente a estas cuestiones? En primer lugar, el rastreo distribuido resuelve la cuestión del monitoreo planteada por Fowler, proporcionando visibilidad sobre el funcionamiento de tu arquitectura de microservicios. Te permite obtener información crítica sobre el rendimiento y el estado de los servicios individuales como parte de una cadena de peticiones de una forma que sería difícil o llevaría mucho tiempo hacer de otro modo. El rastreo distribuido te da la capacidad de comprender exactamente lo que está haciendo un servicio individual concreto como parte del conjunto, permitiéndote plantear y responder preguntas sobre el rendimiento de tus servicios y tu sistema distribuido.
Las métricas y los registros tradicionales por sí solos no pueden compararse con el contexto adicional que proporciona el rastreo distribuido. Las métricas, por ejemplo, te permitirán obtener una comprensión agregada de lo que ocurre en todas las instancias de un servicio determinado, e incluso te permitirán limitar tu consulta a grupos específicos de servicios, pero no tienen en cuenta la cardinalidad infinita de .4
Los registros, por otra parte, proporcionan detalles extremadamente precisos sobre un servicio determinado, pero no tienen una forma integrada de proporcionar esos detalles en el contexto de una solicitud. Aunque puedes utilizar métricas y registros para descubrir y abordar problemas en tu sistema distribuido, el rastreo distribuido proporciona un contexto que te ayuda a reducir el espacio de búsqueda necesario para descubrir la causa raíz de un incidente mientras se está produciendo (cuando cada momento cuenta).
Como mencionamos en la Introducción, intentar gestionar y comprender una arquitectura distribuida compleja y basada en microservicios puede provocar estrés y agotamiento. Si estás pensando en migrar a microservicios, estás en medio de una transición de un monolito a microservicios, o ya tienes la tarea de manejar una inmensa arquitectura de microservicios, entonces puede que tú también estés experimentando este estrés, al considerar cómo comprender la salud y el rendimiento de tu software. Puede que el rastreo distribuido no sea una panacea, pero como parte de una estrategia de observabilidad más amplia, puede convertirse en un componente crítico de cómo hacer funcionar sistemas distribuidos fiables.
Las ventajas del rastreo
¿Cuáles son las ventajas concretas que puedes conseguir con el rastreo distribuido? Hablaremos de ello a lo largo del resto del libro, pero repasemos primero las ventajas rápidas de alto nivel:
-
El rastreo distribuido puede transformar la forma en que desarrollas y entregas software, de eso no hay duda. Tiene beneficios no sólo para la calidad del software, sino para la salud de tu organización.
-
El rastreo distribuido puede mejorar la productividad de los desarrolladores y tus resultados de desarrollo. Es la forma mejor y más fácil para los desarrolladores de comprender el comportamiento de los sistemas distribuidos en producción. Emplearás menos tiempo en solucionar problemas y depurar un sistema distribuido utilizando el rastreo distribuido del que emplearías sin él, y descubrirás problemas que de otro modo no te habrías dado cuenta de que tenías.
-
El rastreo distribuido es compatible con el desarrollo políglota moderno. Dado que el rastreo distribuido es agnóstico respecto a tu lenguaje de programación, proveedor de monitoreo y entorno de ejecución, puedes propagar un único rastreo desde un cliente nativo de iOS a través de un proxy C++ de alto rendimiento, pasando por un backend Java o C#, hasta una base de datos a escala web y viceversa, todo ello visualizado en un único lugar, utilizando una única herramienta. Ningún otro conjunto de herramientas te permite esta libertad y flexibilidad.
-
El rastreo distribuido reduce la sobrecarga necesaria para las Implementaciones y las reversiones, dándote rápidamente visibilidad de los cambios. Esto no sólo reduce el tiempo medio de resolución de incidencias, sino que disminuye el tiempo de comercialización de nuevas funciones y el tiempo medio de detección de regresiones de rendimiento. Esto también mejora la comunicación y la colaboración entre equipos, porque tus desarrolladores no están aislados en una pila de monitoreo concreta para su parte del pastel: todos, desde los desarrolladores frontales hasta los expertos en bases de datos, pueden consultar los mismos datos para comprender cómo afectan los cambios al sistema en general.
Poner la mesa
Después de todo esto, ¡esperamos tener tu atención! Recapitulemos:
-
El trazado distribuido es una herramienta que permite perfilar y monitorizar sistemas distribuidos mediante trazados, datos que representan peticiones a medida que fluyen por un sistema.
-
El rastreo distribuido es agnóstico a tu lenguaje de programación, tiempo de ejecución o entorno de implementación, y puede utilizarse con casi todo tipo de aplicaciones o servicios.
-
El rastreo distribuido mejora el trabajo en equipo y la coordinación, y reduce el tiempo necesario para detectar y resolver los problemas de rendimiento de tu aplicación.
Para obtener estos beneficios, primero necesitarás datos de seguimiento. Luego tendrás que recopilarlos y, por último, tendrás que analizarlos. Empecemos por el principio, pues, y hablemos de instrumentar tu código para el rastreo distribuido.
4 Cardinalidad es un término matemático que se refiere al número de elementos de un conjunto o grupo. En el contexto de las métricas, es el número de combinaciones únicas de nombres de métricas y atributos clave/valor asociados a esos nombres. Hablaremos más de esto en capítulos posteriores.
Get Rastreo distribuido en la práctica now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.