Skip to content

Commit 3fdf15d

Browse files
committed
Fixup labeling Summary and Histogram
1 parent a1455d8 commit 3fdf15d

File tree

2 files changed

+47
-21
lines changed

2 files changed

+47
-21
lines changed

Sources/Prometheus/MetricTypes/Histogram.swift

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ public class Histogram<NumType: DoubleRepresentable, Labels: HistogramLabels>: M
2323

2424
internal private(set) var labels: Labels
2525

26+
fileprivate var subHistograms: [Histogram<NumType, Labels>] = []
27+
2628
private let total: Counter<NumType, EmptyCodable>
2729

2830
internal init(_ name: String, _ help: String? = nil, _ labels: Labels = Labels(), _ buckets: [Double] = defaultBuckets, _ p: Prometheus) {
@@ -46,12 +48,10 @@ public class Histogram<NumType: DoubleRepresentable, Labels: HistogramLabels>: M
4648
var output = [String]()
4749

4850

49-
if self.labels == Labels() {
50-
if let help = help {
51-
output.append("# HELP \(name) \(help)")
52-
}
53-
output.append("# TYPE \(name) histogram")
51+
if let help = help {
52+
output.append("# HELP \(name) \(help)")
5453
}
54+
output.append("# TYPE \(name) histogram")
5555

5656
var acc: NumType = 0
5757
for (i, bound) in self.upperBounds.enumerated() {
@@ -66,6 +66,21 @@ public class Histogram<NumType: DoubleRepresentable, Labels: HistogramLabels>: M
6666

6767
output.append("\(name)_sum\(labelsString) \(total.get())")
6868

69+
subHistograms.forEach { subHistogram in
70+
var acc: NumType = 0
71+
for (i, bound) in subHistogram.upperBounds.enumerated() {
72+
acc += subHistogram.buckets[i].get()
73+
subHistogram.labels.le = bound.description
74+
let labelsString = encodeLabels(subHistogram.labels)
75+
output.append("\(subHistogram.name)_bucket\(labelsString) \(acc)")
76+
}
77+
78+
let labelsString = encodeLabels(subHistogram.labels, ["le"])
79+
output.append("\(subHistogram.name)_count\(labelsString) \(acc)")
80+
81+
output.append("\(subHistogram.name)_sum\(labelsString) \(subHistogram.total.get())")
82+
}
83+
6984
return output.joined(separator: "\n")
7085
}
7186

@@ -88,17 +103,16 @@ public class Histogram<NumType: DoubleRepresentable, Labels: HistogramLabels>: M
88103

89104
extension Prometheus {
90105
fileprivate func getOrCreateHistogram<T: Numeric, U: HistogramLabels>(with labels: U, for his: Histogram<T, U>) -> Histogram<T, U> {
91-
let summaries = metrics.filter { (metric) -> Bool in
92-
guard let metric = metric as? Histogram<T, U> else { return false }
106+
let histograms = his.subHistograms.filter { (metric) -> Bool in
93107
guard metric.name == his.name, metric.help == his.help, metric.labels == labels else { return false }
94108
return true
95-
} as? [Histogram<T, U>] ?? []
96-
if summaries.count > 2 { fatalError("Somehow got 2 summaries with the same data type") }
97-
if let summary = summaries.first {
98-
return summary
109+
}
110+
if histograms.count > 2 { fatalError("Somehow got 2 summaries with the same data type") }
111+
if let histogram = histograms.first {
112+
return histogram
99113
} else {
100114
let histogram = Histogram<T, U>(his.name, his.help, labels, his.upperBounds, self)
101-
self.metrics.append(histogram)
115+
his.subHistograms.append(histogram)
102116
return histogram
103117
}
104118
}

Sources/Prometheus/MetricTypes/Summary.swift

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ public class Summary<NumType: DoubleRepresentable, Labels: SummaryLabels>: Metri
2727

2828
internal let quantiles: [Double]
2929

30+
fileprivate var subSummaries: [Summary<NumType, Labels>] = []
31+
3032
internal init(_ name: String, _ help: String? = nil, _ labels: Labels = Labels(), _ quantiles: [Double] = defaultQuantiles, _ p: Prometheus) {
3133
self.name = name
3234
self.help = help
@@ -45,12 +47,10 @@ public class Summary<NumType: DoubleRepresentable, Labels: SummaryLabels>: Metri
4547
public func getMetric() -> String {
4648
var output = [String]()
4749

48-
if self.labels == Labels() {
49-
if let help = help {
50-
output.append("# HELP \(name) \(help)")
51-
}
52-
output.append("# TYPE \(name) summary")
50+
if let help = help {
51+
output.append("# HELP \(name) \(help)")
5352
}
53+
output.append("# TYPE \(name) summary")
5454

5555
calculateQuantiles(quantiles: quantiles, values: values.map { $0.doubleValue }).sorted { $0.key < $1.key }.forEach { (arg) in
5656
let (q, v) = arg
@@ -63,6 +63,19 @@ public class Summary<NumType: DoubleRepresentable, Labels: SummaryLabels>: Metri
6363
output.append("\(name)_count\(labelsString) \(count.get())")
6464
output.append("\(name)_sum\(labelsString) \(sum.get())")
6565

66+
self.subSummaries.forEach { subSum in
67+
calculateQuantiles(quantiles: quantiles, values: subSum.values.map { $0.doubleValue }).sorted { $0.key < $1.key }.forEach { (arg) in
68+
let (q, v) = arg
69+
subSum.labels.quantile = "\(q)"
70+
let labelsString = encodeLabels(subSum.labels)
71+
output.append("\(subSum.name)\(labelsString) \(v)")
72+
}
73+
74+
let labelsString = encodeLabels(subSum.labels, ["quantile"])
75+
output.append("\(subSum.name)_count\(labelsString) \(subSum.count.get())")
76+
output.append("\(subSum.name)_sum\(labelsString) \(subSum.sum.get())")
77+
}
78+
6679
self.labels.quantile = ""
6780

6881
return output.joined(separator: "\n")
@@ -82,17 +95,16 @@ public class Summary<NumType: DoubleRepresentable, Labels: SummaryLabels>: Metri
8295

8396
extension Prometheus {
8497
fileprivate func getOrCreateSummary<T: Numeric, U: SummaryLabels>(withLabels labels: U, forSummary sum: Summary<T, U>) -> Summary<T, U> {
85-
let summaries = metrics.filter { (metric) -> Bool in
86-
guard let metric = metric as? Summary<T, U> else { return false }
98+
let summaries = sum.subSummaries.filter { (metric) -> Bool in
8799
guard metric.name == sum.name, metric.help == sum.help, metric.labels == labels else { return false }
88100
return true
89-
} as? [Summary<T, U>] ?? []
101+
}
90102
if summaries.count > 2 { fatalError("Somehow got 2 summaries with the same data type") }
91103
if let summary = summaries.first {
92104
return summary
93105
} else {
94106
let summary = Summary<T, U>(sum.name, sum.help, labels, sum.quantiles, self)
95-
self.metrics.append(summary)
107+
sum.subSummaries.append(summary)
96108
return summary
97109
}
98110
}

0 commit comments

Comments
 (0)