From c8a71a2f9164f485b001d97e1dcef0dfa985cd42 Mon Sep 17 00:00:00 2001 From: Will Browne Date: Fri, 29 Apr 2022 12:08:40 +0200 Subject: [PATCH] Plugins: Ensure catching all appropriate 4xx api/ds/query scenarios (#47565) * catch ds 404s * catch plugin errs * go step back --- pkg/api/metrics.go | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/pkg/api/metrics.go b/pkg/api/metrics.go index d2e1e5503a2..c37f371ce00 100644 --- a/pkg/api/metrics.go +++ b/pkg/api/metrics.go @@ -10,6 +10,7 @@ import ( "github.com/grafana/grafana/pkg/api/dtos" "github.com/grafana/grafana/pkg/api/response" "github.com/grafana/grafana/pkg/models" + "github.com/grafana/grafana/pkg/plugins/backendplugin" "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/query" "github.com/grafana/grafana/pkg/services/sqlstore" @@ -18,17 +19,6 @@ import ( "github.com/grafana/grafana/pkg/web" ) -func (hs *HTTPServer) handleQueryMetricsError(err error) *response.NormalResponse { - if errors.Is(err, models.ErrDataSourceAccessDenied) { - return response.Error(http.StatusForbidden, "Access denied to data source", err) - } - var badQuery *query.ErrBadQuery - if errors.As(err, &badQuery) { - return response.Error(http.StatusBadRequest, util.Capitalize(badQuery.Message), err) - } - return response.Error(http.StatusInternalServerError, "Query data error", err) -} - // QueryMetricsV2 returns query metrics. // POST /api/ds/query DataSource query w/ expressions func (hs *HTTPServer) QueryMetricsV2(c *models.ReqContext) response.Response { @@ -44,6 +34,25 @@ func (hs *HTTPServer) QueryMetricsV2(c *models.ReqContext) response.Response { return toJsonStreamingResponse(resp) } +func (hs *HTTPServer) handleQueryMetricsError(err error) *response.NormalResponse { + if errors.Is(err, models.ErrDataSourceAccessDenied) { + return response.Error(http.StatusForbidden, "Access denied to data source", err) + } + if errors.Is(err, models.ErrDataSourceNotFound) { + return response.Error(http.StatusNotFound, "Data source not found", err) + } + var badQuery *query.ErrBadQuery + if errors.As(err, &badQuery) { + return response.Error(http.StatusBadRequest, util.Capitalize(badQuery.Message), err) + } + + if errors.Is(err, backendplugin.ErrPluginNotRegistered) { + return response.Error(http.StatusNotFound, "Plugin not found", err) + } + + return response.Error(http.StatusInternalServerError, "Query data error", err) +} + func parseDashboardQueryParams(params map[string]string) (models.GetDashboardQuery, int64, error) { query := models.GetDashboardQuery{} @@ -101,8 +110,8 @@ func checkDashboardAndPanel(ctx context.Context, ss sqlstore.Store, query models return models.ErrDashboardPanelNotFound } -// QueryMetricsV2 returns query metrics. -// POST /api/ds/query DataSource query w/ expressions +// QueryMetricsFromDashboard returns query metrics. +// POST /dashboards/org/:orgId/uid/:dashboardUid/panels/:panelId/query DataSource query w/ expressions func (hs *HTTPServer) QueryMetricsFromDashboard(c *models.ReqContext) response.Response { // check feature flag if !hs.Features.IsEnabled(featuremgmt.FlagValidatedQueries) {