github.com/Finschia/ostracon@v1.1.5/state/metrics.go (about)

     1  package state
     2  
     3  import (
     4  	"github.com/go-kit/kit/metrics"
     5  	"github.com/go-kit/kit/metrics/discard"
     6  	"github.com/go-kit/kit/metrics/prometheus"
     7  	stdprometheus "github.com/prometheus/client_golang/prometheus"
     8  )
     9  
    10  const (
    11  	// MetricsSubsystem is a subsystem shared by all metrics exposed by this
    12  	// package.
    13  	MetricsSubsystem = "state"
    14  )
    15  
    16  // Metrics contains metrics exposed by this package.
    17  type Metrics struct {
    18  	// Time between BeginBlock and EndBlock.
    19  	BlockProcessingTime metrics.Histogram
    20  	// Time gauge between BeginBlock and EndBlock.
    21  	BlockExecutionTime metrics.Gauge
    22  	// Time of commit
    23  	BlockCommitTime metrics.Gauge
    24  	// Time of app commit
    25  	BlockAppCommitTime metrics.Gauge
    26  	// Time of update mempool
    27  	BlockUpdateMempoolTime metrics.Gauge
    28  }
    29  
    30  // PrometheusMetrics returns Metrics build using Prometheus client library.
    31  // Optionally, labels can be provided along with their values ("foo",
    32  // "fooValue").
    33  func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics {
    34  	labels := []string{}
    35  	for i := 0; i < len(labelsAndValues); i += 2 {
    36  		labels = append(labels, labelsAndValues[i])
    37  	}
    38  	compositeBuckets := stdprometheus.LinearBuckets(20, 20, 5)
    39  	compositeBuckets = append(compositeBuckets, stdprometheus.LinearBuckets(200, 100, 4)...)
    40  	compositeBuckets = append(compositeBuckets, stdprometheus.LinearBuckets(1000, 500, 4)...)
    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:   compositeBuckets,
    49  		}, labels).With(labelsAndValues...),
    50  		BlockExecutionTime: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    51  			Namespace: namespace,
    52  			Subsystem: MetricsSubsystem,
    53  			Name:      "block_execution_time",
    54  			Help:      "Time between BeginBlock and EndBlock in ms.",
    55  		}, labels).With(labelsAndValues...),
    56  		BlockCommitTime: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    57  			Namespace: namespace,
    58  			Subsystem: MetricsSubsystem,
    59  			Name:      "block_commit_time",
    60  			Help:      "Time of commit in ms.",
    61  		}, labels).With(labelsAndValues...),
    62  		BlockAppCommitTime: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    63  			Namespace: namespace,
    64  			Subsystem: MetricsSubsystem,
    65  			Name:      "block_app_commit_time",
    66  			Help:      "Time of app commit in ms.",
    67  		}, labels).With(labelsAndValues...),
    68  		BlockUpdateMempoolTime: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{
    69  			Namespace: namespace,
    70  			Subsystem: MetricsSubsystem,
    71  			Name:      "block_update_mempool_time",
    72  			Help:      "Time of update mempool in ms.",
    73  		}, labels).With(labelsAndValues...),
    74  	}
    75  }
    76  
    77  // NopMetrics returns no-op Metrics.
    78  func NopMetrics() *Metrics {
    79  	return &Metrics{
    80  		BlockProcessingTime:    discard.NewHistogram(),
    81  		BlockExecutionTime:     discard.NewGauge(),
    82  		BlockCommitTime:        discard.NewGauge(),
    83  		BlockAppCommitTime:     discard.NewGauge(),
    84  		BlockUpdateMempoolTime: discard.NewGauge(),
    85  	}
    86  }