100 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// Package trace provides an interface for distributed tracing
 | 
						|
package trace
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/micro/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 = new(noop)
 | 
						|
)
 | 
						|
 | 
						|
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
 | 
						|
}
 |