// Package trace provides an interface for distributed tracing package trace import ( "context" "time" "github.com/asim/go-micro/v3/metadata" ) // Tracer is an interface for distributed tracing type Tracer interface { // Start a trace Start(ctx context.Context, name string) (context.Context, *Span) // Finish the trace Finish(*Span) error // Read the traces Read(...ReadOption) ([]*Span, error) } // SpanType describe the nature of the trace span type SpanType int const ( // SpanTypeRequestInbound is a span created when serving a request SpanTypeRequestInbound SpanType = iota // SpanTypeRequestOutbound is a span created when making a service call SpanTypeRequestOutbound ) // Span is used to record an entry type Span struct { // Id of the trace Trace string // name of the span Name string // id of the span Id string // parent span id Parent string // Start time Started time.Time // Duration in nano seconds Duration time.Duration // associated data Metadata map[string]string // Type Type SpanType } const ( traceIDKey = "Micro-Trace-Id" spanIDKey = "Micro-Span-Id" ) // FromContext returns a span from context func FromContext(ctx context.Context) (traceID string, parentSpanID string, isFound bool) { traceID, traceOk := metadata.Get(ctx, traceIDKey) microID, microOk := metadata.Get(ctx, "Micro-Id") if !traceOk && !microOk { isFound = false return } if !traceOk { traceID = microID } parentSpanID, ok := metadata.Get(ctx, spanIDKey) return traceID, parentSpanID, ok } // ToContext saves the trace and span ids in the context func ToContext(ctx context.Context, traceID, parentSpanID string) context.Context { return metadata.MergeContext(ctx, map[string]string{ traceIDKey: traceID, spanIDKey: parentSpanID, }, true) } var ( DefaultTracer Tracer = NewTracer() ) type noop struct{} func (n *noop) Init(...Option) error { return nil } func (n *noop) Start(ctx context.Context, name string) (context.Context, *Span) { return nil, nil } func (n *noop) Finish(*Span) error { return nil } func (n *noop) Read(...ReadOption) ([]*Span, error) { return nil, nil }