diff --git a/cmd/opentelemetry/app/exporter/elasticsearchexporter/esmodeltranslator/modeltranslator.go b/cmd/opentelemetry/app/exporter/elasticsearchexporter/esmodeltranslator/modeltranslator.go index 8cb46d181ca..1267be265eb 100644 --- a/cmd/opentelemetry/app/exporter/elasticsearchexporter/esmodeltranslator/modeltranslator.go +++ b/cmd/opentelemetry/app/exporter/elasticsearchexporter/esmodeltranslator/modeltranslator.go @@ -34,8 +34,11 @@ const ( ) var ( - errZeroTraceID = errors.New("traceID is zero") - errZeroSpanID = errors.New("spanID is zero") + errZeroTraceID = errors.New("traceID is zero") + errZeroSpanID = errors.New("spanID is zero") + emptyLogList = []dbmodel.Log{} + emptyReferenceList = []dbmodel.Reference{} + emptyTagList = []dbmodel.KeyValue{} ) // Translator configures translator @@ -134,7 +137,7 @@ func toTime(nano pdata.TimestampUnixNano) time.Time { func references(links pdata.SpanLinkSlice, parentSpanID pdata.SpanID, traceID dbmodel.TraceID) ([]dbmodel.Reference, error) { parentSpanIDSet := len(parentSpanID.Bytes()) != 0 if !parentSpanIDSet && links.Len() == 0 { - return nil, nil + return emptyReferenceList, nil } refsCount := links.Len() @@ -265,11 +268,9 @@ func (c *Translator) tags(span pdata.Span) ([]dbmodel.KeyValue, map[string]inter tagsCount++ } } - if tagsCount == 0 { - return nil, nil + return emptyTagList, nil } - tags := make([]dbmodel.KeyValue, 0, tagsCount) var tagMap map[string]interface{} if spanKindTagFound { @@ -365,7 +366,7 @@ func getTagFromStatusMsg(statusMsg string) (dbmodel.KeyValue, bool) { func logs(events pdata.SpanEventSlice) []dbmodel.Log { if events.Len() == 0 { - return nil + return emptyLogList } logs := make([]dbmodel.Log, 0, events.Len()) for i := 0; i < events.Len(); i++ { diff --git a/cmd/opentelemetry/app/exporter/elasticsearchexporter/esmodeltranslator/modeltranslator_test.go b/cmd/opentelemetry/app/exporter/elasticsearchexporter/esmodeltranslator/modeltranslator_test.go index 3b9c0027190..52cbab7a24c 100644 --- a/cmd/opentelemetry/app/exporter/elasticsearchexporter/esmodeltranslator/modeltranslator_test.go +++ b/cmd/opentelemetry/app/exporter/elasticsearchexporter/esmodeltranslator/modeltranslator_test.go @@ -159,6 +159,33 @@ func TestConvertSpan(t *testing.T) { }, spans[0]) } +func TestSpanEmptyRef(t *testing.T) { + traces := traces("myservice") + span := addSpan(traces, "root", traceID, spanID) + span.SetStartTime(pdata.TimestampUnixNano(1000000)) + span.SetEndTime(pdata.TimestampUnixNano(2000000)) + + c := &Translator{} + spans, err := c.ConvertSpans(traces) + require.NoError(t, err) + assert.Equal(t, 1, len(spans)) + assert.Equal(t, &dbmodel.Span{ + TraceID: "30313233343536373839616263646566", + SpanID: "3031323334353637", + StartTime: 1000, + Duration: 1000, + OperationName: "root", + StartTimeMillis: 1, + Tags: []dbmodel.KeyValue{}, // should not be nil + Logs: []dbmodel.Log{}, // should not be nil + References: []dbmodel.Reference{}, // should not be nil + Process: dbmodel.Process{ + ServiceName: "myservice", + Tags: nil, + }, + }, spans[0]) +} + func TestEmpty(t *testing.T) { c := &Translator{} spans, err := c.ConvertSpans(pdata.NewTraces())