Bibliotecas Cliente Prometheus & OpenTelemetry
Serviços Go em produção expõem métricas Prometheus para dashboards e traces OpenTelemetry para depuração de latência de requisições.
Busque em todas as páginas da documentação
Serviços Go em produção expõem métricas Prometheus para dashboards e traces OpenTelemetry para depuração de latência de requisições.
As bibliotecas cliente ficam na borda HTTP/gRPC e envolvem chamadas de saída sem substituir sua pilha de logging.
Cartão de receita de referência rápida - pronto para copiar e colar.
import (
"net/http"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
http.Handle("/metrics", promhttp.Handler())import (
"go.opentelemetry.io/otel"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
)
handler := otelhttp.NewHandler(mux, "api")Quando usar isso:
/metrics ou um coletor OTel recebe OTLPpackage main
import (
"context"
"log"
"net/http"
"time"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"github.com/prometheus/client_golang/prometheus/promhttp"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"go.opentelemetry.io/otel"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
"go.opentelemetry.io/otel/trace"
)
var (
httpDuration = promauto.NewHistogramVec(prometheus.HistogramOpts{
Name: "http_request_duration_seconds",
Help: "HTTP request latency",
Buckets: prometheus.DefBuckets,
}, []string{"method", "route", "status"})
)
func initTracer() trace.TracerProvider {
tp := sdktrace.NewTracerProvider()
otel.SetTracerProvider(tp)
return tp
}
func metricsMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
start := time.Now()
ww := middleware.NewWrapResponseWriter(w, r.ProtoMajor)
next.ServeHTTP(ww, r)
route := chi.RouteContext(r.Context()).RoutePattern()
httpDuration.WithLabelValues(r.Method, route, http.StatusText(ww.Status())).Observe(time.Since(start).Seconds())
})
}
func main() {
tp := initTracer()
defer func() { _ = tp.Shutdown(context.Background()) }()
r := chi.NewRouter()
r.Use(metricsMiddleware)
r.Get("/health", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(200) })
r.Handle("/metrics", promhttp.Handler())
root := otelhttp.NewHandler(r, "api")
log.Fatal(http.ListenAndServe(":8080", root))
}O que isso demonstra:
method, route, status)chi para estabilidade de labels (evite URLs brutas com IDs)promhttp.Handler em um caminho dedicado para scraperspromhttp expõe o formato de exposição de texto.TracerProvider, exportadores (OTLP gRPC/HTTP) e atributos de recurso (service.name).traceparent.| Tipo | Uso | Exemplo |
|---|---|---|
| Counter | Totais monótonos | http_requests_total |
| Gauge | Valores pontuais | go_goroutines, profundidade da fila |
| Histogram | Distribuições de latência | http_request_duration_seconds |
| Summary | Quantis no lado do cliente | Use histograma + queries Prometheus em vez disso, quando possível |
exporter, _ := otlptracegrpc.New(ctx)
tp := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exporter),
sdktrace.WithResource(resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceName("orders-api"),
)),
)
otel.SetTracerProvider(tp)service.name com labels de implantação para busca de traces.promauto apenas quando um único registro for suficiente; bibliotecas devem aceitar parâmetros prometheus.Registerer.go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc de forma semelhante./users/123 por requisição explode as séries. Correção: use chi.RoutePattern() ou nomes de rota com template.prometheus.Registerer para os construtores.Shutdown em SIGTERM com tempo limite de esvaziamento gracioso./metrics vaza detalhes operacionais. Correção: listener separado ou política de rede na porta de administração.
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
expvar | Pequenos contadores de depuração internos | Você precisa de histogramas e Grafana |
| Clientes StatsD/DogStatsD | A organização exige o agente Datadog | A plataforma padronizou em Prometheus |
| Agentes APM de fornecedor | Tracing totalmente gerenciado | Você quer portabilidade OTLP |
| Apenas Logs | Protótipo inicial | SLOs de produção exigem métricas |
Muitas equipes mantêm o cliente Prometheus para coleta enquanto adotam OTel para traces; a maturidade das métricas OTel varia - siga a orientação da plataforma.
Use pacotes de middleware contrib ou envolva o engine como http.Handler com otelhttp no ponto de montagem.
Adicione interceptadores unary/stream de otelgrpc e grpc-prometheus ao lado da instrumentação HTTP.
Essa seção cobre slog, dashboards RED e sondas de saúde; esta página foca nas bibliotecas cliente Prometheus e OTel.
Comece com DefBuckets para APIs; ajuste os buckets do histograma quando os limites de SLO se agruparem longe dos padrões.
Use um registro personalizado nos testes, colete métricas com Gather() e afirme os valores de contador/histograma com testify.
Sim - injete trace_id em campos slog/zap via baggage OTel ou contexto de span no middleware.
No mínimo service.name e service.version; adicione deployment.environment para filtragem multi-ambiente.
controller-runtime expõe métricas para operadores Kubernetes; as mesmas regras de cardinalidade se aplicam.
Mantenha a configuração do SDK OTel em main ou internal/telemetry; pacotes de negócios dependem de interfaces, não de exportadores.
Versões de Stack: Esta página foi escrita para Go 1.26.x (GC padrão Green Tea, go fix modernizers - verifique o patch na compilação), chi (última - verifique na compilação), gin (última - verifique na compilação), echo (última - verifique na compilação), google.golang.org/grpc (última - verifique na compilação), sigs.k8s.io/controller-runtime (última - verifique na compilação), kubebuilder (última - verifique na compilação), tinygo (última - verifique os alvos de placa na compilação), wazero (última - verifique na compilação) e golangci-lint (última - verifique o conjunto de linters na compilação).
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026