Skip to content

Commit e9c6ae6

Browse files
authored
adding exporter metric to StableOtlpHTTPMetricExporter (#638)
1 parent 9332fec commit e9c6ae6

File tree

1 file changed

+46
-6
lines changed

1 file changed

+46
-6
lines changed

Sources/Exporters/OpenTelemetryProtocolHttp/metric/StableOtlpHTTPMetricExporter.swift

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import Foundation
77
import OpenTelemetrySdk
8+
import OpenTelemetryApi
89
import OpenTelemetryProtocolExporterCommon
910
#if canImport(FoundationNetworking)
1011
import FoundationNetworking
@@ -15,11 +16,12 @@ public func defaultStableOtlpHTTPMetricsEndpoint() -> URL {
1516
}
1617

1718
public class StableOtlpHTTPMetricExporter: StableOtlpHTTPExporterBase, StableMetricExporter {
18-
var aggregationTemporalitySelector: AggregationTemporalitySelector
19-
var defaultAggregationSelector: DefaultAggregationSelector
19+
var aggregationTemporalitySelector: AggregationTemporalitySelector
20+
var defaultAggregationSelector: DefaultAggregationSelector
2021

21-
var pendingMetrics: [StableMetricData] = []
22-
private let exporterLock = Lock()
22+
var pendingMetrics: [StableMetricData] = []
23+
private let exporterLock = Lock()
24+
private var exporterMetrics: ExporterMetrics?
2325

2426
// MARK: - Init
2527

@@ -31,6 +33,40 @@ public class StableOtlpHTTPMetricExporter: StableOtlpHTTPExporterBase, StableMet
3133
super.init(endpoint: endpoint, config: config, useSession: useSession, envVarHeaders: envVarHeaders)
3234
}
3335

36+
/// A `convenience` constructor to provide support for exporter metric using`StableMeterProvider` type
37+
/// - Parameters:
38+
/// - endpoint: Exporter endpoint injected as dependency
39+
/// - config: Exporter configuration including type of exporter
40+
/// - meterProvider: Injected `StableMeterProvider` for metric
41+
/// - aggregationTemporalitySelector: aggregator
42+
/// - defaultAggregationSelector: default aggregator
43+
/// - useSession: Overridden `URLSession` if any
44+
/// - envVarHeaders: Extra header key-values
45+
convenience public init(
46+
endpoint: URL,
47+
config: OtlpConfiguration = OtlpConfiguration(),
48+
meterProvider: StableMeterProvider,
49+
aggregationTemporalitySelector: AggregationTemporalitySelector = AggregationTemporality.alwaysCumulative(),
50+
defaultAggregationSelector: DefaultAggregationSelector = AggregationSelector.instance,
51+
useSession: URLSession? = nil,
52+
envVarHeaders: [(String, String)]? = EnvVarHeaders.attributes) {
53+
self.init(
54+
endpoint: endpoint,
55+
config: config,
56+
aggregationTemporalitySelector: aggregationTemporalitySelector,
57+
defaultAggregationSelector: defaultAggregationSelector,
58+
useSession: useSession,
59+
envVarHeaders: envVarHeaders
60+
)
61+
self.exporterMetrics = ExporterMetrics(
62+
type: "otlp",
63+
meterProvider: meterProvider,
64+
exporterName: "metric",
65+
transportName: config.exportAsJson ?
66+
ExporterMetrics.TransporterType.httpJson :
67+
ExporterMetrics.TransporterType.grpc
68+
)
69+
}
3470

3571
// MARK: - StableMetricsExporter
3672

@@ -44,14 +80,16 @@ public class StableOtlpHTTPMetricExporter: StableOtlpHTTPExporterBase, StableMet
4480
let body = Opentelemetry_Proto_Collector_Metrics_V1_ExportMetricsServiceRequest.with {
4581
$0.resourceMetrics = MetricsAdapter.toProtoResourceMetrics(stableMetricData: sendingMetrics)
4682
}
47-
83+
self.exporterMetrics?.addSeen(value: sendingMetrics.count)
4884
var request = createRequest(body: body, endpoint: endpoint)
4985
request.timeoutInterval = min(TimeInterval.greatestFiniteMagnitude, config.timeout)
5086
httpClient.send(request: request) { [weak self] result in
5187
switch result {
5288
case .success(_):
89+
self?.exporterMetrics?.addSuccess(value: sendingMetrics.count)
5390
break
5491
case .failure(let error):
92+
self?.exporterMetrics?.addFailed(value: sendingMetrics.count)
5593
self?.exporterLock.withLockVoid {
5694
self?.pendingMetrics.append(contentsOf: sendingMetrics)
5795
}
@@ -75,11 +113,13 @@ public class StableOtlpHTTPMetricExporter: StableOtlpHTTPExporterBase, StableMet
75113
let semaphore = DispatchSemaphore(value: 0)
76114
var request = createRequest(body: body, endpoint: endpoint)
77115
request.timeoutInterval = min(TimeInterval.greatestFiniteMagnitude, config.timeout)
78-
httpClient.send(request: request) { result in
116+
httpClient.send(request: request) { [weak self] result in
79117
switch result {
80118
case .success(_):
119+
self?.exporterMetrics?.addSuccess(value: pendingMetrics.count)
81120
break
82121
case .failure(let error):
122+
self?.exporterMetrics?.addFailed(value: pendingMetrics.count)
83123
print(error)
84124
exporterResult = .failure
85125
}

0 commit comments

Comments
 (0)