Go
Instrumentação para aplicações Golang com as bibliotecas da Elven Observability.
Instrumentação Go com Elven Observability
Sumário
Visão geral
Pré-requisitos
Exemplo de referência
Configuração de variáveis de ambiente
Bootstrap OpenTelemetry
Instrumentando o HTTP server
Instrumentando o HTTP client
Instrumentando PostgreSQL
Instrumentando Redis
Spans manuais
Métricas customizadas de negócio
Golden Signals mapeados
Worker, retry e DLQ
Estrutura de projeto recomendada
Como rodar localmente
Como validar no collector da Elven
Como adaptar para a sua aplicação
Testes
Troubleshooting
Checklist de deploy
Visão geral
A instrumentação Go da Elven usa o SDK oficial do OpenTelemetry para Go com exportação OTLP HTTP. Ela cobre instrumentação automática de HTTP server e client, PostgreSQL e Redis, além de instrumentação manual de spans e métricas de negócio (golden signals).
O Collector OTLP fica sempre no ambiente do cliente. A aplicação envia traces e métricas para esse Collector local/do cliente, e o Collector encaminha os dados para Tempo e Mimir conforme a arquitetura contratada.
Grafana Tempo para traces
Grafana Mimir para métricas
Grafana para consulta, correlação, painéis e alertas
otelhttp
Instrumentação automática de HTTP server e client. Gera spans e métricas HTTP.
otelsql
Instrumentação de database/sql com spans de queries e métricas de pool.
redisotel
Instrumentação de Redis com spans de operações e métricas de cache/fila.
otlptracehttp
Exporter OTLP HTTP para traces.
otlpmetrichttp
Exporter OTLP HTTP para métricas.
otelprom
Exporter Prometheus para expor métricas localmente em /metrics.
Pré-requisitos
Go 1.21+ instalado
Docker Desktop ou Docker Engine funcionando
Acesso de rede ao collector da Elven
Collector OTLP HTTP aceitando
POST /v1/tracesePOST /v1/metrics
Baseline técnico
Go
1.21+
go.opentelemetry.io/otel
v1.42.0
go.opentelemetry.io/contrib
v1.42.0
otelhttp
v0.67.0
otlptracehttp
v1.42.0
otlpmetrichttp
v1.42.0
otelprom
v0.64.0
chi
v5.2.5
pgx/v5
v5.8.0
go-redis/v9
v9.18.0
redisotel/v9
v9.18.0
otelsql
v0.41.0
Checklist do collector
Antes de subir a aplicação, confirme:
O endpoint de traces está correto
O endpoint de métricas está correto
O header de autenticação está definido (se necessário)
O collector aceita
http/protobuf
Atenção: se o collector exigir token, o valor em
OTEL_EXPORTER_OTLP_HEADERSdeve estar URL-encoded. Exemplo:
Exemplo de referência
A Elven disponibiliza uma aplicação demo completa em Go que demonstra todos os conceitos desta documentação:
👉 elven-observability/go-otel-app
Configuração de variáveis de ambiente
Copie o arquivo de exemplo e preencha com os dados do seu collector:
Configuração mínima funcional:
Sobre
OTEL_SEMCONV_STABILITY_OPT_IN: definir comodatabase(ou*) ativa a semântica de banco de dados mais recente, incluindo a métricadb.client.operation.durationem segundos. Sem isso, algumas instrumentações podem expor métricas legadas em milissegundos.
Bootstrap OpenTelemetry
O ponto central da instrumentação é criar um TracerProvider e um MeterProvider com dois destinos para métricas: o collector OTLP e o endpoint /metrics local (Prometheus).
Instrumentando o HTTP server
Use o middleware otelhttp.NewHandler para instrumentar automaticamente todas as rotas:
Isso gera automaticamente:
Spans para cada request com atributos HTTP (método, rota, status code)
Métricas
http.server.request.durationehttp.server.active_requests
Instrumentando o HTTP client
Isso propaga automaticamente o traceparent header para serviços downstream.
Instrumentando PostgreSQL
Métricas geradas automaticamente:
db.client.operation.duration— latência de queriesdb.client.connection.count— pool de conexõesdb.client.connection.idle— conexões ociosas
Instrumentando Redis
Spans manuais
Para instrumentar operações de negócio específicas:
Métricas customizadas de negócio
Golden Signals mapeados
Latência
http.server.request.duration
Histograma gerado pelo otelhttp
Tráfego
http.server.request.body.size
Gerado automaticamente
Erros
http.server.request.duration{error.type=*}
Status codes 4xx/5xx
Saturação
db.client.connection.count
Pool de conexões do banco
Worker, retry e DLQ
Para workers que processam filas com retry e Dead Letter Queue (DLQ):
Estrutura de projeto recomendada
Como rodar localmente
Como validar no collector da Elven
Após subir a aplicação, valide que os dados estão chegando:
Acesse o Grafana Explore e selecione o datasource Tempo
Busque por
service.name = "go-otel-app"Verifique que os traces aparecem com spans de HTTP, banco e Redis
Troque para o datasource Mimir e busque a métrica
http_server_request_duration_seconds_count
Como adaptar para a sua aplicação
Substitua
go-otel-apppelo nome do seu serviço emOTEL_SERVICE_NAMEe nos atributos do resourceRemova os handlers e services de exemplo, mantenha apenas o bootstrap OTel em
internal/otel/Adicione
otelhttp.NewHandlerno seu HTTP serverAdicione
otelhttp.NewTransportnos seus HTTP clientsInstrumente o banco e Redis conforme as seções acima
Adicione spans manuais nas operações críticas de negócio
Testes
Para testar a instrumentação sem um collector real, use o InMemoryExporter:
Troubleshooting
Traces não aparecem no Tempo
Endpoint incorreto ou sem conectividade
Verifique OTEL_EXPORTER_OTLP_TRACES_ENDPOINT e teste com curl
Métricas não aparecem no Mimir
Autenticação incorreta
Verifique OTEL_EXPORTER_OTLP_HEADERS com token URL-encoded
Erro context deadline exceeded
Collector inacessível
Verifique firewall e rede entre a aplicação e o collector
Métricas de banco em milissegundos
OTEL_SEMCONV_STABILITY_OPT_IN não definido
Adicione OTEL_SEMCONV_STABILITY_OPT_IN=* no .env
Spans sem nome de rota (/)
otelhttp sem WithRouteTag
Use otelhttp.WithRouteTag(route, w, r) nos handlers
Checklist de deploy
[ ]
OTEL_SERVICE_NAMEdefinido com o nome correto do serviço[ ]
OTEL_EXPORTER_OTLP_TRACES_ENDPOINTapontando para o collector[ ]
OTEL_EXPORTER_OTLP_METRICS_ENDPOINTapontando para o collector[ ]
OTEL_EXPORTER_OTLP_HEADERScom token URL-encoded (se necessário)[ ]
OTEL_SEMCONV_STABILITY_OPT_IN=*definido[ ]
otelhttp.NewHandleraplicado no HTTP server[ ] HTTP clients usando
otelhttp.NewTransport[ ] Banco instrumentado com
otelsql[ ] Redis instrumentado com
redisotel[ ] Traces visíveis no Grafana Tempo
[ ] Métricas visíveis no Grafana Mimir
Last updated
Was this helpful?

