summaryrefslogtreecommitdiff
path: root/traceable/traceable.go
diff options
context:
space:
mode:
authorRich Brown <[email protected]>2022-05-05 06:32:23 -0400
committerRich Brown <[email protected]>2022-05-05 06:32:23 -0400
commit79c333fd9811f01eb7277faeeae10fb026ccc84a (patch)
tree3f17058344c5e40d29c81a617b4d99ae28070d6c /traceable/traceable.go
parent67c44be2794a3d49a372c73b859c8063888f3fac (diff)
parent2a9feb82b55481308c0f6aa9d813e9021b0333ef (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.go64
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
+}