Add basic logs enabled check (#92324)

This commit is contained in:
Alyssa (Bull) Joyner 2024-09-09 13:35:56 -06:00 committed by GitHub
parent 951f676ac8
commit 0049e4f997
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 62 additions and 24 deletions

View File

@ -169,6 +169,7 @@ func buildLogAnalyticsQuery(query backend.DataQuery, dsInfo types.DatasourceInfo
timeColumn := ""
azureLogAnalyticsTarget := queryJSONModel.AzureLogAnalytics
basicLogsQuery := false
basicLogsEnabled := false
resultFormat := ParseResultFormat(azureLogAnalyticsTarget.ResultFormat, dataquery.AzureQueryTypeAzureLogAnalytics)
@ -180,9 +181,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 {
// This error is a downstream error
if meetsBasicLogsCriteria, meetsBasicLogsCriteriaErr := meetsBasicLogsCriteria(resources, fromAlert, basicLogsEnabled); meetsBasicLogsCriteriaErr != nil {
return nil, meetsBasicLogsCriteriaErr
} else {
basicLogsQuery = meetsBasicLogsCriteria

View File

@ -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 != "" {

View File

@ -41,10 +41,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, errorsource.DownstreamError(fmt.Errorf("basic Logs queries cannot be used for alerts"), false)
}
@ -53,7 +54,11 @@ func meetsBasicLogsCriteria(resources []string, fromAlert bool) (bool, error) {
}
if !strings.Contains(strings.ToLower(resources[0]), "microsoft.operationalinsights/workspaces") {
return false, errorsource.DownstreamError(fmt.Errorf("basic Logs queries may only be run against Log Analytics workspaces"), false)
return false, errorsource.DownstreamError(fmt.Errorf("basic logs queries may only be run against Log Analytics workspaces"), false)
}
if !basicLogsEnabled {
return false, errorsource.DownstreamError(fmt.Errorf("basic Logs queries are disabled for this data source"), false)
}
return true, nil