| 
									
										
										
										
											2015-06-22 12:00:55 +03:00
										 |  |  | package metrics | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Histograms calculate distribution statistics from a series of int64 values. | 
					
						
							|  |  |  | type Histogram interface { | 
					
						
							|  |  |  | 	Clear() | 
					
						
							|  |  |  | 	Count() int64 | 
					
						
							|  |  |  | 	Max() int64 | 
					
						
							|  |  |  | 	Mean() float64 | 
					
						
							|  |  |  | 	Min() int64 | 
					
						
							|  |  |  | 	Percentile(float64) float64 | 
					
						
							|  |  |  | 	Percentiles([]float64) []float64 | 
					
						
							|  |  |  | 	Sample() Sample | 
					
						
							|  |  |  | 	Snapshot() Histogram | 
					
						
							|  |  |  | 	StdDev() float64 | 
					
						
							|  |  |  | 	Sum() int64 | 
					
						
							|  |  |  | 	Update(int64) | 
					
						
							|  |  |  | 	Variance() float64 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // GetOrRegisterHistogram returns an existing Histogram or constructs and | 
					
						
							|  |  |  | // registers a new StandardHistogram. | 
					
						
							|  |  |  | func GetOrRegisterHistogram(name string, r Registry, s Sample) Histogram { | 
					
						
							|  |  |  | 	if nil == r { | 
					
						
							|  |  |  | 		r = DefaultRegistry | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return r.GetOrRegister(name, func() Histogram { return NewHistogram(s) }).(Histogram) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // NewHistogram constructs a new StandardHistogram from a Sample. | 
					
						
							|  |  |  | func NewHistogram(s Sample) Histogram { | 
					
						
							| 
									
										
										
										
											2018-02-23 10:56:08 +01:00
										 |  |  | 	if !Enabled { | 
					
						
							| 
									
										
										
										
											2015-06-22 12:00:55 +03:00
										 |  |  | 		return NilHistogram{} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return &StandardHistogram{sample: s} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // NewRegisteredHistogram constructs and registers a new StandardHistogram from | 
					
						
							|  |  |  | // a Sample. | 
					
						
							|  |  |  | func NewRegisteredHistogram(name string, r Registry, s Sample) Histogram { | 
					
						
							|  |  |  | 	c := NewHistogram(s) | 
					
						
							|  |  |  | 	if nil == r { | 
					
						
							|  |  |  | 		r = DefaultRegistry | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	r.Register(name, c) | 
					
						
							|  |  |  | 	return c | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // HistogramSnapshot is a read-only copy of another Histogram. | 
					
						
							|  |  |  | type HistogramSnapshot struct { | 
					
						
							|  |  |  | 	sample *SampleSnapshot | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Clear panics. | 
					
						
							|  |  |  | func (*HistogramSnapshot) Clear() { | 
					
						
							|  |  |  | 	panic("Clear called on a HistogramSnapshot") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Count returns the number of samples recorded at the time the snapshot was | 
					
						
							|  |  |  | // taken. | 
					
						
							|  |  |  | func (h *HistogramSnapshot) Count() int64 { return h.sample.Count() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Max returns the maximum value in the sample at the time the snapshot was | 
					
						
							|  |  |  | // taken. | 
					
						
							|  |  |  | func (h *HistogramSnapshot) Max() int64 { return h.sample.Max() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Mean returns the mean of the values in the sample at the time the snapshot | 
					
						
							|  |  |  | // was taken. | 
					
						
							|  |  |  | func (h *HistogramSnapshot) Mean() float64 { return h.sample.Mean() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Min returns the minimum value in the sample at the time the snapshot was | 
					
						
							|  |  |  | // taken. | 
					
						
							|  |  |  | func (h *HistogramSnapshot) Min() int64 { return h.sample.Min() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Percentile returns an arbitrary percentile of values in the sample at the | 
					
						
							|  |  |  | // time the snapshot was taken. | 
					
						
							|  |  |  | func (h *HistogramSnapshot) Percentile(p float64) float64 { | 
					
						
							|  |  |  | 	return h.sample.Percentile(p) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Percentiles returns a slice of arbitrary percentiles of values in the sample | 
					
						
							|  |  |  | // at the time the snapshot was taken. | 
					
						
							|  |  |  | func (h *HistogramSnapshot) Percentiles(ps []float64) []float64 { | 
					
						
							|  |  |  | 	return h.sample.Percentiles(ps) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Sample returns the Sample underlying the histogram. | 
					
						
							|  |  |  | func (h *HistogramSnapshot) Sample() Sample { return h.sample } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Snapshot returns the snapshot. | 
					
						
							|  |  |  | func (h *HistogramSnapshot) Snapshot() Histogram { return h } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // StdDev returns the standard deviation of the values in the sample at the | 
					
						
							|  |  |  | // time the snapshot was taken. | 
					
						
							|  |  |  | func (h *HistogramSnapshot) StdDev() float64 { return h.sample.StdDev() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Sum returns the sum in the sample at the time the snapshot was taken. | 
					
						
							|  |  |  | func (h *HistogramSnapshot) Sum() int64 { return h.sample.Sum() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Update panics. | 
					
						
							|  |  |  | func (*HistogramSnapshot) Update(int64) { | 
					
						
							|  |  |  | 	panic("Update called on a HistogramSnapshot") | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Variance returns the variance of inputs at the time the snapshot was taken. | 
					
						
							|  |  |  | func (h *HistogramSnapshot) Variance() float64 { return h.sample.Variance() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // NilHistogram is a no-op Histogram. | 
					
						
							|  |  |  | type NilHistogram struct{} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Clear is a no-op. | 
					
						
							|  |  |  | func (NilHistogram) Clear() {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Count is a no-op. | 
					
						
							|  |  |  | func (NilHistogram) Count() int64 { return 0 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Max is a no-op. | 
					
						
							|  |  |  | func (NilHistogram) Max() int64 { return 0 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Mean is a no-op. | 
					
						
							|  |  |  | func (NilHistogram) Mean() float64 { return 0.0 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Min is a no-op. | 
					
						
							|  |  |  | func (NilHistogram) Min() int64 { return 0 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Percentile is a no-op. | 
					
						
							|  |  |  | func (NilHistogram) Percentile(p float64) float64 { return 0.0 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Percentiles is a no-op. | 
					
						
							|  |  |  | func (NilHistogram) Percentiles(ps []float64) []float64 { | 
					
						
							|  |  |  | 	return make([]float64, len(ps)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Sample is a no-op. | 
					
						
							|  |  |  | func (NilHistogram) Sample() Sample { return NilSample{} } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Snapshot is a no-op. | 
					
						
							|  |  |  | func (NilHistogram) Snapshot() Histogram { return NilHistogram{} } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // StdDev is a no-op. | 
					
						
							|  |  |  | func (NilHistogram) StdDev() float64 { return 0.0 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Sum is a no-op. | 
					
						
							|  |  |  | func (NilHistogram) Sum() int64 { return 0 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Update is a no-op. | 
					
						
							|  |  |  | func (NilHistogram) Update(v int64) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Variance is a no-op. | 
					
						
							|  |  |  | func (NilHistogram) Variance() float64 { return 0.0 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // StandardHistogram is the standard implementation of a Histogram and uses a | 
					
						
							|  |  |  | // Sample to bound its memory use. | 
					
						
							|  |  |  | type StandardHistogram struct { | 
					
						
							|  |  |  | 	sample Sample | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Clear clears the histogram and its sample. | 
					
						
							|  |  |  | func (h *StandardHistogram) Clear() { h.sample.Clear() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Count returns the number of samples recorded since the histogram was last | 
					
						
							|  |  |  | // cleared. | 
					
						
							|  |  |  | func (h *StandardHistogram) Count() int64 { return h.sample.Count() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Max returns the maximum value in the sample. | 
					
						
							|  |  |  | func (h *StandardHistogram) Max() int64 { return h.sample.Max() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Mean returns the mean of the values in the sample. | 
					
						
							|  |  |  | func (h *StandardHistogram) Mean() float64 { return h.sample.Mean() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Min returns the minimum value in the sample. | 
					
						
							|  |  |  | func (h *StandardHistogram) Min() int64 { return h.sample.Min() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Percentile returns an arbitrary percentile of the values in the sample. | 
					
						
							|  |  |  | func (h *StandardHistogram) Percentile(p float64) float64 { | 
					
						
							|  |  |  | 	return h.sample.Percentile(p) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Percentiles returns a slice of arbitrary percentiles of the values in the | 
					
						
							|  |  |  | // sample. | 
					
						
							|  |  |  | func (h *StandardHistogram) Percentiles(ps []float64) []float64 { | 
					
						
							|  |  |  | 	return h.sample.Percentiles(ps) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Sample returns the Sample underlying the histogram. | 
					
						
							|  |  |  | func (h *StandardHistogram) Sample() Sample { return h.sample } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Snapshot returns a read-only copy of the histogram. | 
					
						
							|  |  |  | func (h *StandardHistogram) Snapshot() Histogram { | 
					
						
							|  |  |  | 	return &HistogramSnapshot{sample: h.sample.Snapshot().(*SampleSnapshot)} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // StdDev returns the standard deviation of the values in the sample. | 
					
						
							|  |  |  | func (h *StandardHistogram) StdDev() float64 { return h.sample.StdDev() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Sum returns the sum in the sample. | 
					
						
							|  |  |  | func (h *StandardHistogram) Sum() int64 { return h.sample.Sum() } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Update samples a new value. | 
					
						
							|  |  |  | func (h *StandardHistogram) Update(v int64) { h.sample.Update(v) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Variance returns the variance of the values in the sample. | 
					
						
							|  |  |  | func (h *StandardHistogram) Variance() float64 { return h.sample.Variance() } |