Skip to content

Commit

Permalink
Removed boolean option from function.
Browse files Browse the repository at this point in the history
Added test to cover option use.
  • Loading branch information
gfonseca-tc committed Dec 8, 2021
1 parent 2d6032d commit 151d4c3
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 19 deletions.
16 changes: 7 additions & 9 deletions exporter/datadogexporter/translate_traces.go
Original file line number Diff line number Diff line change
Expand Up @@ -289,10 +289,15 @@ func spanToDatadogSpan(s pdata.Span,

resourceName := getDatadogResourceName(s, tags)

name := s.Name()
if !cfg.Traces.SpanNameAsResourceName {
name = getDatadogSpanName(s, tags)
}

span := &pb.Span{
TraceID: decodeAPMTraceID(s.TraceID().Bytes()),
SpanID: decodeAPMSpanID(s.SpanID().Bytes()),
Name: remapDatadogSpanName(getDatadogSpanName(s, tags, cfg.Traces.SpanNameAsResourceName), spanNameMap),
Name: remapDatadogSpanName(name, spanNameMap),
Resource: resourceName,
Service: normalizedServiceName,
Start: int64(startTime),
Expand Down Expand Up @@ -487,14 +492,7 @@ func decodeAPMId(id string) uint64 {
return val
}

func getDatadogSpanName(s pdata.Span, datadogTags map[string]string, spanNameAsResourceName bool) string {
// Option created to maintain similarity with the OpenTelemetry semantic conventions
// https://github.com/open-telemetry/opentelemetry-specification/tree/main/specification/trace/semantic_conventions
// https://github.com/open-telemetry/opentelemetry-collector-contrib/issues/1909
if spanNameAsResourceName {
return s.Name()
}

func getDatadogSpanName(s pdata.Span, datadogTags map[string]string) string {
// largely a port of logic here
// https://github.com/open-telemetry/opentelemetry-python/blob/b2559409b2bf82e693f3e68ed890dd7fd1fa8eae/exporter/opentelemetry-exporter-datadog/src/opentelemetry/exporter/datadog/exporter.py#L213
// Get span name by using instrumentation library name and span kind while backing off to span.kind
Expand Down
46 changes: 36 additions & 10 deletions exporter/datadogexporter/translate_traces_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1028,8 +1028,7 @@ func TestSpanResourceTranslationRpcFallback(t *testing.T) {
// ensure that the datadog span name uses IL name +kind when available and falls back to opetelemetry + kind
func TestSpanNameTranslation(t *testing.T) {
span := pdata.NewSpan()
spanName := "Default Name"
span.SetName(spanName)
span.SetName("Default Name")
span.SetKind(pdata.SpanKindServer)

ddIlTags := map[string]string{
Expand All @@ -1056,21 +1055,19 @@ func TestSpanNameTranslation(t *testing.T) {
"otel.library.name": "hyphenated-value",
}

spanNameIl := getDatadogSpanName(span, ddIlTags, false)
spanNameDefault := getDatadogSpanName(span, ddNoIlTags, false)
spanNameOld := getDatadogSpanName(span, ddIlTagsOld, false)
spanNameCur := getDatadogSpanName(span, ddIlTagsCur, false)
spanNameUnusual := getDatadogSpanName(span, ddIlTagsUnusual, false)
spanNameHyphen := getDatadogSpanName(span, ddIlTagsHyphen, false)
spanNameAsResourceName := getDatadogSpanName(span, ddIlTagsHyphen, true)
spanNameIl := getDatadogSpanName(span, ddIlTags)
spanNameDefault := getDatadogSpanName(span, ddNoIlTags)
spanNameOld := getDatadogSpanName(span, ddIlTagsOld)
spanNameCur := getDatadogSpanName(span, ddIlTagsCur)
spanNameUnusual := getDatadogSpanName(span, ddIlTagsUnusual)
spanNameHyphen := getDatadogSpanName(span, ddIlTagsHyphen)

assert.Equal(t, strings.ToLower(fmt.Sprintf("%s.%s", "il_name", strings.TrimPrefix(pdata.SpanKindServer.String(), "SPAN_KIND_"))), spanNameIl)
assert.Equal(t, strings.ToLower(fmt.Sprintf("%s.%s", "opentelemetry", strings.TrimPrefix(pdata.SpanKindServer.String(), "SPAN_KIND_"))), spanNameDefault)
assert.Equal(t, strings.ToLower(fmt.Sprintf("%s.%s", "old_value", strings.TrimPrefix(pdata.SpanKindServer.String(), "SPAN_KIND_"))), spanNameOld)
assert.Equal(t, strings.ToLower(fmt.Sprintf("%s.%s", "current_value", strings.TrimPrefix(pdata.SpanKindServer.String(), "SPAN_KIND_"))), spanNameCur)
assert.Equal(t, strings.ToLower(fmt.Sprintf("%s.%s", "unusual_value", strings.TrimPrefix(pdata.SpanKindServer.String(), "SPAN_KIND_"))), spanNameUnusual)
assert.Equal(t, strings.ToLower(fmt.Sprintf("%s.%s", "hyphenated_value", strings.TrimPrefix(pdata.SpanKindServer.String(), "SPAN_KIND_"))), spanNameHyphen)
assert.Equal(t, spanName, spanNameAsResourceName)
}

// ensure that the datadog span name uses IL name +kind when available and falls back to opetelemetry + kind
Expand Down Expand Up @@ -1532,3 +1529,32 @@ func TestSpanRateLimitTag(t *testing.T) {

assert.Equal(t, 0.5, outputTraces[0].Traces[0].Spans[0].Metrics["_sample_rate"])
}

func TestTracesSpanNamingOption(t *testing.T) {
hostname := "testhostname"
denylister := newDenylister([]string{})

// generate mock trace, span and parent span ids
mockTraceID := [16]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F}
mockSpanID := [8]byte{0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8}
mockParentSpanID := [8]byte{0xEF, 0xEE, 0xED, 0xEC, 0xEB, 0xEA, 0xE9, 0xE8}

mockEndTime := time.Now().Round(time.Second)

// create mock resource span data
// toggle on errors and custom service naming to test edge case code paths
rs := NewResourceSpansData(mockTraceID, mockSpanID, mockParentSpanID, pdata.StatusCodeUnset, false, mockEndTime)

// start with span name as resource name set to true
cfgSpanNameAsResourceName := config.Config{
Traces: config.TracesConfig{
SpanNameAsResourceName: true,
},
}

// translate mocks to datadog traces
datadogPayloadSpanNameAsResourceName := resourceSpansToDatadogSpans(rs, hostname, &cfgSpanNameAsResourceName, denylister, map[string]string{})

// ensure the resource name is replaced with the span name when the option is set
assert.Equal(t, "End-To-End Here", datadogPayloadSpanNameAsResourceName.Traces[0].Spans[0].Name)
}

0 comments on commit 151d4c3

Please sign in to comment.