func addConnectionTracingToRequestContext()

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
}