Skip to content

Commit 6b25a1a

Browse files
NimJayShabirmean
andauthored
Fix Deployment Details Bug (GoogleCloudPlatform#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 <[email protected]>
1 parent 1c558c7 commit 6b25a1a

File tree

3 files changed

+81
-42
lines changed

3 files changed

+81
-42
lines changed

src/frontend/deployment_details.go

+64
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package main
2+
3+
import (
4+
"net/http"
5+
"os"
6+
"time"
7+
8+
"cloud.google.com/go/compute/metadata"
9+
"github.com/sirupsen/logrus"
10+
)
11+
12+
var deploymentDetailsMap map[string]string
13+
var log *logrus.Logger
14+
15+
func init() {
16+
initializeLogger()
17+
// Use a goroutine to ensure loadDeploymentDetails()'s GCP API
18+
// calls don't block non-GCP deployments. See issue #685.
19+
go loadDeploymentDetails()
20+
}
21+
22+
func initializeLogger() {
23+
log = logrus.New()
24+
log.Level = logrus.DebugLevel
25+
log.Formatter = &logrus.JSONFormatter{
26+
FieldMap: logrus.FieldMap{
27+
logrus.FieldKeyTime: "timestamp",
28+
logrus.FieldKeyLevel: "severity",
29+
logrus.FieldKeyMsg: "message",
30+
},
31+
TimestampFormat: time.RFC3339Nano,
32+
}
33+
log.Out = os.Stdout
34+
}
35+
36+
func loadDeploymentDetails() {
37+
deploymentDetailsMap = make(map[string]string)
38+
var metaServerClient = metadata.NewClient(&http.Client{})
39+
40+
podHostname, err := os.Hostname()
41+
if err != nil {
42+
log.Error("Failed to fetch the hostname for the Pod", err)
43+
}
44+
45+
podCluster, err := metaServerClient.InstanceAttributeValue("cluster-name")
46+
if err != nil {
47+
log.Error("Failed to fetch the name of the cluster in which the pod is running", err)
48+
}
49+
50+
podZone, err := metaServerClient.Zone()
51+
if err != nil {
52+
log.Error("Failed to fetch the Zone of the node where the pod is scheduled", err)
53+
}
54+
55+
deploymentDetailsMap["HOSTNAME"] = podHostname
56+
deploymentDetailsMap["CLUSTERNAME"] = podCluster
57+
deploymentDetailsMap["ZONE"] = podZone
58+
59+
log.WithFields(logrus.Fields{
60+
"cluster": podCluster,
61+
"zone": podZone,
62+
"hostname": podHostname,
63+
}).Debug("Loaded deployment details")
64+
}

src/frontend/handlers.go

+5-39
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import (
2626
"strings"
2727
"time"
2828

29-
"cloud.google.com/go/compute/metadata"
3029
"github.com/gorilla/mux"
3130
"github.com/pkg/errors"
3231
"github.com/sirupsen/logrus"
@@ -116,7 +115,7 @@ func (fe *frontendServer) homeHandler(w http.ResponseWriter, r *http.Request) {
116115
"platform_css": plat.css,
117116
"platform_name": plat.provider,
118117
"is_cymbal_brand": isCymbalBrand,
119-
"deploymentDetails": getDeploymentDetails(r),
118+
"deploymentDetails": deploymentDetailsMap,
120119
}); err != nil {
121120
log.Error(err)
122121
}
@@ -201,7 +200,7 @@ func (fe *frontendServer) productHandler(w http.ResponseWriter, r *http.Request)
201200
"platform_css": plat.css,
202201
"platform_name": plat.provider,
203202
"is_cymbal_brand": isCymbalBrand,
204-
"deploymentDetails": getDeploymentDetails(r),
203+
"deploymentDetails": deploymentDetailsMap,
205204
}); err != nil {
206205
log.Println(err)
207206
}
@@ -313,7 +312,7 @@ func (fe *frontendServer) viewCartHandler(w http.ResponseWriter, r *http.Request
313312
"platform_css": plat.css,
314313
"platform_name": plat.provider,
315314
"is_cymbal_brand": isCymbalBrand,
316-
"deploymentDetails": getDeploymentDetails(r),
315+
"deploymentDetails": deploymentDetailsMap,
317316
}); err != nil {
318317
log.Println(err)
319318
}
@@ -386,7 +385,7 @@ func (fe *frontendServer) placeOrderHandler(w http.ResponseWriter, r *http.Reque
386385
"platform_css": plat.css,
387386
"platform_name": plat.provider,
388387
"is_cymbal_brand": isCymbalBrand,
389-
"deploymentDetails": getDeploymentDetails(r),
388+
"deploymentDetails": deploymentDetailsMap,
390389
}); err != nil {
391390
log.Println(err)
392391
}
@@ -448,7 +447,7 @@ func renderHTTPError(log logrus.FieldLogger, r *http.Request, w http.ResponseWri
448447
"error": errMsg,
449448
"status_code": code,
450449
"status": http.StatusText(code),
451-
"deploymentDetails": getDeploymentDetails(r),
450+
"deploymentDetails": deploymentDetailsMap,
452451
}); templateErr != nil {
453452
log.Println(templateErr)
454453
}
@@ -517,36 +516,3 @@ func stringinSlice(slice []string, val string) bool {
517516
}
518517
return false
519518
}
520-
521-
func getDeploymentDetails(httpRequest *http.Request) map[string]string {
522-
var deploymentDetailsMap = make(map[string]string)
523-
var metaServerClient = metadata.NewClient(&http.Client{})
524-
var log = httpRequest.Context().Value(ctxKeyLog{}).(logrus.FieldLogger)
525-
526-
podHostname, err := os.Hostname()
527-
if err != nil {
528-
log.Error("Failed to fetch the hostname for the Pod", err)
529-
}
530-
531-
podCluster, err := metaServerClient.InstanceAttributeValue("cluster-name")
532-
if err != nil {
533-
log.Error("Failed to fetch the name of the cluster in which the pod is running", err)
534-
}
535-
536-
podZone, err := metaServerClient.Zone()
537-
if err != nil {
538-
log.Error("Failed to fetch the Zone of the node where the pod is scheduled", err)
539-
}
540-
541-
deploymentDetailsMap["HOSTNAME"] = podHostname
542-
deploymentDetailsMap["CLUSTERNAME"] = podCluster
543-
deploymentDetailsMap["ZONE"] = podZone
544-
545-
log.WithFields(logrus.Fields{
546-
"cluster": podCluster,
547-
"zone": podZone,
548-
"hostname": podHostname,
549-
}).Debug("Fetched pod details")
550-
551-
return deploymentDetailsMap
552-
}

src/frontend/templates/footer.html

+12-3
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,18 @@
2929
<br/>
3030
<small>
3131
{{ if $.deploymentDetails }}
32-
<b>Cluster: </b>{{index .deploymentDetails "CLUSTERNAME" }}<br/>
33-
<b>Zone: </b>{{index .deploymentDetails "ZONE" }}<br/>
34-
<b>Pod: </b>{{index .deploymentDetails "HOSTNAME" }}
32+
{{ if index .deploymentDetails "CLUSTERNAME" }}
33+
<b>Cluster: </b>{{ index .deploymentDetails "CLUSTERNAME" }}<br/>
34+
{{ end }}
35+
{{ if index .deploymentDetails "ZONE" }}
36+
<b>Zone: </b>{{ index .deploymentDetails "ZONE" }}<br/>
37+
{{ end }}
38+
{{ if index .deploymentDetails "HOSTNAME" }}
39+
<b>Pod: </b>{{ index .deploymentDetails "HOSTNAME" }}
40+
{{ end }}
41+
{{ else }}
42+
Deployment details are still loading.
43+
Try refreshing this page.
3544
{{ end }}
3645
</small>
3746
</p>

0 commit comments

Comments
 (0)