Tracing Distribuído
OpenTelemetry nos cinco serviços
Instrumentacao OpenTelemetry em Java, Python, Go, Ruby e Node.
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-propagacaoconcluida. - 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/telemetryservices/order-service/app/telemetryservices/payment-service/internal/telemetryservices/notification-service/app/telemetryservices/analytics-service/src/telemetryinfra/tracing/otel-collector.yaml
Passo a passo com codigo
- 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)
- 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)
- Instrumente span em consumidor:
const span = tracer.startSpan("analytics.consume.notification_sent");
span.setAttribute("event.id", event.eventId);
span.end();
- Defina variaveis compartilhadas no Compose:
environment:
OTEL_EXPORTER_OTLP_ENDPOINT: http://otel-collector:4318
OTEL_SERVICE_NAME: payment-service
Como testar
- Suba ambiente com OTel Collector e Jaeger.
- Execute fluxo completo de compra.
- No Jaeger, filtre por
service=payment-service. - Confirme spans nos cinco servicos.
- 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
statuse 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.