Tema representativo de entrevista

Entrevista de datos y observabilidad: ¿Por qué usar Span Links de OpenTelemetry para lotes?

DatosDifícil
Equipo editorial de Offer.ccPublicado Actualizado

Pregunta

Un worker consume 100 eventos, los agrega y realiza una llamada hacia abajo (downstream). Diseña la traza de OpenTelemetry. Explica la diferencia entre parent y Span Links, muestreo, límites de enlaces, métricas y privacidad.

Consigna y contexto

Un worker consume 100 eventos de una cola y realiza una llamada a una API downstream después de la agregación. Cada evento puede pertenecer a un Trace diferente, y el worker también puede ser activado por un programador (scheduler) o una reproducción (replay). Modela la traza para que cada fuente siga siendo detectable sin fingir que solicitudes no relacionadas forman un solo árbol de tipo padre-hijo.

OpenTelemetry describe los Spans como operaciones que pueden formar un árbol y permite que cada Span contenga cero o más Links. Su descripción general menciona el procesamiento por lotes iniciado por múltiples Spans entrantes como un caso de uso típico de Links.

Qué está evaluando el entrevistador

El candidato debe saber que un parent es un contexto actual único, mientras que un Link representa una causalidad relacionada sin relación de paternidad. Debe controlar la cantidad de enlaces, el muestreo y los atributos de alta cardinalidad, preservando al mismo tiempo una correlación útil de métricas y registros (logs).

Preguntas aclaratorias para hacer primero

  • ¿Puede un lote contener múltiples inquilinos (tenants), niveles de seguridad o tipos de negocio?
  • ¿Es la llamada downstream una sola operación agregada o puede permanecer por evento?
  • ¿El objetivo es la rendición de cuentas por evento, el análisis de latencia o el rendimiento del lote?
  • ¿El muestreo se decide en el ingreso (ingress) o el worker puede retener contextos de origen seleccionados?
  • ¿Pueden los atributos de Link contener IDs de eventos, IDs de inquilinos o campos confidenciales?

Estructura de respuesta en 30 segundos

“El Span de procesamiento por lotes utiliza el contexto del worker o del scheduler como su parent. Los 100 SpanContexts entrantes se convierten en Links porque causaron conjuntamente una operación por lotes sin formar una cadena padre-hijo. Mantengo solo los atributos necesarios de baja cardinalidad, aplico un límite de enlaces y cuento el truncamiento. Las métricas del lote cubren tamaño, espera en cola, procesamiento, latencia downstream, fallas y reintentos; los registros se correlacionan con un ID de lote y un hash de evento. Los campos confidenciales de inquilinos se filtran, y los lotes fallidos o reproducidos cuentan con una ruta segura de muestreo.”

Análisis detallado paso a paso

Paso 1: Separar parent de Link

Un parent indica qué Span individual continúa la operación actual, formando un árbol de Trace y heredando su TraceId. Un Link registra un SpanContext relacionado del mismo o de otro Trace. Cuando las fuentes son pares en un lote, elegir el primer evento como parent crea un árbol falso.

text
Batch-processing Span
  parent: worker / scheduler context
  links: event-1 SpanContext ... event-100 SpanContext

Paso 2: Preservar SpanContext a través del límite

Extrae TraceContext de los encabezados del mensaje, valida su formato y el flag de muestreo, y crea un Link. No coloques el mensaje completo, la entrada del usuario o el token sin procesar en los atributos del Link. Si falta un contexto, cuenta “sin contexto de origen” en lugar de inventar un TraceId.

Paso 3: Limitar el tamaño y costo de los enlaces

Cien enlaces es solo el límite del ejemplo; los lotes en producción pueden ser más grandes. Configura el límite de cantidad de enlaces del SDK o un tope a nivel de aplicación, retén fuentes representativas de errores, reintentos, reproducciones o inquilinos prioritarios, y registra el recuento de enlaces descartados. El truncamiento debe ser visible en las métricas y registros del lote.

Paso 4: Definir el ciclo de vida del Span del lote

El Span cubre la espera del lote, la deserialización, la agregación, la llamada downstream y la confirmación (commit). Agrega eventos de fase o métricas. Cada Span creado debe finalizar en caso de éxito, falla, cancelación o confirmación parcial. Un solo evento lento no debe ocultar los límites de las fases del lote.

Paso 5: Hacer diagnosticables el muestreo y las fallas

