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 }