mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Cloudwatch: Remove cloudWatchWildCardDimensionValues feature toggle (#84329)
This commit is contained in:
@@ -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
|
||||||
|
|||||||
|
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user