Azure Monitor: Add support for cross resource queries (#19115)
* Add new query mode picker with different states for each query. Also really simple migration script * Populate cross resource dropdowns * Cleanup. Handle change events * Add multi select picker for subscriptions * Fix markup issue * Prepare for new query mode * More cleanup * Handle multiple queries both in ds and backend * Refactoring * Improve migration * Add support for multiselect display name * Use multiselect also for locations and resources * Add more typings * Fix migrations * Custom multiselect built for array of options instead of variables * Add url builder test * fix datasource tests * UI fixes * Improve query editor init * Fix brokens tests * Cleanup * Fix tslint issue * Change query mode display name * Make sure alerting works for single queries * Friendly error for multi resources * Add temporary typings
This commit is contained in:
@@ -60,7 +60,11 @@ func (e *AzureMonitorDatasource) executeTimeSeriesQuery(ctx context.Context, ori
|
||||
if err != nil {
|
||||
queryRes.Error = err
|
||||
}
|
||||
result.Results[query.RefID] = queryRes
|
||||
if val, ok := result.Results[query.RefID]; ok {
|
||||
val.Series = append(result.Results[query.RefID].Series, queryRes.Series...)
|
||||
} else {
|
||||
result.Results[query.RefID] = queryRes
|
||||
}
|
||||
}
|
||||
|
||||
return result, nil
|
||||
@@ -84,11 +88,22 @@ func (e *AzureMonitorDatasource) buildQueries(queries []*tsdb.Query, timeRange *
|
||||
azureMonitorTarget := query.Model.Get("azureMonitor").MustMap()
|
||||
azlog.Debug("AzureMonitor", "target", azureMonitorTarget)
|
||||
|
||||
queryMode := fmt.Sprintf("%v", azureMonitorTarget["queryMode"])
|
||||
if queryMode == "crossResource" {
|
||||
return nil, fmt.Errorf("Alerting not supported for multiple resource queries")
|
||||
}
|
||||
|
||||
var azureMonitorData map[string]interface{}
|
||||
if queryMode == "singleResource" {
|
||||
azureMonitorData = azureMonitorTarget["data"].(map[string]interface{})[queryMode].(map[string]interface{})
|
||||
} else {
|
||||
azureMonitorData = azureMonitorTarget
|
||||
}
|
||||
urlComponents := map[string]string{}
|
||||
urlComponents["subscription"] = fmt.Sprintf("%v", query.Model.Get("subscription").MustString())
|
||||
urlComponents["resourceGroup"] = fmt.Sprintf("%v", azureMonitorTarget["resourceGroup"])
|
||||
urlComponents["metricDefinition"] = fmt.Sprintf("%v", azureMonitorTarget["metricDefinition"])
|
||||
urlComponents["resourceName"] = fmt.Sprintf("%v", azureMonitorTarget["resourceName"])
|
||||
urlComponents["resourceGroup"] = fmt.Sprintf("%v", azureMonitorData["resourceGroup"])
|
||||
urlComponents["metricDefinition"] = fmt.Sprintf("%v", azureMonitorData["metricDefinition"])
|
||||
urlComponents["resourceName"] = fmt.Sprintf("%v", azureMonitorData["resourceName"])
|
||||
|
||||
ub := urlBuilder{
|
||||
DefaultSubscription: query.DataSource.JsonData.Get("subscriptionId").MustString(),
|
||||
@@ -100,12 +115,12 @@ func (e *AzureMonitorDatasource) buildQueries(queries []*tsdb.Query, timeRange *
|
||||
azureURL := ub.Build()
|
||||
|
||||
alias := ""
|
||||
if val, ok := azureMonitorTarget["alias"]; ok {
|
||||
if val, ok := azureMonitorData["alias"]; ok {
|
||||
alias = fmt.Sprintf("%v", val)
|
||||
}
|
||||
|
||||
timeGrain := fmt.Sprintf("%v", azureMonitorTarget["timeGrain"])
|
||||
timeGrains := azureMonitorTarget["allowedTimeGrainsMs"]
|
||||
timeGrain := fmt.Sprintf("%v", azureMonitorData["timeGrain"])
|
||||
timeGrains := azureMonitorData["allowedTimeGrainsMs"]
|
||||
if timeGrain == "auto" {
|
||||
timeGrain, err = e.setAutoTimeGrain(query.IntervalMs, timeGrains)
|
||||
if err != nil {
|
||||
@@ -117,13 +132,16 @@ func (e *AzureMonitorDatasource) buildQueries(queries []*tsdb.Query, timeRange *
|
||||
params.Add("api-version", "2018-01-01")
|
||||
params.Add("timespan", fmt.Sprintf("%v/%v", startTime.UTC().Format(time.RFC3339), endTime.UTC().Format(time.RFC3339)))
|
||||
params.Add("interval", timeGrain)
|
||||
params.Add("aggregation", fmt.Sprintf("%v", azureMonitorTarget["aggregation"]))
|
||||
params.Add("metricnames", fmt.Sprintf("%v", azureMonitorTarget["metricName"]))
|
||||
params.Add("metricnamespace", fmt.Sprintf("%v", azureMonitorTarget["metricNamespace"]))
|
||||
params.Add("aggregation", fmt.Sprintf("%v", azureMonitorData["aggregation"]))
|
||||
params.Add("metricnames", fmt.Sprintf("%v", azureMonitorData["metricName"]))
|
||||
|
||||
dimension := strings.TrimSpace(fmt.Sprintf("%v", azureMonitorTarget["dimension"]))
|
||||
dimensionFilter := strings.TrimSpace(fmt.Sprintf("%v", azureMonitorTarget["dimensionFilter"]))
|
||||
if azureMonitorTarget["dimension"] != nil && azureMonitorTarget["dimensionFilter"] != nil && len(dimension) > 0 && len(dimensionFilter) > 0 && dimension != "None" {
|
||||
if val, ok := azureMonitorData["metricNamespace"]; ok {
|
||||
params.Add("metricnamespace", fmt.Sprintf("%v", val))
|
||||
}
|
||||
|
||||
dimension := strings.TrimSpace(fmt.Sprintf("%v", azureMonitorData["dimension"]))
|
||||
dimensionFilter := strings.TrimSpace(fmt.Sprintf("%v", azureMonitorData["dimensionFilter"]))
|
||||
if azureMonitorData["dimension"] != nil && azureMonitorData["dimensionFilter"] != nil && len(dimension) > 0 && len(dimensionFilter) > 0 && dimension != "None" {
|
||||
params.Add("$filter", fmt.Sprintf("%s eq '%s'", dimension, dimensionFilter))
|
||||
}
|
||||
|
||||
|
||||
@@ -36,15 +36,20 @@ func TestAzureMonitorDatasource(t *testing.T) {
|
||||
Model: simplejson.NewFromAny(map[string]interface{}{
|
||||
"subscription": "12345678-aaaa-bbbb-cccc-123456789abc",
|
||||
"azureMonitor": map[string]interface{}{
|
||||
"timeGrain": "PT1M",
|
||||
"aggregation": "Average",
|
||||
"resourceGroup": "grafanastaging",
|
||||
"resourceName": "grafana",
|
||||
"metricDefinition": "Microsoft.Compute/virtualMachines",
|
||||
"metricNamespace": "Microsoft.Compute-virtualMachines",
|
||||
"metricName": "Percentage CPU",
|
||||
"alias": "testalias",
|
||||
"queryType": "Azure Monitor",
|
||||
"queryMode": "singleResource",
|
||||
"data": map[string]interface{}{
|
||||
"singleResource": map[string]interface{}{
|
||||
"timeGrain": "PT1M",
|
||||
"aggregation": "Average",
|
||||
"resourceGroup": "grafanastaging",
|
||||
"resourceName": "grafana",
|
||||
"metricDefinition": "Microsoft.Compute/virtualMachines",
|
||||
"metricNamespace": "Microsoft.Compute-virtualMachines",
|
||||
"metricName": "Percentage CPU",
|
||||
"alias": "testalias",
|
||||
"queryType": "Azure Monitor",
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
RefId: "A",
|
||||
|
||||
Reference in New Issue
Block a user