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  }