From 1f33419a4726d3741ba4bd0eb773cb3f88d49743 Mon Sep 17 00:00:00 2001
From: Levente Pap <levente.pap@iota.org>
Date: Wed, 17 Jun 2020 16:12:56 +0200
Subject: [PATCH] =?UTF-8?q?=F0=9F=93=88=20Prometheus=20Tangle=20metrics=20?=
 =?UTF-8?q?data=20collection?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 plugins/prometheus/local_metrics.go     |  25 ------
 plugins/prometheus/tangle.go            | 101 ++++++++++++++++++++++++
 tools/docker-network/docker-compose.yml |   2 +-
 3 files changed, 102 insertions(+), 26 deletions(-)
 delete mode 100644 plugins/prometheus/local_metrics.go

diff --git a/plugins/prometheus/local_metrics.go b/plugins/prometheus/local_metrics.go
deleted file mode 100644
index 16840b96..00000000
--- a/plugins/prometheus/local_metrics.go
+++ /dev/null
@@ -1,25 +0,0 @@
-package prometheus
-
-import (
-	"github.com/iotaledger/goshimmer/plugins/metrics"
-	"github.com/prometheus/client_golang/prometheus"
-)
-
-var (
-	messagesPerSecond prometheus.Gauge
-)
-
-func init() {
-	messagesPerSecond = prometheus.NewGauge(prometheus.GaugeOpts{
-		Name: "iota_messages_per_second",
-		Help: "Number of messages per second.",
-	})
-
-	registry.MustRegister(messagesPerSecond)
-
-	addCollect(collectLocalMetrics)
-}
-
-func collectLocalMetrics() {
-	messagesPerSecond.Set(float64(metrics.MPS()))
-}
diff --git a/plugins/prometheus/tangle.go b/plugins/prometheus/tangle.go
index 7b1b4c03..dba459ef 100644
--- a/plugins/prometheus/tangle.go
+++ b/plugins/prometheus/tangle.go
@@ -1 +1,102 @@
 package prometheus
+
+import (
+	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload"
+	"github.com/iotaledger/goshimmer/plugins/metrics"
+	"github.com/prometheus/client_golang/prometheus"
+)
+
+var (
+	messagesPerSecond prometheus.Gauge
+	messagePerSecondPerPayload *prometheus.GaugeVec
+	messageTips prometheus.Gauge
+	messageCount *prometheus.GaugeVec
+	messageTotalCount prometheus.Gauge
+
+	transactionsPerSecond prometheus.Gauge
+	valueTips prometheus.Gauge
+)
+
+func init() {
+	messagesPerSecond = prometheus.NewGauge(prometheus.GaugeOpts{
+		Name: "tangle_messages_per_second",
+		Help: "Number of messages per second.",
+	})
+
+	// TODO: look into why not work
+	messagePerSecondPerPayload = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "tangle_messages_per_second_per_payload",
+			Help: " message payload types and their corresponding MPS values",
+		}, []string{
+			"message_type",
+		})
+
+	// TODO: look into why not work
+	messageTips = prometheus.NewGauge(prometheus.GaugeOpts{
+		Name: "tangle_message_tips_count",
+		Help: "Current number of tips in message tangle",
+	})
+
+	messageCount = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "tangle_messages_count",
+			Help: "number of messages seen since the start of the node",
+		}, []string{
+			"message_type",
+		})
+
+	messageTotalCount = prometheus.NewGauge(prometheus.GaugeOpts{
+		Name: "tangle_message_total_count",
+		Help: "total number of messages seen since the start of the node",
+	})
+
+	transactionsPerSecond = prometheus.NewGauge(prometheus.GaugeOpts{
+		Name: "tangle_value_transaction_per_second",
+		Help: "current transactions (value payloads) per second number",
+	})
+
+	valueTips = prometheus.NewGauge(prometheus.GaugeOpts{
+		Name: "tangle_value_tips",
+		Help: "current number of tips in the value tangle",
+	})
+
+	registry.MustRegister(messagesPerSecond)
+	registry.MustRegister(messagePerSecondPerPayload)
+	registry.MustRegister(messageTips)
+	registry.MustRegister(messageCount)
+	registry.MustRegister(messageTotalCount)
+	registry.MustRegister(transactionsPerSecond)
+	registry.MustRegister(valueTips)
+
+	addCollect(collectTangleMetrics)
+}
+
+func collectTangleMetrics() {
+	messagesPerSecond.Set(float64(metrics.MPS()))
+	msgMPSPerPayload := metrics.MPSPerPayload()
+	for payloadType, mps := range msgMPSPerPayload {
+		messagePerSecondPerPayload.WithLabelValues(convertPayloadTypeToString(payloadType)).Set(float64(mps))
+	}
+	messageTips.Set(float64(metrics.MessageTips()))
+	msgCountPerPayload := metrics.MessageCountPerPayload()
+	for payloadType, count := range msgCountPerPayload {
+		messageCount.WithLabelValues(convertPayloadTypeToString(payloadType)).Set(float64(count))
+	}
+	messageTotalCount.Set(float64(metrics.MessageTotalCount()))
+	transactionsPerSecond.Set(float64(metrics.TPS()))
+	valueTips.Set(float64(metrics.ValueTips()))
+}
+
+func convertPayloadTypeToString(p payload.Type) string {
+	switch p {
+	case 0:
+		return "data"
+	case 1:
+		return "value"
+	case 111:
+		return "drng"
+	default:
+		return "unknown"
+	}
+}
diff --git a/tools/docker-network/docker-compose.yml b/tools/docker-network/docker-compose.yml
index 14115a55..467efcc7 100644
--- a/tools/docker-network/docker-compose.yml
+++ b/tools/docker-network/docker-compose.yml
@@ -86,7 +86,7 @@ services:
     - 3000:3000
     user: "104"
     volumes:
-    - ./grafana:/var/lib/grafana
+    - ./grafana:/var/lib/grafana:rw
     # environment:
     #   - GF_SECURITY_ADMIN_PASSWORD=MYPASSWORD
     #   - GF_USERS_ALLOW_SIGN_UP=false
-- 
GitLab