github.com/status-im/status-go@v1.1.0/metrics/metrics.go (about) 1 package metrics 2 3 import ( 4 "fmt" 5 "net/http" 6 "time" 7 8 "github.com/ethereum/go-ethereum/log" 9 "github.com/ethereum/go-ethereum/metrics" 10 gethprom "github.com/ethereum/go-ethereum/metrics/prometheus" 11 12 prom "github.com/prometheus/client_golang/prometheus" 13 "github.com/prometheus/client_golang/prometheus/promhttp" 14 ) 15 16 // Server runs and controls a HTTP pprof interface. 17 type Server struct { 18 server *http.Server 19 } 20 21 func NewMetricsServer(port int, r metrics.Registry) *Server { 22 mux := http.NewServeMux() 23 mux.Handle("/health", healthHandler()) 24 mux.Handle("/metrics", Handler(r)) 25 p := Server{ 26 server: &http.Server{ 27 Addr: fmt.Sprintf(":%d", port), 28 ReadHeaderTimeout: 5 * time.Second, 29 Handler: mux, 30 }, 31 } 32 return &p 33 } 34 35 func healthHandler() http.Handler { 36 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 37 _, err := w.Write([]byte("OK")) 38 if err != nil { 39 log.Error("health handler error", "err", err) 40 } 41 }) 42 } 43 44 func Handler(reg metrics.Registry) http.Handler { 45 // we disable compression because geth doesn't support it 46 opts := promhttp.HandlerOpts{DisableCompression: true} 47 // we are combining handlers to avoid having 2 endpoints 48 statusMetrics := promhttp.HandlerFor(prom.DefaultGatherer, opts) // our metrics 49 gethMetrics := gethprom.Handler(reg) // geth metrics 50 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 51 statusMetrics.ServeHTTP(w, r) 52 gethMetrics.ServeHTTP(w, r) 53 }) 54 } 55 56 // Listen starts the HTTP server in the background. 57 func (p *Server) Listen() { 58 log.Info("metrics server stopped", "err", p.server.ListenAndServe()) 59 }