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 badf869409a..e305ab17659 100644 --- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md +++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md @@ -49,7 +49,6 @@ Some features are enabled by default. You can disable these feature by setting t | `alertingNoDataErrorExecution` | Changes how Alerting state manager handles execution of NoData/Error | Yes | | `angularDeprecationUI` | Display Angular warnings in dashboards and panels | Yes | | `alertingInsights` | Show the new alerting insights landing page | Yes | -| `cloudWatchWildCardDimensionValues` | Fetches dimension values from CloudWatch to correctly label wildcard dimensions | 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 | diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index ee7b72e6a8b..1d394adfca0 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -119,7 +119,6 @@ export interface FeatureToggles { externalCorePlugins?: boolean; pluginsAPIMetrics?: boolean; idForwarding?: boolean; - cloudWatchWildCardDimensionValues?: boolean; externalServiceAccounts?: boolean; panelMonitoring?: boolean; enableNativeHTTPHistogram?: boolean; diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index 5ce04217da3..81ff72f692e 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -756,14 +756,6 @@ var ( Stage: FeatureStageExperimental, Owner: identityAccessTeam, }, - { - Name: "cloudWatchWildCardDimensionValues", - Description: "Fetches dimension values from CloudWatch to correctly label wildcard dimensions", - Stage: FeatureStageGeneralAvailability, - Expression: "true", // enabled by default - Owner: awsDatasourcesSquad, - AllowSelfServe: true, - }, { Name: "externalServiceAccounts", Description: "Automatic service account and token setup for plugins", diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index 1ce24fce39e..cfb3fd8fbd1 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -100,7 +100,6 @@ alertingInsights,GA,@grafana/alerting-squad,false,false,true externalCorePlugins,experimental,@grafana/plugins-platform-backend,false,false,false pluginsAPIMetrics,experimental,@grafana/plugins-platform-backend,false,false,true idForwarding,experimental,@grafana/identity-access-team,false,false,false -cloudWatchWildCardDimensionValues,GA,@grafana/aws-datasources,false,false,false externalServiceAccounts,preview,@grafana/identity-access-team,false,false,false panelMonitoring,GA,@grafana/dataviz-squad,false,false,true enableNativeHTTPHistogram,experimental,@grafana/hosted-grafana-team,false,false,false diff --git a/pkg/services/featuremgmt/toggles_gen.go b/pkg/services/featuremgmt/toggles_gen.go index c29d741e47e..7ac006ae6e1 100644 --- a/pkg/services/featuremgmt/toggles_gen.go +++ b/pkg/services/featuremgmt/toggles_gen.go @@ -411,10 +411,6 @@ const ( // Generate signed id token for identity that can be forwarded to plugins and external services FlagIdForwarding = "idForwarding" - // FlagCloudWatchWildCardDimensionValues - // Fetches dimension values from CloudWatch to correctly label wildcard dimensions - FlagCloudWatchWildCardDimensionValues = "cloudWatchWildCardDimensionValues" - // FlagExternalServiceAccounts // Automatic service account and token setup for plugins FlagExternalServiceAccounts = "externalServiceAccounts" diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index fa1fdb77011..00ba0cd9672 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -1503,7 +1503,8 @@ "metadata": { "name": "cloudWatchWildCardDimensionValues", "resourceVersion": "1709648236447", - "creationTimestamp": "2024-03-05T14:17:16Z" + "creationTimestamp": "2024-03-05T14:17:16Z", + "deletionTimestamp": "2024-03-12T20:13:32Z" }, "spec": { "description": "Fetches dimension values from CloudWatch to correctly label wildcard dimensions", diff --git a/pkg/tsdb/cloudwatch/features/features.go b/pkg/tsdb/cloudwatch/features/features.go index 0ec39954242..2c01a2673bf 100644 --- a/pkg/tsdb/cloudwatch/features/features.go +++ b/pkg/tsdb/cloudwatch/features/features.go @@ -7,9 +7,8 @@ import ( ) const ( - FlagCloudWatchCrossAccountQuerying = "cloudWatchCrossAccountQuerying" - FlagCloudWatchWildCardDimensionValues = "cloudWatchWildCardDimensionValues" - FlagCloudWatchBatchQueries = "cloudWatchBatchQueries" + FlagCloudWatchCrossAccountQuerying = "cloudWatchCrossAccountQuerying" + FlagCloudWatchBatchQueries = "cloudWatchBatchQueries" ) func IsEnabled(ctx context.Context, feature string) bool { diff --git a/pkg/tsdb/cloudwatch/get_dimension_values_for_wildcards.go b/pkg/tsdb/cloudwatch/get_dimension_values_for_wildcards.go index 60ba597aa40..3fc8f469942 100644 --- a/pkg/tsdb/cloudwatch/get_dimension_values_for_wildcards.go +++ b/pkg/tsdb/cloudwatch/get_dimension_values_for_wildcards.go @@ -4,7 +4,6 @@ import ( "context" "fmt" - "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/clients" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models/resources" @@ -13,7 +12,7 @@ import ( ) // getDimensionValues gets the actual dimension values for dimensions with a wildcard -func (e *cloudWatchExecutor) getDimensionValuesForWildcards(ctx context.Context, pluginCtx backend.PluginContext, region string, +func (e *cloudWatchExecutor) getDimensionValuesForWildcards(ctx context.Context, region string, client models.CloudWatchMetricsAPIProvider, origQueries []*models.CloudWatchQuery, tagValueCache *cache.Cache, listMetricsPageLimit int) ([]*models.CloudWatchQuery, error) { metricsClient := clients.NewMetricsClient(client, listMetricsPageLimit) service := services.NewListMetricsService(metricsClient) diff --git a/pkg/tsdb/cloudwatch/get_dimension_values_for_wildcards_test.go b/pkg/tsdb/cloudwatch/get_dimension_values_for_wildcards_test.go index 3dbd5021e56..7a18ba59f8c 100644 --- a/pkg/tsdb/cloudwatch/get_dimension_values_for_wildcards_test.go +++ b/pkg/tsdb/cloudwatch/get_dimension_values_for_wildcards_test.go @@ -3,10 +3,8 @@ package cloudwatch import ( "context" "testing" - "time" "github.com/aws/aws-sdk-go/service/cloudwatch" - "github.com/grafana/grafana-plugin-sdk-go/backend" "github.com/grafana/grafana-plugin-sdk-go/backend/log" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/mocks" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" @@ -18,16 +16,13 @@ import ( func TestGetDimensionValuesForWildcards(t *testing.T) { executor := &cloudWatchExecutor{im: defaultTestInstanceManager(), logger: log.NewNullLogger()} ctx := context.Background() - pluginCtx := backend.PluginContext{ - DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{ID: 1, Updated: time.Now()}, - } tagValueCache := cache.New(0, 0) t.Run("Should not change non-wildcard dimension value", func(t *testing.T) { query := getBaseQuery() query.MetricName = "Test_MetricName1" query.Dimensions = map[string][]string{"Test_DimensionName1": {"Value1"}} - queries, err := executor.getDimensionValuesForWildcards(ctx, pluginCtx, "us-east-1", nil, []*models.CloudWatchQuery{query}, tagValueCache, 50) + queries, err := executor.getDimensionValuesForWildcards(ctx, "us-east-1", nil, []*models.CloudWatchQuery{query}, tagValueCache, 50) assert.Nil(t, err) assert.Len(t, queries, 1) assert.NotNil(t, queries[0].Dimensions["Test_DimensionName1"], 1) @@ -38,7 +33,7 @@ func TestGetDimensionValuesForWildcards(t *testing.T) { query := getBaseQuery() query.MetricName = "Test_MetricName1" query.Dimensions = map[string][]string{"Test_DimensionName1": {"*"}} - queries, err := executor.getDimensionValuesForWildcards(ctx, pluginCtx, "us-east-1", nil, []*models.CloudWatchQuery{query}, tagValueCache, 50) + queries, err := executor.getDimensionValuesForWildcards(ctx, "us-east-1", nil, []*models.CloudWatchQuery{query}, tagValueCache, 50) assert.Nil(t, err) assert.Len(t, queries, 1) assert.NotNil(t, queries[0].Dimensions["Test_DimensionName1"]) @@ -57,7 +52,7 @@ func TestGetDimensionValuesForWildcards(t *testing.T) { {MetricName: utils.Pointer("Test_MetricName4"), Dimensions: []*cloudwatch.Dimension{{Name: utils.Pointer("Test_DimensionName1"), Value: utils.Pointer("Value2")}}}, }} api.On("ListMetricsPagesWithContext").Return(nil) - queries, err := executor.getDimensionValuesForWildcards(ctx, pluginCtx, "us-east-1", api, []*models.CloudWatchQuery{query}, tagValueCache, 50) + queries, err := executor.getDimensionValuesForWildcards(ctx, "us-east-1", api, []*models.CloudWatchQuery{query}, tagValueCache, 50) assert.Nil(t, err) assert.Len(t, queries, 1) assert.Equal(t, map[string][]string{"Test_DimensionName1": {"Value1", "Value2", "Value3", "Value4"}}, queries[0].Dimensions) @@ -73,13 +68,13 @@ func TestGetDimensionValuesForWildcards(t *testing.T) { {MetricName: utils.Pointer("Test_MetricName"), Dimensions: []*cloudwatch.Dimension{{Name: utils.Pointer("Test_DimensionName"), Value: utils.Pointer("Value")}}}, }} api.On("ListMetricsPagesWithContext").Return(nil) - _, err := executor.getDimensionValuesForWildcards(ctx, pluginCtx, "us-east-1", api, []*models.CloudWatchQuery{query}, tagValueCache, 50) + _, err := executor.getDimensionValuesForWildcards(ctx, "us-east-1", api, []*models.CloudWatchQuery{query}, tagValueCache, 50) assert.Nil(t, err) // make sure the original query wasn't altered assert.Equal(t, map[string][]string{"Test_DimensionName": {"*"}}, query.Dimensions) //setting the api to nil confirms that it's using the cached value - queries, err := executor.getDimensionValuesForWildcards(ctx, pluginCtx, "us-east-1", nil, []*models.CloudWatchQuery{query}, tagValueCache, 50) + queries, err := executor.getDimensionValuesForWildcards(ctx, "us-east-1", nil, []*models.CloudWatchQuery{query}, tagValueCache, 50) assert.Nil(t, err) assert.Len(t, queries, 1) assert.Equal(t, map[string][]string{"Test_DimensionName": {"Value"}}, queries[0].Dimensions) @@ -93,7 +88,7 @@ func TestGetDimensionValuesForWildcards(t *testing.T) { query.MatchExact = false api := &mocks.MetricsAPI{Metrics: []*cloudwatch.Metric{}} api.On("ListMetricsPagesWithContext").Return(nil) - queries, err := executor.getDimensionValuesForWildcards(ctx, pluginCtx, "us-east-1", api, []*models.CloudWatchQuery{query}, tagValueCache, 50) + queries, err := executor.getDimensionValuesForWildcards(ctx, "us-east-1", api, []*models.CloudWatchQuery{query}, tagValueCache, 50) assert.Nil(t, err) assert.Len(t, queries, 1) // assert that the values was set to an empty array @@ -104,7 +99,7 @@ func TestGetDimensionValuesForWildcards(t *testing.T) { {MetricName: utils.Pointer("Test_MetricName"), Dimensions: []*cloudwatch.Dimension{{Name: utils.Pointer("Test_DimensionName2"), Value: utils.Pointer("Value")}}}, } api.On("ListMetricsPagesWithContext").Return(nil) - queries, err = executor.getDimensionValuesForWildcards(ctx, pluginCtx, "us-east-1", api, []*models.CloudWatchQuery{query}, tagValueCache, 50) + queries, err = executor.getDimensionValuesForWildcards(ctx, "us-east-1", api, []*models.CloudWatchQuery{query}, tagValueCache, 50) assert.Nil(t, err) assert.Len(t, queries, 1) assert.Equal(t, map[string][]string{"Test_DimensionName2": {"Value"}}, queries[0].Dimensions) diff --git a/pkg/tsdb/cloudwatch/test_utils.go b/pkg/tsdb/cloudwatch/test_utils.go index 26f7b8d3155..9e7f531e194 100644 --- a/pkg/tsdb/cloudwatch/test_utils.go +++ b/pkg/tsdb/cloudwatch/test_utils.go @@ -21,6 +21,7 @@ import ( "github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt" "github.com/grafana/grafana-plugin-sdk-go/experimental/featuretoggles" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" + "github.com/patrickmn/go-cache" "github.com/stretchr/testify/mock" ) @@ -210,7 +211,8 @@ func testInstanceManager(pageLimit int) instancemgmt.InstanceManager { }, GrafanaSettings: awsds.AuthSettings{ListMetricsPageLimit: pageLimit}, }, - sessions: &fakeSessionCache{}}, nil + sessions: &fakeSessionCache{}, + tagValueCache: cache.New(0, 0)}, nil })) } diff --git a/pkg/tsdb/cloudwatch/time_series_query.go b/pkg/tsdb/cloudwatch/time_series_query.go index c392694d618..cc6b9e772af 100644 --- a/pkg/tsdb/cloudwatch/time_series_query.go +++ b/pkg/tsdb/cloudwatch/time_series_query.go @@ -96,11 +96,9 @@ func (e *cloudWatchExecutor) executeTimeSeriesQuery(ctx context.Context, req *ba return err } - if features.IsEnabled(ctx, features.FlagCloudWatchWildCardDimensionValues) { - requestQueries, err = e.getDimensionValuesForWildcards(ctx, req.PluginContext, region, client, requestQueries, instance.tagValueCache, instance.Settings.GrafanaSettings.ListMetricsPageLimit) - if err != nil { - return err - } + requestQueries, err = e.getDimensionValuesForWildcards(ctx, region, client, requestQueries, instance.tagValueCache, instance.Settings.GrafanaSettings.ListMetricsPageLimit) + if err != nil { + return err } res, err := e.parseResponse(startTime, endTime, mdo, requestQueries)