Cloudwatch: Remove cloudWatchWildCardDimensionValues feature toggle (#84329)

pull/84713/head
Isabella Siu 1 year ago committed by GitHub
parent 06723b9647
commit a0b68deae4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 1
      docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md
  2. 1
      packages/grafana-data/src/types/featureToggles.gen.ts
  3. 8
      pkg/services/featuremgmt/registry.go
  4. 1
      pkg/services/featuremgmt/toggles_gen.csv
  5. 4
      pkg/services/featuremgmt/toggles_gen.go
  6. 3
      pkg/services/featuremgmt/toggles_gen.json
  7. 5
      pkg/tsdb/cloudwatch/features/features.go
  8. 3
      pkg/tsdb/cloudwatch/get_dimension_values_for_wildcards.go
  9. 19
      pkg/tsdb/cloudwatch/get_dimension_values_for_wildcards_test.go
  10. 4
      pkg/tsdb/cloudwatch/test_utils.go
  11. 8
      pkg/tsdb/cloudwatch/time_series_query.go

@ -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 | | `alertingNoDataErrorExecution` | Changes how Alerting state manager handles execution of NoData/Error | Yes |
| `angularDeprecationUI` | Display Angular warnings in dashboards and panels | Yes | | `angularDeprecationUI` | Display Angular warnings in dashboards and panels | Yes |
| `alertingInsights` | Show the new alerting insights landing page | 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 | | `panelMonitoring` | Enables panel monitoring through logs and measurements | Yes |
| `recoveryThreshold` | Enables feature recovery threshold (aka hysteresis) for threshold server-side expression | 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 | | `lokiStructuredMetadata` | Enables the loki data source to request structured metadata from the Loki server | Yes |

@ -119,7 +119,6 @@ export interface FeatureToggles {
externalCorePlugins?: boolean; externalCorePlugins?: boolean;
pluginsAPIMetrics?: boolean; pluginsAPIMetrics?: boolean;
idForwarding?: boolean; idForwarding?: boolean;
cloudWatchWildCardDimensionValues?: boolean;
externalServiceAccounts?: boolean; externalServiceAccounts?: boolean;
panelMonitoring?: boolean; panelMonitoring?: boolean;
enableNativeHTTPHistogram?: boolean; enableNativeHTTPHistogram?: boolean;

@ -756,14 +756,6 @@ var (
Stage: FeatureStageExperimental, Stage: FeatureStageExperimental,
Owner: identityAccessTeam, 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", Name: "externalServiceAccounts",
Description: "Automatic service account and token setup for plugins", Description: "Automatic service account and token setup for plugins",

@ -100,7 +100,6 @@ alertingInsights,GA,@grafana/alerting-squad,false,false,true
externalCorePlugins,experimental,@grafana/plugins-platform-backend,false,false,false externalCorePlugins,experimental,@grafana/plugins-platform-backend,false,false,false
pluginsAPIMetrics,experimental,@grafana/plugins-platform-backend,false,false,true pluginsAPIMetrics,experimental,@grafana/plugins-platform-backend,false,false,true
idForwarding,experimental,@grafana/identity-access-team,false,false,false 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 externalServiceAccounts,preview,@grafana/identity-access-team,false,false,false
panelMonitoring,GA,@grafana/dataviz-squad,false,false,true panelMonitoring,GA,@grafana/dataviz-squad,false,false,true
enableNativeHTTPHistogram,experimental,@grafana/hosted-grafana-team,false,false,false enableNativeHTTPHistogram,experimental,@grafana/hosted-grafana-team,false,false,false

1 Name Stage Owner requiresDevMode RequiresRestart FrontendOnly
100 externalCorePlugins experimental @grafana/plugins-platform-backend false false false
101 pluginsAPIMetrics experimental @grafana/plugins-platform-backend false false true
102 idForwarding experimental @grafana/identity-access-team false false false
cloudWatchWildCardDimensionValues GA @grafana/aws-datasources false false false
103 externalServiceAccounts preview @grafana/identity-access-team false false false
104 panelMonitoring GA @grafana/dataviz-squad false false true
105 enableNativeHTTPHistogram experimental @grafana/hosted-grafana-team false false false

@ -411,10 +411,6 @@ const (
// Generate signed id token for identity that can be forwarded to plugins and external services // Generate signed id token for identity that can be forwarded to plugins and external services
FlagIdForwarding = "idForwarding" FlagIdForwarding = "idForwarding"
// FlagCloudWatchWildCardDimensionValues
// Fetches dimension values from CloudWatch to correctly label wildcard dimensions
FlagCloudWatchWildCardDimensionValues = "cloudWatchWildCardDimensionValues"
// FlagExternalServiceAccounts // FlagExternalServiceAccounts
// Automatic service account and token setup for plugins // Automatic service account and token setup for plugins
FlagExternalServiceAccounts = "externalServiceAccounts" FlagExternalServiceAccounts = "externalServiceAccounts"

@ -1503,7 +1503,8 @@
"metadata": { "metadata": {
"name": "cloudWatchWildCardDimensionValues", "name": "cloudWatchWildCardDimensionValues",
"resourceVersion": "1709648236447", "resourceVersion": "1709648236447",
"creationTimestamp": "2024-03-05T14:17:16Z" "creationTimestamp": "2024-03-05T14:17:16Z",
"deletionTimestamp": "2024-03-12T20:13:32Z"
}, },
"spec": { "spec": {
"description": "Fetches dimension values from CloudWatch to correctly label wildcard dimensions", "description": "Fetches dimension values from CloudWatch to correctly label wildcard dimensions",

@ -7,9 +7,8 @@ import (
) )
const ( const (
FlagCloudWatchCrossAccountQuerying = "cloudWatchCrossAccountQuerying" FlagCloudWatchCrossAccountQuerying = "cloudWatchCrossAccountQuerying"
FlagCloudWatchWildCardDimensionValues = "cloudWatchWildCardDimensionValues" FlagCloudWatchBatchQueries = "cloudWatchBatchQueries"
FlagCloudWatchBatchQueries = "cloudWatchBatchQueries"
) )
func IsEnabled(ctx context.Context, feature string) bool { func IsEnabled(ctx context.Context, feature string) bool {

@ -4,7 +4,6 @@ import (
"context" "context"
"fmt" "fmt"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/clients" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/clients"
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models"
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/models/resources" "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 // 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) { client models.CloudWatchMetricsAPIProvider, origQueries []*models.CloudWatchQuery, tagValueCache *cache.Cache, listMetricsPageLimit int) ([]*models.CloudWatchQuery, error) {
metricsClient := clients.NewMetricsClient(client, listMetricsPageLimit) metricsClient := clients.NewMetricsClient(client, listMetricsPageLimit)
service := services.NewListMetricsService(metricsClient) service := services.NewListMetricsService(metricsClient)

@ -3,10 +3,8 @@ package cloudwatch
import ( import (
"context" "context"
"testing" "testing"
"time"
"github.com/aws/aws-sdk-go/service/cloudwatch" "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-plugin-sdk-go/backend/log"
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/mocks" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/mocks"
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models"
@ -18,16 +16,13 @@ import (
func TestGetDimensionValuesForWildcards(t *testing.T) { func TestGetDimensionValuesForWildcards(t *testing.T) {
executor := &cloudWatchExecutor{im: defaultTestInstanceManager(), logger: log.NewNullLogger()} executor := &cloudWatchExecutor{im: defaultTestInstanceManager(), logger: log.NewNullLogger()}
ctx := context.Background() ctx := context.Background()
pluginCtx := backend.PluginContext{
DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{ID: 1, Updated: time.Now()},
}
tagValueCache := cache.New(0, 0) tagValueCache := cache.New(0, 0)
t.Run("Should not change non-wildcard dimension value", func(t *testing.T) { t.Run("Should not change non-wildcard dimension value", func(t *testing.T) {
query := getBaseQuery() query := getBaseQuery()
query.MetricName = "Test_MetricName1" query.MetricName = "Test_MetricName1"
query.Dimensions = map[string][]string{"Test_DimensionName1": {"Value1"}} 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.Nil(t, err)
assert.Len(t, queries, 1) assert.Len(t, queries, 1)
assert.NotNil(t, queries[0].Dimensions["Test_DimensionName1"], 1) assert.NotNil(t, queries[0].Dimensions["Test_DimensionName1"], 1)
@ -38,7 +33,7 @@ func TestGetDimensionValuesForWildcards(t *testing.T) {
query := getBaseQuery() query := getBaseQuery()
query.MetricName = "Test_MetricName1" query.MetricName = "Test_MetricName1"
query.Dimensions = map[string][]string{"Test_DimensionName1": {"*"}} 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.Nil(t, err)
assert.Len(t, queries, 1) assert.Len(t, queries, 1)
assert.NotNil(t, queries[0].Dimensions["Test_DimensionName1"]) 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")}}}, {MetricName: utils.Pointer("Test_MetricName4"), Dimensions: []*cloudwatch.Dimension{{Name: utils.Pointer("Test_DimensionName1"), Value: utils.Pointer("Value2")}}},
}} }}
api.On("ListMetricsPagesWithContext").Return(nil) 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.Nil(t, err)
assert.Len(t, queries, 1) assert.Len(t, queries, 1)
assert.Equal(t, map[string][]string{"Test_DimensionName1": {"Value1", "Value2", "Value3", "Value4"}}, queries[0].Dimensions) 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")}}}, {MetricName: utils.Pointer("Test_MetricName"), Dimensions: []*cloudwatch.Dimension{{Name: utils.Pointer("Test_DimensionName"), Value: utils.Pointer("Value")}}},
}} }}
api.On("ListMetricsPagesWithContext").Return(nil) 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) assert.Nil(t, err)
// make sure the original query wasn't altered // make sure the original query wasn't altered
assert.Equal(t, map[string][]string{"Test_DimensionName": {"*"}}, query.Dimensions) assert.Equal(t, map[string][]string{"Test_DimensionName": {"*"}}, query.Dimensions)
//setting the api to nil confirms that it's using the cached value //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.Nil(t, err)
assert.Len(t, queries, 1) assert.Len(t, queries, 1)
assert.Equal(t, map[string][]string{"Test_DimensionName": {"Value"}}, queries[0].Dimensions) assert.Equal(t, map[string][]string{"Test_DimensionName": {"Value"}}, queries[0].Dimensions)
@ -93,7 +88,7 @@ func TestGetDimensionValuesForWildcards(t *testing.T) {
query.MatchExact = false query.MatchExact = false
api := &mocks.MetricsAPI{Metrics: []*cloudwatch.Metric{}} api := &mocks.MetricsAPI{Metrics: []*cloudwatch.Metric{}}
api.On("ListMetricsPagesWithContext").Return(nil) 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.Nil(t, err)
assert.Len(t, queries, 1) assert.Len(t, queries, 1)
// assert that the values was set to an empty array // 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")}}}, {MetricName: utils.Pointer("Test_MetricName"), Dimensions: []*cloudwatch.Dimension{{Name: utils.Pointer("Test_DimensionName2"), Value: utils.Pointer("Value")}}},
} }
api.On("ListMetricsPagesWithContext").Return(nil) 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.Nil(t, err)
assert.Len(t, queries, 1) assert.Len(t, queries, 1)
assert.Equal(t, map[string][]string{"Test_DimensionName2": {"Value"}}, queries[0].Dimensions) assert.Equal(t, map[string][]string{"Test_DimensionName2": {"Value"}}, queries[0].Dimensions)

@ -21,6 +21,7 @@ import (
"github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt" "github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt"
"github.com/grafana/grafana-plugin-sdk-go/experimental/featuretoggles" "github.com/grafana/grafana-plugin-sdk-go/experimental/featuretoggles"
"github.com/grafana/grafana/pkg/tsdb/cloudwatch/models" "github.com/grafana/grafana/pkg/tsdb/cloudwatch/models"
"github.com/patrickmn/go-cache"
"github.com/stretchr/testify/mock" "github.com/stretchr/testify/mock"
) )
@ -210,7 +211,8 @@ func testInstanceManager(pageLimit int) instancemgmt.InstanceManager {
}, },
GrafanaSettings: awsds.AuthSettings{ListMetricsPageLimit: pageLimit}, GrafanaSettings: awsds.AuthSettings{ListMetricsPageLimit: pageLimit},
}, },
sessions: &fakeSessionCache{}}, nil sessions: &fakeSessionCache{},
tagValueCache: cache.New(0, 0)}, nil
})) }))
} }

@ -96,11 +96,9 @@ func (e *cloudWatchExecutor) executeTimeSeriesQuery(ctx context.Context, req *ba
return err return err
} }
if features.IsEnabled(ctx, features.FlagCloudWatchWildCardDimensionValues) { requestQueries, err = e.getDimensionValuesForWildcards(ctx, region, client, requestQueries, instance.tagValueCache, instance.Settings.GrafanaSettings.ListMetricsPageLimit)
requestQueries, err = e.getDimensionValuesForWildcards(ctx, req.PluginContext, region, client, requestQueries, instance.tagValueCache, instance.Settings.GrafanaSettings.ListMetricsPageLimit) if err != nil {
if err != nil { return err
return err
}
} }
res, err := e.parseResponse(startTime, endTime, mdo, requestQueries) res, err := e.parseResponse(startTime, endTime, mdo, requestQueries)

Loading…
Cancel
Save