Commit 5ae3db6e authored by Kevin Di Lallo's avatar Kevin Di Lallo
Browse files

added event metric reporting in ctrl-engine

parent 3d27b084
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -5,6 +5,7 @@ go 1.12
require (
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-ctrl-engine-model v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metric-store v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-watchdog v0.0.0
@@ -20,12 +21,11 @@ require (
	gopkg.in/yaml.v2 v2.2.2 // indirect
)

replace github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-ctrl-engine-model => ../../go-packages/meep-ctrl-engine-model

replace github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger => ../../go-packages/meep-logger

replace github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis => ../../go-packages/meep-redis

replace github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-watchdog => ../../go-packages/meep-watchdog

replace github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model => ../../go-packages/meep-model
replace (
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-ctrl-engine-model => ../../go-packages/meep-ctrl-engine-model
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger => ../../go-packages/meep-logger
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metric-store => ../../go-packages/meep-metric-store
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model => ../../go-packages/meep-model
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis => ../../go-packages/meep-redis
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-watchdog => ../../go-packages/meep-watchdog
)
+2 −0
Original line number Diff line number Diff line
@@ -36,6 +36,8 @@ github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ=
github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e h1:txQltCyjXAqVVSZDArPEhUTg35hKwVIuXwtQo7eAMNQ=
github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/mattomatic/dijkstra v0.0.0-20130617153013-6f6d134eb237 h1:acuCHBjzG7MFTugvx3buC4m5rLDLaKC9J8C9jtlraRc=
+56 −23
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import (

	ceModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-ctrl-engine-model"
	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
	ms "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metric-store"
	mod "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-model"
	redis "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis"
	watchdog "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-watchdog"
@@ -49,9 +50,11 @@ var db *kivik.DB
var virtWatchdog *watchdog.Watchdog
var rc *redis.Connector
var activeModel *mod.Model
var metricStore *ms.MetricStore

var couchDBAddr = "http://meep-couchdb-svc-couchdb:5984/"
var redisDBAddr = "meep-redis-master:6379"
var influxDBAddr = "http://influxdb:8086"

func getCorePodsList() map[string]bool {

@@ -135,6 +138,13 @@ func CtrlEngineInit() (err error) {
		return err
	}

	// Connect to Metric Store
	metricStore, err = ms.NewMetricStore("", influxDBAddr)
	if err != nil {
		log.Error("Failed connection to Redis: ", err)
		return err
	}

	return nil
}

@@ -360,6 +370,12 @@ func ceActivateScenario(w http.ResponseWriter, r *http.Request) {
		return
	}

	// Set Metrics Store
	err = metricStore.SetStore(scenarioName)
	if err != nil {
		log.Error(err.Error())
	}

	// Activate scenario & publish
	err = activeModel.SetScenario(scenario)
	if err != nil {
@@ -512,6 +528,12 @@ func ceTerminateScenario(w http.ResponseWriter, r *http.Request) {
		return
	}

	// Set Metrics Store
	err = metricStore.SetStore("")
	if err != nil {
		log.Error(err.Error())
	}

	// Send response
	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
	w.WriteHeader(http.StatusOK)
@@ -550,25 +572,33 @@ func ceSendEvent(w http.ResponseWriter, r *http.Request) {

	// Process Event
	var httpStatus int
	var error string
	switch eventType {
	case "MOBILITY":
		error, httpStatus = sendEventMobility(event)
		err, httpStatus = sendEventMobility(event)
	case "NETWORK-CHARACTERISTICS-UPDATE":
		error, httpStatus = sendEventNetworkCharacteristics(event)
		err, httpStatus = sendEventNetworkCharacteristics(event)
	case "POAS-IN-RANGE":
		error, httpStatus = sendEventPoasInRange(event)
		err, httpStatus = sendEventPoasInRange(event)
	default:
		error = "Unsupported event type"
		err = errors.New("Unsupported event type")
		httpStatus = http.StatusBadRequest
	}

	if error != "" {
		log.Error(error)
		http.Error(w, error, httpStatus)
	if err != nil {
		log.Error(err.Error())
		http.Error(w, err.Error(), httpStatus)
		return
	}

	// Log successful event in metric store
	eventStr, err := json.Marshal(event)
	if err == nil {
		err = metricStore.SetEventMetric(eventType, string(eventStr))
	}
	if err != nil {
		log.Error("Failed to set event metric")
	}

	// Send response
	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
	w.WriteHeader(http.StatusOK)
@@ -669,9 +699,10 @@ func ceGetStates(w http.ResponseWriter, r *http.Request) {

// ------------------

func sendEventNetworkCharacteristics(event ceModel.Event) (string, int) {
func sendEventNetworkCharacteristics(event ceModel.Event) (error, int) {
	if event.EventNetworkCharacteristicsUpdate == nil {
		return "Malformed request: missing EventNetworkCharacteristicsUpdate", http.StatusBadRequest
		err := errors.New("Malformed request: missing EventNetworkCharacteristicsUpdate")
		return err, http.StatusBadRequest
	}

	// elementFound := false
@@ -679,14 +710,15 @@ func sendEventNetworkCharacteristics(event ceModel.Event) (string, int) {

	err := activeModel.UpdateNetChar(netChar)
	if err != nil {
		return err.Error(), http.StatusInternalServerError
		return err, http.StatusInternalServerError
	}
	return "", -1
	return nil, -1
}

func sendEventMobility(event ceModel.Event) (string, int) {
func sendEventMobility(event ceModel.Event) (error, int) {
	if event.EventMobility == nil {
		return "Malformed request: missing EventMobility", http.StatusBadRequest
		err := errors.New("Malformed request: missing EventMobility")
		return err, http.StatusBadRequest
	}
	// Retrieve target name (src) and destination parent name
	elemName := event.EventMobility.ElementName
@@ -694,7 +726,7 @@ func sendEventMobility(event ceModel.Event) (string, int) {

	oldNL, newNL, err := activeModel.MoveNode(elemName, destName)
	if err != nil {
		return err.Error(), http.StatusInternalServerError
		return err, http.StatusInternalServerError
	}
	log.WithFields(log.Fields{
		"meep.log.component": "ctrl-engine",
@@ -704,14 +736,14 @@ func sendEventMobility(event ceModel.Event) (string, int) {
		"meep.log.src":       elemName,
		"meep.log.dest":      elemName,
	}).Info("Measurements log")
	return "", -1
	return nil, -1
}

func sendEventPoasInRange(event ceModel.Event) (string, int) {
func sendEventPoasInRange(event ceModel.Event) (error, int) {
	if event.EventPoasInRange == nil {
		return "Malformed request: missing EventPoasInRange", http.StatusBadRequest
		err := errors.New("Malformed request: missing EventPoasInRange")
		return err, http.StatusBadRequest
	}

	var ue *ceModel.PhysicalLocation

	// Retrieve UE name
@@ -725,7 +757,8 @@ func sendEventPoasInRange(event ceModel.Event) (string, int) {
	log.Debug("Searching for UE in active scenario")
	n := activeModel.GetNode(ueName)
	if n == nil {
		return ("Node not found " + ueName), http.StatusNotFound
		err := errors.New("Node not found " + ueName)
		return err, http.StatusNotFound
	}
	ue, ok := n.(*ceModel.PhysicalLocation)
	if !ok {
@@ -746,7 +779,7 @@ func sendEventPoasInRange(event ceModel.Event) (string, int) {
			//Publish updated scenario
			err := activeModel.Activate()
			if err != nil {
				return err.Error(), http.StatusInternalServerError
				return err, http.StatusInternalServerError
			}

			log.Debug("Active scenario updated")
@@ -754,10 +787,10 @@ func sendEventPoasInRange(event ceModel.Event) (string, int) {
			log.Debug("POA list unchanged. Ignoring.")
		}
	} else {
		err := "Failed to find UE"
		err := errors.New("Failed to find UE")
		return err, http.StatusNotFound
	}
	return "", -1
	return nil, -1
}

func getPodDetails(key string, fields map[string]string, userData interface{}) error {
+31 −5
Original line number Diff line number Diff line
@@ -24,7 +24,7 @@ import (

	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"

	_ "github.com/influxdata/influxdb1-client" // this is important because of the bug in go mod
	_ "github.com/influxdata/influxdb1-client"
	influxclient "github.com/influxdata/influxdb1-client/v2"
)

@@ -260,13 +260,39 @@ func (ms *MetricStore) GetLastNetMetric(src string, dest string) (lat int32, tpu
}

// SetEventMetric
func (ms *MetricStore) SetEventMetric(typ string, target string, desc string) error {
func (ms *MetricStore) SetEventMetric(eventType string, eventStr string) error {
	tags := map[string]string{
		"type":   typ,
		"target": target,
		"type": eventType,
	}
	fields := map[string]interface{}{
		"description": desc,
		"event": eventStr,
	}
	return ms.SetMetric(metricEvent, tags, fields)
}

// GetLastEventMetric
func (ms *MetricStore) GetLastEventMetric(eventType string) (event string, err error) {
	// Make sure we have set a store
	if ms.name == "" {
		err := errors.New("Store name not specified")
		return event, err
	}

	// Get latest Net metric
	tags := map[string]string{
		"type": eventType,
	}
	fields := []string{"event"}
	valuesArray, err := ms.GetMetric(metricEvent, tags, fields, 1)
	if err != nil {
		log.Error("Failed to retrieve metrics with error: ", err.Error())
		return event, err
	}

	// Take first & only values
	values := valuesArray[0]
	if val, ok := values["event"].(string); ok {
		event = val
	}
	return event, nil
}
+29 −1
Original line number Diff line number Diff line
@@ -178,10 +178,38 @@ func TestGetSetMetric(t *testing.T) {
	}

	fmt.Println("Set event metric")
	err = ms.SetEventMetric("MOBILITY", "node1", "UE Mobility event")
	err = ms.SetEventMetric("MOBILITY", "event1")
	if err != nil {
		t.Errorf("Unable to set event metric")
	}
	err = ms.SetEventMetric("NETWORK-CHARACTERISTIC-UPDATE", "event2")
	if err != nil {
		t.Errorf("Unable to set event metric")
	}
	err = ms.SetEventMetric("POAS-IN-RANGE", "event3")
	if err != nil {
		t.Errorf("Unable to set event metric")
	}

	fmt.Println("Get event metrics")
	event, err := ms.GetLastEventMetric("MOBILITY")
	if err != nil {
		t.Errorf("Event metric should exist")
	} else if event != "event1" {
		t.Errorf("Invalid metric values")
	}
	event, err = ms.GetLastEventMetric("NETWORK-CHARACTERISTIC-UPDATE")
	if err != nil {
		t.Errorf("Event metric should exist")
	} else if event != "event2" {
		t.Errorf("Invalid metric values")
	}
	event, err = ms.GetLastEventMetric("POAS-IN-RANGE")
	if err != nil {
		t.Errorf("Event metric should exist")
	} else if event != "event3" {
		t.Errorf("Invalid metric values")
	}

	// t.Errorf("DONE")
}
+1 −1

File changed.

Contains only whitespace changes.

Loading