diff --git a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md index 999967ada68..0d755b205e1 100644 --- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md +++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md @@ -19,49 +19,48 @@ This page contains a list of available feature toggles. To learn how to turn on Some features are enabled by default. You can disable these feature by setting the feature flag to "false" in the configuration. -| Feature toggle name | Description | Enabled by default | -| ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | -| `disableEnvelopeEncryption` | Disable envelope encryption (emergency only) | | -| `publicDashboards` | [Deprecated] Public dashboards are now enabled by default; to disable them, use the configuration setting. This feature toggle will be removed in the next major version. | Yes | -| `featureHighlights` | Highlight Grafana Enterprise features | | -| `correlations` | Correlations page | | -| `exploreContentOutline` | Content outline sidebar | Yes | -| `cloudWatchCrossAccountQuerying` | Enables cross-account querying in CloudWatch datasources | Yes | -| `nestedFolders` | Enable folder nesting | Yes | -| `nestedFolderPicker` | Enables the new folder picker to work with nested folders. Requires the nestedFolders feature toggle | Yes | -| `logsContextDatasourceUi` | Allow datasource to provide custom UI for context view | Yes | -| `lokiQuerySplitting` | Split large interval queries into subqueries with smaller time intervals | Yes | -| `prometheusMetricEncyclopedia` | Adds the metrics explorer component to the Prometheus query builder as an option in metric select | Yes | -| `influxdbBackendMigration` | Query InfluxDB InfluxQL without the proxy | Yes | -| `prometheusDataplane` | Changes responses to from Prometheus to be compliant with the dataplane specification. In particular, when this feature toggle is active, the numeric `Field.Name` is set from 'Value' to the value of the `__name__` label. | Yes | -| `lokiMetricDataplane` | Changes metric responses from Loki to be compliant with the dataplane specification. | Yes | -| `dataplaneFrontendFallback` | Support dataplane contract field name change for transformations and field name matchers where the name is different | Yes | -| `enableElasticsearchBackendQuerying` | Enable the processing of queries and responses in the Elasticsearch data source through backend | Yes | -| `recordedQueriesMulti` | Enables writing multiple items from a single query within Recorded Queries | Yes | -| `pluginsDynamicAngularDetectionPatterns` | Enables fetching Angular detection patterns for plugins from GCOM and fallback to hardcoded ones | Yes | -| `logsExploreTableVisualisation` | A table visualisation for logs in Explore | Yes | -| `transformationsRedesign` | Enables the transformations redesign | Yes | -| `traceQLStreaming` | Enables response streaming of TraceQL queries of the Tempo data source | | -| `awsAsyncQueryCaching` | Enable caching for async queries for Redshift and Athena. Requires that the datasource has caching and async query support enabled | Yes | -| `prometheusConfigOverhaulAuth` | Update the Prometheus configuration page with the new auth component | Yes | -| `influxdbSqlSupport` | Enable InfluxDB SQL query language support with new querying UI | Yes | -| `alertingNoDataErrorExecution` | Changes how Alerting state manager handles execution of NoData/Error | Yes | -| `angularDeprecationUI` | Display Angular warnings in dashboards and panels | Yes | -| `dashgpt` | Enable AI powered features in dashboards | Yes | -| `alertingInsights` | Show the new alerting insights landing page | Yes | -| `panelMonitoring` | Enables panel monitoring through logs and measurements | Yes | -| `recoveryThreshold` | Enables feature recovery threshold (aka hysteresis) for threshold server-side expression | Yes | -| `lokiStructuredMetadata` | Enables the loki data source to request structured metadata from the Loki server | Yes | -| `managedPluginsInstall` | Install managed plugins directly from plugins catalog | Yes | -| `annotationPermissionUpdate` | Change the way annotation permissions work by scoping them to folders and dashboards. | Yes | -| `exploreMetrics` | Enables the new Explore Metrics core app | Yes | -| `alertingSimplifiedRouting` | Enables users to easily configure alert notifications by specifying a contact point directly when editing or creating an alert rule | Yes | -| `logRowsPopoverMenu` | Enable filtering menu displayed when text of a log line is selected | Yes | -| `lokiQueryHints` | Enables query hints for Loki | Yes | -| `alertingQueryOptimization` | Optimizes eligible queries in order to reduce load on datasources | | -| `betterPageScrolling` | Removes CustomScrollbar from the UI, relying on native browser scrollbars | Yes | -| `usePrometheusFrontendPackage` | Use the @grafana/prometheus frontend package in core Prometheus. | | -| `cloudWatchNewLabelParsing` | Updates CloudWatch label parsing to be more accurate | Yes | +| Feature toggle name | Description | Enabled by default | +| ------------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | +| `disableEnvelopeEncryption` | Disable envelope encryption (emergency only) | | +| `publicDashboards` | [Deprecated] Public dashboards are now enabled by default; to disable them, use the configuration setting. This feature toggle will be removed in the next major version. | Yes | +| `featureHighlights` | Highlight Grafana Enterprise features | | +| `correlations` | Correlations page | | +| `exploreContentOutline` | Content outline sidebar | Yes | +| `cloudWatchCrossAccountQuerying` | Enables cross-account querying in CloudWatch datasources | Yes | +| `nestedFolders` | Enable folder nesting | Yes | +| `nestedFolderPicker` | Enables the new folder picker to work with nested folders. Requires the nestedFolders feature toggle | Yes | +| `logsContextDatasourceUi` | Allow datasource to provide custom UI for context view | Yes | +| `lokiQuerySplitting` | Split large interval queries into subqueries with smaller time intervals | Yes | +| `prometheusMetricEncyclopedia` | Adds the metrics explorer component to the Prometheus query builder as an option in metric select | Yes | +| `influxdbBackendMigration` | Query InfluxDB InfluxQL without the proxy | Yes | +| `prometheusDataplane` | Changes responses to from Prometheus to be compliant with the dataplane specification. In particular, when this feature toggle is active, the numeric `Field.Name` is set from 'Value' to the value of the `__name__` label. | Yes | +| `lokiMetricDataplane` | Changes metric responses from Loki to be compliant with the dataplane specification. | Yes | +| `dataplaneFrontendFallback` | Support dataplane contract field name change for transformations and field name matchers where the name is different | Yes | +| `enableElasticsearchBackendQuerying` | Enable the processing of queries and responses in the Elasticsearch data source through backend | Yes | +| `recordedQueriesMulti` | Enables writing multiple items from a single query within Recorded Queries | Yes | +| `logsExploreTableVisualisation` | A table visualisation for logs in Explore | Yes | +| `transformationsRedesign` | Enables the transformations redesign | Yes | +| `traceQLStreaming` | Enables response streaming of TraceQL queries of the Tempo data source | | +| `awsAsyncQueryCaching` | Enable caching for async queries for Redshift and Athena. Requires that the datasource has caching and async query support enabled | Yes | +| `prometheusConfigOverhaulAuth` | Update the Prometheus configuration page with the new auth component | Yes | +| `influxdbSqlSupport` | Enable InfluxDB SQL query language support with new querying UI | Yes | +| `alertingNoDataErrorExecution` | Changes how Alerting state manager handles execution of NoData/Error | Yes | +| `angularDeprecationUI` | Display Angular warnings in dashboards and panels | Yes | +| `dashgpt` | Enable AI powered features in dashboards | Yes | +| `alertingInsights` | Show the new alerting insights landing page | Yes | +| `panelMonitoring` | Enables panel monitoring through logs and measurements | Yes | +| `recoveryThreshold` | Enables feature recovery threshold (aka hysteresis) for threshold server-side expression | Yes | +| `lokiStructuredMetadata` | Enables the loki data source to request structured metadata from the Loki server | Yes | +| `managedPluginsInstall` | Install managed plugins directly from plugins catalog | Yes | +| `annotationPermissionUpdate` | Change the way annotation permissions work by scoping them to folders and dashboards. | Yes | +| `exploreMetrics` | Enables the new Explore Metrics core app | Yes | +| `alertingSimplifiedRouting` | Enables users to easily configure alert notifications by specifying a contact point directly when editing or creating an alert rule | Yes | +| `logRowsPopoverMenu` | Enable filtering menu displayed when text of a log line is selected | Yes | +| `lokiQueryHints` | Enables query hints for Loki | Yes | +| `alertingQueryOptimization` | Optimizes eligible queries in order to reduce load on datasources | | +| `betterPageScrolling` | Removes CustomScrollbar from the UI, relying on native browser scrollbars | Yes | +| `usePrometheusFrontendPackage` | Use the @grafana/prometheus frontend package in core Prometheus. | | +| `cloudWatchNewLabelParsing` | Updates CloudWatch label parsing to be more accurate | Yes | ## Preview feature toggles diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index ae2339b449f..a751590217f 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -86,7 +86,6 @@ export interface FeatureToggles { sqlDatasourceDatabaseSelection?: boolean; lokiFormatQuery?: boolean; recordedQueriesMulti?: boolean; - pluginsDynamicAngularDetectionPatterns?: boolean; vizAndWidgetSplit?: boolean; prometheusIncrementalQueryInstrumentation?: boolean; logsExploreTableVisualisation?: boolean; diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index dd7730e3f7f..daef6b36959 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -508,14 +508,6 @@ var ( Owner: grafanaObservabilityMetricsSquad, AllowSelfServe: false, }, - { - Name: "pluginsDynamicAngularDetectionPatterns", - Description: "Enables fetching Angular detection patterns for plugins from GCOM and fallback to hardcoded ones", - Stage: FeatureStageGeneralAvailability, - FrontendOnly: false, - Owner: grafanaPluginsPlatformSquad, - Expression: "true", // enabled by default - }, { Name: "vizAndWidgetSplit", Description: "Split panels between visualizations and widgets", diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index bbed4afabef..bc4043f1f78 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -67,7 +67,6 @@ frontendSandboxMonitorOnly,experimental,@grafana/plugins-platform-backend,false, sqlDatasourceDatabaseSelection,preview,@grafana/dataviz-squad,false,false,true lokiFormatQuery,experimental,@grafana/observability-logs,false,false,true recordedQueriesMulti,GA,@grafana/observability-metrics,false,false,false -pluginsDynamicAngularDetectionPatterns,GA,@grafana/plugins-platform-backend,false,false,false vizAndWidgetSplit,experimental,@grafana/dashboards-squad,false,false,true prometheusIncrementalQueryInstrumentation,experimental,@grafana/observability-metrics,false,false,true logsExploreTableVisualisation,GA,@grafana/observability-logs,false,false,true diff --git a/pkg/services/featuremgmt/toggles_gen.go b/pkg/services/featuremgmt/toggles_gen.go index 361ec2bc768..753ab0885a4 100644 --- a/pkg/services/featuremgmt/toggles_gen.go +++ b/pkg/services/featuremgmt/toggles_gen.go @@ -279,10 +279,6 @@ const ( // Enables writing multiple items from a single query within Recorded Queries FlagRecordedQueriesMulti = "recordedQueriesMulti" - // FlagPluginsDynamicAngularDetectionPatterns - // Enables fetching Angular detection patterns for plugins from GCOM and fallback to hardcoded ones - FlagPluginsDynamicAngularDetectionPatterns = "pluginsDynamicAngularDetectionPatterns" - // FlagVizAndWidgetSplit // Split panels between visualizations and widgets FlagVizAndWidgetSplit = "vizAndWidgetSplit" diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index 82355765798..78ab30dc6e6 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -1120,7 +1120,8 @@ "metadata": { "name": "pluginsDynamicAngularDetectionPatterns", "resourceVersion": "1712639261786", - "creationTimestamp": "2024-04-09T05:07:41Z" + "creationTimestamp": "2024-04-09T05:07:41Z", + "deletionTimestamp": "2024-04-11T13:53:48Z" }, "spec": { "description": "Enables fetching Angular detection patterns for plugins from GCOM and fallback to hardcoded ones", diff --git a/pkg/services/pluginsintegration/angulardetectorsprovider/dynamic.go b/pkg/services/pluginsintegration/angulardetectorsprovider/dynamic.go index 977d5fedbfa..bc3146a6c9f 100644 --- a/pkg/services/pluginsintegration/angulardetectorsprovider/dynamic.go +++ b/pkg/services/pluginsintegration/angulardetectorsprovider/dynamic.go @@ -14,7 +14,6 @@ import ( "github.com/grafana/grafana/pkg/plugins/log" "github.com/grafana/grafana/pkg/plugins/manager/loader/angular/angulardetector" - "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/pluginsintegration/angularpatternsstore" "github.com/grafana/grafana/pkg/setting" ) @@ -31,10 +30,8 @@ var ( // Dynamic is an angulardetector.DetectorsProvider that calls GCOM to get Angular detection patterns, // converts them to detectors and caches them for all future calls. // It also provides a background service that will periodically refresh the patterns from GCOM. -// If the feature flag FlagPluginsDynamicAngularDetectionPatterns is disabled, the background service is disabled. type Dynamic struct { - log log.Logger - features featuremgmt.FeatureToggles + log log.Logger httpClient http.Client baseURL string @@ -53,7 +50,7 @@ type Dynamic struct { backgroundJobInterval time.Duration } -func ProvideDynamic(cfg *setting.Cfg, store angularpatternsstore.Service, features featuremgmt.FeatureToggles) (*Dynamic, error) { +func ProvideDynamic(cfg *setting.Cfg, store angularpatternsstore.Service) (*Dynamic, error) { backgroundJobInterval := backgroundJobIntervalOnPrem if cfg.StackID != "" { // Use a shorter interval for cloud. @@ -63,16 +60,11 @@ func ProvideDynamic(cfg *setting.Cfg, store angularpatternsstore.Service, featur d := &Dynamic{ log: log.New("plugin.angulardetectorsprovider.dynamic"), - features: features, store: store, httpClient: makeHttpClient(), baseURL: cfg.GrafanaComURL, backgroundJobInterval: backgroundJobInterval, } - if d.IsDisabled() { - // Do not attempt to restore if the background service is disabled (no feature flag) - return d, nil - } d.log.Debug("Providing dynamic angular detection patterns", "baseURL", d.baseURL, "interval", d.backgroundJobInterval) // Perform the initial restore from db @@ -233,11 +225,6 @@ func (d *Dynamic) setDetectorsFromCache(ctx context.Context) error { return nil } -// IsDisabled returns true if FlagPluginsDynamicAngularDetectionPatterns is not enabled. -func (d *Dynamic) IsDisabled() bool { - return !d.features.IsEnabledGlobally(featuremgmt.FlagPluginsDynamicAngularDetectionPatterns) -} - // randomSkew returns a random time.Duration between 0 and maxSkew. // This can be added to d.backgroundJobInterval to skew it by a random amount. func (d *Dynamic) randomSkew(maxSkew time.Duration) time.Duration { diff --git a/pkg/services/pluginsintegration/angulardetectorsprovider/dynamic_test.go b/pkg/services/pluginsintegration/angulardetectorsprovider/dynamic_test.go index 43eee584c5f..eea3555e903 100644 --- a/pkg/services/pluginsintegration/angulardetectorsprovider/dynamic_test.go +++ b/pkg/services/pluginsintegration/angulardetectorsprovider/dynamic_test.go @@ -15,7 +15,6 @@ import ( "github.com/grafana/grafana/pkg/infra/kvstore" "github.com/grafana/grafana/pkg/plugins/manager/loader/angular/angulardetector" - "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/pluginsintegration/angularpatternsstore" "github.com/grafana/grafana/pkg/setting" ) @@ -343,18 +342,6 @@ func TestDynamicAngularDetectorsProviderBackgroundService(t *testing.T) { backgroundJobIntervalOnPrem = oldBackgroundJobInterval }) - t.Run("is disabled if feature flag is not present", func(t *testing.T) { - svc := provideDynamic(t, srv.URL) - svc.features = featuremgmt.WithFeatures() - require.True(t, svc.IsDisabled(), "background service should be disabled") - }) - - t.Run("is enabled if feature flag is present", func(t *testing.T) { - svc := provideDynamic(t, srv.URL) - svc.features = featuremgmt.WithFeatures(featuremgmt.FlagPluginsDynamicAngularDetectionPatterns) - require.False(t, svc.IsDisabled(), "background service should be enabled") - }) - t.Run("fetches value from gcom on start if too much time has passed", func(t *testing.T) { gcomCallback := make(chan struct{}) gcom := newDefaultGCOMScenario(func(_ http.ResponseWriter, _ *http.Request) { @@ -594,11 +581,7 @@ func provideDynamic(t *testing.T, gcomURL string, opts ...provideDynamicOpts) *D opt.cfg = setting.NewCfg() } opt.cfg.GrafanaComURL = gcomURL - d, err := ProvideDynamic( - opt.cfg, - opt.store, - featuremgmt.WithFeatures(featuremgmt.FlagPluginsDynamicAngularDetectionPatterns), - ) + d, err := ProvideDynamic(opt.cfg, opt.store) require.NoError(t, err) return d } diff --git a/pkg/services/pluginsintegration/angularinspector/angularinspector.go b/pkg/services/pluginsintegration/angularinspector/angularinspector.go index 1fd9f671019..6fabc7898e8 100644 --- a/pkg/services/pluginsintegration/angularinspector/angularinspector.go +++ b/pkg/services/pluginsintegration/angularinspector/angularinspector.go @@ -3,7 +3,6 @@ package angularinspector import ( "github.com/grafana/grafana/pkg/plugins/manager/loader/angular/angulardetector" "github.com/grafana/grafana/pkg/plugins/manager/loader/angular/angularinspector" - "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/pluginsintegration/angulardetectorsprovider" ) @@ -11,17 +10,13 @@ type Service struct { angularinspector.Inspector } -func ProvideService(features featuremgmt.FeatureToggles, dynamic *angulardetectorsprovider.Dynamic) (*Service, error) { - var detectorsProvider angulardetector.DetectorsProvider - var err error - static := angularinspector.NewDefaultStaticDetectorsProvider() - if features.IsEnabledGlobally(featuremgmt.FlagPluginsDynamicAngularDetectionPatterns) { - detectorsProvider = angulardetector.SequenceDetectorsProvider{dynamic, static} - } else { - detectorsProvider = static - } - if err != nil { - return nil, err - } - return &Service{Inspector: angularinspector.NewPatternListInspector(detectorsProvider)}, nil +func ProvideService(dynamic *angulardetectorsprovider.Dynamic) (*Service, error) { + return &Service{ + Inspector: angularinspector.NewPatternListInspector( + angulardetector.SequenceDetectorsProvider{ + dynamic, + angularinspector.NewDefaultStaticDetectorsProvider(), + }, + ), + }, nil } diff --git a/pkg/services/pluginsintegration/angularinspector/angularinspector_test.go b/pkg/services/pluginsintegration/angularinspector/angularinspector_test.go index 987b2788564..04ffc84a451 100644 --- a/pkg/services/pluginsintegration/angularinspector/angularinspector_test.go +++ b/pkg/services/pluginsintegration/angularinspector/angularinspector_test.go @@ -9,40 +9,19 @@ import ( "github.com/grafana/grafana/pkg/infra/kvstore" "github.com/grafana/grafana/pkg/plugins/manager/loader/angular/angulardetector" "github.com/grafana/grafana/pkg/plugins/manager/loader/angular/angularinspector" - "github.com/grafana/grafana/pkg/services/featuremgmt" "github.com/grafana/grafana/pkg/services/pluginsintegration/angulardetectorsprovider" "github.com/grafana/grafana/pkg/services/pluginsintegration/angularpatternsstore" "github.com/grafana/grafana/pkg/setting" ) func TestProvideService(t *testing.T) { - t.Run("uses hardcoded inspector if feature flag is not present", func(t *testing.T) { - features := featuremgmt.WithFeatures() + t.Run("uses dynamic inspector with hardcoded fallback", func(t *testing.T) { dynamic, err := angulardetectorsprovider.ProvideDynamic( setting.NewCfg(), angularpatternsstore.ProvideService(kvstore.NewFakeKVStore()), - features, ) require.NoError(t, err) - inspector, err := ProvideService(features, dynamic) - require.NoError(t, err) - require.IsType(t, inspector.Inspector, &angularinspector.PatternsListInspector{}) - patternsListInspector := inspector.Inspector.(*angularinspector.PatternsListInspector) - detectors := patternsListInspector.DetectorsProvider.ProvideDetectors(context.Background()) - require.NotEmpty(t, detectors, "provided detectors should not be empty") - }) - - t.Run("uses dynamic inspector with hardcoded fallback if feature flag is present", func(t *testing.T) { - features := featuremgmt.WithFeatures( - featuremgmt.FlagPluginsDynamicAngularDetectionPatterns, - ) - dynamic, err := angulardetectorsprovider.ProvideDynamic( - setting.NewCfg(), - angularpatternsstore.ProvideService(kvstore.NewFakeKVStore()), - features, - ) - require.NoError(t, err) - inspector, err := ProvideService(features, dynamic) + inspector, err := ProvideService(dynamic) require.NoError(t, err) require.IsType(t, inspector.Inspector, &angularinspector.PatternsListInspector{}) require.IsType(t, inspector.Inspector.(*angularinspector.PatternsListInspector).DetectorsProvider, angulardetector.SequenceDetectorsProvider{})