Add a thin wrapper around otel Span object

Signed-off-by: Swagat Bora <sbora@amazon.com>
This commit is contained in:
Swagat Bora
2022-11-09 21:47:44 +00:00
parent d4b3b54540
commit 7def13dde3
16 changed files with 168 additions and 146 deletions

View File

@@ -19,10 +19,19 @@ package tracing
import (
"encoding/json"
"fmt"
"strings"
"go.opentelemetry.io/otel/attribute"
)
const (
spanDelimiter = "."
)
func makeSpanName(names ...string) string {
return strings.Join(names, spanDelimiter)
}
func any(k string, v interface{}) attribute.KeyValue {
if v == nil {
return attribute.String(k, "<nil>")

View File

@@ -25,35 +25,62 @@ import (
"go.opentelemetry.io/otel/trace"
)
// StartSpan starts child span in a context.
func StartSpan(ctx context.Context, opName string, opts ...trace.SpanStartOption) (context.Context, trace.Span) {
// StartSan starts child span in a context.
func StartSpan(ctx context.Context, opName string, opts ...trace.SpanStartOption) (context.Context, *Span) {
tracer := otel.Tracer("")
if parent := trace.SpanFromContext(ctx); parent != nil && parent.SpanContext().IsValid() {
return parent.TracerProvider().Tracer("").Start(ctx, opName, opts...)
tracer = parent.TracerProvider().Tracer("")
}
return otel.Tracer("").Start(ctx, opName, opts...)
ctx, span := tracer.Start(ctx, opName, opts...)
return ctx, &Span{otelSpan: span}
}
// StopSpan ends the span specified
func StopSpan(span trace.Span) {
span.End()
// SpanFromContext returns the current Span from the context.
func SpanFromContext(ctx context.Context) *Span {
return &Span{
otelSpan: trace.SpanFromContext(ctx),
}
}
// CurrentSpan returns current span from context or noopSpan if no span exists.
func CurrentSpan(ctx context.Context) trace.Span {
return trace.SpanFromContext(ctx)
// Span is wrapper around otel trace.Span.
// Span is the individual component of a trace. It represents a
// single named and timed operation of a workflow that is traced.
type Span struct {
otelSpan trace.Span
}
// End completes the span.
func (s *Span) End() {
s.otelSpan.End()
}
// AddEvent adds an event with provided name and options.
func (s *Span) AddEvent(name string, options ...trace.EventOption) {
s.otelSpan.AddEvent(name, options...)
}
// SetSpanStatus sets the status of the current span.
// If an error is encountered, it records the error and sets span status to Error.
func SetSpanStatus(span trace.Span, err error) {
func (s *Span) SetStatus(err error) {
if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
s.otelSpan.RecordError(err)
s.otelSpan.SetStatus(codes.Error, err.Error())
} else {
span.SetStatus(codes.Ok, "")
s.otelSpan.SetStatus(codes.Ok, "")
}
}
func SpanAttribute(k string, v interface{}) attribute.KeyValue {
// SetAttributes sets kv as attributes of the span.
func (s *Span) SetAttributes(kv ...attribute.KeyValue) {
s.otelSpan.SetAttributes(kv...)
}
// Name sets the span name by joining a list of strings in dot separated format.
func Name(names ...string) string {
return makeSpanName(names...)
}
// Attribute takes a key value pair and returns attribute.KeyValue type.
func Attribute(k string, v interface{}) attribute.KeyValue {
return any(k, v)
}