~ / blog / observabilidade
22 jul 2026 observabilidade 14 min de leitura

OpenTelemetry: Unificando Métricas, Logs e Traces

Introdução ao OpenTelemetry como padrão aberto. Como instrumentar aplicações e coletar sinais unificados para o Grafana.

OpenTelemetryObservabilidadeGrafanaDevOps

1. O que é OpenTelemetry?

Padrão aberto (CNCF) para gerar, coletar e exportar métricas, logs e traces. Instrumente uma vez e envie para qualquer backend (Prometheus, Loki, Tempo, Jaeger, etc.).

2. Os três pilares

  • Métricas — números agregados (latência p99, taxa de erro)
  • Logs — eventos discretos com contexto
  • Traces — caminho de uma requisição entre serviços (spans)

O poder está em correlacionar os três via trace_id / request_id.

3. SDK + Collector

A app usa o SDK (ou auto-instrumentação) e exporta OTLP para o Collector. O Collector processa (batch, filter, sample) e exporta para os backends.

tip · A app não precisa saber o destino final. Você muda o pipeline no Collector sem redeploy.

4. Instrumentação (Node.js)

const { NodeSDK } = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-http');

const sdk = new NodeSDK({
  traceExporter: new OTLPTraceExporter({
    url: 'http://localhost:4318/v1/traces',
  }),
  instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start();

Python, Java, Go e .NET seguem o mesmo padrão: SDK + exporter OTLP.

5. Collector

receivers:
  otlp:
    protocols:
      grpc:
      http:
processors:
  batch:
exporters:
  otlp/tempo:
    endpoint: tempo:4317
  prometheus:
    endpoint: "0.0.0.0:8889"
  loki:
    endpoint: http://loki:3100/loki/api/v1/push
service:
  pipelines:
    traces:
      receivers: [otlp]
      processors: [batch]
      exporters: [otlp/tempo]
    metrics:
      receivers: [otlp]
      processors: [batch]
      exporters: [prometheus]
    logs:
      receivers: [otlp]
      processors: [batch]
      exporters: [loki]

6. Grafana

  • Prometheus → métricas e alertas
  • Loki → logs (LogQL)
  • Tempo/Jaeger → traces

Configure as três data sources e use correlação (métrica → trace → logs).

7. Boas práticas

  • Semantic conventions (http.method, http.status_code…)
  • Propagar contexto entre serviços
  • Sampling inteligente em produção
  • Collector próximo das apps (sidecar/DaemonSet)
  • Config do Collector como código

OTel não é “mais uma ferramenta”: é o padrão que unifica instrumentação e permite trocar de backend. Combinado com Grafana/Prometheus/Loki/Tempo, forma base sólida de observabilidade.

8. Configurações explicadas

Instrumentação em Node.js

TrechoO que faz
NodeSDKO SDK do OpenTelemetry para Node.js, que reúne exportadores e instrumentações.
getNodeAutoInstrumentations()Instrumenta automaticamente bibliotecas comuns, como HTTP, Express e clientes de banco.
OTLPTraceExporter({ url: ... })Envia os traces pelo protocolo OTLP sobre HTTP.
http://localhost:4318/v1/tracesPorta 4318 (OTLP/HTTP) do Collector e o caminho /v1/traces.
sdk.start()Liga a coleta.

Esse código precisa rodar antes do restante da aplicação, para conseguir instrumentar as bibliotecas. Uma forma usual é colocá-lo em tracing.js e iniciar com node --require ./tracing.js app.js.

Collector

BlocoO que faz
receivers: otlp com grpc e httpAceita dados OTLP nas portas padrão 4317 (gRPC) e 4318 (HTTP).
processors: batchAgrupa os dados antes de enviar.
otlp/tempo com endpoint: tempo:4317Envia traces para o Tempo.
prometheus com endpoint: 0.0.0.0:8889Expõe as métricas para o Prometheus buscar (scrape).
loki com endpoint: .../loki/api/v1/pushEnvia logs ao Loki.
service: pipelinesDefine o caminho de cada sinal: traces para o Tempo, métricas para o Prometheus e logs para o Loki.
SinalPergunta que respondeDestino típico
Métricaso que está acontecendo, e quantoPrometheus
Logspor que aconteceuLoki
Tracesonde a requisição passou e onde demorouTempo

9. Configuração por variáveis de ambiente

O SDK também aceita variáveis padronizadas, o que evita deixar endereços no código:

OTEL_SERVICE_NAME=api-pedidos
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4318
node --require ./tracing.js app.js

OTEL_SERVICE_NAME dá nome ao serviço nos gráficos. Sem ele, os dados aparecem como unknown_service.

10. Erros comuns e como resolver

SintomaCausa provávelSolução
Nenhum span apareceA instrumentação foi carregada depois dos módulos que deveria instrumentar.Inicie com --require ./tracing.js.
connection refused na porta 4318O Collector não está rodando ou a porta não foi publicada.Verifique o container e o mapeamento de portas.
Erro 404 em /v1/tracesEndereço de gRPC usado com o exporter HTTP, ou o caminho errado.Use 4318 para HTTP e 4317 para gRPC, com o exporter correspondente.
O serviço aparece como unknown_serviceNão foi definido o nome do serviço.Defina OTEL_SERVICE_NAME.
$ next

Precisa de infraestrutura na prática?

falar com a IRN Devs → serviços

Quer aplicar isso ao seu contexto?

Se esse problema existe na sua operação, podemos analisar o cenário em um diagnóstico gratuito de 30 minutos.

solicitar diagnóstico gratuito →

Leia também