diff --git a/tracer/noop.go b/tracer/noop.go index c0defe68..33d3e4fc 100644 --- a/tracer/noop.go +++ b/tracer/noop.go @@ -13,6 +13,7 @@ func (t *noopTracer) Start(ctx context.Context, name string, opts ...SpanOption) name: name, ctx: ctx, tracer: t, + opts: NewSpanOptions(opts...), } if span.ctx == nil { span.ctx = context.Background() @@ -64,6 +65,10 @@ func (s *noopSpan) AddLabels(labels ...interface{}) { s.opts.Labels = append(s.opts.Labels, labels...) } +func (s *noopSpan) Kind() SpanKind { + return s.opts.Kind +} + // NewTracer returns new memory tracer func NewTracer(opts ...Option) Tracer { return &noopTracer{ diff --git a/tracer/options.go b/tracer/options.go index a5035f60..42a47c94 100644 --- a/tracer/options.go +++ b/tracer/options.go @@ -6,9 +6,58 @@ import ( "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 type SpanOptions struct { Labels []interface{} + Kind SpanKind } // SpanOption func signature @@ -20,20 +69,26 @@ type EventOptions struct{} // EventOption func signature type EventOption func(o *EventOptions) -func SpanLabels(labels ...interface{}) SpanOption { +func WithSpanLabels(labels ...interface{}) SpanOption { return func(o *SpanOptions) { o.Labels = labels } } +func WithSpanKind(k SpanKind) SpanOption { + return func(o *SpanOptions) { + o.Kind = k + } +} + // Options struct type Options struct { + // Context used to store custome tracer options + Context context.Context // Logger used for logging Logger logger.Logger // Name of the tracer Name string - // Context used to store custome tracer options - Context context.Context } // 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 func NewOptions(opts ...Option) Options { options := Options{ diff --git a/tracer/tracer.go b/tracer/tracer.go index 79554502..39b96a15 100644 --- a/tracer/tracer.go +++ b/tracer/tracer.go @@ -33,4 +33,6 @@ type Span interface { SetLabels(labels ...interface{}) // AddLabels append the span labels AddLabels(labels ...interface{}) + // Kind returns span kind + Kind() SpanKind }