From 43970a0caddd980501872c0d4bc39044955378b1 Mon Sep 17 00:00:00 2001
From: Angelo Capossele <angelocapossele@gmail.com>
Date: Fri, 26 Jun 2020 17:04:35 +0100
Subject: [PATCH] Make the payload registry also take in names for the
 different payloads (#557)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

* 🎨 Add object name to the payload registry

* 💡 Add comment

* ♻️ Make ObjectName exported

* 📈 Update Grafana dashboard
---
 dapps/faucet/packages/payload/payload.go      |  7 ++++-
 dapps/networkdelay/object.go                  |  7 ++++-
 .../packages/payload/payload.go               |  7 ++++-
 packages/binary/drng/payload/payload.go       |  7 ++++-
 .../binary/messagelayer/payload/payload.go    |  7 ++++-
 .../messagelayer/payload/type_register.go     | 29 +++++++++++++++----
 plugins/prometheus/tangle.go                  | 15 +---------
 .../grafana/dashboards/local_dashboard.json   | 12 ++++++--
 .../grafana/dashboards/local_dashboard.json   | 12 ++++++--
 9 files changed, 73 insertions(+), 30 deletions(-)

diff --git a/dapps/faucet/packages/payload/payload.go b/dapps/faucet/packages/payload/payload.go
index 441e892f..264aa311 100644
--- a/dapps/faucet/packages/payload/payload.go
+++ b/dapps/faucet/packages/payload/payload.go
@@ -9,6 +9,11 @@ import (
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload"
 )
 
+const (
+	// ObjectName defines the name of the facuet object.
+	ObjectName = "faucet"
+)
+
 // Payload represents a request which contains an address for the faucet to send funds to.
 type Payload struct {
 	payloadType payload.Type
@@ -27,7 +32,7 @@ func New(addr address.Address) *Payload {
 }
 
 func init() {
-	payload.RegisterType(Type, GenericPayloadUnmarshalerFactory(Type))
+	payload.RegisterType(Type, ObjectName, GenericPayloadUnmarshalerFactory(Type))
 }
 
 // FromBytes parses the marshaled version of a Payload into an object.
diff --git a/dapps/networkdelay/object.go b/dapps/networkdelay/object.go
index 5b413690..40e45947 100644
--- a/dapps/networkdelay/object.go
+++ b/dapps/networkdelay/object.go
@@ -9,6 +9,11 @@ import (
 	"github.com/mr-tron/base58"
 )
 
+const (
+	// ObjectName defines the name of the networkdelay object.
+	ObjectName = "networkdelay"
+)
+
 // ID represents a 32 byte ID of a network delay object.
 type ID [32]byte
 
@@ -145,7 +150,7 @@ func (o *Object) Unmarshal(data []byte) (err error) {
 }
 
 func init() {
-	payload.RegisterType(Type, func(data []byte) (payload payload.Payload, err error) {
+	payload.RegisterType(Type, ObjectName, func(data []byte) (payload payload.Payload, err error) {
 		payload = &Object{}
 		err = payload.Unmarshal(data)
 
diff --git a/dapps/valuetransfers/packages/payload/payload.go b/dapps/valuetransfers/packages/payload/payload.go
index e121327f..7ad1ffe3 100644
--- a/dapps/valuetransfers/packages/payload/payload.go
+++ b/dapps/valuetransfers/packages/payload/payload.go
@@ -12,6 +12,11 @@ import (
 	"github.com/iotaledger/goshimmer/packages/binary/messagelayer/payload"
 )
 
+const (
+	// ObjectName defines the name of the value object.
+	ObjectName = "value"
+)
+
 // Payload represents the entity that forms the Tangle by referencing other Payloads using their trunk and branch.
 // A Payload contains a transaction and defines, where in the Tangle a transaction is attached.
 type Payload struct {
@@ -253,7 +258,7 @@ func (payload *Payload) Unmarshal(data []byte) (err error) {
 }
 
 func init() {
-	payload.RegisterType(Type, func(data []byte) (payload payload.Payload, err error) {
+	payload.RegisterType(Type, ObjectName, func(data []byte) (payload payload.Payload, err error) {
 		payload, _, err = FromBytes(data)
 
 		return
diff --git a/packages/binary/drng/payload/payload.go b/packages/binary/drng/payload/payload.go
index bbbdaafd..fe9768f7 100644
--- a/packages/binary/drng/payload/payload.go
+++ b/packages/binary/drng/payload/payload.go
@@ -9,6 +9,11 @@ import (
 	"github.com/iotaledger/hive.go/stringify"
 )
 
+const (
+	// ObjectName defines the name of the dRNG object.
+	ObjectName = "dRNG"
+)
+
 // Payload defines a DRNG payload.
 type Payload struct {
 	header.Header
@@ -140,7 +145,7 @@ func (payload *Payload) Unmarshal(data []byte) (err error) {
 }
 
 func init() {
-	payload.RegisterType(Type, func(data []byte) (payload payload.Payload, err error) {
+	payload.RegisterType(Type, ObjectName, func(data []byte) (payload payload.Payload, err error) {
 		payload = &Payload{}
 		err = payload.Unmarshal(data)
 
diff --git a/packages/binary/messagelayer/payload/payload.go b/packages/binary/messagelayer/payload/payload.go
index f0f013e6..f70f8757 100644
--- a/packages/binary/messagelayer/payload/payload.go
+++ b/packages/binary/messagelayer/payload/payload.go
@@ -4,11 +4,16 @@ import (
 	"github.com/iotaledger/hive.go/marshalutil"
 )
 
+const (
+	// ObjectName defines the name of the data object.
+	ObjectName = "data"
+)
+
 func init() {
 	// register the generic unmarshaler
 	SetGenericUnmarshalerFactory(GenericPayloadUnmarshalerFactory)
 	// register the generic data payload type
-	RegisterType(DataType, GenericPayloadUnmarshalerFactory(DataType))
+	RegisterType(DataType, ObjectName, GenericPayloadUnmarshalerFactory(DataType))
 }
 
 // Payload represents some kind of payload of data which only gains meaning by having
diff --git a/packages/binary/messagelayer/payload/type_register.go b/packages/binary/messagelayer/payload/type_register.go
index 6549879a..eb22e51e 100644
--- a/packages/binary/messagelayer/payload/type_register.go
+++ b/packages/binary/messagelayer/payload/type_register.go
@@ -7,16 +7,25 @@ import (
 // Unmarshaler takes some data and unmarshals it into a payload.
 type Unmarshaler func(data []byte) (Payload, error)
 
+// Definition defines the properties of a payload type.
+type Definition struct {
+	Name string
+	Unmarshaler
+}
+
 var (
-	typeRegister              = make(map[Type]Unmarshaler)
+	typeRegister              = make(map[Type]Definition)
 	typeRegisterMutex         sync.RWMutex
 	genericUnmarshalerFactory func(payloadType Type) Unmarshaler
 )
 
 // RegisterType registers a payload type with the given unmarshaler.
-func RegisterType(payloadType Type, unmarshaler Unmarshaler) {
+func RegisterType(payloadType Type, payloadName string, unmarshaler Unmarshaler) {
 	typeRegisterMutex.Lock()
-	typeRegister[payloadType] = unmarshaler
+	typeRegister[payloadType] = Definition{
+		Name:        payloadName,
+		Unmarshaler: unmarshaler,
+	}
 	typeRegisterMutex.Unlock()
 }
 
@@ -25,8 +34,8 @@ func RegisterType(payloadType Type, unmarshaler Unmarshaler) {
 func GetUnmarshaler(payloadType Type) Unmarshaler {
 	typeRegisterMutex.RLock()
 	defer typeRegisterMutex.RUnlock()
-	if unmarshaler, exists := typeRegister[payloadType]; exists {
-		return unmarshaler
+	if definition, exists := typeRegister[payloadType]; exists {
+		return definition.Unmarshaler
 	}
 	return genericUnmarshalerFactory(payloadType)
 }
@@ -35,3 +44,13 @@ func GetUnmarshaler(payloadType Type) Unmarshaler {
 func SetGenericUnmarshalerFactory(unmarshalerFactory func(payloadType Type) Unmarshaler) {
 	genericUnmarshalerFactory = unmarshalerFactory
 }
+
+// Name returns the name of a given payload type.
+func Name(payloadType Type) string {
+	typeRegisterMutex.RLock()
+	defer typeRegisterMutex.RUnlock()
+	if definition, exists := typeRegister[payloadType]; exists {
+		return definition.Name
+	}
+	return ObjectName
+}
diff --git a/plugins/prometheus/tangle.go b/plugins/prometheus/tangle.go
index f0d15536..ccf33cc1 100644
--- a/plugins/prometheus/tangle.go
+++ b/plugins/prometheus/tangle.go
@@ -57,22 +57,9 @@ func collectTangleMetrics() {
 	messageTips.Set(float64(metrics.MessageTips()))
 	msgCountPerPayload := metrics.MessageCountPerPayload()
 	for payloadType, count := range msgCountPerPayload {
-		messagePerTypeCount.WithLabelValues(convertPayloadTypeToString(payloadType)).Set(float64(count))
+		messagePerTypeCount.WithLabelValues(payload.Name(payloadType)).Set(float64(count))
 	}
 	messageTotalCount.Set(float64(metrics.MessageTotalCount()))
 	transactionCounter.Set(float64(metrics.ValueTransactionCounter()))
 	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/grafana/dashboards/local_dashboard.json b/tools/docker-network/grafana/dashboards/local_dashboard.json
index cc4ae205..7e4d3cb1 100644
--- a/tools/docker-network/grafana/dashboards/local_dashboard.json
+++ b/tools/docker-network/grafana/dashboards/local_dashboard.json
@@ -486,14 +486,20 @@
         {
           "expr": "irate(tangle_messages_per_type_count{message_type=\"drng\"}[5m])",
           "interval": "",
-          "legendFormat": "DRNG Message Per Second",
+          "legendFormat": "dRNG Messages Per Second",
           "refId": "C"
         },
         {
-          "expr": "irate(tangle_messages_per_type_count{message_type=\"unknown\"}[5m])",
+          "expr": "irate(tangle_messages_per_type_count{message_type=\"faucet\"}[5m])",
           "interval": "",
-          "legendFormat": "Unknown Type Message Per Second",
+          "legendFormat": "Faucet Messages Per Second",
           "refId": "D"
+        },
+        {
+          "expr": "irate(tangle_messages_per_type_count{message_type=\"netowrkdelay\"}[5m])",
+          "interval": "",
+          "legendFormat": "Network Delay Messages Per Second",
+          "refId": "E"
         }
       ],
       "thresholds": [],
diff --git a/tools/monitoring/grafana/dashboards/local_dashboard.json b/tools/monitoring/grafana/dashboards/local_dashboard.json
index cc4ae205..7e4d3cb1 100755
--- a/tools/monitoring/grafana/dashboards/local_dashboard.json
+++ b/tools/monitoring/grafana/dashboards/local_dashboard.json
@@ -486,14 +486,20 @@
         {
           "expr": "irate(tangle_messages_per_type_count{message_type=\"drng\"}[5m])",
           "interval": "",
-          "legendFormat": "DRNG Message Per Second",
+          "legendFormat": "dRNG Messages Per Second",
           "refId": "C"
         },
         {
-          "expr": "irate(tangle_messages_per_type_count{message_type=\"unknown\"}[5m])",
+          "expr": "irate(tangle_messages_per_type_count{message_type=\"faucet\"}[5m])",
           "interval": "",
-          "legendFormat": "Unknown Type Message Per Second",
+          "legendFormat": "Faucet Messages Per Second",
           "refId": "D"
+        },
+        {
+          "expr": "irate(tangle_messages_per_type_count{message_type=\"netowrkdelay\"}[5m])",
+          "interval": "",
+          "legendFormat": "Network Delay Messages Per Second",
+          "refId": "E"
         }
       ],
       "thresholds": [],
-- 
GitLab