From 8773f1604e30436017942482aa4f708d3388949a Mon Sep 17 00:00:00 2001 From: devjoonn Date: Fri, 5 Dec 2025 00:23:51 +0900 Subject: [PATCH] feat: update OtlpHttpTraceExporter export synchronous and validate HTTP status codes --- .../OpenTelemetryProtocolHttp/HTTPClient.swift | 9 +++++++++ .../trace/OtlpHttpTraceExporter.swift | 18 ++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/Sources/Exporters/OpenTelemetryProtocolHttp/HTTPClient.swift b/Sources/Exporters/OpenTelemetryProtocolHttp/HTTPClient.swift index 59633e85d..83b892fed 100644 --- a/Sources/Exporters/OpenTelemetryProtocolHttp/HTTPClient.swift +++ b/Sources/Exporters/OpenTelemetryProtocolHttp/HTTPClient.swift @@ -71,5 +71,14 @@ func httpClientResult(for taskResult: (Data?, URLResponse?, Error?)) -> Result SpanExporterResultCode { + var resultValue: SpanExporterResultCode = .success var sendingSpans: [SpanData] = [] exporterLock.withLockVoid { pendingSpans.append(contentsOf: spans) @@ -68,7 +69,17 @@ public class OtlpHttpTraceExporter: OtlpHttpExporterBase, SpanExporter { $0.resourceSpans = SpanAdapter.toProtoResourceSpans( spanDataList: sendingSpans) } - let request = createRequest(body: body, endpoint: endpoint) + let semaphore = DispatchSemaphore(value: 0) + var request = createRequest(body: body, endpoint: endpoint) + if let headers = envVarHeaders { + headers.forEach { key, value in + request.addValue(value, forHTTPHeaderField: key) + } + } else if let headers = config.headers { + headers.forEach { key, value in + request.addValue(value, forHTTPHeaderField: key) + } + } exporterMetrics?.addSeen(value: sendingSpans.count) httpClient.send(request: request) { [weak self] result in switch result { @@ -80,9 +91,12 @@ public class OtlpHttpTraceExporter: OtlpHttpExporterBase, SpanExporter { self?.pendingSpans.append(contentsOf: sendingSpans) } print(error) + resultValue = .failure } + semaphore.signal() } - return .success + semaphore.wait() + return resultValue } public func flush(explicitTimeout: TimeInterval? = nil)