Skip to content
Snippets Groups Projects
Commit 12176f3a authored by Levente Pap's avatar Levente Pap
Browse files

Compare iterative and incremental DBStat data collection

parent 7b84e672
No related branches found
No related tags found
No related merge requests found
...@@ -12,11 +12,25 @@ var ( ...@@ -12,11 +12,25 @@ var (
// Total number of processed messages since start of the node. // Total number of processed messages since start of the node.
messageTotalCount atomic.Uint64 messageTotalCount atomic.Uint64
// Current number of solid messages in the node's database. // current number of solid messages in the node's database
messageSolidCount atomic.Uint64 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 avgSolidificationTime atomic.Float64
// current number of message tips. // current number of message tips.
...@@ -40,13 +54,13 @@ var ( ...@@ -40,13 +54,13 @@ var (
////// Exported functions to obtain metrics from outside ////// ////// Exported functions to obtain metrics from outside //////
// MessageTotalCount returns the total number of messages seen since the start of the node. // MessageTotalCountSinceStart returns the total number of messages seen since the start of the node.
func MessageTotalCount() uint64 { func MessageTotalCountSinceStart() uint64 {
return messageTotalCount.Load() return messageTotalCount.Load()
} }
// MessageCountPerPayload returns a map of message payload types and their count since the start of the node. // MessageCountSinceStartPerPayload returns a map of message payload types and their count since the start of the node.
func MessageCountPerPayload() map[payload.Type]uint64 { func MessageCountSinceStartPerPayload() map[payload.Type]uint64 {
messageCountPerPayloadMutex.RLock() messageCountPerPayloadMutex.RLock()
defer messageCountPerPayloadMutex.RUnlock() defer messageCountPerPayloadMutex.RUnlock()
...@@ -69,14 +83,24 @@ func MessageRequestQueueSize() int64 { ...@@ -69,14 +83,24 @@ func MessageRequestQueueSize() int64 {
return requestQueueSize.Load() return requestQueueSize.Load()
} }
// MessageSolidCount returns the number of messages that are solid. // MessageSolidCountIter returns the number of messages that are solid.
func MessageSolidCount() uint64 { func MessageSolidCountIter() uint64 {
return messageSolidCount.Load() 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. // MessageSolidCountInc returns the number of messages that are solid.
func MessageTotalCountDB() uint64 { func MessageSolidCountInc() uint64 {
return messageTotalCountDB.Load() 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. // AvgSolidificationTime returns the average time it takes for a message to become solid.
...@@ -84,6 +108,11 @@ func AvgSolidificationTime() float64 { ...@@ -84,6 +108,11 @@ func AvgSolidificationTime() float64 {
return avgSolidificationTime.Load() return avgSolidificationTime.Load()
} }
// ReceivedMessagesPerSecond retrieves the current messages per second number.
func ReceivedMessagesPerSecond() uint64 {
return measuredReceivedMPS.Load()
}
////// Handling data updates and measuring ////// ////// Handling data updates and measuring //////
func increasePerPayloadCounter(p payload.Type) { func increasePerPayloadCounter(p payload.Type) {
...@@ -99,11 +128,6 @@ func measureMessageTips() { ...@@ -99,11 +128,6 @@ func measureMessageTips() {
metrics.Events().MessageTips.Trigger((uint64)(messagelayer.TipSelector().TipCount())) 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 // increases the received MPS counter
func increaseReceivedMPSCounter() { func increaseReceivedMPSCounter() {
mpsReceivedSinceLastMeasurement.Inc() mpsReceivedSinceLastMeasurement.Inc()
...@@ -131,7 +155,14 @@ func measureRequestQueueSize() { ...@@ -131,7 +155,14 @@ func measureRequestQueueSize() {
func measureDBStats() { func measureDBStats() {
solid, total, avgSolidTime := messagelayer.Tangle().DBStats() solid, total, avgSolidTime := messagelayer.Tangle().DBStats()
messageSolidCount.Store(uint64(solid)) messageSolidCountDBIter.Store(uint64(solid))
messageTotalCountDB.Store(uint64(total)) 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) avgSolidificationTime.Store(avgSolidTime)
} }
...@@ -15,19 +15,19 @@ import ( ...@@ -15,19 +15,19 @@ import (
func TestMessageCountPerPayload(t *testing.T) { func TestMessageCountPerPayload(t *testing.T) {
// it is empty initially // 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 // simulate attaching 10 value payloads in 0s < t < 1s
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
increasePerPayloadCounter(valuepayload.Type) increasePerPayloadCounter(valuepayload.Type)
} }
assert.Equal(t, MessageTotalCount(), (uint64)(10)) assert.Equal(t, MessageTotalCountSinceStart(), (uint64)(10))
assert.Equal(t, MessageCountPerPayload(), map[payload.Type]uint64{valuepayload.Type: 10}) assert.Equal(t, MessageCountSinceStartPerPayload(), map[payload.Type]uint64{valuepayload.Type: 10})
// simulate attaching 5 drng payloads // simulate attaching 5 drng payloads
for i := 0; i < 5; i++ { for i := 0; i < 5; i++ {
increasePerPayloadCounter(drngpayload.Type) increasePerPayloadCounter(drngpayload.Type)
} }
assert.Equal(t, MessageTotalCount(), (uint64)(15)) assert.Equal(t, MessageTotalCountSinceStart(), (uint64)(15))
assert.Equal(t, MessageCountPerPayload(), map[payload.Type]uint64{valuepayload.Type: 10, drngpayload.Type: 5}) assert.Equal(t, MessageCountSinceStartPerPayload(), map[payload.Type]uint64{valuepayload.Type: 10, drngpayload.Type: 5})
} }
func TestMessageTips(t *testing.T) { func TestMessageTips(t *testing.T) {
......
...@@ -49,6 +49,8 @@ func configure(_ *node.Plugin) { ...@@ -49,6 +49,8 @@ func configure(_ *node.Plugin) {
func run(_ *node.Plugin) { func run(_ *node.Plugin) {
log.Infof("Starting %s ...", PluginName) log.Infof("Starting %s ...", PluginName)
if config.Node().GetBool(CfgMetricsLocal) { if config.Node().GetBool(CfgMetricsLocal) {
// initial measurement
measureInitialDBStats()
registerLocalMetrics() registerLocalMetrics()
} }
...@@ -108,6 +110,20 @@ func registerLocalMetrics() { ...@@ -108,6 +110,20 @@ func registerLocalMetrics() {
cachedMessageMetadata.Release() cachedMessageMetadata.Release()
increaseReceivedMPSCounter() increaseReceivedMPSCounter()
increasePerPayloadCounter(_payloadType) 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 // Value payload attached
......
...@@ -7,13 +7,15 @@ import ( ...@@ -7,13 +7,15 @@ import (
) )
var ( var (
messageTips prometheus.Gauge messageTips prometheus.Gauge
messagePerTypeCount *prometheus.GaugeVec messagePerTypeCount *prometheus.GaugeVec
messageTotalCount prometheus.Gauge messageTotalCount prometheus.Gauge
messageTotalCountDB prometheus.Gauge messageTotalCountDBIter prometheus.Gauge
messageSolidCount prometheus.Gauge messageTotalCountDBInc prometheus.Gauge
avgSolidificationTime prometheus.Gauge messageSolidCountDBIter prometheus.Gauge
messageRequestCount prometheus.Gauge messageSolidCountDBInc prometheus.Gauge
avgSolidificationTime prometheus.Gauge
messageRequestCount prometheus.Gauge
transactionCounter prometheus.Gauge transactionCounter prometheus.Gauge
valueTips prometheus.Gauge valueTips prometheus.Gauge
...@@ -38,13 +40,23 @@ func registerTangleMetrics() { ...@@ -38,13 +40,23 @@ func registerTangleMetrics() {
Help: "total number of messages seen since the start of the node", Help: "total number of messages seen since the start of the node",
}) })
messageTotalCountDB = prometheus.NewGauge(prometheus.GaugeOpts{ messageTotalCountDBIter = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "tangle_message_total_count_db", Name: "tangle_message_total_count_db_iter",
Help: "total number of messages in the node's database", Help: "total number of messages in the node's database",
}) })
messageSolidCount = prometheus.NewGauge(prometheus.GaugeOpts{ messageTotalCountDBInc = prometheus.NewGauge(prometheus.GaugeOpts{
Name: "tangle_message_solid_count", 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", Help: "number of solid messages on the node's database",
}) })
...@@ -71,8 +83,10 @@ func registerTangleMetrics() { ...@@ -71,8 +83,10 @@ func registerTangleMetrics() {
registry.MustRegister(messageTips) registry.MustRegister(messageTips)
registry.MustRegister(messagePerTypeCount) registry.MustRegister(messagePerTypeCount)
registry.MustRegister(messageTotalCount) registry.MustRegister(messageTotalCount)
registry.MustRegister(messageTotalCountDB) registry.MustRegister(messageTotalCountDBIter)
registry.MustRegister(messageSolidCount) registry.MustRegister(messageSolidCountDBIter)
registry.MustRegister(messageTotalCountDBInc)
registry.MustRegister(messageSolidCountDBInc)
registry.MustRegister(avgSolidificationTime) registry.MustRegister(avgSolidificationTime)
registry.MustRegister(messageRequestCount) registry.MustRegister(messageRequestCount)
registry.MustRegister(transactionCounter) registry.MustRegister(transactionCounter)
...@@ -83,13 +97,15 @@ func registerTangleMetrics() { ...@@ -83,13 +97,15 @@ func registerTangleMetrics() {
func collectTangleMetrics() { func collectTangleMetrics() {
messageTips.Set(float64(metrics.MessageTips())) messageTips.Set(float64(metrics.MessageTips()))
msgCountPerPayload := metrics.MessageCountPerPayload() msgCountPerPayload := metrics.MessageCountSinceStartPerPayload()
for payloadType, count := range msgCountPerPayload { for payloadType, count := range msgCountPerPayload {
messagePerTypeCount.WithLabelValues(payload.Name(payloadType)).Set(float64(count)) messagePerTypeCount.WithLabelValues(payload.Name(payloadType)).Set(float64(count))
} }
messageTotalCount.Set(float64(metrics.MessageTotalCount())) messageTotalCount.Set(float64(metrics.MessageTotalCountSinceStart()))
messageTotalCountDB.Set(float64(metrics.MessageTotalCountDB())) messageTotalCountDBIter.Set(float64(metrics.MessageTotalCountDBIter()))
messageSolidCount.Set(float64(metrics.MessageSolidCount())) messageSolidCountDBIter.Set(float64(metrics.MessageSolidCountIter()))
messageTotalCountDBInc.Set(float64(metrics.MessageTotalCountDBInc()))
messageSolidCountDBInc.Set(float64(metrics.MessageSolidCountInc()))
avgSolidificationTime.Set(metrics.AvgSolidificationTime()) avgSolidificationTime.Set(metrics.AvgSolidificationTime())
messageRequestCount.Set(float64(metrics.MessageRequestQueueSize())) messageRequestCount.Set(float64(metrics.MessageRequestQueueSize()))
transactionCounter.Set(float64(metrics.ValueTransactionCounter())) transactionCounter.Set(float64(metrics.ValueTransactionCounter()))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment