@@ -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
153157func 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+
211261func 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