1// build example 2 3package main 4 5import ( 6 "fmt" 7 "io" 8 "os" 9 "time" 10) 11 12// RecordTrace outputs the request trace as text. 13func RecordTrace(w io.Writer, trace *RequestTrace) { 14 attempt := AttemptReport{ 15 Reused: trace.Reused, 16 Latency: trace.Finish.Sub(trace.Start), 17 ReqWritten: trace.RequestWritten.Sub(trace.Start), 18 } 19 20 if !trace.FirstResponseByte.IsZero() { 21 attempt.RespFirstByte = trace.FirstResponseByte.Sub(trace.Start) 22 attempt.WaitRespFirstByte = trace.FirstResponseByte.Sub(trace.RequestWritten) 23 } 24 25 if !trace.Reused { 26 attempt.DNSStart = trace.DNSStart.Sub(trace.Start) 27 attempt.DNSDone = trace.DNSDone.Sub(trace.Start) 28 attempt.DNS = trace.DNSDone.Sub(trace.DNSStart) 29 30 attempt.ConnectStart = trace.ConnectStart.Sub(trace.Start) 31 attempt.ConnectDone = trace.ConnectDone.Sub(trace.Start) 32 attempt.Connect = trace.ConnectDone.Sub(trace.ConnectStart) 33 34 attempt.TLSHandshakeStart = trace.TLSHandshakeStart.Sub(trace.Start) 35 attempt.TLSHandshakeDone = trace.TLSHandshakeDone.Sub(trace.Start) 36 attempt.TLSHandshake = trace.TLSHandshakeDone.Sub(trace.TLSHandshakeStart) 37 } 38 39 _, err := fmt.Fprintln(w, 40 "Latency:", 41 attempt.Latency, 42 43 "ConnectionReused:", 44 fmt.Sprintf("%t", attempt.Reused), 45 46 "DNSStartAt:", 47 fmt.Sprintf("%s", attempt.DNSStart), 48 "DNSDoneAt:", 49 fmt.Sprintf("%s", attempt.DNSDone), 50 "DNSDur:", 51 fmt.Sprintf("%s", attempt.DNS), 52 53 "ConnectStartAt:", 54 fmt.Sprintf("%s", attempt.ConnectStart), 55 "ConnectDoneAt:", 56 fmt.Sprintf("%s", attempt.ConnectDone), 57 "ConnectDur:", 58 fmt.Sprintf("%s", attempt.Connect), 59 60 "TLSStatAt:", 61 fmt.Sprintf("%s", attempt.TLSHandshakeStart), 62 "TLSDoneAt:", 63 fmt.Sprintf("%s", attempt.TLSHandshakeDone), 64 "TLSDur:", 65 fmt.Sprintf("%s", attempt.TLSHandshake), 66 67 "RequestWritten", 68 fmt.Sprintf("%s", attempt.ReqWritten), 69 "RespFirstByte:", 70 fmt.Sprintf("%s", attempt.RespFirstByte), 71 "WaitRespFirstByte:", 72 fmt.Sprintf("%s", attempt.WaitRespFirstByte), 73 ) 74 if err != nil { 75 fmt.Fprintf(os.Stderr, "failed to write request trace, %v\n", err) 76 } 77} 78 79// AttemptReport proviedes the structured timing information. 80type AttemptReport struct { 81 Latency time.Duration 82 Reused bool 83 Err error 84 85 DNSStart time.Duration 86 DNSDone time.Duration 87 DNS time.Duration 88 89 ConnectStart time.Duration 90 ConnectDone time.Duration 91 Connect time.Duration 92 93 TLSHandshakeStart time.Duration 94 TLSHandshakeDone time.Duration 95 TLSHandshake time.Duration 96 97 ReqWritten time.Duration 98 RespFirstByte time.Duration 99 WaitRespFirstByte time.Duration 100} 101