diff options
| author | Rich Brown <[email protected]> | 2022-05-05 06:32:23 -0400 |
|---|---|---|
| committer | Rich Brown <[email protected]> | 2022-05-05 06:32:23 -0400 |
| commit | 79c333fd9811f01eb7277faeeae10fb026ccc84a (patch) | |
| tree | 3f17058344c5e40d29c81a617b4d99ae28070d6c /traceable/traceable.go | |
| parent | 67c44be2794a3d49a372c73b859c8063888f3fac (diff) | |
| parent | 2a9feb82b55481308c0f6aa9d813e9021b0333ef (diff) | |
Merge branch 'main' of https://github.com/richb-hanover/goresponsiveness-1
* 'main' of https://github.com/richb-hanover/goresponsiveness-1:
Upgraded RPM Calculation Support (Take 1)
Make Traceable Interface and Refactor Debugging
Fully support self-signed certificates (and add debug levels)
Diffstat (limited to 'traceable/traceable.go')
| -rw-r--r-- | traceable/traceable.go | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/traceable/traceable.go b/traceable/traceable.go new file mode 100644 index 0000000..6efc7f7 --- /dev/null +++ b/traceable/traceable.go @@ -0,0 +1,64 @@ +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) + SetHttpWroteRequestTimeInfo(time.Time, httptrace.WroteRequestInfo) + SetHttpResponseReadyTime(time.Time) +} + +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) + }, + WroteRequest: func(wroteRequest httptrace.WroteRequestInfo) { + traceable.SetHttpWroteRequestTimeInfo(time.Now(), wroteRequest) + }, + GotFirstResponseByte: func() { + traceable.SetHttpResponseReadyTime(time.Now()) + }, + } + return &tracer +} |
