[v11.2.x] Add basic logs enabled check (#93158)

Add basic logs enabled check (#92324)

(cherry picked from commit 0049e4f997)

# 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>
This commit is contained in:
Andreas Christou
2024-09-12 07:51:08 -06:00
committed by GitHub
co-authored by Alyssa Joyner
parent a7391bcf88
commit 5abb9a8632
3 changed files with 62 additions and 23 deletions
@@ -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
@@ -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 != "" {
+10 -5
View File
@@ -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