Alejandría

Busca en Alejandría

Lenguajes y marcos

OpenTelemetry

Instrumenta y transporta telemetría con estándares compartidos.

01

En pocas palabras

Framework abierto de APIs, SDKs y herramientas para generar, recolectar y exportar trazas, métricas y logs con convenciones compartidas.

Qué problema resuelve

Instrumentación fragmentada y dificultad para seguir una operación entre servicios o cambiar de proveedor de observabilidad.

Cuándo utilizarlo

Microservicios, APIs y sistemas distribuidos. Ejemplo: seguir una solicitud desde el servicio web hasta la base de datos y correlacionar sus tiempos y errores.

02

De la idea a la práctica

Funcionamiento, ejemplos y decisiones para pasar al siguiente nivel.

Cómo funciona

Las APIs, SDKs e instrumentaciones generan señales. OTLP define su transporte y el Collector puede recibirlas, transformarlas y enviarlas a uno o varios backends. La propagación de contexto relaciona spans de una misma operación distribuida.

Ejemplo: recibir trazas localmente

Esta configuración mínima de un OpenTelemetry Collector habilita OTLP por HTTP y muestra trazas para diagnóstico local:

receivers:
  otlp:
    protocols:
      http:
        endpoint: 127.0.0.1:4318
exporters:
  debug: {}
service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [debug]

La aplicación instrumentada debe enviar trazas al receptor. En producción, configura un exportador hacia el backend elegido.

Señales y conceptos

Concepto Descripción
Trace / span Operación distribuida y cada uno de sus pasos, con duración, atributos y estado
Métricas Contadores, histogramas y gauges agregados
Logs Registros, correlacionados con la traza activa
Resource Quién emite: service.name, versión, entorno, host, pod
Contexto trace_id y span_id propagados entre servicios (cabecera W3C traceparent)
Baggage Pares clave-valor que viajan con el contexto (con cuidado: se propagan a terceros)

Las convenciones semánticas fijan nombres comunes (http.request.method, db.system, messaging.destination.name) para que los paneles y consultas funcionen igual en todos los servicios y backends.

Instrumentación automática

# Java: agente sin cambiar el código
java -javaagent:opentelemetry-javaagent.jar -jar app.jar

# Python
pip install opentelemetry-distro opentelemetry-exporter-otlp
opentelemetry-bootstrap -a install
opentelemetry-instrument uvicorn app.main:app
# Configuración común por variables de entorno
export OTEL_SERVICE_NAME=api-solicitudes
export OTEL_RESOURCE_ATTRIBUTES=deployment.environment.name=prod,service.version=1.8.0
export OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4318
export OTEL_TRACES_SAMPLER=parentbased_traceidratio
export OTEL_TRACES_SAMPLER_ARG=0.2

La instrumentación automática cubre frameworks web, clientes HTTP, JDBC, Kafka y muchas librerías más.

Spans manuales para la lógica de negocio

from opentelemetry import trace

tracer = trace.get_tracer("originacion")

def evaluar_solicitud(solicitud):
    with tracer.start_as_current_span("evaluar_solicitud") as span:
        span.set_attribute("solicitud.producto", solicitud.producto)
        span.set_attribute("solicitud.pais", solicitud.pais)
        try:
            resultado = motor_reglas.evaluar(solicitud)
            span.set_attribute("solicitud.decision", resultado.decision)
            return resultado
        except Exception as e:
            span.record_exception(e)
            span.set_status(trace.Status(trace.StatusCode.ERROR))
            raise

No pongas datos personales (documento, nombre) en atributos; usa identificadores internos.

Collector para producción

processors:
  memory_limiter:
    check_interval: 1s
    limit_percentage: 80
  batch: {}
  attributes/redactar:
    actions:
      - key: http.request.header.authorization
        action: delete
  tail_sampling:
    policies:
      - {
          name: errores,
          type: status_code,
          status_code: { status_codes: [ERROR] },
        }
      - { name: lentas, type: latency, latency: { threshold_ms: 2000 } }
      - {
          name: muestra,
          type: probabilistic,
          probabilistic: { sampling_percentage: 10 },
        }

service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [memory_limiter, attributes/redactar, tail_sampling, batch]
      exporters: [otlp/backend]
Patrón de despliegue Descripción
Agente Collector por nodo o sidecar; recoge y enriquece cerca de la aplicación
Gateway Collectors centrales que aplican muestreo, redacción y envío

El tail sampling necesita ver todos los spans de una traza en el mismo collector: en un gateway con varias réplicas, enruta por trace_id (exportador con load balancing).

Adopción en una organización

Define una configuración base común (atributos de recurso, muestreo, exportador) distribuida en una librería o imagen, y valida en CI que cada servicio declara service.name. Distribuciones como Grafana Alloy y backends como SigNoz, Tempo o los de cada nube reciben OTLP sin cambios en el código.

Criterios de implementación

Define nombres de servicios, convenciones y muestreo. Evita incluir datos sensibles y controla atributos de alta cardinalidad. El Collector procesa señales; el almacenamiento y los paneles pertenecen a otras herramientas.

Continúa en las fuentes

Documentación oficial para verificar detalles y explorar más.