1
0
Fork 0
telegraf/plugins/inputs/azure_monitor/azure_monitor_test.go
Daniel Baumann 4978089aab
Adding upstream version 1.34.4.
Signed-off-by: Daniel Baumann <daniel@debian.org>
2025-05-24 07:26:29 +02:00

1084 lines
40 KiB
Go

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)
}