github.com/Finschia/finschia-sdk@v0.48.1/store/cache/metrics.go (about) 1 package cache 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 = "inter_block_cache" 14 ) 15 16 // Metrics contains metrics exposed by this package. 17 type Metrics struct { 18 InterBlockCacheHits metrics.Counter 19 InterBlockCacheMisses metrics.Counter 20 InterBlockCacheEntries metrics.Gauge 21 InterBlockCacheBytes metrics.Gauge 22 } 23 24 // PrometheusMetrics returns Metrics build using Prometheus client library. 25 // Optionally, labels can be provided along with their values ("foo", 26 // "fooValue"). 27 func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics { 28 labels := []string{} 29 for i := 0; i < len(labelsAndValues); i += 2 { 30 labels = append(labels, labelsAndValues[i]) 31 } 32 return &Metrics{ 33 InterBlockCacheHits: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ 34 Namespace: namespace, 35 Subsystem: MetricsSubsystem, 36 Name: "hits", 37 Help: "Cache hits of the inter block cache", 38 }, labels).With(labelsAndValues...), 39 InterBlockCacheMisses: prometheus.NewCounterFrom(stdprometheus.CounterOpts{ 40 Namespace: namespace, 41 Subsystem: MetricsSubsystem, 42 Name: "misses", 43 Help: "Cache misses of the inter block cache", 44 }, labels).With(labelsAndValues...), 45 InterBlockCacheEntries: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ 46 Namespace: namespace, 47 Subsystem: MetricsSubsystem, 48 Name: "entries", 49 Help: "Cache entry count of the inter block cache", 50 }, labels).With(labelsAndValues...), 51 InterBlockCacheBytes: prometheus.NewGaugeFrom(stdprometheus.GaugeOpts{ 52 Namespace: namespace, 53 Subsystem: MetricsSubsystem, 54 Name: "bytes_size", 55 Help: "Cache bytes size of the inter block cache", 56 }, labels).With(labelsAndValues...), 57 } 58 } 59 60 // NopMetrics returns no-op Metrics. 61 func NopMetrics() *Metrics { 62 return &Metrics{ 63 InterBlockCacheHits: discard.NewCounter(), 64 InterBlockCacheMisses: discard.NewCounter(), 65 InterBlockCacheEntries: discard.NewGauge(), 66 InterBlockCacheBytes: discard.NewGauge(), 67 } 68 } 69 70 type MetricsProvider func() *Metrics 71 72 // PrometheusMetricsProvider returns PrometheusMetrics for each store 73 func PrometheusMetricsProvider(namespace string, labelsAndValues ...string) func() *Metrics { 74 return func() *Metrics { 75 return PrometheusMetrics(namespace, labelsAndValues...) 76 } 77 } 78 79 // NopMetricsProvider returns NopMetrics for each store 80 func NopMetricsProvider() func() *Metrics { 81 return func() *Metrics { 82 return NopMetrics() 83 } 84 }