mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Plugins: Remove datasourceQueryMultiStatus feature toggle (#90191)
* Remove datasourceQueryMultiStatus feature toggle * PR review suggestion
This commit is contained in:
parent
4e03ca5c1c
commit
9216a3df7d
@ -114,7 +114,6 @@ Experimental features might be changed or removed without prior notice.
|
|||||||
| `publicDashboardsScene` | Enables public dashboard rendering using scenes |
|
| `publicDashboardsScene` | Enables public dashboard rendering using scenes |
|
||||||
| `lokiExperimentalStreaming` | Support new streaming approach for loki (prototype, needs special loki build) |
|
| `lokiExperimentalStreaming` | Support new streaming approach for loki (prototype, needs special loki build) |
|
||||||
| `storage` | Configurable storage for dashboards, datasources, and resources |
|
| `storage` | Configurable storage for dashboards, datasources, and resources |
|
||||||
| `datasourceQueryMultiStatus` | Introduce HTTP 207 Multi Status for api/ds/query |
|
|
||||||
| `canvasPanelNesting` | Allow elements nesting |
|
| `canvasPanelNesting` | Allow elements nesting |
|
||||||
| `disableSecretsCompatibility` | Disable duplicated secret storage in legacy tables |
|
| `disableSecretsCompatibility` | Disable duplicated secret storage in legacy tables |
|
||||||
| `logRequestsInstrumentedAsUnknown` | Logs the path for requests that are instrumented as unknown |
|
| `logRequestsInstrumentedAsUnknown` | Logs the path for requests that are instrumented as unknown |
|
||||||
|
@ -29,7 +29,6 @@ export interface FeatureToggles {
|
|||||||
featureHighlights?: boolean;
|
featureHighlights?: boolean;
|
||||||
storage?: boolean;
|
storage?: boolean;
|
||||||
correlations?: boolean;
|
correlations?: boolean;
|
||||||
datasourceQueryMultiStatus?: boolean;
|
|
||||||
autoMigrateOldPanels?: boolean;
|
autoMigrateOldPanels?: boolean;
|
||||||
autoMigrateGraphPanel?: boolean;
|
autoMigrateGraphPanel?: boolean;
|
||||||
autoMigrateTablePanel?: boolean;
|
autoMigrateTablePanel?: boolean;
|
||||||
|
@ -84,19 +84,15 @@ func (hs *HTTPServer) QueryMetricsV2(c *contextmodel.ReqContext) response.Respon
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (hs *HTTPServer) toJsonStreamingResponse(ctx context.Context, qdr *backend.QueryDataResponse) response.Response {
|
func (hs *HTTPServer) toJsonStreamingResponse(ctx context.Context, qdr *backend.QueryDataResponse) response.Response {
|
||||||
statusWhenError := http.StatusBadRequest
|
|
||||||
if hs.Features.IsEnabled(ctx, featuremgmt.FlagDatasourceQueryMultiStatus) {
|
|
||||||
statusWhenError = http.StatusMultiStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
statusCode := http.StatusOK
|
statusCode := http.StatusOK
|
||||||
for _, res := range qdr.Responses {
|
for _, res := range qdr.Responses {
|
||||||
if res.Error != nil {
|
if res.Error != nil {
|
||||||
statusCode = statusWhenError
|
statusCode = http.StatusBadRequest
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if statusCode == statusWhenError {
|
if statusCode == http.StatusBadRequest {
|
||||||
// an error in the response we treat as downstream.
|
// an error in the response we treat as downstream.
|
||||||
requestmeta.WithDownstreamStatusSource(ctx)
|
requestmeta.WithDownstreamStatusSource(ctx)
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,6 @@ import (
|
|||||||
"github.com/grafana/grafana/pkg/plugins/manager/registry"
|
"github.com/grafana/grafana/pkg/plugins/manager/registry"
|
||||||
"github.com/grafana/grafana/pkg/services/datasources"
|
"github.com/grafana/grafana/pkg/services/datasources"
|
||||||
fakeDatasources "github.com/grafana/grafana/pkg/services/datasources/fakes"
|
fakeDatasources "github.com/grafana/grafana/pkg/services/datasources/fakes"
|
||||||
"github.com/grafana/grafana/pkg/services/featuremgmt"
|
|
||||||
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginconfig"
|
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginconfig"
|
||||||
"github.com/grafana/grafana/pkg/services/pluginsintegration/plugincontext"
|
"github.com/grafana/grafana/pkg/services/pluginsintegration/plugincontext"
|
||||||
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginsettings"
|
"github.com/grafana/grafana/pkg/services/pluginsintegration/pluginsettings"
|
||||||
@ -79,34 +78,19 @@ func TestAPIEndpoint_Metrics_QueryMetricsV2(t *testing.T) {
|
|||||||
}, &fakeDatasources.FakeCacheService{}, &fakeDatasources.FakeDataSourceService{},
|
}, &fakeDatasources.FakeCacheService{}, &fakeDatasources.FakeDataSourceService{},
|
||||||
pluginSettings.ProvideService(dbtest.NewFakeDB(), secretstest.NewFakeSecretsService()), pluginconfig.NewFakePluginRequestConfigProvider()),
|
pluginSettings.ProvideService(dbtest.NewFakeDB(), secretstest.NewFakeSecretsService()), pluginconfig.NewFakePluginRequestConfigProvider()),
|
||||||
)
|
)
|
||||||
serverFeatureEnabled := SetupAPITestServer(t, func(hs *HTTPServer) {
|
server := SetupAPITestServer(t, func(hs *HTTPServer) {
|
||||||
hs.queryDataService = qds
|
hs.queryDataService = qds
|
||||||
hs.Features = featuremgmt.WithFeatures(featuremgmt.FlagDatasourceQueryMultiStatus, true)
|
|
||||||
hs.QuotaService = quotatest.New(false, nil)
|
|
||||||
})
|
|
||||||
serverFeatureDisabled := SetupAPITestServer(t, func(hs *HTTPServer) {
|
|
||||||
hs.queryDataService = qds
|
|
||||||
hs.Features = featuremgmt.WithFeatures(featuremgmt.FlagDatasourceQueryMultiStatus, false)
|
|
||||||
hs.QuotaService = quotatest.New(false, nil)
|
hs.QuotaService = quotatest.New(false, nil)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Status code is 400 when data source response has an error and feature toggle is disabled", func(t *testing.T) {
|
t.Run("Status code is 400 when data source response has an error", func(t *testing.T) {
|
||||||
req := serverFeatureDisabled.NewPostRequest("/api/ds/query", strings.NewReader(reqValid))
|
req := server.NewPostRequest("/api/ds/query", strings.NewReader(reqValid))
|
||||||
webtest.RequestWithSignedInUser(req, &user.SignedInUser{UserID: 1, OrgID: 1, Permissions: map[int64]map[string][]string{1: {datasources.ActionQuery: []string{datasources.ScopeAll}}}})
|
webtest.RequestWithSignedInUser(req, &user.SignedInUser{UserID: 1, OrgID: 1, Permissions: map[int64]map[string][]string{1: {datasources.ActionQuery: []string{datasources.ScopeAll}}}})
|
||||||
resp, err := serverFeatureDisabled.SendJSON(req)
|
resp, err := server.SendJSON(req)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
require.NoError(t, resp.Body.Close())
|
require.NoError(t, resp.Body.Close())
|
||||||
require.Equal(t, http.StatusBadRequest, resp.StatusCode)
|
require.Equal(t, http.StatusBadRequest, resp.StatusCode)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("Status code is 207 when data source response has an error and feature toggle is enabled", func(t *testing.T) {
|
|
||||||
req := serverFeatureEnabled.NewPostRequest("/api/ds/query", strings.NewReader(reqValid))
|
|
||||||
webtest.RequestWithSignedInUser(req, &user.SignedInUser{UserID: 1, OrgID: 1, Permissions: map[int64]map[string][]string{1: {datasources.ActionQuery: []string{datasources.ScopeAll}}}})
|
|
||||||
resp, err := serverFeatureEnabled.SendJSON(req)
|
|
||||||
require.NoError(t, err)
|
|
||||||
require.NoError(t, resp.Body.Close())
|
|
||||||
require.Equal(t, http.StatusMultiStatus, resp.StatusCode)
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAPIEndpoint_Metrics_PluginDecryptionFailure(t *testing.T) {
|
func TestAPIEndpoint_Metrics_PluginDecryptionFailure(t *testing.T) {
|
||||||
|
@ -38,7 +38,6 @@ type QueryAPIBuilder struct {
|
|||||||
log log.Logger
|
log log.Logger
|
||||||
concurrentQueryLimit int
|
concurrentQueryLimit int
|
||||||
userFacingDefaultError string
|
userFacingDefaultError string
|
||||||
returnMultiStatus bool // from feature toggle
|
|
||||||
features featuremgmt.FeatureToggles
|
features featuremgmt.FeatureToggles
|
||||||
|
|
||||||
tracer tracing.Tracer
|
tracer tracing.Tracer
|
||||||
@ -77,7 +76,6 @@ func NewQueryAPIBuilder(features featuremgmt.FeatureToggles,
|
|||||||
return &QueryAPIBuilder{
|
return &QueryAPIBuilder{
|
||||||
concurrentQueryLimit: 4,
|
concurrentQueryLimit: 4,
|
||||||
log: log.New("query_apiserver"),
|
log: log.New("query_apiserver"),
|
||||||
returnMultiStatus: features.IsEnabledGlobally(featuremgmt.FlagDatasourceQueryMultiStatus),
|
|
||||||
client: client,
|
client: client,
|
||||||
registry: registry,
|
registry: registry,
|
||||||
parser: newQueryParser(reader, legacy, tracer),
|
parser: newQueryParser(reader, legacy, tracer),
|
||||||
|
@ -99,12 +99,6 @@ var (
|
|||||||
Expression: "true", // enabled by default
|
Expression: "true", // enabled by default
|
||||||
AllowSelfServe: true,
|
AllowSelfServe: true,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
Name: "datasourceQueryMultiStatus",
|
|
||||||
Description: "Introduce HTTP 207 Multi Status for api/ds/query",
|
|
||||||
Stage: FeatureStageExperimental,
|
|
||||||
Owner: grafanaPluginsPlatformSquad,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
Name: "autoMigrateOldPanels",
|
Name: "autoMigrateOldPanels",
|
||||||
Description: "Migrate old angular panels to supported versions (graph, table-old, worldmap, etc)",
|
Description: "Migrate old angular panels to supported versions (graph, table-old, worldmap, etc)",
|
||||||
|
@ -10,7 +10,6 @@ lokiExperimentalStreaming,experimental,@grafana/observability-logs,false,false,f
|
|||||||
featureHighlights,GA,@grafana/grafana-as-code,false,false,false
|
featureHighlights,GA,@grafana/grafana-as-code,false,false,false
|
||||||
storage,experimental,@grafana/grafana-app-platform-squad,false,false,false
|
storage,experimental,@grafana/grafana-app-platform-squad,false,false,false
|
||||||
correlations,GA,@grafana/explore-squad,false,false,false
|
correlations,GA,@grafana/explore-squad,false,false,false
|
||||||
datasourceQueryMultiStatus,experimental,@grafana/plugins-platform-backend,false,false,false
|
|
||||||
autoMigrateOldPanels,preview,@grafana/dataviz-squad,false,false,true
|
autoMigrateOldPanels,preview,@grafana/dataviz-squad,false,false,true
|
||||||
autoMigrateGraphPanel,preview,@grafana/dataviz-squad,false,false,true
|
autoMigrateGraphPanel,preview,@grafana/dataviz-squad,false,false,true
|
||||||
autoMigrateTablePanel,preview,@grafana/dataviz-squad,false,false,true
|
autoMigrateTablePanel,preview,@grafana/dataviz-squad,false,false,true
|
||||||
|
|
@ -51,10 +51,6 @@ const (
|
|||||||
// Correlations page
|
// Correlations page
|
||||||
FlagCorrelations = "correlations"
|
FlagCorrelations = "correlations"
|
||||||
|
|
||||||
// FlagDatasourceQueryMultiStatus
|
|
||||||
// Introduce HTTP 207 Multi Status for api/ds/query
|
|
||||||
FlagDatasourceQueryMultiStatus = "datasourceQueryMultiStatus"
|
|
||||||
|
|
||||||
// FlagAutoMigrateOldPanels
|
// FlagAutoMigrateOldPanels
|
||||||
// Migrate old angular panels to supported versions (graph, table-old, worldmap, etc)
|
// Migrate old angular panels to supported versions (graph, table-old, worldmap, etc)
|
||||||
FlagAutoMigrateOldPanels = "autoMigrateOldPanels"
|
FlagAutoMigrateOldPanels = "autoMigrateOldPanels"
|
||||||
|
@ -825,7 +825,8 @@
|
|||||||
"metadata": {
|
"metadata": {
|
||||||
"name": "datasourceQueryMultiStatus",
|
"name": "datasourceQueryMultiStatus",
|
||||||
"resourceVersion": "1718727528075",
|
"resourceVersion": "1718727528075",
|
||||||
"creationTimestamp": "2022-05-03T16:02:20Z"
|
"creationTimestamp": "2022-05-03T16:02:20Z",
|
||||||
|
"deletionTimestamp": "2024-07-08T14:46:08Z"
|
||||||
},
|
},
|
||||||
"spec": {
|
"spec": {
|
||||||
"description": "Introduce HTTP 207 Multi Status for api/ds/query",
|
"description": "Introduce HTTP 207 Multi Status for api/ds/query",
|
||||||
|
@ -302,15 +302,11 @@ func (api *Api) DeletePublicDashboard(c *contextmodel.ReqContext) response.Respo
|
|||||||
|
|
||||||
// Copied from pkg/api/metrics.go
|
// Copied from pkg/api/metrics.go
|
||||||
func toJsonStreamingResponse(ctx context.Context, features featuremgmt.FeatureToggles, qdr *backend.QueryDataResponse) response.Response {
|
func toJsonStreamingResponse(ctx context.Context, features featuremgmt.FeatureToggles, qdr *backend.QueryDataResponse) response.Response {
|
||||||
statusWhenError := http.StatusBadRequest
|
|
||||||
if features.IsEnabled(ctx, featuremgmt.FlagDatasourceQueryMultiStatus) {
|
|
||||||
statusWhenError = http.StatusMultiStatus
|
|
||||||
}
|
|
||||||
|
|
||||||
statusCode := http.StatusOK
|
statusCode := http.StatusOK
|
||||||
for _, res := range qdr.Responses {
|
for _, res := range qdr.Responses {
|
||||||
if res.Error != nil {
|
if res.Error != nil {
|
||||||
statusCode = statusWhenError
|
statusCode = http.StatusBadRequest
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user