ipld-eth-server/vendor/github.com/aristanetworks/goarista/monitor/histogram.go

65 lines
1.8 KiB
Go
Raw Normal View History

// Copyright (c) 2015 Arista Networks, Inc.
// Use of this source code is governed by the Apache License 2.0
// that can be found in the COPYING file.
package monitor
import (
"expvar"
"strings"
"time"
"github.com/aristanetworks/goarista/monitor/stats"
)
// LatencyHistogram contains the data needed to properly export itself to expvar
// and provide a pretty printed version
type LatencyHistogram struct {
name string
histogram *stats.Histogram
latencyUnit time.Duration
}
// NewLatencyHistogram creates a new histogram and registers an HTTP handler for it.
func NewLatencyHistogram(name string, latencyUnit time.Duration, numBuckets int,
growth float64, smallest float64, minValue int64) *LatencyHistogram {
histogramOptions := stats.HistogramOptions{
NumBuckets: numBuckets,
GrowthFactor: growth,
SmallestBucketSize: smallest,
MinValue: minValue,
}
histogram := &LatencyHistogram{
name: name,
histogram: stats.NewHistogram(histogramOptions),
latencyUnit: latencyUnit,
}
expvar.Publish(name, histogram)
return histogram
}
// Print returns the histogram as a chart
func (h *LatencyHistogram) Print() string {
return h.addUnits(h.histogram.Delta1m().String()) +
h.addUnits(h.histogram.Delta10m().String()) +
h.addUnits(h.histogram.Delta1h().String()) +
h.addUnits(h.histogram.Value().String())
}
// String returns the histogram as JSON.
func (h *LatencyHistogram) String() string {
return h.histogram.String()
}
// UpdateLatencyValues updates the LatencyHistogram's buckets with the new
// datapoint and updates the string associated with the expvar.String
func (h *LatencyHistogram) UpdateLatencyValues(delta time.Duration) {
h.histogram.Add(int64(delta / h.latencyUnit))
}
func (h *LatencyHistogram) addUnits(hist string) string {
i := strings.Index(hist, "\n")
return hist[:i] + "µs" + hist[i:]
}