Monitoramento de Aplicações Go com OpenTelemetry: Métricas, Logs e Traces em um só lugar

Observabilidade não é mais um diferencial – é requisito para qualquer sistema em produção. Mas por muito tempo, métricas (Prometheus), logs (ELK/Loki) e traces (Jaeger) viviam em silos, cada um com sua instrumentação. OpenTelemetry veio para unificar tudo: um único padrão aberto para gerar, coletar e exportar dados de telemetria.

Neste post, vamos entender o que é OpenTelemetry, como instrumentar aplicações Go para gerar métricas, logs estruturados e tracing distribuído, e como enviar esses dados para backends como Prometheus, Jaeger e Loki. Tudo com exemplos práticos e boas práticas.


O que é OpenTelemetry?

OpenTelemetry (também chamado de OTel) é um projeto da CNCF (mesma fundação do Kubernetes) que surgiu da fusão do OpenTracing e OpenCensus. Ele fornece:

  • APIs e SDKs para instrumentar aplicações em diversas linguagens (incluindo Go).
  • Um formato padrão para dados de telemetria (traces, métricas, logs).
  • Coletores que recebem, processam e exportam dados para backends.

A grande vantagem: você instrumenta uma vez e pode enviar para qualquer backend compatível.


Os três pilares da observabilidade com OpenTelemetry

PilarO que éBackend comum
TracesRastreiam uma requisição por vários serviços (distributed tracing)Jaeger, Tempo, Zipkin
MétricasAgregados numéricos (ex: latência, taxa de erro, contagem)Prometheus, VictoriaMetrics
LogsEventos estruturados com timestamp e contextoLoki, Elasticsearch

No OpenTelemetry, logs são o mais novo pilar e ainda estão evoluindo, mas já é possível enviar logs estruturados através do SDK.


Instrumentando uma aplicação Go com OpenTelemetry

A instrumentação pode ser manual (via SDK) ou automática (via bibliotecas de contribuição). Vamos ver os passos principais.

Passo 1: Adicionar as dependências

go go.opentelemetry.io/otel
go go.opentelicom.io/otel/sdk
go go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc
go go.opentelemetry.io/otel/exporters/prometheus
go go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp

Passo 2: Configurar o provedor de traces (ex: Jaeger via OTLP)

No código, é necessário criar um provedor de traces e registrá-lo globalmente. O SDK lida com a criação de spans e a propagação de contexto.

Passo 3: Instrumentar o servidor HTTP

Use o middleware otelhttp para capturar traces automaticamente:

handler := otelhttp.NewHandler(meuMux, "servidor")
http.ListenAndServe(":8080", handler)

Passo 4: Adicionar spans customizadas

Para pontos específicos do negócio, crie spans manuais:

ctx, span := tracer.Start(ctx, "processar-pagamento")
defer span.End()
// lógica de pagamento

Passo 5: Exportar métricas para Prometheus

Configure um exportador Prometheus e exponha o endpoint /metrics.

Passo 6: Logs estruturados com contexto de trace

Use uma biblioteca de log (ex: slog ou logrus) que injete trace_id em cada entrada.


Exemplo prático: API de pedidos monitorada

Uma API de pedidos instrumentada com OpenTelemetry pode:

  • Gerar um trace desde a requisição HTTP até as chamadas de banco e serviços externos.
  • Coletar métricas de latência e taxa de erro por endpoint.
  • Associar cada log de erro com o trace_id correspondente.

Com isso, quando um cliente reporta “pedido falhou às 14:32”, você localiza o trace pelo horário, vê exatamente onde a falha ocorreu (ex: timeout no serviço de pagamento) e consulta os logs daquele trace específico.


OpenTelemetry Collector: o roteador de dados

O Coletor OpenTelemetry é um componente que recebe dados de telemetria de várias fontes, processa (amostragem, enriquecimento, filtragem) e exporta para um ou mais backends. Ele pode ser executado como um sidecar, daemon ou deployment no Kubernetes.

Vantagens:

  • Desacopla a instrumentação do backend.
  • Permite enviar o mesmo trace para Jaeger e também para um storage de logs.
  • Oferece amostragem adaptativa para reduzir volume.

Comparativo: OpenTelemetry vs. bibliotecas específicas

AspectoOpenTelemetryPrometheus + Jaeger + libs separadas
Curva de aprendizadoMédiaAlta (cada ferramenta tem sua API)
Vendor lock-inBaixo (padrão aberto)Médio (cada backend exige instrumentação própria)
Facilidade de troca de backendAltaBaixa (reinstrumentação)
MaturidadeEm evolução, mas estávelMadura

Para projetos novos, OpenTelemetry é a recomendação. Para sistemas legados, pode-se migrar gradualmente.


OpenTelemetry e Go: dicas práticas

  • Propague contexto explicitamente em chamadas HTTP: adicione headers (traceparent, tracestate) ou use otelhttp para fazer automaticamente.
  • Para gRPC, use as interceptoras otelgrpc.
  • Em workers de fila, extraia o contexto do envelope da mensagem e crie spans filhos.
  • Cuidado com overhead: traces têm custo; use amostragem (ex: 1% de requisições) em alta carga.
  • Use otel.SetErrorStatus para marcar spans como erro quando ocorrer exceção.

Caso real: marketplace com observabilidade total

Um cliente marketplace com 50 microsserviços Go sofria para identificar gargalos. Implementamos OpenTelemetry com:

  • Exportador OTLP para Jaeger (tracing).
  • Exportador Prometheus (métricas).
  • Logs estruturados com slog injetando trace_id.
  • Coletor OTel agregando dados e aplicando amostragem.

Resultado: tempo médio para identificação de causa raiz caiu de 2 horas para 15 minutos. Migração de um backend de tracing foi feita sem alterar código.


Conclusão

OpenTelemetry é o futuro da observabilidade em sistemas modernos. Em Go, o suporte é maduro e a integração com bibliotecas padrão é direta. Instrumente sua aplicação uma vez e ganhe a flexibilidade de enviar métricas, traces e logs para qualquer backend. O esforço inicial se paga em horas de debug economizadas.

Na Jacobus Software, adotamos OpenTelemetry como padrão em novos projetos. Se você ainda não conhece, vale a pena investir.


🔍 Quer implementar OpenTelemetry nas suas aplicações Go?

Nossos especialistas configuram o SDK, o coletor e os backends – garantindo observabilidade total sem sobrecarregar o time.

👉 Fale com a Jacobus Software

Rolar para cima