CloudWatch: Call query method from DataSourceWithBackend to support public dashboards (#77532)
* CloudWatch: call query method from DataSourceWithBackend to support public dashboards * add test * remove unneeded properties from test case * update betterer * add parens to group related logic * remove unnecessary aliasing of variable * use t.Cleanup * remove redundant check * add comment
This commit is contained in:
@@ -170,7 +170,11 @@ func (e *cloudWatchExecutor) QueryData(ctx context.Context, req *backend.QueryDa
|
||||
|
||||
_, fromAlert := req.Headers[ngalertmodels.FromAlertHeaderName]
|
||||
fromExpression := req.GetHTTPHeader(query.HeaderFromExpression) != ""
|
||||
isSyncLogQuery := (fromAlert || fromExpression) && model.QueryMode == logsQueryMode
|
||||
// Public dashboard queries execute like alert queries, i.e. they execute on the backend, therefore, we need to handle them synchronously.
|
||||
// Since `model.Type` is set during execution on the frontend by the query runner and isn't saved with the query, we are checking here is
|
||||
// missing the `model.Type` property and if it is a log query in order to determine if it is a public dashboard query.
|
||||
fromPublicDashboard := (model.Type == "" && model.QueryMode == logsQueryMode)
|
||||
isSyncLogQuery := ((fromAlert || fromExpression) && model.QueryMode == logsQueryMode) || fromPublicDashboard
|
||||
if isSyncLogQuery {
|
||||
return executeSyncLogQuery(ctx, e, req)
|
||||
}
|
||||
|
||||
@@ -152,6 +152,42 @@ func Test_executeSyncLogQuery(t *testing.T) {
|
||||
|
||||
executeSyncLogQuery = origExecuteSyncLogQuery
|
||||
})
|
||||
|
||||
t.Run("when query mode is 'Logs' and does not include type or subtype", func(t *testing.T) {
|
||||
origExecuteSyncLogQuery := executeSyncLogQuery
|
||||
syncCalled := false
|
||||
executeSyncLogQuery = func(ctx context.Context, e *cloudWatchExecutor, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) {
|
||||
syncCalled = true
|
||||
return nil, nil
|
||||
}
|
||||
t.Cleanup(func() {
|
||||
executeSyncLogQuery = origExecuteSyncLogQuery
|
||||
})
|
||||
|
||||
cli = fakeCWLogsClient{queryResults: cloudwatchlogs.GetQueryResultsOutput{Status: aws.String("Complete")}}
|
||||
im := datasource.NewInstanceManager(func(ctx context.Context, s backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) {
|
||||
return DataSource{Settings: models.CloudWatchSettings{AWSDatasourceSettings: awsds.AWSDatasourceSettings{Region: "instance manager's region"}}}, nil
|
||||
})
|
||||
sess := fakeSessionCache{}
|
||||
|
||||
executor := newExecutor(im, newTestConfig(), &sess, featuremgmt.WithFeatures())
|
||||
_, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{
|
||||
PluginContext: backend.PluginContext{DataSourceInstanceSettings: &backend.DataSourceInstanceSettings{}},
|
||||
Queries: []backend.DataQuery{
|
||||
{
|
||||
TimeRange: backend.TimeRange{From: time.Unix(0, 0), To: time.Unix(1, 0)},
|
||||
JSON: json.RawMessage(`{
|
||||
"queryMode": "Logs",
|
||||
"region": "default",
|
||||
"queryString": "fields @message"
|
||||
}`),
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, true, syncCalled)
|
||||
})
|
||||
}
|
||||
func Test_executeSyncLogQuery_handles_RefId_from_input_queries(t *testing.T) {
|
||||
origNewCWClient := NewCWClient
|
||||
|
||||
Reference in New Issue
Block a user