From 6b25a1a4f577b11cf0051505491ac128b2bf651f Mon Sep 17 00:00:00 2001 From: Nim Jayawardena Date: Wed, 2 Feb 2022 10:43:46 -0500 Subject: [PATCH] Fix Deployment Details Bug (#699) * Improve loading of deployment details * Hide missing deployment details labels * Load deployment details once via init() * Add comment about go loadDeploymentDetails() * Simplify deployment_details.go * Remove getDeploymentDetailsIfLoaded() function Co-authored-by: Shabir Mohamed Abdul Samadh <7249208+Shabirmean@users.noreply.github.com> --- src/frontend/deployment_details.go | 64 ++++++++++++++++++++++++++++++ src/frontend/handlers.go | 44 +++----------------- src/frontend/templates/footer.html | 15 +++++-- 3 files changed, 81 insertions(+), 42 deletions(-) create mode 100644 src/frontend/deployment_details.go diff --git a/src/frontend/deployment_details.go b/src/frontend/deployment_details.go new file mode 100644 index 00000000000..02cabbda7ed --- /dev/null +++ b/src/frontend/deployment_details.go @@ -0,0 +1,64 @@ +package main + +import ( + "net/http" + "os" + "time" + + "cloud.google.com/go/compute/metadata" + "github.com/sirupsen/logrus" +) + +var deploymentDetailsMap map[string]string +var log *logrus.Logger + +func init() { + initializeLogger() + // Use a goroutine to ensure loadDeploymentDetails()'s GCP API + // calls don't block non-GCP deployments. See issue #685. + go loadDeploymentDetails() +} + +func initializeLogger() { + log = logrus.New() + log.Level = logrus.DebugLevel + log.Formatter = &logrus.JSONFormatter{ + FieldMap: logrus.FieldMap{ + logrus.FieldKeyTime: "timestamp", + logrus.FieldKeyLevel: "severity", + logrus.FieldKeyMsg: "message", + }, + TimestampFormat: time.RFC3339Nano, + } + log.Out = os.Stdout +} + +func loadDeploymentDetails() { + deploymentDetailsMap = make(map[string]string) + var metaServerClient = metadata.NewClient(&http.Client{}) + + podHostname, err := os.Hostname() + if err != nil { + log.Error("Failed to fetch the hostname for the Pod", err) + } + + podCluster, err := metaServerClient.InstanceAttributeValue("cluster-name") + if err != nil { + log.Error("Failed to fetch the name of the cluster in which the pod is running", err) + } + + podZone, err := metaServerClient.Zone() + if err != nil { + log.Error("Failed to fetch the Zone of the node where the pod is scheduled", err) + } + + deploymentDetailsMap["HOSTNAME"] = podHostname + deploymentDetailsMap["CLUSTERNAME"] = podCluster + deploymentDetailsMap["ZONE"] = podZone + + log.WithFields(logrus.Fields{ + "cluster": podCluster, + "zone": podZone, + "hostname": podHostname, + }).Debug("Loaded deployment details") +} diff --git a/src/frontend/handlers.go b/src/frontend/handlers.go index b41070336e7..55890575e60 100644 --- a/src/frontend/handlers.go +++ b/src/frontend/handlers.go @@ -26,7 +26,6 @@ import ( "strings" "time" - "cloud.google.com/go/compute/metadata" "github.com/gorilla/mux" "github.com/pkg/errors" "github.com/sirupsen/logrus" @@ -116,7 +115,7 @@ func (fe *frontendServer) homeHandler(w http.ResponseWriter, r *http.Request) { "platform_css": plat.css, "platform_name": plat.provider, "is_cymbal_brand": isCymbalBrand, - "deploymentDetails": getDeploymentDetails(r), + "deploymentDetails": deploymentDetailsMap, }); err != nil { log.Error(err) } @@ -201,7 +200,7 @@ func (fe *frontendServer) productHandler(w http.ResponseWriter, r *http.Request) "platform_css": plat.css, "platform_name": plat.provider, "is_cymbal_brand": isCymbalBrand, - "deploymentDetails": getDeploymentDetails(r), + "deploymentDetails": deploymentDetailsMap, }); err != nil { log.Println(err) } @@ -313,7 +312,7 @@ func (fe *frontendServer) viewCartHandler(w http.ResponseWriter, r *http.Request "platform_css": plat.css, "platform_name": plat.provider, "is_cymbal_brand": isCymbalBrand, - "deploymentDetails": getDeploymentDetails(r), + "deploymentDetails": deploymentDetailsMap, }); err != nil { log.Println(err) } @@ -386,7 +385,7 @@ func (fe *frontendServer) placeOrderHandler(w http.ResponseWriter, r *http.Reque "platform_css": plat.css, "platform_name": plat.provider, "is_cymbal_brand": isCymbalBrand, - "deploymentDetails": getDeploymentDetails(r), + "deploymentDetails": deploymentDetailsMap, }); err != nil { log.Println(err) } @@ -448,7 +447,7 @@ func renderHTTPError(log logrus.FieldLogger, r *http.Request, w http.ResponseWri "error": errMsg, "status_code": code, "status": http.StatusText(code), - "deploymentDetails": getDeploymentDetails(r), + "deploymentDetails": deploymentDetailsMap, }); templateErr != nil { log.Println(templateErr) } @@ -517,36 +516,3 @@ func stringinSlice(slice []string, val string) bool { } return false } - -func getDeploymentDetails(httpRequest *http.Request) map[string]string { - var deploymentDetailsMap = make(map[string]string) - var metaServerClient = metadata.NewClient(&http.Client{}) - var log = httpRequest.Context().Value(ctxKeyLog{}).(logrus.FieldLogger) - - podHostname, err := os.Hostname() - if err != nil { - log.Error("Failed to fetch the hostname for the Pod", err) - } - - podCluster, err := metaServerClient.InstanceAttributeValue("cluster-name") - if err != nil { - log.Error("Failed to fetch the name of the cluster in which the pod is running", err) - } - - podZone, err := metaServerClient.Zone() - if err != nil { - log.Error("Failed to fetch the Zone of the node where the pod is scheduled", err) - } - - deploymentDetailsMap["HOSTNAME"] = podHostname - deploymentDetailsMap["CLUSTERNAME"] = podCluster - deploymentDetailsMap["ZONE"] = podZone - - log.WithFields(logrus.Fields{ - "cluster": podCluster, - "zone": podZone, - "hostname": podHostname, - }).Debug("Fetched pod details") - - return deploymentDetailsMap -} diff --git a/src/frontend/templates/footer.html b/src/frontend/templates/footer.html index bcb7a3e3592..928fb0a2096 100755 --- a/src/frontend/templates/footer.html +++ b/src/frontend/templates/footer.html @@ -29,9 +29,18 @@
{{ if $.deploymentDetails }} - Cluster: {{index .deploymentDetails "CLUSTERNAME" }}
- Zone: {{index .deploymentDetails "ZONE" }}
- Pod: {{index .deploymentDetails "HOSTNAME" }} + {{ if index .deploymentDetails "CLUSTERNAME" }} + Cluster: {{ index .deploymentDetails "CLUSTERNAME" }}
+ {{ end }} + {{ if index .deploymentDetails "ZONE" }} + Zone: {{ index .deploymentDetails "ZONE" }}
+ {{ end }} + {{ if index .deploymentDetails "HOSTNAME" }} + Pod: {{ index .deploymentDetails "HOSTNAME" }} + {{ end }} + {{ else }} + Deployment details are still loading. + Try refreshing this page. {{ end }}