tracer: add span kind #170
@@ -13,6 +13,7 @@ func (t *noopTracer) Start(ctx context.Context, name string, opts ...SpanOption)
 | 
				
			|||||||
		name:   name,
 | 
							name:   name,
 | 
				
			||||||
		ctx:    ctx,
 | 
							ctx:    ctx,
 | 
				
			||||||
		tracer: t,
 | 
							tracer: t,
 | 
				
			||||||
 | 
							opts:   NewSpanOptions(opts...),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if span.ctx == nil {
 | 
						if span.ctx == nil {
 | 
				
			||||||
		span.ctx = context.Background()
 | 
							span.ctx = context.Background()
 | 
				
			||||||
@@ -64,6 +65,10 @@ func (s *noopSpan) AddLabels(labels ...interface{}) {
 | 
				
			|||||||
	s.opts.Labels = append(s.opts.Labels, labels...)
 | 
						s.opts.Labels = append(s.opts.Labels, labels...)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (s *noopSpan) Kind() SpanKind {
 | 
				
			||||||
 | 
						return s.opts.Kind
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewTracer returns new memory tracer
 | 
					// NewTracer returns new memory tracer
 | 
				
			||||||
func NewTracer(opts ...Option) Tracer {
 | 
					func NewTracer(opts ...Option) Tracer {
 | 
				
			||||||
	return &noopTracer{
 | 
						return &noopTracer{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,9 +6,58 @@ import (
 | 
				
			|||||||
	"go.unistack.org/micro/v3/logger"
 | 
						"go.unistack.org/micro/v3/logger"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type SpanKind int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						// SpanKindUnspecified is an unspecified SpanKind and is not a valid
 | 
				
			||||||
 | 
						// SpanKind. SpanKindUnspecified should be replaced with SpanKindInternal
 | 
				
			||||||
 | 
						// if it is received.
 | 
				
			||||||
 | 
						SpanKindUnspecified SpanKind = 0
 | 
				
			||||||
 | 
						// SpanKindInternal is a SpanKind for a Span that represents an internal
 | 
				
			||||||
 | 
						// operation within an application.
 | 
				
			||||||
 | 
						SpanKindInternal SpanKind = 1
 | 
				
			||||||
 | 
						// SpanKindServer is a SpanKind for a Span that represents the operation
 | 
				
			||||||
 | 
						// of handling a request from a client.
 | 
				
			||||||
 | 
						SpanKindServer SpanKind = 2
 | 
				
			||||||
 | 
						// SpanKindClient is a SpanKind for a Span that represents the operation
 | 
				
			||||||
 | 
						// of client making a request to a server.
 | 
				
			||||||
 | 
						SpanKindClient SpanKind = 3
 | 
				
			||||||
 | 
						// SpanKindProducer is a SpanKind for a Span that represents the operation
 | 
				
			||||||
 | 
						// of a producer sending a message to a message broker. Unlike
 | 
				
			||||||
 | 
						// SpanKindClient and SpanKindServer, there is often no direct
 | 
				
			||||||
 | 
						// relationship between this kind of Span and a SpanKindConsumer kind. A
 | 
				
			||||||
 | 
						// SpanKindProducer Span will end once the message is accepted by the
 | 
				
			||||||
 | 
						// message broker which might not overlap with the processing of that
 | 
				
			||||||
 | 
						// message.
 | 
				
			||||||
 | 
						SpanKindProducer SpanKind = 4
 | 
				
			||||||
 | 
						// SpanKindConsumer is a SpanKind for a Span that represents the operation
 | 
				
			||||||
 | 
						// of a consumer receiving a message from a message broker. Like
 | 
				
			||||||
 | 
						// SpanKindProducer Spans, there is often no direct relationship between
 | 
				
			||||||
 | 
						// this Span and the Span that produced the message.
 | 
				
			||||||
 | 
						SpanKindConsumer SpanKind = 5
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (sk SpanKind) String() string {
 | 
				
			||||||
 | 
						switch sk {
 | 
				
			||||||
 | 
						case SpanKindInternal:
 | 
				
			||||||
 | 
							return "internal"
 | 
				
			||||||
 | 
						case SpanKindServer:
 | 
				
			||||||
 | 
							return "server"
 | 
				
			||||||
 | 
						case SpanKindClient:
 | 
				
			||||||
 | 
							return "client"
 | 
				
			||||||
 | 
						case SpanKindProducer:
 | 
				
			||||||
 | 
							return "producer"
 | 
				
			||||||
 | 
						case SpanKindConsumer:
 | 
				
			||||||
 | 
							return "consumer"
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return "unspecified"
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SpanOptions contains span option
 | 
					// SpanOptions contains span option
 | 
				
			||||||
type SpanOptions struct {
 | 
					type SpanOptions struct {
 | 
				
			||||||
	Labels []interface{}
 | 
						Labels []interface{}
 | 
				
			||||||
 | 
						Kind   SpanKind
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// SpanOption func signature
 | 
					// SpanOption func signature
 | 
				
			||||||
@@ -20,20 +69,26 @@ type EventOptions struct{}
 | 
				
			|||||||
// EventOption func signature
 | 
					// EventOption func signature
 | 
				
			||||||
type EventOption func(o *EventOptions)
 | 
					type EventOption func(o *EventOptions)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func SpanLabels(labels ...interface{}) SpanOption {
 | 
					func WithSpanLabels(labels ...interface{}) SpanOption {
 | 
				
			||||||
	return func(o *SpanOptions) {
 | 
						return func(o *SpanOptions) {
 | 
				
			||||||
		o.Labels = labels
 | 
							o.Labels = labels
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func WithSpanKind(k SpanKind) SpanOption {
 | 
				
			||||||
 | 
						return func(o *SpanOptions) {
 | 
				
			||||||
 | 
							o.Kind = k
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Options struct
 | 
					// Options struct
 | 
				
			||||||
type Options struct {
 | 
					type Options struct {
 | 
				
			||||||
 | 
						// Context used to store custome tracer options
 | 
				
			||||||
 | 
						Context context.Context
 | 
				
			||||||
	// Logger used for logging
 | 
						// Logger used for logging
 | 
				
			||||||
	Logger logger.Logger
 | 
						Logger logger.Logger
 | 
				
			||||||
	// Name of the tracer
 | 
						// Name of the tracer
 | 
				
			||||||
	Name string
 | 
						Name string
 | 
				
			||||||
	// Context used to store custome tracer options
 | 
					 | 
				
			||||||
	Context context.Context
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Option func signature
 | 
					// Option func signature
 | 
				
			||||||
@@ -46,6 +101,17 @@ func Logger(l logger.Logger) Option {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewSpanOptions returns default SpanOptions
 | 
				
			||||||
 | 
					func NewSpanOptions(opts ...SpanOption) SpanOptions {
 | 
				
			||||||
 | 
						options := SpanOptions{
 | 
				
			||||||
 | 
							Kind: SpanKindInternal,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, o := range opts {
 | 
				
			||||||
 | 
							o(&options)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return options
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewOptions returns default options
 | 
					// NewOptions returns default options
 | 
				
			||||||
func NewOptions(opts ...Option) Options {
 | 
					func NewOptions(opts ...Option) Options {
 | 
				
			||||||
	options := Options{
 | 
						options := Options{
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,4 +33,6 @@ type Span interface {
 | 
				
			|||||||
	SetLabels(labels ...interface{})
 | 
						SetLabels(labels ...interface{})
 | 
				
			||||||
	// AddLabels append the span labels
 | 
						// AddLabels append the span labels
 | 
				
			||||||
	AddLabels(labels ...interface{})
 | 
						AddLabels(labels ...interface{})
 | 
				
			||||||
 | 
						// Kind returns span kind
 | 
				
			||||||
 | 
						Kind() SpanKind
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user