github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/monitoring/prometheus/metrics.go (about)

     1  package prometheus
     2  
     3  import (
     4  	"reflect"
     5  	"strings"
     6  
     7  	"github.com/prometheus/client_golang/prometheus"
     8  	"github.com/unicornultrafoundation/go-u2u/metrics"
     9  )
    10  
    11  var namespace = "u2u"
    12  
    13  // SetNamespace for metrics.
    14  func SetNamespace(s string) {
    15  	namespace = s
    16  }
    17  
    18  func convertToPrometheusMetric(name string, m interface{}) (prometheus.Collector, bool) {
    19  	opts := prometheus.Opts{
    20  		Namespace: namespace,
    21  		Name:      prometheusDelims(name),
    22  	}
    23  
    24  	var collector prometheus.Collector
    25  
    26  	switch metric := m.(type) {
    27  
    28  	case metrics.Counter:
    29  		collector = prometheus.NewCounterFunc(prometheus.CounterOpts(opts), func() float64 {
    30  			return float64(metric.Count())
    31  		})
    32  
    33  	case metrics.Gauge:
    34  		collector = prometheus.NewGaugeFunc(prometheus.GaugeOpts(opts), func() float64 {
    35  			return float64(metric.Value())
    36  		})
    37  
    38  	case metrics.GaugeFloat64:
    39  		collector = prometheus.NewGaugeFunc(prometheus.GaugeOpts(opts), func() float64 {
    40  			return metric.Value()
    41  		})
    42  
    43  	case metrics.Healthcheck:
    44  		collector = prometheus.NewGaugeFunc(prometheus.GaugeOpts(opts), func() float64 {
    45  			metric.Check()
    46  			if err := metric.Error(); nil != err {
    47  				return 1
    48  			}
    49  			return 0
    50  		})
    51  
    52  	case metrics.Meter:
    53  		collector = PrometheusCollector(opts, metric,
    54  			"rate1m", "rate5m", "rate15m", "rate")
    55  
    56  	case metrics.Histogram:
    57  		collector = PrometheusCollector(opts, metric,
    58  			"min", "max", "mean")
    59  
    60  	case metrics.Timer, metrics.ResettingTimer:
    61  		collector = PrometheusCollector(opts, metric,
    62  			"min", "max", "mean", "rate1m", "rate5m", "rate15m", "rate")
    63  
    64  	default:
    65  		logger.Warn("metric doesn't support prometheus",
    66  			"metric", name,
    67  			"type", reflect.TypeOf(m).String())
    68  		return nil, false
    69  	}
    70  
    71  	return collector, true
    72  }
    73  
    74  func prometheusDelims(name string) string {
    75  	return strings.ReplaceAll(name, "/", ":")
    76  }