Skip to content

Commit f1b1b39

Browse files
authored
Remove old metrics and replace with StableMetrics (#809)
* added associcated types to ensure concrete type returns for protocols * resolved issue with different type returns in StableMeterProviderSdk.meterBuilder() method Resolved this by added a NoopStableMeterProviderBuilder that resolves to a StableMeterProviderBuilder once a reader is added. * Removed old metrics & updated instrumentation to use Stable Metrics * refactored point data to encode/decode correctly for persistent decorator * applied formatting * added gauge to prometheus exporter, removed tests for legacy 'summary' * added tests and fixes for point data codable * reformat * fixed exporter example * updated otlp http exporter example * fixed default endpoint reference in example * updated prometheus test * fixed test * removed extra commas * updated prometheus test to account for random attribute ordering
1 parent c157b3c commit f1b1b39

File tree

270 files changed

+1414
-6267
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

270 files changed

+1414
-6267
lines changed

Examples/Network Sample/main.swift

Lines changed: 32 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,9 @@ class SessionDelegate: NSObject, URLSessionDataDelegate, URLSessionTaskDelegate
3434
semaphore.signal()
3535
}
3636

37-
func urlSession(
38-
_ session: URLSession,
39-
task: URLSessionTask,
40-
didFinishCollecting metrics: URLSessionTaskMetrics
41-
) {
37+
func urlSession(_ session: URLSession,
38+
task: URLSessionTask,
39+
didFinishCollecting metrics: URLSessionTaskMetrics) {
4240
semaphore.signal()
4341
callCount += 1
4442
print("delegate called")
@@ -53,7 +51,7 @@ enum TimeoutError: Error {
5351

5452
func waitForSemaphore(withTimeoutSecs: Int) async {
5553
do {
56-
let _ = try await withThrowingTaskGroup(of: Bool.self) { group in
54+
_ = try await withThrowingTaskGroup(of: Bool.self) { group in
5755
group.addTask {
5856
try await Task.sleep(nanoseconds: UInt64(withTimeoutSecs) * NSEC_PER_SEC)
5957
throw TimeoutError.timeout
@@ -68,7 +66,7 @@ func waitForSemaphore(withTimeoutSecs: Int) async {
6866
try Task.checkCancellation()
6967
return true
7068
}
71-
69+
7270
return try await group.next()!
7371
}
7472
} catch {
@@ -90,34 +88,34 @@ func simpleNetworkCallWithDelegate() {
9088

9189
@available(macOS 10.15, iOS 15.0, watchOS 8.0, tvOS 15.0, *)
9290
func asyncNetworkCallWithTaskDelegate() async {
93-
let session = URLSession(configuration: .default)
91+
let session = URLSession(configuration: .default)
9492

95-
let url = URL(string: "http://httpbin.org/get")!
96-
let request = URLRequest(url: url)
93+
let url = URL(string: "http://httpbin.org/get")!
94+
let request = URLRequest(url: url)
9795

98-
do {
99-
_ = try await session.data(for: request, delegate: delegate)
100-
} catch {
101-
return
102-
}
96+
do {
97+
_ = try await session.data(for: request, delegate: delegate)
98+
} catch {
99+
return
100+
}
103101

104-
await waitForSemaphore(withTimeoutSecs: 3)
102+
await waitForSemaphore(withTimeoutSecs: 3)
105103
}
106104

107105
@available(macOS 10.15, iOS 15.0, tvOS 13.0, *)
108106
func asyncNetworkCallWithSessionDelegate() async {
109-
let session = URLSession(configuration: .default, delegate: delegate, delegateQueue: nil)
107+
let session = URLSession(configuration: .default, delegate: delegate, delegateQueue: nil)
110108

111-
let url = URL(string: "http://httpbin.org/get")!
112-
let request = URLRequest(url: url)
109+
let url = URL(string: "http://httpbin.org/get")!
110+
let request = URLRequest(url: url)
113111

114-
do {
115-
_ = try await session.data(for: request)
116-
} catch {
117-
return
118-
}
112+
do {
113+
_ = try await session.data(for: request)
114+
} catch {
115+
return
116+
}
119117

120-
await waitForSemaphore(withTimeoutSecs: 3)
118+
await waitForSemaphore(withTimeoutSecs: 3)
121119
}
122120

123121
let spanProcessor = SimpleSpanProcessor(spanExporter: StdoutSpanExporter(isDebug: true))
@@ -135,15 +133,15 @@ simpleNetworkCallWithDelegate()
135133
assert(delegate.callCount == callCount + 1)
136134

137135
if #available(macOS 10.15, iOS 15.0, watchOS 8.0, tvOS 15.0, *) {
138-
print("making simple call with task delegate")
139-
callCount = delegate.callCount
140-
await asyncNetworkCallWithTaskDelegate()
141-
assert(delegate.callCount == callCount + 1, "async task delegate not called")
142-
143-
print("making simple call with session delegate")
144-
callCount = delegate.callCount
145-
await asyncNetworkCallWithSessionDelegate()
146-
assert(delegate.callCount == callCount + 1, "async session delegate not called")
136+
print("making simple call with task delegate")
137+
callCount = delegate.callCount
138+
await asyncNetworkCallWithTaskDelegate()
139+
assert(delegate.callCount == callCount + 1, "async task delegate not called")
140+
141+
print("making simple call with session delegate")
142+
callCount = delegate.callCount
143+
await asyncNetworkCallWithSessionDelegate()
144+
assert(delegate.callCount == callCount + 1, "async session delegate not called")
147145
}
148146

149147
sleep(1)

Examples/OTLP Exporter/main.swift

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -82,34 +82,41 @@
8282
createSpans()
8383

8484
// Metrics
85-
let otlpMetricExporter = OtlpMetricExporter(channel: client)
86-
let processor = MetricProcessorSdk()
87-
let meterProvider = MeterProviderSdk(metricProcessor: processor, metricExporter: otlpMetricExporter, metricPushInterval: 0.1)
85+
let otlpMetricExporter = StableOtlpMetricExporter(channel: client)
86+
let meterProvider = StableMeterProviderSdk.builder()
87+
.registerMetricReader(
88+
reader: StablePeriodicMetricReaderBuilder(
89+
exporter: otlpMetricExporter).setInterval(timeInterval: 60)
90+
.build()
91+
)
92+
.registerView(
93+
selector: InstrumentSelector.builder().setInstrument(name: ".*").build(),
94+
view: StableView.builder().build()
95+
)
96+
.build()
97+
98+
OpenTelemetry.registerStableMeterProvider(meterProvider: meterProvider)
8899

89-
OpenTelemetry.registerMeterProvider(meterProvider: meterProvider)
100+
let labels1 = ["dim1": AttributeValue.string("value1")]
90101

91-
let labels1 = ["dim1": "value1"]
102+
var meter = meterProvider.get(name: "otlp_example_meter'")
92103

93-
var meter = meterProvider.get(instrumentationName: "otlp_example_meter'")
94-
var exampleCounter = meter.createIntCounter(name: "otlp_example_counter")
95-
var exampleMeasure = meter.createIntMeasure(name: "otlp_example_measure")
96-
var exampleObserver = meter.createIntObserver(name: "otlp_example_observation") { observer in
104+
var exampleCounter = meter.counterBuilder(name: "otlp_example_counter").build()
105+
var exampleObserver = meter.gaugeBuilder(
106+
name: "otlp_example_observation"
107+
).buildWithCallback { observer in
97108
var taskInfo = mach_task_basic_info()
98109
var count = mach_msg_type_number_t(MemoryLayout<mach_task_basic_info>.size) / 4
99110
let _: kern_return_t = withUnsafeMutablePointer(to: &taskInfo) {
100111
$0.withMemoryRebound(to: integer_t.self, capacity: 1) {
101112
task_info(mach_task_self_, task_flavor_t(MACH_TASK_BASIC_INFO), $0, &count)
102113
}
103114
}
104-
observer.observe(value: Int(taskInfo.resident_size), labels: labels1)
115+
observer.record(value: Int(taskInfo.resident_size), attributes: labels1)
105116
}
106117

107118
for _ in 1 ... 3000 {
108-
exampleCounter.add(value: 1, labelset: meter.getLabelSet(labels: labels1))
109-
exampleMeasure.record(value: 100, labelset: meter.getLabelSet(labels: labels1))
110-
exampleMeasure.record(value: 500, labelset: meter.getLabelSet(labels: labels1))
111-
exampleMeasure.record(value: 5, labelset: meter.getLabelSet(labels: labels1))
112-
exampleMeasure.record(value: 750, labelset: meter.getLabelSet(labels: labels1))
119+
exampleCounter.add(value: 1, attributes: labels1)
113120
sleep(1)
114121
}
115122

Examples/OTLP HTTP Exporter/main.swift

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -74,36 +74,42 @@
7474
// Create a Parent span (Main) and do some Work (child Spans). Repeat for another Span.
7575
createSpans()
7676

77-
// Metrics
78-
let otlpHttpMetricExporter = OtlpHttpMetricExporter()
79-
let processor = MetricProcessorSdk()
80-
let meterProvider = MeterProviderSdk(metricProcessor: processor, metricExporter: otlpHttpMetricExporter, metricPushInterval: 0.1)
81-
82-
OpenTelemetry.registerMeterProvider(meterProvider: meterProvider)
83-
84-
var meter = meterProvider.get(instrumentationName: "otlp_example_meter'")
85-
var exampleCounter = meter.createIntCounter(name: "otlp_example_counter")
86-
var exampleMeasure = meter.createIntMeasure(name: "otlp_example_measure")
87-
var exampleObserver = meter.createIntObserver(name: "otlp_example_observation") { observer in
88-
var taskInfo = mach_task_basic_info()
89-
var count = mach_msg_type_number_t(MemoryLayout<mach_task_basic_info>.size) / 4
90-
let _: kern_return_t = withUnsafeMutablePointer(to: &taskInfo) {
91-
$0.withMemoryRebound(to: integer_t.self, capacity: 1) {
92-
task_info(mach_task_self_, task_flavor_t(MACH_TASK_BASIC_INFO), $0, &count)
93-
}
94-
}
95-
labels1 = ["dim1": "value1"]
96-
observer.observe(value: Int(taskInfo.resident_size), labels: labels1)
97-
}
77+
// Metrics
78+
let otlpMetricExporter = StableOtlpHTTPMetricExporter(endpoint: defaultStableOtlpHTTPMetricsEndpoint())
79+
let meterProvider = StableMeterProviderSdk.builder()
80+
.registerMetricReader(
81+
reader: StablePeriodicMetricReaderBuilder(
82+
exporter: otlpMetricExporter).setInterval(timeInterval: 60)
83+
.build()
84+
)
85+
.registerView(
86+
selector: InstrumentSelector.builder().setInstrument(name: ".*").build(),
87+
view: StableView.builder().build()
88+
)
89+
.build()
9890

99-
var labels1 = ["dim1": "value1"]
100-
for _ in 1 ... 3000 {
101-
exampleCounter.add(value: 1, labelset: meter.getLabelSet(labels: labels1))
102-
exampleMeasure.record(value: 100, labelset: meter.getLabelSet(labels: labels1))
103-
exampleMeasure.record(value: 500, labelset: meter.getLabelSet(labels: labels1))
104-
exampleMeasure.record(value: 5, labelset: meter.getLabelSet(labels: labels1))
105-
exampleMeasure.record(value: 750, labelset: meter.getLabelSet(labels: labels1))
106-
sleep(1)
91+
OpenTelemetry.registerStableMeterProvider(meterProvider: meterProvider)
92+
93+
let labels1 = ["dim1": AttributeValue.string("value1")]
94+
95+
var meter = meterProvider.get(name: "otlp_example_meter'")
96+
97+
var exampleCounter = meter.counterBuilder(name: "otlp_example_counter").build()
98+
var exampleObserver = meter.gaugeBuilder(
99+
name: "otlp_example_observation"
100+
).buildWithCallback { observer in
101+
var taskInfo = mach_task_basic_info()
102+
var count = mach_msg_type_number_t(MemoryLayout<mach_task_basic_info>.size) / 4
103+
let _: kern_return_t = withUnsafeMutablePointer(to: &taskInfo) {
104+
$0.withMemoryRebound(to: integer_t.self, capacity: 1) {
105+
task_info(mach_task_self_, task_flavor_t(MACH_TASK_BASIC_INFO), $0, &count)
106+
}
107107
}
108+
observer.record(value: Int(taskInfo.resident_size), attributes: labels1)
109+
}
108110

111+
for _ in 1 ... 3000 {
112+
exampleCounter.add(value: 1, attributes: labels1)
113+
sleep(1)
114+
}
109115
#endif

Examples/Prometheus Sample/main.swift

Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -28,46 +28,57 @@ DispatchQueue.global(qos: .default).async {
2828
}
2929
}
3030

31-
let processor = MetricProcessorSdk()
32-
33-
let meterProvider = MeterProviderSdk(metricProcessor: processor, metricExporter: promExporter, metricPushInterval: 0.1)
34-
OpenTelemetry.registerMeterProvider(meterProvider: meterProvider)
35-
36-
var meter = meterProvider.get(instrumentationName: "MyMeter")
37-
38-
var testCounter = meter.createIntCounter(name: "MyCounter")
39-
var testMeasure = meter.createIntMeasure(name: "MyMeasure")
40-
41-
let boundaries: [Int] = [5, 10, 25]
42-
var testHistogram = meter.createIntHistogram(name: "MyHistogram", explicitBoundaries: boundaries, absolute: true)
43-
44-
var testObserver = meter.createIntObserver(name: "MyObservation") { observer in
31+
let meterProvider = StableMeterProviderSdk.builder()
32+
.registerView(
33+
selector: InstrumentSelector
34+
.builder()
35+
.setInstrument(type: .histogram).build(),
36+
view: StableView.builder()
37+
.withAggregation(
38+
aggregation: ExplicitBucketHistogramAggregation(bucketBoundaries: [5, 10, 25])
39+
).build()
40+
)
41+
.registerMetricReader(
42+
reader: StablePeriodicMetricReaderBuilder(exporter: promExporter).build(
43+
)).build()
44+
45+
OpenTelemetry.registerStableMeterProvider(meterProvider: meterProvider)
46+
47+
var meter = meterProvider.get(name: "MyMeter")
48+
49+
var testCounter = meter.counterBuilder(name: "MyCounter").build()
50+
var testMeasure = meter.gaugeBuilder(name: "MyMeasure").build()
51+
52+
var testHistogram = meter.histogramBuilder(name: "MyHistogram").build()
53+
54+
var testObserver = meter.gaugeBuilder(name: "MyObservation").buildWithCallback { observer in
4555
var taskInfo = mach_task_basic_info()
4656
var count = mach_msg_type_number_t(MemoryLayout<mach_task_basic_info>.size) / 4
4757
let _: kern_return_t = withUnsafeMutablePointer(to: &taskInfo) {
4858
$0.withMemoryRebound(to: integer_t.self, capacity: 1) {
4959
task_info(mach_task_self_, task_flavor_t(MACH_TASK_BASIC_INFO), $0, &count)
5060
}
5161
}
52-
labels1 = ["dim1": "value1"]
53-
observer.observe(value: Int(taskInfo.resident_size), labels: labels1)
62+
let labels1 = ["dim1": AttributeValue.string("value1")]
63+
observer
64+
.record(value: Int(taskInfo.resident_size), attributes: labels1)
5465
}
5566

56-
var labels1 = ["dim1": "value1"]
57-
var labels2 = ["dim1": "value2"]
67+
var labels1 = ["dim1": AttributeValue.string("value1")]
68+
var labels2 = ["dim1": AttributeValue.string("value2")]
5869

5970
var counter = 0
6071
while counter < 3000 {
61-
testCounter.add(value: 100, labelset: meter.getLabelSet(labels: labels1))
72+
testCounter.add(value: 100, attributes: labels1)
6273

63-
testMeasure.record(value: 100, labelset: meter.getLabelSet(labels: labels1))
64-
testMeasure.record(value: 500, labelset: meter.getLabelSet(labels: labels1))
65-
testMeasure.record(value: 5, labelset: meter.getLabelSet(labels: labels1))
66-
testMeasure.record(value: 750, labelset: meter.getLabelSet(labels: labels1))
74+
testMeasure.record(value: 100, attributes: labels1)
75+
testMeasure.record(value: 500, attributes: labels1)
76+
testMeasure.record(value: 5, attributes: labels1)
77+
testMeasure.record(value: 750, attributes: labels1)
6778

68-
testHistogram.record(value: 8, labelset: meter.getLabelSet(labels: labels1))
69-
testHistogram.record(value: 20, labelset: meter.getLabelSet(labels: labels1))
70-
testHistogram.record(value: 30, labelset: meter.getLabelSet(labels: labels1))
79+
testHistogram.record(value: 8, attributes: labels1)
80+
testHistogram.record(value: 20, attributes: labels1)
81+
testHistogram.record(value: 30, attributes: labels1)
7182

7283
counter += 1
7384
sleep(1)

Sources/Exporters/OpenTelemetryProtocolCommon/common/CommonAdapter.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,6 @@ public enum CommonAdapter {
101101
instrumentationScope.attributes.append(CommonAdapter.toProtoAttribute(key: $0.key, attributeValue: $0.value))
102102
}
103103
}
104-
return instrumentationScope
104+
return instrumentationScope
105105
}
106106
}

Sources/Exporters/OpenTelemetryProtocolCommon/common/ExporterMetrics.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,15 +55,15 @@ public class ExporterMetrics {
5555
}
5656

5757
public func addSeen(value: Int) {
58-
seen?.add(value: value, attribute: seenAttrs)
58+
seen?.add(value: value, attributes: seenAttrs)
5959
}
6060

6161
public func addSuccess(value: Int) {
62-
exported?.add(value: value, attribute: successAttrs)
62+
exported?.add(value: value, attributes: successAttrs)
6363
}
6464

6565
public func addFailed(value: Int) {
66-
exported?.add(value: value, attribute: failedAttrs)
66+
exported?.add(value: value, attributes: failedAttrs)
6767
}
6868

6969
// MARK: - Private functions

0 commit comments

Comments
 (0)