github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/monitoring/prometheus/handler.go (about) 1 package prometheus 2 3 import ( 4 "net/http" 5 6 "github.com/prometheus/client_golang/prometheus" 7 "github.com/prometheus/client_golang/prometheus/promhttp" 8 "github.com/unicornultrafoundation/go-u2u/log" 9 "github.com/unicornultrafoundation/go-u2u/metrics" 10 ) 11 12 var logger = log.New("module", "prometheus") 13 14 // PrometheusListener serves prometheus connections. 15 func PrometheusListener(endpoint string, reg metrics.Registry) { 16 if reg == nil { 17 reg = metrics.DefaultRegistry 18 } 19 reg.Each(collect) 20 21 go func() { 22 logger.Info("metrics server starts", "endpoint", endpoint) 23 defer logger.Info("metrics server is stopped") 24 25 http.HandleFunc( 26 "/metrics", promhttp.Handler().ServeHTTP) 27 err := http.ListenAndServe(endpoint, nil) 28 if err != nil { 29 logger.Info("metrics server", "err", err) 30 } 31 32 // TODO: wait for exit signal? 33 }() 34 } 35 36 func collect(name string, metric interface{}) { 37 logger.Info("metric to prometheus", "metric", name) 38 39 collector, ok := convertToPrometheusMetric(name, metric) 40 if !ok { 41 return 42 } 43 44 err := prometheus.Register(collector) 45 if err != nil { 46 switch err.(type) { 47 case prometheus.AlreadyRegisteredError: 48 return 49 default: 50 logger.Warn(err.Error()) 51 } 52 } 53 }