From 9f75a448d47beac1da545a6e7f485916aa9b23cb Mon Sep 17 00:00:00 2001 From: Andreas Christou Date: Fri, 6 Dec 2024 18:16:23 +0000 Subject: [PATCH] Azure/GCM: Improve error display (#96921) Improve handling of errors --- .../azuremonitor-resource-handler.go | 16 +++++++++------ pkg/tsdb/cloud-monitoring/resource_handler.go | 20 +++++++++++-------- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/pkg/tsdb/azuremonitor/azuremonitor-resource-handler.go b/pkg/tsdb/azuremonitor/azuremonitor-resource-handler.go index 454f6830172..96f3f53b952 100644 --- a/pkg/tsdb/azuremonitor/azuremonitor-resource-handler.go +++ b/pkg/tsdb/azuremonitor/azuremonitor-resource-handler.go @@ -116,9 +116,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, + } + json, _ := json.Marshal(errorBody) + _, err := rw.Write(json) if err != nil { backend.Logger.Error("Unable to write HTTP response", "error", err) } @@ -130,20 +134,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 @@ -152,7 +156,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 c9b23b036a4..bc68b9d99a8 100644 --- a/pkg/tsdb/cloud-monitoring/resource_handler.go +++ b/pkg/tsdb/cloud-monitoring/resource_handler.go @@ -38,13 +38,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) @@ -54,7 +54,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) @@ -63,19 +63,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) @@ -390,8 +390,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) {