mirror of
https://github.com/cirocosta/monero-exporter.git
synced 2024-10-01 08:25:41 -04:00
debdce3fb2
this is a big refactor, essentially rewriting the custom collector from scratch, and as such, creating a new dashboard based on the new metrics. Signed-off-by: Ciro S. Costa <utxobr@protonmail.com>
95 lines
1.6 KiB
Go
95 lines
1.6 KiB
Go
package collector
|
|
|
|
import "github.com/beorn7/perks/quantile"
|
|
|
|
// defaultQuantiles is the default quantiles to compute for a given data stream
|
|
// that we want to summarize.
|
|
//
|
|
// these (quantile -> epsilon) will be used by default by any Summary unless
|
|
// initialized with the `WithQuantiles` option to override it.
|
|
//
|
|
var defaultQuantiles = map[float64]float64{
|
|
0.05: 0.01,
|
|
0.10: 0.01,
|
|
0.25: 0.01,
|
|
0.50: 0.01,
|
|
0.75: 0.01,
|
|
0.90: 0.01,
|
|
0.95: 0.01,
|
|
0.99: 0.01,
|
|
1.00: 0.01,
|
|
}
|
|
|
|
type Summary struct {
|
|
count uint64
|
|
sum float64
|
|
quantiles map[float64]float64
|
|
|
|
stream *quantile.Stream
|
|
computed bool
|
|
}
|
|
|
|
type SummaryOption func(s *Summary)
|
|
|
|
func WithQuantiles(v map[float64]float64) SummaryOption {
|
|
return func(s *Summary) {
|
|
s.quantiles = v
|
|
}
|
|
}
|
|
|
|
func NewSummary(opts ...SummaryOption) *Summary {
|
|
summary := &Summary{
|
|
count: uint64(0),
|
|
sum: float64(0),
|
|
quantiles: cloneMap(defaultQuantiles),
|
|
}
|
|
|
|
for _, opt := range opts {
|
|
opt(summary)
|
|
}
|
|
|
|
summary.stream = quantile.NewTargeted(summary.quantiles)
|
|
|
|
return summary
|
|
}
|
|
|
|
func (s *Summary) Insert(v float64) {
|
|
s.sum += v
|
|
s.stream.Insert(v)
|
|
s.count++
|
|
}
|
|
|
|
func (s *Summary) Count() uint64 {
|
|
s.compute()
|
|
return s.count
|
|
}
|
|
|
|
func (s *Summary) Quantiles() map[float64]float64 {
|
|
s.compute()
|
|
return s.quantiles
|
|
}
|
|
|
|
func (s *Summary) Sum() float64 {
|
|
s.compute()
|
|
return s.sum
|
|
}
|
|
|
|
func (s *Summary) compute() {
|
|
if s.computed {
|
|
return
|
|
}
|
|
|
|
for phi := range s.quantiles {
|
|
s.quantiles[phi] = s.stream.Query(phi)
|
|
}
|
|
}
|
|
|
|
func cloneMap(o map[float64]float64) map[float64]float64 {
|
|
m := make(map[float64]float64, len(o))
|
|
for k, v := range o {
|
|
m[k] = v
|
|
}
|
|
|
|
return m
|
|
}
|