haystack

package module
v0.0.0-...-74a82a8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 17, 2022 License: Apache-2.0 Imports: 20 Imported by: 6

README

Build Status License

Haystack bindings for Go OpenTracing API.

This is Haystack's client library for Golang that implements OpenTracing API 1.0.

How to use the library?

Check our detailed example on how to initialize tracer, start a span and send it to one of the dispatchers. This example is actually an integration test uses haystack-agent container

How to build this library?

git clone --recursive https://github.com/ExpediaDotCom/haystack-client-go - clone the repo

make glide - if you are running for the very first time

make test validate - go test and validate the code

Documentation

Index

Constants

This section is empty.

Variables

View Source
var DispatchResult_ResultCode_name = map[int32]string{
	0: "SUCCESS",
	1: "UNKNOWN_ERROR",
	2: "RATE_LIMIT_ERROR",
}
View Source
var DispatchResult_ResultCode_value = map[string]int32{
	"SUCCESS":          0,
	"UNKNOWN_ERROR":    1,
	"RATE_LIMIT_ERROR": 2,
}
View Source
var Tag_TagType_name = map[int32]string{
	0: "STRING",
	1: "DOUBLE",
	2: "BOOL",
	3: "LONG",
	4: "BINARY",
}
View Source
var Tag_TagType_value = map[string]int32{
	"STRING": 0,
	"DOUBLE": 1,
	"BOOL":   2,
	"LONG":   3,
	"BINARY": 4,
}

Functions

func NewTracer

func NewTracer(
	serviceName string,
	dispatcher Dispatcher,
	options ...TracerOption,
) (opentracing.Tracer, io.Closer)

NewTracer creates a new tracer

func RegisterSpanAgentServer

func RegisterSpanAgentServer(s *grpc.Server, srv SpanAgentServer)

Types

type Batch

type Batch struct {
	Spans                []*Span  `protobuf:"bytes,1,rep,name=spans,proto3" json:"spans,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

You can optionally use Batch to send a collection of spans. Spans may not necessarily belong to one traceId.

func (*Batch) Descriptor

func (*Batch) Descriptor() ([]byte, []int)

func (*Batch) GetSpans

func (m *Batch) GetSpans() []*Span

func (*Batch) ProtoMessage

func (*Batch) ProtoMessage()

func (*Batch) Reset

func (m *Batch) Reset()

func (*Batch) String

func (m *Batch) String() string

func (*Batch) XXX_DiscardUnknown

func (m *Batch) XXX_DiscardUnknown()

func (*Batch) XXX_Marshal

func (m *Batch) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*Batch) XXX_Merge

func (m *Batch) XXX_Merge(src proto.Message)

func (*Batch) XXX_Size

func (m *Batch) XXX_Size() int

func (*Batch) XXX_Unmarshal

func (m *Batch) XXX_Unmarshal(b []byte) error

type Codex

type Codex interface {
	Encode(value string) string
	Decode(value string) string
}

Codex defines the interface for encoding and decoding the propagated data

type DefaultCodex

type DefaultCodex struct{}

DefaultCodex is a no op

func (DefaultCodex) Decode

func (c DefaultCodex) Decode(value string) string

Decode a no-op for decoding the value

func (DefaultCodex) Encode

func (c DefaultCodex) Encode(value string) string

Encode a no-op for encoding the value

type DispatchResult

type DispatchResult struct {
	Code                 DispatchResult_ResultCode `protobuf:"varint,1,opt,name=code,proto3,enum=DispatchResult_ResultCode" json:"code,omitempty"`
	ErrorMessage         string                    `protobuf:"bytes,2,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (*DispatchResult) Descriptor

func (*DispatchResult) Descriptor() ([]byte, []int)

func (*DispatchResult) GetCode

func (*DispatchResult) GetErrorMessage

func (m *DispatchResult) GetErrorMessage() string

func (*DispatchResult) ProtoMessage

func (*DispatchResult) ProtoMessage()

func (*DispatchResult) Reset

func (m *DispatchResult) Reset()

func (*DispatchResult) String

func (m *DispatchResult) String() string

func (*DispatchResult) XXX_DiscardUnknown

func (m *DispatchResult) XXX_DiscardUnknown()

func (*DispatchResult) XXX_Marshal

func (m *DispatchResult) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*DispatchResult) XXX_Merge

