@@ -23,6 +23,8 @@ public class Histogram<NumType: DoubleRepresentable, Labels: HistogramLabels>: M
23
23
24
24
internal private( set) var labels : Labels
25
25
26
+ fileprivate var subHistograms : [ Histogram < NumType , Labels > ] = [ ]
27
+
26
28
private let total : Counter < NumType , EmptyCodable >
27
29
28
30
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
46
48
var output = [ String] ( )
47
49
48
50
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) " )
54
53
}
54
+ output. append ( " # TYPE \( name) histogram " )
55
55
56
56
var acc : NumType = 0
57
57
for (i, bound) in self . upperBounds. enumerated ( ) {
@@ -66,6 +66,21 @@ public class Histogram<NumType: DoubleRepresentable, Labels: HistogramLabels>: M
66
66
67
67
output. append ( " \( name) _sum \( labelsString) \( total. get ( ) ) " )
68
68
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
+
69
84
return output. joined ( separator: " \n " )
70
85
}
71
86
@@ -88,17 +103,16 @@ public class Histogram<NumType: DoubleRepresentable, Labels: HistogramLabels>: M
88
103
89
104
extension Prometheus {
90
105
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
93
107
guard metric. name == his. name, metric. help == his. help, metric. labels == labels else { return false }
94
108
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
99
113
} else {
100
114
let histogram = Histogram < T , U > ( his. name, his. help, labels, his. upperBounds, self )
101
- self . metrics . append ( histogram)
115
+ his . subHistograms . append ( histogram)
102
116
return histogram
103
117
}
104
118
}
0 commit comments