github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/module/metrics/mempool.go (about) 1 package metrics 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/prometheus/client_golang/prometheus" 8 "github.com/prometheus/client_golang/prometheus/promauto" 9 10 "github.com/onflow/flow-go/engine" 11 "github.com/onflow/flow-go/module" 12 ) 13 14 type MempoolCollector struct { 15 unit *engine.Unit 16 entries *prometheus.GaugeVec 17 interval time.Duration 18 delay time.Duration 19 entriesFuncs map[string]module.EntriesFunc // keeps map of registered EntriesFunc of mempools 20 } 21 22 func NewMempoolCollector(interval time.Duration) *MempoolCollector { 23 24 mc := &MempoolCollector{ 25 unit: engine.NewUnit(), 26 interval: interval, 27 delay: 0, 28 entriesFuncs: make(map[string]module.EntriesFunc), 29 30 entries: promauto.NewGaugeVec(prometheus.GaugeOpts{ 31 Name: "entries_total", 32 Namespace: namespaceStorage, 33 Subsystem: subsystemMempool, 34 Help: "the number of entries in the mempool", 35 }, []string{LabelResource}), 36 } 37 38 return mc 39 } 40 41 func (mc *MempoolCollector) MempoolEntries(resource string, entries uint) { 42 mc.entries.With(prometheus.Labels{LabelResource: resource}).Set(float64(entries)) 43 } 44 45 // Register registers entriesFunc for a resource 46 func (mc *MempoolCollector) Register(resource string, entriesFunc module.EntriesFunc) error { 47 mc.unit.Lock() 48 defer mc.unit.Unlock() 49 50 if _, ok := mc.entriesFuncs[resource]; ok { 51 return fmt.Errorf("cannot register resource, already exists: %s", resource) 52 } 53 54 mc.entriesFuncs[resource] = entriesFunc 55 56 return nil 57 } 58 59 func (mc *MempoolCollector) Ready() <-chan struct{} { 60 mc.unit.LaunchPeriodically(mc.gaugeEntries, mc.interval, mc.delay) 61 return mc.unit.Ready() 62 } 63 64 func (mc *MempoolCollector) Done() <-chan struct{} { 65 66 return mc.unit.Done() 67 } 68 69 // gaugeEntries iterates over the registered entries functions 70 // and calls MempoolEntries on them to capture the size of registered mempools 71 func (mc *MempoolCollector) gaugeEntries() { 72 for r, f := range mc.entriesFuncs { 73 mc.MempoolEntries(r, f()) 74 } 75 }