我想尝试使用simple的Prometheus示例。
我已经开始simple code,但修改很少
var addr = flag.String("listen-address", ":8080", "The address to listen on for HTTP requests.")
func main() {
flag.Parse()
http.Handle("/metrics", promhttp.Handler())
http.Handle("/test/{id}", myHandler(promhttp.Handler()))
log.Fatal(http.ListenAndServe(*addr, nil))
}
func myHandler(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello, you've hit %s\n", r.URL.Path)
next.ServeHTTP(w, r)
})
}
问题:
metrics
和/test/{id}
。通过创建多个处理程序并使用promhttp.Handler()
作为中间件,我是否正确地理解了这个想法?答案 0 :(得分:2)
要跟踪@David Maze的答案,默认处理程序promhttp.Handler
用于报告指标。 (从所有注册的处理程序收集并根据要求进行报告)。
不幸的是,它不是一个通用的http中间件,可以为您提供任何现成的指标。
我已经看到Go的许多Web框架都具有某种社区Prometheus中间件(gin's),这些中间件可以提供现成的指标(等待时间,响应代码,请求计数等)。
go prometheus client library包含如何向您的应用程序添加指标的示例。
var (
httpRequests = prometheus.NewCounter(
prometheus.CounterOpts{
Name: "http_requests_total",
Help: "Number of http requests.",
},
)
)
func init() {
// Metrics have to be registered to be exposed:
prometheus.MustRegister(httpRequests)
}
func myHandler(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
httpRequests.Inc()
fmt.Fprintf(w, "hello, you've hit %s\n", r.URL.Path)
next.ServeHTTP(w, r)
})
}
关于第二个问题:) Google倡导监视4个黄金信号:
这些是
在我的experie8inces中,了解应用程序和数据库之间的所有交互(即应用于数据库的四个黄金信号)也很有帮助: