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  }