Skip to content

Commit f36234d

Browse files
committed
Merge branch 'main' into ff-use-factory-singleton
# Conflicts: # Tests/PrometheusTests/PrometheusMetricsFactoryTests.swift
2 parents a98e3a1 + 77465d7 commit f36234d

File tree

4 files changed

+72
-0
lines changed

4 files changed

+72
-0
lines changed

.spi.yaml renamed to .spi.yml

File renamed without changes.

Sources/Prometheus/Gauge.swift

+10
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,16 @@ extension Gauge: CoreMetrics.RecorderHandler {
8080
}
8181
}
8282

83+
extension Gauge: CoreMetrics.MeterHandler {
84+
public func set(_ value: Double) {
85+
self.set(to: value)
86+
}
87+
88+
public func set(_ value: Int64) {
89+
self.set(to: Double(value))
90+
}
91+
}
92+
8393
extension Gauge: PrometheusMetric {
8494
func emit(into buffer: inout [UInt8]) {
8595
let value = Double(bitPattern: self.atomic.load(ordering: .relaxed))

Sources/Prometheus/PrometheusMetricsFactory.swift

+11
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ extension PrometheusMetricsFactory: CoreMetrics.MetricsFactory {
105105
}
106106
}
107107

108+
public func makeMeter(label: String, dimensions: [(String, String)]) -> CoreMetrics.MeterHandler {
109+
return self.registry.makeGauge(name: label, labels: dimensions)
110+
}
111+
108112
public func makeTimer(label: String, dimensions: [(String, String)]) -> CoreMetrics.TimerHandler {
109113
let (label, dimensions) = self.labelAndDimensionSanitizer(label, dimensions)
110114
let buckets = self.timeHistogramBuckets[label] ?? self.defaultTimeHistogramBuckets
@@ -136,6 +140,13 @@ extension PrometheusMetricsFactory: CoreMetrics.MetricsFactory {
136140
}
137141
}
138142

143+
public func destroyMeter(_ handler: CoreMetrics.MeterHandler) {
144+
guard let gauge = handler as? Gauge else {
145+
return
146+
}
147+
self.registry.destroyGauge(gauge)
148+
}
149+
139150
public func destroyTimer(_ handler: CoreMetrics.TimerHandler) {
140151
guard let histogram = handler as? Histogram<Duration> else {
141152
return

Tests/PrometheusTests/PrometheusMetricsFactoryTests.swift

+51
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,57 @@ final class PrometheusMetricsFactoryTests: XCTestCase {
6969
)
7070
}
7171

72+
func testMakeMeters() {
73+
let client = PrometheusCollectorRegistry()
74+
let factory = PrometheusMetricsFactory(client: client)
75+
76+
let maybeGauge = factory.makeMeter(label: "foo", dimensions: [("bar", "baz")])
77+
XCTAssertNotNil(maybeGauge as? Gauge)
78+
79+
maybeGauge.increment(by: 1)
80+
maybeGauge.decrement(by: 7)
81+
82+
var buffer = [UInt8]()
83+
client.emit(into: &buffer)
84+
XCTAssertEqual(String(decoding: buffer, as: Unicode.UTF8.self), """
85+
# TYPE foo gauge
86+
foo{bar="baz"} -6.0
87+
88+
"""
89+
)
90+
91+
// set to double value
92+
maybeGauge.set(12.45)
93+
buffer.removeAll(keepingCapacity: true)
94+
client.emit(into: &buffer)
95+
XCTAssertEqual(String(decoding: buffer, as: Unicode.UTF8.self), """
96+
# TYPE foo gauge
97+
foo{bar="baz"} 12.45
98+
99+
"""
100+
)
101+
102+
// set to int value
103+
maybeGauge.set(Int64(42)) // needs explicit cast... otherwise ambigious
104+
buffer.removeAll(keepingCapacity: true)
105+
client.emit(into: &buffer)
106+
XCTAssertEqual(String(decoding: buffer, as: Unicode.UTF8.self), """
107+
# TYPE foo gauge
108+
foo{bar="baz"} 42.0
109+
110+
"""
111+
)
112+
113+
factory.destroyMeter(maybeGauge)
114+
buffer.removeAll(keepingCapacity: true)
115+
client.emit(into: &buffer)
116+
XCTAssertEqual(String(decoding: buffer, as: Unicode.UTF8.self), """
117+
# TYPE foo gauge
118+
119+
"""
120+
)
121+
}
122+
72123
func testTwoMetricFactoriesUseTheSameUnderlyingCollectorRegsitry() {
73124
let first = PrometheusMetricsFactory()
74125
let second = PrometheusMetricsFactory()

0 commit comments

Comments
 (0)