github.com/zjj1991/quorum@v0.0.0-20190524123704-ae4b0a1e1a19/metrics/histogram.go (about) 1 package metrics 2 3 // Histograms calculate distribution statistics from a series of int64 values. 4 type Histogram interface { 5 Clear() 6 Count() int64 7 Max() int64 8 Mean() float64 9 Min() int64 10 Percentile(float64) float64 11 Percentiles([]float64) []float64 12 Sample() Sample 13 Snapshot() Histogram 14 StdDev() float64 15 Sum() int64 16 Update(int64) 17 Variance() float64 18 } 19 20 // GetOrRegisterHistogram returns an existing Histogram or constructs and 21 // registers a new StandardHistogram. 22 func GetOrRegisterHistogram(name string, r Registry, s Sample) Histogram { 23 if nil == r { 24 r = DefaultRegistry 25 } 26 return r.GetOrRegister(name, func() Histogram { return NewHistogram(s) }).(Histogram) 27 } 28 29 // NewHistogram constructs a new StandardHistogram from a Sample. 30 func NewHistogram(s Sample) Histogram { 31 if !Enabled { 32 return NilHistogram{} 33 } 34 return &StandardHistogram{sample: s} 35 } 36 37 // NewRegisteredHistogram constructs and registers a new StandardHistogram from 38 // a Sample. 39 func NewRegisteredHistogram(name string, r Registry, s Sample) Histogram { 40 c := NewHistogram(s) 41 if nil == r { 42 r = DefaultRegistry 43 } 44 r.Register(name, c) 45 return c 46 } 47 48 // HistogramSnapshot is a read-only copy of another Histogram. 49 type HistogramSnapshot struct { 50 sample *SampleSnapshot 51 } 52 53 // Clear panics. 54 func (*HistogramSnapshot) Clear() { 55 panic("Clear called on a HistogramSnapshot") 56 } 57 58 // Count returns the number of samples recorded at the time the snapshot was 59 // taken. 60 func (h *HistogramSnapshot) Count() int64 { return h.sample.Count() } 61 62 // Max returns the maximum value in the sample at the time the snapshot was 63 // taken. 64 func (h *HistogramSnapshot) Max() int64 { return h.sample.Max() } 65 66 // Mean returns the mean of the values in the sample at the time the snapshot 67 // was taken. 68 func (h *HistogramSnapshot) Mean() float64 { return h.sample.Mean() } 69 70 // Min returns the minimum value in the sample at the time the snapshot was 71 // taken. 72 func (h *HistogramSnapshot) Min() int64 { return h.sample.Min() } 73 74 // Percentile returns an arbitrary percentile of values in the sample at the 75 // time the snapshot was taken. 76 func (h *HistogramSnapshot) Percentile(p float64) float64 { 77 return h.sample.Percentile(p) 78 } 79 80 // Percentiles returns a slice of arbitrary percentiles of values in the sample 81 // at the time the snapshot was taken. 82 func (h *HistogramSnapshot) Percentiles(ps []float64) []float64 { 83 return h.sample.Percentiles(ps) 84 } 85 86 // Sample returns the Sample underlying the histogram. 87 func (h *HistogramSnapshot) Sample() Sample { return h.sample } 88 89 // Snapshot returns the snapshot. 90 func (h *HistogramSnapshot) Snapshot() Histogram { return h } 91 92 // StdDev returns the standard deviation of the values in the sample at the 93 // time the snapshot was taken. 94 func (h *HistogramSnapshot) StdDev() float64 { return h.sample.StdDev() } 95 96 // Sum returns the sum in the sample at the time the snapshot was taken. 97 func (h *HistogramSnapshot) Sum() int64 { return h.sample.Sum() } 98 99 // Update panics. 100 func (*HistogramSnapshot) Update(int64) { 101 panic("Update called on a HistogramSnapshot") 102 } 103 104 // Variance returns the variance of inputs at the time the snapshot was taken. 105 func (h *HistogramSnapshot) Variance() float64 { return h.sample.Variance() } 106 107 // NilHistogram is a no-op Histogram. 108 type NilHistogram struct{} 109 110 // Clear is a no-op. 111 func (NilHistogram) Clear() {} 112 113 // Count is a no-op. 114 func (NilHistogram) Count() int64 { return 0 } 115 116 // Max is a no-op. 117 func (NilHistogram) Max() int64 { return 0 } 118 119 // Mean is a no-op. 120 func (NilHistogram) Mean() float64 { return 0.0 } 121 122 // Min is a no-op. 123 func (NilHistogram) Min() int64 { return 0 } 124 125 // Percentile is a no-op. 126 func (NilHistogram) Percentile(p float64) float64 { return 0.0 } 127 128 // Percentiles is a no-op. 129 func (NilHistogram) Percentiles(ps []float64) []float64 { 130 return make([]float64, len(ps)) 131 } 132 133 // Sample is a no-op. 134 func (NilHistogram) Sample() Sample { return NilSample{} } 135 136 // Snapshot is a no-op. 137 func (NilHistogram) Snapshot() Histogram { return NilHistogram{} } 138 139 // StdDev is a no-op. 140 func (NilHistogram) StdDev() float64 { return 0.0 } 141 142 // Sum is a no-op. 143 func (NilHistogram) Sum() int64 { return 0 } 144 145 // Update is a no-op. 146 func (NilHistogram) Update(v int64) {} 147 148 // Variance is a no-op. 149 func (NilHistogram) Variance() float64 { return 0.0 } 150 151 // StandardHistogram is the standard implementation of a Histogram and uses a 152 // Sample to bound its memory use. 153 type StandardHistogram struct { 154 sample Sample 155 } 156 157 // Clear clears the histogram and its sample. 158 func (h *StandardHistogram) Clear() { h.sample.Clear() } 159 160 // Count returns the number of samples recorded since the histogram was last 161 // cleared. 162 func (h *StandardHistogram) Count() int64 { return h.sample.Count() } 163 164 // Max returns the maximum value in the sample. 165 func (h *StandardHistogram) Max() int64 { return h.sample.Max() } 166 167 // Mean returns the mean of the values in the sample. 168 func (h *StandardHistogram) Mean() float64 { return h.sample.Mean() } 169 170 // Min returns the minimum value in the sample. 171 func (h *StandardHistogram) Min() int64 { return h.sample.Min() } 172 173 // Percentile returns an arbitrary percentile of the values in the sample. 174 func (h *StandardHistogram) Percentile(p float64) float64 { 175 return h.sample.Percentile(p) 176 } 177 178 // Percentiles returns a slice of arbitrary percentiles of the values in the 179 // sample. 180 func (h *StandardHistogram) Percentiles(ps []float64) []float64 { 181 return h.sample.Percentiles(ps) 182 } 183 184 // Sample returns the Sample underlying the histogram. 185 func (h *StandardHistogram) Sample() Sample { return h.sample } 186 187 // Snapshot returns a read-only copy of the histogram. 188 func (h *StandardHistogram) Snapshot() Histogram { 189 return &HistogramSnapshot{sample: h.sample.Snapshot().(*SampleSnapshot)} 190 } 191 192 // StdDev returns the standard deviation of the values in the sample. 193 func (h *StandardHistogram) StdDev() float64 { return h.sample.StdDev() } 194 195 // Sum returns the sum in the sample. 196 func (h *StandardHistogram) Sum() int64 { return h.sample.Sum() } 197 198 // Update samples a new value. 199 func (h *StandardHistogram) Update(v int64) { h.sample.Update(v) } 200 201 // Variance returns the variance of the values in the sample. 202 func (h *StandardHistogram) Variance() float64 { return h.sample.Variance() }