Tracing Distribuído

OpenTelemetry nos cinco serviços

Instrumentacao OpenTelemetry em Java, Python, Go, Ruby e Node.

Avançado 45 min 40 pontos Leitura 0%

Nesta aula você vai

  • Instrumentar OpenTelemetry em Java, Python, Go, Ruby e Node
  • Padronizar naming de spans e atributos entre linguagens
  • Exportar traces para coletor central do ambiente

OpenTelemetry nos cinco serviços

Objetivos

  • Instrumentar OpenTelemetry em Java Python Go Ruby e Node
  • Padronizar naming de spans entre linguagens
  • Exportar traces para coletor central do ambiente

Pré-requisitos

  • Aula trace-id-span-propagacao concluida.
  • OTel Collector ativo no ambiente.
  • Variaveis de ambiente para exportacao configuradas.

Conceito

OpenTelemetry define API e SDK padrao para coletar traces. Em um monorepo multi-linguagem, a padronizacao evita lacunas de instrumentacao.

Todos os servicos devem compartilhar convencoes de:

  • service.name;
  • nomes de spans;
  • atributos de negocio (order.id, event.id).

Estrutura de arquivos

  • services/customer-service/src/telemetry
  • services/order-service/app/telemetry
  • services/payment-service/internal/telemetry
  • services/notification-service/app/telemetry
  • services/analytics-service/src/telemetry
  • infra/tracing/otel-collector.yaml

Passo a passo com codigo

  1. Configure exportador OTLP no order-service (Python):
resource = Resource.create({"service.name": "order-service", "deployment.environment": "local"})
provider = TracerProvider(resource=resource)
processor = BatchSpanProcessor(OTLPSpanExporter(endpoint="http://otel-collector:4318/v1/traces"))
provider.add_span_processor(processor)
trace.set_tracer_provider(provider)
  1. Configure no payment-service (Go):
exp, _ := otlptracehttp.New(ctx, otlptracehttp.WithEndpoint("otel-collector:4318"), otlptracehttp.WithInsecure())
tp := sdktrace.NewTracerProvider(
  sdktrace.WithBatcher(exp),
  sdktrace.WithResource(resource.NewWithAttributes(semconv.SchemaURL, semconv.ServiceNameKey.String("payment-service"))),
)
otel.SetTracerProvider(tp)
  1. Instrumente span em consumidor:
const span = tracer.startSpan("analytics.consume.notification_sent");
span.setAttribute("event.id", event.eventId);
span.end();
  1. Defina variaveis compartilhadas no Compose:
environment:
  OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4318
  OTEL_SERVICE_NAME: payment-service

Como testar

  1. Suba ambiente com OTel Collector e Jaeger.
  2. Execute fluxo completo de compra.
  3. No Jaeger, filtre por service=payment-service.
  4. Confirme spans nos cinco servicos.
  5. Valide atributos padronizados (event.id, order.id).

Dicas

  • Centralize convencoes de spans no docs/observability-tracing.md.
  • Defina sampling previsivel por ambiente.
  • Evite spans em loops muito quentes sem necessidade.
  • Instrumente erros com status e atributos.

Erros comuns

  • Configurar endpoint de exportação diferente por serviço sem motivo
  • Não instrumentar caminhos assíncronos
  • Gerar spans excessivos em loops internos
  • Esquecer de propagar contexto após deserialização

Resumo

Com OpenTelemetry padronizado nos cinco servicos, o tracing distribuido vira uma fonte confiavel para diagnostico de latencia, erro e regressao entre releases.