func (m *DispatchResult) XXX_Merge(src proto.Message)

func (*DispatchResult) XXX_Size

func (m *DispatchResult) XXX_Size() int

func (*DispatchResult) XXX_Unmarshal

func (m *DispatchResult) XXX_Unmarshal(b []byte) error

type DispatchResult_ResultCode

type DispatchResult_ResultCode int32
const (
	DispatchResult_SUCCESS          DispatchResult_ResultCode = 0
	DispatchResult_UNKNOWN_ERROR    DispatchResult_ResultCode = 1
	DispatchResult_RATE_LIMIT_ERROR DispatchResult_ResultCode = 2
)

func (DispatchResult_ResultCode) EnumDescriptor

func (DispatchResult_ResultCode) EnumDescriptor() ([]byte, []int)

func (DispatchResult_ResultCode) String

func (x DispatchResult_ResultCode) String() string

type Dispatcher

type Dispatcher interface {
	Name() string
	Dispatch(span *_Span)
	DispatchProtoSpan(span *Span)
	Close()
	SetLogger(logger Logger)
}

Dispatcher dispatches the span object

func NewAgentDispatcher

func NewAgentDispatcher(host string, port int, timeout time.Duration, maxQueueLength int) Dispatcher

NewAgentDispatcher creates a new haystack-agent dispatcher

func NewDefaultAgentDispatcher

func NewDefaultAgentDispatcher() Dispatcher

NewDefaultAgentDispatcher creates a new haystack-agent dispatcher

func NewDefaultHTTPDispatcher

func NewDefaultHTTPDispatcher() Dispatcher

NewDefaultHTTPDispatcher creates a new http dispatcher

func NewFileDispatcher

func NewFileDispatcher(filename string) Dispatcher

NewFileDispatcher creates a new file dispatcher

func NewHTTPDispatcher

func NewHTTPDispatcher(url string, timeout time.Duration, headers map[string]string, maxQueueLength int) Dispatcher

NewHTTPDispatcher creates a new haystack-agent dispatcher

func NewInMemoryDispatcher

func NewInMemoryDispatcher() Dispatcher

NewInMemoryDispatcher creates a new in memory dispatcher

type FileDispatcher

type FileDispatcher struct {
	// contains filtered or unexported fields
}

FileDispatcher file dispatcher

func (*FileDispatcher) Close

func (d *FileDispatcher) Close()

Close down the file dispatcher

func (*FileDispatcher) Dispatch

func (d *FileDispatcher) Dispatch(span *_Span)

Dispatch dispatches the span object

func (*FileDispatcher) DispatchProtoSpan

func (d *FileDispatcher) DispatchProtoSpan(span *Span)

DispatchProtoSpan dispatches proto span object

func (*FileDispatcher) Name

func (d *FileDispatcher) Name() string

Name gives the Dispatcher name

func (*FileDispatcher) SetLogger

func (d *FileDispatcher) SetLogger(logger Logger)

SetLogger sets the logger to use

type GrpcClient

type GrpcClient struct {
	// contains filtered or unexported fields
}

GrpcClient grpc client

func NewGrpcClient

func NewGrpcClient(host string, port int, timeout time.Duration) *GrpcClient

NewGrpcClient returns a new grpc client

func (*GrpcClient) Close

func (c *GrpcClient) Close() error

Close the grpc client

func (*GrpcClient) Send

func (c *GrpcClient) Send(span *Span)

Send a proto span to grpc server

func (*GrpcClient) SetLogger

func (c *GrpcClient) SetLogger(logger Logger)

SetLogger sets the logger

type HTTPClient

type HTTPClient struct {
	// contains filtered or unexported fields
}

HTTPClient a http client

func NewHTTPClient

