[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:
co-authored by
Andreas Christou
parent
ad123f0087
commit
4efbbfb09c
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user