[v10.4.x] Azure/GCM: Improve error display (#97590)

Azure/GCM: Improve error display (#96921)

Improve handling of errors

(cherry picked from commit 9f75a448d4)

Co-authored-by: Andreas Christou <andreas.christou@grafana.com>
This commit is contained in:
grafana-delivery-bot[bot]
2024-12-06 21:57:37 +02:00
committed by GitHub
co-authored by Andreas Christou
parent ad123f0087
commit 4efbbfb09c
2 changed files with 23 additions and 14 deletions
@@ -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
}
}
+12 -8
View File
@@ -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) {