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 }