You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义Prometheus Registry如何开启HTTP指标并自动暴露http_requests_total

自定义Prometheus Registry相关问题解答

一、如何在自定义Registry中开启promhttp_metric_handler_requests_total指标

默认情况下,promhttp.Handler会将自身的请求指标注册到Prometheus的默认DefaultRegistry中。你使用了自定义Registry,需要手动将指标收集逻辑与自定义Registry绑定:

  1. 使用promhttp.InstrumentMetricHandler函数包装你的指标暴露Handler,把自定义的registry作为第一个参数传入,这样promhttp_*系列指标就会被注册到你的自定义Registry并开始收集数据。
  2. 让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官方没有提供自动生成该指标的机制,必须手动实现:

  1. 先定义一个带标签的CounterVec指标:
var httpRequestsTotal = prometheus.NewCounterVec(
    prometheus.CounterOpts{
        Name: "http_requests_total",
        Help: "Total number of HTTP requests",
    },
    []string{"method", "path", "code"}, // 按需添加标签
)
  1. 将指标注册到你的自定义Registry:
registry.MustRegister(httpRequestsTotal)
  1. 编写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()
    })
}
  1. 用这个中间件包装你的业务Handler:
http.Handle("/api/xxx", prometheusMiddleware(yourBusinessHandler))

内容的提问来源于stack exchange,提问作者9gagger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:46:08