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