当前位置: 首页 > 面试题库 >

在golang中获取TTFB(到第一个字节的时间)值

马晓博
2023-03-14
问题内容

我正在尝试获取价值TTFB和连接价值

    c := exec.Command(
        "curl", "-w",
        "Connect: %{time_connect} TTFB: %{time_starttransfer} Total time: %{time_total}",
        "-o",
        "/dev/null",
        "http://my.domain/favicon.ico")

    cID, err := c.Run()
    fmt.Printf("%s", cID)

它会像

Connect: 0.205 TTFB: 0.353 Total time: 0.354

但是,我只需要TTFB , Connect, Total timegolang变量中value的值。

另外,有什么方法可以在不专门使用curl的情况下获取值?


问题答案:

自Go 1.7起就有对此的内置支持。Go
1.7添加了HTTP跟踪,请阅读博客文章:HTTP跟踪简介

您可以指定在发出HTTP(S)请求时在适当的阶段/点调用的回调函数。您可以通过创建值来指定回调函数httptrace.ClientTrace,然后使用来“武装”它httptrace.WithClientTrace()

这是一个示例函数,该函数获取URL参数,并打印获取它的时间:

func timeGet(url string) {
    req, _ := http.NewRequest("GET", url, nil)

    var start, connect, dns, tlsHandshake time.Time

    trace := &httptrace.ClientTrace{
        DNSStart: func(dsi httptrace.DNSStartInfo) { dns = time.Now() },
        DNSDone: func(ddi httptrace.DNSDoneInfo) {
            fmt.Printf("DNS Done: %v\n", time.Since(dns))
        },

        TLSHandshakeStart: func() { tlsHandshake = time.Now() },
        TLSHandshakeDone: func(cs tls.ConnectionState, err error) {
            fmt.Printf("TLS Handshake: %v\n", time.Since(tlsHandshake))
        },

        ConnectStart: func(network, addr string) { connect = time.Now() },
        ConnectDone: func(network, addr string, err error) {
            fmt.Printf("Connect time: %v\n", time.Since(connect))
        },

        GotFirstResponseByte: func() {
            fmt.Printf("Time from start to first byte: %v\n", time.Since(start))
        },
    }

    req = req.WithContext(httptrace.WithClientTrace(req.Context(), trace))
    start = time.Now()
    if _, err := http.DefaultTransport.RoundTrip(req); err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Total time: %v\n", time.Since(start))
}

调用它的示例:

timeGet("https://google.com")

输出示例:

DNS Done: 7.998465ms
Connect time: 12.677085ms
TLS Handshake: 128.65394ms
Time from start to first byte: 176.461087ms
Total time: 176.723402ms

另外,请务必查看github.com/davecheney/httpstat,它为您提供了一个CLI实用程序,该实用程序也可以在后台使用该httptracing软件包。



 类似资料:
  • 从六月份左右开始,我们在整个站点上经历了奇怪的第一个字节的时间滞后行为。在使用这个站点时,问题是显而易见的(有时应用程序在10-20秒内没有响应),它也存在于通过webpagetest.org进行的瀑布分析中。我们总部设在丹麦,但从任何主持人那里得到这个结果。 为了确认问题,我们执行了一个基准测试,向一个简单页面发送300个相同的请求,并测量响应时间。如果我们向首页发送300个请求,中值响应时间在

  • 问题内容: 如何从Python列表中的第一个字符串中获取第一个字符? 看来我可以使用,但不会给我第一个字符。 问题答案: 你几乎是对的。最简单的方法是 但 也可以。 你想 结束 的第一个字符(字符零)后,未 启动 的第一个字符(字符零),这是以后有什么在你的问题的手段的代码。

  • 我想知道一张linkedhashmap的名字,但只知道最后一张。 这是我的hashmap,我只打印出姓氏。我如何得到第一个?有没有办法把它链接到密钥上。例如,“gumt”打印出Gumtäktsuni.bibliotek? 输出: 我也有一个生效的节点类。节点类:

  • 问题内容: 我正在和熊猫打架,现在我正在失去。我有与此类似的源表: 我想从列“ First”中的值的第一位开始向该数据帧添加新列:a)从列“ First”中的字符串更改为数字b)从新创建的字符串中提取第一个字符c)来自b的结果另存为新的数据框中的列 我不知道如何将其应用于熊猫数据框对象。我将非常感谢您的帮助。 问题答案: 铸山坳来,你可以进行矢量化切片呼吁: 如果需要,可以再次调用列

  • 问题内容: 我正在尝试使程序执行以下操作: 假设我们有一个被设置为的被叫。我想输出给用户,每个单词的第一个字符。我尝试使用该方法,但是没有成功。 我的代码: 我试图检测是否有空格,那么我可以简单地获取下一个索引。谁能告诉我我在做什么错? 问题答案: 尝试按(空格)分割,然后获取每个单词的(第一个字符)并按如下方式打印:

  • 问题内容: 我试图从所有内容都在一个列中的地址中提取状态,这是一个示例: 我一直在尝试找出如何使用和一起做,但是我似乎无法掌握。这是我到目前为止的内容: 我以为它会从第二个逗号开始,到第三个逗号结束,并且让我的所有内容介于两者之间,但事实并非如此。 任何帮助表示赞赏。 问题答案: 一般来说, 例子: