github.com/okex/exchain@v1.8.0/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  	CommittedHeight metrics.Gauge
    32  }
    33  
    34  // PrometheusMetrics returns Metrics build using Prometheus client library.
    35  // Optionally, labels can be provided along with their values ("foo",
    36  // "fooValue").
    37  func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics {
    38  	labels := []string{}
    39  	for i := 0; i < len(labelsAndValues); i += 2 {
    40  		labels = append(labels, labelsAndValues[i])
    41  	}
    42  	return &Metrics{
    43  		BlockProcessingTime: prometheus.NewHistogramFrom(stdprometheus.HistogramOpts{
    44  			Namespace: namespace,
    45  			Subsystem: MetricsSubsystem,
    46  			Name:      "block_processing_time",
    47  			Help:      "Time between BeginBlock and EndBlock in ms.",
    48  			Buckets:   stdprometheus.LinearBuckets(1, 10, 10),
    49  		}, labels).With(labelsAndValues...),
    50  		IntervalTime: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    51  			Namespace: namespace,
    52  			Subsystem: MetricsSubsystem,
    53  			Name:      "block_interval_time",
    54  			Help:      "Time between last block and current block in ms.",
    55  		}, labels).With(labelsAndValues...),
    56  		lastBlockTime: time.Now().UnixNano(),
    57  		AbciTime: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    58  			Namespace: namespace,
    59  			Subsystem: MetricsSubsystem,
    60  			Name:      "block_abci_time",
    61  			Help:      "ime during executes abci in ms.",
    62  		}, labels).With(labelsAndValues...),
    63  		CommitTime: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    64  			Namespace: namespace,
    65  			Subsystem: MetricsSubsystem,
    66  			Name:      "block_commit_time",
    67  			Help:      "Time during commiting app state in ms.",
    68  		}, labels).With(labelsAndValues...),
    69  		CommittedHeight: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    70  			Namespace: namespace,
    71  			Subsystem: MetricsSubsystem,
    72  			Name:      "monitor_block_height",
    73  			Help:      "The block height.",
    74  		}, labels).With(labelsAndValues...),
    75  	}
    76  }
    77  
    78  // NopMetrics returns no-op Metrics.
    79  func NopMetrics() *Metrics {
    80  	return &Metrics{
    81  		BlockProcessingTime: discard.NewHistogram(),
    82  		IntervalTime:        discard.NewGauge(),
    83  		lastBlockTime:       time.Now().UnixNano(),
    84  		AbciTime:            discard.NewGauge(),
    85  		CommitTime:          discard.NewGauge(),
    86  		CommittedHeight:     discard.NewGauge(),
    87  	}
    88  }