github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/tendermint/state/metrics.go (about)

     1  package state
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/go-kit/kit/metrics"
     7  	"github.com/go-kit/kit/metrics/discard"
     8  	"github.com/go-kit/kit/metrics/prometheus"
     9  	stdprometheus "github.com/prometheus/client_golang/prometheus"
    10  )
    11  
    12  const (
    13  	// MetricsSubsystem is a subsystem shared by all metrics exposed by this
    14  	// package.
    15  	MetricsSubsystem = "state"
    16  )
    17  
    18  // Metrics contains metrics exposed by this package.
    19  type Metrics struct {
    20  	// Time between BeginBlock and EndBlock.
    21  	BlockProcessingTime metrics.Histogram
    22  
    23  	// Time between last block and current block.
    24  	IntervalTime  metrics.Gauge
    25  	lastBlockTime int64
    26  	// Time during executes abci
    27  	AbciTime metrics.Gauge
    28  	// Time during commiting app state
    29  	CommitTime metrics.Gauge
    30  }
    31  
    32  // PrometheusMetrics returns Metrics build using Prometheus client library.
    33  // Optionally, labels can be provided along with their values ("foo",
    34  // "fooValue").
    35  func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics {
    36  	labels := []string{}
    37  	for i := 0; i < len(labelsAndValues); i += 2 {
    38  		labels = append(labels, labelsAndValues[i])
    39  	}
    40  	return &Metrics{
    41  		BlockProcessingTime: prometheus.NewHistogramFrom(stdprometheus.HistogramOpts{
    42  			Namespace: namespace,
    43  			Subsystem: MetricsSubsystem,
    44  			Name:      "block_processing_time",
    45  			Help:      "Time between BeginBlock and EndBlock in ms.",
    46  			Buckets:   stdprometheus.LinearBuckets(1, 10, 10),
    47  		}, labels).With(labelsAndValues...),
    48  		IntervalTime: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    49  			Namespace: namespace,
    50  			Subsystem: MetricsSubsystem,
    51  			Name:      "block_interval_time",
    52  			Help:      "Time between last block and current block in ms.",
    53  		}, labels).With(labelsAndValues...),
    54  		lastBlockTime: time.Now().UnixNano(),
    55  		AbciTime: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    56  			Namespace: namespace,
    57  			Subsystem: MetricsSubsystem,
    58  			Name:      "block_abci_time",
    59  			Help:      "ime during executes abci in ms.",
    60  		}, labels).With(labelsAndValues...),
    61  		CommitTime: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    62  			Namespace: namespace,
    63  			Subsystem: MetricsSubsystem,
    64  			Name:      "block_commit_time",
    65  			Help:      "Time during commiting app state in ms.",
    66  		}, labels).With(labelsAndValues...),
    67  	}
    68  }
    69  
    70  // NopMetrics returns no-op Metrics.
    71  func NopMetrics() *Metrics {
    72  	return &Metrics{
    73  		BlockProcessingTime: discard.NewHistogram(),
    74  		IntervalTime:        discard.NewGauge(),
    75  		lastBlockTime:       time.Now().UnixNano(),
    76  		AbciTime:            discard.NewGauge(),
    77  		CommitTime:          discard.NewGauge(),
    78  	}
    79  }