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