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