Skip to content

Descripción general de Distributed Tracing

Última actualización: February 20, 2026

Introducción

Distributed Tracing es una técnica para rastrear la ruta completa de las solicitudes a medida que atraviesan múltiples servicios en arquitecturas de microservicios. En los sistemas modernos, donde una sola solicitud puede pasar por decenas de servicios, Distributed Tracing es esencial para identificar cuellos de botella de rendimiento y solucionar problemas.

La necesidad de Distributed Tracing

Limitaciones del monitoreo tradicional

En entornos de microservicios, el logging y las métricas tradicionales por sí solos no pueden responder estas preguntas:

  • ¿Por qué servicios pasó la solicitud?
  • ¿Cuánto tiempo tardó cada servicio?
  • ¿Dónde ocurrieron los errores?
  • ¿Cuáles son las dependencias entre los servicios?

Conceptos principales

1. Trace

Un Trace representa el recorrido completo de una única solicitud. Es la colección de todas las operaciones generadas a medida que una solicitud pasa por el sistema.

2. Span

Un Span representa una única unidad de trabajo. Cada Span contiene la siguiente información:

CampoDescripciónEjemplo
TraceIDIdentificador único para todo el traceabc123def456
SpanIDIdentificador único para el Span individualspan789
ParentSpanIDIdentificador del Span padrespan456
Operation NameNombre de la operaciónHTTP GET /api/users
Start TimeMarca de tiempo de inicio2025-02-15T10:30:00Z
DurationTiempo empleado150ms
TagsMetadatoshttp.status_code=200
LogsRegistros de eventoserror: connection timeout

3. Relaciones y jerarquía de Span

Los Spans forman relaciones padre-hijo que crean una estructura de árbol:

4. SpanContext

SpanContext es la información de trace que se propaga entre servicios:

yaml
# SpanContext Components
SpanContext:
  trace_id: "abc123def456789"      # Trace identifier
  span_id: "span789"               # Current Span identifier
  trace_flags: "01"                # Sampling flag
  trace_state: "vendor=value"      # Vendor-specific additional info

Propagación de contexto

El método para transmitir el contexto de trace entre servicios.

W3C Trace Context (recomendado)

Propagación mediante headers estándar de W3C:

http
# HTTP Request Headers
traceparent: 00-abc123def456789012345678901234-span12345678-01
tracestate: rojo=00f067aa0ba902b7,congo=t61rcWkgMzE

formato de traceparent:

version-trace_id-parent_id-trace_flags
00     -abc123...-span1234...-01

Propagación B3 (compatible con Zipkin)

Formato de propagación utilizado por Zipkin:

http
# Single header format
b3: abc123def456789-span12345678-1-parent12345678

# Multi-header format
X-B3-TraceId: abc123def456789
X-B3-SpanId: span12345678
X-B3-ParentSpanId: parent12345678
X-B3-Sampled: 1

Comparación de formatos de propagación

FormatoHeadersVentajasDesventajas
W3C Trace Contexttraceparent, tracestateEstándar, extensibleRelativamente nuevo
B3 Singleb3Simple, un solo headerEspecífico de Zipkin
B3 MultiX-B3-*Depuración sencillaMuchos headers
Jaegeruber-trace-idOptimizado para JaegerDependencia del proveedor

Estrategias de sampling

Rastrear todas las solicitudes genera problemas de costo y rendimiento. El sampling los gestiona.

Head-based Sampling

Decisión de sampling al inicio de la solicitud:

Ventajas:

  • Implementación sencilla
  • Baja sobrecarga
  • Decisiones de sampling coherentes

Desventajas:

  • Puede omitir solicitudes importantes
  • Puede omitir solicitudes con errores o latencia

Ejemplo de configuración:

yaml
# OpenTelemetry SDK Configuration
sampling:
  type: parentbased_traceidratio
  ratio: 0.1  # 10% sampling

Tail-based Sampling

Decisión de sampling tras la finalización de la solicitud, basada en los resultados:

Ventajas:

  • Nunca omite solicitudes importantes (errores, latencia)
  • Sampling más inteligente
  • Rentable

