Errors: Introduce error type with Grafana specific metadata (#47504)

This commit is contained in:
Emil Tullstedt
2022-06-14 10:50:11 +02:00
committed by GitHub
parent 2d3cc26aa8
commit 264c2a9d1e
8 changed files with 632 additions and 2 deletions

View File

@@ -3,12 +3,17 @@ package response
import (
"bytes"
"encoding/json"
"errors"
"fmt"
"net/http"
"reflect"
jsoniter "github.com/json-iterator/go"
"github.com/grafana/grafana/pkg/infra/tracing"
"github.com/grafana/grafana/pkg/models"
"github.com/grafana/grafana/pkg/setting"
jsoniter "github.com/json-iterator/go"
"github.com/grafana/grafana/pkg/util/errutil"
)
// Response is an HTTP response interface.
@@ -82,7 +87,13 @@ func (r *NormalResponse) WriteTo(ctx *models.ReqContext) {
r.body = bytes.NewBuffer(b)
}
}
ctx.Logger.Error(r.errMessage, "error", r.err, "remote_addr", ctx.RemoteAddr(), "traceID", traceID)
logger := ctx.Logger.Error
var gfErr *errutil.Error
if errors.As(r.err, &gfErr) {
logger = gfErr.LogLevel.LogFunc(ctx.Logger)
}
logger(r.errMessage, "error", r.err, "remote_addr", ctx.RemoteAddr(), "traceID", traceID)
}
header := ctx.Resp.Header()
@@ -214,6 +225,20 @@ func Error(status int, message string, err error) *NormalResponse {
return resp
}
// Err creates an error response based on an errutil.Error error.
func Err(err error) *NormalResponse {
grafanaErr := &errutil.Error{}
if !errors.As(err, grafanaErr) {
return Error(http.StatusInternalServerError, "", fmt.Errorf("unexpected error type [%s]: %w", reflect.TypeOf(err), err))
}
resp := JSON(grafanaErr.Reason.Status().HTTPStatus(), grafanaErr.Public())
resp.errMessage = string(grafanaErr.Reason.Status())
resp.err = grafanaErr
return resp
}
// Empty creates an empty NormalResponse.
func Empty(status int) *NormalResponse {
return Respond(status, nil)