Golang 小技巧:使用 httptrace 分析 HTTP 请求耗时

举报
Ray999 发表于 2026/09/23 08:48:53 2026/09/23
【摘要】 在 Go 中,如果一个 HTTP 请求很慢,只看最终耗时往往不知道慢在哪里。可能是:DNS 查询慢TCP 连接慢TLS 握手慢服务响应慢这时候可以使用标准库里的 httptrace 分析请求过程。例如:trace := &httptrace.ClientTrace{ DNSStart: func(info httptrace.DNSStartInfo) { fmt.Println("开始 ...

在 Go 中,如果一个 HTTP 请求很慢,只看最终耗时往往不知道慢在哪里。

可能是:

  • DNS 查询慢
  • TCP 连接慢
  • TLS 握手慢
  • 服务响应慢

这时候可以使用标准库里的 httptrace 分析请求过程。

例如:

trace := &httptrace.ClientTrace{
	DNSStart: func(info httptrace.DNSStartInfo) {
		fmt.Println("开始 DNS 查询")
	},

	ConnectStart: func(network, addr string) {
		fmt.Println("开始连接:", addr)
	},

	GotFirstResponseByte: func() {
		fmt.Println("收到首字节")
	},
}

ctx := httptrace.WithClientTrace(
	context.Background(),
	trace,
)

req, _ := http.NewRequestWithContext(
	ctx,
	"GET",
	"https://example.com",
	nil,
)

resp, err := http.DefaultClient.Do(req)
if err != nil {
	return
}

defer resp.Body.Close()

运行时可以看到类似:

开始 DNS 查询
开始连接: 93.xxx.xxx.xxx:443
收到首字节

这样可以快速判断请求慢在哪个阶段。

小结

当需要排查 HTTP 请求耗时时,可以使用:

httptrace.WithClientTrace(ctx, trace)

它非常适合:

  • 接口性能排查
  • 网络问题定位
  • HTTP 客户端优化
  • 微服务调用分析

相比只统计整个请求耗时,httptrace 可以帮助你定位具体瓶颈。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。