grafana/pkg/tsdb/azuremonitor/metrics/url-builder.go
Andreas Christou 8808de0b45
AzureMonitor: Improve error handling and update tests (#77967)
* Improve error handling and update tests

* Assert errors are nil

* Refactor away redundant code
2023-11-09 21:13:07 +00:00

81 lines
2.2 KiB
Go

package metrics
import (
"fmt"
"strings"
)
// urlBuilder builds the URL for calling the Azure Monitor API
type urlBuilder struct {
ResourceURI *string
// Following fields will be used to generate a ResourceURI
DefaultSubscription *string
Subscription *string
ResourceGroup *string
MetricNamespace *string
ResourceName *string
MetricDefinition *string
}
func (params *urlBuilder) buildResourceURI() (*string, error) {
if params.ResourceURI != nil && *params.ResourceURI != "" {
return params.ResourceURI, nil
}
subscription := params.Subscription
if params.Subscription == nil || *params.Subscription == "" {
subscription = params.DefaultSubscription
}
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(*metricNamespace, "/")
var resourceNameArray []string
if params.ResourceName != nil && *params.ResourceName != "" {
resourceNameArray = strings.Split(*params.ResourceName, "/")
}
provider := metricNamespaceArray[0]
metricNamespaceArray = metricNamespaceArray[1:]
if strings.HasPrefix(strings.ToLower(*metricNamespace), "microsoft.storage/storageaccounts/") &&
params.ResourceName != nil &&
!strings.HasSuffix(*params.ResourceName, "default") {
resourceNameArray = append(resourceNameArray, "default")
}
resGroup := ""
if params.ResourceGroup != nil {
resGroup = *params.ResourceGroup
}
urlArray := []string{
"/subscriptions",
*subscription,
"resourceGroups",
resGroup,
"providers",
provider,
}
for i, namespace := range metricNamespaceArray {
urlArray = append(urlArray, namespace, resourceNameArray[i])
}
resourceURI := strings.Join(urlArray, "/")
return &resourceURI, nil
}
// BuildSubscriptionMetricsURL returns a URL for querying metrics for all resources in a subscription
// It requires to set a $filter and a region parameter
func BuildSubscriptionMetricsURL(subscription string) string {
return fmt.Sprintf("/subscriptions/%s/providers/microsoft.insights/metrics", subscription)
}