Skip to content

Commit 297d91f

Browse files
author
Ignacio Bonafonte
authored
Fix Headers were not being properly sent in OtlpHttpLogExporter (#513)
Fix Headers were not being properly sent in OtlpHttpLogExporter or StableOtlpMetricExporter Given some xcformat love to some related files
1 parent 0033445 commit 297d91f

File tree

10 files changed

+465
-460
lines changed

10 files changed

+465
-460
lines changed

Sources/Exporters/OpenTelemetryProtocolGrpc/logs/OtlpLogExporter.swift

Lines changed: 52 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -4,68 +4,66 @@
44
*/
55

66
import Foundation
7-
import Logging
87
import GRPC
8+
import Logging
99
import NIO
1010
import NIOHPACK
1111
import OpenTelemetryApi
12-
import OpenTelemetrySdk
1312
import OpenTelemetryProtocolExporterCommon
13+
import OpenTelemetrySdk
1414

15-
public class OtlpLogExporter : LogRecordExporter {
16-
let channel : GRPCChannel
17-
var logClient : Opentelemetry_Proto_Collector_Logs_V1_LogsServiceNIOClient
18-
let config : OtlpConfiguration
19-
var callOptions : CallOptions
20-
21-
public init(channel: GRPCChannel,
22-
config: OtlpConfiguration = OtlpConfiguration(),
23-
logger: Logging.Logger = Logging.Logger(label: "io.grpc", factory: { _ in SwiftLogNoOpLogHandler() }),
24-
envVarHeaders: [(String, String)]? = EnvVarHeaders.attributes){
25-
self.channel = channel
26-
logClient = Opentelemetry_Proto_Collector_Logs_V1_LogsServiceNIOClient(channel: channel)
27-
self.config = config
28-
let userAgentHeader = (Constants.HTTP.userAgent, Headers.getUserAgentHeader())
29-
if let headers = envVarHeaders {
30-
var updatedHeaders = headers
31-
updatedHeaders.append(userAgentHeader)
32-
callOptions = CallOptions(customMetadata: HPACKHeaders(updatedHeaders), logger: logger)
33-
} else if let headers = config.headers {
34-
var updatedHeaders = headers
35-
updatedHeaders.append(userAgentHeader)
36-
callOptions = CallOptions(customMetadata: HPACKHeaders(updatedHeaders), logger: logger)
37-
}
38-
else {
39-
var headers = [(String, String)]()
40-
headers.append(userAgentHeader)
41-
callOptions = CallOptions(customMetadata: HPACKHeaders(headers), logger: logger)
15+
public class OtlpLogExporter: LogRecordExporter {
16+
let channel: GRPCChannel
17+
var logClient: Opentelemetry_Proto_Collector_Logs_V1_LogsServiceNIOClient
18+
let config: OtlpConfiguration
19+
var callOptions: CallOptions
20+
21+
public init(channel: GRPCChannel,
22+
config: OtlpConfiguration = OtlpConfiguration(),
23+
logger: Logging.Logger = Logging.Logger(label: "io.grpc", factory: { _ in SwiftLogNoOpLogHandler() }),
24+
envVarHeaders: [(String, String)]? = EnvVarHeaders.attributes) {
25+
self.channel = channel
26+
logClient = Opentelemetry_Proto_Collector_Logs_V1_LogsServiceNIOClient(channel: channel)
27+
self.config = config
28+
let userAgentHeader = (Constants.HTTP.userAgent, Headers.getUserAgentHeader())
29+
if let headers = envVarHeaders {
30+
var updatedHeaders = headers
31+
updatedHeaders.append(userAgentHeader)
32+
callOptions = CallOptions(customMetadata: HPACKHeaders(updatedHeaders), logger: logger)
33+
} else if let headers = config.headers {
34+
var updatedHeaders = headers
35+
updatedHeaders.append(userAgentHeader)
36+
callOptions = CallOptions(customMetadata: HPACKHeaders(updatedHeaders), logger: logger)
37+
} else {
38+
var headers = [(String, String)]()
39+
headers.append(userAgentHeader)
40+
callOptions = CallOptions(customMetadata: HPACKHeaders(headers), logger: logger)
41+
}
4242
}
43-
}
44-
45-
public func export(logRecords: [ReadableLogRecord], explicitTimeout: TimeInterval? = nil) -> ExportResult {
46-
let logRequest = Opentelemetry_Proto_Collector_Logs_V1_ExportLogsServiceRequest.with { request in
47-
request.resourceLogs = LogRecordAdapter.toProtoResourceRecordLog(logRecordList: logRecords)
43+
44+
public func export(logRecords: [ReadableLogRecord], explicitTimeout: TimeInterval? = nil) -> ExportResult {
45+
let logRequest = Opentelemetry_Proto_Collector_Logs_V1_ExportLogsServiceRequest.with { request in
46+
request.resourceLogs = LogRecordAdapter.toProtoResourceRecordLog(logRecordList: logRecords)
47+
}
48+
let timeout = min(explicitTimeout ?? TimeInterval.greatestFiniteMagnitude, config.timeout)
49+
if timeout > 0 {
50+
callOptions.timeLimit = TimeLimit.timeout(TimeAmount.nanoseconds(Int64(timeout.toNanoseconds)))
51+
}
52+
53+
let export = logClient.export(logRequest, callOptions: callOptions)
54+
do {
55+
_ = try export.response.wait()
56+
return .success
57+
} catch {
58+
return .failure
59+
}
4860
}
49-
let timeout = min(explicitTimeout ?? TimeInterval.greatestFiniteMagnitude, config.timeout)
50-
if timeout > 0 {
51-
callOptions.timeLimit = TimeLimit.timeout(TimeAmount.nanoseconds(Int64(timeout.toNanoseconds)))
61+
62+
public func shutdown(explicitTimeout: TimeInterval? = nil) {
63+
_ = channel.close()
5264
}
53-
54-
55-
let export = logClient.export(logRequest, callOptions: callOptions)
56-
do {
57-
_ = try export.response.wait()
58-
return .success
59-
} catch {
60-
return .failure
65+
66+
public func forceFlush(explicitTimeout: TimeInterval? = nil) -> ExportResult {
67+
.success
6168
}
62-
}
63-
64-
public func shutdown(explicitTimeout: TimeInterval? = nil) {
65-
_ = channel.close()
66-
}
67-
68-
public func forceFlush(explicitTimeout: TimeInterval? = nil) -> ExportResult {
69-
.success
70-
}
7169
}

Sources/Exporters/OpenTelemetryProtocolGrpc/metric/OtlpMetricExporter.swift

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,24 @@
44
*/
55

66
import Foundation
7-
import Logging
87
import GRPC
8+
import Logging
99
import NIO
1010
import NIOHPACK
1111
import OpenTelemetryApi
12-
import OpenTelemetrySdk
1312
import OpenTelemetryProtocolExporterCommon
13+
import OpenTelemetrySdk
1414

1515
public class OtlpMetricExporter: MetricExporter {
1616
let channel: GRPCChannel
1717
var metricClient: Opentelemetry_Proto_Collector_Metrics_V1_MetricsServiceNIOClient
18-
let config : OtlpConfiguration
19-
var callOptions : CallOptions? = nil
20-
21-
18+
let config: OtlpConfiguration
19+
var callOptions: CallOptions?
2220

23-
public init(channel: GRPCChannel, config: OtlpConfiguration = OtlpConfiguration(), logger: Logging.Logger = Logging.Logger(label: "io.grpc", factory: { _ in SwiftLogNoOpLogHandler() }), envVarHeaders: [(String,String)]? = EnvVarHeaders.attributes) {
21+
public init(channel: GRPCChannel, config: OtlpConfiguration = OtlpConfiguration(), logger: Logging.Logger = Logging.Logger(label: "io.grpc", factory: { _ in SwiftLogNoOpLogHandler() }), envVarHeaders: [(String, String)]? = EnvVarHeaders.attributes) {
2422
self.channel = channel
2523
self.config = config
26-
self.metricClient = Opentelemetry_Proto_Collector_Metrics_V1_MetricsServiceNIOClient(channel: self.channel)
24+
metricClient = Opentelemetry_Proto_Collector_Metrics_V1_MetricsServiceNIOClient(channel: self.channel)
2725
let userAgentHeader = (Constants.HTTP.userAgent, Headers.getUserAgentHeader())
2826
if let headers = envVarHeaders {
2927
var updatedHeaders = headers
@@ -33,38 +31,37 @@ public class OtlpMetricExporter: MetricExporter {
3331
var updatedHeaders = headers
3432
updatedHeaders.append(userAgentHeader)
3533
callOptions = CallOptions(customMetadata: HPACKHeaders(updatedHeaders), logger: logger)
36-
}
37-
else {
34+
} else {
3835
var headers = [(String, String)]()
3936
headers.append(userAgentHeader)
4037
callOptions = CallOptions(customMetadata: HPACKHeaders(headers), logger: logger)
4138
}
4239
}
43-
40+
4441
public func export(metrics: [Metric], shouldCancel: (() -> Bool)?) -> MetricExporterResultCode {
4542
let exportRequest = Opentelemetry_Proto_Collector_Metrics_V1_ExportMetricsServiceRequest
4643
.with {
4744
$0.resourceMetrics = MetricsAdapter.toProtoResourceMetrics(metricDataList: metrics)
4845
}
49-
46+
5047
if config.timeout > 0 {
5148
metricClient.defaultCallOptions.timeLimit = TimeLimit.timeout(TimeAmount.nanoseconds(Int64(config.timeout.toNanoseconds)))
5249
}
53-
50+
5451
let export = metricClient.export(exportRequest, callOptions: callOptions)
55-
52+
5653
do {
5754
_ = try export.response.wait()
5855
return .success
5956
} catch {
6057
return .failureRetryable
6158
}
6259
}
63-
60+
6461
public func flush() -> SpanExporterResultCode {
6562
return .success
6663
}
67-
64+
6865
public func shutdown() {
6966
_ = channel.close()
7067
}

Sources/Exporters/OpenTelemetryProtocolGrpc/metric/StableOtlpMetricExporter.swift

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ public class StableOtlpMetricExporter: StableMetricExporter {
1515
public func getAggregationTemporality(for instrument: OpenTelemetrySdk.InstrumentType) -> OpenTelemetrySdk.AggregationTemporality {
1616
return aggregationTemporalitySelector.getAggregationTemporality(for: instrument)
1717
}
18-
18+
1919
let channel: GRPCChannel
2020
var metricClient: Opentelemetry_Proto_Collector_Metrics_V1_MetricsServiceNIOClient
2121
let config: OtlpConfiguration
2222
var callOptions: CallOptions?
2323
var aggregationTemporalitySelector: AggregationTemporalitySelector
2424
var defaultAggregationSelector: DefaultAggregationSelector
25-
25+
2626
public init(channel: GRPCChannel, config: OtlpConfiguration = OtlpConfiguration(), aggregationTemporalitySelector: AggregationTemporalitySelector = AggregationTemporality.alwaysCumulative(),
2727
defaultAggregationSelector: DefaultAggregationSelector = AggregationSelector.instance,
2828
logger: Logging.Logger = Logging.Logger(label: "io.grpc", factory: { _ in SwiftLogNoOpLogHandler() }), envVarHeaders: [(String, String)]? = EnvVarHeaders.attributes)
@@ -31,7 +31,7 @@ public class StableOtlpMetricExporter: StableMetricExporter {
3131
self.aggregationTemporalitySelector = aggregationTemporalitySelector
3232
self.channel = channel
3333
self.config = config
34-
self.metricClient = Opentelemetry_Proto_Collector_Metrics_V1_MetricsServiceNIOClient(channel: self.channel)
34+
metricClient = Opentelemetry_Proto_Collector_Metrics_V1_MetricsServiceNIOClient(channel: self.channel)
3535
if let headers = envVarHeaders {
3636
callOptions = CallOptions(customMetadata: HPACKHeaders(headers), logger: logger)
3737
} else if let headers = config.headers {
@@ -40,7 +40,7 @@ public class StableOtlpMetricExporter: StableMetricExporter {
4040
callOptions = CallOptions(logger: logger)
4141
}
4242
}
43-
43+
4444
public func export(metrics: [OpenTelemetrySdk.StableMetricData]) -> OpenTelemetrySdk.ExportResult {
4545
let exportRequest = Opentelemetry_Proto_Collector_Metrics_V1_ExportMetricsServiceRequest.with {
4646
$0.resourceMetrics = MetricsAdapter.toProtoResourceMetrics(stableMetricData: metrics)
@@ -56,14 +56,14 @@ public class StableOtlpMetricExporter: StableMetricExporter {
5656
return .failure
5757
}
5858
}
59-
59+
6060
public func flush() -> OpenTelemetrySdk.ExportResult {
6161
return .success
6262
}
63-
63+
6464
public func shutdown() -> OpenTelemetrySdk.ExportResult {
6565
_ = channel.close()
66-
66+
6767
return .success
6868
}
6969
}

Sources/Exporters/OpenTelemetryProtocolGrpc/trace/OtlpTraceExporter.swift

Lines changed: 50 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -4,67 +4,65 @@
44
*/
55

66
import Foundation
7-
import Logging
87
import GRPC
8+
import Logging
99
import NIO
1010
import NIOHPACK
1111
import OpenTelemetryApi
12-
import OpenTelemetrySdk
1312
import OpenTelemetryProtocolExporterCommon
13+
import OpenTelemetrySdk
1414

1515
public class OtlpTraceExporter: SpanExporter {
16-
17-
let channel: GRPCChannel
18-
var traceClient: Opentelemetry_Proto_Collector_Trace_V1_TraceServiceNIOClient
19-
let config : OtlpConfiguration
20-
var callOptions : CallOptions
21-
22-
public init(channel: GRPCChannel, config: OtlpConfiguration = OtlpConfiguration(), logger: Logging.Logger = Logging.Logger(label: "io.grpc", factory: { _ in SwiftLogNoOpLogHandler() }), envVarHeaders: [(String,String)]? = EnvVarHeaders.attributes) {
23-
self.channel = channel
24-
traceClient = Opentelemetry_Proto_Collector_Trace_V1_TraceServiceNIOClient(channel: channel)
25-
self.config = config
26-
let userAgentHeader = (Constants.HTTP.userAgent, Headers.getUserAgentHeader())
27-
if let headers = envVarHeaders {
28-
var updatedHeaders = headers
29-
updatedHeaders.append(userAgentHeader)
30-
callOptions = CallOptions(customMetadata: HPACKHeaders(updatedHeaders), logger: logger)
31-
} else if let headers = config.headers {
32-
var updatedHeaders = headers
33-
updatedHeaders.append(userAgentHeader)
34-
callOptions = CallOptions(customMetadata: HPACKHeaders(updatedHeaders), logger: logger)
35-
} else {
36-
var headers = [(String, String)]()
37-
headers.append(userAgentHeader)
38-
callOptions = CallOptions(customMetadata: HPACKHeaders(headers), logger: logger)
16+
let channel: GRPCChannel
17+
var traceClient: Opentelemetry_Proto_Collector_Trace_V1_TraceServiceNIOClient
18+
let config: OtlpConfiguration
19+
var callOptions: CallOptions
20+
21+
public init(channel: GRPCChannel, config: OtlpConfiguration = OtlpConfiguration(), logger: Logging.Logger = Logging.Logger(label: "io.grpc", factory: { _ in SwiftLogNoOpLogHandler() }), envVarHeaders: [(String, String)]? = EnvVarHeaders.attributes) {
22+
self.channel = channel
23+
traceClient = Opentelemetry_Proto_Collector_Trace_V1_TraceServiceNIOClient(channel: channel)
24+
self.config = config
25+
let userAgentHeader = (Constants.HTTP.userAgent, Headers.getUserAgentHeader())
26+
if let headers = envVarHeaders {
27+
var updatedHeaders = headers
28+
updatedHeaders.append(userAgentHeader)
29+
callOptions = CallOptions(customMetadata: HPACKHeaders(updatedHeaders), logger: logger)
30+
} else if let headers = config.headers {
31+
var updatedHeaders = headers
32+
updatedHeaders.append(userAgentHeader)
33+
callOptions = CallOptions(customMetadata: HPACKHeaders(updatedHeaders), logger: logger)
34+
} else {
35+
var headers = [(String, String)]()
36+
headers.append(userAgentHeader)
37+
callOptions = CallOptions(customMetadata: HPACKHeaders(headers), logger: logger)
38+
}
3939
}
40-
}
41-
42-
43-
public func export(spans: [SpanData], explicitTimeout: TimeInterval? = nil) -> SpanExporterResultCode {
44-
let exportRequest = Opentelemetry_Proto_Collector_Trace_V1_ExportTraceServiceRequest.with {
45-
$0.resourceSpans = SpanAdapter.toProtoResourceSpans(spanDataList: spans)
40+
41+
public func export(spans: [SpanData], explicitTimeout: TimeInterval? = nil) -> SpanExporterResultCode {
42+
let exportRequest = Opentelemetry_Proto_Collector_Trace_V1_ExportTraceServiceRequest.with {
43+
$0.resourceSpans = SpanAdapter.toProtoResourceSpans(spanDataList: spans)
44+
}
45+
let timeout = min(explicitTimeout ?? TimeInterval.greatestFiniteMagnitude, config.timeout)
46+
if timeout > 0 {
47+
callOptions.timeLimit = TimeLimit.timeout(TimeAmount.nanoseconds(Int64(timeout.toNanoseconds)))
48+
}
49+
50+
let export = traceClient.export(exportRequest, callOptions: callOptions)
51+
52+
do {
53+
// wait() on the response to stop the program from exiting before the response is received.
54+
_ = try export.response.wait()
55+
return .success
56+
} catch {
57+
return .failure
58+
}
4659
}
47-
let timeout = min(explicitTimeout ?? TimeInterval.greatestFiniteMagnitude, config.timeout)
48-
if timeout > 0 {
49-
callOptions.timeLimit = TimeLimit.timeout(TimeAmount.nanoseconds(Int64(timeout.toNanoseconds)))
60+
61+
public func flush(explicitTimeout: TimeInterval? = nil) -> SpanExporterResultCode {
62+
return .success
5063
}
51-
52-
let export = traceClient.export(exportRequest, callOptions: callOptions)
53-
54-
do {
55-
// wait() on the response to stop the program from exiting before the response is received.
56-
_ = try export.response.wait()
57-
return .success
58-
} catch {
59-
return .failure
64+
65+
public func shutdown(explicitTimeout: TimeInterval? = nil) {
66+
_ = channel.close()
6067
}
61-
}
62-
63-
public func flush(explicitTimeout: TimeInterval? = nil) -> SpanExporterResultCode {
64-
return .success
65-
}
66-
67-
public func shutdown(explicitTimeout: TimeInterval? = nil) {
68-
_ = channel.close()
69-
}
7068
}

0 commit comments

Comments
 (0)