ooni-probe-cli/internal/engine/legacy/netxlogger/netxlogger.go
Simone Basso c74c94d616
cleanup: remove ConnID, DialID, TransactionID (#395)
We are not using them anymore. The only nettest still using the
legacy netx implementation is tor, for which setting these fields
is useless, because it performs each measurement into a separate
goroutine. Hence, let us start removing this part of the legacy
netx codebase, which is hampering progress in other areas.

Occurred to me while doing testing for the recent changes in
error mapping (https://github.com/ooni/probe/issues/1505).
2021-06-23 13:36:45 +02:00

154 lines
3.2 KiB
Go

// Package netxlogger is a logger for netx events.
//
// This package is a fork of github.com/ooni/netx/x/logger where
// we applied ooni/probe-engine specific customisations.
package netxlogger
import (
"net/http"
"strings"
"github.com/ooni/probe-cli/v3/internal/engine/legacy/netx/modelx"
"github.com/ooni/probe-cli/v3/internal/engine/netx/tlsx"
)
// Logger is the interface we expect from a logger
type Logger interface {
Debug(msg string)
Debugf(format string, v ...interface{})
}
// Handler is a handler that logs events.
type Handler struct {
logger Logger
}
// NewHandler returns a new logging handler.
func NewHandler(logger Logger) *Handler {
return &Handler{logger: logger}
}
// OnMeasurement logs the specific measurement
func (h *Handler) OnMeasurement(m modelx.Measurement) {
// DNS
if m.ResolveStart != nil {
h.logger.Debugf(
"resolving: %s",
m.ResolveStart.Hostname,
)
}
if m.ResolveDone != nil {
h.logger.Debugf(
"resolve done: %s, %s",
fmtError(m.ResolveDone.Error),
m.ResolveDone.Addresses,
)
}
// Syscalls
if m.Connect != nil {
h.logger.Debugf(
"connect done: %s, %s (rtt=%s)",
fmtError(m.Connect.Error),
m.Connect.RemoteAddress,
m.Connect.SyscallDuration,
)
}
// TLS
if m.TLSHandshakeStart != nil {
h.logger.Debugf(
"TLS handshake: (forceSNI='%s')",
m.TLSHandshakeStart.SNI,
)
}
if m.TLSHandshakeDone != nil {
h.logger.Debugf(
"TLS done: %s, %s (alpn='%s')",
fmtError(m.TLSHandshakeDone.Error),
tlsx.VersionString(m.TLSHandshakeDone.ConnectionState.Version),
m.TLSHandshakeDone.ConnectionState.NegotiatedProtocol,
)
}
// HTTP round trip
if m.HTTPRequestHeadersDone != nil {
proto := "HTTP/1.1"
for key := range m.HTTPRequestHeadersDone.Headers {
if strings.HasPrefix(key, ":") {
proto = "HTTP/2.0"
break
}
}
h.logger.Debugf(
"> %s %s %s",
m.HTTPRequestHeadersDone.Method,
m.HTTPRequestHeadersDone.URL.RequestURI(),
proto,
)
if proto == "HTTP/2.0" {
h.logger.Debugf(
"> Host: %s",
m.HTTPRequestHeadersDone.URL.Host,
)
}
for key, values := range m.HTTPRequestHeadersDone.Headers {
if strings.HasPrefix(key, ":") {
continue
}
for _, value := range values {
h.logger.Debugf(
"> %s: %s",
key, value,
)
}
}
h.logger.Debug(">")
}
if m.HTTPRequestDone != nil {
h.logger.Debug("request sent; waiting for response")
}
if m.HTTPResponseStart != nil {
h.logger.Debug("start receiving response")
}
if m.HTTPRoundTripDone != nil && m.HTTPRoundTripDone.Error == nil {
h.logger.Debugf(
"< %s %d %s",
m.HTTPRoundTripDone.ResponseProto,
m.HTTPRoundTripDone.ResponseStatusCode,
http.StatusText(int(m.HTTPRoundTripDone.ResponseStatusCode)),
)
for key, values := range m.HTTPRoundTripDone.ResponseHeaders {
for _, value := range values {
h.logger.Debugf(
"< %s: %s",
key, value,
)
}
}
h.logger.Debug("<")
}
// HTTP response body
if m.HTTPResponseBodyPart != nil {
h.logger.Debugf(
"body part: %s, %d",
fmtError(m.HTTPResponseBodyPart.Error),
len(m.HTTPResponseBodyPart.Data),
)
}
if m.HTTPResponseDone != nil {
h.logger.Debug(
"end of response",
)
}
}
func fmtError(err error) (s string) {
s = "success"
if err != nil {
s = err.Error()
}
return
}