我是Go的新手,我想知道是否有很好的方法(比如Java中的AOP)在Go中收集方法级执行时间指标?
如果不将这些代码放在常规业务逻辑代码中,那将是最好的。
我不想分析应用。我指的是可以导出到Graphite等的真实生产就绪指标,因此我可以监控响应时间直方图等。
答案 0 :(得分:1)
您可以使用go解析器重写源代码并添加说明。这就是godebug
和覆盖率工具的工作方式:https://github.com/mailgun/godebug。
显然这将是很多工作,但我认为你的方法论无论如何都是有缺陷的。衡量一切意味着您的计划将花费更多的时间来衡量实际工作。这就是为什么只对样本进行分析。
听起来好像你正在研究一个HTTP项目?您可以通过包装所有http.Handler
或使用Negroni等框架轻松检测代码。这是某人做类似事情的example。 Go也有expvar包,它有时对计数器等有用。
另外值得考虑的是使用statsd客户端(可以将您的数据导入Graphite)。这是一个可以做到这一点的软件包:godspeed *。电话很简单:
package main
import (
"fmt"
"net/http"
"time"
"github.com/PagerDuty/godspeed"
"github.com/codegangsta/negroni"
)
func statsdMiddleware(w http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
start := time.Now()
next(w, r)
elapsed := float64(time.Now().Sub(start)) / float64(time.Millisecond)
g, err := godspeed.NewDefault()
if err != nil {
return
}
defer g.Conn.Close()
g.Histogram("http.response.time_ms", elapsed, []string{"path:" + r.URL.Path})
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "Welcome to the home page!")
})
n := negroni.Classic()
n.Use(negroni.HandlerFunc(statsdMiddleware))
n.UseHandler(mux)
n.Run(":3000")
}
此方法也适用于标准TCP服务器。对于管道读/写队列,我通常测量我读取数据的速度和从另一端读出的速度,然后使用背压计进行中间步骤。 (这有助于我找出造成问题的步骤)
免责声明:我在DataDog工作