[ISSUE-70861663] add tracking with request id in debug mode (#33) * [ISSUE-70861663] add tracking with request id in debug mode * [ISSUE-70861663] address comments * [ISSUE-70861663] improve log * [ISSUE-70861663] address comments
diff --git a/accessEntity/api.go b/accessEntity/api.go index fb49fca..9a37200 100644 --- a/accessEntity/api.go +++ b/accessEntity/api.go
@@ -63,6 +63,8 @@ StatusExpired = "EXPIRED" ) +const headerRequestId = "X-Gateway-Request-Id" + var ( Identifiers = map[string]bool{ "appid": true, @@ -127,6 +129,8 @@ DATA_ERROR // 404 NOT_FOUND + // json Marshal Error + JSON_MARSHAL_ERROR ) type ApiManager struct { @@ -152,7 +156,12 @@ func (a *ApiManager) handleEndpoint(endpoint string, w http.ResponseWriter, r *http.Request) { ids, org, err := extractIdentifiers(r.URL.Query()) if err != nil { - common.WriteError(w, err.Error(), INVALID_PARAMETERS, http.StatusBadRequest) + writeJson(http.StatusBadRequest, + common.ErrorResponse{ + ResponseCode: strconv.Itoa(INVALID_PARAMETERS), + ResponseMessage: err.Error(), + StatusCode: http.StatusBadRequest, + }, w, r) } var res interface{} var errRes *common.ErrorResponse @@ -172,11 +181,10 @@ } if errRes != nil { - w.WriteHeader(errRes.StatusCode) - writeJson(errRes, w, r) + writeJson(errRes.StatusCode, errRes, w, r) return } - writeJson(res, w, r) + writeJson(http.StatusOK, res, w, r) } func (a *ApiManager) HandleApps(w http.ResponseWriter, r *http.Request) { @@ -709,13 +717,29 @@ } } -func writeJson(obj interface{}, w http.ResponseWriter, r *http.Request) { +func writeJson(code int, obj interface{}, w http.ResponseWriter, r *http.Request) { + + requestId := r.Header.Get(headerRequestId) bytes, err := json.Marshal(obj) + // JSON error if err != nil { - log.Error("unable to marshal errorResponse: " + err.Error()) - w.Write([]byte("unable to marshal errorResponse: " + err.Error())) - } else { - w.Header().Set("Content-Type", "application/json") - w.Write(bytes) + code = http.StatusInternalServerError + log.Errorf("unable to marshal errorResponse for request_id=[%s]: %v", requestId, err) + jsonError := &common.ErrorResponse{ + ResponseCode: strconv.Itoa(JSON_MARSHAL_ERROR), + ResponseMessage: fmt.Sprintf("JSON Marshal Error %v for object: %v", err, obj), + StatusCode: http.StatusInternalServerError, + } + if bytes, err = json.Marshal(jsonError); err != nil { // this should never happen + log.Errorf("unable to marshal JSON error response for request_id=[%s]: %v", requestId, err) + w.WriteHeader(http.StatusInternalServerError) + return + } + } + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(code) + log.Debugf("Sending response_code=%d for request_id=[%s]: %s", code, requestId, bytes) + if l, err := w.Write(bytes); err != nil || l != len(bytes) { + log.Errorf("error writing response for request_id=[%s]: error=%v, bytes_written=%d", requestId, err, l) } }
diff --git a/accessEntity/api_test.go b/accessEntity/api_test.go index eeda673..128d855 100644 --- a/accessEntity/api_test.go +++ b/accessEntity/api_test.go
@@ -43,6 +43,7 @@ uri.RawQuery = query.Encode() httpReq, err := http.NewRequest("GET", uri.String(), nil) Expect(err).Should(Succeed()) + httpReq.Header.Set(headerRequestId, strconv.Itoa(testCount)) res, err := client.Do(httpReq) Expect(err).Should(Succeed()) defer res.Body.Close()
diff --git a/common/api.go b/common/api.go deleted file mode 100644 index 9b3f243..0000000 --- a/common/api.go +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2017 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package common - -import ( - "encoding/json" - "net/http" - "strconv" -) - -func WriteError(w http.ResponseWriter, reason string, errorCode int, statusCode int) { - w.WriteHeader(statusCode) - resp := ErrorResponse{ - ResponseCode: strconv.Itoa(errorCode), - ResponseMessage: reason, - StatusCode: statusCode, - } - bytes, err := json.Marshal(resp) - if err != nil { - w.Write([]byte("unable to marshal errorResponse: " + err.Error())) - } else { - w.Write(bytes) - } -}