Skip to content

Commit 7c31864

Browse files
committed
Apply Nacho's changes to HTTP Log and Metrics exporters, update tests
Signed-off-by: Kevin Earls <[email protected]>
1 parent f560201 commit 7c31864

File tree

5 files changed

+98
-37
lines changed

5 files changed

+98
-37
lines changed

Sources/Exporters/OpenTelemetryProtocol/logs/OtlpHttpLogExporter.swift

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,33 +20,54 @@ public class OtlpHttpLogExporter : OtlpHttpExporterBase, LogRecordExporter {
2020

2121
public func export(logRecords: [OpenTelemetrySdk.ReadableLogRecord]) -> OpenTelemetrySdk.ExportResult {
2222
pendingLogRecords.append(contentsOf: logRecords)
23-
return self.flush()
24-
}
25-
26-
public func forceFlush() -> OpenTelemetrySdk.ExportResult {
27-
self.flush()
28-
}
29-
30-
public func flush() -> ExportResult {
31-
var exporterResult: ExportResult = .failure
32-
let logRecords = pendingLogRecords
23+
let sendingLogRecords = pendingLogRecords
3324
pendingLogRecords = []
34-
25+
3526
let body = Opentelemetry_Proto_Collector_Logs_V1_ExportLogsServiceRequest.with { request in
36-
request.resourceLogs = LogRecordAdapter.toProtoResourceRecordLog(logRecordList: logRecords)
27+
request.resourceLogs = LogRecordAdapter.toProtoResourceRecordLog(logRecordList: sendingLogRecords)
3728
}
3829

3930
let request = createRequest(body: body, endpoint: endpoint)
40-
httpClient.send(request: request) { result in
31+
httpClient.send(request: request) { [weak self] result in
4132
switch result {
4233
case .success(_):
43-
exporterResult = ExportResult.success
34+
break
4435
case .failure(let error):
36+
self?.pendingLogRecords.append(contentsOf: sendingLogRecords)
4537
print(error)
46-
exporterResult = ExportResult.failure
4738
}
4839
}
4940

41+
return .success
42+
}
43+
44+
public func forceFlush() -> OpenTelemetrySdk.ExportResult {
45+
self.flush()
46+
}
47+
48+
public func flush() -> ExportResult {
49+
var exporterResult: ExportResult = .success
50+
51+
if !pendingLogRecords.isEmpty {
52+
let body = Opentelemetry_Proto_Collector_Logs_V1_ExportLogsServiceRequest.with { request in
53+
request.resourceLogs = LogRecordAdapter.toProtoResourceRecordLog(logRecordList: pendingLogRecords)
54+
}
55+
let semaphore = DispatchSemaphore(value: 0)
56+
let request = createRequest(body: body, endpoint: endpoint)
57+
58+
httpClient.send(request: request) { result in
59+
switch result {
60+
case .success(_):
61+
exporterResult = ExportResult.success
62+
case .failure(let error):
63+
print(error)
64+
exporterResult = ExportResult.failure
65+
}
66+
semaphore.signal()
67+
}
68+
semaphore.wait()
69+
}
70+
5071
return exporterResult
5172
}
5273
}

Sources/Exporters/OpenTelemetryProtocol/metric/OltpHTTPMetricExporter.swift

Lines changed: 34 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,28 +20,47 @@ public class OtlpHttpMetricExporter: OtlpHttpExporterBase, MetricExporter {
2020

2121
public func export(metrics: [Metric], shouldCancel: (() -> Bool)?) -> MetricExporterResultCode {
2222
pendingMetrics.append(contentsOf: metrics)
23-
return self.flush()
24-
}
25-
26-
public func flush() -> MetricExporterResultCode {
27-
var exporterResult: MetricExporterResultCode = .success
28-
29-
let metrics = pendingMetrics
23+
let sendingMetrics = pendingMetrics
3024
pendingMetrics = []
31-
let body = Opentelemetry_Proto_Collector_Metrics_V1_ExportMetricsServiceRequest
32-
.with {
33-
$0.resourceMetrics = MetricsAdapter.toProtoResourceMetrics(metricDataList: metrics)
34-
}
25+
let body = Opentelemetry_Proto_Collector_Metrics_V1_ExportMetricsServiceRequest.with {
26+
$0.resourceMetrics = MetricsAdapter.toProtoResourceMetrics(metricDataList: sendingMetrics)
27+
}
3528

3629
let request = createRequest(body: body, endpoint: endpoint)
37-
httpClient.send(request: request) { result in
30+
httpClient.send(request: request) { [weak self] result in
3831
switch result {
3932
case .success(_):
40-
exporterResult = MetricExporterResultCode.success
33+
break
4134
case .failure(let error):
42-
print("ERROR: \(error)")
43-
exporterResult = MetricExporterResultCode.failureNotRetryable // FIXME how do I know what type of failure?
35+
self?.pendingMetrics.append(contentsOf: sendingMetrics)
36+
print(error)
37+
}
38+
}
39+
40+
return .success
41+
}
42+
43+
public func flush() -> MetricExporterResultCode {
44+
var exporterResult: MetricExporterResultCode = .success
45+
46+
if !pendingMetrics.isEmpty {
47+
let body = Opentelemetry_Proto_Collector_Metrics_V1_ExportMetricsServiceRequest.with {
48+
$0.resourceMetrics = MetricsAdapter.toProtoResourceMetrics(metricDataList: pendingMetrics)
49+
}
50+
51+
let semaphore = DispatchSemaphore(value: 0)
52+
let request = createRequest(body: body, endpoint: endpoint)
53+
httpClient.send(request: request) { result in
54+
switch result {
55+
case .success(_):
56+
break
57+
case .failure(let error):
58+
print(error)
59+
exporterResult = MetricExporterResultCode.failureNotRetryable
60+
}
61+
semaphore.signal()
4462
}
63+
semaphore.wait()
4564
}
4665
return exporterResult
4766
}

Tests/ExportersTests/OpenTelemetryProtocol/OtlpHttpLogRecordExporterTests.swift

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,20 @@ class OtlpHttpLogRecordExporterTests: XCTestCase {
5858

5959
XCTAssertNoThrow(try testServer.receiveEnd())
6060
}
61+
62+
// TODO: for this and the other httpexporters, see if there is some way to really test this. As writtne these tests
63+
// won't really do much as there are no pending spans
64+
func testFlush() {
65+
let endpoint = URL(string: "http://localhost:\(testServer.serverPort)")!
66+
let exporter = OtlpHttpLogExporter(endpoint: endpoint)
67+
XCTAssertEqual(ExportResult.success, exporter.flush())
68+
}
69+
70+
func testForceFlush() {
71+
let endpoint = URL(string: "http://localhost:\(testServer.serverPort)")!
72+
let exporter = OtlpHttpLogExporter(endpoint: endpoint)
73+
XCTAssertEqual(ExportResult.success, exporter.forceFlush())
74+
}
75+
76+
6177
}

Tests/ExportersTests/OpenTelemetryProtocol/OtlpHttpMetricsExporterTest.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,12 @@ class OtlpHttpMetricsExporterTest: XCTestCase {
9898
// TODO: if we can turn contents back into [Metric], look at OtlpMetricExporterTests for additional checks
9999
}
100100

101+
func testFlush() {
102+
let endpoint = URL(string: "http://localhost:\(testServer.serverPort)")!
103+
let exporter = OtlpHttpMetricExporter(endpoint: endpoint)
104+
XCTAssertEqual(MetricExporterResultCode.success, exporter.flush())
105+
}
106+
101107
func generateSumMetric(description: String = "description") -> Metric {
102108
let scope = InstrumentationScopeInfo(name: "lib", version: "semver:0.0.0")
103109
var metric = Metric(namespace: "namespace", name: "metric", desc: description, type: .doubleSum, resource: Resource(), instrumentationScopeInfo: scope)

Tests/ExportersTests/OpenTelemetryProtocol/OtlpHttpTraceExporterTests.swift

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,6 @@ class OtlpHttpTraceExporterTests: XCTestCase {
5555
// This is not a thorough test of HTTPClient, but just enough to keep code coverage happy.
5656
// There is a more complete test as part of the DataDog exporter test
5757
func testHttpClient() {
58-
let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
59-
let testServer = NIOHTTP1TestServer(group: group)
60-
defer {
61-
XCTAssertNoThrow(try testServer.stop())
62-
XCTAssertNoThrow(try group.syncShutdownGracefully())
63-
}
64-
6558
let endpoint = URL(string: "http://localhost:\(testServer.serverPort)/some-route")!
6659
let httpClient = HTTPClient()
6760
var request = URLRequest(url: endpoint)
@@ -91,6 +84,12 @@ class OtlpHttpTraceExporterTests: XCTestCase {
9184
XCTAssertNoThrow(try testServer.writeOutbound(.end(nil)))
9285
}
9386

87+
func testFlush() {
88+
let endpoint = URL(string: "http://localhost:\(testServer.serverPort)/v1/traces")!
89+
let exporter = OtlpHttpTraceExporter(endpoint: endpoint)
90+
XCTAssertEqual(SpanExporterResultCode.success, exporter.flush())
91+
}
92+
9493
private func generateFakeSpan(endpointName: String = "/api/endpoint") -> SpanData {
9594
let duration = 0.9
9695
let start = Date()

0 commit comments

Comments
 (0)