Skip to content

Commit 785478c

Browse files
Unregister the metric fully when last labelled metric is unregistered (#110)
1 parent 26ee5ff commit 785478c

File tree

3 files changed

+50
-8
lines changed

3 files changed

+50
-8
lines changed

Sources/Prometheus/PrometheusCollectorRegistry.swift

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,11 @@ public final class PrometheusCollectorRegistry: Sendable {
409409
let labelsKey = LabelsKey(counter.labels)
410410
guard dimensions[labelsKey] === counter else { return }
411411
dimensions.removeValue(forKey: labelsKey)
412-
store[counter.name] = .counterWithLabels(labelNames, dimensions)
412+
if dimensions.isEmpty {
413+
store.removeValue(forKey: counter.name)
414+
} else {
415+
store[counter.name] = .counterWithLabels(labelNames, dimensions)
416+
}
413417
default:
414418
return
415419
}
@@ -431,7 +435,11 @@ public final class PrometheusCollectorRegistry: Sendable {
431435
let dimensionsKey = LabelsKey(gauge.labels)
432436
guard dimensions[dimensionsKey] === gauge else { return }
433437
dimensions.removeValue(forKey: dimensionsKey)
434-
store[gauge.name] = .gaugeWithLabels(labelNames, dimensions)
438+
if dimensions.isEmpty {
439+
store.removeValue(forKey: gauge.name)
440+
} else {
441+
store[gauge.name] = .gaugeWithLabels(labelNames, dimensions)
442+
}
435443
default:
436444
return
437445
}
@@ -453,7 +461,11 @@ public final class PrometheusCollectorRegistry: Sendable {
453461
let dimensionsKey = LabelsKey(histogram.labels)
454462
guard dimensions[dimensionsKey] === histogram else { return }
455463
dimensions.removeValue(forKey: dimensionsKey)
456-
store[histogram.name] = .durationHistogramWithLabels(labelNames, dimensions, buckets)
464+
if dimensions.isEmpty {
465+
store.removeValue(forKey: histogram.name)
466+
} else {
467+
store[histogram.name] = .durationHistogramWithLabels(labelNames, dimensions, buckets)
468+
}
457469
default:
458470
return
459471
}
@@ -475,7 +487,11 @@ public final class PrometheusCollectorRegistry: Sendable {
475487
let dimensionsKey = LabelsKey(histogram.labels)
476488
guard dimensions[dimensionsKey] === histogram else { return }
477489
dimensions.removeValue(forKey: dimensionsKey)
478-
store[histogram.name] = .valueHistogramWithLabels(labelNames, dimensions, buckets)
490+
if dimensions.isEmpty {
491+
store.removeValue(forKey: histogram.name)
492+
} else {
493+
store[histogram.name] = .valueHistogramWithLabels(labelNames, dimensions, buckets)
494+
}
479495
default:
480496
return
481497
}

Tests/PrometheusTests/PrometheusCollectorRegistryTests.swift

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,4 +231,34 @@ final class PrometheusCollectorRegistryTests: XCTestCase {
231231
)
232232
}
233233

234+
func testUnregisterReregisterWithoutLabels() {
235+
let registry = PrometheusCollectorRegistry()
236+
registry.unregisterCounter(registry.makeCounter(name: "name"))
237+
registry.unregisterGauge(registry.makeGauge(name: "name"))
238+
registry.unregisterDurationHistogram(registry.makeDurationHistogram(name: "name", buckets: []))
239+
registry.unregisterValueHistogram(registry.makeValueHistogram(name: "name", buckets: []))
240+
_ = registry.makeCounter(name: "name")
241+
}
242+
243+
func testUnregisterReregisterWithLabels() {
244+
let registry = PrometheusCollectorRegistry()
245+
246+
registry.unregisterCounter(registry.makeCounter(name: "name", labels: [("a", "1")]))
247+
registry.unregisterCounter(registry.makeCounter(name: "name", labels: [("b", "1")]))
248+
249+
registry.unregisterGauge(registry.makeGauge(name: "name", labels: [("a", "1")]))
250+
registry.unregisterGauge(registry.makeGauge(name: "name", labels: [("b", "1")]))
251+
252+
registry.unregisterDurationHistogram(
253+
registry.makeDurationHistogram(name: "name", labels: [("a", "1")], buckets: [])
254+
)
255+
registry.unregisterDurationHistogram(
256+
registry.makeDurationHistogram(name: "name", labels: [("b", "1")], buckets: [])
257+
)
258+
259+
registry.unregisterValueHistogram(registry.makeValueHistogram(name: "name", labels: [("a", "1")], buckets: []))
260+
registry.unregisterValueHistogram(registry.makeValueHistogram(name: "name", labels: [("b", "1")], buckets: []))
261+
262+
_ = registry.makeCounter(name: "name", labels: [("a", "1")])
263+
}
234264
}

Tests/PrometheusTests/PrometheusMetricsFactoryTests.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,6 @@ final class PrometheusMetricsFactoryTests: XCTestCase {
6767
XCTAssertEqual(
6868
String(decoding: buffer, as: Unicode.UTF8.self),
6969
"""
70-
# TYPE foo counter
71-
7270
"""
7371
)
7472
}
@@ -126,8 +124,6 @@ final class PrometheusMetricsFactoryTests: XCTestCase {
126124
XCTAssertEqual(
127125
String(decoding: buffer, as: Unicode.UTF8.self),
128126
"""
129-
# TYPE foo gauge
130-
131127
"""
132128
)
133129
}

0 commit comments

Comments
 (0)