这个错误提示是因为 promhttp.Handler()
返回的类型是 http.Handler
,而 mux.HandleFunc()
方法需要传入一个形如 func(http.ResponseWriter, *http.Request)
的函数。两者类型不一致导致了编译错误。
解决方法有两种:
- 使用
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)
}
- 将返回值类型为
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
路径时正确地返回监控数据了。