自定义Prometheus Registry如何开启HTTP指标并自动暴露http_requests_total
自定义Prometheus Registry相关问题解答
一、如何在自定义Registry中开启promhttp_metric_handler_requests_total指标
默认情况下,promhttp.Handler会将自身的请求指标注册到Prometheus的默认DefaultRegistry中。你使用了自定义Registry,需要手动将指标收集逻辑与自定义Registry绑定:
- 使用
promhttp.InstrumentMetricHandler函数包装你的指标暴露Handler,把自定义的registry作为第一个参数传入,这样promhttp_*系列指标就会被注册到你的自定义Registry并开始收集数据。 - 让HTTP服务使用这个包装后的Handler来暴露指标接口。
示例代码:
// 替换原来直接使用promhttp.Handler()的写法 metricsHandler := promhttp.InstrumentMetricHandler( registry, promhttp.HandlerFor(registry, promhttp.HandlerOpts{}), ) http.Handle("/metrics", metricsHandler)
二、http_requests_total指标能否无需手动定义自动暴露?
不行。http_requests_total属于业务级别的HTTP请求计数指标,需要统计请求方法、路径、响应码等个性化维度,不同服务的需求差异极大,Prometheus官方没有提供自动生成该指标的机制,必须手动实现:
- 先定义一个带标签的
CounterVec指标:
var httpRequestsTotal = prometheus.NewCounterVec( prometheus.CounterOpts{ Name: "http_requests_total", Help: "Total number of HTTP requests", }, []string{"method", "path", "code"}, // 按需添加标签 )
- 将指标注册到你的自定义Registry:
registry.MustRegister(httpRequestsTotal)
- 编写HTTP中间件,在请求结束后更新计数器(需要包装响应Writer获取状态码):
type loggingResponseWriter struct { http.ResponseWriter statusCode int } func (lr *loggingResponseWriter) WriteHeader(code int) { lr.statusCode = code lr.ResponseWriter.WriteHeader(code) } func prometheusMiddleware(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { lr := &loggingResponseWriter{ResponseWriter: w, statusCode: http.StatusOK} next.ServeHTTP(lr, r) httpRequestsTotal.WithLabelValues(r.Method, r.URL.Path, strconv.Itoa(lr.statusCode)).Inc() }) }
- 用这个中间件包装你的业务Handler:
http.Handle("/api/xxx", prometheusMiddleware(yourBusinessHandler))
内容的提问来源于stack exchange,提问作者9gagger
相关产品推荐
相关产品推荐

