/ stats.go
stats.go
1 package main 2 3 import ( 4 "fmt" 5 "log" 6 "net/http" 7 "strconv" 8 "time" 9 10 "github.com/prometheus/client_golang/prometheus" 11 "github.com/prometheus/client_golang/prometheus/promhttp" 12 ) 13 14 var ( 15 peersLatency = prometheus.NewHistogramVec(prometheus.HistogramOpts{ 16 Name: "peers_discovery_latency", 17 Help: "Latency to discover peers", 18 Buckets: []float64{0.5, 2, 5, 10, 20, 30}, 19 }, []string{"peers"}) 20 started = prometheus.NewCounter(prometheus.CounterOpts{ 21 Name: "peers_discovery_started", 22 Help: "Number of healtcheck started", 23 }) 24 failed = prometheus.NewCounter(prometheus.CounterOpts{ 25 Name: "peers_discovery_failed", 26 Help: "Number of healtcheck failed", 27 }) 28 ) 29 30 func init() { 31 prometheus.MustRegister(peersLatency, started, failed) 32 } 33 34 // Stats represents messages' statistics. 35 type Stats struct { 36 } 37 38 // For verifying the service is up 39 func healthHandler(w http.ResponseWriter, r *http.Request) { 40 fmt.Fprintf(w, "OK") 41 } 42 43 // NewStats returns new empty Stats object. 44 func NewStats(statsPort string) Stats { 45 go func() { 46 http.Handle("/metrics", promhttp.Handler()) 47 // Add most trivial healthcheck 48 http.HandleFunc("/health", healthHandler) 49 log.Fatal(http.ListenAndServe(statsPort, nil)) 50 }() 51 return Stats{} 52 } 53 54 func (s Stats) Discovered(count int, d time.Duration) { 55 peersLatency.WithLabelValues(strconv.Itoa(count)).Observe(float64(d) / float64(time.Second)) 56 } 57 58 func (s Stats) Started() { 59 started.Add(1) 60 } 61 62 func (s Stats) Failed() { 63 failed.Add(1) 64 }