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 }