Skip to content

Commit

Permalink
improvement: Add tags to span as SpanOptions (#54)
Browse files Browse the repository at this point in the history
Enable span tags as SpanOptions
  • Loading branch information
smoorpal authored Feb 15, 2021
1 parent 008b698 commit dee14c6
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 0 deletions.
5 changes: 5 additions & 0 deletions changelog/@unreleased/pr-54.v2.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
type: improvement
improvement:
description: Enable span tags as SpanOptions
links:
- https://github.com/palantir/witchcraft-go-tracing/pull/54
13 changes: 13 additions & 0 deletions wtracing/span.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ type SpanModel struct {
Duration time.Duration
LocalEndpoint *Endpoint
RemoteEndpoint *Endpoint
Tags map[string]string
}

type SpanContext struct {
Expand Down Expand Up @@ -74,6 +75,7 @@ type SpanOptionImpl struct {
RemoteEndpoint *Endpoint
ParentSpan *SpanContext
Kind Kind
Tags map[string]string
}

func WithKind(kind Kind) SpanOption {
Expand Down Expand Up @@ -108,3 +110,14 @@ func WithRemoteEndpoint(endpoint *Endpoint) SpanOption {
impl.RemoteEndpoint = endpoint
})
}

// WithSpanTag adds the tag indexed by name with the value specified to the set of tags defined for this span.
// If the same name is seen multiple times the most recent will prevail.
func WithSpanTag(name, value string) SpanOption {
return spanOptionFn(func(impl *SpanOptionImpl) {
if impl.Tags == nil {
impl.Tags = make(map[string]string)
}
impl.Tags[name] = value
})
}
4 changes: 4 additions & 0 deletions wzipkin/span.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,7 @@ func fromZipkinSpanModel(spanModel model.SpanModel) wtracing.SpanModel {
Duration: spanModel.Duration,
LocalEndpoint: fromZipkinEndpoint(spanModel.LocalEndpoint),
RemoteEndpoint: fromZipkinEndpoint(spanModel.RemoteEndpoint),
Tags: spanModel.Tags,
}
}

Expand All @@ -83,6 +84,9 @@ func toZipkinSpanOptions(impl *wtracing.SpanOptionImpl) []zipkin.SpanOption {
if parent := impl.ParentSpan; parent != nil {
zipkinSpanOptions = append(zipkinSpanOptions, zipkin.Parent(toZipkinSpanContext(*parent)))
}
if tags := impl.Tags; tags != nil {
zipkinSpanOptions = append(zipkinSpanOptions, zipkin.Tags(tags))
}
return zipkinSpanOptions
}

Expand Down
31 changes: 31 additions & 0 deletions wzipkin/tracer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ func TestTracerStartSpan(t *testing.T) {
assert.NotEqual(t, reporterMap["duration"], nil)
assert.Equal(t, reporterMap["localEndpoint"].(*wtracing.Endpoint), (*wtracing.Endpoint)(nil))
assert.Equal(t, reporterMap["remoteEndpoint"].(*wtracing.Endpoint), (*wtracing.Endpoint)(nil))
assert.Equal(t, reporterMap["tags"].(map[string]string), map[string]string{})
}

func TestTracerStartChildSpan(t *testing.T) {
Expand Down Expand Up @@ -77,10 +78,39 @@ func TestTracerStartChildSpan(t *testing.T) {
assert.NotEqual(t, reporterMap["duration"], nil)
assert.Equal(t, reporterMap["localEndpoint"].(*wtracing.Endpoint), (*wtracing.Endpoint)(nil))
assert.Equal(t, reporterMap["remoteEndpoint"].(*wtracing.Endpoint), (*wtracing.Endpoint)(nil))
assert.Equal(t, reporterMap["tags"].(map[string]string), map[string]string{})

rootSpan.Finish()
}

func TestTracerStartSpanWithTags(t *testing.T) {
reporterMap := make(map[string]interface{})

tracer, err := wzipkin.NewTracer(&testReporter{
reporterMap: reporterMap,
})
require.NoError(t, err)

span := tracer.StartSpan("mySpan", wtracing.WithSpanTag("key0", "value0"))
span.Finish()

assert.NotEqual(t, reporterMap["traceID"], wtracing.TraceID(""))
assert.NotEqual(t, reporterMap["spanID"], wtracing.SpanID(""))
assert.Equal(t, reporterMap["traceID"], wtracing.TraceID(reporterMap["spanID"].(wtracing.SpanID)))
assert.Equal(t, reporterMap["parentID"], (*wtracing.SpanID)(nil))
assert.Equal(t, reporterMap["debug"], false)
assert.Equal(t, *reporterMap["sampled"].(*bool), true)
assert.Equal(t, reporterMap["err"], (error)(nil))

assert.Equal(t, reporterMap["name"], "mySpan")
assert.Equal(t, reporterMap["kind"], wtracing.Kind(""))
assert.NotEqual(t, reporterMap["timestamp"], nil)
assert.NotEqual(t, reporterMap["duration"], nil)
assert.Equal(t, reporterMap["localEndpoint"].(*wtracing.Endpoint), (*wtracing.Endpoint)(nil))
assert.Equal(t, reporterMap["remoteEndpoint"].(*wtracing.Endpoint), (*wtracing.Endpoint)(nil))
assert.Equal(t, reporterMap["tags"].(map[string]string), map[string]string{"key0": "value0"})
}

type testReporter struct {
reporterMap map[string]interface{}
}
Expand All @@ -99,6 +129,7 @@ func (r *testReporter) Send(span wtracing.SpanModel) {
r.reporterMap["duration"] = span.Duration
r.reporterMap["localEndpoint"] = span.LocalEndpoint
r.reporterMap["remoteEndpoint"] = span.RemoteEndpoint
r.reporterMap["tags"] = span.Tags
}

func (r *testReporter) Close() error {
Expand Down

0 comments on commit dee14c6

Please sign in to comment.