Skip to content

Commit ea34649

Browse files
authored
added event.data nested support (#431)
1 parent e44c3c4 commit ea34649

File tree

10 files changed

+695
-584
lines changed

10 files changed

+695
-584
lines changed

Sources/Exporters/DatadogExporter/Logs/LogEncoder.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ internal struct DDLog: Encodable {
9898
return value
9999
case let .doubleArray(value):
100100
return value
101+
case let .set(value):
102+
return value
101103
}
102104
}
103105
self.attributes = LogAttributes(userAttributes: userAttributes, internalAttributes: internalAttributes)

Sources/Exporters/Jaeger/Adapter.swift

Lines changed: 152 additions & 123 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
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

Comments
 (0)