From: kgersen Date: Sun, 14 Mar 2021 17:38:43 +0000 (+0100) Subject: - fix how tls phase is computed X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=35d3790cacc772dcaf2091413d5e57fdba39f81a;p=blackbox_exporter.git - fix how tls phase is computed Signed-off-by: kgersen --- diff --git a/prober/http.go b/prober/http.go index 41182d6..c1f3433 100644 --- a/prober/http.go +++ b/prober/http.go @@ -15,6 +15,7 @@ package prober import ( "context" + "crypto/tls" "errors" "fmt" "io" @@ -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. @@ -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. @@ -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)) @@ -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. @@ -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