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 (
// 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)
}
......@@ -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) {
......
......@@ -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
......
......@@ -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()))
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment