ZBLOG

cannot use promhttp.Handler() (value of type http.Handler) as func(http.ResponseWriter, *http.Request) value in a rgument to mux.HandleFunc

这个错误提示是因为 promhttp.Handler() 返回的类型是 http.Handler,而 mux.HandleFunc() 方法需要传入一个形如 func(http.ResponseWriter, *http.Request) 的函数。两者类型不一致导致了编译错误。

解决方法有两种:

  1. 使用 mux.Handle() 方法来注册处理器,而非使用 mux.HandleFunc()Handle() 方法接收一个实现了 ServeHTTP(http.ResponseWriter, *http.Request) 接口的处理器对象作为参数,因此可以直接将 promhttp.Handler() 作为参数传递进去。示例代码如下:
import (
    "net/http"
    "github.com/gorilla/mux"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
    r := mux.NewRouter()
    r.Handle("/metrics", promhttp.Handler())

    http.ListenAndServe(":8080", r)
}
  1. 将返回值类型为 http.Handler 的处理器包装成符合要求的函数。这里可以借助 Go 语言提供的闭包特性来进行包装,示例代码如下:
import (
    "net/http"
    "github.com/gorilla/mux"
    "github.com/prometheus/client_golang/prometheus/promhttp"
)

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/metrics", func(w http.ResponseWriter, req *http.Request) {
        promhttp.Handler().ServeHTTP(w, req)
    })

    http.ListenAndServe(":8080", r)
}

这里我们定义了一个匿名函数作为处理函数,并在内部调用了 promhttp.Handler().ServeHTTP() 方法来将请求转发给 Prometheus 的 metrics 处理器。这样就可以成功注册处理器,并在访问 /metrics 路径时正确地返回监控数据了。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=3050

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?