Skip to content

Commit

Permalink
- fix how tls phase is computed
Browse files Browse the repository at this point in the history
  • Loading branch information
kgersen committed Mar 14, 2021
1 parent e948256 commit a81574d
Showing 1 changed file with 21 additions and 5 deletions.
26 changes: 21 additions & 5 deletions prober/http.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ package prober

import (
"context"
"crypto/tls"
"errors"
"fmt"
"io"
Expand Down Expand Up @@ -119,6 +120,8 @@ type roundTripTrace struct {
gotConn time.Time
responseStart time.Time
end time.Time
tlsStart time.Time
tlsDone time.Time
}

// transport is a custom transport keeping traces for each HTTP roundtrip.
Expand Down Expand Up @@ -202,6 +205,16 @@ func (t *transport) GotFirstResponseByte() {
defer t.mu.Unlock()
t.current.responseStart = time.Now()
}
func (t *transport) TLSHandshakeStart() {
t.mu.Lock()
defer t.mu.Unlock()
t.current.tlsStart = time.Now()
}
func (t *transport) TLSHandshakeDone(_ tls.ConnectionState, _ error) {
t.mu.Lock()
defer t.mu.Unlock()
t.current.tlsDone = time.Now()
}

// byteCounter implements an io.ReadCloser that keeps track of the total
// number of bytes it has read.
Expand Down Expand Up @@ -411,6 +424,8 @@ func ProbeHTTP(ctx context.Context, target string, module config.Module, registr
ConnectDone: tt.ConnectDone,
GotConn: tt.GotConn,
GotFirstResponseByte: tt.GotFirstResponseByte,
TLSHandshakeStart: tt.TLSHandshakeStart,
TLSHandshakeDone: tt.TLSHandshakeDone,
}
request = request.WithContext(httptrace.WithClientTrace(request.Context(), trace))

Expand Down Expand Up @@ -521,6 +536,8 @@ func ProbeHTTP(ctx context.Context, target string, module config.Module, registr
"connectDone", trace.connectDone,
"gotConn", trace.gotConn,
"responseStart", trace.responseStart,
"tlsStart", trace.tlsStart,
"tlsDone", trace.tlsDone,
"end", trace.end,
)
// We get the duration for the first request from chooseProtocol.
Expand All @@ -532,13 +549,12 @@ func ProbeHTTP(ctx context.Context, target string, module config.Module, registr
continue
}
if trace.tls {
// dnsDone must be set if gotConn was set.
durationGaugeVec.WithLabelValues("connect").Add(trace.connectDone.Sub(trace.dnsDone).Seconds())
durationGaugeVec.WithLabelValues("tls").Add(trace.gotConn.Sub(trace.dnsDone).Seconds())
} else {
durationGaugeVec.WithLabelValues("connect").Add(trace.gotConn.Sub(trace.dnsDone).Seconds())
durationGaugeVec.WithLabelValues("tls").Add(trace.tlsDone.Sub(trace.tlsStart).Seconds())
}

// actual connection - we could add a new phase between connectDone and gotConn
durationGaugeVec.WithLabelValues("connect").Add(trace.gotConn.Sub(trace.dnsDone).Seconds())

// Continue here if we never got a response from the server.
if trace.responseStart.IsZero() {
continue
Expand Down

0 comments on commit a81574d

Please sign in to comment.