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

3

我对Go还比较陌生,想知道是否有类似Java中AOP的方式来收集Go方法级别的执行时间指标?最好不要将这样的代码放在常规业务逻辑代码中。

我不想对应用程序进行性能分析。我的意思是真正的生产就绪指标,可以导出到Graphite等工具中,以便我可以监视响应时间直方图等内容。


2
你的意思是除了内置的分析器之外? - Not_a_Golfer
2
http://blog.golang.org/profiling-go-programs - twotwotwo
是的。因此它可以在生产环境中运行,并提供可导出的业务指标,例如:Graphite。我见过一些用Go编写的“度量”项目,但它们都要求你将业务逻辑与计量逻辑混合在一起,这很糟糕(在我的观点中)。 - Rafal G.
1个回答

1
您可以使用Go解析器重写源代码并添加指令。这就是和覆盖工具的工作原理:https://github.com/mailgun/godebug
显然,这将是很多工作,但我认为您的方法有缺陷。测量所有内容意味着您的程序将花费比实际工作更多的时间来进行测量。这就是为什么只对分析进行抽样的原因。
听起来您可能正在开发HTTP项目?您可以通过包装所有或使用像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工作

感谢您的回复和提示。我不知道您从哪里看到我想要测量所有东西 :) 我只是希望能够以声明方式定义应该被测量的函数(不仅仅是HTTP请求,而且还包括我对外部系统的请求)。我不喜欢您粘贴的代码中性能逻辑与业务逻辑交织在一起,但我想这可能是Golang目前所能提供的全部。谢谢! - Rafal G.
当然,Go语言的方法并不完美。但是AOP也有其缺点。 - Rick-777

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接