Tracing distribuído mostra onde uma request falhou e por quê, serviço por serviço. Quando a request cruza seis serviços e cada um loga seu pedaço, correlacionar entradas por timestamp vira chute sob carga. Trace IDs costuram a jornada completa.

Spans e contexto W3C

Traces contêm spans: operações nomeadas com duração, atributos e status. Relações pai-filho formam a árvore de execução. O W3C Trace Context propaga contexto via header traceparent através de HTTP, gRPC e filas de mensagem. Siga a spec desde o primeiro dia.

Configuração do SDK

Monte um TracerProvider com exportador OTLP apontando para o collector ou endpoint do vendor. O BatchSpanProcessor dá throughput adequado para produção, em contraste com o SimpleSpanProcessor de testes. Resource attributes declaram service name, versão e ambiente: telemetria sem identificação de origem vira ruído.

Instrumentação: auto ou manual

Comece pelos agents de zero-code para Node, Python e Java: eles cobrem frameworks populares e clients HTTP sem tocar no código. A documentação do OpenTelemetry lista os agents disponíveis para cada linguagem. Restrinja spans manuais às operações críticas de negócio, com nomes estáveis e atributos de domínio (id do pedido, plano do cliente). Nome genérico demais atrapalha a busca no vendor.

Sampling: head ou tail

Head sampling entre 10% e 100% conforme o tráfego decide o que coletar na origem. Tail sampling mantém todos os traces com erro e os outliers lentos, descartando sucessos rotineiros; a decisão pertence ao collector nesse modo. Sem tail sampling, o trace raro do bug difícil escapa.

Deployment do collector

O padrão agent sidecar mais gateway equilibra overhead local com processamento central. Processors cuidam de batching, filtragem e remoção de PII antes do export. Fazer scrubbing no collector evita vazamento de dado sensível para vendors terceiros.

Vendor

Jaeger serve para começar self-hosted; Grafana Tempo aposta em object storage para baratear retenção longa; Datadog e Honeycomb entregam análise gerenciada. OTLP mantém a troca barata: mudar de backend significa trocar o exporter, não instrumentar de novo.

Armadilhas

  • Propagação perdida em fronteiras async e thread pools; o trace quebra no meio
  • Span explosion com um span por linha de banco; agregue por query, não por row
  • Clock skew entre hosts confundindo a visualização em waterfall