Commit 377a9ea3 authored by Kevin Di Lallo's avatar Kevin Di Lallo
Browse files

added session metrics during oauth login & logout

parent f549bc39
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@ require (
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-key-mgr v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-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-mq v0.0.0
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis v0.0.0
@@ -28,6 +29,7 @@ replace (
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-key-mgr => ../../go-packages/meep-data-key-mgr
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model => ../../go-packages/meep-data-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-mq => ../../go-packages/meep-mq
	github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis => ../../go-packages/meep-redis
+2 −0
Original line number Diff line number Diff line
@@ -141,6 +141,8 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
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/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+7 −9
Original line number Diff line number Diff line
@@ -23,8 +23,6 @@ import (
	"io/ioutil"
	"math/rand"
	"net/http"
	"os"
	"strconv"
	"time"

	"github.com/gorilla/mux"
@@ -35,6 +33,7 @@ import (
	dkm "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-key-mgr"
	dataModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-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"
	mq "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-mq"
	redis "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-redis"
@@ -58,6 +57,7 @@ type PlatformCtrl struct {
	sessionMgr    *sm.SessionMgr
	sandboxStore  *ss.SandboxStore
	userStore     *users.Connector
	metricStore   *ms.MetricStore
	mqGlobal      *mq.MsgQueue
	maxSessions   int
	uri           string
@@ -94,12 +94,6 @@ func Init() (err error) {
	// Create new Platform Controller
	pfmCtrl = new(PlatformCtrl)

	// Retrieve maximum session count from environment variable
	if maxSessions, err := strconv.ParseInt(os.Getenv("MEEP_MAX_SESSIONS"), 10, 0); err == nil {
		pfmCtrl.maxSessions = int(maxSessions)
	}
	log.Info("MEEP_MAX_SESSIONS: ", pfmCtrl.maxSessions)

	// Create message queue
	pfmCtrl.mqGlobal, err = mq.NewMsgQueue(mq.GetGlobalName(), moduleName, moduleNamespace, redisDBAddr)
	if err != nil {
@@ -180,7 +174,11 @@ func Init() (err error) {
	setPermissions()

	// Initialize OAuth
	initOAuth()
	err = initOAuth()
	if err != nil {
		log.Error("Failed OAuth Init: ", err.Error())
		return err
	}

	log.Info("Platform Controller initialized")
	return nil
+54 −1
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import (

	dataModel "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-data-model"
	log "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-logger"
	ms "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-metric-store"
	sm "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-sessions"
	users "github.com/InterDigitalInc/AdvantEDGE/go-packages/meep-users"
	"github.com/google/go-github/github"
@@ -54,8 +55,22 @@ const OAUTH_PROVIDER_LOCAL = "local"

var mutex sync.Mutex
var gitlabApiUrl = ""
var influxDBAddr string = "http://meep-influxdb.default.svc.cluster.local:8086"

func initOAuth() {
func initOAuth() (err error) {

	// Connect to Metric Store
	pfmCtrl.metricStore, err = ms.NewMetricStore("session-metrics", "global", influxDBAddr, ms.MetricsDbDisabled)
	if err != nil {
		log.Error("Failed connection to Metric Store: ", err)
		return err
	}

	// Retrieve maximum session count from environment variable
	if maxSessions, err := strconv.ParseInt(os.Getenv("MEEP_MAX_SESSIONS"), 10, 0); err == nil {
		pfmCtrl.maxSessions = int(maxSessions)
	}
	log.Info("MEEP_MAX_SESSIONS: ", pfmCtrl.maxSessions)

	// Get default platform URI
	pfmCtrl.uri = strings.TrimSpace(os.Getenv("MEEP_HOST_URL"))
@@ -114,6 +129,8 @@ func initOAuth() {
			log.Info("GitLab OAuth provider enabled")
		}
	}

	return nil
}

// Generate a random state string
@@ -177,16 +194,20 @@ func getErrUrl(err string) string {

func uaLoginOAuth(w http.ResponseWriter, r *http.Request) {
	log.Info("----- OAUTH LOGIN -----")
	var metric ms.SessionMetric

	// Retrieve query parameters
	query := r.URL.Query()
	provider := query.Get("provider")
	metric.Provider = provider

	// Get provider-specific OAuth config
	config, found := pfmCtrl.oauthConfigs[provider]
	if !found {
		err := errors.New("Provider config not found for: " + provider)
		log.Error(err.Error())
		metric.Description = err.Error()
		_ = pfmCtrl.metricStore.SetSessionMetric(ms.SesMetTypeError, metric)
		http.Redirect(w, r, getErrUrl(err.Error()), http.StatusFound)
		return
	}
@@ -195,6 +216,8 @@ func uaLoginOAuth(w http.ResponseWriter, r *http.Request) {
	state, err := getUniqueState()
	if err != nil {
		log.Error(err.Error())
		metric.Description = err.Error()
		_ = pfmCtrl.metricStore.SetSessionMetric(ms.SesMetTypeError, metric)
		http.Redirect(w, r, getErrUrl(err.Error()), http.StatusFound)
		return
	}
@@ -218,6 +241,7 @@ func uaLoginOAuth(w http.ResponseWriter, r *http.Request) {
}

func uaAuthorize(w http.ResponseWriter, r *http.Request) {
	var metric ms.SessionMetric

	// Retrieve query parameters
	query := r.URL.Query()
@@ -229,6 +253,8 @@ func uaAuthorize(w http.ResponseWriter, r *http.Request) {
	if request == nil {
		err := errors.New("Invalid OAuth state")
		log.Error(err.Error())
		metric.Description = err.Error()
		_ = pfmCtrl.metricStore.SetSessionMetric(ms.SesMetTypeError, metric)
		http.Redirect(w, r, getErrUrl(err.Error()), http.StatusFound)
		return
	}
@@ -239,9 +265,12 @@ func uaAuthorize(w http.ResponseWriter, r *http.Request) {
	if !found {
		err := errors.New("Provider config not found for: " + provider)
		log.Error(err.Error())
		metric.Description = err.Error()
		_ = pfmCtrl.metricStore.SetSessionMetric(ms.SesMetTypeError, metric)
		http.Redirect(w, r, getErrUrl(err.Error()), http.StatusFound)
		return
	}
	metric.Provider = provider

	// Delete login request & timer
	delLoginRequest(state)
@@ -250,6 +279,8 @@ func uaAuthorize(w http.ResponseWriter, r *http.Request) {
	token, err := config.Exchange(context.Background(), code)
	if err != nil {
		log.Error(err.Error())
		metric.Description = err.Error()
		_ = pfmCtrl.metricStore.SetSessionMetric(ms.SesMetTypeError, metric)
		http.Redirect(w, r, getErrUrl(err.Error()), http.StatusFound)
		return
	}
@@ -262,6 +293,8 @@ func uaAuthorize(w http.ResponseWriter, r *http.Request) {
		if oauthClient == nil {
			err = errors.New("Failed to create new GitHub oauth client")
			log.Error(err.Error())
			metric.Description = err.Error()
			_ = pfmCtrl.metricStore.SetSessionMetric(ms.SesMetTypeError, metric)
			http.Redirect(w, r, getErrUrl(err.Error()), http.StatusFound)
			return
		}
@@ -269,12 +302,16 @@ func uaAuthorize(w http.ResponseWriter, r *http.Request) {
		if client == nil {
			err = errors.New("Failed to create new GitHub client")
			log.Error(err.Error())
			metric.Description = err.Error()
			_ = pfmCtrl.metricStore.SetSessionMetric(ms.SesMetTypeError, metric)
			http.Redirect(w, r, getErrUrl(err.Error()), http.StatusFound)
			return
		}
		user, _, err := client.Users.Get(context.Background(), "")
		if err != nil {
			log.Error(err.Error())
			metric.Description = err.Error()
			_ = pfmCtrl.metricStore.SetSessionMetric(ms.SesMetTypeError, metric)
			http.Redirect(w, r, getErrUrl("Failed to retrieve GitHub user ID"), http.StatusFound)
			return
		}
@@ -289,27 +326,37 @@ func uaAuthorize(w http.ResponseWriter, r *http.Request) {
		if err != nil {
			err = errors.New("Failed to create new GitLab client")
			log.Error(err.Error())
			metric.Description = err.Error()
			_ = pfmCtrl.metricStore.SetSessionMetric(ms.SesMetTypeError, metric)
			http.Redirect(w, r, getErrUrl(err.Error()), http.StatusFound)
			return
		}
		user, _, err := client.Users.CurrentUser()
		if err != nil {
			log.Error(err.Error())
			metric.Description = err.Error()
			_ = pfmCtrl.metricStore.SetSessionMetric(ms.SesMetTypeError, metric)
			http.Redirect(w, r, getErrUrl("Failed to retrieve GitLab user ID"), http.StatusFound)
			return
		}
		userId = user.Username
	default:
	}
	metric.User = userId

	// Start user session
	sandboxName, err, errCode := startSession(provider, userId, w, r)
	if err != nil {
		log.Error(err.Error())
		metric.Description = err.Error()
		_ = pfmCtrl.metricStore.SetSessionMetric(ms.SesMetTypeError, metric)
		http.Redirect(w, r, getErrUrl(err.Error()), errCode)
		return
	}

	metric.Sandbox = sandboxName
	_ = pfmCtrl.metricStore.SetSessionMetric(ms.SesMetTypeLogin, metric)

	// Redirect user to sandbox
	http.Redirect(w, r, pfmCtrl.uri+"?sbox="+sandboxName+"&user="+userId, http.StatusFound)
}
@@ -418,11 +465,15 @@ func startSession(provider string, username string, w http.ResponseWriter, r *ht

func uaLogoutUser(w http.ResponseWriter, r *http.Request) {
	log.Info("----- LOGOUT -----")
	var metric ms.SessionMetric

	// Get existing session
	sessionStore := pfmCtrl.sessionMgr.GetSessionStore()
	session, err := sessionStore.Get(r)
	if err == nil {
		metric.Provider = session.Provider
		metric.User = session.Username
		metric.Sandbox = session.Sandbox
		// Delete sandbox
		deleteSandbox(session.Sandbox)
	}
@@ -435,6 +486,8 @@ func uaLogoutUser(w http.ResponseWriter, r *http.Request) {
		return
	}

	_ = pfmCtrl.metricStore.SetSessionMetric(ms.SesMetTypeLogout, metric)

	w.Header().Set("Content-Type", "application/json; charset=UTF-8")
	w.WriteHeader(http.StatusOK)
}
+1 −1
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@ import (
const eventStoreName string = "event-store"
const eventStoreNamespace string = "event-ns"
const eventStoreInfluxAddr string = "http://localhost:30986"
const eventStoreRedisAddr string = "localhost:30380"
const eventStoreRedisAddr string = MetricsDbDisabled

func TestEventsMetricsGetSet(t *testing.T) {
	fmt.Println("--- ", t.Name())
Loading