gpt4 book ai didi

http - Go 中的时间 HTTP 响应

转载 作者:IT老高 更新时间:2023-10-28 13:06:52 29 4
gpt4 key购买 nike

在我的 Go 程序中,我发出了一些 HTTP 请求,我需要计时响应时间(而不是请求时间)。

这是我当前的代码(计时请求时间):

func Get() int {
start := time.Now()
result, err := http.Get("http://www.google.com")
if err != nil {
log.Fatal(err)
}
defer result.Body.Close()
elapsed := time.Since(start).Seconds()
log.Println(elapsed)

return result.StatusCode
}

实际上,这段代码会显示大约5s的请求时间,包括DNS解析和其他东西......如果我用Apache JMeter这样的工具执行相同的测试,时间只有100ms左右(这是真正的响应时间服务器的,而不关心请求时间)。

我真正想要的是计算服务器的实际响应时间。我如何在 Go 中计算这个?

最佳答案

不要从完全有效的接受答案中拿走任何东西,要注意的一种替代方法是实现一个自定义 RoundTripper,它包装了默认的 http.Transport 和 net.Dialer。如果您正在检测使用 http.Client 的代码,或者如果您需要支持代理、TLS、keep-alive 或其他 HTTP 功能但不想/不需要重新实现它们,这将很有帮助。您不会像使用完全定制的客户端那样拥有那么多的控制权,但值得在您的工具箱中拥有它。

往返示例:

type customTransport struct {
rtp http.RoundTripper
dialer *net.Dialer
connStart time.Time
connEnd time.Time
reqStart time.Time
reqEnd time.Time
}

func newTransport() *customTransport {
tr := &customTransport{
dialer: &net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
},
}
tr.rtp = &http.Transport{
Proxy: http.ProxyFromEnvironment,
Dial: tr.dial,
TLSHandshakeTimeout: 10 * time.Second,
}
return tr
}

func (tr *customTransport) RoundTrip(r *http.Request) (*http.Response, error) {
tr.reqStart = time.Now()
resp, err := tr.rtp.RoundTrip(r)
tr.reqEnd = time.Now()
return resp, err
}

func (tr *customTransport) dial(network, addr string) (net.Conn, error) {
tr.connStart = time.Now()
cn, err := tr.dialer.Dial(network, addr)
tr.connEnd = time.Now()
return cn, err
}

func (tr *customTransport) ReqDuration() time.Duration {
return tr.Duration() - tr.ConnDuration()
}

func (tr *customTransport) ConnDuration() time.Duration {
return tr.connEnd.Sub(tr.connStart)
}

func (tr *customTransport) Duration() time.Duration {
return tr.reqEnd.Sub(tr.reqStart)
}

我已将其放入一个简单的示例程序中:https://github.com/skyec/go-instrumented-roundtripper/blob/master/main.go

关于http - Go 中的时间 HTTP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30526946/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com