github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/app/rpc/monitor/monitor.go (about) 1 package monitor 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/fibonacci-chain/fbc/libs/tendermint/libs/log" 8 "github.com/go-kit/kit/metrics" 9 "github.com/go-kit/kit/metrics/prometheus" 10 stdprometheus "github.com/prometheus/client_golang/prometheus" 11 ) 12 13 const ( 14 FlagEnableMonitor = "rpc.enable-monitor" 15 MetricsNamespace = "x" 16 // MetricsSubsystem is a subsystem shared by all metrics exposed by this package. 17 MetricsSubsystem = "rpc" 18 19 MetricsFieldName = "apis" 20 MetricsMethodLabel = "method" 21 22 MetricsCounterNamePattern = "%s_%s_count" 23 MetricsHistogramNamePattern = "%s_%s_duration" 24 ) 25 26 // RpcMetrics ... 27 type RpcMetrics struct { 28 Counter metrics.Counter 29 Histogram metrics.Histogram 30 } 31 32 type Monitor struct { 33 method string 34 logger log.Logger 35 lastTime time.Time 36 metrics *RpcMetrics 37 } 38 39 func MakeMonitorMetrics(namespace string) *RpcMetrics { 40 41 return &RpcMetrics{ 42 Counter: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ 43 Namespace: MetricsNamespace, 44 Subsystem: MetricsSubsystem, 45 Name: fmt.Sprintf(MetricsCounterNamePattern, namespace, MetricsFieldName), 46 Help: fmt.Sprintf("Total request number of %s/%s method.", namespace, MetricsFieldName), 47 }, []string{MetricsMethodLabel}), 48 Histogram: prometheus.NewHistogramFrom(stdprometheus.HistogramOpts{ 49 Namespace: MetricsNamespace, 50 Subsystem: MetricsSubsystem, 51 Name: fmt.Sprintf(MetricsHistogramNamePattern, namespace, MetricsFieldName), 52 Help: fmt.Sprintf("Request duration of %s/%s method.", namespace, MetricsFieldName), 53 Buckets: []float64{0.1, 0.2, 0.3, 0.4, 0.5, 0.8, 1, 3, 5, 8, 10}, 54 }, []string{MetricsMethodLabel}), 55 } 56 } 57 58 func GetMonitor(method string, logger log.Logger, metrics *RpcMetrics) *Monitor { 59 return &Monitor{ 60 method: method, 61 logger: logger, 62 metrics: metrics, 63 } 64 } 65 66 func (m *Monitor) OnBegin() *Monitor { 67 m.lastTime = time.Now() 68 69 if m.metrics == nil { 70 return m 71 } 72 m.metrics.Counter.With(MetricsMethodLabel, m.method).Add(1) 73 74 return m 75 } 76 77 func (m *Monitor) OnEnd(args ...interface{}) { 78 elapsed := time.Since(m.lastTime).Seconds() 79 m.logger.Debug("RPC", MetricsMethodLabel, m.method, "Elapsed", elapsed*1e3, "Params", args) 80 81 if m.metrics == nil { 82 return 83 } 84 m.metrics.Histogram.With(MetricsMethodLabel, m.method).Observe(elapsed) 85 }