func NewHTTPClient(url string, headers map[string]string, timeout time.Duration) *HTTPClient

NewHTTPClient returns a new http client

func (*HTTPClient) Close

func (c *HTTPClient) Close() error

Close the http client

func (*HTTPClient) Send

func (c *HTTPClient) Send(span *Span)

Send a proto span to http server

func (*HTTPClient) SetLogger

func (c *HTTPClient) SetLogger(logger Logger)

SetLogger sets the logger

type InMemoryDispatcher

type InMemoryDispatcher struct {
	// contains filtered or unexported fields
}

InMemoryDispatcher implements the Dispatcher interface

func (*InMemoryDispatcher) Close

func (d *InMemoryDispatcher) Close()

Close down the inMemory dispatcher

func (*InMemoryDispatcher) Dispatch

func (d *InMemoryDispatcher) Dispatch(span *_Span)

Dispatch dispatches the span object

func (*InMemoryDispatcher) DispatchProtoSpan

func (d *InMemoryDispatcher) DispatchProtoSpan(span *Span)

DispatchProtoSpan dispatches proto span object

func (*InMemoryDispatcher) Name

func (d *InMemoryDispatcher) Name() string

Name gives the Dispatcher name

func (*InMemoryDispatcher) SetLogger

func (d *InMemoryDispatcher) SetLogger(logger Logger)

SetLogger sets the logger to use

type Log

type Log struct {
	Timestamp            int64    `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
	Fields               []*Tag   `protobuf:"bytes,2,rep,name=fields,proto3" json:"fields,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

Log is a timestamped event with a set of tags.

func (*Log) Descriptor

func (*Log) Descriptor() ([]byte, []int)

func (*Log) GetFields

func (m *Log) GetFields() []*Tag

func (*Log) GetTimestamp

func (m *Log) GetTimestamp() int64

func (*Log) ProtoMessage

func (*Log) ProtoMessage()

func (*Log) Reset

func (m *Log) Reset()

func (*Log) String

func (m *Log) String() string

func (*Log) XXX_DiscardUnknown

func (m *Log) XXX_DiscardUnknown()

func (*Log) XXX_Marshal

func (m *Log) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*Log) XXX_Merge

func (m *Log) XXX_Merge(src proto.Message)

func (*Log) XXX_Size

func (m *Log) XXX_Size() int

func (*Log) XXX_Unmarshal

func (m *Log) XXX_Unmarshal(b []byte) error

type Logger

type Logger interface {
	Info(format string, v ...interface{})
	Error(format string, v ...interface{})
	Debug(format string, v ...interface{})
}

Logger defines a new logger interface

type NullLogger

type NullLogger struct{}

NullLogger does nothing

func (NullLogger) Debug

func (logger NullLogger) Debug(format string, v ...interface{})

Debug prints the info message

func (NullLogger) Error

func (logger NullLogger) Error(format string, v ...interface{})

Error prints the error message

func (NullLogger) Info

func (logger NullLogger) Info(format string, v ...interface{})

Info prints the info message

type Propagator

type Propagator interface {
	// Inject takes `SpanContext` and injects it into `carrier`
	Inject(ctx *SpanContext, carrier interface{}) error

	// Extract `SpanContext` from the `carrier`
	Extract(carrier interface{}) (*SpanContext, error)
}

Propagator defines the interface for injecting and extracing the SpanContext from the carrier

type PropagatorOpts

type PropagatorOpts struct {
	TraceIDKEYName       string
	SpanIDKEYName        string
	ParentSpanIDKEYName  string
	BaggagePrefixKEYName string
}

PropagatorOpts defines the options need by a propagator

func (*PropagatorOpts) BaggageKeyPrefix

func (p *PropagatorOpts) BaggageKeyPrefix() string

BaggageKeyPrefix returns the baggage key prefix

func (*PropagatorOpts) ParentSpanIDKEY

func (p *PropagatorOpts) ParentSpanIDKEY() string

ParentSpanIDKEY returns the parent span id key in the propagator

func (*PropagatorOpts) SpanIDKEY

func (p *PropagatorOpts) SpanIDKEY() string