Desventajas:

  • Implementación compleja
  • Mayor uso de memoria
  • Debe almacenar temporalmente todos los Spans

Configuración de Tail Sampling de OTEL Collector:

yaml
processors:
  tail_sampling:
    decision_wait: 10s
    num_traces: 100000
    policies:
      # Collect all error requests
      - name: errors
        type: status_code
        status_code:
          status_codes: [ERROR]
      # Collect slow requests
      - name: slow-requests
        type: latency
        latency:
          threshold_ms: 1000
      # 10% sampling for the rest
      - name: probabilistic
        type: probabilistic
        probabilistic:
          sampling_percentage: 10

Comparación de estrategias de sampling

EstrategiaPunto de decisiónUso de recursosPrecisiónCaso de uso
Head-basedInicio de la solicitudBajoMediaLa mayoría de los casos
Tail-basedFinalización de la solicitudAltoAltaEnfocado en errores/latencia
AdaptiveDinámicoMedioAltaAlta variabilidad de tráfico

Correlación entre Trace, log y métrica

Vinculación de logs mediante TraceID

java
// Java logging example (SLF4J + MDC)
import org.slf4j.MDC;
import io.opentelemetry.api.trace.Span;

public void processOrder(Order order) {
    Span span = Span.current();
    MDC.put("traceId", span.getSpanContext().getTraceId());
    MDC.put("spanId", span.getSpanContext().getSpanId());

    logger.info("Processing order: {}", order.getId());
    // Log output: {"traceId": "abc123", "spanId": "span456", "message": "Processing order: 12345"}
}

Vinculación de métricas mediante Exemplars

yaml
# Linking TraceID to Prometheus metrics
http_request_duration_seconds_bucket{le="0.5"} 1000 # {traceID="abc123"}
http_request_duration_seconds_bucket{le="1.0"} 1500 # {traceID="def456"}

Correlación en Grafana

Comparación de soluciones

Comparación de soluciones de Distributed Tracing

CaracterísticaTempoX-RayJaegerDatadog APMDynatrace
TipoOpen SourceAdministrado por AWSOpen SourceSaaS comercialSaaS comercial
AlmacenamientoObject StorageInterno de AWSCassandra/ESDatadogDynatrace
Lenguaje de consultaTraceQLExpresiones de filtro--DQL
SamplingHead/TailBasado en reglasHeadDinámicoDinámico
Compatibilidad con OTELNativaNativaNativaNativaNativa
Mapa de serviciosIntegración con GrafanaIntegradoIntegradoIntegradoIntegrado
Análisis de AINingunoNingunoNingunoWatchdogDavis AI
CostoSolo costo de almacenamientoBasado en el usoCosto de infraestructuraBasado en host/spanBasado en host
Integración con EKSConfiguración manualNativaConfiguración manualDespliegue de AgentOneAgent

Guía de selección

Mejores prácticas

1. Estrategia de instrumentación

yaml
# Recommended instrumentation scope
instrumentation:
  # Always instrument
  always:
    - HTTP requests/responses
    - gRPC calls
    - Database queries
    - Message queue operations
    - External API calls

  # Optional instrumentation
  optional:
    - Internal function calls
    - Cache operations
    - File I/O

2. Convenciones de nomenclatura de Span

yaml
# Good examples
- "HTTP GET /api/users/{id}"
- "PostgreSQL SELECT users"
- "Redis GET user:123"
- "Kafka SEND orders"

# Bad examples
- "http call"
- "db query"
- "process"
- "span1"

3. Estandarización de tags

yaml
# OpenTelemetry Semantic Conventions
tags:
  # HTTP
  http.method: GET
  http.url: https://api.example.com/users
  http.status_code: 200

  # Database
  db.system: postgresql
  db.statement: SELECT * FROM users
  db.operation: SELECT

  # Service
  service.name: user-service
  service.version: 1.2.3

Próximos pasos

Una vez que comprenda los conceptos de Distributed Tracing, aprenda el uso de herramientas específicas en las siguientes secciones:

Cuestionario

Evalúe sus conocimientos con los cuestionarios específicos de cada herramienta: