Skip to content

Commit 77465d7

Browse files
authored
Gauge implements MeterHandler (#97)
1 parent 0113c68 commit 77465d7

File tree

3 files changed

+73
-0
lines changed

3 files changed

+73
-0
lines changed

Sources/Prometheus/Gauge.swift

Lines changed: 10 additions & 0 deletions
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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ extension PrometheusMetricsFactory: CoreMetrics.MetricsFactory {
9797
}
9898
}
9999

100+
public func makeMeter(label: String, dimensions: [(String, String)]) -> CoreMetrics.MeterHandler {
101+
return self.client.makeGauge(name: label, labels: dimensions)
102+
}
103+
100104
public func makeTimer(label: String, dimensions: [(String, String)]) -> CoreMetrics.TimerHandler {
101105
let (label, dimensions) = self.labelAndDimensionSanitizer(label, dimensions)
102106
let buckets = self.timeHistogramBuckets[label] ?? self.defaultTimeHistogramBuckets
@@ -128,6 +132,13 @@ extension PrometheusMetricsFactory: CoreMetrics.MetricsFactory {
128132
}
129133
}
130134

135+
public func destroyMeter(_ handler: CoreMetrics.MeterHandler) {
136+
guard let gauge = handler as? Gauge else {
137+
return
138+
}
139+
self.client.destroyGauge(gauge)
140+
}
141+
131142
public func destroyTimer(_ handler: CoreMetrics.TimerHandler) {
132143
guard let histogram = handler as? Histogram<Duration> else {
133144
return

Tests/PrometheusTests/PrometheusMetricsFactoryTests.swift

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,56 @@ final class PrometheusMetricsFactoryTests: XCTestCase {
6868
"""
6969
)
7070
}
71+
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+
71123
}

0 commit comments

Comments
 (0)