github.com/celestiaorg/celestia-node@v0.15.0-beta.1/nodebuilder/p2p/metrics.go (about)

     1  package p2p
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  	"time"
     8  
     9  	"github.com/prometheus/client_golang/prometheus"
    10  	"github.com/prometheus/client_golang/prometheus/promhttp"
    11  	"go.uber.org/fx"
    12  )
    13  
    14  // WithMetrics option sets up native libp2p metrics up.
    15  func WithMetrics() fx.Option {
    16  	return fx.Options(
    17  		fx.Provide(resourceManagerOpt(traceReporter)),
    18  		fx.Provide(prometheusRegisterer),
    19  		fx.Invoke(prometheusMetrics),
    20  	)
    21  }
    22  
    23  const (
    24  	promAgentEndpoint = "/metrics"
    25  	promAgentPort     = "8890"
    26  )
    27  
    28  // prometheusMetrics option sets up native libp2p metrics up
    29  func prometheusMetrics(lifecycle fx.Lifecycle, registerer prometheus.Registerer) error {
    30  	registry := registerer.(*prometheus.Registry)
    31  
    32  	mux := http.NewServeMux()
    33  	handler := promhttp.HandlerFor(registry, promhttp.HandlerOpts{Registry: registerer})
    34  	mux.Handle(promAgentEndpoint, handler)
    35  
    36  	// TODO(@Wondertan): Unify all the servers into one (See #2007)
    37  	promHTTPServer := &http.Server{
    38  		Addr:              fmt.Sprintf(":%s", promAgentPort),
    39  		Handler:           mux,
    40  		ReadHeaderTimeout: 10 * time.Second,
    41  	}
    42  
    43  	lifecycle.Append(fx.Hook{
    44  		OnStart: func(ctx context.Context) error {
    45  			go func() {
    46  				if err := promHTTPServer.ListenAndServe(); err != nil {
    47  					log.Errorf("Error starting Prometheus metrics exporter http server: %s", err)
    48  				}
    49  			}()
    50  
    51  			log.Infof("Prometheus agent started on :%s/%s", promAgentPort, promAgentEndpoint)
    52  			return nil
    53  		},
    54  		OnStop: func(ctx context.Context) error {
    55  			return promHTTPServer.Shutdown(ctx)
    56  		},
    57  	})
    58  	return nil
    59  }
    60  
    61  func prometheusRegisterer() prometheus.Registerer {
    62  	return prometheus.NewRegistry()
    63  }