summaryrefslogtreecommitdiff
path: root/traceable/traceable.go
diff options
context:
space:
mode:
Diffstat (limited to 'traceable/traceable.go')
-rw-r--r--traceable/traceable.go56
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
+}