Skip to content

Commit 6c1c95a

Browse files
committed
Refactored metric APIs
- Made MeterSdkProvider init mimic the TraceProvider init I decided to change the MetricSdkProvider.init method to take shared state objects as parameters, since this is how the TraceProvider operates. Alternatively, I could have move the default values into the MeterSharedState construction, but that would require making the NoopMetricProcessor & NoopMetricExporter public, which I'm not against, but seemed intentionally private. - replaced MeterRegisteryKey with InstrumentationLibraryInfo - Injected Resource into the MetricSdk stack I followed the same pattern as with the Trace Sdk.
1 parent 1afde3f commit 6c1c95a

File tree

13 files changed

+77
-73
lines changed

13 files changed

+77
-73
lines changed

Examples/Datadog Sample/main.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,7 @@ func childSpan() {
8181
func testMetrics() {
8282
let processor = UngroupedBatcher()
8383

84-
let state = MeterSharedState(metricProcessor: processor, metricExporter: datadogExporter, metricPushInterval: 0.1)
85-
let meterProvider = MeterSdkProvider(meterSharedState: state)
84+
let meterProvider = MeterSdkProvider(metricProcessor: processor, metricExporter: datadogExporter, metricPushInterval: 0.1)
8685

8786
let meter = meterProvider.get(instrumentationName: "MyMeter")
8887

Examples/Prometheus Sample/main.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ DispatchQueue.global(qos: .default).async {
3434

3535
let processor = UngroupedBatcher()
3636

37-
let state = MeterSharedState(metricProcessor: processor, metricExporter: promExporter, metricPushInterval: 0.1)
38-
let meterProvider = MeterSdkProvider(meterSharedState: state)
37+
38+
let meterProvider = MeterSdkProvider(metricProcessor: processor, metricExporter: promExporter, metricPushInterval: 0.1)
3939

4040
var meter = meterProvider.get(instrumentationName: "MyMeter")
4141

Sources/OpenTelemetrySdk/Metrics/Configuration/MeterSdkProvider.swift

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,41 +18,40 @@ import OpenTelemetryApi
1818

1919
public class MeterSdkProvider: MeterProvider {
2020
private let lock = Lock()
21-
private let defaultPushInterval: TimeInterval = 60
21+
static public let defaultPushInterval: TimeInterval = 60
2222

23-
var meterRegistry = [MeterRegistryKey: MeterSdk]()
23+
var meterRegistry = [InstrumentationLibraryInfo: MeterSdk]()
2424

25-
let metricProcessor: MetricProcessor
26-
let metricExporter: MetricExporter
25+
var meterSharedState : MeterSharedState
2726
var pushMetricController: PushMetricController!
2827
var defaultMeter: MeterSdk
2928

3029
public convenience init() {
31-
self.init(meterSharedState: MeterSharedState())
30+
self.init(metricProcessor: NoopMetricProcessor(),
31+
metricExporter: NoopMetricExporter())
3232
}
33+
34+
public init(metricProcessor: MetricProcessor,
35+
metricExporter: MetricExporter,
36+
metricPushInterval: TimeInterval = MeterSdkProvider.defaultPushInterval,
37+
resource: Resource = EnvVarResource.resource) {
38+
self.meterSharedState = MeterSharedState(metricProcessor: metricProcessor,
39+
metricExporter: metricExporter,
40+
metricPushInterval: metricPushInterval,
41+
resource: resource)
3342

34-
public init(meterSharedState: MeterSharedState) {
35-
metricProcessor = meterSharedState.metricProcessor ?? NoopMetricProcessor()
36-
metricExporter = meterSharedState.metricExporter ?? NoopMetricExporter()
43+
defaultMeter = MeterSdk(meterSharedState: self.meterSharedState, instrumentationLibraryInfo: InstrumentationLibraryInfo())
3744

38-
defaultMeter = MeterSdk(meterName: "", metricProcessor: metricProcessor)
39-
40-
let defaultPushInterval = self.defaultPushInterval
4145
pushMetricController = PushMetricController(
4246
meterProvider: self,
4347
metricProcessor: metricProcessor,
4448
metricExporter: metricExporter,
45-
pushInterval: meterSharedState.metricPushInterval ?? defaultPushInterval) {
49+
pushInterval: meterSharedState.metricPushInterval) {
4650
false
4751
}
4852
}
4953

50-
public static func create(configure: (MeterSharedState) -> Void) -> MeterSdkProvider {
51-
let builder = MeterSharedState()
52-
configure(builder)
5354

54-
return MeterSdkProvider(meterSharedState: builder)
55-
}
5655

5756
public func get(instrumentationName: String, instrumentationVersion: String? = nil) -> Meter {
5857
if instrumentationName.isEmpty {
@@ -63,16 +62,16 @@ public class MeterSdkProvider: MeterProvider {
6362
defer {
6463
lock.unlock()
6564
}
66-
let key = MeterRegistryKey(name: instrumentationName, version: instrumentationVersion)
67-
var meter: MeterSdk! = meterRegistry[key]
65+
let instrumentationLibraryInfo = InstrumentationLibraryInfo(name: instrumentationName, version: instrumentationVersion)
66+
var meter: MeterSdk! = meterRegistry[instrumentationLibraryInfo]
6867
if meter == nil {
69-
meter = MeterSdk(meterName: instrumentationName, metricProcessor: metricProcessor)
70-
meterRegistry[key] = meter!
68+
meter = MeterSdk(meterSharedState: self.meterSharedState, instrumentationLibraryInfo: instrumentationLibraryInfo)
69+
meterRegistry[instrumentationLibraryInfo] = meter!
7170
}
7271
return meter!
7372
}
7473

75-
func getMeters() -> [MeterRegistryKey: MeterSdk] {
74+
func getMeters() -> [InstrumentationLibraryInfo: MeterSdk] {
7675
lock.lock()
7776
defer {
7877
lock.unlock()
@@ -88,8 +87,3 @@ public class MeterSdkProvider: MeterProvider {
8887
return labels
8988
}
9089
}
91-
92-
struct MeterRegistryKey: Hashable {
93-
var name: String
94-
var version: String?
95-
}

Sources/OpenTelemetrySdk/Metrics/Configuration/MeterSharedState.swift

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,20 @@ import Foundation
1717

1818
public struct MeterSharedState {
1919
/// Configures metric processor. (aka batcher).
20-
public private(set) var metricProcessor: MetricProcessor?
20+
public private(set) var metricProcessor: MetricProcessor
2121
/// Configures Metric Exporter.
22-
public private(set) var metricExporter: MetricExporter?
22+
public private(set) var metricExporter: MetricExporter
2323
/// Sets the push interval.
24-
public private(set) var metricPushInterval: TimeInterval?
24+
public private(set) var metricPushInterval: TimeInterval
25+
public private(set) var resource: Resource
2526

26-
public init(metricProcessor: MetricProcessor? = nil, metricExporter: MetricExporter? = nil, metricPushInterval: TimeInterval? = nil) {
27+
public init(metricProcessor: MetricProcessor,
28+
metricExporter: MetricExporter,
29+
metricPushInterval: TimeInterval ,
30+
resource: Resource) {
2731
self.metricProcessor = metricProcessor
2832
self.metricExporter = metricExporter
2933
self.metricPushInterval = metricPushInterval
34+
self.resource = resource
3035
}
3136
}

Sources/OpenTelemetrySdk/Metrics/Export/Metric.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,17 @@ import Foundation
1717

1818
public struct Metric {
1919
public private(set) var namespace: String
20+
public private(set) var resource: Resource
2021
public private(set) var name: String
2122
public private(set) var description: String
2223
public private(set) var aggregationType: AggregationType
2324
public internal(set) var data = [MetricData]()
2425

25-
init(namespace: String, name: String, desc: String, type: AggregationType) {
26+
init(namespace: String, name: String, desc: String, type: AggregationType, resource: Resource) {
2627
self.namespace = namespace
2728
self.name = name
2829
description = desc
2930
aggregationType = type
31+
self.resource = resource
3032
}
3133
}

Sources/OpenTelemetrySdk/Metrics/Export/MetricProcessor.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,20 @@
1515

1616
import Foundation
1717

18-
public protocol MetricProcessor: AnyObject {
18+
public protocol MetricProcessor {
1919
/// Finish the current collection cycle and return the metrics it holds.
2020
/// This is called at the end of one collection cycle by the Controller.
2121
/// MetricProcessor can use this to clear its Metrics (in case of stateless).
2222
/// - Returns: The list of metrics from this cycle, which are to be exported.
2323
func finishCollectionCycle() -> [Metric]
2424

2525
/// Process the metric. This method is called once every collection interval.
26-
/// - PArameters:
26+
/// - Parameters:
2727
/// - metric: the metric record.
2828
func process(metric: Metric)
2929
}
3030

31-
class NoopMetricProcessor: MetricProcessor {
31+
struct NoopMetricProcessor: MetricProcessor {
3232
func finishCollectionCycle() -> [Metric] {
3333
return [Metric]()
3434
}

Sources/OpenTelemetrySdk/Metrics/MeterSdk.swift

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class MeterSdk: Meter {
2020
fileprivate let collectLock = Lock()
2121
let meterName: String
2222
var metricProcessor: MetricProcessor
23+
var resource: Resource
2324

2425
var intCounters = [String: CounterMetricSdk<Int>]()
2526
var doubleCounters = [String: CounterMetricSdk<Double>]()
@@ -28,9 +29,10 @@ class MeterSdk: Meter {
2829
var intObservers = [String: IntObserverMetricSdk]()
2930
var doubleObservers = [String: DoubleObserverMetricSdk]()
3031

31-
init(meterName: String, metricProcessor: MetricProcessor) {
32-
self.meterName = meterName
33-
self.metricProcessor = metricProcessor
32+
init(meterSharedState: MeterSharedState, instrumentationLibraryInfo: InstrumentationLibraryInfo) {
33+
self.meterName = instrumentationLibraryInfo.name
34+
self.resource = meterSharedState.resource
35+
self.metricProcessor = meterSharedState.metricProcessor
3436
}
3537

3638
func getLabelSet(labels: [String: String]) -> LabelSet {
@@ -45,7 +47,7 @@ class MeterSdk: Meter {
4547
let metricName = counter.key
4648
let counterInstrument = counter.value
4749

48-
var metric = Metric(namespace: meterName, name: metricName, desc: meterName + metricName, type: AggregationType.intSum)
50+
var metric = Metric(namespace: meterName, name: metricName, desc: meterName + metricName, type: AggregationType.intSum, resource: resource)
4951

5052
counterInstrument.boundInstruments.forEach { boundInstrument in
5153
let labelSet = boundInstrument.key
@@ -80,7 +82,7 @@ class MeterSdk: Meter {
8082
let metricName = counter.key
8183
let counterInstrument = counter.value
8284

83-
var metric = Metric(namespace: meterName, name: metricName, desc: meterName + metricName, type: AggregationType.doubleSum)
85+
var metric = Metric(namespace: meterName, name: metricName, desc: meterName + metricName, type: AggregationType.doubleSum, resource: resource)
8486

8587
counterInstrument.boundInstruments.forEach { boundInstrument in
8688
let labelSet = boundInstrument.key
@@ -115,7 +117,7 @@ class MeterSdk: Meter {
115117
intMeasures.forEach { measure in
116118
let metricName = measure.key
117119
let measureInstrument = measure.value
118-
var metric = Metric(namespace: meterName, name: metricName, desc: meterName + metricName, type: AggregationType.intSummary)
120+
var metric = Metric(namespace: meterName, name: metricName, desc: meterName + metricName, type: AggregationType.intSummary, resource:resource)
119121
measureInstrument.boundInstruments.forEach { boundInstrument in
120122
let labelSet = boundInstrument.key
121123
let aggregator = boundInstrument.value.getAggregator()
@@ -130,7 +132,7 @@ class MeterSdk: Meter {
130132
doubleMeasures.forEach { measure in
131133
let metricName = measure.key
132134
let measureInstrument = measure.value
133-
var metric = Metric(namespace: meterName, name: metricName, desc: meterName + metricName, type: AggregationType.doubleSummary)
135+
var metric = Metric(namespace: meterName, name: metricName, desc: meterName + metricName, type: AggregationType.doubleSummary, resource: resource)
134136
measureInstrument.boundInstruments.forEach { boundInstrument in
135137
let labelSet = boundInstrument.key
136138
let aggregator = boundInstrument.value.getAggregator()
@@ -145,7 +147,7 @@ class MeterSdk: Meter {
145147
intObservers.forEach { observer in
146148
let metricName = observer.key
147149
let observerInstrument = observer.value
148-
var metric = Metric(namespace: meterName, name: metricName, desc: meterName + metricName, type: AggregationType.intSum)
150+
var metric = Metric(namespace: meterName, name: metricName, desc: meterName + metricName, type: AggregationType.intSum, resource: resource)
149151
observerInstrument.invokeCallback()
150152

151153
observerInstrument.observerHandles.forEach { handle in
@@ -162,7 +164,7 @@ class MeterSdk: Meter {
162164
doubleObservers.forEach { observer in
163165
let metricName = observer.key
164166
let observerInstrument = observer.value
165-
var metric = Metric(namespace: meterName, name: metricName, desc: meterName + metricName, type: AggregationType.doubleSum)
167+
var metric = Metric(namespace: meterName, name: metricName, desc: meterName + metricName, type: AggregationType.doubleSum, resource: resource)
166168
observerInstrument.invokeCallback()
167169

168170
observerInstrument.observerHandles.forEach { handle in

Tests/ExportersTests/DatadogExporter/DatadogExporterTests.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,10 @@ class DatadogExporterTests: XCTestCase {
130130

131131
let datadogExporter = try! DatadogExporter(config: exporterConfiguration)
132132

133-
let state = MeterSharedState(metricProcessor: UngroupedBatcher(), metricExporter: datadogExporter, metricPushInterval: 0.1)
134-
let meter = MeterSdkProvider(meterSharedState: state).get(instrumentationName: "MyMeter")
133+
134+
let meter = MeterSdkProvider(metricProcessor: UngroupedBatcher(),
135+
metricExporter: datadogExporter,
136+
metricPushInterval: 0.1).get(instrumentationName: "MyMeter")
135137

136138
let testCounter = meter.createIntCounter(name: "MyCounter")
137139

Tests/ExportersTests/Prometheus/PrometheusExporterTests.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,8 @@ class PrometheusExporterTests: XCTestCase {
7070
}
7171

7272
private func collectMetrics(simpleProcessor: UngroupedBatcher, exporter: MetricExporter) {
73-
let state = MeterSharedState(metricProcessor: simpleProcessor, metricExporter: exporter, metricPushInterval: metricPushIntervalSec)
7473

75-
let meterProvider = MeterSdkProvider(meterSharedState: state)
74+
let meterProvider = MeterSdkProvider(metricProcessor: simpleProcessor, metricExporter: exporter, metricPushInterval: metricPushIntervalSec)
7675

7776
let meter = meterProvider.get(instrumentationName: "library1")
7877

Tests/OpenTelemetrySdkTests/Metrics/CounterTests.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ final class CounterTests: XCTestCase {
2121
public func testIntCounterBoundInstrumentsStatusUpdatedCorrectlySingleThread() {
2222
let testProcessor = TestMetricProcessor()
2323

24-
let meterSharedState = MeterSharedState(metricProcessor: testProcessor)
25-
let meter = MeterSdkProvider(meterSharedState: meterSharedState).get(instrumentationName: "library1") as! MeterSdk
24+
let meter = MeterSdkProvider(metricProcessor: testProcessor, metricExporter: NoopMetricExporter()).get(instrumentationName: "library1") as! MeterSdk
2625
let testCounter = meter.createIntCounter(name: "testCounter").internalCounter as! CounterMetricSdk<Int>
2726

2827
let labels1 = ["dim1": "value1"]
@@ -82,8 +81,7 @@ final class CounterTests: XCTestCase {
8281

8382
public func testDoubleCounterBoundInstrumentsStatusUpdatedCorrectlySingleThread() {
8483
let testProcessor = TestMetricProcessor()
85-
let meterSharedState = MeterSharedState(metricProcessor: testProcessor)
86-
let meter = MeterSdkProvider(meterSharedState: meterSharedState).get(instrumentationName: "library1") as! MeterSdk
84+
let meter = MeterSdkProvider(metricProcessor: testProcessor, metricExporter: NoopMetricExporter()).get(instrumentationName: "library1") as! MeterSdk
8785
let testCounter = meter.createDoubleCounter(name: "testCounter").internalCounter as! CounterMetricSdk<Double>
8886

8987
let labels1 = ["dim1": "value1"]
@@ -143,8 +141,7 @@ final class CounterTests: XCTestCase {
143141

144142
public func testIntCounterBoundInstrumentsStatusUpdatedCorrectlyMultiThread() {
145143
let testProcessor = TestMetricProcessor()
146-
let meterSharedState = MeterSharedState(metricProcessor: testProcessor)
147-
let meter = MeterSdkProvider(meterSharedState: meterSharedState).get(instrumentationName: "library1") as! MeterSdk
144+
let meter = MeterSdkProvider(metricProcessor: testProcessor, metricExporter: NoopMetricExporter()).get(instrumentationName: "library1") as! MeterSdk
148145
let testCounter = meter.createIntCounter(name: "testCounter").internalCounter as! CounterMetricSdk<Int>
149146

150147
let labels1 = ["dim1": "value1"]

0 commit comments

Comments
 (0)