package jmetrics // import "drjosh.dev/jmetrics" import ( "math" "sync" "github.com/prometheus/client_golang/prometheus" ) type LiteGaugeSummary struct { mu sync.Mutex min float64 max float64 sum float64 count int desc *prometheus.Desc } type LiteGaugeSummaryOpts struct { // As for usual Prometheus metrics Namespace, Subsystem, Name, Help string // As for usual Prometheus metrics ConstLabels prometheus.Labels } func NewLiteGaugeSummary(opts LiteGaugeSummaryOpts) *LiteGaugeSummary { varName := prometheus.BuildFQName(opts.Namespace, opts.Subsystem, opts.Name) s := &LiteGaugeSummary{ min: math.Inf(1), max: math.Inf(-1), desc: prometheus.NewDesc(varName, opts.Help, []string{"stat"}, opts.ConstLabels), } return s } func (s *LiteGaugeSummary) Describe(ch chan<- *prometheus.Desc) { ch <- s.desc } func (s *LiteGaugeSummary) Collect(ch chan<- prometheus.Metric) { s.mu.Lock() defer s.mu.Unlock() ch <- prometheus.MustNewConstMetric(s.desc, prometheus.GaugeValue, s.min, "min") ch <- prometheus.MustNewConstMetric(s.desc, prometheus.GaugeValue, s.max, "max") mean := s.sum if s.count > 0 { mean /= float64(s.count) } ch <- prometheus.MustNewConstMetric(s.desc, prometheus.GaugeValue, mean, "mean") s.min = math.Inf(1) s.max = math.Inf(-1) s.sum, s.count = 0, 0 } func (s *LiteGaugeSummary) Observe(x float64) { s.mu.Lock() defer s.mu.Unlock() s.min = min(s.min, x) s.max = max(s.max, x) s.sum += x s.count++ }