From e68d3f27866428221f54f34606e89c24dd042274 Mon Sep 17 00:00:00 2001
From: Levente Pap <levente.pap@iota.org>
Date: Thu, 18 Jun 2020 12:06:38 +0200
Subject: [PATCH] Prometheus clients info

---
 .../metrics/{server.go => clients_info.go}    | 22 ++------
 plugins/prometheus/clients_info.go            | 56 +++++++++++++++----
 tools/integration-tests/tester/go.mod         |  2 +-
 tools/integration-tests/tester/go.sum         |  1 +
 4 files changed, 52 insertions(+), 29 deletions(-)
 rename plugins/metrics/{server.go => clients_info.go} (76%)

diff --git a/plugins/metrics/server.go b/plugins/metrics/clients_info.go
similarity index 76%
rename from plugins/metrics/server.go
rename to plugins/metrics/clients_info.go
index 3c3bc378..68327c15 100644
--- a/plugins/metrics/server.go
+++ b/plugins/metrics/clients_info.go
@@ -1,8 +1,6 @@
 package metrics
 
 import (
-	"bytes"
-	"encoding/gob"
 	"sync"
 
 	"github.com/iotaledger/goshimmer/plugins/analysis/packet"
@@ -35,23 +33,15 @@ var onMetricHeartbeatReceived = events.NewClosure(func(hb *packet.MetricHeartbea
 	}
 })
 
+// ClientsMetrics returns info about the OS, arch, number of cpu cores, cpu load and memory usage.
 func ClientsMetrics() map[string]ClientInfo {
 	clientsMetricsMutex.RLock()
 	defer clientsMetricsMutex.RUnlock()
-
-	var buf bytes.Buffer
-	enc := gob.NewEncoder(&buf)
-	err := enc.Encode(clientsMetrics)
-	if err != nil {
-		return nil
-	}
-
-	dec := gob.NewDecoder(&buf)
-	var copy map[string]ClientInfo
-	err = dec.Decode(&copy)
-	if err != nil {
-		return nil
+	// create copy of the map
+	var copy = make(map[string]ClientInfo)
+	// manually copy content
+	for node, clientInfo := range clientsMetrics {
+		copy[node] = clientInfo
 	}
-
 	return copy
 }
diff --git a/plugins/prometheus/clients_info.go b/plugins/prometheus/clients_info.go
index 44cbc205..5d213328 100644
--- a/plugins/prometheus/clients_info.go
+++ b/plugins/prometheus/clients_info.go
@@ -1,33 +1,65 @@
 package prometheus
 
 import (
+	"strconv"
+
+	"github.com/iotaledger/goshimmer/plugins/metrics"
 	"github.com/prometheus/client_golang/prometheus"
 )
 
 var (
-	clientsInfo *prometheus.GaugeVec
+	clientsInfoCPU    *prometheus.GaugeVec
+	clientsInfoMemory *prometheus.GaugeVec
 )
 
 func registerClientsMetrics() {
-	clientsInfo = prometheus.NewGaugeVec(
+	clientsInfoCPU = prometheus.NewGaugeVec(
 		prometheus.GaugeOpts{
-			Name: "clients_info",
-			Help: "Clients info.",
+			Name: "clients_info_cpu",
+			Help: "Info about client's cpu load labeled with nodeID, OS, ARCH and number of cpu cores",
+		},
+		[]string{
+			"nodeID",
+			"OS",
+			"ARCH",
+			"NUM_CPU",
 		},
-		[]string{"info"},
-		// []string{"OS", "ARCH", "NUM_CPU", "CPU_USAGE", "MEM_USAGE"},
 	)
 
-	// registry.MustRegister(clientsInfo)
+	clientsInfoMemory = prometheus.NewGaugeVec(
+		prometheus.GaugeOpts{
+			Name: "clients_info_mem",
+			Help: "Info about client's memory usage labeled with nodeID, OS, ARCH and number of cpu cores",
+		},
+		[]string{
+			"nodeID",
+			"OS",
+			"ARCH",
+			"NUM_CPU",
+		},
+	)
 
-	// collectClientsInfo()
+	registry.MustRegister(clientsInfoCPU)
+	registry.MustRegister(clientsInfoMemory)
 
-	// clientsInfo.WithLabelValues(banner.AppName, banner.AppVersion).Set(1)
+	addCollect(collectClientsInfo)
 }
 
 func collectClientsInfo() {
-	// for ID, info := range metrics.ClientsMetrics() {
-	// 	clientsInfo.WithLabelValues()
-	// }
+	clientInfoMap := metrics.ClientsMetrics()
 
+	for nodeID, clientInfo := range clientInfoMap {
+		clientsInfoCPU.WithLabelValues(
+			nodeID,
+			clientInfo.OS,
+			clientInfo.Arch,
+			strconv.Itoa(clientInfo.NumCPU),
+		).Set(clientInfo.CPUUsage)
+		clientsInfoMemory.WithLabelValues(
+			nodeID,
+			clientInfo.OS,
+			clientInfo.Arch,
+			strconv.Itoa(clientInfo.NumCPU),
+		).Set(float64(clientInfo.MemoryUsage))
+	}
 }
diff --git a/tools/integration-tests/tester/go.mod b/tools/integration-tests/tester/go.mod
index 315bbabd..3d3c6637 100644
--- a/tools/integration-tests/tester/go.mod
+++ b/tools/integration-tests/tester/go.mod
@@ -10,7 +10,7 @@ require (
 	github.com/docker/go-units v0.4.0 // indirect
 	github.com/drand/drand v0.8.1
 	github.com/iotaledger/goshimmer v0.1.3
-	github.com/iotaledger/hive.go v0.0.0-20200615181744-3ab0cddc15cf
+	github.com/iotaledger/hive.go v0.0.0-20200617164933-c48b4401b814
 	github.com/opencontainers/go-digest v1.0.0-rc1 // indirect
 	github.com/stretchr/testify v1.5.1
 )
diff --git a/tools/integration-tests/tester/go.sum b/tools/integration-tests/tester/go.sum
index 77eb420c..e971afa7 100644
--- a/tools/integration-tests/tester/go.sum
+++ b/tools/integration-tests/tester/go.sum
@@ -149,6 +149,7 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt
 github.com/iotaledger/hive.go v0.0.0-20200610104211-d603429af242 h1:uHMFmfrP6O6lp1lCHT6lpFwHFWYk77V0nUlGbhneQHI=
 github.com/iotaledger/hive.go v0.0.0-20200610104211-d603429af242/go.mod h1:zwZhaE4ZeglpTrbmbwdnVPMI5XdRu2RmByi3Qn0ztmU=
 github.com/iotaledger/hive.go v0.0.0-20200615181744-3ab0cddc15cf/go.mod h1:zwZhaE4ZeglpTrbmbwdnVPMI5XdRu2RmByi3Qn0ztmU=
+github.com/iotaledger/hive.go v0.0.0-20200617164933-c48b4401b814/go.mod h1:zwZhaE4ZeglpTrbmbwdnVPMI5XdRu2RmByi3Qn0ztmU=
 github.com/iotaledger/iota.go v1.0.0-beta.9/go.mod h1:F6WBmYd98mVjAmmPVYhnxg8NNIWCjjH8VWT9qvv3Rc8=
 github.com/iotaledger/iota.go v1.0.0-beta.14/go.mod h1:F6WBmYd98mVjAmmPVYhnxg8NNIWCjjH8VWT9qvv3Rc8=
 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
-- 
GitLab