Documentation ¶
Overview ¶
Package tracex performs measurements using tracing. To use tracing means that we'll wrap netx data types (e.g., a Dialer) with equivalent data types saving events into a Saver data struture. Then we will use the data types normally (e.g., call the Dialer's DialContet method and then use the resulting connection). When done, we will extract the trace containing all the events that occurred from the saver and process it to determine what happened during the measurement itself.
This package is now frozen. Please, use measurexlite for new code. See https://github.com/ooni/probe-cli/blob/master/docs/design/dd-003-step-by-step.md for details about this.
Index ¶
- Variables
- func NewFailedOperation(err error) *string
- func NewFailure(err error) *string
- func ResolverNetworkAdaptNames(input string) string
- type DNSAnswerEntry
- type DNSQueryEntry
- type DNSTransportSaver
- func (txp *DNSTransportSaver) Address() string
- func (txp *DNSTransportSaver) CloseIdleConnections()
- func (txp *DNSTransportSaver) Network() string
- func (txp *DNSTransportSaver) RequiresPadding() bool
- func (txp *DNSTransportSaver) RoundTrip(ctx context.Context, query model.DNSQuery) (model.DNSResponse, error)
- type DialerConnSaver
- type DialerSaver
- type Event
- type EventConnectOperation
- type EventDNSRoundTripDone
- type EventDNSRoundTripStart
- type EventHTTPTransactionDone
- type EventHTTPTransactionStart
- type EventQUICHandshakeDone
- type EventQUICHandshakeStart
- type EventReadFromOperation
- type EventReadOperation
- type EventResolveDone
- type EventResolveStart
- type EventTLSHandshakeDone
- type EventTLSHandshakeStart
- type EventValue
- type EventWriteOperation
- type EventWriteToOperation
- type ExtSpec
- type FailureStr
- type HTTPBody
- type HTTPHeader
- type HTTPRequest
- type HTTPResponse
- type HTTPTransportSaver
- type MaybeBinaryValue
- type NetworkEvent
- type QUICDialerSaver
- type QUICListenerSaver
- type RequestEntry
- type ResolverSaver
- func (r *ResolverSaver) Address() string
- func (r *ResolverSaver) CloseIdleConnections()
- func (r *ResolverSaver) LookupHTTPS(ctx context.Context, domain string) (*model.HTTPSSvc, error)
- func (r *ResolverSaver) LookupHost(ctx context.Context, hostname string) ([]string, error)
- func (r *ResolverSaver) LookupNS(ctx context.Context, domain string) ([]*net.NS, error)
- func (r *ResolverSaver) Network() string
- type Saver
- func (s *Saver) MaybeWrapHTTPTransport(txp model.HTTPTransport, snapshotSize int64) model.HTTPTransport
- func (s *Saver) NewConnectObserver() model.DialerWrapper
- func (s *Saver) NewReadWriteObserver() model.DialerWrapper
- func (s *Saver) Read() []Event
- func (s *Saver) WrapDNSTransport(txp model.DNSTransport) model.DNSTransport
- func (s *Saver) WrapQUICDialer(qd model.QUICDialer) model.QUICDialer
- func (s *Saver) WrapQUICListener(ql model.QUICListener) model.QUICListener
- func (s *Saver) WrapResolver(r model.Resolver) model.Resolver
- func (s *Saver) WrapTLSHandshaker(thx model.TLSHandshaker) model.TLSHandshaker
- func (s *Saver) Write(ev Event)
- type TCPConnectEntry
- type TCPConnectStatus
- type TLSHandshake
- type TLSHandshakerSaver
Constants ¶
This section is empty.
Variables ¶
var ( ExtDNS = model.ArchivalExtDNS ExtNetevents = model.ArchivalExtNetevents ExtHTTP = model.ArchivalExtHTTP ExtTCPConnect = model.ArchivalExtTCPConnect ExtTLSHandshake = model.ArchivalExtTLSHandshake ExtTunnel = model.ArchivalExtTunnel )
Compatibility variables. Most experiments still use these names.
Functions ¶
func NewFailedOperation ¶
NewFailedOperation creates a failed operation string from the given error.
func NewFailure ¶
NewFailure creates a failure nullable string from the given error. This function is equivalent to NewFailureStr(err).ToFailure().
func ResolverNetworkAdaptNames ¶
ResolverNetworkAdaptNames makes sure we map the netxlite.StdlibResolverGolangNetResolver and netxlite.StdlibResolverGetaddrinfo resolver names to netxlite.StdlibResolverSystem. You MUST call this function when your resolver splits the "stdlib" resolver results into two fake AAAA and A queries rather than faking a single ANY query.
See https://github.com/ooni/spec/pull/257 for more information.
Types ¶
type DNSAnswerEntry ¶
type DNSAnswerEntry = model.ArchivalDNSAnswer
Compatibility types. Most experiments still use these names.
type DNSQueryEntry ¶
type DNSQueryEntry = model.ArchivalDNSLookupResult
Compatibility types. Most experiments still use these names.
func NewDNSQueriesList ¶
func NewDNSQueriesList(begin time.Time, events []Event) (out []DNSQueryEntry)
NewDNSQueriesList returns a list of DNS queries.
type DNSTransportSaver ¶
type DNSTransportSaver struct { // DNSTransport is the underlying DNS transport. DNSTransport model.DNSTransport // Saver saves events. Saver *Saver }
DNSTransportSaver is a DNS transport that saves events.
func (*DNSTransportSaver) Address ¶
func (txp *DNSTransportSaver) Address() string
func (*DNSTransportSaver) CloseIdleConnections ¶
func (txp *DNSTransportSaver) CloseIdleConnections()
func (*DNSTransportSaver) Network ¶
func (txp *DNSTransportSaver) Network() string
func (*DNSTransportSaver) RequiresPadding ¶
func (txp *DNSTransportSaver) RequiresPadding() bool
func (*DNSTransportSaver) RoundTrip ¶
func (txp *DNSTransportSaver) RoundTrip( ctx context.Context, query model.DNSQuery) (model.DNSResponse, error)
RoundTrip implements RoundTripper.RoundTrip
type DialerConnSaver ¶
type DialerConnSaver struct { // Dialer is the underlying dialer Dialer model.Dialer // Saver saves events Saver *Saver }
DialerConnSaver wraps the returned connection such that we collect all the read/write events that occur.
func (*DialerConnSaver) CloseIdleConnections ¶
func (d *DialerConnSaver) CloseIdleConnections()
func (*DialerConnSaver) DialContext ¶
func (d *DialerConnSaver) DialContext(ctx context.Context, network, address string) (net.Conn, error)
DialContext implements Dialer.DialContext
type DialerSaver ¶
type DialerSaver struct { // Dialer is the underlying dialer, Dialer model.Dialer // Saver saves events. Saver *Saver }
DialerSaver saves events occurring during the dial
func (*DialerSaver) CloseIdleConnections ¶
func (d *DialerSaver) CloseIdleConnections()
func (*DialerSaver) DialContext ¶
DialContext implements Dialer.DialContext
type Event ¶
type Event interface { // Value returns the event value Value() *EventValue // Name returns the event name Name() string }
Event is one of the events within a trace.
type EventConnectOperation ¶
type EventConnectOperation struct {
V *EventValue
}
EventConnectOperation contains information about the connect operation.
func (*EventConnectOperation) Name ¶
func (ev *EventConnectOperation) Name() string
func (*EventConnectOperation) Value ¶
func (ev *EventConnectOperation) Value() *EventValue
type EventDNSRoundTripDone ¶
type EventDNSRoundTripDone struct {
V *EventValue
}
EventDNSRoundTripDone is the end of a DNS round trip.
func (*EventDNSRoundTripDone) Name ¶
func (ev *EventDNSRoundTripDone) Name() string
func (*EventDNSRoundTripDone) Value ¶
func (ev *EventDNSRoundTripDone) Value() *EventValue
type EventDNSRoundTripStart ¶
type EventDNSRoundTripStart struct {
V *EventValue
}
EventDNSRoundTripStart is the start of a DNS round trip.
func (*EventDNSRoundTripStart) Name ¶
func (ev *EventDNSRoundTripStart) Name() string
func (*EventDNSRoundTripStart) Value ¶
func (ev *EventDNSRoundTripStart) Value() *EventValue
type EventHTTPTransactionDone ¶
type EventHTTPTransactionDone struct {
V *EventValue
}
EventHTTPTransactionDone is the end of an HTTP transaction.
func (*EventHTTPTransactionDone) Name ¶
func (ev *EventHTTPTransactionDone) Name() string
func (*EventHTTPTransactionDone) Value ¶
func (ev *EventHTTPTransactionDone) Value() *EventValue
type EventHTTPTransactionStart ¶
type EventHTTPTransactionStart struct {
V *EventValue
}
EventHTTPTransactionStart is the beginning of an HTTP transaction.
func (*EventHTTPTransactionStart) Name ¶
func (ev *EventHTTPTransactionStart) Name() string
func (*EventHTTPTransactionStart) Value ¶
func (ev *EventHTTPTransactionStart) Value() *EventValue
type EventQUICHandshakeDone ¶
type EventQUICHandshakeDone struct {
V *EventValue
}
EventQUICHandshakeDone is the end of a QUIC handshake.
func (*EventQUICHandshakeDone) Name ¶
func (ev *EventQUICHandshakeDone) Name() string
func (*EventQUICHandshakeDone) Value ¶
func (ev *EventQUICHandshakeDone) Value() *EventValue
type EventQUICHandshakeStart ¶
type EventQUICHandshakeStart struct {
V *EventValue
}
EventQUICHandshakeStart is the start of a QUIC handshake.
func (*EventQUICHandshakeStart) Name ¶
func (ev *EventQUICHandshakeStart) Name() string
func (*EventQUICHandshakeStart) Value ¶
func (ev *EventQUICHandshakeStart) Value() *EventValue
type EventReadFromOperation ¶
type EventReadFromOperation struct {
V *EventValue
}
EventReadFromOperation summarizes the ReadFrom operation.
func (*EventReadFromOperation) Name ¶
func (ev *EventReadFromOperation) Name() string
func (*EventReadFromOperation) Value ¶
func (ev *EventReadFromOperation) Value() *EventValue
type EventReadOperation ¶
type EventReadOperation struct {
V *EventValue
}
EventReadOperation contains information about a read operation.
func (*EventReadOperation) Name ¶
func (ev *EventReadOperation) Name() string
func (*EventReadOperation) Value ¶
func (ev *EventReadOperation) Value() *EventValue
type EventResolveDone ¶
type EventResolveDone struct {
V *EventValue
}
EventResolveDone is the end of a DNS lookup operation.
func (*EventResolveDone) Name ¶
func (ev *EventResolveDone) Name() string
func (*EventResolveDone) Value ¶
func (ev *EventResolveDone) Value() *EventValue
type EventResolveStart ¶
type EventResolveStart struct {
V *EventValue
}
EventResolveStart is the beginning of a DNS lookup operation.
func (*EventResolveStart) Name ¶
func (ev *EventResolveStart) Name() string
func (*EventResolveStart) Value ¶
func (ev *EventResolveStart) Value() *EventValue
type EventTLSHandshakeDone ¶
type EventTLSHandshakeDone struct {
V *EventValue
}
EventTLSHandshakeDone is the end of the TLS handshake.
func (*EventTLSHandshakeDone) Name ¶
func (ev *EventTLSHandshakeDone) Name() string
func (*EventTLSHandshakeDone) Value ¶
func (ev *EventTLSHandshakeDone) Value() *EventValue
type EventTLSHandshakeStart ¶
type EventTLSHandshakeStart struct {
V *EventValue
}
EventTLSHandshakeStart is the beginning of the TLS handshake.
func (*EventTLSHandshakeStart) Name ¶
func (ev *EventTLSHandshakeStart) Name() string
func (*EventTLSHandshakeStart) Value ¶
func (ev *EventTLSHandshakeStart) Value() *EventValue
type EventValue ¶
type EventValue struct { Addresses []string `json:",omitempty"` Address string `json:",omitempty"` DNSQuery []byte `json:",omitempty"` DNSResponse []byte `json:",omitempty"` Data []byte `json:",omitempty"` Duration time.Duration `json:",omitempty"` Err FailureStr `json:",omitempty"` HTTPMethod string `json:",omitempty"` HTTPRequestHeaders http.Header `json:",omitempty"` HTTPResponseHeaders http.Header `json:",omitempty"` HTTPResponseBody []byte `json:",omitempty"` HTTPResponseBodyIsTruncated bool `json:",omitempty"` HTTPStatusCode int `json:",omitempty"` HTTPURL string `json:",omitempty"` Hostname string `json:",omitempty"` NoTLSVerify bool `json:",omitempty"` NumBytes int `json:",omitempty"` Proto string `json:",omitempty"` TLSServerName string `json:",omitempty"` TLSCipherSuite string `json:",omitempty"` TLSNegotiatedProto string `json:",omitempty"` TLSNextProtos []string `json:",omitempty"` TLSPeerCerts [][]byte `json:",omitempty"` TLSVersion string `json:",omitempty"` Time time.Time `json:",omitempty"` Transport string `json:",omitempty"` }
Event is one of the events within a trace
type EventWriteOperation ¶
type EventWriteOperation struct {
V *EventValue
}
EventWriteOperation contains information about a write operation.
func (*EventWriteOperation) Name ¶
func (ev *EventWriteOperation) Name() string
func (*EventWriteOperation) Value ¶
func (ev *EventWriteOperation) Value() *EventValue
type EventWriteToOperation ¶
type EventWriteToOperation struct {
V *EventValue
}
EventWriteToOperation summarizes the WriteTo operation.
func (*EventWriteToOperation) Name ¶
func (ev *EventWriteToOperation) Name() string
func (*EventWriteToOperation) Value ¶
func (ev *EventWriteToOperation) Value() *EventValue
type ExtSpec ¶
type ExtSpec = model.ArchivalExtSpec
Compatibility types. Most experiments still use these names.
type FailureStr ¶
type FailureStr string
FailureStr is the string representation of an error. The empty string represents the absence of any error.
func NewFailureStr ¶
func NewFailureStr(err error) FailureStr
NewFailureStr creates a FailureStr from an error. If the error is not already an ErrWrapper, it's converted to an ErrWrapper. If the ErrWrapper's Failure is not empty, we return that. Otherwise we return a string indicating that an ErrWrapper has an empty failure (should not happen).
func (FailureStr) IsNil ¶
func (fs FailureStr) IsNil() bool
IsNil returns whether this FailureStr is nil. Technically speaking, the failure cannot be nil, but an empty string is equivalent to nil after we convert using ToFailure(). Also, this type is often called Err, Error, or Failure. So, the resulting code actually reads correct.
func (FailureStr) IsNotNil ¶
func (fs FailureStr) IsNotNil() bool
IsNotNil is the opposite of IsNil. Technically speaking, the failure cannot be nil, but an empty string is equivalent to nil after we convert using ToFailure(). Also, this type is often called Err, Error, or Failure. So, the resulting code actually reads correct.
func (FailureStr) ToFailure ¶
func (fs FailureStr) ToFailure() (out *string)
ToFailure converts a FailureStr to a OONI failure (i.e., a string on error and nil in case of success).
type HTTPBody ¶
type HTTPBody = model.ArchivalHTTPBody
Compatibility types. Most experiments still use these names.
type HTTPHeader ¶
type HTTPHeader = model.ArchivalHTTPHeader
Compatibility types. Most experiments still use these names.
type HTTPRequest ¶
type HTTPRequest = model.ArchivalHTTPRequest
Compatibility types. Most experiments still use these names.
type HTTPResponse ¶
type HTTPResponse = model.ArchivalHTTPResponse
Compatibility types. Most experiments still use these names.
type HTTPTransportSaver ¶
type HTTPTransportSaver struct { // HTTPTransport is the MANDATORY underlying HTTP transport. HTTPTransport model.HTTPTransport // Saver is the MANDATORY saver to use. Saver *Saver // SnapshotSize is the OPTIONAL maximum body snapshot size (if not set, we'll // use 1<<17, which we've been using since the ooni/netx days) SnapshotSize int64 }
HTTPTransportSaver is a RoundTripper that saves events related to the HTTP transaction
func (*HTTPTransportSaver) CloseIdleConnections ¶
func (txp *HTTPTransportSaver) CloseIdleConnections()
func (*HTTPTransportSaver) Network ¶
func (txp *HTTPTransportSaver) Network() string
type MaybeBinaryValue ¶
type MaybeBinaryValue = model.ArchivalMaybeBinaryData
Compatibility types. Most experiments still use these names.
type NetworkEvent ¶
type NetworkEvent = model.ArchivalNetworkEvent
Compatibility types. Most experiments still use these names.
func NewNetworkEventsList ¶
func NewNetworkEventsList(begin time.Time, events []Event) (out []NetworkEvent)
NewNetworkEventsList returns a list of network events.
type QUICDialerSaver ¶
type QUICDialerSaver struct { // QUICDialer is the wrapped dialer QUICDialer model.QUICDialer // Saver saves events Saver *Saver }
QUICDialerSaver saves events occurring during the QUIC handshake.
func (*QUICDialerSaver) CloseIdleConnections ¶
func (h *QUICDialerSaver) CloseIdleConnections()
func (*QUICDialerSaver) DialContext ¶
func (h *QUICDialerSaver) DialContext(ctx context.Context, host string, tlsCfg *tls.Config, cfg *quic.Config) (quic.EarlyConnection, error)
DialContext implements QUICDialer.DialContext
type QUICListenerSaver ¶
type QUICListenerSaver struct { // QUICListener is the underlying QUICListener. QUICListener model.QUICListener // Saver is the underlying Saver. Saver *Saver }
QUICListenerSaver is a QUICListener that also implements saving events.
func (*QUICListenerSaver) Listen ¶
func (qls *QUICListenerSaver) Listen(addr *net.UDPAddr) (model.UDPLikeConn, error)
Listen implements QUICListener.Listen.
type RequestEntry ¶
type RequestEntry = model.ArchivalHTTPRequestResult
Compatibility types. Most experiments still use these names.
func NewRequestList ¶
func NewRequestList(begin time.Time, events []Event) (out []RequestEntry)
NewRequestList returns the list for "requests"
type ResolverSaver ¶
type ResolverSaver struct { // Resolver is the underlying resolver. Resolver model.Resolver // Saver saves events. Saver *Saver }
ResolverSaver is a resolver that saves events.
func (*ResolverSaver) Address ¶
func (r *ResolverSaver) Address() string
func (*ResolverSaver) CloseIdleConnections ¶
func (r *ResolverSaver) CloseIdleConnections()
func (*ResolverSaver) LookupHTTPS ¶
func (*ResolverSaver) LookupHost ¶
LookupHost implements Resolver.LookupHost
func (*ResolverSaver) Network ¶
func (r *ResolverSaver) Network() string
type Saver ¶
type Saver struct {
// contains filtered or unexported fields
}
The Saver saves a trace. The zero value of this type is valid and can be used without initialization.
func (*Saver) MaybeWrapHTTPTransport ¶
func (s *Saver) MaybeWrapHTTPTransport(txp model.HTTPTransport, snapshotSize int64) model.HTTPTransport
MaybeWrapHTTPTransport wraps the HTTPTransport to save events if this Saver is not nil and otherwise just returns the given HTTPTransport. The snapshotSize argument is the maximum response body snapshot size to save per response.
func (*Saver) NewConnectObserver ¶
func (s *Saver) NewConnectObserver() model.DialerWrapper
NewConnectObserver returns a DialerWrapper that observes the connect event. This function will return nil, which is a valid DialerWrapper for netxlite.WrapDialer, if Saver is nil.
func (*Saver) NewReadWriteObserver ¶
func (s *Saver) NewReadWriteObserver() model.DialerWrapper
NewReadWriteObserver returns a DialerWrapper that observes the I/O events. This function will return nil, which is a valid DialerWrapper for netxlite.WrapDialer, if Saver is nil.
func (*Saver) Read ¶
Read reads and returns events inside the trace. It advances the read pointer so you won't see such events again.
func (*Saver) WrapDNSTransport ¶
func (s *Saver) WrapDNSTransport(txp model.DNSTransport) model.DNSTransport
WrapDNSTransport wraps a model.DNSTransport with a SaverDNSTransport that will save the DNS round trip results into this Saver.
When this function is invoked on a nil Saver, it will directly return the original DNSTransport without any wrapping.
func (*Saver) WrapQUICDialer ¶
func (s *Saver) WrapQUICDialer(qd model.QUICDialer) model.QUICDialer
WrapQUICDialer wraps a model.QUICDialer with a QUICHandshakeSaver that will save the QUIC handshake results into this Saver.
When this function is invoked on a nil Saver, it will directly return the original QUICDialer without any wrapping.
func (*Saver) WrapQUICListener ¶
func (s *Saver) WrapQUICListener(ql model.QUICListener) model.QUICListener
WrapQUICListener wraps a model.QUICDialer with a QUICListenerSaver that will save the QUIC I/O packet conn events into this Saver.
When this function is invoked on a nil Saver, it will directly return the original QUICListener without any wrapping.
func (*Saver) WrapResolver ¶
WrapResolver wraps a model.Resolver with a SaverResolver that will save the DNS lookup results into this Saver.
When this function is invoked on a nil Saver, it will directly return the original Resolver without any wrapping.
func (*Saver) WrapTLSHandshaker ¶
func (s *Saver) WrapTLSHandshaker(thx model.TLSHandshaker) model.TLSHandshaker
WrapTLSHandshaker wraps a model.TLSHandshaker with a SaverTLSHandshaker that will save the TLS handshake results into this Saver.
When this function is invoked on a nil Saver, it will directly return the original TLSHandshaker without any wrapping.
type TCPConnectEntry ¶
type TCPConnectEntry = model.ArchivalTCPConnectResult
Compatibility types. Most experiments still use these names.
func NewTCPConnectList ¶
func NewTCPConnectList(begin time.Time, events []Event) (out []TCPConnectEntry)
NewTCPConnectList creates a new TCPConnectList
type TCPConnectStatus ¶
type TCPConnectStatus = model.ArchivalTCPConnectStatus
Compatibility types. Most experiments still use these names.
type TLSHandshake ¶
type TLSHandshake = model.ArchivalTLSOrQUICHandshakeResult
Compatibility types. Most experiments still use these names.
func NewTLSHandshakesList ¶
func NewTLSHandshakesList(begin time.Time, events []Event) (out []TLSHandshake)
NewTLSHandshakesList creates a new TLSHandshakesList
type TLSHandshakerSaver ¶
type TLSHandshakerSaver struct { // TLSHandshaker is the underlying TLS handshaker. TLSHandshaker model.TLSHandshaker // Saver is the saver in which to save events. Saver *Saver }
TLSHandshakerSaver saves events occurring during the TLS handshake.