diff --git a/plugins/metrics/message.go b/plugins/metrics/message.go index 94e1b42125c17f382562d26a50494faf84e1635b..f2e0cc821c37f8c744ea3f90d642df09dd7c7ba4 100644 --- a/plugins/metrics/message.go +++ b/plugins/metrics/message.go @@ -12,11 +12,25 @@ var ( // Total number of processed messages since start of the node. messageTotalCount atomic.Uint64 - // Current number of solid messages in the node's database. - messageSolidCount atomic.Uint64 + // current number of solid messages in the node's database + messageSolidCountDBIter atomic.Uint64 - messageTotalCountDB atomic.Uint64 + // current number of solid messages in the node's database + messageSolidCountDBInc atomic.Uint64 + // number of solid messages in the database at startup + initialMessageSolidCountDB atomic.Uint64 + + // current number of messages in the node's database + messageTotalCountDBIter atomic.Uint64 + + // current number of messages in the node's database + messageTotalCountDBInc atomic.Uint64 + + // number of messages in the database at startup + initialMessageTotalCountDB atomic.Uint64 + + // average time it takes to solidify a message avgSolidificationTime atomic.Float64 // current number of message tips. @@ -40,13 +54,13 @@ var ( ////// Exported functions to obtain metrics from outside ////// -// MessageTotalCount returns the total number of messages seen since the start of the node. -func MessageTotalCount() uint64 { +// MessageTotalCountSinceStart returns the total number of messages seen since the start of the node. +func MessageTotalCountSinceStart() uint64 { return messageTotalCount.Load() } -// MessageCountPerPayload returns a map of message payload types and their count since the start of the node. -func MessageCountPerPayload() map[payload.Type]uint64 { +// MessageCountSinceStartPerPayload returns a map of message payload types and their count since the start of the node. +func MessageCountSinceStartPerPayload() map[payload.Type]uint64 { messageCountPerPayloadMutex.RLock() defer messageCountPerPayloadMutex.RUnlock() @@ -69,14 +83,24 @@ func MessageRequestQueueSize() int64 { return requestQueueSize.Load() } -// MessageSolidCount returns the number of messages that are solid. -func MessageSolidCount() uint64 { - return messageSolidCount.Load() +// MessageSolidCountIter returns the number of messages that are solid. +func MessageSolidCountIter() uint64 { + return messageSolidCountDBIter.Load() +} + +// MessageTotalCountDBIter returns the number of messages that are stored in the DB. +func MessageTotalCountDBIter() uint64 { + return messageTotalCountDBIter.Load() } -// MessageTotalCountDB returns the number of messages that are stored in the DB. -func MessageTotalCountDB() uint64 { - return messageTotalCountDB.Load() +// MessageSolidCountInc returns the number of messages that are solid. +func MessageSolidCountInc() uint64 { + return initialMessageSolidCountDB.Load() + messageSolidCountDBInc.Load() +} + +// MessageTotalCountDBInc returns the number of messages that are stored in the DB. +func MessageTotalCountDBInc() uint64 { + return initialMessageTotalCountDB.Load() + messageTotalCountDBInc.Load() } // AvgSolidificationTime returns the average time it takes for a message to become solid. @@ -84,6 +108,11 @@ func AvgSolidificationTime() float64 { return avgSolidificationTime.Load() } +// ReceivedMessagesPerSecond retrieves the current messages per second number. +func ReceivedMessagesPerSecond() uint64 { + return measuredReceivedMPS.Load() +} + ////// Handling data updates and measuring ////// func increasePerPayloadCounter(p payload.Type) { @@ -99,11 +128,6 @@ func measureMessageTips() { metrics.Events().MessageTips.Trigger((uint64)(messagelayer.TipSelector().TipCount())) } -// ReceivedMessagesPerSecond retrieves the current messages per second number. -func ReceivedMessagesPerSecond() uint64 { - return measuredReceivedMPS.Load() -} - // increases the received MPS counter func increaseReceivedMPSCounter() { mpsReceivedSinceLastMeasurement.Inc() @@ -131,7 +155,14 @@ func measureRequestQueueSize() { func measureDBStats() { solid, total, avgSolidTime := messagelayer.Tangle().DBStats() - messageSolidCount.Store(uint64(solid)) - messageTotalCountDB.Store(uint64(total)) + messageSolidCountDBIter.Store(uint64(solid)) + messageTotalCountDBIter.Store(uint64(total)) + avgSolidificationTime.Store(avgSolidTime) +} + +func measureInitialDBStats() { + solid, total, avgSolidTime := messagelayer.Tangle().DBStats() + initialMessageSolidCountDB.Store(uint64(solid)) + initialMessageTotalCountDB.Store(uint64(total)) avgSolidificationTime.Store(avgSolidTime) } diff --git a/plugins/metrics/message_test.go b/plugins/metrics/message_test.go index bdf7925a2a2cc979ca13dc62ed831423ccf1afa4..500322be1921695aba417558f7cff6c23685d9c8 100644 --- a/plugins/metrics/message_test.go +++ b/plugins/metrics/message_test.go @@ -15,19 +15,19 @@ import ( func TestMessageCountPerPayload(t *testing.T) { // it is empty initially - assert.Equal(t, MessageTotalCount(), (uint64)(0)) + assert.Equal(t, MessageTotalCountSinceStart(), (uint64)(0)) // simulate attaching 10 value payloads in 0s < t < 1s for i := 0; i < 10; i++ { increasePerPayloadCounter(valuepayload.Type) } - assert.Equal(t, MessageTotalCount(), (uint64)(10)) - assert.Equal(t, MessageCountPerPayload(), map[payload.Type]uint64{valuepayload.Type: 10}) + assert.Equal(t, MessageTotalCountSinceStart(), (uint64)(10)) + assert.Equal(t, MessageCountSinceStartPerPayload(), map[payload.Type]uint64{valuepayload.Type: 10}) // simulate attaching 5 drng payloads for i := 0; i < 5; i++ { increasePerPayloadCounter(drngpayload.Type) } - assert.Equal(t, MessageTotalCount(), (uint64)(15)) - assert.Equal(t, MessageCountPerPayload(), map[payload.Type]uint64{valuepayload.Type: 10, drngpayload.Type: 5}) + assert.Equal(t, MessageTotalCountSinceStart(), (uint64)(15)) + assert.Equal(t, MessageCountSinceStartPerPayload(), map[payload.Type]uint64{valuepayload.Type: 10, drngpayload.Type: 5}) } func TestMessageTips(t *testing.T) { diff --git a/plugins/metrics/plugin.go b/plugins/metrics/plugin.go index 7c1449c71b4ed4170c577f65b54359389022e672..b31443bb96afa58cd9291a4496244593ba787c28 100644 --- a/plugins/metrics/plugin.go +++ b/plugins/metrics/plugin.go @@ -49,6 +49,8 @@ func configure(_ *node.Plugin) { func run(_ *node.Plugin) { log.Infof("Starting %s ...", PluginName) if config.Node().GetBool(CfgMetricsLocal) { + // initial measurement + measureInitialDBStats() registerLocalMetrics() } @@ -108,6 +110,20 @@ func registerLocalMetrics() { cachedMessageMetadata.Release() increaseReceivedMPSCounter() increasePerPayloadCounter(_payloadType) + // MessageAttached is triggered in storeMessageWorker that saves the msg to database + messageTotalCountDBInc.Inc() + + })) + + messagelayer.Tangle().Events.MessageRemoved.Attach(events.NewClosure(func(messageId message.Id) { + // MessageRemoved triggered when the message get removed from database. + messageTotalCountDBInc.Dec() + })) + + messagelayer.Tangle().Events.MessageSolid.Attach(events.NewClosure(func(cachedMessage *message.CachedMessage, cachedMessageMetadata *tangle.CachedMessageMetadata) { + cachedMessage.Release() + cachedMessageMetadata.Release() + messageSolidCountDBInc.Inc() })) // Value payload attached diff --git a/plugins/prometheus/tangle.go b/plugins/prometheus/tangle.go index 944431338d4c14ee773a99c69a1b00ee7ca731dc..6a9c7b9c638b369e5680f2cc72b540c6ab60d2f9 100644 --- a/plugins/prometheus/tangle.go +++ b/plugins/prometheus/tangle.go @@ -7,13 +7,15 @@ import ( ) var ( - messageTips prometheus.Gauge - messagePerTypeCount *prometheus.GaugeVec - messageTotalCount prometheus.Gauge - messageTotalCountDB prometheus.Gauge - messageSolidCount prometheus.Gauge - avgSolidificationTime prometheus.Gauge - messageRequestCount prometheus.Gauge + messageTips prometheus.Gauge + messagePerTypeCount *prometheus.GaugeVec + messageTotalCount prometheus.Gauge + messageTotalCountDBIter prometheus.Gauge + messageTotalCountDBInc prometheus.Gauge + messageSolidCountDBIter prometheus.Gauge + messageSolidCountDBInc prometheus.Gauge + avgSolidificationTime prometheus.Gauge + messageRequestCount prometheus.Gauge transactionCounter prometheus.Gauge valueTips prometheus.Gauge @@ -38,13 +40,23 @@ func registerTangleMetrics() { Help: "total number of messages seen since the start of the node", }) - messageTotalCountDB = prometheus.NewGauge(prometheus.GaugeOpts{ - Name: "tangle_message_total_count_db", + messageTotalCountDBIter = prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tangle_message_total_count_db_iter", Help: "total number of messages in the node's database", }) - messageSolidCount = prometheus.NewGauge(prometheus.GaugeOpts{ - Name: "tangle_message_solid_count", + messageTotalCountDBInc = prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tangle_message_total_count_db_inc", + Help: "total number of messages in the node's database", + }) + + messageSolidCountDBIter = prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tangle_message_solid_count_int", + Help: "number of solid messages on the node's database", + }) + + messageSolidCountDBInc = prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tangle_message_solid_count_inc", Help: "number of solid messages on the node's database", }) @@ -71,8 +83,10 @@ func registerTangleMetrics() { registry.MustRegister(messageTips) registry.MustRegister(messagePerTypeCount) registry.MustRegister(messageTotalCount) - registry.MustRegister(messageTotalCountDB) - registry.MustRegister(messageSolidCount) + registry.MustRegister(messageTotalCountDBIter) + registry.MustRegister(messageSolidCountDBIter) + registry.MustRegister(messageTotalCountDBInc) + registry.MustRegister(messageSolidCountDBInc) registry.MustRegister(avgSolidificationTime) registry.MustRegister(messageRequestCount) registry.MustRegister(transactionCounter) @@ -83,13 +97,15 @@ func registerTangleMetrics() { func collectTangleMetrics() { messageTips.Set(float64(metrics.MessageTips())) - msgCountPerPayload := metrics.MessageCountPerPayload() + msgCountPerPayload := metrics.MessageCountSinceStartPerPayload() for payloadType, count := range msgCountPerPayload { messagePerTypeCount.WithLabelValues(payload.Name(payloadType)).Set(float64(count)) } - messageTotalCount.Set(float64(metrics.MessageTotalCount())) - messageTotalCountDB.Set(float64(metrics.MessageTotalCountDB())) - messageSolidCount.Set(float64(metrics.MessageSolidCount())) + messageTotalCount.Set(float64(metrics.MessageTotalCountSinceStart())) + messageTotalCountDBIter.Set(float64(metrics.MessageTotalCountDBIter())) + messageSolidCountDBIter.Set(float64(metrics.MessageSolidCountIter())) + messageTotalCountDBInc.Set(float64(metrics.MessageTotalCountDBInc())) + messageSolidCountDBInc.Set(float64(metrics.MessageSolidCountInc())) avgSolidificationTime.Set(metrics.AvgSolidificationTime()) messageRequestCount.Set(float64(metrics.MessageRequestQueueSize())) transactionCounter.Set(float64(metrics.ValueTransactionCounter()))