github.com/rcrowley/go-metrics@v0.0.0-20201227073835-cf1acfcdf475/stathat/stathat.go (about)

     1  // Metrics output to StatHat.
     2  package stathat
     3  
     4  import (
     5  	"github.com/rcrowley/go-metrics"
     6  	"github.com/stathat/go"
     7  	"log"
     8  	"time"
     9  )
    10  
    11  func Stathat(r metrics.Registry, d time.Duration, userkey string) {
    12  	for {
    13  		if err := sh(r, userkey); nil != err {
    14  			log.Println(err)
    15  		}
    16  		time.Sleep(d)
    17  	}
    18  }
    19  
    20  func sh(r metrics.Registry, userkey string) error {
    21  	r.Each(func(name string, i interface{}) {
    22  		switch metric := i.(type) {
    23  		case metrics.Counter:
    24  			stathat.PostEZCount(name, userkey, int(metric.Count()))
    25  		case metrics.Gauge:
    26  			stathat.PostEZValue(name, userkey, float64(metric.Value()))
    27  		case metrics.GaugeFloat64:
    28  			stathat.PostEZValue(name, userkey, float64(metric.Value()))
    29  		case metrics.Histogram:
    30  			h := metric.Snapshot()
    31  			ps := h.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
    32  			stathat.PostEZCount(name+".count", userkey, int(h.Count()))
    33  			stathat.PostEZValue(name+".min", userkey, float64(h.Min()))
    34  			stathat.PostEZValue(name+".max", userkey, float64(h.Max()))
    35  			stathat.PostEZValue(name+".mean", userkey, float64(h.Mean()))
    36  			stathat.PostEZValue(name+".std-dev", userkey, float64(h.StdDev()))
    37  			stathat.PostEZValue(name+".50-percentile", userkey, float64(ps[0]))
    38  			stathat.PostEZValue(name+".75-percentile", userkey, float64(ps[1]))
    39  			stathat.PostEZValue(name+".95-percentile", userkey, float64(ps[2]))
    40  			stathat.PostEZValue(name+".99-percentile", userkey, float64(ps[3]))
    41  			stathat.PostEZValue(name+".999-percentile", userkey, float64(ps[4]))
    42  		case metrics.Meter:
    43  			m := metric.Snapshot()
    44  			stathat.PostEZCount(name+".count", userkey, int(m.Count()))
    45  			stathat.PostEZValue(name+".one-minute", userkey, float64(m.Rate1()))
    46  			stathat.PostEZValue(name+".five-minute", userkey, float64(m.Rate5()))
    47  			stathat.PostEZValue(name+".fifteen-minute", userkey, float64(m.Rate15()))
    48  			stathat.PostEZValue(name+".mean", userkey, float64(m.RateMean()))
    49  		case metrics.Timer:
    50  			t := metric.Snapshot()
    51  			ps := t.Percentiles([]float64{0.5, 0.75, 0.95, 0.99, 0.999})
    52  			stathat.PostEZCount(name+".count", userkey, int(t.Count()))
    53  			stathat.PostEZValue(name+".min", userkey, float64(t.Min()))
    54  			stathat.PostEZValue(name+".max", userkey, float64(t.Max()))
    55  			stathat.PostEZValue(name+".mean", userkey, float64(t.Mean()))
    56  			stathat.PostEZValue(name+".std-dev", userkey, float64(t.StdDev()))
    57  			stathat.PostEZValue(name+".50-percentile", userkey, float64(ps[0]))
    58  			stathat.PostEZValue(name+".75-percentile", userkey, float64(ps[1]))
    59  			stathat.PostEZValue(name+".95-percentile", userkey, float64(ps[2]))
    60  			stathat.PostEZValue(name+".99-percentile", userkey, float64(ps[3]))
    61  			stathat.PostEZValue(name+".999-percentile", userkey, float64(ps[4]))
    62  			stathat.PostEZValue(name+".one-minute", userkey, float64(t.Rate1()))
    63  			stathat.PostEZValue(name+".five-minute", userkey, float64(t.Rate5()))
    64  			stathat.PostEZValue(name+".fifteen-minute", userkey, float64(t.Rate15()))
    65  			stathat.PostEZValue(name+".mean-rate", userkey, float64(t.RateMean()))
    66  		}
    67  	})
    68  	return nil
    69  }