Golang中的方法级执行时间指标?

时间:2015-10-04 12:24:06

标签: go

我是Go的新手,我想知道是否有很好的方法(比如Java中的AOP)在Go中收集方法级执行时间指标?

如果不将这些代码放在常规业务逻辑代码中,那将是最好的。

我不想分析应用。我指的是可以导出到Graphite等的真实生产就绪指标,因此我可以监控响应时间直方图等。

1 个答案:

答案 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工作