From cbc1425de9c04247bbe3fcc2addc7f8b1502570c Mon Sep 17 00:00:00 2001
From: Sergey Yakubov <sergey.yakubov@desy.de>
Date: Wed, 28 Feb 2018 17:07:46 +0100
Subject: [PATCH] More work on monitoring, add integration test

---
 broker/src/hidra2_broker/server/server.go     |  8 +++--
 .../hidra2_broker/server/server_nottested.go  | 23 +++++++++++++-
 .../src/hidra2_broker/server/server_test.go   |  2 +-
 broker/src/hidra2_broker/server/statistics.go |  8 +++++
 ...istics_writer.go => statistics_writers.go} |  9 +++---
 broker/src/hidra2_broker/utils/helpers.go     |  1 +
 tests/broker/CMakeLists.txt                   |  3 ++
 tests/broker/check_monitoring/CMakeLists.txt  |  8 +++++
 tests/broker/check_monitoring/check_linux.sh  | 31 +++++++++++++++++++
 tests/broker/read_config/check_linux.sh       |  2 +-
 tests/broker/read_config/settings_bad.json    |  4 +--
 tests/settings/broker_settings.json           |  4 ++-
 12 files changed, 89 insertions(+), 14 deletions(-)
 rename broker/src/hidra2_broker/server/{statistics_writer.go => statistics_writers.go} (78%)
 create mode 100644 tests/broker/check_monitoring/CMakeLists.txt
 create mode 100644 tests/broker/check_monitoring/check_linux.sh

