jaeger
Despliega y configura Jaeger como backend de trazas distribuidas para el pipeline de verificación de identidad. Almacena, indexa y visualiza los spans generados por los microservicios KYC, permitiendo analizar el flujo completo de una verificación desde la captura de selfie hasta la decisión final. Este skill se centra en Jaeger como infraestructura de trazas, separada de la instrumentación con OpenTelemetry SDK.
When to use
Usar este skill cuando el observability_agent necesite desplegar o configurar Jaeger para recibir, almacenar y visualizar trazas distribuidas del pipeline KYC, o cuando se necesite optimizar el almacenamiento y la consulta de spans.
Instructions
Desplegar Jaeger all-in-one para desarrollo o con componentes separados para producción:
# docker-compose.yml - Desarrollo
jaeger:
image: jaegertracing/all-in-one:1.52
ports:
- "16686:16686" # UI
- "4317:4317" # OTLP gRPC
- "4318:4318" # OTLP HTTP
- "14250:14250" # gRPC collector
environment:
- COLLECTOR_OTLP_ENABLED=true
- SPAN_STORAGE_TYPE=badger
- BADGER_EPHEMERAL=false
- BADGER_DIRECTORY_VALUE=/badger/data
- BADGER_DIRECTORY_KEY=/badger/key
volumes:
- jaeger_data:/badger
Para producción, desplegar Jaeger con Elasticsearch como backend de almacenamiento:
# docker-compose-prod.yml
jaeger-collector:
image: jaegertracing/jaeger-collector:1.52
environment:
- SPAN_STORAGE_TYPE=elasticsearch
- ES_SERVER_URLS=http://elasticsearch:9200
- ES_USERNAME=elastic
- ES_PASSWORD=${ELASTIC_PASSWORD}
- ES_INDEX_PREFIX=jaeger-kyc
ports:
- "4317:4317"
- "14250:14250"
jaeger-query:
image: jaegertracing/jaeger-query:1.52
environment:
- SPAN_STORAGE_TYPE=elasticsearch
- ES_SERVER_URLS=http://elasticsearch:9200
- ES_USERNAME=elastic
- ES_PASSWORD=${ELASTIC_PASSWORD}
- ES_INDEX_PREFIX=jaeger-kyc
ports:
- "16686:16686"
Configurar el OpenTelemetry Collector como intermediario entre los servicios KYC y Jaeger:
# otel-collector-config.yaml
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
timeout: 5s
send_batch_size: 1024
attributes:
actions:
- key: kyc.pipeline
value: "identity-verification"
action: upsert
exporters:
jaeger:
endpoint: jaeger-collector:14250
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch, attributes]
exporters: [jaeger]
Configurar sampling adaptativo para controlar el volumen de trazas del pipeline KYC:
{
"service_strategies": [
{
"service": "kyc-liveness",
"type": "probabilistic",
"param": 1.0
},
{
"service": "kyc-face-match",
"type": "probabilistic",
"param": 1.0
},
{
"service": "kyc-ocr",
"type": "probabilistic",
"param": 0.5
}
],
"default_strategy": {
"type": "probabilistic",
"param": 0.1
}
}
Configurar retención y limpieza de spans en Elasticsearch:
# Crear ILM policy para spans de Jaeger
curl -X PUT "http://elasticsearch:9200/_ilm/policy/jaeger-kyc-span-policy" \
-H 'Content-Type: application/json' -d '{
"policy": {
"phases": {
"hot": { "actions": { "rollover": { "max_age": "1d", "max_size": "5GB" } } },
"delete": { "min_age": "14d", "actions": { "delete": {} } }
}
}
}'
# Ejecutar limpieza manual de spans antiguos
jaeger-es-rollover init http://elasticsearch:9200
jaeger-es-rollover rollover http://elasticsearch:9200
Configurar Jaeger como datasource en Grafana para correlación con métricas y logs:
# grafana/provisioning/datasources/jaeger.yml
apiVersion: 1
datasources:
- name: Jaeger
type: jaeger
access: proxy
url: http://jaeger-query:16686
jsonData:
tracesToLogsV2:
datasourceUid: loki
filterByTraceID: true
filterBySpanID: true
tracesToMetrics:
datasourceUid: prometheus
queries:
- name: "Request duration"
query: "kyc_verification_duration_seconds_bucket{$$__tags}"
Verificar que Jaeger está recibiendo trazas del pipeline KYC:
# Verificar servicios registrados
curl -s "http://localhost:16686/api/services" | jq .
# Buscar trazas de un servicio específico
curl -s "http://localhost:16686/api/traces?service=kyc-face-match&limit=5" | jq '.data[0].spans | length'
# Buscar una traza por trace_id
curl -s "http://localhost:16686/api/traces/{trace_id}" | jq '.data[0].spans[] | {operationName, duration}'
Notes
- En producción, usar sampling rate de 1.0 (100%) para los módulos críticos de seguridad (liveness, face_match) para garantizar trazabilidad completa de decisiones; módulos menos críticos como OCR pueden usar sampling reducido.
- La retención de 14 días para spans es adecuada para debugging operacional; para requisitos de auditoría, los datos relevantes deben extraerse y almacenarse en el sistema de logs de auditoría con retención de 1 año.
- Jaeger UI permite visualizar el flujo completo de una verificación KYC como un trace waterfall, mostrando la latencia de cada módulo (liveness, OCR, face_match, antifraud, decision) y facilitando la identificación de cuellos de botella.
1---2name: jaeger3description: Jaeger como backend de trazas distribuidas para almacenar y visualizar spans del pipeline de verificación KYC.4---56# jaeger78Despliega y configura Jaeger como backend de trazas distribuidas para el pipeline de verificación de identidad. Almacena, indexa y visualiza los spans generados por los microservicios KYC, permitiendo analizar el flujo completo de una verificación desde la captura de selfie hasta la decisión final. Este skill se centra en Jaeger como infraestructura de trazas, separada de la instrumentación con OpenTelemetry SDK.910## When to use1112Usar este skill cuando el observability_agent necesite desplegar o configurar Jaeger para recibir, almacenar y visualizar trazas distribuidas del pipeline KYC, o cuando se necesite optimizar el almacenamiento y la consulta de spans.1314## Instructions15161. Desplegar Jaeger all-in-one para desarrollo o con componentes separados para producción:17 ```yaml18 # docker-compose.yml - Desarrollo19 jaeger:20 image: jaegertracing/all-in-one:1.5221 ports:22 - "16686:16686" # UI23 - "4317:4317" # OTLP gRPC24 - "4318:4318" # OTLP HTTP25 - "14250:14250" # gRPC collector26 environment:27 - COLLECTOR_OTLP_ENABLED=true28 - SPAN_STORAGE_TYPE=badger29 - BADGER_EPHEMERAL=false30 - BADGER_DIRECTORY_VALUE=/badger/data31 - BADGER_DIRECTORY_KEY=/badger/key32 volumes:33 - jaeger_data:/badger34 ```35362. Para producción, desplegar Jaeger con Elasticsearch como backend de almacenamiento:37 ```yaml38 # docker-compose-prod.yml39 jaeger-collector:40 image: jaegertracing/jaeger-collector:1.5241 environment:42 - SPAN_STORAGE_TYPE=elasticsearch43 - ES_SERVER_URLS=http://elasticsearch:920044 - ES_USERNAME=elastic45 - ES_PASSWORD=${ELASTIC_PASSWORD}46 - ES_INDEX_PREFIX=jaeger-kyc47 ports:48 - "4317:4317"49 - "14250:14250"5051 jaeger-query:52 image: jaegertracing/jaeger-query:1.5253 environment:54 - SPAN_STORAGE_TYPE=elasticsearch55 - ES_SERVER_URLS=http://elasticsearch:920056 - ES_USERNAME=elastic57 - ES_PASSWORD=${ELASTIC_PASSWORD}58 - ES_INDEX_PREFIX=jaeger-kyc59 ports:60 - "16686:16686"61 ```62633. Configurar el OpenTelemetry Collector como intermediario entre los servicios KYC y Jaeger:64 ```yaml65 # otel-collector-config.yaml66 receivers:67 otlp:68 protocols:69 grpc:70 endpoint: 0.0.0.0:431771 http:72 endpoint: 0.0.0.0:43187374 processors:75 batch:76 timeout: 5s77 send_batch_size: 102478 attributes:79 actions:80 - key: kyc.pipeline81 value: "identity-verification"82 action: upsert8384 exporters:85 jaeger:86 endpoint: jaeger-collector:1425087 tls:88 insecure: true8990 service:91 pipelines:92 traces:93 receivers: [otlp]94 processors: [batch, attributes]95 exporters: [jaeger]96 ```97984. Configurar sampling adaptativo para controlar el volumen de trazas del pipeline KYC:99 ```json100 {101 "service_strategies": [102 {103 "service": "kyc-liveness",104 "type": "probabilistic",105 "param": 1.0106 },107 {108 "service": "kyc-face-match",109 "type": "probabilistic",110 "param": 1.0111 },112 {113 "service": "kyc-ocr",114 "type": "probabilistic",115 "param": 0.5116 }117 ],118 "default_strategy": {119 "type": "probabilistic",120 "param": 0.1121 }122 }123 ```1241255. Configurar retención y limpieza de spans en Elasticsearch:126 ```bash127 # Crear ILM policy para spans de Jaeger128 curl -X PUT "http://elasticsearch:9200/_ilm/policy/jaeger-kyc-span-policy" \129 -H 'Content-Type: application/json' -d '{130 "policy": {131 "phases": {132 "hot": { "actions": { "rollover": { "max_age": "1d", "max_size": "5GB" } } },133 "delete": { "min_age": "14d", "actions": { "delete": {} } }134 }135 }136 }'137138 # Ejecutar limpieza manual de spans antiguos139 jaeger-es-rollover init http://elasticsearch:9200140 jaeger-es-rollover rollover http://elasticsearch:9200141 ```1421436. Configurar Jaeger como datasource en Grafana para correlación con métricas y logs:144 ```yaml145 # grafana/provisioning/datasources/jaeger.yml146 apiVersion: 1147 datasources:148 - name: Jaeger149 type: jaeger150 access: proxy151 url: http://jaeger-query:16686152 jsonData:153 tracesToLogsV2:154 datasourceUid: loki155 filterByTraceID: true156 filterBySpanID: true157 tracesToMetrics:158 datasourceUid: prometheus159 queries:160 - name: "Request duration"161 query: "kyc_verification_duration_seconds_bucket{$$__tags}"162 ```1631647. Verificar que Jaeger está recibiendo trazas del pipeline KYC:165 ```bash166 # Verificar servicios registrados167 curl -s "http://localhost:16686/api/services" | jq .168169 # Buscar trazas de un servicio específico170 curl -s "http://localhost:16686/api/traces?service=kyc-face-match&limit=5" | jq '.data[0].spans | length'171172 # Buscar una traza por trace_id173 curl -s "http://localhost:16686/api/traces/{trace_id}" | jq '.data[0].spans[] | {operationName, duration}'174 ```175176## Notes177178- En producción, usar sampling rate de 1.0 (100%) para los módulos críticos de seguridad (liveness, face_match) para garantizar trazabilidad completa de decisiones; módulos menos críticos como OCR pueden usar sampling reducido.179- La retención de 14 días para spans es adecuada para debugging operacional; para requisitos de auditoría, los datos relevantes deben extraerse y almacenarse en el sistema de logs de auditoría con retención de 1 año.180- Jaeger UI permite visualizar el flujo completo de una verificación KYC como un trace waterfall, mostrando la latencia de cada módulo (liveness, OCR, face_match, antifraud, decision) y facilitando la identificación de cuellos de botella.