mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Errors: Make errors the same in dev as prod (#77366)
When running in dev mode, error messages would contain an additional "error" property alongside "message". Since this causes confusion, that has been removed and now error messages are the same both modes (using "message").
This commit is contained in:
parent
40df27a4da
commit
e4d1fdc3d0
@ -230,7 +230,7 @@ func TestAdminAPIEndpoint(t *testing.T) {
|
|||||||
|
|
||||||
respJSON, err := simplejson.NewJson(sc.resp.Body.Bytes())
|
respJSON, err := simplejson.NewJson(sc.resp.Body.Bytes())
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
assert.Equal(t, "user already exists", respJSON.Get("error").MustString())
|
assert.Equal(t, "User with email '' or username 'existing@example.com' already exists", respJSON.Get("message").MustString())
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@ package api
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
@ -261,7 +260,7 @@ func TestSetFeatureToggles(t *testing.T) {
|
|||||||
res := runSetScenario(t, features, updates, s, writePermissions, http.StatusBadRequest)
|
res := runSetScenario(t, features, updates, s, writePermissions, http.StatusBadRequest)
|
||||||
defer func() { require.NoError(t, res.Body.Close()) }()
|
defer func() { require.NoError(t, res.Body.Close()) }()
|
||||||
p := readBody(t, res.Body)
|
p := readBody(t, res.Body)
|
||||||
assert.Equal(t, fmt.Sprintf("invalid toggle passed in: %s", featuremgmt.FlagFeatureToggleAdminPage), p["error"])
|
assert.Equal(t, "invalid toggle passed in", p["message"])
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("because it is not GA or Deprecated", func(t *testing.T) {
|
t.Run("because it is not GA or Deprecated", func(t *testing.T) {
|
||||||
@ -274,7 +273,7 @@ func TestSetFeatureToggles(t *testing.T) {
|
|||||||
res := runSetScenario(t, features, updates, s, writePermissions, http.StatusBadRequest)
|
res := runSetScenario(t, features, updates, s, writePermissions, http.StatusBadRequest)
|
||||||
defer func() { require.NoError(t, res.Body.Close()) }()
|
defer func() { require.NoError(t, res.Body.Close()) }()
|
||||||
p := readBody(t, res.Body)
|
p := readBody(t, res.Body)
|
||||||
assert.Equal(t, "invalid toggle passed in: toggle2", p["error"])
|
assert.Equal(t, "invalid toggle passed in", p["message"])
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("because it is configured to be read-only", func(t *testing.T) {
|
t.Run("because it is configured to be read-only", func(t *testing.T) {
|
||||||
@ -287,7 +286,7 @@ func TestSetFeatureToggles(t *testing.T) {
|
|||||||
res := runSetScenario(t, features, updates, s, writePermissions, http.StatusBadRequest)
|
res := runSetScenario(t, features, updates, s, writePermissions, http.StatusBadRequest)
|
||||||
defer func() { require.NoError(t, res.Body.Close()) }()
|
defer func() { require.NoError(t, res.Body.Close()) }()
|
||||||
p := readBody(t, res.Body)
|
p := readBody(t, res.Body)
|
||||||
assert.Equal(t, "invalid toggle passed in: toggle3", p["error"])
|
assert.Equal(t, "invalid toggle passed in", p["message"])
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -162,7 +162,7 @@ func TestAPIEndpoint_Metrics_PluginDecryptionFailure(t *testing.T) {
|
|||||||
var resObj secretsErrorResponseBody
|
var resObj secretsErrorResponseBody
|
||||||
err = json.Unmarshal(buf.Bytes(), &resObj)
|
err = json.Unmarshal(buf.Bytes(), &resObj)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.Equal(t, "unknown error", resObj.Error)
|
require.Equal(t, "", resObj.Error)
|
||||||
require.Contains(t, resObj.Message, "Secrets Plugin error:")
|
require.Contains(t, resObj.Message, "Secrets Plugin error:")
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@ -264,12 +264,12 @@ func TestDataSourceQueryError(t *testing.T) {
|
|||||||
{
|
{
|
||||||
request: reqDatasourceByUidNotFound,
|
request: reqDatasourceByUidNotFound,
|
||||||
expectedStatus: http.StatusNotFound,
|
expectedStatus: http.StatusNotFound,
|
||||||
expectedBody: `{"error":"data source not found","message":"Data source not found","traceID":""}`,
|
expectedBody: `{"message":"Data source not found","traceID":""}`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
request: reqDatasourceByIdNotFound,
|
request: reqDatasourceByIdNotFound,
|
||||||
expectedStatus: http.StatusNotFound,
|
expectedStatus: http.StatusNotFound,
|
||||||
expectedBody: `{"error":"data source not found","message":"Data source not found","traceID":""}`,
|
expectedBody: `{"message":"Data source not found","traceID":""}`,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,7 +128,7 @@ func TestCallResource(t *testing.T) {
|
|||||||
_, err = io.Copy(body, resp.Body)
|
_, err = io.Copy(body, resp.Body)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
expectedBody := `{ "error": "something went wrong", "message": "Failed to call resource", "traceID": "" }`
|
expectedBody := `{ "message": "Failed to call resource", "traceID": "" }`
|
||||||
require.JSONEq(t, expectedBody, body.String())
|
require.JSONEq(t, expectedBody, body.String())
|
||||||
require.NoError(t, resp.Body.Close())
|
require.NoError(t, resp.Body.Close())
|
||||||
require.Equal(t, 500, resp.StatusCode)
|
require.Equal(t, 500, resp.StatusCode)
|
||||||
|
@ -15,7 +15,6 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/infra/tracing"
|
"github.com/grafana/grafana/pkg/infra/tracing"
|
||||||
"github.com/grafana/grafana/pkg/middleware/requestmeta"
|
"github.com/grafana/grafana/pkg/middleware/requestmeta"
|
||||||
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
|
contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
|
||||||
"github.com/grafana/grafana/pkg/setting"
|
|
||||||
"github.com/grafana/grafana/pkg/util/errutil"
|
"github.com/grafana/grafana/pkg/util/errutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -253,12 +252,6 @@ func Error(status int, message string, err error) *NormalResponse {
|
|||||||
data["message"] = message
|
data["message"] = message
|
||||||
}
|
}
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
if setting.Env != setting.Prod {
|
|
||||||
data["error"] = err.Error()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
resp := JSON(status, data)
|
resp := JSON(status, data)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -46,11 +46,9 @@ func (ctx *ReqContext) Handle(cfg *setting.Cfg, status int, title string, err er
|
|||||||
Theme string
|
Theme string
|
||||||
ErrorMsg error
|
ErrorMsg error
|
||||||
}{title, "Grafana", cfg.AppSubURL, "dark", nil}
|
}{title, "Grafana", cfg.AppSubURL, "dark", nil}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Logger.Error(title, "error", err)
|
ctx.Logger.Error(title, "error", err)
|
||||||
if setting.Env != setting.Prod {
|
|
||||||
data.ErrorMsg = err
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.HTML(status, cfg.ErrTemplateName, data)
|
ctx.HTML(status, cfg.ErrTemplateName, data)
|
||||||
@ -75,10 +73,6 @@ func (ctx *ReqContext) JsonApiErr(status int, message string, err error) {
|
|||||||
} else {
|
} else {
|
||||||
ctx.Logger.Warn(message, "error", err, "traceID", traceID)
|
ctx.Logger.Warn(message, "error", err, "traceID", traceID)
|
||||||
}
|
}
|
||||||
|
|
||||||
if setting.Env != setting.Prod {
|
|
||||||
resp["error"] = err.Error()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch status {
|
switch status {
|
||||||
|
@ -69,19 +69,16 @@ func TestDataProxy(t *testing.T) {
|
|||||||
// Tests request to datasource proxy service
|
// Tests request to datasource proxy service
|
||||||
func TestDatasourceProxy_proxyDatasourceRequest(t *testing.T) {
|
func TestDatasourceProxy_proxyDatasourceRequest(t *testing.T) {
|
||||||
tcs := []struct {
|
tcs := []struct {
|
||||||
name string
|
name string
|
||||||
dsURL string
|
dsURL string
|
||||||
expectedErrorMsg string
|
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
name: "Empty datasource URL will return a 400 HTTP status code",
|
name: "Empty datasource URL will return a 400 HTTP status code",
|
||||||
dsURL: "",
|
dsURL: "",
|
||||||
expectedErrorMsg: "validation of data source URL \"\" failed: empty URL string",
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Invalid datasource URL will return a 400 HTTP status code",
|
name: "Invalid datasource URL will return a 400 HTTP status code",
|
||||||
dsURL: "://host/path",
|
dsURL: "://host/path",
|
||||||
expectedErrorMsg: "validation of data source URL \"://host/path\" failed: parse \"://host/path\": missing protocol scheme",
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
for _, tc := range tcs {
|
for _, tc := range tcs {
|
||||||
@ -124,7 +121,6 @@ func TestDatasourceProxy_proxyDatasourceRequest(t *testing.T) {
|
|||||||
|
|
||||||
require.Equal(t, http.StatusBadRequest, resp.StatusCode)
|
require.Equal(t, http.StatusBadRequest, resp.StatusCode)
|
||||||
require.Equal(t, fmt.Sprintf("Invalid data source URL: %q", tc.dsURL), jsonBody["message"])
|
require.Equal(t, fmt.Sprintf("Invalid data source URL: %q", tc.dsURL), jsonBody["message"])
|
||||||
require.Equal(t, tc.expectedErrorMsg, jsonBody["error"])
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -180,7 +180,6 @@ func TestGetUserFromLDAPAPIEndpoint_OrgNotfound(t *testing.T) {
|
|||||||
var resMap map[string]interface{}
|
var resMap map[string]interface{}
|
||||||
err = json.Unmarshal(bodyBytes, &resMap)
|
err = json.Unmarshal(bodyBytes, &resMap)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, "unable to find organization with ID '2'", resMap["error"])
|
|
||||||
assert.Equal(t, "An organization was not found - Please verify your LDAP configuration", resMap["message"])
|
assert.Equal(t, "An organization was not found - Please verify your LDAP configuration", resMap["message"])
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -499,7 +498,6 @@ func TestPostSyncUserWithLDAPAPIEndpoint_WhenGrafanaAdmin(t *testing.T) {
|
|||||||
var resMap map[string]interface{}
|
var resMap map[string]interface{}
|
||||||
err = json.Unmarshal(bodyBytes, &resMap)
|
err = json.Unmarshal(bodyBytes, &resMap)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, "did not find a user", resMap["error"])
|
|
||||||
assert.Equal(t, "Refusing to sync grafana super admin \"ldap-daniel\" - it would be disabled", resMap["message"])
|
assert.Equal(t, "Refusing to sync grafana super admin \"ldap-daniel\" - it would be disabled", resMap["message"])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ func TestProvisioningApi(t *testing.T) {
|
|||||||
response := sut.RoutePutPolicyTree(&rc, tree)
|
response := sut.RoutePutPolicyTree(&rc, tree)
|
||||||
|
|
||||||
require.Equal(t, 400, response.Status())
|
require.Equal(t, 400, response.Status())
|
||||||
expBody := `{"error":"invalid object specification: invalid policy tree","message":"invalid object specification: invalid policy tree"}`
|
expBody := `{"message":"invalid object specification: invalid policy tree"}`
|
||||||
require.Equal(t, expBody, string(response.Body()))
|
require.Equal(t, expBody, string(response.Body()))
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -133,7 +133,6 @@ func TestIntegrationCreateCorrelation(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, "Data source not found", response.Message)
|
require.Equal(t, "Data source not found", response.Message)
|
||||||
require.Equal(t, correlations.ErrSourceDataSourceDoesNotExists.Error(), response.Error)
|
|
||||||
|
|
||||||
require.NoError(t, res.Body.Close())
|
require.NoError(t, res.Body.Close())
|
||||||
})
|
})
|
||||||
@ -161,7 +160,6 @@ func TestIntegrationCreateCorrelation(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, "Data source not found", response.Message)
|
require.Equal(t, "Data source not found", response.Message)
|
||||||
require.Equal(t, correlations.ErrTargetDataSourceDoesNotExists.Error(), response.Error)
|
|
||||||
|
|
||||||
require.NoError(t, res.Body.Close())
|
require.NoError(t, res.Body.Close())
|
||||||
})
|
})
|
||||||
@ -357,8 +355,6 @@ func TestIntegrationCreateCorrelation(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Contains(t, response.Message, "bad request data")
|
require.Contains(t, response.Message, "bad request data")
|
||||||
require.Contains(t, response.Error, correlations.ErrInvalidConfigType.Error())
|
|
||||||
require.Contains(t, response.Error, configType)
|
|
||||||
|
|
||||||
require.NoError(t, res.Body.Close())
|
require.NoError(t, res.Body.Close())
|
||||||
})
|
})
|
||||||
|
@ -106,7 +106,6 @@ func TestIntegrationDeleteCorrelation(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, "Data source not found", response.Message)
|
require.Equal(t, "Data source not found", response.Message)
|
||||||
require.Equal(t, correlations.ErrSourceDataSourceDoesNotExists.Error(), response.Error)
|
|
||||||
|
|
||||||
require.NoError(t, res.Body.Close())
|
require.NoError(t, res.Body.Close())
|
||||||
})
|
})
|
||||||
@ -126,7 +125,6 @@ func TestIntegrationDeleteCorrelation(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, "Correlation not found", response.Message)
|
require.Equal(t, "Correlation not found", response.Message)
|
||||||
require.Equal(t, correlations.ErrCorrelationNotFound.Error(), response.Error)
|
|
||||||
|
|
||||||
require.NoError(t, res.Body.Close())
|
require.NoError(t, res.Body.Close())
|
||||||
})
|
})
|
||||||
@ -153,7 +151,6 @@ func TestIntegrationDeleteCorrelation(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, "Correlation can only be edited via provisioning", response.Message)
|
require.Equal(t, "Correlation can only be edited via provisioning", response.Message)
|
||||||
require.Equal(t, correlations.ErrCorrelationReadOnly.Error(), response.Error)
|
|
||||||
|
|
||||||
require.NoError(t, res.Body.Close())
|
require.NoError(t, res.Body.Close())
|
||||||
})
|
})
|
||||||
|
@ -100,7 +100,6 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, "Data source not found", response.Message)
|
require.Equal(t, "Data source not found", response.Message)
|
||||||
require.Equal(t, correlations.ErrSourceDataSourceDoesNotExists.Error(), response.Error)
|
|
||||||
|
|
||||||
require.NoError(t, res.Body.Close())
|
require.NoError(t, res.Body.Close())
|
||||||
})
|
})
|
||||||
@ -123,7 +122,6 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, "Correlation not found", response.Message)
|
require.Equal(t, "Correlation not found", response.Message)
|
||||||
require.Equal(t, correlations.ErrCorrelationNotFound.Error(), response.Error)
|
|
||||||
|
|
||||||
require.NoError(t, res.Body.Close())
|
require.NoError(t, res.Body.Close())
|
||||||
})
|
})
|
||||||
@ -153,7 +151,6 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, "Correlation can only be edited via provisioning", response.Message)
|
require.Equal(t, "Correlation can only be edited via provisioning", response.Message)
|
||||||
require.Equal(t, correlations.ErrCorrelationReadOnly.Error(), response.Error)
|
|
||||||
|
|
||||||
require.NoError(t, res.Body.Close())
|
require.NoError(t, res.Body.Close())
|
||||||
})
|
})
|
||||||
@ -181,7 +178,6 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, "At least one of label, description or config is required", response.Message)
|
require.Equal(t, "At least one of label, description or config is required", response.Message)
|
||||||
require.Equal(t, correlations.ErrUpdateCorrelationEmptyParams.Error(), response.Error)
|
|
||||||
require.NoError(t, res.Body.Close())
|
require.NoError(t, res.Body.Close())
|
||||||
|
|
||||||
// empty body
|
// empty body
|
||||||
@ -199,7 +195,6 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, "At least one of label, description or config is required", response.Message)
|
require.Equal(t, "At least one of label, description or config is required", response.Message)
|
||||||
require.Equal(t, correlations.ErrUpdateCorrelationEmptyParams.Error(), response.Error)
|
|
||||||
require.NoError(t, res.Body.Close())
|
require.NoError(t, res.Body.Close())
|
||||||
|
|
||||||
// all set to null
|
// all set to null
|
||||||
@ -221,7 +216,6 @@ func TestIntegrationUpdateCorrelation(t *testing.T) {
|
|||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
require.Equal(t, "At least one of label, description or config is required", response.Message)
|
require.Equal(t, "At least one of label, description or config is required", response.Message)
|
||||||
require.Equal(t, correlations.ErrUpdateCorrelationEmptyParams.Error(), response.Error)
|
|
||||||
require.NoError(t, res.Body.Close())
|
require.NoError(t, res.Body.Close())
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user