我想尝试simple使用Prometheus的例子。
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)
})
}
问题:
我认为Prometheus是监控工具,我想分别监控端点metrics
和/test/{id}
。通过创建几个处理程序并使用promhttp.Handler()
作为中间件,我是否正确地理解了这个想法?
在例如,可以监视请求的数量和延迟的其他部分。简单的web应用程序与数据库要跟进@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)
})
}
至于你的第二个问题很多:)谷歌主张监测4个黄金信号:
这些是
在我的经验中,了解应用程序与数据库之间的所有交互(即应用于数据库的4个黄金信号)也很有帮助: