w3c_trace_context
Implementacion del estandar W3C Trace Context (headers traceparent y tracestate) para la propagacion uniforme del contexto de trazas distribuidas entre todos los microservicios del pipeline de verificacion KYC. Garantiza que una sesion de verificacion pueda rastrearse de extremo a extremo, desde la captura de selfie hasta la decision final, independientemente del lenguaje o framework de cada servicio.
When to use
Usa esta skill cuando necesites configurar o depurar la propagacion de contexto de trazas entre los microservicios del pipeline KYC. Pertenece al observability_agent y se aplica cuando hay que asegurar que el trace ID se transmite correctamente entre servicios, cuando se integran servicios nuevos al pipeline o cuando las trazas aparecen fragmentadas.
Instructions
-
Configurar OpenTelemetry para usar el propagador W3C Trace Context en el backend FastAPI:
from opentelemetry import context from opentelemetry.propagators import set_global_textmap from opentelemetry.propagate import inject, extract from opentelemetry.propagators.composite import CompositePropagator from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator from opentelemetry.baggage.propagation import W3CBaggagePropagator set_global_textmap(CompositePropagator([ TraceContextTextMapPropagator(), W3CBaggagePropagator(), ])) -
Entender la estructura del header traceparent segun el estandar W3C:
traceparent: {version}-{trace-id}-{parent-id}-{trace-flags} Ejemplo: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-01 version: 00 (version actual) trace-id: 32 hex chars - identificador unico de la traza completa parent-id: 16 hex chars - identificador del span padre trace-flags: 01 = sampled, 00 = not sampled -
Implementar middleware para extraer e inyectar el contexto en cada microservicio:
from opentelemetry.propagate import extract, inject from opentelemetry import trace from starlette.middleware.base import BaseHTTPMiddleware class TraceContextMiddleware(BaseHTTPMiddleware): async def dispatch(self, request, call_next): ctx = extract(carrier=dict(request.headers)) with trace.get_tracer("kyc-service").start_as_current_span( f"{request.method} {request.url.path}", context=ctx ): response = await call_next(request) return response -
Propagar el contexto en llamadas HTTP entre microservicios del pipeline:
import httpx from opentelemetry.propagate import inject async def call_face_match_service(session_id: str, images: dict): headers = {} inject(headers) # Inyecta traceparent y tracestate en headers async with httpx.AsyncClient() as client: response = await client.post( "http://face-match-service:8000/api/v1/compare", json={"session_id": session_id, "images": images}, headers=headers ) return response.json() -
Usar tracestate para agregar informacion especifica del pipeline KYC:
from opentelemetry.baggage import set_baggage, get_baggage # Al inicio de la verificacion, agregar contexto de negocio ctx = set_baggage("kyc.session_id", session_id) ctx = set_baggage("kyc.document_type", "passport", context=ctx) # En servicios downstream, recuperar el contexto session_id = get_baggage("kyc.session_id") -
Configurar la propagacion en servicios que usan colas de mensajes (Redis):
from opentelemetry.propagate import inject, extract # Productor: inyectar contexto en el mensaje def enqueue_antifraud_check(session_id: str, data: dict): carrier = {} inject(carrier) message = { "session_id": session_id, "data": data, "trace_context": carrier } redis_client.lpush("antifraud_queue", json.dumps(message)) # Consumidor: extraer contexto del mensaje def process_antifraud_check(message: dict): ctx = extract(carrier=message.get("trace_context", {})) with tracer.start_as_current_span("antifraud.process", context=ctx): # Procesar analisis antifraude pass -
Validar que la propagacion funciona correctamente entre todos los servicios:
# Test de integracion para verificar propagacion async def test_trace_propagation(): async with httpx.AsyncClient() as client: response = await client.post( "http://kyc-gateway:8000/api/v1/verify", json=test_payload, headers={"traceparent": "00-aaaabbbbccccddddeeeeffffaaaabbbb-1111222233334444-01"} ) # Verificar que el trace_id aparece en los logs de todos los servicios assert response.headers.get("traceresponse") is not None -
Documentar el flujo de propagacion del trace context a traves del pipeline:
Cliente -> [traceparent] -> API Gateway -> [traceparent] -> Liveness Service -> [traceparent] -> Document Processing Service -> [traceparent] -> OCR Service -> [traceparent] -> Face Match Service -> [traceparent via Redis] -> Antifraud Service -> [traceparent] -> Decision Engine
Notes
- Todos los microservicios del pipeline KYC deben usar el mismo propagador (W3C Trace Context) para evitar trazas fragmentadas; si se integra un servicio de terceros, verificar que soporte este estandar o implementar un bridge de propagacion.
- El trace ID debe incluirse en los logs estructurados de cada servicio para permitir la correlacion traces-to-logs en Grafana, vinculando logs de una sesion de verificacion con su traza completa.
- No incluir datos biometricos o PII en los campos de baggage ya que estos se propagan en texto claro en los headers HTTP; usar solo identificadores de sesion y metadatos operacionales.