El muestreo en el ingreso puede descartar Traces de origen, por lo que el worker necesita una política de seguridad para fallas, reintentos, mensajes fallidos (dead letters) y reproducciones manuales. Los Links presentes en la creación del Span pueden influir en el muestreo; los Links agregados después podrían no hacerlo. Haz que ese orden y el mecanismo de respaldo (fallback) sean explícitos.

Paso 6: Asignar diferentes funciones a trazas, métricas y registros

Las trazas explican la causalidad de un lote. Las métricas transportan el tamaño del lote, la espera en cola, la latencia de procesamiento, el éxito/falla y el truncamiento. Los registros utilizan el ID de lote, el hash de evento y el ID de reproducción para ubicar una muestra controlada. No utilices el ID de evento como una etiqueta de métrica sin límite.

Paso 7: Aislar inquilinos y privacidad

Para lotes multi-inquilino, utiliza hashes irreversibles o referencias internas en Links y registros, y filtra los atributos antes de exportar. Si los niveles de seguridad no se pueden mezclar, divide el lote por inquilino o permiso para que un lector con pocos privilegios no pueda atravesar el contexto de otro inquilino.

Paso 8: Verificar consultas y fallas

Prueba una fuente única, Traces mixtos, contexto faltante, desbordamiento de enlaces, pérdida por muestreo, reintentos downstream, falla parcial, dead letters y reproducciones. Verifica que un Span de lote salte a los Traces de origen retenidos y que las métricas identifiquen lotes truncados o no muestreados.

Respuesta modelo de alta calidad

“El Span del lote utiliza el worker o scheduler como parent, y cada SpanContext del mensaje es un Link. Eso preserva el hecho de que 100 eventos causaron conjuntamente una llamada downstream sin inventar un árbol de tipo padre-hijo. Limito los enlaces y cuento los descartes, filtro atributos de inquilinos y confidenciales, y uso métricas para el tamaño del lote, espera en cola, latencia downstream, fallas y reintentos. Los registros se correlacionan con IDs de lote y de reproducción, y los lotes fallidos reciben protección de muestreo. Las pruebas cubren contexto faltante, Traces mixtos, desbordamiento y reproducción.”

Errores comunes

  • Elegir el primer mensaje como parent → causalidad falsa → usar un parent común de worker y Links para las fuentes.
  • Colocar el mensaje completo en un Link → fuga de privacidad y costo → mantener únicamente los campos saneados necesarios de baja cardinalidad.
  • Agregar Links sin límite → Span y costo de exportación ilimitados → limitar y medir el truncamiento.
  • Finalizar un Span solo en caso de éxito → las fallas y cancelaciones dejan Spans abiertos → finalizar en un bloque finally o scope.
  • Usar el ID de evento como etiqueta de métrica → explosión de cardinalidad → mantener el detalle en registros o trazas.
  • Asumir que los Links tardíos siempre afectan el muestreo → las fuentes importantes desaparecen → preparar el contexto de muestreo antes de la creación del Span.

Preguntas de seguimiento y respuestas sólidas

Pregunta de seguimiento 1: ¿Necesita un Link un lote de un solo mensaje?

Puede usar el contexto de ese mensaje como parent. Si el worker tiene un ciclo de vida independiente, un parent de worker más un Link también es válido; elije según si el lote es una operación hija directa.

Pregunta de seguimiento 2: ¿Los Links fusionan diferentes Traces?

No. Expresan relación y preservan cada TraceId. El sistema de consulta debe proporcionar navegación desde el Link hacia el Trace de origen.

Pregunta de seguimiento 3: ¿Qué fuentes sobreviven al truncamiento?

Prioriza errores, reintentos, reproducciones, inquilinos prioritarios o muestras deterministas; registra los recuentos totales y descartados. Mantener silenciosamente los primeros N introduce sesgo.

Pregunta de seguimiento 4: ¿Cómo diagnosticas un lote fallido?

Asigna IDs independientes de lote/reproducción a las fallas y reproducciones de dead letters, retén Links o resúmenes controlados de fuentes de error, e incluye el tipo de falla en las métricas.

Pregunta de seguimiento 5: ¿Puede un Link contener tenant.id?

Solo después de una revisión de acceso, cardinalidad y privacidad. La exportación entre inquilinos generalmente lo procesa con hash o lo elimina, y no debe convertirse en una etiqueta de métrica de alto volumen.

Fuentes públicas

Preguntas relacionadas