@@ -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
89104extension 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 }
0 commit comments