Skip to content

Commit 24c1569

Browse files
authored
Improve performance of internal traces to jaeger proto translation (#906)
This PR also fixes an attribute mutation bug when "service.name" got removed from resource data structure
1 parent 27b2d65 commit 24c1569

File tree

2 files changed

+201
-152
lines changed

2 files changed

+201
-152
lines changed

translator/trace/jaeger/traces_to_jaegerproto.go

Lines changed: 103 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -115,39 +115,43 @@ func resourceToJaegerProtoProcess(resource pdata.Resource) *model.Process {
115115
}
116116

117117
process := model.Process{}
118+
attrsCount := attrs.Len()
118119
if serviceName, ok := attrs.Get(conventions.AttributeServiceName); ok {
119120
process.ServiceName = serviceName.StringVal()
121+
attrsCount--
120122
}
121-
process.Tags = resourceAttributesToJaegerProtoTags(attrs)
123+
if attrsCount == 0 {
124+
return &process
125+
}
126+
127+
tags := make([]model.KeyValue, 0, attrsCount)
128+
process.Tags = appendTagsFromResourceAttributes(tags, attrs)
122129
return &process
123130

124131
}
125132

126-
func resourceAttributesToJaegerProtoTags(attrs pdata.AttributeMap) []model.KeyValue {
133+
func appendTagsFromResourceAttributes(dest []model.KeyValue, attrs pdata.AttributeMap) []model.KeyValue {
127134
if attrs.Len() == 0 {
128-
return nil
135+
return dest
129136
}
130137

131-
tags := make([]model.KeyValue, 0, attrs.Len())
132138
attrs.ForEach(func(key string, attr pdata.AttributeValue) {
133139
if key == conventions.AttributeServiceName {
134140
return
135141
}
136-
tags = append(tags, attributeToJaegerProtoTag(key, attr))
142+
dest = append(dest, attributeToJaegerProtoTag(key, attr))
137143
})
138-
return tags
144+
return dest
139145
}
140146

141-
func attributesToJaegerProtoTags(attrs pdata.AttributeMap) []model.KeyValue {
147+
func appendTagsFromAttributes(dest []model.KeyValue, attrs pdata.AttributeMap) []model.KeyValue {
142148
if attrs.Len() == 0 {
143-
return nil
149+
return dest
144150
}
145-
146-
tags := make([]model.KeyValue, 0, attrs.Len())
147151
attrs.ForEach(func(key string, attr pdata.AttributeValue) {
148-
tags = append(tags, attributeToJaegerProtoTag(key, attr))
152+
dest = append(dest, attributeToJaegerProtoTag(key, attr))
149153
})
150-
return tags
154+
return dest
151155
}
152156

153157
func attributeToJaegerProtoTag(key string, attr pdata.AttributeValue) model.KeyValue {
@@ -191,9 +195,6 @@ func spanToJaegerProto(span pdata.Span) (*model.Span, error) {
191195
return nil, fmt.Errorf("error converting span links to Jaeger references: %w", err)
192196
}
193197

194-
tags := attributesToJaegerProtoTags(span.Attributes())
195-
tags = appendTagFromSpanKind(tags, span.Kind())
196-
tags = appendTagFromSpanStatus(tags, span.Status())
197198
startTime := internal.UnixNanoToTime(span.StartTime())
198199

199200
return &model.Span{
@@ -203,11 +204,60 @@ func spanToJaegerProto(span pdata.Span) (*model.Span, error) {
203204
References: jReferences,
204205
StartTime: startTime,
205206
Duration: internal.UnixNanoToTime(span.EndTime()).Sub(startTime),
206-
Tags: tags,
207+
Tags: getJaegerProtoSpanTags(span),
207208
Logs: spanEventsToJaegerProtoLogs(span.Events()),
208209
}, nil
209210
}
210211

212+
func getJaegerProtoSpanTags(span pdata.Span) []model.KeyValue {
213+
var spanKindTag, statusCodeTag, errorTag, statusMsgTag model.KeyValue
214+
var spanKindTagFound, statusCodeTagFound, errorTagFound, statusMsgTagFound bool
215+
216+
tagsCount := span.Attributes().Len()
217+
218+
spanKindTag, spanKindTagFound = getTagFromSpanKind(span.Kind())
219+
if spanKindTagFound {
220+
tagsCount++
221+
}
222+
status := span.Status()
223+
if !status.IsNil() {
224+
statusCodeTag, statusCodeTagFound = getTagFromStatusCode(status.Code())
225+
if statusCodeTagFound {
226+
tagsCount++
227+
}
228+
229+
errorTag, errorTagFound = getErrorTagFromStatusCode(status.Code())
230+
if errorTagFound {
231+
tagsCount++
232+
}
233+
234+
statusMsgTag, statusMsgTagFound = getTagFromStatusMsg(status.Message())
235+
if statusMsgTagFound {
236+
tagsCount++
237+
}
238+
}
239+
240+
if tagsCount == 0 {
241+
return nil
242+
}
243+
244+
tags := make([]model.KeyValue, 0, tagsCount)
245+
tags = appendTagsFromAttributes(tags, span.Attributes())
246+
if spanKindTagFound {
247+
tags = append(tags, spanKindTag)
248+
}
249+
if statusCodeTagFound {
250+
tags = append(tags, statusCodeTag)
251+
}
252+
if errorTagFound {
253+
tags = append(tags, errorTag)
254+
}
255+
if statusMsgTagFound {
256+
tags = append(tags, statusMsgTag)
257+
}
258+
return tags
259+
}
260+
211261
func traceIDToJaegerProto(traceID pdata.TraceID) (model.TraceID, error) {
212262
traceIDHigh, traceIDLow, err := tracetranslator.BytesToUInt64TraceID([]byte(traceID))
213263
if err != nil {
@@ -308,67 +358,65 @@ func spanEventsToJaegerProtoLogs(events pdata.SpanEventSlice) []model.Log {
308358
continue
309359
}
310360

361+
fields := make([]model.KeyValue, 0, event.Attributes().Len())
362+
fields = appendTagsFromAttributes(fields, event.Attributes())
311363
logs = append(logs, model.Log{
312364
Timestamp: internal.UnixNanoToTime(event.Timestamp()),
313-
Fields: attributesToJaegerProtoTags(event.Attributes()),
365+
Fields: fields,
314366
})
315367
}
316368

317369
return logs
318370
}
319371

320-
func appendTagFromSpanKind(tags []model.KeyValue, spanKind pdata.SpanKind) []model.KeyValue {
321-
tag := model.KeyValue{
322-
Key: tracetranslator.TagSpanKind,
323-
VType: model.ValueType_STRING,
324-
}
325-
372+
func getTagFromSpanKind(spanKind pdata.SpanKind) (model.KeyValue, bool) {
373+
var tagStr string
326374
switch spanKind {
327375
case pdata.SpanKindCLIENT:
328-
tag.VStr = string(tracetranslator.OpenTracingSpanKindClient)
376+
tagStr = string(tracetranslator.OpenTracingSpanKindClient)
329377
case pdata.SpanKindSERVER:
330-
tag.VStr = string(tracetranslator.OpenTracingSpanKindServer)
378+
tagStr = string(tracetranslator.OpenTracingSpanKindServer)
331379
case pdata.SpanKindPRODUCER:
332-
tag.VStr = string(tracetranslator.OpenTracingSpanKindProducer)
380+
tagStr = string(tracetranslator.OpenTracingSpanKindProducer)
333381
case pdata.SpanKindCONSUMER:
334-
tag.VStr = string(tracetranslator.OpenTracingSpanKindConsumer)
382+
tagStr = string(tracetranslator.OpenTracingSpanKindConsumer)
335383
default:
336-
return tags
384+
return model.KeyValue{}, false
337385
}
338386

339-
if tags == nil {
340-
return []model.KeyValue{tag}
341-
}
342-
343-
return append(tags, tag)
387+
return model.KeyValue{
388+
Key: tracetranslator.TagSpanKind,
389+
VType: model.ValueType_STRING,
390+
VStr: tagStr,
391+
}, true
344392
}
345393

346-
func appendTagFromSpanStatus(tags []model.KeyValue, status pdata.SpanStatus) []model.KeyValue {
347-
if status.IsNil() {
348-
return tags
349-
}
350-
351-
tags = append(tags, model.KeyValue{
394+
func getTagFromStatusCode(statusCode pdata.StatusCode) (model.KeyValue, bool) {
395+
return model.KeyValue{
352396
Key: tracetranslator.TagStatusCode,
353-
VInt64: int64(status.Code()),
397+
VInt64: int64(statusCode),
354398
VType: model.ValueType_INT64,
355-
})
399+
}, true
400+
}
356401

357-
if status.Code() != pdata.StatusCode(otlptrace.Status_Ok) {
358-
tags = append(tags, model.KeyValue{
359-
Key: tracetranslator.TagError,
360-
VBool: true,
361-
VType: model.ValueType_BOOL,
362-
})
402+
func getErrorTagFromStatusCode(statusCode pdata.StatusCode) (model.KeyValue, bool) {
403+
if statusCode == pdata.StatusCode(otlptrace.Status_Ok) {
404+
return model.KeyValue{}, false
363405
}
406+
return model.KeyValue{
407+
Key: tracetranslator.TagError,
408+
VBool: true,
409+
VType: model.ValueType_BOOL,
410+
}, true
411+
}
364412

365-
if status.Message() != "" {
366-
tags = append(tags, model.KeyValue{
367-
Key: tracetranslator.TagStatusMsg,
368-
VStr: status.Message(),
369-
VType: model.ValueType_STRING,
370-
})
413+
func getTagFromStatusMsg(statusMsg string) (model.KeyValue, bool) {
414+
if statusMsg == "" {
415+
return model.KeyValue{}, false
371416
}
372-
373-
return tags
417+
return model.KeyValue{
418+
Key: tracetranslator.TagStatusMsg,
419+
VStr: statusMsg,
420+
VType: model.ValueType_STRING,
421+
}, true
374422
}

0 commit comments

Comments
 (0)