/ 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  }