Skip to content

Commit

Permalink
Gauge implements MeterHandler (#97)
Browse files Browse the repository at this point in the history
  • Loading branch information
fabianfett authored Sep 19, 2023
1 parent 0113c68 commit 77465d7
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 0 deletions.
10 changes: 10 additions & 0 deletions Sources/Prometheus/Gauge.swift
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,16 @@ extension Gauge: CoreMetrics.RecorderHandler {
}
}

extension Gauge: CoreMetrics.MeterHandler {
public func set(_ value: Double) {
self.set(to: value)
}

public func set(_ value: Int64) {
self.set(to: Double(value))
}
}

extension Gauge: PrometheusMetric {
func emit(into buffer: inout [UInt8]) {
let value = Double(bitPattern: self.atomic.load(ordering: .relaxed))
Expand Down
11 changes: 11 additions & 0 deletions Sources/Prometheus/PrometheusMetricsFactory.swift
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@ extension PrometheusMetricsFactory: CoreMetrics.MetricsFactory {
}
}

public func makeMeter(label: String, dimensions: [(String, String)]) -> CoreMetrics.MeterHandler {
return self.client.makeGauge(name: label, labels: dimensions)
}

public func makeTimer(label: String, dimensions: [(String, String)]) -> CoreMetrics.TimerHandler {
let (label, dimensions) = self.labelAndDimensionSanitizer(label, dimensions)
let buckets = self.timeHistogramBuckets[label] ?? self.defaultTimeHistogramBuckets
Expand Down Expand Up @@ -128,6 +132,13 @@ extension PrometheusMetricsFactory: CoreMetrics.MetricsFactory {
}
}

public func destroyMeter(_ handler: CoreMetrics.MeterHandler) {
guard let gauge = handler as? Gauge else {
return
}
self.client.destroyGauge(gauge)
}

public func destroyTimer(_ handler: CoreMetrics.TimerHandler) {
guard let histogram = handler as? Histogram<Duration> else {
return
Expand Down
52 changes: 52 additions & 0 deletions Tests/PrometheusTests/PrometheusMetricsFactoryTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -68,4 +68,56 @@ final class PrometheusMetricsFactoryTests: XCTestCase {
"""
)
}

func testMakeMeters() {
let client = PrometheusCollectorRegistry()
let factory = PrometheusMetricsFactory(client: client)

let maybeGauge = factory.makeMeter(label: "foo", dimensions: [("bar", "baz")])
XCTAssertNotNil(maybeGauge as? Gauge)

maybeGauge.increment(by: 1)
maybeGauge.decrement(by: 7)

var buffer = [UInt8]()
client.emit(into: &buffer)
XCTAssertEqual(String(decoding: buffer, as: Unicode.UTF8.self), """
# TYPE foo gauge
foo{bar="baz"} -6.0
"""
)

// set to double value
maybeGauge.set(12.45)
buffer.removeAll(keepingCapacity: true)
client.emit(into: &buffer)
XCTAssertEqual(String(decoding: buffer, as: Unicode.UTF8.self), """
# TYPE foo gauge
foo{bar="baz"} 12.45
"""
)

// set to int value
maybeGauge.set(Int64(42)) // needs explicit cast... otherwise ambigious
buffer.removeAll(keepingCapacity: true)
client.emit(into: &buffer)
XCTAssertEqual(String(decoding: buffer, as: Unicode.UTF8.self), """
# TYPE foo gauge
foo{bar="baz"} 42.0
"""
)

factory.destroyMeter(maybeGauge)
buffer.removeAll(keepingCapacity: true)
client.emit(into: &buffer)
XCTAssertEqual(String(decoding: buffer, as: Unicode.UTF8.self), """
# TYPE foo gauge
"""
)
}

}

0 comments on commit 77465d7

Please sign in to comment.