gitee.com/lh-her-team/common@v1.5.1/monitor/metric.go (about)

     1  package monitor
     2  
     3  import (
     4  	"fmt"
     5  	"sync"
     6  
     7  	"github.com/prometheus/client_golang/prometheus"
     8  )
     9  
    10  const (
    11  	namespace = "herbt"
    12  )
    13  
    14  const (
    15  	SUBSYSTEM_GRPC                    = "grpc"
    16  	SUBSYSTEM_CORE_COMMITTER          = "committer"
    17  	SUBSYSTEM_RPCSERVER               = "rpcserver"
    18  	SUBSYSTEM_CORE_PROPOSER_SCHEDULER = "scheduler"
    19  	SUBSYSTEM_CORE_PROPOSER           = "proposer"
    20  	SUBSYSTEM_CORE_VERIFIER           = "verifier"
    21  	SUBSYSTEM_TXPOOL                  = "txpool"
    22  	SUBSYSTEM_VM                      = "vm"
    23  
    24  	ChainId                           = "chainId"
    25  	PoolType                          = "poolType"
    26  	MetricBlockSize                   = "metric_block_size"
    27  	MetricBlockCounter                = "metric_block_counter"
    28  	MetricTxCounter                   = "metric_tx_counter"
    29  	MetricTxPoolSize                  = "metric_tx_pool_size"       // tx pool
    30  	MetricValidateTxInDBTime          = "validate_tx_exist_db_time" // tx pool
    31  	MetricValidateTxSignTime          = "validate_tx_sign_time"     // tx pool
    32  	MetricTpsGauge                    = "metric_tps_gauge"
    33  	MetricBlockCommitTime             = "metric_block_commit_time"
    34  	MetricBlockIntervalTime           = "metric_block_interval_time"
    35  	HelpCurrentBlockSizeMetric        = "current block size metric"
    36  	HelpBlockCountsMetric             = "block counts metric"
    37  	HelpTxCountsMetric                = "tx counts metric"
    38  	HelpTxPoolSizeMetric              = "tx pool size metric"                 // tx pool
    39  	MetricValidateTxInDBTimeMetric    = "validate tx exist in db time metric" // tx pool
    40  	MetricValidateTxSignTimeMetric    = "validate tx sign time metric"        // tx pool
    41  	HelpTpsGaugeMetric                = "real-time transaction per second (TPS) metric"
    42  	HelpBlockCommitTimeMetric         = "block commit time metric"
    43  	HelpBlockIntervalTimeMetric       = "block interval metric"
    44  	MetricDeployedContractCounter     = "metric_deployed_contract_counter"
    45  	MetricContractInvokeCounter       = "metric_contract_invoke_counter"
    46  	MetricGasUsedHistogram            = "metric_gas_used_histogram"
    47  	HelpDeployedContractCounterMetric = "deployed contract counter metric"
    48  	HelpContractInvokeCounterMetric   = "contract invoke counter metric"
    49  	HelpGasUsedHistogramMetric        = "gas used histogram metric"
    50  )
    51  
    52  var (
    53  	counterVecs        map[string]*prometheus.CounterVec
    54  	histogramVecs      map[string]*prometheus.HistogramVec
    55  	gaugeVecs          map[string]*prometheus.GaugeVec
    56  	counterVecsMutex   sync.Mutex
    57  	histogramVecsMutex sync.Mutex
    58  	gaugeVecsMutex     sync.Mutex
    59  )
    60  
    61  func init() {
    62  	counterVecs = make(map[string]*prometheus.CounterVec)
    63  	histogramVecs = make(map[string]*prometheus.HistogramVec)
    64  	gaugeVecs = make(map[string]*prometheus.GaugeVec)
    65  }
    66  
    67  func NewCounterVec(subsystem, name, help string, labels ...string) *prometheus.CounterVec {
    68  	counterVecsMutex.Lock()
    69  	defer counterVecsMutex.Unlock()
    70  	s := fmt.Sprintf("%s_%s", subsystem, name)
    71  	if metric, ok := counterVecs[s]; ok {
    72  		return metric
    73  	}
    74  	metric := prometheus.NewCounterVec(
    75  		prometheus.CounterOpts{
    76  			Namespace: namespace,
    77  			Subsystem: subsystem,
    78  			Name:      name,
    79  			Help:      help,
    80  		}, labels)
    81  	prometheus.MustRegister(metric)
    82  	counterVecs[s] = metric
    83  	return metric
    84  }
    85  
    86  func NewHistogramVec(subsystem, name, help string, buckets []float64, labels ...string) *prometheus.HistogramVec {
    87  	histogramVecsMutex.Lock()
    88  	defer histogramVecsMutex.Unlock()
    89  	s := fmt.Sprintf("%s_%s", subsystem, name)
    90  	if metric, ok := histogramVecs[s]; ok {
    91  		return metric
    92  	}
    93  	metric := prometheus.NewHistogramVec(
    94  		prometheus.HistogramOpts{
    95  			Namespace: namespace,
    96  			Subsystem: subsystem,
    97  			Name:      name,
    98  			Help:      help,
    99  			Buckets:   buckets,
   100  		}, labels)
   101  	prometheus.MustRegister(metric)
   102  	histogramVecs[s] = metric
   103  	return metric
   104  }
   105  
   106  func NewGaugeVec(subsystem, name, help string, labels ...string) *prometheus.GaugeVec {
   107  	gaugeVecsMutex.Lock()
   108  	defer gaugeVecsMutex.Unlock()
   109  	s := fmt.Sprintf("%s_%s", subsystem, name)
   110  	if metric, ok := gaugeVecs[s]; ok {
   111  		return metric
   112  	}
   113  	metric := prometheus.NewGaugeVec(
   114  		prometheus.GaugeOpts{
   115  			Namespace: namespace,
   116  			Subsystem: subsystem,
   117  			Name:      name,
   118  			Help:      help,
   119  		}, labels)
   120  	prometheus.MustRegister(metric)
   121  	gaugeVecs[s] = metric
   122  	return metric
   123  }
   124  
   125  func NewHistogram(subsystem, name, help string, buckets []float64) *prometheus.Histogram {
   126  	metric := prometheus.NewHistogram(
   127  		prometheus.HistogramOpts{
   128  			Namespace: namespace,
   129  			Subsystem: subsystem,
   130  			Name:      name,
   131  			Help:      help,
   132  			Buckets:   buckets,
   133  		})
   134  
   135  	prometheus.MustRegister(metric)
   136  	return &metric
   137  }