diff options
| author | Will Hawkins <[email protected]> | 2022-05-04 17:51:50 -0400 |
|---|---|---|
| committer | Will Hawkins <[email protected]> | 2022-05-04 17:51:50 -0400 |
| commit | 10ddc4e9c56beeb5718cd878313ddf88695a1948 (patch) | |
| tree | 284c151bae39d24b5fb613dddd858340d8f82bcf /traceable | |
| parent | fa647c6645f74e3c0e6fded658f5f8b5882b0e01 (diff) | |
Make Traceable Interface and Refactor Debugging
1. Make a traceable interface for all things that can be wrapped
in an httptrace.ClientTrace.
2. Refactor debugging system into debug package.
Diffstat (limited to 'traceable')
| -rw-r--r-- | traceable/traceable.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/traceable/traceable.go b/traceable/traceable.go new file mode 100644 index 0000000..e3f81d5 --- /dev/null +++ b/traceable/traceable.go @@ -0,0 +1,56 @@ +package traceable + +import ( + "crypto/tls" + "net/http/httptrace" + "time" + + "github.com/network-quality/goresponsiveness/debug" +) + +type Traceable interface { + SetDnsStartTimeInfo(time.Time, httptrace.DNSStartInfo) + SetDnsDoneTimeInfo(time.Time, httptrace.DNSDoneInfo) + SetConnectStartTime(time.Time) + SetConnectDoneTimeError(time.Time, error) + SetGetConnTime(time.Time) + SetGotConnTimeInfo(time.Time, httptrace.GotConnInfo) + SetTLSHandshakeStartTime(time.Time) + SetTLSHandshakeDoneTimeState(time.Time, tls.ConnectionState) +} + +func GenerateHttpTimingTracer( + traceable Traceable, + debug debug.DebugLevel, +) *httptrace.ClientTrace { + tracer := httptrace.ClientTrace{ + DNSStart: func(dnsStartInfo httptrace.DNSStartInfo) { + traceable.SetDnsStartTimeInfo(time.Now(), dnsStartInfo) + }, + DNSDone: func(dnsDoneInfo httptrace.DNSDoneInfo) { + traceable.SetDnsDoneTimeInfo(time.Now(), dnsDoneInfo) + }, + ConnectStart: func(network, address string) { + traceable.SetConnectStartTime(time.Now()) + }, + ConnectDone: func(network, address string, err error) { + traceable.SetConnectDoneTimeError(time.Now(), err) + }, + GetConn: func(hostPort string) { + traceable.SetGetConnTime(time.Now()) + }, + GotConn: func(connInfo httptrace.GotConnInfo) { + if connInfo.Reused { + panic(!connInfo.Reused) + } + traceable.SetGotConnTimeInfo(time.Now(), connInfo) + }, + TLSHandshakeStart: func() { + traceable.SetTLSHandshakeStartTime(time.Now()) + }, + TLSHandshakeDone: func(tlsConnState tls.ConnectionState, err error) { + traceable.SetTLSHandshakeDoneTimeState(time.Now(), tlsConnState) + }, + } + return &tracer +} |