SpanIDKEY returns the span id key in the propagator

func (*PropagatorOpts) TraceIDKEY

func (p *PropagatorOpts) TraceIDKEY() string

TraceIDKEY returns the trace id key in the propagator

type RemoteClient

type RemoteClient interface {
	Send(span *Span)
	Close() error
	SetLogger(logger Logger)
}

RemoteClient remote client

type RemoteDispatcher

type RemoteDispatcher struct {
	// contains filtered or unexported fields
}

RemoteDispatcher dispatcher, client can be grpc or http

func (*RemoteDispatcher) Close

func (d *RemoteDispatcher) Close()

Close down the file dispatcher

func (*RemoteDispatcher) Dispatch

func (d *RemoteDispatcher) Dispatch(span *_Span)

Dispatch dispatches the span object

func (*RemoteDispatcher) DispatchProtoSpan

func (d *RemoteDispatcher) DispatchProtoSpan(s *Span)

DispatchProtoSpan dispatches the proto span object

func (*RemoteDispatcher) Name

func (d *RemoteDispatcher) Name() string

Name gives the Dispatcher name

func (*RemoteDispatcher) SetLogger

func (d *RemoteDispatcher) SetLogger(logger Logger)

SetLogger sets the logger to use

type Span

type Span struct {
	TraceId              string   `protobuf:"bytes,1,opt,name=traceId,proto3" json:"traceId,omitempty"`
	SpanId               string   `protobuf:"bytes,2,opt,name=spanId,proto3" json:"spanId,omitempty"`
	ParentSpanId         string   `protobuf:"bytes,3,opt,name=parentSpanId,proto3" json:"parentSpanId,omitempty"`
	ServiceName          string   `protobuf:"bytes,4,opt,name=serviceName,proto3" json:"serviceName,omitempty"`
	OperationName        string   `protobuf:"bytes,5,opt,name=operationName,proto3" json:"operationName,omitempty"`
	StartTime            int64    `protobuf:"varint,6,opt,name=startTime,proto3" json:"startTime,omitempty"`
	Duration             int64    `protobuf:"varint,7,opt,name=duration,proto3" json:"duration,omitempty"`
	Logs                 []*Log   `protobuf:"bytes,8,rep,name=logs,proto3" json:"logs,omitempty"`
	Tags                 []*Tag   `protobuf:"bytes,9,rep,name=tags,proto3" json:"tags,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

Span represents a unit of work performed by a service.

func (*Span) Descriptor

func (*Span) Descriptor() ([]byte, []int)

func (*Span) GetDuration

func (m *Span) GetDuration() int64

func (*Span) GetLogs

func (m *Span) GetLogs() []*Log

func (*Span) GetOperationName

func (m *Span) GetOperationName() string

func (*Span) GetParentSpanId

func (m *Span) GetParentSpanId() string

func (*Span) GetServiceName

func (m *Span) GetServiceName() string

func (*Span) GetSpanId

func (m *Span) GetSpanId() string

func (*Span) GetStartTime

func (m *Span) GetStartTime() int64

func (*Span) GetTags

func (m *Span) GetTags() []*Tag

func (*Span) GetTraceId

func (m *Span) GetTraceId() string

func (*Span) ProtoMessage

func (*Span) ProtoMessage()

func (*Span) Reset

func (m *Span) Reset()

func (*Span) String

func (m *Span) String() string

func (*Span) XXX_DiscardUnknown

func (m *Span) XXX_DiscardUnknown()

func (*Span) XXX_Marshal

func (m *Span) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*Span) XXX_Merge

func (m *Span) XXX_Merge(src proto.Message)

func (*Span) XXX_Size

func (m *Span) XXX_Size() int

func (*Span) XXX_Unmarshal

func (m *Span) XXX_Unmarshal(b []byte) error

type SpanAgentClient

type SpanAgentClient interface {
	Dispatch(ctx context.Context, in *Span, opts ...grpc.CallOption) (*DispatchResult, error)
}

SpanAgentClient is the client API for SpanAgent service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.

func NewSpanAgentClient

func NewSpanAgentClient(cc *grpc.ClientConn) SpanAgentClient

type SpanAgentServer

type SpanAgentServer interface {
	Dispatch(context.Context, *Span) (*DispatchResult, error)
}

SpanAgentServer is the server API for SpanAgent service.

type SpanContext

type SpanContext struct {
	// traceID represents globally unique ID of the trace.
	TraceID string

	// spanID represents span ID that must be unique within its trace
	SpanID string

	// parentID refers to the ID of the parent span.
	// Should be empty if the current span is a root span.
	ParentID string

	//Context baggage. The is a snapshot in time.
	Baggage map[string]string

	// set to true if extracted using a extractor in tracer
	IsExtractedContext bool
}

SpanContext implements opentracing.spanContext

func (SpanContext) ForeachBaggageItem

func (context SpanContext) ForeachBaggageItem(handler func(k, v string) bool)

ForeachBaggageItem implements opentracing.spancontext

func (SpanContext) IsValid

func (context SpanContext) IsValid() bool

IsValid indicates whether this context actually represents a valid trace.

func (SpanContext) ToString

func (context SpanContext) ToString() string

ToString represents the string

func (SpanContext) WithBaggageItem

func (context SpanContext) WithBaggageItem(key, value string) *SpanContext

WithBaggageItem creates a new context with an extra baggage item.

type Tag

type Tag struct {
	Key  string      `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
	Type Tag_TagType `protobuf:"varint,2,opt,name=type,proto3,enum=Tag_TagType" json:"type,omitempty"`
	// Types that are valid to be assigned to Myvalue:
	//	*Tag_VStr
	//	*Tag_VLong
	//	*Tag_VDouble
	//	*Tag_VBool
	//	*Tag_VBytes
	Myvalue              isTag_Myvalue `protobuf_oneof:"myvalue"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

Tag is a strongly typed key/value pair. We use 'oneof' protobuf attribute to represent the possible tagTypes

func ConvertToProtoTag

func ConvertToProtoTag(key string, value interface{}) *Tag

ConvertToProtoTag converts to proto tag

func (*Tag) Descriptor

func (*Tag) Descriptor() ([]byte, []int)

func (*Tag) GetKey

func (m *Tag) GetKey() string

func (*Tag) GetMyvalue

func (m *Tag) GetMyvalue() isTag_Myvalue

func (*Tag) GetType

func (m *Tag) GetType() Tag_TagType

func (*Tag) GetVBool

func (m *Tag) GetVBool() bool

func (*Tag) GetVBytes

func (m *Tag) GetVBytes() []byte

func (*Tag) GetVDouble

func (m *Tag) GetVDouble() float64

func (*Tag) GetVLong

func (m *Tag) GetVLong() int64

func (*Tag) GetVStr

func (m *Tag) GetVStr() string

func (*Tag) ProtoMessage

func (*Tag) ProtoMessage()

func (*Tag) Reset

func (m *Tag) Reset()

func (*Tag) String

func (m *Tag) String() string

func (*Tag) XXX_DiscardUnknown

func (m *Tag) XXX_DiscardUnknown()

func (*Tag) XXX_Marshal

func (m *Tag) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*Tag) XXX_Merge

func (m *Tag) XXX_Merge(src proto.Message)

func (*Tag) XXX_OneofWrappers

func (*Tag) XXX_OneofWrappers() []interface{}

XXX_OneofWrappers is for the internal use of the proto package.

func (*Tag) XXX_Size

func (m *Tag) XXX_Size() int

func (*Tag) XXX_Unmarshal

func (m *Tag) XXX_Unmarshal(b []byte) error

type Tag_TagType

type Tag_TagType int32

TagType denotes the type of a Tag's value.

const (
	Tag_STRING Tag_TagType = 0
	Tag_DOUBLE Tag_TagType = 1
	Tag_BOOL   Tag_TagType = 2
	Tag_LONG   Tag_TagType = 3
	Tag_BINARY Tag_TagType = 4
)

func (Tag_TagType) EnumDescriptor

func (Tag_TagType) EnumDescriptor() ([]byte, []int)

func (Tag_TagType) String

func (x Tag_TagType) String() string

type Tag_VBool

type Tag_VBool struct {
	VBool bool `protobuf:"varint,6,opt,name=vBool,proto3,oneof"`
}

type Tag_VBytes

type Tag_VBytes struct {
	VBytes []byte `protobuf:"bytes,7,opt,name=vBytes,proto3,oneof"`
}

type Tag_VDouble

type Tag_VDouble struct {
	VDouble float64 `protobuf:"fixed64,5,opt,name=vDouble,proto3,oneof"`
}

type Tag_VLong

type Tag_VLong struct {
	VLong int64 `protobuf:"varint,4,opt,name=vLong,proto3,oneof"`
}

type Tag_VStr

type Tag_VStr struct {
	VStr string `protobuf:"bytes,3,opt,name=vStr,proto3,oneof"`
}

type TextMapPropagator

type TextMapPropagator struct {
	// contains filtered or unexported fields
}

TextMapPropagator implements Propagator interface

func NewDefaultTextMapPropagator

func NewDefaultTextMapPropagator() *TextMapPropagator

NewDefaultTextMapPropagator returns a default text map propagator

func NewTextMapPropagator

func NewTextMapPropagator(opts PropagatorOpts, codex Codex) *TextMapPropagator

NewTextMapPropagator returns a text map propagator

func (*TextMapPropagator) Extract

func (p *TextMapPropagator) Extract(carrier interface{}) (*SpanContext, error)

Extract the span context from the carrier

func (*TextMapPropagator) Inject

func (p *TextMapPropagator) Inject(ctx *SpanContext, carrier interface{}) error

Inject injects the span context in the carrier

type Tracer

type Tracer struct {
	// contains filtered or unexported fields
}

Tracer implements the opentracing.tracer

func (*Tracer) Close

func (tracer *Tracer) Close() error

Close closes the tracer

func (*Tracer) DispatchSpan

func (tracer *Tracer) DispatchSpan(span *_Span)

DispatchSpan dispatches the span to a dispatcher

func (*Tracer) Extract

func (tracer *Tracer) Extract(
	format interface{},
	carrier interface{},
) (opentracing.SpanContext, error)

Extract implements Extract() method of opentracing.Tracer

func (*Tracer) Inject

func (tracer *Tracer) Inject(ctx opentracing.SpanContext, format interface{}, carrier interface{}) error

Inject implements Inject() method of opentracing.Tracer

func (*Tracer) StartSpan

func (tracer *Tracer) StartSpan(
	operationName string,
	options ...opentracing.StartSpanOption,
) opentracing.Span

StartSpan starts a new span

func (*Tracer) Tags

func (tracer *Tracer) Tags() []opentracing.Tag

Tags return all common tags

type TracerOption

type TracerOption func(tracer *Tracer)

TracerOption is a function that sets some option on the tracer

type TracerOptions

type TracerOptions struct{}

TracerOptions a list of tracer options

var TracerOptionsFactory TracerOptions

TracerOptionsFactory factory to create multiple tracer options

func (TracerOptions) Logger

func (t TracerOptions) Logger(logger Logger) TracerOption

Logger set the logger type

func (TracerOptions) Propagator

func (t TracerOptions) Propagator(format interface{}, propagator Propagator) TracerOption

Propagator registers a new Propagator

func (TracerOptions) Tag

func (t TracerOptions) Tag(key string, value interface{}) TracerOption

Tag adds a common tag in every span

func (TracerOptions) UseDualSpanMode

func (t TracerOptions) UseDualSpanMode() TracerOption

UseDualSpanMode sets the tracer in dual span mode

type URLCodex

type URLCodex struct{}

URLCodex encodes decodes a url

func (URLCodex) Decode

func (c URLCodex) Decode(value string) string

Decode a no-op for decoding the value

func (URLCodex) Encode

func (c URLCodex) Encode(value string) string

Encode a no-op for encoding the value

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL