in pkg/middleware/arm_error_collector.go [189:243]
func addConnectionTracingToRequestContext(ctx context.Context, connTracking *HttpConnTracking) context.Context {
var getConn, dnsStart, connStart, tlsStart *time.Time
trace := &httptrace.ClientTrace{
GetConn: func(hostPort string) {
getConn = to.Ptr(time.Now())
},
GotConn: func(connInfo httptrace.GotConnInfo) {
if getConn != nil {
connTracking.TotalLatency = fmt.Sprintf("%dms", time.Now().Sub(*getConn).Milliseconds())
}
connTracking.ReqConnInfo = &connInfo
},
DNSStart: func(_ httptrace.DNSStartInfo) {
dnsStart = to.Ptr(time.Now())
},
DNSDone: func(dnsInfo httptrace.DNSDoneInfo) {
if dnsInfo.Err == nil {
if dnsStart != nil {
connTracking.DnsLatency = fmt.Sprintf("%dms", time.Now().Sub(*dnsStart).Milliseconds())
}
} else {
connTracking.DnsLatency = dnsInfo.Err.Error()
}
},
ConnectStart: func(_, _ string) {
connStart = to.Ptr(time.Now())
},
ConnectDone: func(_, _ string, err error) {
if err == nil {
if connStart != nil {
connTracking.ConnLatency = fmt.Sprintf("%dms", time.Now().Sub(*connStart).Milliseconds())
}
} else {
connTracking.ConnLatency = err.Error()
}
},
TLSHandshakeStart: func() {
tlsStart = to.Ptr(time.Now())
},
TLSHandshakeDone: func(t tls.ConnectionState, err error) {
if err == nil {
if tlsStart != nil {
connTracking.TlsLatency = fmt.Sprintf("%dms", time.Now().Sub(*tlsStart).Milliseconds())
}
connTracking.Protocol = t.NegotiatedProtocol
} else {
connTracking.TlsLatency = err.Error()
}
},
}
ctx = httptrace.WithClientTrace(ctx, trace)
return ctx
}