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  }