From 27070c252d56be798c99e0679cfbcfb17f23a6e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Thu, 2 Mar 2023 13:09:58 +0100 Subject: [PATCH] ErrorHandling: Fixes issues with bad error messages (#63775) --- .../src/services/backendSrv.ts | 1 + pkg/api/login.go | 3 ++- public/app/core/services/backend_srv.ts | 5 +++++ public/app/core/specs/backend_srv.test.ts | 20 +++++++++++++++++++ public/app/core/utils/errors.ts | 9 ++++++--- 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/packages/grafana-runtime/src/services/backendSrv.ts b/packages/grafana-runtime/src/services/backendSrv.ts index 90df2ad263f..15671891069 100644 --- a/packages/grafana-runtime/src/services/backendSrv.ts +++ b/packages/grafana-runtime/src/services/backendSrv.ts @@ -118,6 +118,7 @@ export interface FetchError { status: number; statusText?: string; data: T; + message?: string; cancelled?: boolean; isHandled?: boolean; config: BackendSrvRequest; diff --git a/pkg/api/login.go b/pkg/api/login.go index 11bdd24fc66..92580302b5f 100644 --- a/pkg/api/login.go +++ b/pkg/api/login.go @@ -24,6 +24,7 @@ import ( "github.com/grafana/grafana/pkg/services/secrets" "github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/setting" + "github.com/grafana/grafana/pkg/util" "github.com/grafana/grafana/pkg/web" ) @@ -190,7 +191,7 @@ func (hs *HTTPServer) tryAutoLogin(c *contextmodel.ReqContext) bool { func (hs *HTTPServer) LoginAPIPing(c *contextmodel.ReqContext) response.Response { if c.IsSignedIn || c.IsAnonymous { - return response.JSON(http.StatusOK, "Logged in") + return response.JSON(http.StatusOK, util.DynMap{"message": "Logged in"}) } return response.Error(401, "Unauthorized", nil) diff --git a/public/app/core/services/backend_srv.ts b/public/app/core/services/backend_srv.ts index a16ffd71cfc..81b563fbbdd 100644 --- a/public/app/core/services/backend_srv.ts +++ b/public/app/core/services/backend_srv.ts @@ -317,6 +317,11 @@ export class BackendSrv implements BackendService { let description = ''; let message = err.data.message; + // Sometimes we have a better error message on err.message + if (message === 'Unexpected error' && err.message) { + message = err.message; + } + if (message.length > 80) { description = message; message = 'Error'; diff --git a/public/app/core/specs/backend_srv.test.ts b/public/app/core/specs/backend_srv.test.ts index 7bc6335ff53..a0fe3067587 100644 --- a/public/app/core/specs/backend_srv.test.ts +++ b/public/app/core/specs/backend_srv.test.ts @@ -275,6 +275,26 @@ describe('backendSrv', () => { 'bogus-trace-id', ]); }); + + it('It should favor error.message for fetch errors when error.data.message is Unexpected error', async () => { + const { backendSrv, appEventsMock } = getTestContext({}); + backendSrv.showErrorAlert( + { + url: 'api/do/something', + } as BackendSrvRequest, + { + data: { + message: 'Unexpected error', + }, + message: 'Failed to fetch', + status: 500, + config: { + url: '', + }, + } as FetchError + ); + expect(appEventsMock.emit).toHaveBeenCalledWith(AppEvents.alertError, ['Failed to fetch', '']); + }); }); }); diff --git a/public/app/core/utils/errors.ts b/public/app/core/utils/errors.ts index 59f8468d6b4..42992b6975b 100644 --- a/public/app/core/utils/errors.ts +++ b/public/app/core/utils/errors.ts @@ -1,10 +1,12 @@ import { isFetchError } from '@grafana/runtime'; export function getMessageFromError(err: unknown): string { + if (typeof err === 'string') { + return err; + } + if (err) { - if (typeof err === 'string') { - return err; - } else if (err instanceof Error) { + if (err instanceof Error) { return err.message; } else if (isFetchError(err)) { if (err.data && err.data.message) { @@ -14,5 +16,6 @@ export function getMessageFromError(err: unknown): string { } } } + return JSON.stringify(err); }