From 151d4c3108f0bf99698a4d19868680163969308c Mon Sep 17 00:00:00 2001 From: gfonseca-tc Date: Wed, 8 Dec 2021 14:54:49 -0300 Subject: [PATCH] Removed boolean option from function. Added test to cover option use. --- exporter/datadogexporter/translate_traces.go | 16 +++---- .../datadogexporter/translate_traces_test.go | 46 +++++++++++++++---- 2 files changed, 43 insertions(+), 19 deletions(-) diff --git a/exporter/datadogexporter/translate_traces.go b/exporter/datadogexporter/translate_traces.go index b701e8728d46..1f5e6ff136e1 100644 --- a/exporter/datadogexporter/translate_traces.go +++ b/exporter/datadogexporter/translate_traces.go @@ -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), @@ -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 diff --git a/exporter/datadogexporter/translate_traces_test.go b/exporter/datadogexporter/translate_traces_test.go index 6f996261c226..0237718a2c76 100644 --- a/exporter/datadogexporter/translate_traces_test.go +++ b/exporter/datadogexporter/translate_traces_test.go @@ -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{ @@ -1056,13 +1055,12 @@ 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) @@ -1070,7 +1068,6 @@ func TestSpanNameTranslation(t *testing.T) { 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 @@ -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) +} \ No newline at end of file