Azure Monitor: buildResourceURI function incorrectly migrating (#77178)

This commit is contained in:
Alyssa Bull 2023-11-02 14:30:18 -06:00 committed by GitHub
parent 64e28c0ae2
commit a4744a8f5e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 69 additions and 22 deletions

View File

@ -112,7 +112,10 @@ func (e *AzureMonitorDatasource) buildQueries(queries []backend.DataQuery, dsInf
azureURL = ub.BuildMetricsURL()
// POST requests are only supported at the subscription level
filterInBody = false
resourceUri := ub.buildResourceURI()
resourceUri, err := ub.buildResourceURI()
if err != nil {
return nil, err
}
if resourceUri != nil {
resourceMap[*resourceUri] = dataquery.AzureMonitorResource{ResourceGroup: resourceGroup, ResourceName: resourceName}
}
@ -125,7 +128,7 @@ func (e *AzureMonitorDatasource) buildQueries(queries []backend.DataQuery, dsInf
MetricNamespace: azJSONModel.MetricNamespace,
ResourceName: r.ResourceName,
}
resourceUri := ub.buildResourceURI()
resourceUri, _ := ub.buildResourceURI()
if resourceUri != nil {
resourceMap[*resourceUri] = r
}

View File

@ -15,11 +15,12 @@ type urlBuilder struct {
ResourceGroup *string
MetricNamespace *string
ResourceName *string
MetricDefinition *string
}
func (params *urlBuilder) buildResourceURI() *string {
func (params *urlBuilder) buildResourceURI() (*string, error) {
if params.ResourceURI != nil && *params.ResourceURI != "" {
return params.ResourceURI
return params.ResourceURI, nil
}
subscription := params.Subscription
@ -28,11 +29,16 @@ func (params *urlBuilder) buildResourceURI() *string {
subscription = params.DefaultSubscription
}
if params.MetricNamespace == nil || *params.MetricNamespace == "" {
return nil
metricNamespace := params.MetricNamespace
if metricNamespace == nil || *metricNamespace == "" {
if params.MetricDefinition == nil || *params.MetricDefinition == "" {
return nil, fmt.Errorf("no metricNamespace or metricDefiniton value provided")
}
metricNamespace = params.MetricDefinition
}
metricNamespaceArray := strings.Split(*params.MetricNamespace, "/")
metricNamespaceArray := strings.Split(*metricNamespace, "/")
var resourceNameArray []string
if params.ResourceName != nil && *params.ResourceName != "" {
resourceNameArray = strings.Split(*params.ResourceName, "/")
@ -40,7 +46,7 @@ func (params *urlBuilder) buildResourceURI() *string {
provider := metricNamespaceArray[0]
metricNamespaceArray = metricNamespaceArray[1:]
if strings.HasPrefix(strings.ToLower(*params.MetricNamespace), "microsoft.storage/storageaccounts/") &&
if strings.HasPrefix(strings.ToLower(*metricNamespace), "microsoft.storage/storageaccounts/") &&
params.ResourceName != nil &&
!strings.HasSuffix(*params.ResourceName, "default") {
resourceNameArray = append(resourceNameArray, "default")
@ -64,7 +70,7 @@ func (params *urlBuilder) buildResourceURI() *string {
}
resourceURI := strings.Join(urlArray, "/")
return &resourceURI
return &resourceURI, nil
}
// BuildMetricsURL checks the metric properties to see which form of the url
@ -74,7 +80,7 @@ func (params *urlBuilder) BuildMetricsURL() string {
// Prior to Grafana 9, we had a legacy query object rather than a resourceURI, so we manually create the resource URI
if resourceURI == nil || *resourceURI == "" {
resourceURI = params.buildResourceURI()
resourceURI, _ = params.buildResourceURI()
}
return fmt.Sprintf("%s/providers/microsoft.insights/metrics", *resourceURI)

View File

@ -91,18 +91,56 @@ func TestURLBuilder(t *testing.T) {
url := ub.BuildMetricsURL()
assert.Equal(t, "/subscriptions/default-sub/resourceGroups/rg/providers/Microsoft.NetApp/netAppAccounts/rn1/capacityPools/rn2/volumes/rn3/providers/microsoft.insights/metrics", url)
})
t.Run("when metric definition is Microsoft.Storage/storageAccounts/blobServices", func(t *testing.T) {
ub := &urlBuilder{
DefaultSubscription: strPtr("default-sub"),
ResourceGroup: strPtr("rg"),
MetricNamespace: strPtr("Microsoft.Storage/storageAccounts/blobServices"),
ResourceName: strPtr("rn1"),
}
url := *ub.buildResourceURI()
assert.Equal(t, "/subscriptions/default-sub/resourceGroups/rg/providers/Microsoft.Storage/storageAccounts/rn1/blobServices/default", url)
})
})
})
}
func TestBuildResourceURI(t *testing.T) {
t.Run("AzureMonitor Resource URI Builder", func(t *testing.T) {
t.Run("when there is no resource uri", func(t *testing.T) {
ub := &urlBuilder{
DefaultSubscription: strPtr("default-sub"),
MetricDefinition: strPtr("Microsoft.Web/serverFarms"),
ResourceGroup: strPtr("rg"),
ResourceName: strPtr("rn1"),
}
result, err := ub.buildResourceURI()
if err != nil {
return
}
url := *result
assert.Equal(t, "/subscriptions/default-sub/resourceGroups/rg/providers/Microsoft.Web/serverFarms/rn1", url)
})
t.Run("when metric definition is Microsoft.Storage/storageAccounts/blobServices", func(t *testing.T) {
ub := &urlBuilder{
DefaultSubscription: strPtr("default-sub"),
ResourceGroup: strPtr("rg"),
MetricNamespace: strPtr("Microsoft.Storage/storageAccounts/blobServices"),
ResourceName: strPtr("rn1"),
}
result, err := ub.buildResourceURI()
if err != nil {
return
}
url := *result
assert.Equal(t, "/subscriptions/default-sub/resourceGroups/rg/providers/Microsoft.Storage/storageAccounts/rn1/blobServices/default", url)
})
t.Run("when metricDefinition or metricNamespace is not defined an error is thrown", func(t *testing.T) {
ub := &urlBuilder{}
_, err := ub.buildResourceURI()
if err == nil {
t.Errorf("Expected an error, but got nil")
} else {
expectedErrorMessage := "no metricNamespace or metricDefiniton value provided"
if err.Error() != expectedErrorMessage {
t.Errorf("Expected error message %s, but got %s", expectedErrorMessage, err.Error())
}
}
})
})
}