opentelemetry_sdk
Implementa el SDK de OpenTelemetry en el código Python del pipeline de verificación de identidad para instrumentación unificada de métricas, trazas y logs. Proporciona una API estándar y vendor-neutral que permite enviar telemetría a múltiples backends (Prometheus, Jaeger, Loki) sin acoplamiento directo. Este skill se centra en la instrumentación del código, separada del backend de trazas Jaeger.
When to use
Usar este skill cuando el observability_agent necesite instrumentar los servicios Python del pipeline KYC con OpenTelemetry, configurar exporters, o añadir spans y métricas personalizadas al código de verificación.
Instructions
Instalar las dependencias de OpenTelemetry necesarias para el pipeline KYC:
pip install opentelemetry-api \
opentelemetry-sdk \
opentelemetry-instrumentation-fastapi \
opentelemetry-instrumentation-httpx \
opentelemetry-instrumentation-logging \
opentelemetry-exporter-otlp-proto-grpc \
opentelemetry-exporter-prometheus
Configurar el proveedor de trazas con exportador OTLP para enviar spans al collector:
from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.resources import Resource
resource = Resource.create({
"service.name": "kyc-face-match",
"service.version": "1.0.0",
"deployment.environment": "production",
"service.namespace": "kyc-pipeline"
})
tracer_provider = TracerProvider(resource=resource)
otlp_exporter = OTLPSpanExporter(endpoint="http://otel-collector:4317", insecure=True)
tracer_provider.add_span_processor(BatchSpanProcessor(otlp_exporter))
trace.set_tracer_provider(tracer_provider)
Configurar el proveedor de métricas con exportador Prometheus:
from opentelemetry import metrics
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.exporter.prometheus import PrometheusMetricReader
prometheus_reader = PrometheusMetricReader()
meter_provider = MeterProvider(resource=resource, metric_readers=[prometheus_reader])
metrics.set_meter_provider(meter_provider)
meter = metrics.get_meter("kyc-pipeline")
verification_counter = meter.create_counter(
"kyc.verifications.total",
description="Total de verificaciones procesadas"
)
verification_duration = meter.create_histogram(
"kyc.verification.duration",
unit="s",
description="Duración de la verificación"
)
Instrumentar automáticamente FastAPI y las llamadas HTTP entre servicios:
from fastapi import FastAPI
from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor
from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor
app = FastAPI(title="KYC Face Match Service")
FastAPIInstrumentor.instrument_app(app)
HTTPXClientInstrumentor().instrument()
Añadir spans personalizados para operaciones críticas del pipeline KYC:
from opentelemetry import trace
tracer = trace.get_tracer("kyc.face_match")
async def compare_faces(selfie_embedding, document_embedding):
with tracer.start_as_current_span("face_comparison") as span:
span.set_attribute("kyc.module", "face_match")
span.set_attribute("kyc.embedding_dimension", len(selfie_embedding))
similarity = cosine_similarity(selfie_embedding, document_embedding)
span.set_attribute("kyc.confidence_score", similarity)
span.set_attribute("kyc.threshold", 0.85)
span.set_attribute("kyc.decision", "match" if similarity > 0.85 else "no_match")
if similarity < 0.85:
span.set_status(trace.Status(trace.StatusCode.OK))
span.add_event("face_mismatch_detected", {
"similarity": similarity,
"threshold": 0.85
})
return similarity
Configurar la propagación de contexto para mantener las trazas entre servicios:
from opentelemetry.propagate import set_global_textmap
from opentelemetry.propagators.composite import CompositePropagator
from opentelemetry.propagators.b3 import B3MultiFormat
from opentelemetry.trace.propagation import TraceContextTextMapPropagator
set_global_textmap(CompositePropagator([
TraceContextTextMapPropagator(),
B3MultiFormat()
]))
Integrar OpenTelemetry con el logging existente para correlación automática:
from opentelemetry.instrumentation.logging import LoggingInstrumentor
import logging
LoggingInstrumentor().instrument(set_logging_format=True)
logging.basicConfig(
format="%(asctime)s %(levelname)s [%(name)s] [trace_id=%(otelTraceID)s span_id=%(otelSpanID)s] %(message)s",
level=logging.INFO
)
logger = logging.getLogger("kyc-pipeline")
Crear un módulo de inicialización reutilizable para todos los servicios del pipeline:
# shared/telemetry.py
def init_telemetry(service_name: str, otlp_endpoint: str = "http://otel-collector:4317"):
"""Inicializa OpenTelemetry para un servicio del pipeline KYC."""
resource = Resource.create({"service.name": service_name, "service.namespace": "kyc-pipeline"})
# Traces
tracer_provider = TracerProvider(resource=resource)
tracer_provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter(endpoint=otlp_endpoint, insecure=True)))
trace.set_tracer_provider(tracer_provider)
# Metrics
prometheus_reader = PrometheusMetricReader()
meter_provider = MeterProvider(resource=resource, metric_readers=[prometheus_reader])
metrics.set_meter_provider(meter_provider)
# Logging
LoggingInstrumentor().instrument(set_logging_format=True)
return trace.get_tracer(service_name), metrics.get_meter(service_name)
Notes
- Usar la auto-instrumentación de FastAPI y httpx reduce significativamente el código manual necesario; los spans de HTTP requests/responses se generan automáticamente con latencias, status codes y headers relevantes.
- Los atributos de span personalizados (kyc.confidence_score, kyc.module, kyc.decision) son esenciales para poder filtrar y analizar trazas específicas del pipeline de verificación en Jaeger o Grafana Tempo.
- Nunca incluir datos biométricos (embeddings, imágenes) como atributos de span; limitar los atributos a metadatos operacionales (scores, decisiones, duraciones) para cumplir con GDPR/LOPD.
1---2name: opentelemetry-sdk3description: SDK de OpenTelemetry para instrumentación unificada de métricas, trazas y logs del pipeline KYC en Python.4---56# opentelemetry_sdk78Implementa el SDK de OpenTelemetry en el código Python del pipeline de verificación de identidad para instrumentación unificada de métricas, trazas y logs. Proporciona una API estándar y vendor-neutral que permite enviar telemetría a múltiples backends (Prometheus, Jaeger, Loki) sin acoplamiento directo. Este skill se centra en la instrumentación del código, separada del backend de trazas Jaeger.910## When to use1112Usar este skill cuando el observability_agent necesite instrumentar los servicios Python del pipeline KYC con OpenTelemetry, configurar exporters, o añadir spans y métricas personalizadas al código de verificación.1314## Instructions15161. Instalar las dependencias de OpenTelemetry necesarias para el pipeline KYC:1718 ```bash19 pip install opentelemetry-api \20 opentelemetry-sdk \21 opentelemetry-instrumentation-fastapi \22 opentelemetry-instrumentation-httpx \23 opentelemetry-instrumentation-logging \24 opentelemetry-exporter-otlp-proto-grpc \25 opentelemetry-exporter-prometheus26 ```27282. Configurar el proveedor de trazas con exportador OTLP para enviar spans al collector:2930 ```python31 from opentelemetry import trace32 from opentelemetry.sdk.trace import TracerProvider33 from opentelemetry.sdk.trace.export import BatchSpanProcessor34 from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter35 from opentelemetry.sdk.resources import Resource3637 resource = Resource.create({38 "service.name": "kyc-face-match",39 "service.version": "1.0.0",40 "deployment.environment": "production",41 "service.namespace": "kyc-pipeline"42 })4344 tracer_provider = TracerProvider(resource=resource)45 otlp_exporter = OTLPSpanExporter(endpoint="http://otel-collector:4317", insecure=True)46 tracer_provider.add_span_processor(BatchSpanProcessor(otlp_exporter))47 trace.set_tracer_provider(tracer_provider)48 ```49503. Configurar el proveedor de métricas con exportador Prometheus:5152 ```python53 from opentelemetry import metrics54 from opentelemetry.sdk.metrics import MeterProvider55 from opentelemetry.exporter.prometheus import PrometheusMetricReader5657 prometheus_reader = PrometheusMetricReader()58 meter_provider = MeterProvider(resource=resource, metric_readers=[prometheus_reader])59 metrics.set_meter_provider(meter_provider)6061 meter = metrics.get_meter("kyc-pipeline")62 verification_counter = meter.create_counter(63 "kyc.verifications.total",64 description="Total de verificaciones procesadas"65 )66 verification_duration = meter.create_histogram(67 "kyc.verification.duration",68 unit="s",69 description="Duración de la verificación"70 )71 ```72734. Instrumentar automáticamente FastAPI y las llamadas HTTP entre servicios:7475 ```python76 from fastapi import FastAPI77 from opentelemetry.instrumentation.fastapi import FastAPIInstrumentor78 from opentelemetry.instrumentation.httpx import HTTPXClientInstrumentor7980 app = FastAPI(title="KYC Face Match Service")81 FastAPIInstrumentor.instrument_app(app)82 HTTPXClientInstrumentor().instrument()83 ```84855. Añadir spans personalizados para operaciones críticas del pipeline KYC:8687 ```python88 from opentelemetry import trace8990 tracer = trace.get_tracer("kyc.face_match")9192 async def compare_faces(selfie_embedding, document_embedding):93 with tracer.start_as_current_span("face_comparison") as span:94 span.set_attribute("kyc.module", "face_match")95 span.set_attribute("kyc.embedding_dimension", len(selfie_embedding))9697 similarity = cosine_similarity(selfie_embedding, document_embedding)9899 span.set_attribute("kyc.confidence_score", similarity)100 span.set_attribute("kyc.threshold", 0.85)101 span.set_attribute("kyc.decision", "match" if similarity > 0.85 else "no_match")102103 if similarity < 0.85:104 span.set_status(trace.Status(trace.StatusCode.OK))105 span.add_event("face_mismatch_detected", {106 "similarity": similarity,107 "threshold": 0.85108 })109110 return similarity111 ```1121136. Configurar la propagación de contexto para mantener las trazas entre servicios:114115 ```python116 from opentelemetry.propagate import set_global_textmap117 from opentelemetry.propagators.composite import CompositePropagator118 from opentelemetry.propagators.b3 import B3MultiFormat119 from opentelemetry.trace.propagation import TraceContextTextMapPropagator120121 set_global_textmap(CompositePropagator([122 TraceContextTextMapPropagator(),123 B3MultiFormat()124 ]))125 ```1261277. Integrar OpenTelemetry con el logging existente para correlación automática:128129 ```python130 from opentelemetry.instrumentation.logging import LoggingInstrumentor131 import logging132133 LoggingInstrumentor().instrument(set_logging_format=True)134135 logging.basicConfig(136 format="%(asctime)s %(levelname)s [%(name)s] [trace_id=%(otelTraceID)s span_id=%(otelSpanID)s] %(message)s",137 level=logging.INFO138 )139 logger = logging.getLogger("kyc-pipeline")140 ```1411428. Crear un módulo de inicialización reutilizable para todos los servicios del pipeline:143144 ```python145 # shared/telemetry.py146 def init_telemetry(service_name: str, otlp_endpoint: str = "http://otel-collector:4317"):147 """Inicializa OpenTelemetry para un servicio del pipeline KYC."""148 resource = Resource.create({"service.name": service_name, "service.namespace": "kyc-pipeline"})149150 # Traces151 tracer_provider = TracerProvider(resource=resource)152 tracer_provider.add_span_processor(BatchSpanProcessor(OTLPSpanExporter(endpoint=otlp_endpoint, insecure=True)))153 trace.set_tracer_provider(tracer_provider)154155 # Metrics156 prometheus_reader = PrometheusMetricReader()157 meter_provider = MeterProvider(resource=resource, metric_readers=[prometheus_reader])158 metrics.set_meter_provider(meter_provider)159160 # Logging161 LoggingInstrumentor().instrument(set_logging_format=True)162163 return trace.get_tracer(service_name), metrics.get_meter(service_name)164 ```165166## Notes167168- Usar la auto-instrumentación de FastAPI y httpx reduce significativamente el código manual necesario; los spans de HTTP requests/responses se generan automáticamente con latencias, status codes y headers relevantes.169- Los atributos de span personalizados (kyc.confidence_score, kyc.module, kyc.decision) son esenciales para poder filtrar y analizar trazas específicas del pipeline de verificación en Jaeger o Grafana Tempo.170- Nunca incluir datos biométricos (embeddings, imágenes) como atributos de span; limitar los atributos a metadatos operacionales (scores, decisiones, duraciones) para cumplir con GDPR/LOPD.