Skip to content

Commit 495deb8

Browse files
committed
fix: add explicit Sendable to AsyncSpanExporter and deduplicate partitioning logic
Add Sendable conformance to AsyncSpanExporter for consistency with AsyncLogRecordExporter and AsyncMetricExporter. Extract repeated async/sync exporter partitioning in MultiLogRecordExporter into a private helper method.
1 parent 9b09eb6 commit 495deb8

File tree

2 files changed

+11
-20
lines changed

2 files changed

+11
-20
lines changed

Sources/OpenTelemetrySdk/Logs/Export/MultiLogRecordExporter.swift

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@ public class MultiLogRecordExporter: LogRecordExporter, @unchecked Sendable {
4040

4141
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
4242
extension MultiLogRecordExporter: AsyncLogRecordExporter {
43-
public func exportAsync(logRecords: [ReadableLogRecord], explicitTimeout: TimeInterval?) async -> ExportResult {
43+
private typealias PartitionedExporters = (async: [AsyncLogRecordExporter], sync: [LogRecordExporter])
44+
45+
private func partitionExporters() -> PartitionedExporters {
4446
var asyncExporters: [AsyncLogRecordExporter] = []
4547
var syncExporters: [LogRecordExporter] = []
4648
for exporter in logRecordExporters {
@@ -50,6 +52,11 @@ extension MultiLogRecordExporter: AsyncLogRecordExporter {
5052
syncExporters.append(exporter)
5153
}
5254
}
55+
return (asyncExporters, syncExporters)
56+
}
57+
58+
public func exportAsync(logRecords: [ReadableLogRecord], explicitTimeout: TimeInterval?) async -> ExportResult {
59+
let (asyncExporters, syncExporters) = partitionExporters()
5360

5461
var result = await withTaskGroup(of: ExportResult.self, returning: ExportResult.self) { group in
5562
for exporter in asyncExporters {
@@ -72,15 +79,7 @@ extension MultiLogRecordExporter: AsyncLogRecordExporter {
7279
}
7380

7481
public func shutdownAsync(explicitTimeout: TimeInterval?) async {
75-
var asyncExporters: [AsyncLogRecordExporter] = []
76-
var syncExporters: [LogRecordExporter] = []
77-
for exporter in logRecordExporters {
78-
if let asyncExporter = exporter as? AsyncLogRecordExporter {
79-
asyncExporters.append(asyncExporter)
80-
} else {
81-
syncExporters.append(exporter)
82-
}
83-
}
82+
let (asyncExporters, syncExporters) = partitionExporters()
8483

8584
await withTaskGroup(of: Void.self) { group in
8685
for exporter in asyncExporters {
@@ -96,15 +95,7 @@ extension MultiLogRecordExporter: AsyncLogRecordExporter {
9695
}
9796

9897
public func forceFlushAsync(explicitTimeout: TimeInterval?) async -> ExportResult {
99-
var asyncExporters: [AsyncLogRecordExporter] = []
100-
var syncExporters: [LogRecordExporter] = []
101-
for exporter in logRecordExporters {
102-
if let asyncExporter = exporter as? AsyncLogRecordExporter {
103-
asyncExporters.append(asyncExporter)
104-
} else {
105-
syncExporters.append(exporter)
106-
}
107-
}
98+
let (asyncExporters, syncExporters) = partitionExporters()
10899

109100
var result = await withTaskGroup(of: ExportResult.self, returning: ExportResult.self) { group in
110101
for exporter in asyncExporters {

Sources/OpenTelemetrySdk/Trace/Export/AsyncSpanExporter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import Foundation
1414
/// Default implementations bridge to the synchronous `SpanExporter` methods so
1515
/// that adopters only need to override the methods they want to make async.
1616
@available(macOS 10.15, iOS 13.0, watchOS 6.0, tvOS 13.0, *)
17-
public protocol AsyncSpanExporter: SpanExporter {
17+
public protocol AsyncSpanExporter: SpanExporter, Sendable {
1818
/// Called to export sampled Spans asynchronously.
1919
/// - Parameter spans: the list of sampled Spans to be exported.
2020
/// - Parameter explicitTimeout: optional timeout for the export operation.

0 commit comments

Comments
 (0)