55
66#if !os(watchOS)
77
8- import Foundation
9- import OpenTelemetryApi
10- import OpenTelemetrySdk
11- import Thrift
8+ import Foundation
9+ import OpenTelemetryApi
10+ import OpenTelemetrySdk
11+ import Thrift
1212
13- final class Adapter {
13+ final class Adapter {
1414 static let keyError = " error "
1515 static let keyLogMessage = " message "
1616 static let keySpanKind = " span.kind "
@@ -20,150 +20,179 @@ final class Adapter {
2020 /// Converts a list of SpanData into a collection of Jaeger's Span.
2121 /// - Parameter spans: the list of spans to be converted
2222 static func toJaeger( spans: [ SpanData ] ) -> [ Span ] {
23- var converted = [ Span] ( )
24- converted. reserveCapacity ( spans. count)
25- spans. forEach {
26- converted. append ( toJaeger ( span: $0) )
27- }
28- return converted
23+ var converted = [ Span] ( )
24+ converted. reserveCapacity ( spans. count)
25+ spans. forEach {
26+ converted. append ( toJaeger ( span: $0) )
27+ }
28+ return converted
2929 }
3030
3131 /// Converts a single SpanData into a Jaeger's Span.
3232 /// - Parameter span: the span to be converted
3333 static func toJaeger( span: SpanData ) -> Span {
34- var tags = TList < Tag > ( )
35- var logs = TList < Log > ( )
36- var references = TList < SpanRef > ( )
37-
38- let traceHex = span. traceId. hexString
39- let secondIndex = traceHex. index ( traceHex. startIndex, offsetBy: 16 )
40- let traceIdHigh = Int64 ( traceHex [ traceHex. startIndex ..< secondIndex] , radix: 16 ) ?? 0
41- let traceIdLow = Int64 ( traceHex [ secondIndex ..< traceHex. endIndex] , radix: 16 ) ?? 0
42-
43- let spanHex = span. spanId. hexString
44- let spanId = Int64 ( spanHex, radix: 16 ) ?? 0
45- let operationName = span. name
46- let startTime = Int64 ( span. startTime. timeIntervalSince1970. toMicroseconds)
47- let duration = Int64 ( span. endTime. timeIntervalSince ( span. startTime) . toMicroseconds)
48-
49- var parentSpanId : Int64 = 0
50-
51- tags. append ( contentsOf: toJaegerTags ( attributes: span. attributes) )
52- logs. append ( contentsOf: toJaegerLogs ( events: span. events) )
53- references. append ( contentsOf: toSpanRefs ( links: span. links) )
54-
55- if let parentId = span. parentSpanId, parentId. isValid {
56- let parentTraceIdHigh = traceIdHigh
57- let parentTraceIdLow = traceIdLow
58-
59- let spanHex = parentId. hexString
60- parentSpanId = Int64 ( spanHex, radix: 16 ) ?? 0
61-
62- let refType = SpanRefType . child_of
63- let spanRef = SpanRef ( refType: refType, traceIdLow: parentTraceIdLow, traceIdHigh: parentTraceIdHigh, spanId: parentSpanId)
64-
65- references. append ( spanRef)
66- }
67-
68- tags. append ( Tag ( key: Adapter . keySpanKind, vType: . string, vStr: span. kind. rawValue. uppercased ( ) , vDouble: nil , vBool: nil , vLong: nil , vBinary: nil ) )
69- if case let Status . error( description) = span. status {
70- tags. append ( Tag ( key: Adapter . keySpanStatusMessage, vType: . string, vStr: description, vDouble: nil , vBool: nil , vLong: nil , vBinary: nil ) )
71- tags. append ( Tag ( key: keyError, vType: . bool, vStr: nil , vDouble: nil , vBool: true , vLong: nil , vBinary: nil ) )
72-
73- } else {
74- tags. append ( Tag ( key: Adapter . keySpanStatusMessage, vType: . string, vStr: " " , vDouble: nil , vBool: nil , vLong: nil , vBinary: nil ) )
75- }
76- tags. append ( Tag ( key: Adapter . keySpanStatusCode, vType: . long, vStr: nil , vDouble: nil , vBool: nil , vLong: Int64 ( span. status. code) , vBinary: nil ) )
77-
78- return Span ( traceIdLow: traceIdLow, traceIdHigh: traceIdHigh, spanId: spanId, parentSpanId: parentSpanId, operationName: operationName, references: references, flags: 0 , startTime: startTime, duration: duration, tags: tags, logs: logs)
34+ var tags = TList < Tag > ( )
35+ var logs = TList < Log > ( )
36+ var references = TList < SpanRef > ( )
37+
38+ let traceHex = span. traceId. hexString
39+ let secondIndex = traceHex. index ( traceHex. startIndex, offsetBy: 16 )
40+ let traceIdHigh = Int64 ( traceHex [ traceHex. startIndex..< secondIndex] , radix: 16 ) ?? 0
41+ let traceIdLow = Int64 ( traceHex [ secondIndex..< traceHex. endIndex] , radix: 16 ) ?? 0
42+
43+ let spanHex = span. spanId. hexString
44+ let spanId = Int64 ( spanHex, radix: 16 ) ?? 0
45+ let operationName = span. name
46+ let startTime = Int64 ( span. startTime. timeIntervalSince1970. toMicroseconds)
47+ let duration = Int64 ( span. endTime. timeIntervalSince ( span. startTime) . toMicroseconds)
48+
49+ var parentSpanId : Int64 = 0
50+
51+ tags. append ( contentsOf: toJaegerTags ( attributes: span. attributes) )
52+ logs. append ( contentsOf: toJaegerLogs ( events: span. events) )
53+ references. append ( contentsOf: toSpanRefs ( links: span. links) )
54+
55+ if let parentId = span. parentSpanId, parentId. isValid {
56+ let parentTraceIdHigh = traceIdHigh
57+ let parentTraceIdLow = traceIdLow
58+
59+ let spanHex = parentId. hexString
60+ parentSpanId = Int64 ( spanHex, radix: 16 ) ?? 0
61+
62+ let refType = SpanRefType . child_of
63+ let spanRef = SpanRef (
64+ refType: refType, traceIdLow: parentTraceIdLow, traceIdHigh: parentTraceIdHigh,
65+ spanId: parentSpanId)
66+
67+ references. append ( spanRef)
68+ }
69+
70+ tags. append (
71+ Tag (
72+ key: Adapter . keySpanKind, vType: . string, vStr: span. kind. rawValue. uppercased ( ) ,
73+ vDouble: nil , vBool: nil , vLong: nil , vBinary: nil ) )
74+ if case let Status . error( description) = span. status {
75+ tags. append (
76+ Tag (
77+ key: Adapter . keySpanStatusMessage, vType: . string, vStr: description, vDouble: nil ,
78+ vBool: nil , vLong: nil , vBinary: nil ) )
79+ tags. append (
80+ Tag (
81+ key: keyError, vType: . bool, vStr: nil , vDouble: nil , vBool: true , vLong: nil ,
82+ vBinary: nil ) )
83+
84+ } else {
85+ tags. append (
86+ Tag (
87+ key: Adapter . keySpanStatusMessage, vType: . string, vStr: " " , vDouble: nil , vBool: nil ,
88+ vLong: nil , vBinary: nil ) )
89+ }
90+ tags. append (
91+ Tag (
92+ key: Adapter . keySpanStatusCode, vType: . long, vStr: nil , vDouble: nil , vBool: nil ,
93+ vLong: Int64 ( span. status. code) , vBinary: nil ) )
94+
95+ return Span (
96+ traceIdLow: traceIdLow, traceIdHigh: traceIdHigh, spanId: spanId,
97+ parentSpanId: parentSpanId, operationName: operationName, references: references, flags: 0 ,
98+ startTime: startTime, duration: duration, tags: tags, logs: logs)
7999 }
80100
81101 static func toJaegerTags( attributes: [ String : AttributeValue ] ) -> [ Tag ] {
82- var tags = [ Tag] ( )
83- tags. reserveCapacity ( attributes. count)
84- attributes. forEach {
85- tags. append ( toJaegerTag ( key: $0. key, attrib: $0. value) )
86- }
87- return tags
102+ var tags = [ Tag] ( )
103+ tags. reserveCapacity ( attributes. count)
104+ attributes. forEach {
105+ tags. append ( toJaegerTag ( key: $0. key, attrib: $0. value) )
106+ }
107+ return tags
88108 }
89109
90110 static func toJaegerTag( key: String , attrib: AttributeValue ) -> Tag {
91- let key = key
92- var vType : TagType
93- var vStr : String ?
94- var vDouble : Double ?
95- var vBool : Bool ?
96- var vLong : Int64 ?
97-
98- switch attrib {
99- case let . string( value) :
100- vType = . string
101- vStr = value
102- case let . bool( value) :
103- vType = . bool
104- vBool = value
105- case let . int( value) :
106- vType = . long
107- vLong = Int64 ( value)
108- case let . double( value) :
109- vType = . double
110- vDouble = value
111- case let . stringArray( value) :
112- vType = . string
113- vStr = try ? String ( data: JSONEncoder ( ) . encode ( value) , encoding: . utf8)
114- case let . boolArray( value) :
115- vType = . string
116- vStr = try ? String ( data: JSONEncoder ( ) . encode ( value) , encoding: . utf8)
117- case let . intArray( value) :
118- vType = . string
119- vStr = try ? String ( data: JSONEncoder ( ) . encode ( value) , encoding: . utf8)
120- case let . doubleArray( value) :
121- vType = . string
122- vStr = try ? String ( data: JSONEncoder ( ) . encode ( value) , encoding: . utf8)
123- }
124- return Tag ( key: key, vType: vType, vStr: vStr, vDouble: vDouble, vBool: vBool, vLong: vLong, vBinary: nil )
111+ let key = key
112+ var vType : TagType
113+ var vStr : String ?
114+ var vDouble : Double ?
115+ var vBool : Bool ?
116+ var vLong : Int64 ?
117+
118+ switch attrib {
119+ case let . string( value) :
120+ vType = . string
121+ vStr = value
122+ case let . bool( value) :
123+ vType = . bool
124+ vBool = value
125+ case let . int( value) :
126+ vType = . long
127+ vLong = Int64 ( value)
128+ case let . double( value) :
129+ vType = . double
130+ vDouble = value
131+ case let . stringArray( value) :
132+ vType = . string
133+ vStr = try ? String ( data: JSONEncoder ( ) . encode ( value) , encoding: . utf8)
134+ case let . boolArray( value) :
135+ vType = . string
136+ vStr = try ? String ( data: JSONEncoder ( ) . encode ( value) , encoding: . utf8)
137+ case let . intArray( value) :
138+ vType = . string
139+ vStr = try ? String ( data: JSONEncoder ( ) . encode ( value) , encoding: . utf8)
140+ case let . doubleArray( value) :
141+ vType = . string
142+ vStr = try ? String ( data: JSONEncoder ( ) . encode ( value) , encoding: . utf8)
143+ case let . set( value) :
144+ vType = . string
145+ vStr = try ? String ( data: JSONEncoder ( ) . encode ( value) , encoding: . utf8)
146+ }
147+ return Tag (
148+ key: key, vType: vType, vStr: vStr, vDouble: vDouble, vBool: vBool, vLong: vLong,
149+ vBinary: nil )
125150 }
126151
127152 static func toJaegerLogs( events: [ SpanData . Event ] ) -> [ Log ] {
128- var logs = [ Log] ( )
129- logs. reserveCapacity ( events. count)
153+ var logs = [ Log] ( )
154+ logs. reserveCapacity ( events. count)
130155
131- events. forEach {
132- logs. append ( toJaegerLog ( event: $0) )
133- }
134- return logs
156+ events. forEach {
157+ logs. append ( toJaegerLog ( event: $0) )
158+ }
159+ return logs
135160 }
136161
137162 static func toJaegerLog( event: SpanData . Event ) -> Log {
138- let timestamp = Int64 ( event. timestamp. timeIntervalSince1970. toMicroseconds)
139-
140- var tags = TList < Tag > ( )
141- tags. append ( Tag ( key: Adapter . keyLogMessage, vType: . string, vStr: event. name, vDouble: nil , vBool: nil , vLong: nil , vBinary: nil ) )
142- tags. append ( contentsOf: toJaegerTags ( attributes: event. attributes) )
143- return Log ( timestamp: timestamp, fields: tags)
163+ let timestamp = Int64 ( event. timestamp. timeIntervalSince1970. toMicroseconds)
164+
165+ var tags = TList < Tag > ( )
166+ tags. append (
167+ Tag (
168+ key: Adapter . keyLogMessage, vType: . string, vStr: event. name, vDouble: nil , vBool: nil ,
169+ vLong: nil , vBinary: nil ) )
170+ tags. append ( contentsOf: toJaegerTags ( attributes: event. attributes) )
171+ return Log ( timestamp: timestamp, fields: tags)
144172 }
145173
146174 static func toSpanRefs( links: [ SpanData . Link ] ) -> [ SpanRef ] {
147- var spanRefs = [ SpanRef] ( )
148- spanRefs. reserveCapacity ( links. count)
149- links. forEach {
150- spanRefs. append ( toSpanRef ( link: $0) )
151- }
152- return spanRefs
175+ var spanRefs = [ SpanRef] ( )
176+ spanRefs. reserveCapacity ( links. count)
177+ links. forEach {
178+ spanRefs. append ( toSpanRef ( link: $0) )
179+ }
180+ return spanRefs
153181 }
154182
155183 static func toSpanRef( link: SpanData . Link ) -> SpanRef {
156- let traceHex = link. context. traceId. hexString
157- let secondIndex = traceHex. index ( traceHex. startIndex, offsetBy: 16 )
158- let traceIdHigh = Int64 ( traceHex [ traceHex. startIndex ..< secondIndex] , radix: 16 ) ?? 0
159- let traceIdLow = Int64 ( traceHex [ secondIndex ..< traceHex. endIndex] , radix: 16 ) ?? 0
184+ let traceHex = link. context. traceId. hexString
185+ let secondIndex = traceHex. index ( traceHex. startIndex, offsetBy: 16 )
186+ let traceIdHigh = Int64 ( traceHex [ traceHex. startIndex..< secondIndex] , radix: 16 ) ?? 0
187+ let traceIdLow = Int64 ( traceHex [ secondIndex..< traceHex. endIndex] , radix: 16 ) ?? 0
160188
161- let spanHex = link. context. spanId. hexString
162- let spanId = Int64 ( spanHex, radix: 16 ) ?? 0
163- let refType = SpanRefType . follows_from
189+ let spanHex = link. context. spanId. hexString
190+ let spanId = Int64 ( spanHex, radix: 16 ) ?? 0
191+ let refType = SpanRefType . follows_from
164192
165- return SpanRef ( refType: refType, traceIdLow: traceIdLow, traceIdHigh: traceIdHigh, spanId: spanId)
193+ return SpanRef (
194+ refType: refType, traceIdLow: traceIdLow, traceIdHigh: traceIdHigh, spanId: spanId)
166195 }
167- }
196+ }
168197
169198#endif
0 commit comments