From fd76baa5cbe6e80ff4cb810316f84eabfcee89c4 Mon Sep 17 00:00:00 2001 From: Andreas Christou Date: Tue, 24 Sep 2024 14:56:37 +0100 Subject: [PATCH] [v11.1.x] Add basic logs enabled check (#93157) Add basic logs enabled check (#92324) (cherry picked from commit 0049e4f997b0931d7ef781984d6b691c764eaabf) # Conflicts: # pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go # pkg/tsdb/azuremonitor/loganalytics/utils.go Co-authored-by: Alyssa (Bull) Joyner <58453566+alyssabull@users.noreply.github.com> --- .../azure-log-analytics-datasource.go | 7 ++- .../azure-log-analytics-datasource_test.go | 63 ++++++++++++++----- pkg/tsdb/azuremonitor/loganalytics/utils.go | 15 +++-- 3 files changed, 62 insertions(+), 23 deletions(-) diff --git a/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go b/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go index 86c9f4cf3b0..72af530eb91 100644 --- a/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go +++ b/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go @@ -166,6 +166,7 @@ func buildLogAnalyticsQuery(query backend.DataQuery, dsInfo types.DatasourceInfo timeColumn := "" azureLogAnalyticsTarget := queryJSONModel.AzureLogAnalytics basicLogsQuery := false + basicLogsEnabled := false resultFormat := ParseResultFormat(azureLogAnalyticsTarget.ResultFormat, dataquery.AzureQueryTypeAzureLogAnalytics) @@ -177,8 +178,12 @@ func buildLogAnalyticsQuery(query backend.DataQuery, dsInfo types.DatasourceInfo resources, resourceOrWorkspace := retrieveResources(azureLogAnalyticsTarget) appInsightsQuery = appInsightsRegExp.Match([]byte(resourceOrWorkspace)) + if value, ok := dsInfo.JSONData["basicLogsEnabled"].(bool); ok { + basicLogsEnabled = value + } + if basicLogsQueryFlag { - if meetsBasicLogsCriteria, meetsBasicLogsCriteriaErr := meetsBasicLogsCriteria(resources, fromAlert); meetsBasicLogsCriteriaErr != nil { + if meetsBasicLogsCriteria, meetsBasicLogsCriteriaErr := meetsBasicLogsCriteria(resources, fromAlert, basicLogsEnabled); meetsBasicLogsCriteriaErr != nil { return nil, meetsBasicLogsCriteriaErr } else { basicLogsQuery = meetsBasicLogsCriteria diff --git a/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource_test.go b/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource_test.go index a02ea2046eb..8cc975da67b 100644 --- a/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource_test.go +++ b/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource_test.go @@ -83,15 +83,6 @@ func TestBuildLogAnalyticsQuery(t *testing.T) { t.Errorf("failed to create fake client") } - dsInfo := types.DatasourceInfo{ - Services: map[string]types.DatasourceService{ - "Azure Monitor": {URL: svr.URL, HTTPClient: client}, - }, - JSONData: map[string]any{ - "azureLogAnalyticsSameAs": false, - }, - } - appInsightsRegExp, err := regexp.Compile("(?i)providers/microsoft.insights/components") if err != nil { t.Error("failed to compile reg: %w", err) @@ -100,6 +91,7 @@ func TestBuildLogAnalyticsQuery(t *testing.T) { tests := []struct { name string fromAlert bool + basicLogsEnabled bool queryModel backend.DataQuery azureLogAnalyticsQuery *AzureLogAnalyticsQuery Err require.ErrorAssertionFunc @@ -332,8 +324,9 @@ func TestBuildLogAnalyticsQuery(t *testing.T) { Err: require.NoError, }, { - name: "Basic Logs query", - fromAlert: false, + name: "Basic Logs query", + fromAlert: false, + basicLogsEnabled: true, queryModel: backend.DataQuery{ JSON: []byte(fmt.Sprintf(`{ "queryType": "Azure Log Analytics", @@ -377,8 +370,9 @@ func TestBuildLogAnalyticsQuery(t *testing.T) { Err: require.NoError, }, { - name: "Basic Logs query with multiple resources", - fromAlert: false, + name: "Basic Logs query with multiple resources", + fromAlert: false, + basicLogsEnabled: true, queryModel: backend.DataQuery{ JSON: []byte(fmt.Sprintf(`{ "queryType": "Azure Log Analytics", @@ -399,8 +393,9 @@ func TestBuildLogAnalyticsQuery(t *testing.T) { Err: require.Error, }, { - name: "Basic Logs query with non LA workspace resources", - fromAlert: false, + name: "Basic Logs query with non LA workspace resources", + fromAlert: false, + basicLogsEnabled: true, queryModel: backend.DataQuery{ JSON: []byte(fmt.Sprintf(`{ "queryType": "Azure Log Analytics", @@ -421,8 +416,9 @@ func TestBuildLogAnalyticsQuery(t *testing.T) { Err: require.Error, }, { - name: "Basic Logs query from alerts", - fromAlert: true, + name: "Basic Logs query from alerts", + fromAlert: true, + basicLogsEnabled: true, queryModel: backend.DataQuery{ JSON: []byte(fmt.Sprintf(`{ "queryType": "Azure Log Analytics", @@ -442,6 +438,30 @@ func TestBuildLogAnalyticsQuery(t *testing.T) { azureLogAnalyticsQuery: nil, Err: require.Error, }, + { + name: "Basic Logs query fails if basicLogsEnabled is set to false", + fromAlert: true, + basicLogsEnabled: false, + queryModel: backend.DataQuery{ + JSON: []byte(fmt.Sprintf(`{ + "queryType": "Azure Log Analytics", + "azureLogAnalytics": { + "resources": ["/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.Insights/components/r1"], + "query": "Perf", + "resultFormat": "%s", + "dashboardTime": true, + "timeColumn": "TimeGenerated", + "basicLogsQuery": true + } + }`, dataquery.ResultFormatTimeSeries)), + RefID: "A", + TimeRange: timeRange, + QueryType: string(dataquery.AzureQueryTypeAzureLogAnalytics), + }, + azureLogAnalyticsQuery: nil, + Err: require.Error, + }, + { name: "Detects App Insights resource queries", fromAlert: false, @@ -524,6 +544,15 @@ func TestBuildLogAnalyticsQuery(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + dsInfo := types.DatasourceInfo{ + Services: map[string]types.DatasourceService{ + "Azure Monitor": {URL: svr.URL, HTTPClient: client}, + }, + JSONData: map[string]any{ + "azureLogAnalyticsSameAs": false, + "basicLogsEnabled": tt.basicLogsEnabled, // Use the value from the current test case + }, + } query, err := buildLogAnalyticsQuery(tt.queryModel, dsInfo, appInsightsRegExp, tt.fromAlert) tt.Err(t, err) if diff := cmp.Diff(tt.azureLogAnalyticsQuery, query); diff != "" { diff --git a/pkg/tsdb/azuremonitor/loganalytics/utils.go b/pkg/tsdb/azuremonitor/loganalytics/utils.go index 5f1a91f2433..a56c0d7df21 100644 --- a/pkg/tsdb/azuremonitor/loganalytics/utils.go +++ b/pkg/tsdb/azuremonitor/loganalytics/utils.go @@ -40,10 +40,11 @@ func AddConfigLinks(frame data.Frame, dl string, title *string) data.Frame { } // Check whether a query should be handled as basic logs query -// 2. resource selected is a workspace -// 3. query is not an alerts query -// 4. number of selected resources is exactly one -func meetsBasicLogsCriteria(resources []string, fromAlert bool) (bool, error) { +// 1. resource selected is a workspace +// 2. query is not an alerts query +// 3. number of selected resources is exactly one +// 4. the ds toggle is set to true +func meetsBasicLogsCriteria(resources []string, fromAlert bool, basicLogsEnabled bool) (bool, error) { if fromAlert { return false, fmt.Errorf("basic Logs queries cannot be used for alerts") } @@ -52,7 +53,11 @@ func meetsBasicLogsCriteria(resources []string, fromAlert bool) (bool, error) { } if !strings.Contains(strings.ToLower(resources[0]), "microsoft.operationalinsights/workspaces") { - return false, fmt.Errorf("basic Logs queries may only be run against Log Analytics workspaces") + return false, fmt.Errorf("basic logs queries may only be run against Log Analytics workspaces") + } + + if !basicLogsEnabled { + return false, fmt.Errorf("basic Logs queries are disabled for this data source") } return true, nil