Skip to content

Commit f560201

Browse files
author
Nacho Bonafonte
committed
Changes to Span exporter with an asynchronous logic:
The write asynchronously send the spans, and recover the failed sent spans in case of error, it alwsys return success flush sends whatever is left without being sent and waits for the payload to be sent before returning
1 parent 8db687d commit f560201

File tree

2 files changed

+34
-17
lines changed

2 files changed

+34
-17
lines changed

Sources/Exporters/OpenTelemetryProtocol/trace/OtlpHTttpTraceExporter.swift renamed to Sources/Exporters/OpenTelemetryProtocol/trace/OtlpHttpTraceExporter.swift

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,44 +3,63 @@
33
// SPDX-License-Identifier: Apache-2.0
44
//
55

6-
import OpenTelemetrySdk
76
import Foundation
7+
import OpenTelemetrySdk
88

99
public func defaultOltpHttpTracesEndpoint() -> URL {
1010
URL(string: "http://localhost:4318/v1/traces")!
1111
}
1212

1313
public class OtlpHttpTraceExporter: OtlpHttpExporterBase, SpanExporter {
1414
var pendingSpans: [SpanData] = []
15-
15+
1616
override
1717
public init(endpoint: URL = defaultOltpHttpTracesEndpoint(), useSession: URLSession? = nil) {
1818
super.init(endpoint: endpoint, useSession: useSession)
1919
}
20-
20+
2121
public func export(spans: [SpanData]) -> SpanExporterResultCode {
2222
pendingSpans.append(contentsOf: spans)
23-
return self.flush()
24-
}
25-
26-
public func flush() -> SpanExporterResultCode {
27-
var exporterResult: SpanExporterResultCode = .failure
28-
let spans = pendingSpans
23+
let sendingSpans = pendingSpans
2924
pendingSpans = []
25+
3026
let body = Opentelemetry_Proto_Collector_Trace_V1_ExportTraceServiceRequest.with {
3127
$0.resourceSpans = SpanAdapter.toProtoResourceSpans(spanDataList: spans)
3228
}
33-
3429
let request = createRequest(body: body, endpoint: endpoint)
35-
httpClient.send(request: request) { result in
30+
httpClient.send(request: request) { [weak self] result in
3631
switch result {
37-
case .success(_):
38-
exporterResult = SpanExporterResultCode.success
32+
case .success:
33+
break
3934
case .failure(let error):
35+
self?.pendingSpans.append(contentsOf: sendingSpans)
4036
print(error)
41-
exporterResult = SpanExporterResultCode.failure
4237
}
4338
}
44-
return exporterResult
39+
return .success
40+
}
41+
42+
public func flush() -> SpanExporterResultCode {
43+
var resultValue: SpanExporterResultCode = .success
44+
if !pendingSpans.isEmpty {
45+
let body = Opentelemetry_Proto_Collector_Trace_V1_ExportTraceServiceRequest.with {
46+
$0.resourceSpans = SpanAdapter.toProtoResourceSpans(spanDataList: pendingSpans)
47+
}
48+
let semaphore = DispatchSemaphore(value: 0)
49+
let request = createRequest(body: body, endpoint: endpoint)
50+
51+
httpClient.send(request: request) { result in
52+
switch result {
53+
case .success:
54+
break
55+
case .failure(let error):
56+
print(error)
57+
resultValue = .failure
58+
}
59+
semaphore.signal()
60+
}
61+
semaphore.wait()
62+
}
63+
return resultValue
4564
}
4665
}

Sources/Exporters/OpenTelemetryProtocol/trace/utils/HTTPClient.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,7 @@ internal final class HTTPClient {
2828
let task = session.dataTask(with: request) { data, response, error in
2929
completion(httpClientResult(for: (data, response, error)))
3030
}
31-
3231
task.resume()
33-
Thread.sleep(forTimeInterval: 1) // FIXME is there a better way to handle this?
3432
}
3533
}
3634

0 commit comments

Comments
 (0)