OpenTelemetry
- monitoreo
- OpenTelemetry
-
[What is OpenTelemetry? OpenTelemetry](https://opentelemetry.io/docs/what-is-opentelemetry/) -
[Docker deployment OpenTelemetry](https://opentelemetry.io/docs/demo/docker-deployment/)
OpenTelemetry es un estándar abierto para la generación, recolección, procesamiento y exportación de telemetría (métricas, trazas y logs). Unifica el ecosistema de observabilidad proporcionando APIs, SDKs, agentes y un Collector capaz de trabajar con múltiples protocolos y backends.
Su objetivo principal es eliminar la dependencia del proveedor, simplificar la observabilidad y adoptar un modelo consistente para aplicaciones distribuidas (microservicios, contenedores, serverless, etc.).
Conceptos Fundamentales de OpenTelemetry
Signals de Telemetría
OpenTelemetry trabaja con tres tipos principales de señales:
- Trazas (Traces)
Representan el recorrido de una petición a través de varios servicios.- Span: unidad mínima de una traza.
- Trace ID: correlación completa de la solicitud.
-
Métricas (Metrics)
Valores numéricos y agregables para medir estado del sistema.
Ej.: latencia, uso de CPU, throughput. - Logs
Registros semiestructurados con contexto adicional, integrados ahora en el pipeline estándar del Collector.
Componentes Clave
-
APIs y SDKs
Incorporados en tu aplicación para instrumentar código en lenguajes como Java, Go, Python, JS, .NET, Rust, PHP, etc. -
Auto-Instrumentación
Inserta automáticamente spans, métricas y logs sin modificar código (cuando el lenguaje lo soporta). - OpenTelemetry Collector
Un servicio altamente configurable que:- Recibe telemetría.
- La procesa mediante pipelines.
- La exporta a backends como Jaeger, Prometheus, Grafana Tempo, Loki, Elastic, Datadog, etc.
- Protocolo OTLP
Formato estándar (HTTP/gRPC) para enviar telemetría entre servicios y Collector.
Ventajas Clave
-
Neutralidad frente a proveedores
Se integra con cualquier backend de análisis y almacenamiento. - Escalabilidad y Flexibilidad
Puede desplegarse como:- Agent: en cada host/sidecar.
- Gateway: centralizado.
- Híbrido.
- Configuración Declarativa
Pipelines que permiten:- Filtración
- Enriquecimiento con atributos
- Transformaciones con Processors
- Sampling avanzado
- Estandarización del Ecosistema
Reducción del acoplamiento con agentes propietarios.
Arquitectura General
Servicio → SDK/Auto-Inst → Collector → Procesamiento → Backend
- Las aplicaciones generan telemetría.
- El Collector unifica toda la gestión.
- La exportación es modular y reemplazable sin cambiar el código de la aplicación.
Proceso Completo de Gestión de Logs con OpenTelemetry
La gestión de logs con OTel se integra en un pipeline unificado junto con métricas y trazas.
- Instrumentación y Recolección
- SDKs o auto-instrumentación generan logs con contexto de trazas (trace_id, span_id).
- Receivers del Collector aceptan logs desde:
- OTLP
- FluentBit / Fluentd
- Syslog
- Filelog receiver (lectura directa de archivos)
- Centralización e Indexación
- El Collector consolida todos los logs.
- Permite normalización previa a enviarlos a backends como:
- Loki
- Elastic
- Splunk
- ClickHouse
- S3 (archiving)
- Procesamiento y Análisis
- Transform Processor para enriquecer entradas.
- Attribute Processor para limpiar/renombrar.
- Groupby / batch / filter para control de volumen.
- Correlation: une traces ↔ logs ↔ métricas.
- Monitoreo y Alertas
- Los logs se visualizan y correlacionan con dashboards y reglas de alerta externas.
- Dashboards
- Dashboards en Grafana, Kibana u otros backends.
- Integración nativa con Prometheus para métricas.
Despliegue de OpenTelemetry con Docker
Desplegar el Collector con Docker proporciona un entorno reproducible y portable.
Ejemplo de Configuración del Collector
Crear un archivo otel-collector-config.yaml:
receivers:
otlp:
protocols:
grpc:
http:
filelog:
include: ["/var/log/*.log"]
start_at: beginning
processors:
batch:
timeout: 5s
transient_error_removal: true
attributes:
actions:
- key: service.environment
value: "production"
action: upsert
resource:
attributes:
- key: host.name
action: insert
transform:
log_statements:
- context: log
statements:
- replace(match(attributes["level"], "warn"), attributes["level"], "warning")
exporters:
logging:
loglevel: debug
prometheus:
endpoint: "0.0.0.0:8889"
otlphttp:
endpoint: "http://localhost:4318"
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [logging]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [prometheus]
logs:
receivers: [otlp, filelog]
processors: [batch, attributes, transform]
exporters: [logging]
`
Ejecutar el Collector con Docker
docker run -p 4317:4317 -p 4318:4318 -p 8889:8889 \
-v $(pwd)/otel-collector-config.yaml:/etc/otel/config.yaml \
otel/opentelemetry-collector:latest \
--config=/etc/otel/config.yaml
Docker Compose (Collector + Sistema Extensible)
Archivo docker-compose.yml:
version: '3'
services:
otel-collector:
image: otel/opentelemetry-collector:latest
container_name: otel-collector
volumes:
- ./otel-collector-config.yaml:/etc/otel/config.yaml
command: ["--config=/etc/otel/config.yaml"]
ports:
- "4317:4317" # OTLP gRPC
- "4318:4318" # OTLP HTTP
- "8889:8889" # Prometheus exporter
jaeger:
image: jaegertracing/all-in-one
ports:
- "16686:16686"
- "14250:14250"
Lanzar los servicios:
docker compose up -d
Casos de Uso Relevantes
- Observabilidad completa de microservicios.
- Monitoreo para entornos Kubernetes mediante auto-instrumentación y agentes.
- Obtención de telemetría para API Gateways, Service Mesh (Istio/Envoy), Sidecars.
- Uso en pipelines de seguridad (detección de outliers mediante logs).
- Unificación de telemetría en sistemas multi-backend.
Buenas Prácticas
- Usar OTLP siempre que sea posible (estándar moderno).
- Mantener Collector separado del plano de aplicación.
- Aplicar sampling avanzado para reducir costos en traces.
- Versionar los pipelines del Collector.
- Añadir atributos consistentes (service.name, env, version).
Prácticas Recomendadas para Pipelines de OpenTelemetry Collector
Introducción
Esta nota recopila prácticas recomendadas para diseñar pipelines sólidos en el OpenTelemetry Collector, asegurando recolección confiable, escalabilidad global, gobernanza del flujo de datos y compatibilidad en arquitecturas complejas (service mesh, multi-región, multi-nube y despliegues progresivos).
Los pipelines siguen la estructura:
receivers → processors → exporters
Principios Generales de Diseño
- Pipelines cortos y especializados (evitar pipelines “todo en uno”).
- Separar pipelines por tipo de señal: logs, métricas, traces.
- Mantener configuraciones modulares usando
include,yaml anchorso toolings. - Minimizar parsers complejos en el Collector (hacerlo antes si es posible).
- Estrategia de redudancia: al menos 2 collectors por zona/region.
- Diseñar con backpressure awareness (cola, batch, memory_limiter).
Receivers: Buenas Prácticas
Configuración recomendada
- Usar OTLP gRPC como protocolo principal (más eficiente que HTTP).
- Habilitar TLS siempre que sea posible.
- Mantener puertos dedicados por señal.
- Evitar receptores experimentales en producción.
Recomendaciones clave
- Separar receivers por servicio/entorno (dev/stage/prod).
- En service mesh, usar sidecar o gateway (ingestión por agente local).
- Para logs, preferir receivers nativos (filelog, journald, docker).
Processors: Prácticas Recomendadas
Los processors son el corazón del pipeline. Las prácticas más importantes:
Processors esenciales a incluir
batch: casi obligatorio en producción.memory_limiter: evitar OOM y caídas.attributes: enmascarar datos sensibles.resource: añadir metadata (cluster, región, servicio).filter: para higiene y eliminación de ruido.transform: normalización avanzada (OTTL).
Orden recomendado
memory_limiter → batch → transform → resource → attributes → filter
Estándares
- Normalizar nombres de servicios antes de exportar.
- Eliminar trazas ruidosas (health checks repetitivos).
- Enriquecer con etiquetas obligatorias:
cloud.regionk8s.cluster.namedeployment.environmentservice.version
Exporters: Buenas Prácticas
Reglas generales
- Exportar a múltiples backends sólo mediante pipelines separados (no mezclar).
- Evitar exporters que carezcan de capacidades de reintento.
- Usar OTLP como formato estándar hacia data-lakes o collectors centrales.
Patrones de exportación
- Local → Gateway → Backend
- Local → Gateway → Enriquecimiento → Multiples destinos
- Multi-región con failover automático (OTLP multi-endpoint)
Exporters recomendados
- OTLP exporter (estándar)
- Prometheus exporter (para métricas)
- Loki export vía gateway intermedio
- Kafka exporter para arquitecturas streaming-first
Pipelines en Service Mesh (Istio/Linkerd)
Recomendaciones
- Recibir telemetría directamente desde sidecars.
- Filtrar tráfico interno no relevante (pings, probes).
- Enriquecer con etiquetas del mesh:
mesh.traffic.directionmesh.source_workloadmesh.destination_workload
Procesamiento estándar
- Normalizar trazas duplicadas generadas por sidecars.
- Correlación automática entre spans de mesh y spans de app.
Pipelines Multi-Región / Multi-Cluster
Arquitectura recomendada
Agente Local (Pod/VM)
→ Collector Regional
→ Collector Global
→ Backend(s)
`
Buenas prácticas
- Exportación regional → corte por región, no global.
- Enriquecer con
cloud.region,k8s.cluster.name. - Rollouts graduales de pipelines:
- Región secundaria
- Región menos crítica
- Región principal
Mesh multi-cluster
- Alinear nombres de servicios entre clusters para evitar cardinalidad infinita.
- Normalizar latencias entre clusters.
Pipelines para Canary Releases
Objetivos
- Observar versiones canary vs stable en paralelo.
- Validar latencia, errores y throughput por versión.
Prácticas recomendadas
- Añadir atributo
service.versionodeployment.version. - Filtrado avanzado por versión usando OTTL:
processors:
filter/canary:
traces:
include:
match_type: strict
attributes:
service.version: "canary"
```
- Exportadores distintos:
- Canary → backend temporal
- Estable → backend principal
- Activar comparación automática en dashboards.
---
## Pipelines con Enriquecimiento Avanzado (OTTL)
### Casos de uso
- Reducción de cardinalidad en métricas.
- Limpieza de logs sensibles.
- Reglas para mover atributos entre signals.
### Ejemplo de regla OTTL
```yaml
- set(attributes["http.method"], "REDACTED") where attributes["http.method"] == "TRACE"
`
Gobernanza y Control de Calidad del Pipeline
Prácticas esenciales
- Versionar configuraciones del Collector como IaC.
- Tests automatizados de configuración (Conftest, OPA).
- Validaciones de schema OTEL vía CI.
-
No aplicar nuevas reglas sin:
- Canary interno del Collector
- Métricas de fallback
- Pruebas de compatibilidad
Monitorizar el Collector mismo
- CPU, memoria, dropped spans/logs/metrics.
- Export failures.
- Queue length.
- Latencias internas.
Seguridad
- TLS obligatorio entre agentes y collectors.
- Firmar binarios del collector.
-
Sanitizar logs automáticamente:
- Tokens
- Emails
- IPs sensibles
-
Aislar collectors por función:
- Ingestión
- Procesamiento pesado
- Exportación
Ejemplos de Arquitecturas Recomendadas
1. Pipeline Complejo Estándar
Agent (host/app)
→ Collector Local
→ Processor: batch, attributes, transform
→ Collector Global
→ Exporters: Prometheus, Jaeger, Loki, Kafka
2. Service Mesh + Multi-Cluster
Sidecars Istio
→ Node Agent
→ Cluster Collector
→ Global Collector
3. Canary vs Stable
Local Collector
→ Pipeline A (stable)
→ Pipeline B (canary)
→ Backends separados
Checklist Final de Mejores Prácticas
- Separar pipelines por señal.
- Always-on processors:
memory_limiter+batch. - Normalización estricta de recursos.
- Filtrar ruido (health checks, tráficos internos).
- Exportar con OTLP siempre que sea posible.
- Multi-región escalonado.
- Pipelines paralelos para canary.
- Validar collectors con tests y canaries.
- Monitorear el propio collector.
- Documentar el flujo completo (Mermaid).
OpenTelemetry — Conceptos Avanzados y Arquitectura Profunda
Modelo de Arquitectura Avanzada
OpenTelemetry proporciona distintos patrones de despliegue según el tipo de carga, topología y madurez de la observabilidad. Estos patrones se combinan para asegurar resiliencia y minimizar el acoplamiento.
Patrones de Despliegue
- Collector como Gateway Único
- Todos los servicios envían telemetría a un Collector central.
- Ideal para entornos con control de latencia y un solo dominio de red.
- Collector como Sidecar
- Un Collector por servicio o pod.
- Garantiza aislamiento, reduce overhead en la aplicación y permite procesar localmente.
- Collector por Nodo (Node Agent)
- Muy común en Kubernetes.
- Ideal para recolectar métricas del host, logs de nodos y telemetría de contenedores.
- Híbrido
- Combinación de sidecars + gateway centralizado.
- Da resiliencia y reducción de cargas hacia el backend.
OpenTelemetry y Service Mesh
Service Mesh (como Istio, Linkerd, Consul) transforma la forma de generar telemetría:
- Los proxies (Envoy) generan:
- Métricas (latencia, errores, throughput)
- Spans automáticos de solicitudes entre servicios
- Logs de acceso enriquecidos
- OpenTelemetry integra directamente con Envoy via:
- OTLP Access Log Service
- HTTP/gRPC tracing service
- In-band context propagation
Beneficios
- Correlación automática entre tráfico L7 y servicios upstream/downstream.
- Eliminación de instrumentación manual en muchas rutas.
- Observabilidad “zero-touch”.
Context Propagation
La propagación de contexto evita “trazas partidas”.
OpenTelemetry implementa W3C TraceContext, Baggage y formatos heredados.
Tipos de contexto:
-
Trace Context
Propagatrace_id,span_id,trace_flags. -
Baggage
Atributos arbitrarios que viajan por todas las capas:
ej.user_id,tenant,region. -
Custom Propagators
- Se usan para compatibilidad con sistemas legados.
- Pueden transformar o añadir metadata para correlación.
Sampling Avanzado
OpenTelemetry incluye modelos flexibles para controlar el volumen de trazas.
Estrategias de Sampling
-
Always On
100% de las trazas. Útil en entornos de desarrollo. -
Always Off
No captura spans excepto manuales. -
TraceIDRatioBased Captura un porcentaje configurable.
-
ParentBased Hereda la decisión del span padre.
-
Tail Sampling (Collector)
El más poderoso:- Permite seleccionar trazas basadas en atributos.
- Ejemplo:
- Errores 100%.
- Latencias >500ms.
- Usuarios premium.
Se ejecuta en el Collector (no en los SDK), permitiendo decisiones basadas en la traza completa.
Procesadores Avanzados
Además del batch processor, existen procesadores más específicos:
- tailsampling processor
- Decide qué trazas conservar.
- filter processor
- Permite incluir/excluir telemetría según reglas.
- resourcedetection processor
- Detecta automáticamente información de:
- Kubernetes
- AWS / GCP / Azure
- Host
- VM metadata
- Detecta automáticamente información de:
- routing processor
- Envía distintos pipelines a diferentes exportadores.
- Ejemplo: métricas → Prometheus, trazas → Tempo, logs → Loki.
Exporters y Backends Compatibles
OpenTelemetry soporta una amplia gama de destinos:
Exporters Populares
- Tempo (traces)
- Jaeger
- Zipkin
- Prometheus
- Loki (logs)
- Elastic
- Kafka (buffer y recolección masiva)
- S3 / GCS / Azure Blob (archiving)
- OTLP exporter para encadenar múltiples Collectors
Exporters Empresariales
- Datadog
- New Relic
- Dynatrace
- Lightstep
- Splunk
- Honeycomb
- AppDynamics
Receivers Especializados
OpenTelemetry Collector puede recibir telemetría desde múltiples fuentes:
- hostmetrics receiver
- CPU, memoria, filesystem, network, loadavg.
- kubeletstats receiver
- Métricas de pods y containers.
- journald receiver
- Logs de sistemas Linux.
- syslog receiver
- filelog receiver
- prometheus receiver
- Actúa como un Prometheus server parcial.
- tail sampling receiver
- Ingresa trazas de sampling avanzado.
Instrumentación Automática (Auto-Instrumentation)
Disponible en:
- Java Agent
- Node.js
- Python
- .NET
- Go (con wrappers)
- Ruby
- PHP
- Rust (en evolución)
Ventajas
- No requiere modificar código.
- Inserta spans en:
- HTTP servers/clients
- DB drivers
- ORMs
- MQ (Kafka, RabbitMQ)
- Frameworks web
OpenTelemetry en Kubernetes: Recolección Completa
Patrón típico:
- Collector modo DaemonSet
- Recepción de:
- Logs de contenedores via filelog receiver
- Métricas node/hostmetrics
- Métricas kubeletstats
- Exportación a backend
- Recepción de:
- Collector modo Deployment
- Recibe OTLP de aplicaciones
- Hace tail sampling
- Reenvía trazas filtradas
- Sidecar opcional para apps sin SDK nativo
Integración con Herramientas CI/CD
- Publicar service version como recurso.
- Añadir atributos como:
deployment.environmentbuild.commitbuild.pipeline.id
- Permite correlación entre despliegues y degradaciones.
Observabilidad Unificada
OpenTelemetry permite:
- Correlación logs ↔ traces ↔ metrics
- Atribuir métricas a spans
- Insertar logs enriquecidos dentro de spans
- Crear paneles de:
- errores por ruta
- latencias por servicio
- anomalías por log pattern
- saturación de recursos
Patrones de Diseño en Observabilidad
- RED Metrics (Rate, Errors, Duration)
- USE Metrics (Utilización, Saturación, Errores)
- SLOs basados en trazas
- Análisis de cuellos de botella con spans jerárquicos
Casos de Uso Avanzados
- Observabilidad para sistemas event-driven (Kafka, NATS, RabbitMQ).
- Monitoreo de pipelines ML con trazas de etapas.
- Trazabilidad distribuida en APIs multi región.
- Recolección de logs masivos en entornos edge.
- Telemetría para sistemas IoT mediante OTLP/HTTP.
OpenTelemetry — Ejemplos de Pipelines Completos
Esta nota recopila pipelines listos para usar en el Collector, cada uno diseñado para un caso de uso real distinto. Incluye trazas, métricas y logs, así como enrutamiento avanzado, transformaciones, sampling y exportación a múltiples backends.
Pipeline 1 — Traces + Tail Sampling + Exportación Múltiple
receivers:
otlp:
protocols:
http:
grpc:
processors:
batch:
tailsampling:
policies:
- name: errors
type: status_code
status_code:
statuses: ["ERROR"]
- name: high_latency
type: latency
latency:
threshold_ms: 500
- name: user_premium
type: string_attribute
string_attribute:
key: user.tier
values: ["premium"]
exporters:
otlp:
endpoint: tempo:4317
tls:
insecure: true
logging:
loglevel: info
service:
pipelines:
traces:
receivers: [otlp]
processors: [tailsampling, batch]
exporters: [otlp, logging]
`
Aporta: ✓ Mantiene 100% de errores ✓ Guarda trazas lentas ✓ Sampling condicional por atributos ✓ Exporta simultáneamente a Tempo y logs
Pipeline 2 — Logs desde archivos + Normalización + Loki
receivers:
filelog:
include: ["/var/log/app/*.log"]
start_at: beginning
operators:
- type: regex_parser
regex: '^(?P<ts>[^ ]+) (?P<level>[^ ]+) (?P<msg>.*)$'
timestamp:
parse_from: ts
layout: "%Y-%m-%dT%H:%M:%SZ"
processors:
filter:
logs:
include:
match_type: regexp
expressions:
- 'attributes["level"] == "ERROR"'
attributes:
actions:
- key: level
action: update
value: error
exporters:
loki:
endpoint: http://loki:3100/loki/api/v1/push
service:
pipelines:
logs:
receivers: [filelog]
processors: [filter, attributes]
exporters: [loki]
Aporta: ✓ Ingresa logs desde archivos ✓ Aplica parsing con regex ✓ Solo guarda errores ✓ Envía a Loki
Pipeline 3 — Métricas del Host + Node Exporter Replacement
receivers:
hostmetrics:
collection_interval: 10s
scrapers:
cpu:
memory:
filesystem:
network:
load:
processors:
batch:
exporters:
prometheus:
endpoint: 0.0.0.0:9090
service:
pipelines:
metrics:
receivers: [hostmetrics]
processors: [batch]
exporters: [prometheus]
Aporta: ✓ Reemplaza a node_exporter ✓ Métricas del sistema ✓ Exposición en /metrics
Pipeline 4 — Enrutamiento según tipo de señal → (Prometheus, Tempo, Loki)
receivers:
otlp:
protocols:
grpc:
http:
processors:
batch:
exporters:
prometheus:
endpoint: 0.0.0.0:9000
otlp_tempo:
endpoint: tempo:4317
tls:
insecure: true
loki:
endpoint: http://loki:3100/loki/api/v1/push
service:
pipelines:
metrics:
receivers: [otlp]
processors: [batch]
exporters: [prometheus]
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlp_tempo]
logs:
receivers: [otlp]
processors: [batch]
exporters: [loki]
Aporta: ✓ Separación por señal ✓ Ideal para Grafana Stack (Tempo + Loki + Prometheus)
Pipeline 5 — Kubernetes Logs + Metadata Enrichment
receivers:
filelog:
include: ["/var/log/containers/*.log"]
include_file_path: true
operators:
- type: container_parser
processors:
k8sattributes:
filter:
node_from_env_var: K8S_NODE_NAME
metadata:
annotations:
extract: ["team", "project"]
replace: ["owner"]
labels:
extract: ["app", "pod_template_hash"]
batch:
exporters:
loki:
endpoint: http://loki:3100/loki/api/v1/push
service:
pipelines:
logs:
receivers: [filelog]
processors: [k8sattributes, batch]
exporters: [loki]
Aporta: ✓ Recolecta logs de contenedores Kubernetes ✓ Enrich con metadata del pod ✓ Team / project / owner ✓ Exportación a Loki
Pipeline 6 — Métricas Prometheus + Reetiquetado → OTLP
receivers:
prometheus:
config:
scrape_configs:
- job_name: "apps"
static_configs:
- targets: ["app1:8080", "app2:8080"]
processors:
attributes:
actions:
- action: insert
key: environment
value: staging
exporters:
otlp:
endpoint: collector-upstream:4317
tls:
insecure: true
service:
pipelines:
metrics:
receivers: [prometheus]
processors: [attributes]
exporters: [otlp]
Aporta: ✓ Collector actuando como mini Prometheus ✓ Reetiquetado ✓ Exportación vía OTLP
Pipeline 7 — Logs + Traces Correlacionados (Insertar TraceID en Logs)
receivers:
otlp:
protocols:
grpc:
http:
processors:
resource:
attributes:
- key: service.source
value: "api-gateway"
action: upsert
transform:
log_statements:
- context: log
statements:
- set(attributes["trace_id"], trace_id)
- set(attributes["span_id"], span_id)
exporters:
loki:
endpoint: http://loki:3100/loki/api/v1/push
otlp:
endpoint: tempo:4317
tls:
insecure: true
service:
pipelines:
logs:
receivers: [otlp]
processors: [resource, transform]
exporters: [loki]
traces:
receivers: [otlp]
processors: [resource]
exporters: [otlp]
Aporta: ✓ Enriquecimiento automático ✓ Inserta trace_id/span_id en logs ✓ Correlación garantizada en Loki + Tempo
Pipeline 8 — Kafka como Buffer de Telemetría
receivers:
otlp:
protocols:
http:
grpc:
processors:
batch:
exporters:
kafka:
protocol_version: 2.0.0
brokers: ["kafka:9092"]
topic: otel-telemetry
encoding: otlp_json
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [kafka]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [kafka]
logs:
receivers: [otlp]
processors: [batch]
exporters: [kafka]
Aporta: ✓ Buffer masivo ✓ Ideal para cargas muy altas ✓ Telemetría enviada a Kafka para procesadores offline
Pipeline 9 — Filtrado Avanzado (Excluir Salud, Incluir Errores 5xx)
receivers:
otlp:
processors:
filter:
traces:
exclude:
match_type: regexp
expressions:
- 'attributes["http.target"] == "/health"'
transform:
trace_statements:
- context: span
statements:
- keep_if(attributes["http.status_code"] >= 500)
exporters:
logging:
otlp:
endpoint: tempo:4317
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
processors: [filter, transform]
exporters: [logging, otlp]
Aporta: ✓ Excluye tráfico irrelevante (/health) ✓ Solo guarda spans 5xx ✓ Reduce consumo de backend
Pipeline 10 — Collector como Router por Atributos (Multi-Tenant)
receivers:
otlp:
protocols:
grpc:
processors:
routing:
from_attribute: tenant
table:
tenantA: [exporter_a]
tenantB: [exporter_b]
default: [exporter_default]
exporters:
exporter_a:
endpoint: tempo-a:4317
tls:
insecure: true
exporter_b:
endpoint: tempo-b:4317
tls:
insecure: true
exporter_default:
endpoint: tempo-default:4317
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
processors: [routing]
exporters: [exporter_default]
Aporta: ✓ Multi-tenant real ✓ Routing por atributo ✓ Ideal para SaaS
Pipelines CI/CD Avanzados
Pipeline 1: Despliegue Multi-Región + Service Mesh (Istio) + Validación Automática
Pipeline orientado a empresas que despliegan la misma app en varias regiones con control de tráfico inteligente.
Flujo
- Trigger
- Commit → Build incremental optimizado.
- Build
- Imagen Docker con firma (cosign).
- SBOM generado (Syft, Trivy).
- Tests
- Unit → Integration → Contract tests.
- e2e simulando regiones (mock de edge routers).
- Infra as Code
- Terraform plan para
eu-west-1yus-east-1. - Validación automática con OPA/Conftest.
- Terraform plan para
- Despliegue a Staging
- Helm chart aplicado.
- Inyección automática de sidecars Istio.
- Service Mesh Checks
- Pruebas de:
- mTLS
- Policies
- VirtualServices / DestinationRules correctas
- Pruebas de:
- Shadow Traffic
- 5% de tráfico real replicado a la nueva versión sin afectar usuarios.
- Despliegue Multi-Región
- Orden:
- Región secundaria (
eu-west-1) - Región primaria (
us-east-1)
- Región secundaria (
- Cada paso exige health checks de mesh + app.
- Orden:
- Rollback automático
- Basado en métricas:
- p95 latency
- error_rate
- 5xx spikes
- Basado en métricas:
- Notificación + Auditoría
- Slack + registro en CMDB + firma de artefactos.
Artefactos Generados
- Imagen versionada y firmada.
- Terraform plan + apply logs.
- Helm release.
- Reporte de observabilidad/métricas.
Pipeline 2: Canary Progressive Delivery con Argo Rollouts + Tracking Inteligente
Pipeline usado para despliegues de alto riesgo donde el canario se evalúa por métricas, no por tiempo.
Flujo
- Trigger
- PR con revisión obligatoria.
- Build
- Docker + análisis estático (Sonar, CodeQL).
- Tests avanzados
- Mutation testing.
- API contract verificando backward compatibility.
- Deploy Canary con Argo Rollouts
- Weight inicial: 1%
- Pasos automáticos:
- 1% → 5% → 25% → 50% → 100%
- Sólo si:
- error_rate < 0.5%
- Latencia p95 < 200ms
- No hay degradación en logs (Loki / ELK)
- Canary Tracking Inteligente
- ML simple (Z-score) para detectar anomalías.
- Evaluación en tiempo real de usuarios reales.
- Experimentos A/B dentro del canario
- Sólo usuarios chrome verán la nueva feature.
- Rollback Automático
- Si hay spike de errores o aumento de latencia:
- Rollback inmediato.
- Cierre del rollout + alerta a equipo.
- Si hay spike de errores o aumento de latencia:
- Promoción
- Argo marca el despliegue como “Stable”.
- Kubernetes actualiza todos los replicasets.
Integraciones
- Argo Rollouts
- Prometheus/Grafana para métricas
- Loki para logs
- OPA para políticas
- Sentry para errores
Pipeline 3: Microservicios con Service Mesh + Testing de Resiliencia + Chaos Engineering
Modelo empresarial orientado a resiliencia en tiempo real.
Flujo
- Build por servicio
- Cada servicio genera su propio artefacto.
- Build caching + Reproducible builds.
- Tests
- Unitarios
- Contract (Pact)
- e2e distribuidos simulando fallos de red
- Despliegue a entorno Mesh
- Inyección de sidecar Envoy.
- Configuración automática de:
- Retries
- Timeouts
- Circuit Breakers
- Chaos Tests Automáticos
- Escenario:
- Matar pods aleatorios.
- Inject latency 200ms.
- Drop 10% de paquetes.
- Escenario:
- Validación de Resiliencia
- Golden signals deben mantenerse:
- Latency
- Traffic
- Errors
- Saturation
- Golden signals deben mantenerse:
- Promoción
- Si resiliencia ≥ threshold, se publica.
- Rollback
- Si resiliencia se degrada, rollback inmediato.
Pipeline 4: Multi-Cloud Activo/Activo con Replicación de Datos
Despliega en AWS + GCP simultáneamente.
Flujo
- Build y firma
- Docker + cosign.
- Terraform Multi-Cloud
- AWS:
- EKS
- RDS
- GCP:
- GKE
- CloudSQL
- AWS:
- Sincronización de Datos
- CDC (Change Data Capture) con Debezium.
- Replicación entre nubes.
- Despliegue Blue/Green
- En ambas nubes.
- Routing Global
- Cloudflare / Traffic Director:
- 50% tráfico AWS
- 50% tráfico GCP
- Cloudflare / Traffic Director:
- Failover Automático
- Si un proveedor cae:
- Todo el tráfico se redirige a la otra nube.
- Si un proveedor cae:
- Promoción
- Se sincroniza la versión “green” como master.
Pipeline 5: Infraestructuras Regulatorias con Auditoría y Gates de Seguridad
Diseñado para entornos fintech/health.
Flujo
- Build
- Imagen Docker escaneada (Clair/Trivy).
- Comprobación SBOM obligatoria.
- Tests
- Unit → Integration → Compliance tests.
- Security Gates
- CodeQL
- SAST
- DAST
- OPA para políticas de infraestructura
- Comprobaciones de secreto (git-secrets)
- Infra as Code
- Terraform + Sentinel (políticas obligatorias)
- Despliegue a Entorno Aislado
- Zero-trust networking.
- Service mesh mTLS obligatorio.
- Aprobación Manual (Dual Approval)
- Dos personas distintas deben aprobar.
- Despliegue controlado
- Blue/Green
- Validación con test automatizados post-deploy
- Auditoría
- Registro inmutable (Loki / Elasticsearch / AWS AuditLogs).
Prácticas Recomendadas para Pipelines CI/CD
Introducción
Esta nota resume un conjunto de buenas prácticas avanzadas para diseñar, implementar y gestionar pipelines CI/CD robustos, auditables y altamente escalables. Está orientada a entornos modernos con contenedores, orquestadores, IaC, service mesh, multi-región y despliegues progresivos.
Diseño General del Pipeline
Un pipeline debe ser modular, declarativo, idempotente y observable. Cada etapa debe aportar valor, validar calidad o asegurar consistencia entre cambios.
Principios clave
- Minimizar la lógica imperativa en el pipeline.
- Usar archivos declarativos: YAML, Terraform, Helm, Kustomize.
- Evitar pipelines monolíticos → fomentar pipelines por servicio/módulo.
- Mantener tiempos de ejecución predecibles y razonables.
- Todo cambio debe ser auditable y reproducible.
Fase de Build
Recomendaciones
- Builds determinísticas (reproducible builds).
- Cacheo agresivo: dependencias, compilación, capas Docker.
- Versionado semántico automatizado o convencional (SemVer).
- Generación de SBOM con Syft/Trivy.
- Firmas de artefactos (cosign, sterna).
Artefactos generados
- Imágenes Docker inmutables.
- Binarios, librerías, charts o manifests empaquetados.
Fase de Testing
Tipos de pruebas a incluir
- Unitarias: rápidas y completas.
- Integración: red, I/O, bases de datos.
- Contratos: validación entre microservicios.
- E2E: simulación de usuario real.
- Mutación: resistencia de las pruebas.
- Regresión: escenarios críticos.
- Performance: latencias, cargas sostenidas.
- Seguridad: SAST, DAST, secret scanning.
Buenas prácticas
- Fallar rápido (fail-fast).
- Paralelizar tests.
- Generar reportes: cobertura, resultados y métricas.
Fase de Seguridad (DevSecOps)
Checks recomendados
- Análisis estático de código (CodeQL, Sonar).
- Análisis dinámico (DAST).
- Escaneo de dependencias.
- Validación de IaC con OPA/Conftest/Sentinel.
- Comprobación de políticas de seguridad obligatorias.
- Escaneo de contenedores antes de publicar.
Reglas clave
- No despliegue sin firmar imágenes.
- Eliminación automática de secretos incrustados.
- Zero-trust en todos los entornos.
Fase de Infraestructura como Código (IaC)
Prácticas
- Modo “plan → review → apply” siempre.
- Revisar y versionar todos los cambios.
- Validar políticas y configuración antes del apply.
- Aplicar en entornos siempre iguales (ephemeral environments).
Recomendaciones
- Estandarizar módulos/proveedores Terraform.
- Integrar Helm, Kustomize o ArgoCD para Kubernetes.
Despliegues Progresivos
Estrategias recomendadas
- Blue/Green: alta seguridad.
- Canary: despliegue gradual basado en porcentajes.
- Shadow: replicación de tráfico real sin impacto.
- Feature flags: desacoplar deploy de release.
Reglas de oro
- Los despliegues deben ser reversibles automáticamente.
- Guardar siempre métricas pre y post-release.
- Reducir riesgos basándose en observabilidad, no en tiempos.
Multi-Región y Multi-Cloud
Buenas prácticas
- Despliegues regionales escalonados.
- Sincronización de estados y metadatos.
- Control de versión homogéneo entre regiones.
- Replicación/CDC para bases de datos.
- Failover automático con health checks globales.
Consideraciones
- La región secundaria debe probarse primero.
- Evitar drift entre configuraciones multi-nube.
Service Mesh en Pipeline
Validaciones obligatorias
- Inyección de sidecars correcta.
- mTLS forzado.
- VirtualServices y DestinationRules validados.
- Retries, timeouts, circuit breaking testeados.
- Observabilidad: métricas y trazas de sidecar.
Prácticas avanzadas
- Validar políticas de tráfico antes del rollout.
- Ensayos de resiliencia dentro del pipeline (latency injection).
Observabilidad Integrada
Métricas recomendadas
- P95/P99 latency.
- Error rate.
- Throughput.
- Saturación.
- Health de endpoints críticos.
- Logs clave y trazas distribuidas.
Reglas
- No promover una versión si hay degradación.
- Integrar Prometheus, Grafana, Loki, OpenTelemetry.
Automatización de Rollbacks
Criterios típicos
- Spike de errores 5xx.
- Aumento en latencia p95/p99.
- Downtime detectado por health checks.
- Anomalías en logs detectadas por ML simple.
Prácticas
- Rollback automático debe ser inmediato.
- Registrar siempre razón del rollback.
- Mantener política de retención para imágenes previas.
Gobernanza, Auditoría y Cumplimiento
Reglas de compliance
- Aprobaciones dobles en entornos regulados.
- Trazabilidad completa del pipeline.
- Logs inmutables de auditoría.
- Controles de acceso RBAC/ABAC en CI/CD.
- Escaneo automático de permisos excesivos.
Integración
- CMDB, sistemas ITSM, plataformas de auditoría.
Eficiencia y Confiabilidad del Pipeline
Recomendaciones
- Niveles de caché bien diseñados.
- Ejecución de jobs en paralelo.
- Workers escalables y autoservicio.
- Uso de pipelines efímeros por PR.
- Reutilización de módulos, plantillas y jobs estándar.
Gestión de Secretos
Prácticas
- Nada de secretos en repositorios.
- Rotación obligatoria.
- Uso de Vault, KMS, SOPS o Sealed Secrets.
- Acceso basado en identidad, no en archivos.
Buenas Prácticas para Monorepos y Multi-Repo
Monorepo
- Determinar cambios para ejecutar sólo pipelines necesarios.
- Caching optimizado.
- Dependencias aisladas por servicio.
Multi-Repo
- Pipelines independientes y reproducibles.
- Versionado estricto entre servicios.
Entornos efímeros (Preview Environments)
Beneficios
- Cada PR se prueba en un entorno real.
- Pruebas E2E reales sin afectar otros equipos.
- Acelera el merge y reduce bugs.
Documentación y Conocimiento
- Documentar pipelines con diagrams-as-code (Mermaid).
- Mantener un catálogo de procesos CI/CD.
- Registrar flujos de despliegue y estándares.
Lista Resumida de Prácticas Recomendadas
- Pipelines declarativos y modulares.
- Build reproducible + firma de artefactos.
- Pruebas completas (unit, integration, contract, e2e).
- Validaciones de seguridad en cada paso.
- IaC revisado y auditado antes de aplicar.
- Despliegues progresivos (canary/blue-green).
- Observabilidad integrada y accionable.
- Rollbacks automáticos basados en métricas.
- Multi-región escalonado.
- Service mesh validado en pipeline.
- Gestión estricta de secretos.
- Entornos efímeros para pruebas realistas.
- Auditoría y cumplimiento obligatorios.
- Documentación actualizada y accesible.
¿Te gusta este contenido? Suscríbete vía RSS