From 4efbbfb09c0dd10e9d9667ffa4f8176309be5efe Mon Sep 17 00:00:00 2001 From: "grafana-delivery-bot[bot]" <132647405+grafana-delivery-bot[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2024 21:57:37 +0200 Subject: [PATCH] [v10.4.x] Azure/GCM: Improve error display (#97590) Azure/GCM: Improve error display (#96921) Improve handling of errors (cherry picked from commit 9f75a448d47beac1da545a6e7f485916aa9b23cb) Co-authored-by: Andreas Christou --- .../azuremonitor-resource-handler.go | 17 ++++++++++------ pkg/tsdb/cloud-monitoring/resource_handler.go | 20 +++++++++++-------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/pkg/tsdb/azuremonitor/azuremonitor-resource-handler.go b/pkg/tsdb/azuremonitor/azuremonitor-resource-handler.go index 13d4c411b87..4ea3050ee37 100644 --- a/pkg/tsdb/azuremonitor/azuremonitor-resource-handler.go +++ b/pkg/tsdb/azuremonitor/azuremonitor-resource-handler.go @@ -1,6 +1,7 @@ package azuremonitor import ( + "encoding/json" "fmt" "io" "net/http" @@ -83,9 +84,13 @@ func (s *Service) getDataSourceFromHTTPReq(req *http.Request) (types.DatasourceI return ds, nil } -func writeResponse(rw http.ResponseWriter, code int, msg string) { +func writeErrorResponse(rw http.ResponseWriter, code int, msg string) { rw.WriteHeader(http.StatusBadRequest) - _, err := rw.Write([]byte(msg)) + errorBody := map[string]string{ + "error": msg, + } + jsonRes, _ := json.Marshal(errorBody) + _, err := rw.Write(jsonRes) if err != nil { backend.Logger.Error("Unable to write HTTP response", "error", err) } @@ -97,20 +102,20 @@ func (s *Service) handleResourceReq(subDataSource string) func(rw http.ResponseW newPath, err := getTarget(req.URL.Path) if err != nil { - writeResponse(rw, http.StatusBadRequest, err.Error()) + writeErrorResponse(rw, http.StatusBadRequest, err.Error()) return } dsInfo, err := s.getDataSourceFromHTTPReq(req) if err != nil { - writeResponse(rw, http.StatusInternalServerError, fmt.Sprintf("unexpected error %v", err)) + writeErrorResponse(rw, http.StatusInternalServerError, fmt.Sprintf("unexpected error %v", err)) return } service := dsInfo.Services[subDataSource] serviceURL, err := url.Parse(service.URL) if err != nil { - writeResponse(rw, http.StatusInternalServerError, fmt.Sprintf("unexpected error %v", err)) + writeErrorResponse(rw, http.StatusInternalServerError, fmt.Sprintf("unexpected error %v", err)) return } req.URL.Path = newPath @@ -119,7 +124,7 @@ func (s *Service) handleResourceReq(subDataSource string) func(rw http.ResponseW rw, err = s.executors[subDataSource].ResourceRequest(rw, req, service.HTTPClient) if err != nil { - writeResponse(rw, http.StatusInternalServerError, fmt.Sprintf("unexpected error %v", err)) + writeErrorResponse(rw, http.StatusInternalServerError, fmt.Sprintf("unexpected error %v", err)) return } } diff --git a/pkg/tsdb/cloud-monitoring/resource_handler.go b/pkg/tsdb/cloud-monitoring/resource_handler.go index 5347b9a9499..84aef378d6c 100644 --- a/pkg/tsdb/cloud-monitoring/resource_handler.go +++ b/pkg/tsdb/cloud-monitoring/resource_handler.go @@ -39,13 +39,13 @@ func (s *Service) newResourceMux() *http.ServeMux { func (s *Service) getGCEDefaultProject(rw http.ResponseWriter, req *http.Request) { project, err := s.gceDefaultProjectGetter(req.Context(), resourceManagerScope) if err != nil { - writeResponse(rw, http.StatusBadRequest, fmt.Sprintf("unexpected error %v", err)) + writeErrorResponse(rw, http.StatusBadRequest, fmt.Sprintf("unexpected error %v", err)) return } encoded, err := json.Marshal(project) if err != nil { - writeResponse(rw, http.StatusBadRequest, fmt.Sprintf("error retrieving default project %v", err)) + writeErrorResponse(rw, http.StatusBadRequest, fmt.Sprintf("error retrieving default project %v", err)) return } writeResponseBytes(rw, http.StatusOK, encoded) @@ -55,7 +55,7 @@ func (s *Service) handleResourceReq(subDataSource string, responseFn processResp return func(rw http.ResponseWriter, req *http.Request) { client, code, err := s.setRequestVariables(req, subDataSource) if err != nil { - writeResponse(rw, code, fmt.Sprintf("unexpected error %v", err)) + writeErrorResponse(rw, code, fmt.Sprintf("unexpected error %v", err)) return } getResources(rw, req, client, responseFn) @@ -64,19 +64,19 @@ func (s *Service) handleResourceReq(subDataSource string, responseFn processResp func getResources(rw http.ResponseWriter, req *http.Request, cli *http.Client, responseFn processResponse) http.ResponseWriter { if responseFn == nil { - writeResponse(rw, http.StatusInternalServerError, "responseFn should not be nil") + writeErrorResponse(rw, http.StatusInternalServerError, "responseFn should not be nil") return rw } responses, headers, encoding, code, err := getResponses(req, cli, responseFn) if err != nil { - writeResponse(rw, code, fmt.Sprintf("unexpected error %v", err)) + writeErrorResponse(rw, code, fmt.Sprintf("unexpected error %v", err)) return rw } body, err := buildResponse(responses, encoding) if err != nil { - writeResponse(rw, http.StatusInternalServerError, fmt.Sprintf("error formatting responose %v", err)) + writeErrorResponse(rw, http.StatusInternalServerError, fmt.Sprintf("error formatting responose %v", err)) return rw } writeResponseBytes(rw, code, body) @@ -391,8 +391,12 @@ func writeResponseBytes(rw http.ResponseWriter, code int, msg []byte) { } } -func writeResponse(rw http.ResponseWriter, code int, msg string) { - writeResponseBytes(rw, code, []byte(msg)) +func writeErrorResponse(rw http.ResponseWriter, code int, msg string) { + errorBody := map[string]string{ + "error": msg, + } + json, _ := json.Marshal(errorBody) + writeResponseBytes(rw, code, json) } func (s *Service) getDataSourceFromHTTPReq(req *http.Request) (*datasourceInfo, error) {