package azure_monitor import ( "context" "encoding/json" "errors" "fmt" "os" "testing" "github.com/Azure/azure-sdk-for-go/sdk/azcore" "github.com/Azure/azure-sdk-for-go/sdk/azcore/cloud" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/monitor/armmonitor" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources" "github.com/influxdata/toml" receiver "github.com/logzio/azure-monitor-metrics-receiver" "github.com/stretchr/testify/require" "github.com/influxdata/telegraf/testutil" ) type mockAzureClientsManager struct{} type mockAzureResourcesClient struct{} type mockAzureMetricDefinitionsClient struct{} type mockAzureMetricsClient struct{} func (*mockAzureClientsManager) createAzureClients(_, _, _, _ string, _ azcore.ClientOptions) (*receiver.AzureClients, error) { return &receiver.AzureClients{ Ctx: context.Background(), ResourcesClient: &mockAzureResourcesClient{}, MetricDefinitionsClient: &mockAzureMetricDefinitionsClient{}, MetricsClient: &mockAzureMetricsClient{}, }, nil } func (*mockAzureResourcesClient) List(_ context.Context, _ *armresources.ClientListOptions) ([]*armresources.ClientListResponse, error) { var responses []*armresources.ClientListResponse file, err := os.ReadFile("testdata/json/azure_resources_response.json") if err != nil { return nil, fmt.Errorf("error reading file: %w", err) } var genericResourcesExpanded []*armresources.GenericResourceExpanded if err := json.Unmarshal(file, &genericResourcesExpanded); err != nil { return nil, err } response := &armresources.ClientListResponse{ ResourceListResult: armresources.ResourceListResult{ Value: genericResourcesExpanded, }, } responses = append(responses, response) return responses, nil } func (*mockAzureResourcesClient) ListByResourceGroup( _ context.Context, resourceGroup string, _ *armresources.ClientListByResourceGroupOptions) ([]*armresources.ClientListByResourceGroupResponse, error) { var responses []*armresources.ClientListByResourceGroupResponse file, err := os.ReadFile("testdata/json/azure_resources_response.json") if err != nil { return nil, fmt.Errorf("error reading file: %w", err) } var genericResourcesExpanded []*armresources.GenericResourceExpanded if err := json.Unmarshal(file, &genericResourcesExpanded); err != nil { return nil, err } if resourceGroup == "resourceGroup1" { response := &armresources.ClientListByResourceGroupResponse{ ResourceListResult: armresources.ResourceListResult{ Value: []*armresources.GenericResourceExpanded{ genericResourcesExpanded[0], genericResourcesExpanded[1], }, }, } responses = append(responses, response) return responses, nil } if resourceGroup == "resourceGroup2" { response := &armresources.ClientListByResourceGroupResponse{ ResourceListResult: armresources.ResourceListResult{ Value: []*armresources.GenericResourceExpanded{ genericResourcesExpanded[2], }, }, } responses = append(responses, response) return responses, nil } return nil, errors.New("resource group was not found") } func (*mockAzureMetricDefinitionsClient) List( _ context.Context, resourceID string, _ *armmonitor.MetricDefinitionsClientListOptions) (armmonitor.MetricDefinitionsClientListResponse, error) { file, err := os.ReadFile("testdata/json/azure_metric_definitions_responses.json") if err != nil { return armmonitor.MetricDefinitionsClientListResponse{}, fmt.Errorf("error reading file: %w", err) } var metricDefinitions [][]*armmonitor.MetricDefinition if err := json.Unmarshal(file, &metricDefinitions); err != nil { return armmonitor.MetricDefinitionsClientListResponse{}, err } if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" { return armmonitor.MetricDefinitionsClientListResponse{ MetricDefinitionCollection: armmonitor.MetricDefinitionCollection{ Value: metricDefinitions[0], }, }, nil } if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" { return armmonitor.MetricDefinitionsClientListResponse{ MetricDefinitionCollection: armmonitor.MetricDefinitionCollection{ Value: metricDefinitions[1], }, }, nil } if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3" { return armmonitor.MetricDefinitionsClientListResponse{ MetricDefinitionCollection: armmonitor.MetricDefinitionCollection{ Value: metricDefinitions[2], }, }, nil } return armmonitor.MetricDefinitionsClientListResponse{}, errors.New("resource ID was not found") } func (*mockAzureMetricsClient) List( _ context.Context, resourceID string, _ *armmonitor.MetricsClientListOptions) (armmonitor.MetricsClientListResponse, error) { file, err := os.ReadFile("testdata/json/azure_metrics_responses.json") if err != nil { return armmonitor.MetricsClientListResponse{}, fmt.Errorf("error reading file: %w", err) } var metricResponses []armmonitor.Response if err := json.Unmarshal(file, &metricResponses); err != nil { return armmonitor.MetricsClientListResponse{}, err } if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" { return armmonitor.MetricsClientListResponse{ Response: metricResponses[0], }, nil } if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" { return armmonitor.MetricsClientListResponse{ Response: metricResponses[1], }, nil } if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3" { return armmonitor.MetricsClientListResponse{ Response: metricResponses[2], }, nil } if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type2/resource4" { return armmonitor.MetricsClientListResponse{ Response: metricResponses[3], }, nil } if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type2/resource5" { return armmonitor.MetricsClientListResponse{ Response: metricResponses[4], }, nil } if resourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type2/resource6" { return armmonitor.MetricsClientListResponse{ Response: metricResponses[5], }, nil } return armmonitor.MetricsClientListResponse{}, errors.New("resource ID was not found") } func TestInit_ResourceTargetsOnly(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_resource_targets_only.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} for index := 1; index <= 27; index++ { if index <= 10 { am.ResourceTargets[4].Metrics = append(am.ResourceTargets[4].Metrics, "metric1") } else if index <= 23 { am.ResourceTargets[4].Metrics = append(am.ResourceTargets[4].Metrics, "metric2") } else { am.ResourceTargets[4].Metrics = append(am.ResourceTargets[4].Metrics, "metric3") } } var expectedResourceMetrics []string for index := 1; index <= receiver.MaxMetricsPerRequest; index++ { if index <= 10 { expectedResourceMetrics = append(expectedResourceMetrics, "metric1") } else { expectedResourceMetrics = append(expectedResourceMetrics, "metric2") } } require.NoError(t, am.Init()) require.Len(t, am.receiver.Targets.ResourceTargets, 8) for _, target := range am.receiver.Targets.ResourceTargets { require.Contains(t, []string{ "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1", "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2", "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3"}, target.ResourceID) if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" { require.Contains(t, []int{1, 2, 3, 4, receiver.MaxMetricsPerRequest}, len(target.Metrics)) if len(target.Metrics) == 1 { require.Equal(t, []string{"metric3"}, target.Metrics) require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) } if len(target.Metrics) == 2 { require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) } if len(target.Metrics) == 3 { require.Equal(t, []string{"metric2", "metric2", "metric2"}, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } if len(target.Metrics) == 4 { require.Equal(t, []string{"metric3", "metric3", "metric3", "metric3"}, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } if len(target.Metrics) == receiver.MaxMetricsPerRequest { require.Equal(t, expectedResourceMetrics, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } } if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" { require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3" { require.Equal(t, []string{"metric1", "metric2", "metric3"}, target.Metrics) require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal)}, target.Aggregations) } } } func TestInit_ResourceGroupTargetsOnly(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_resource_group_targets_only.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} for index := 1; index <= 27; index++ { if index <= 10 { am.ResourceGroupTargets[0].Resources[1].Metrics = append(am.ResourceGroupTargets[0].Resources[1].Metrics, "metric1") } else if index <= 23 { am.ResourceGroupTargets[0].Resources[1].Metrics = append(am.ResourceGroupTargets[0].Resources[1].Metrics, "metric2") } else { am.ResourceGroupTargets[0].Resources[1].Metrics = append(am.ResourceGroupTargets[0].Resources[1].Metrics, "metric3") } } var expectedResourceMetrics []string for index := 1; index <= receiver.MaxMetricsPerRequest; index++ { if index <= 10 { expectedResourceMetrics = append(expectedResourceMetrics, "metric1") } else { expectedResourceMetrics = append(expectedResourceMetrics, "metric2") } } require.NoError(t, am.Init()) require.Len(t, am.receiver.Targets.ResourceTargets, 9) for _, target := range am.receiver.Targets.ResourceTargets { require.Contains(t, []string{ "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1", "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2", "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3"}, target.ResourceID) if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" { require.Contains(t, []int{1, 2, 3, 4, receiver.MaxMetricsPerRequest}, len(target.Metrics)) if len(target.Metrics) == 1 { require.Equal(t, []string{"metric3"}, target.Metrics) require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) } if len(target.Metrics) == 2 { require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) } if len(target.Metrics) == 3 { require.Equal(t, []string{"metric2", "metric2", "metric2"}, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } if len(target.Metrics) == 4 { require.Equal(t, []string{"metric3", "metric3", "metric3", "metric3"}, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } if len(target.Metrics) == receiver.MaxMetricsPerRequest { require.Equal(t, expectedResourceMetrics, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } } if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" { require.Contains(t, []int{1, 2}, len(target.Metrics)) if len(target.Metrics) == 1 { require.Equal(t, []string{"metric2"}, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } if len(target.Metrics) == 2 { require.Contains(t, []int{1, 5}, len(target.Aggregations)) if len(target.Aggregations) == 1 { require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) require.Equal(t, []string{string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) } if len(target.Aggregations) == 5 { require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } } } if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3" { require.Equal(t, []string{"metric3"}, target.Metrics) require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) } } } func TestInit_SubscriptionTargetsOnly(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_subscription_targets_only.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} for index := 1; index <= 27; index++ { if index <= 10 { am.SubscriptionTargets[4].Metrics = append(am.SubscriptionTargets[4].Metrics, "metric1") } else if index <= 23 { am.SubscriptionTargets[4].Metrics = append(am.SubscriptionTargets[4].Metrics, "metric2") } else { am.SubscriptionTargets[4].Metrics = append(am.SubscriptionTargets[4].Metrics, "metric3") } } var expectedResourceMetrics []string for index := 1; index <= receiver.MaxMetricsPerRequest; index++ { if index <= 10 { expectedResourceMetrics = append(expectedResourceMetrics, "metric1") } else { expectedResourceMetrics = append(expectedResourceMetrics, "metric2") } } require.NoError(t, am.Init()) require.Len(t, am.receiver.Targets.ResourceTargets, 11) for _, target := range am.receiver.Targets.ResourceTargets { require.Contains(t, []string{ "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1", "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2", "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3"}, target.ResourceID) if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type1/resource1" { require.Contains(t, []int{1, 2, 3, 4, receiver.MaxMetricsPerRequest}, len(target.Metrics)) if len(target.Metrics) == 1 { require.Equal(t, []string{"metric3"}, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage), }, target.Aggregations) } if len(target.Metrics) == 2 { require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) } if len(target.Metrics) == 3 { require.Equal(t, []string{"metric2", "metric2", "metric2"}, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } if len(target.Metrics) == 4 { require.Equal(t, []string{"metric3", "metric3", "metric3", "metric3"}, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } if len(target.Metrics) == receiver.MaxMetricsPerRequest { require.Equal(t, expectedResourceMetrics, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } } if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup1/providers/Microsoft.Test/type2/resource2" { require.Contains(t, []int{1, 2}, len(target.Metrics)) if len(target.Metrics) == 1 { require.Equal(t, []string{"metric2"}, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } if len(target.Metrics) == 2 { require.Contains(t, []int{1, 5}, len(target.Aggregations)) if len(target.Aggregations) == 1 { require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) require.Equal(t, []string{string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) } if len(target.Aggregations) == 5 { require.Equal(t, []string{"metric1", "metric2"}, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } } } if target.ResourceID == "/subscriptions/subscriptionID/resourceGroups/resourceGroup2/providers/Microsoft.Test/type1/resource3" { require.Contains(t, []int{3, 7, receiver.MaxMetricsPerRequest}, len(target.Metrics)) if len(target.Metrics) == 3 { require.Equal(t, []string{"metric1", "metric2", "metric3"}, target.Metrics) require.Equal(t, []string{string(armmonitor.AggregationTypeEnumTotal), string(armmonitor.AggregationTypeEnumAverage)}, target.Aggregations) } if len(target.Metrics) == 7 { require.Equal(t, []string{"metric2", "metric2", "metric2", "metric3", "metric3", "metric3", "metric3"}, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } if len(target.Metrics) == receiver.MaxMetricsPerRequest { require.Equal(t, expectedResourceMetrics, target.Metrics) require.Equal(t, []string{ string(armmonitor.AggregationTypeEnumAverage), string(armmonitor.AggregationTypeEnumCount), string(armmonitor.AggregationTypeEnumMaximum), string(armmonitor.AggregationTypeEnumMinimum), string(armmonitor.AggregationTypeEnumTotal), }, target.Aggregations) } } } } func TestInit_AllTargetTypes(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_all_target_types.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} for index := 1; index <= 27; index++ { if index <= 10 { am.ResourceTargets[4].Metrics = append(am.ResourceTargets[4].Metrics, "metric1") am.ResourceGroupTargets[0].Resources[1].Metrics = append(am.ResourceGroupTargets[0].Resources[1].Metrics, "metric1") am.SubscriptionTargets[4].Metrics = append(am.SubscriptionTargets[4].Metrics, "metric1") } else if index <= 23 { am.ResourceTargets[4].Metrics = append(am.ResourceTargets[4].Metrics, "metric2") am.ResourceGroupTargets[0].Resources[1].Metrics = append(am.ResourceGroupTargets[0].Resources[1].Metrics, "metric2") am.SubscriptionTargets[4].Metrics = append(am.SubscriptionTargets[4].Metrics, "metric2") } else { am.ResourceTargets[4].Metrics = append(am.ResourceTargets[4].Metrics, "metric3") am.ResourceGroupTargets[0].Resources[1].Metrics = append(am.ResourceGroupTargets[0].Resources[1].Metrics, "metric3") am.SubscriptionTargets[4].Metrics = append(am.SubscriptionTargets[4].Metrics, "metric3") } } require.NoError(t, am.Init()) require.Len(t, am.receiver.Targets.ResourceTargets, 28) } func TestInit_NoSubscriptionID(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_no_subscription_id.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_NoTargets(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_no_targets.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_ResourceTargetWithoutResourceID(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_resource_target_without_resource_id.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_ResourceTargetWithInvalidResourceID(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_resource_target_with_invalid_resource_id.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_ResourceTargetWithInvalidMetric(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_resource_target_with_invalid_metric.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_ResourceTargetWithInvalidAggregation(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_resource_target_with_invalid_aggregation.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_ResourceGroupTargetWithoutResourceGroup(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_resource_group_target_without_resource_group.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_ResourceGroupTargetWithResourceWithoutResourceType(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_resource_group_target_with_resource_without_resource_type.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_ResourceGroupTargetWithInvalidResourceGroup(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_resource_group_target_with_invalid_resource_group.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_ResourceGroupTargetWithInvalidResourceType(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_resource_group_target_with_invalid_resource_type.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_ResourceGroupTargetWithInvalidMetric(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_resource_group_target_with_invalid_metric.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_ResourceGroupTargetWithInvalidAggregation(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_resource_group_target_with_invalid_aggregation.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_ResourceGroupTargetWithoutResources(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_resource_group_target_without_resources.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_ResourceGroupTargetNoResourceFound(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_resource_group_target_no_resource_found.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_SubscriptionTargetWithoutResourceType(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_subscription_target_without_resource_type.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_SubscriptionTargetWithInvalidResourceType(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_subscription_target_with_invalid_resource_type.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_SubscriptionTargetWithInvalidMetric(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_subscription_target_with_invalid_metric.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_SubscriptionTargetWithInvalidAggregation(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_subscription_target_with_invalid_aggregation.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_SubscriptionTargetNoResourceFound(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_subscription_target_no_resource_found.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} require.Error(t, am.Init()) } func TestInit_BadCredentials(t *testing.T) { file, err := os.ReadFile("testdata/toml/init_bad_credentials.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &azureClientsManager{} require.Error(t, am.Init()) } func TestGather_Success(t *testing.T) { file, err := os.ReadFile("testdata/toml/gather_success.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} resourceTargets := make([]*receiver.ResourceTarget, 0, len(am.ResourceTargets)) for _, target := range am.ResourceTargets { resourceTargets = append(resourceTargets, receiver.NewResourceTarget(target.ResourceID, target.Metrics, target.Aggregations)) } var clientOptions = azcore.ClientOptions{Cloud: cloud.AzurePublic} var azureClients *receiver.AzureClients azureClients, err = am.azureManager.createAzureClients(am.SubscriptionID, am.ClientID, am.ClientSecret, am.TenantID, clientOptions) require.NoError(t, err) require.NotNil(t, azureClients) am.receiver, err = receiver.NewAzureMonitorMetricsReceiver( am.SubscriptionID, receiver.NewTargets(resourceTargets, nil, nil), azureClients, ) require.NoError(t, err) require.NotNil(t, am.receiver) expectedResource1Metric1Name := "azure_monitor_microsoft_test_type1_metric1" expectedResource1Metric1MetricFields := make(map[string]interface{}) expectedResource1Metric1MetricFields[receiver.MetricFieldTimeStamp] = "2022-02-22T22:59:00Z" expectedResource1Metric1MetricFields[receiver.MetricFieldTotal] = 5.0 expectedResource1Metric1MetricFields[receiver.MetricFieldMaximum] = 5.0 expectedResource1Metric2Name := "azure_monitor_microsoft_test_type1_metric2" expectedResource1Metric2MetricFields := make(map[string]interface{}) expectedResource1Metric2MetricFields[receiver.MetricFieldTimeStamp] = "2022-02-22T22:59:00Z" expectedResource1Metric2MetricFields[receiver.MetricFieldTotal] = 2.5 expectedResource1Metric2MetricFields[receiver.MetricFieldMaximum] = 2.5 expectedResource1MetricsTags := make(map[string]string) expectedResource1MetricsTags[receiver.MetricTagSubscriptionID] = "subscriptionID" expectedResource1MetricsTags[receiver.MetricTagResourceGroup] = "resourceGroup1" expectedResource1MetricsTags[receiver.MetricTagNamespace] = "Microsoft.Test/type1" expectedResource1MetricsTags[receiver.MetricTagResourceName] = "resource1" expectedResource1MetricsTags[receiver.MetricTagResourceRegion] = "eastus" expectedResource1MetricsTags[receiver.MetricTagUnit] = string(armmonitor.MetricUnitCount) expectedResource2Metric1Name := "azure_monitor_microsoft_test_type2_metric1" expectedResource2Metric1MetricFields := make(map[string]interface{}) expectedResource2Metric1MetricFields[receiver.MetricFieldTimeStamp] = "2022-02-22T22:59:00Z" expectedResource2Metric1MetricFields[receiver.MetricFieldTotal] = 5.0 expectedResource2Metric1MetricFields[receiver.MetricFieldMinimum] = 2.5 expectedResource2MetricsTags := make(map[string]string) expectedResource2MetricsTags[receiver.MetricTagSubscriptionID] = "subscriptionID" expectedResource2MetricsTags[receiver.MetricTagResourceGroup] = "resourceGroup1" expectedResource2MetricsTags[receiver.MetricTagNamespace] = "Microsoft.Test/type2" expectedResource2MetricsTags[receiver.MetricTagResourceName] = "resource2" expectedResource2MetricsTags[receiver.MetricTagResourceRegion] = "eastus" expectedResource2MetricsTags[receiver.MetricTagUnit] = string(armmonitor.MetricUnitCount) expectedResource3Metric1Name := "azure_monitor_microsoft_test_type1_metric1" expectedResource3Metric1MetricFields := make(map[string]interface{}) expectedResource3Metric1MetricFields[receiver.MetricFieldTimeStamp] = "2022-02-22T22:58:00Z" expectedResource3Metric1MetricFields[receiver.MetricFieldTotal] = 2.5 expectedResource3Metric1MetricFields[receiver.MetricFieldMinimum] = 2.5 expectedResource3MetricsTags := make(map[string]string) expectedResource3MetricsTags[receiver.MetricTagSubscriptionID] = "subscriptionID" expectedResource3MetricsTags[receiver.MetricTagResourceGroup] = "resourceGroup2" expectedResource3MetricsTags[receiver.MetricTagNamespace] = "Microsoft.Test/type1" expectedResource3MetricsTags[receiver.MetricTagResourceName] = "resource3" expectedResource3MetricsTags[receiver.MetricTagResourceRegion] = "eastus" expectedResource3MetricsTags[receiver.MetricTagUnit] = string(armmonitor.MetricUnitBytes) acc := testutil.Accumulator{} require.NoError(t, acc.GatherError(am.Gather)) require.Len(t, acc.Metrics, 4) acc.AssertContainsTaggedFields(t, expectedResource1Metric1Name, expectedResource1Metric1MetricFields, expectedResource1MetricsTags) acc.AssertContainsTaggedFields(t, expectedResource1Metric2Name, expectedResource1Metric2MetricFields, expectedResource1MetricsTags) acc.AssertContainsTaggedFields(t, expectedResource2Metric1Name, expectedResource2Metric1MetricFields, expectedResource2MetricsTags) acc.AssertContainsTaggedFields(t, expectedResource3Metric1Name, expectedResource3Metric1MetricFields, expectedResource3MetricsTags) } func TestGather_China_Success(t *testing.T) { file, err := os.ReadFile("testdata/toml/gather_success_cloud_option_china.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} resourceTargets := make([]*receiver.ResourceTarget, 0, len(am.ResourceTargets)) for _, target := range am.ResourceTargets { resourceTargets = append(resourceTargets, receiver.NewResourceTarget(target.ResourceID, target.Metrics, target.Aggregations)) } var clientOptions = azcore.ClientOptions{Cloud: cloud.AzureChina} var azureClients *receiver.AzureClients azureClients, err = am.azureManager.createAzureClients(am.SubscriptionID, am.ClientID, am.ClientSecret, am.TenantID, clientOptions) require.NoError(t, err) require.NotNil(t, azureClients) am.receiver, err = receiver.NewAzureMonitorMetricsReceiver( am.SubscriptionID, receiver.NewTargets(resourceTargets, nil, nil), azureClients, ) require.NoError(t, err) require.NotNil(t, am.receiver) } func TestGather_Government_Success(t *testing.T) { file, err := os.ReadFile("testdata/toml/gather_success_cloud_option_government.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} resourceTargets := make([]*receiver.ResourceTarget, 0, len(am.ResourceTargets)) for _, target := range am.ResourceTargets { resourceTargets = append(resourceTargets, receiver.NewResourceTarget(target.ResourceID, target.Metrics, target.Aggregations)) } var clientOptions = azcore.ClientOptions{Cloud: cloud.AzureGovernment} var azureClients *receiver.AzureClients azureClients, err = am.azureManager.createAzureClients(am.SubscriptionID, am.ClientID, am.ClientSecret, am.TenantID, clientOptions) require.NoError(t, err) require.NotNil(t, azureClients) am.receiver, err = receiver.NewAzureMonitorMetricsReceiver( am.SubscriptionID, receiver.NewTargets(resourceTargets, nil, nil), azureClients, ) require.NoError(t, err) require.NotNil(t, am.receiver) } func TestGather_Public_Success(t *testing.T) { file, err := os.ReadFile("testdata/toml/gather_success_cloud_option_public.toml") require.NoError(t, err) require.NotNil(t, file) require.NotEmpty(t, file) var am *AzureMonitor require.NoError(t, toml.Unmarshal(file, &am)) am.Log = testutil.Logger{} am.azureManager = &mockAzureClientsManager{} resourceTargets := make([]*receiver.ResourceTarget, 0, len(am.ResourceTargets)) for _, target := range am.ResourceTargets { resourceTargets = append(resourceTargets, receiver.NewResourceTarget(target.ResourceID, target.Metrics, target.Aggregations)) } var clientOptions = azcore.ClientOptions{Cloud: cloud.AzurePublic} var azureClients *receiver.AzureClients azureClients, err = am.azureManager.createAzureClients(am.SubscriptionID, am.ClientID, am.ClientSecret, am.TenantID, clientOptions) require.NoError(t, err) require.NotNil(t, azureClients) am.receiver, err = receiver.NewAzureMonitorMetricsReceiver( am.SubscriptionID, receiver.NewTargets(resourceTargets, nil, nil), azureClients, ) require.NoError(t, err) require.NotNil(t, am.receiver) }