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()))