diff --git a/broker/src/hidra2_broker/server/server.go b/broker/src/hidra2_broker/server/server.go
index d517d373f..eadd2ba6b 100644
--- a/broker/src/hidra2_broker/server/server.go
+++ b/broker/src/hidra2_broker/server/server.go
@@ -7,8 +7,10 @@ import (
 var db database.Agent
 
 type serverSettings struct {
-	DbAddress string
-	Port      int
+	BrokerDbAddress string
+	MonitorDbAddress string
+	MonitorDbName string
+	Port            int
 }
 
 var settings serverSettings
@@ -16,7 +18,7 @@ var statistics serverStatistics
 
 func InitDB(dbAgent database.Agent) error {
 	db = dbAgent
-	return db.Connect(settings.DbAddress)
+	return db.Connect(settings.BrokerDbAddress)
 }
 
 func CleanupDB() {
diff --git a/broker/src/hidra2_broker/server/server_nottested.go b/broker/src/hidra2_broker/server/server_nottested.go
index e31a0d2df..39320081e 100644
--- a/broker/src/hidra2_broker/server/server_nottested.go
+++ b/broker/src/hidra2_broker/server/server_nottested.go
@@ -7,6 +7,7 @@ import (
 	"log"
 	"net/http"
 	"strconv"
+	"errors"
 )
 
 func StartStatistics() {
@@ -22,5 +23,25 @@ func Start() {
 }
 
 func ReadConfig(fname string) error {
-	return utils.ReadJsonFromFile(fname, &settings)
+	if err := utils.ReadJsonFromFile(fname, &settings); err != nil {
+		return err
+	}
+
+	if settings.BrokerDbAddress == "" {
+		return errors.New("BrokerDbAddress not set")
+	}
+
+	if settings.MonitorDbAddress == "" {
+		return errors.New("MonitorDbAddress not set")
+	}
+
+	if settings.Port == 0 {
+		return errors.New("Server port not set")
+	}
+
+	if settings.MonitorDbName == "" {
+		return errors.New("MonitorDbName not set")
+	}
+
+	return nil
 }
diff --git a/broker/src/hidra2_broker/server/server_test.go b/broker/src/hidra2_broker/server/server_test.go
index 9d6d3d730..baba3ed60 100644
--- a/broker/src/hidra2_broker/server/server_test.go
+++ b/broker/src/hidra2_broker/server/server_test.go
@@ -34,7 +34,7 @@ func TestInitDBWithWrongAddress(t *testing.T) {
 
 	mock_db.ExpectedCalls = nil
 
-	settings.DbAddress = "0.0.0.0:0000"
+	settings.BrokerDbAddress = "0.0.0.0:0000"
 
 	for _, test := range initDBTests {
 		mock_db.On("Connect", "0.0.0.0:0000").Return(test.answer)
diff --git a/broker/src/hidra2_broker/server/statistics.go b/broker/src/hidra2_broker/server/statistics.go
index 860c766ea..f0851ae33 100644
--- a/broker/src/hidra2_broker/server/statistics.go
+++ b/broker/src/hidra2_broker/server/statistics.go
@@ -4,6 +4,7 @@ import (
 	"fmt"
 	"log"
 	"time"
+	"sync"
 )
 
 type statisticsWriter interface {
@@ -12,18 +13,25 @@ type statisticsWriter interface {
 
 type serverStatistics struct {
 	counter int
+	mux sync.Mutex
 	Writer  statisticsWriter
 }
 
 func (st *serverStatistics) IncreaseCounter() {
+	st.mux.Lock()
+	defer st.mux.Unlock()
 	st.counter++
 }
 
 func (st *serverStatistics) GetCounter() int {
+	st.mux.Lock()
+	defer st.mux.Unlock()
 	return st.counter
 }
 
 func (st *serverStatistics) Reset() {
+	st.mux.Lock()
+	defer st.mux.Unlock()
 	st.counter = 0
 }
 
diff --git a/broker/src/hidra2_broker/server/statistics_writer.go b/broker/src/hidra2_broker/server/statistics_writers.go
similarity index 78%
rename from broker/src/hidra2_broker/server/statistics_writer.go
rename to broker/src/hidra2_broker/server/statistics_writers.go
index ffc619145..db6e46fb2 100644
--- a/broker/src/hidra2_broker/server/statistics_writer.go
+++ b/broker/src/hidra2_broker/server/statistics_writers.go
@@ -21,7 +21,7 @@ type StatisticInfluxDbWriter struct {
 
 func (writer *StatisticInfluxDbWriter) Write(statistics *serverStatistics) error {
 	c, err := client.NewHTTPClient(client.HTTPConfig{
-		Addr: "http://localhost:8086",
+		Addr: "http://"+ settings.MonitorDbAddress,
 	})
 	if err != nil {
 		return err
@@ -29,15 +29,14 @@ func (writer *StatisticInfluxDbWriter) Write(statistics *serverStatistics) error
 	defer c.Close()
 
 	bp, _ := client.NewBatchPoints(client.BatchPointsConfig{
-		Database:  "db",
-		Precision: "s",
+		Database:  settings.MonitorDbName,
 	})
 
-	//	tags := map[string]string{"rate": "rate-total"}
+	tags := map[string]string{"Group ID": "0"}
 	fields := map[string]interface{}{
 		"rate": statistics.GetCounter(),
 	}
-	pt, err := client.NewPoint("RequestsRate", nil, fields, time.Now())
+	pt, err := client.NewPoint("RequestsRate", tags, fields, time.Now())
 	if err != nil {
 		return err
 	}
diff --git a/broker/src/hidra2_broker/utils/helpers.go b/broker/src/hidra2_broker/utils/helpers.go
index 02bb46796..f1d0da4dc 100644
--- a/broker/src/hidra2_broker/utils/helpers.go
+++ b/broker/src/hidra2_broker/utils/helpers.go
@@ -33,5 +33,6 @@ func ReadJsonFromFile(fname string, config interface{}) error {
 	if err != nil {
 		return err
 	}
+
 	return nil
 }
diff --git a/tests/broker/CMakeLists.txt b/tests/broker/CMakeLists.txt
index c37417477..6f1685c7d 100644
--- a/tests/broker/CMakeLists.txt
+++ b/tests/broker/CMakeLists.txt
@@ -1,3 +1,6 @@
 add_subdirectory(get_next)
 add_subdirectory(read_config)
 
+if (UNIX)
+add_subdirectory(check_monitoring)
+endif()
\ No newline at end of file
diff --git a/tests/broker/check_monitoring/CMakeLists.txt b/tests/broker/check_monitoring/CMakeLists.txt
new file mode 100644
index 000000000..de66ca8b3
--- /dev/null
+++ b/tests/broker/check_monitoring/CMakeLists.txt
@@ -0,0 +1,8 @@
+set(TARGET_NAME hidra2-broker)
+
+################################
+# Testing
+################################
+configure_file(${CMAKE_SOURCE_DIR}/tests/settings/broker_settings.json settings.json COPYONLY)
+add_script_test("${TARGET_NAME}-monitoring" "$<TARGET_PROPERTY:${TARGET_NAME},EXENAME>" nomem
+        )
diff --git a/tests/broker/check_monitoring/check_linux.sh b/tests/broker/check_monitoring/check_linux.sh
new file mode 100644
index 000000000..9af764908
--- /dev/null
+++ b/tests/broker/check_monitoring/check_linux.sh
@@ -0,0 +1,31 @@
+#!/usr/bin/env bash
+
+database_name=db_test
+
+set -e
+
+trap Cleanup EXIT
+
+Cleanup() {
+	echo cleanup
+	influx -execute "drop database ${database_name}"
+	kill -9 $brokerid
+}
+
+influx -execute "create database ${database_name}"
+
+$@ settings.json &
+
+sleep 0.3
+
+brokerid=`echo $!`
+
+for i in `seq 1 50`;
+do
+    curl --silent 127.0.0.1:5005/database/data/next >/dev/null 2>&1 &
+done
+
+
+sleep 2
+
+influx -execute "select sum(rate) from RequestsRate" -database=${database_name} -format=json | jq .results[0].series[0].values[0][1] | grep 50
diff --git a/tests/broker/read_config/check_linux.sh b/tests/broker/read_config/check_linux.sh
index e491171a3..5b9e9c78c 100644
--- a/tests/broker/read_config/check_linux.sh
+++ b/tests/broker/read_config/check_linux.sh
@@ -9,7 +9,7 @@ brokerid=`echo $!`
 kill -9 $brokerid
 
 # check if gives error with bad json file
-$@ settings_bad.json 2>&1 | grep "invalid"
+$@ settings_bad.json 2>&1 | grep "not set"
 
 # check if gives error non-existing file
 $@ settings_notexist.json 2>&1 | grep "no such"
diff --git a/tests/broker/read_config/settings_bad.json b/tests/broker/read_config/settings_bad.json
index 01598594a..88157fb1b 100644
--- a/tests/broker/read_config/settings_bad.json
+++ b/tests/broker/read_config/settings_bad.json
@@ -1,4 +1,4 @@
 {
-  "dbaddress":"127.0.0.1:27017",
-  "port":
+  "BrokerDbAddres":"127.0.0.1:27017",
+  "port":12
 }
\ No newline at end of file
diff --git a/tests/settings/broker_settings.json b/tests/settings/broker_settings.json
index 841f19946..56bf15f52 100644
--- a/tests/settings/broker_settings.json
+++ b/tests/settings/broker_settings.json
@@ -1,4 +1,6 @@
 {
-  "dbaddress":"127.0.0.1:27017",
+  "BrokerDbAddress":"127.0.0.1:27017",
+  "MonitorDbAddress": "localhost:8086",
+  "MonitorDbName": "db_test",
   "port":5005
 }
\ No newline at end of file
-- 
GitLab