[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:
co-authored by
Alyssa Joyner
parent
a7391bcf88
commit
5abb9a8632
@@ -166,6 +166,7 @@ func buildLogAnalyticsQuery(query backend.DataQuery, dsInfo types.DatasourceInfo
|
|||||||
timeColumn := ""
|
timeColumn := ""
|
||||||
azureLogAnalyticsTarget := queryJSONModel.AzureLogAnalytics
|
azureLogAnalyticsTarget := queryJSONModel.AzureLogAnalytics
|
||||||
basicLogsQuery := false
|
basicLogsQuery := false
|
||||||
|
basicLogsEnabled := false
|
||||||
|
|
||||||
resultFormat := ParseResultFormat(azureLogAnalyticsTarget.ResultFormat, dataquery.AzureQueryTypeAzureLogAnalytics)
|
resultFormat := ParseResultFormat(azureLogAnalyticsTarget.ResultFormat, dataquery.AzureQueryTypeAzureLogAnalytics)
|
||||||
|
|
||||||
@@ -177,8 +178,12 @@ func buildLogAnalyticsQuery(query backend.DataQuery, dsInfo types.DatasourceInfo
|
|||||||
resources, resourceOrWorkspace := retrieveResources(azureLogAnalyticsTarget)
|
resources, resourceOrWorkspace := retrieveResources(azureLogAnalyticsTarget)
|
||||||
appInsightsQuery = appInsightsRegExp.Match([]byte(resourceOrWorkspace))
|
appInsightsQuery = appInsightsRegExp.Match([]byte(resourceOrWorkspace))
|
||||||
|
|
||||||
|
if value, ok := dsInfo.JSONData["basicLogsEnabled"].(bool); ok {
|
||||||
|
basicLogsEnabled = value
|
||||||
|
}
|
||||||
|
|
||||||
if basicLogsQueryFlag {
|
if basicLogsQueryFlag {
|
||||||
if meetsBasicLogsCriteria, meetsBasicLogsCriteriaErr := meetsBasicLogsCriteria(resources, fromAlert); meetsBasicLogsCriteriaErr != nil {
|
if meetsBasicLogsCriteria, meetsBasicLogsCriteriaErr := meetsBasicLogsCriteria(resources, fromAlert, basicLogsEnabled); meetsBasicLogsCriteriaErr != nil {
|
||||||
return nil, meetsBasicLogsCriteriaErr
|
return nil, meetsBasicLogsCriteriaErr
|
||||||
} else {
|
} else {
|
||||||
basicLogsQuery = meetsBasicLogsCriteria
|
basicLogsQuery = meetsBasicLogsCriteria
|
||||||
|
|||||||
@@ -83,15 +83,6 @@ func TestBuildLogAnalyticsQuery(t *testing.T) {
|
|||||||
t.Errorf("failed to create fake client")
|
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")
|
appInsightsRegExp, err := regexp.Compile("(?i)providers/microsoft.insights/components")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Error("failed to compile reg: %w", err)
|
t.Error("failed to compile reg: %w", err)
|
||||||
@@ -100,6 +91,7 @@ func TestBuildLogAnalyticsQuery(t *testing.T) {
|
|||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
fromAlert bool
|
fromAlert bool
|
||||||
|
basicLogsEnabled bool
|
||||||
queryModel backend.DataQuery
|
queryModel backend.DataQuery
|
||||||
azureLogAnalyticsQuery *AzureLogAnalyticsQuery
|
azureLogAnalyticsQuery *AzureLogAnalyticsQuery
|
||||||
Err require.ErrorAssertionFunc
|
Err require.ErrorAssertionFunc
|
||||||
@@ -332,8 +324,9 @@ func TestBuildLogAnalyticsQuery(t *testing.T) {
|
|||||||
Err: require.NoError,
|
Err: require.NoError,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Basic Logs query",
|
name: "Basic Logs query",
|
||||||
fromAlert: false,
|
fromAlert: false,
|
||||||
|
basicLogsEnabled: true,
|
||||||
queryModel: backend.DataQuery{
|
queryModel: backend.DataQuery{
|
||||||
JSON: []byte(fmt.Sprintf(`{
|
JSON: []byte(fmt.Sprintf(`{
|
||||||
"queryType": "Azure Log Analytics",
|
"queryType": "Azure Log Analytics",
|
||||||
@@ -377,8 +370,9 @@ func TestBuildLogAnalyticsQuery(t *testing.T) {
|
|||||||
Err: require.NoError,
|
Err: require.NoError,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Basic Logs query with multiple resources",
|
name: "Basic Logs query with multiple resources",
|
||||||
fromAlert: false,
|
fromAlert: false,
|
||||||
|
basicLogsEnabled: true,
|
||||||
queryModel: backend.DataQuery{
|
queryModel: backend.DataQuery{
|
||||||
JSON: []byte(fmt.Sprintf(`{
|
JSON: []byte(fmt.Sprintf(`{
|
||||||
"queryType": "Azure Log Analytics",
|
"queryType": "Azure Log Analytics",
|
||||||
@@ -399,8 +393,9 @@ func TestBuildLogAnalyticsQuery(t *testing.T) {
|
|||||||
Err: require.Error,
|
Err: require.Error,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Basic Logs query with non LA workspace resources",
|
name: "Basic Logs query with non LA workspace resources",
|
||||||
fromAlert: false,
|
fromAlert: false,
|
||||||
|
basicLogsEnabled: true,
|
||||||
queryModel: backend.DataQuery{
|
queryModel: backend.DataQuery{
|
||||||
JSON: []byte(fmt.Sprintf(`{
|
JSON: []byte(fmt.Sprintf(`{
|
||||||
"queryType": "Azure Log Analytics",
|
"queryType": "Azure Log Analytics",
|
||||||
@@ -421,8 +416,9 @@ func TestBuildLogAnalyticsQuery(t *testing.T) {
|
|||||||
Err: require.Error,
|
Err: require.Error,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Basic Logs query from alerts",
|
name: "Basic Logs query from alerts",
|
||||||
fromAlert: true,
|
fromAlert: true,
|
||||||
|
basicLogsEnabled: true,
|
||||||
queryModel: backend.DataQuery{
|
queryModel: backend.DataQuery{
|
||||||
JSON: []byte(fmt.Sprintf(`{
|
JSON: []byte(fmt.Sprintf(`{
|
||||||
"queryType": "Azure Log Analytics",
|
"queryType": "Azure Log Analytics",
|
||||||
@@ -442,6 +438,30 @@ func TestBuildLogAnalyticsQuery(t *testing.T) {
|
|||||||
azureLogAnalyticsQuery: nil,
|
azureLogAnalyticsQuery: nil,
|
||||||
Err: require.Error,
|
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",
|
name: "Detects App Insights resource queries",
|
||||||
fromAlert: false,
|
fromAlert: false,
|
||||||
@@ -524,6 +544,15 @@ func TestBuildLogAnalyticsQuery(t *testing.T) {
|
|||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
t.Run(tt.name, func(t *testing.T) {
|
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)
|
query, err := buildLogAnalyticsQuery(tt.queryModel, dsInfo, appInsightsRegExp, tt.fromAlert)
|
||||||
tt.Err(t, err)
|
tt.Err(t, err)
|
||||||
if diff := cmp.Diff(tt.azureLogAnalyticsQuery, query); diff != "" {
|
if diff := cmp.Diff(tt.azureLogAnalyticsQuery, query); diff != "" {
|
||||||
|
|||||||
@@ -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
|
// Check whether a query should be handled as basic logs query
|
||||||
// 2. resource selected is a workspace
|
// 1. resource selected is a workspace
|
||||||
// 3. query is not an alerts query
|
// 2. query is not an alerts query
|
||||||
// 4. number of selected resources is exactly one
|
// 3. number of selected resources is exactly one
|
||||||
func meetsBasicLogsCriteria(resources []string, fromAlert bool) (bool, error) {
|
// 4. the ds toggle is set to true
|
||||||
|
func meetsBasicLogsCriteria(resources []string, fromAlert bool, basicLogsEnabled bool) (bool, error) {
|
||||||
if fromAlert {
|
if fromAlert {
|
||||||
return false, fmt.Errorf("basic Logs queries cannot be used for alerts")
|
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") {
|
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
|
return true, nil
|
||||||
|
|||||||
Reference in New Issue
Block a user