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.
1---2name: w3c-trace-context3description: Estandar W3C Trace Context para propagacion de trazas entre microservicios KYC4---56# w3c_trace_context78Implementacion 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.910## When to use1112Usa 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.1314## Instructions15161. Configurar OpenTelemetry para usar el propagador W3C Trace Context en el backend FastAPI:17 ```python18 from opentelemetry import context19 from opentelemetry.propagators import set_global_textmap20 from opentelemetry.propagate import inject, extract21 from opentelemetry.propagators.composite import CompositePropagator22 from opentelemetry.trace.propagation.tracecontext import TraceContextTextMapPropagator23 from opentelemetry.baggage.propagation import W3CBaggagePropagator2425 set_global_textmap(CompositePropagator([26 TraceContextTextMapPropagator(),27 W3CBaggagePropagator(),28 ]))29 ```30312. Entender la estructura del header traceparent segun el estandar W3C:32 ```33 traceparent: {version}-{trace-id}-{parent-id}-{trace-flags}34 Ejemplo: 00-4bf92f3577b34da6a3ce929d0e0e4736-00f067aa0ba902b7-013536 version: 00 (version actual)37 trace-id: 32 hex chars - identificador unico de la traza completa38 parent-id: 16 hex chars - identificador del span padre39 trace-flags: 01 = sampled, 00 = not sampled40 ```41423. Implementar middleware para extraer e inyectar el contexto en cada microservicio:43 ```python44 from opentelemetry.propagate import extract, inject45 from opentelemetry import trace46 from starlette.middleware.base import BaseHTTPMiddleware4748 class TraceContextMiddleware(BaseHTTPMiddleware):49 async def dispatch(self, request, call_next):50 ctx = extract(carrier=dict(request.headers))51 with trace.get_tracer("kyc-service").start_as_current_span(52 f"{request.method} {request.url.path}",53 context=ctx54 ):55 response = await call_next(request)56 return response57 ```58594. Propagar el contexto en llamadas HTTP entre microservicios del pipeline:60 ```python61 import httpx62 from opentelemetry.propagate import inject6364 async def call_face_match_service(session_id: str, images: dict):65 headers = {}66 inject(headers) # Inyecta traceparent y tracestate en headers67 async with httpx.AsyncClient() as client:68 response = await client.post(69 "http://face-match-service:8000/api/v1/compare",70 json={"session_id": session_id, "images": images},71 headers=headers72 )73 return response.json()74 ```75765. Usar tracestate para agregar informacion especifica del pipeline KYC:77 ```python78 from opentelemetry.baggage import set_baggage, get_baggage7980 # Al inicio de la verificacion, agregar contexto de negocio81 ctx = set_baggage("kyc.session_id", session_id)82 ctx = set_baggage("kyc.document_type", "passport", context=ctx)8384 # En servicios downstream, recuperar el contexto85 session_id = get_baggage("kyc.session_id")86 ```87886. Configurar la propagacion en servicios que usan colas de mensajes (Redis):89 ```python90 from opentelemetry.propagate import inject, extract9192 # Productor: inyectar contexto en el mensaje93 def enqueue_antifraud_check(session_id: str, data: dict):94 carrier = {}95 inject(carrier)96 message = {97 "session_id": session_id,98 "data": data,99 "trace_context": carrier100 }101 redis_client.lpush("antifraud_queue", json.dumps(message))102103 # Consumidor: extraer contexto del mensaje104 def process_antifraud_check(message: dict):105 ctx = extract(carrier=message.get("trace_context", {}))106 with tracer.start_as_current_span("antifraud.process", context=ctx):107 # Procesar analisis antifraude108 pass109 ```1101117. Validar que la propagacion funciona correctamente entre todos los servicios:112 ```python113 # Test de integracion para verificar propagacion114 async def test_trace_propagation():115 async with httpx.AsyncClient() as client:116 response = await client.post(117 "http://kyc-gateway:8000/api/v1/verify",118 json=test_payload,119 headers={"traceparent": "00-aaaabbbbccccddddeeeeffffaaaabbbb-1111222233334444-01"}120 )121 # Verificar que el trace_id aparece en los logs de todos los servicios122 assert response.headers.get("traceresponse") is not None123 ```1241258. Documentar el flujo de propagacion del trace context a traves del pipeline:126 ```127 Cliente -> [traceparent] -> API Gateway128 -> [traceparent] -> Liveness Service129 -> [traceparent] -> Document Processing Service130 -> [traceparent] -> OCR Service131 -> [traceparent] -> Face Match Service132 -> [traceparent via Redis] -> Antifraud Service133 -> [traceparent] -> Decision Engine134 ```135136## Notes137138- 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.139- 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.140- 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.