Caso de estudio · Observabilidad
Tracing distribuido para los revenue services de anuncios de Pluto TV
Una traza por cada request de anuncios a través de Lambdas, contenedores, colas y una plataforma externa de transcoding, extendida a más de 20 servicios y a monitoreo de usuarios reales en las apps mobile, web y TV.
- Producto
- pluto.tv ↗
- Cliente
- Pluto TV
- Industria
- Streaming gratuito con publicidad (FAST)
- Rol
- Senior Software Engineer & Tech Leader
- Período
- 2020 – 2024
- 20+
- servicios trazados de punta a punta
- 3
- plataformas con RUM: mobile, web, TV
- 1
- trace id por request de anuncios
Deslizá hacia el costado para ver el diagrama completo →
Contexto
Pluto TV es un servicio de streaming gratuito financiado con publicidad. Sus revenue services deciden, buscan y preparan los anuncios de cada corte publicitario, entre Lambdas de AWS, servicios en contenedores, SQS y SNS, ad servers VAST de terceros y Hybrik, una plataforma externa de transcoding. Cuando algo fallaba, los ingresos estaban en juego.
El desafío
El troubleshooting dependía de logs repartidos entre Loggly y CloudWatch y de correlación manual: los ingenieros reconstruían cada request a mano, servicio por servicio. Los saltos asíncronos (mensajes de SQS, notificaciones de SNS, una plataforma externa en el medio) rompían cualquier correlación simple.
La solución
Tracing distribuido con Datadog APM en los revenue services: una prueba de concepto sobre el camino de un request de anuncios, después extendida a más de 20 servicios, más Datadog RUM en las apps mobile, web y TV. El contexto de traza se propaga por HTTP, SQS y SNS, incluso a través de Hybrik; los spans llevan tags de negocio; los logs viven dentro de su span padre.
Propagación de contexto
El contexto de traza viaja por HTTP (adProxy → adRequester), mensajes de SQS (adProxy → adCollector) y notificaciones de SNS (adProxy → Hybrik → SNS → Lambda).
A través de una plataforma externa
El contexto de traza se inyecta en el payload que se le envía a Hybrik y lo extrae la Lambda que recibe su notificación de SNS, así el job de transcoding queda dentro de la misma traza.
Tags como métricas automáticas
Los tags de negocio (app, dispositivo, partner, endpoint, estado) en los spans se convierten en métricas y filtros sin instrumentación adicional.
Logs dentro de los spans
Las entradas de log quedan adjuntas a su span padre, y datos del request como los query strings se escriben una sola vez como tag del span raíz en lugar de repetirse en cada log.
Monitoreo de usuarios reales
Datadog RUM en las apps mobile, web y TV conecta lo que viven los espectadores con las trazas del backend detrás.
Decisiones clave
- 01
Tracing, no más logging
Los logs muestran qué pasó en un lugar; las trazas muestran un request de punta a punta. El objetivo era un único trace id con la historia completa de un request y los errores resaltados a nivel de traza.
Alternativas evaluadas Logs más ricos e ids de correlación buscados entre herramientas.
- 02
Llevar la traza a través de un tercero dentro de su propio payload
Hybrik no propaga headers de traza. Inyectar el contexto de traza en el payload del job que se le envía a Hybrik, y extraerlo en la Lambda que procesa el callback de SNS, mantuvo el paso de transcoding externo dentro de la misma traza en lugar de empezar una nueva.
Alternativas evaluadas Aceptar una traza cortada en el salto externo; correlacionar después por id de job.
- 03
Probarlo primero en el camino más riesgoso
La prueba de concepto cubrió tres servicios y una Lambda de transcoding que ejercitaban todos los mecanismos de propagación (HTTP, SQS, SNS y una plataforma externa), así el enfoque se validó donde la correlación era más difícil.
- 04
Contexto de negocio como tags, una sola vez
Poner dispositivo, partner y datos del request en los spans hace que cada traza se pueda buscar por lo que importa a los ingresos, y escribir los campos pesados una sola vez en el span raíz reduce la redundancia de logs.
- 05
De prueba de concepto a estándar de plataforma
Una vez trazado de punta a punta el camino más difícil, las mismas convenciones se extendieron a más de 20 servicios y a las apps cliente con RUM, para poder seguir un problema del lado del espectador hasta el backend.
Qué hice
- Propuse y lideré la iniciativa de tracing distribuido para los revenue services.
- Construí la prueba de concepto sobre adProxy, adCollector, adRequester y la Lambda de estado de transcoding.
- Implementé la propagación de trazas por HTTP, SQS y SNS, y a través de Hybrik inyectando el contexto en su payload.
- Extendí el tracing a más de 20 servicios y sumé Datadog RUM a las apps mobile, web y TV.
- Definí las convenciones de tags y de logs dentro de los spans para los servicios.
Resultados
- Tracing distribuido en más de 20 servicios.
- Monitoreo de usuarios reales en las apps mobile, web y TV, vinculado a las trazas del backend.
- La historia completa de un request de anuncios en un solo trace id, con los errores resaltados a nivel de traza.
- Un camino directo a la causa en lugar de reconstruir a mano servicio por servicio.