CloudWatch Logs: Wrap sync error from executeGetQueryResults (#73252)

This commit is contained in:
Isabella Siu 2023-08-15 17:31:55 -04:00 committed by GitHub
parent c9ed2c80b2
commit 870ef7b058
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 62 additions and 2 deletions

View File

@ -299,7 +299,14 @@ func (e *cloudWatchExecutor) executeGetQueryResults(ctx context.Context, logsCli
QueryId: aws.String(logsQuery.QueryId),
}
return logsClient.GetQueryResultsWithContext(ctx, queryInput)
getQueryResultsResponse, err := logsClient.GetQueryResultsWithContext(ctx, queryInput)
if err != nil {
var awsErr awserr.Error
if errors.As(err, &awsErr) {
return getQueryResultsResponse, &AWSError{Code: awsErr.Code(), Message: err.Error()}
}
}
return getQueryResultsResponse, err
}
func (e *cloudWatchExecutor) handleGetQueryResults(ctx context.Context, logsClient cloudwatchlogsiface.CloudWatchLogsAPI,

View File

@ -108,7 +108,7 @@ func (e *cloudWatchExecutor) syncQuery(ctx context.Context, logsClient cloudwatc
for range ticker.C {
res, err := e.executeGetQueryResults(ctx, logsClient, requestParams)
if err != nil {
return nil, err
return nil, fmt.Errorf("CloudWatch Error: %w", err)
}
if isTerminated(*res.Status) {
return res, err

View File

@ -336,4 +336,36 @@ func Test_executeSyncLogQuery_handles_RefId_from_input_queries(t *testing.T) {
assert.Error(t, err)
cli.AssertNumberOfCalls(t, "GetQueryResultsWithContext", 1)
})
t.Run("when getQueryResults returns aws error is returned, it keeps the context", func(t *testing.T) {
cli = &mockLogsSyncClient{}
cli.On("StartQueryWithContext", mock.Anything, mock.Anything, mock.Anything).Return(&cloudwatchlogs.StartQueryOutput{
QueryId: aws.String("abcd-efgh-ijkl-mnop"),
}, nil)
cli.On("GetQueryResultsWithContext", mock.Anything, mock.Anything, mock.Anything).Return(
&cloudwatchlogs.GetQueryResultsOutput{Status: aws.String("Complete")},
&fakeAWSError{code: "foo", message: "bar"},
)
im := datasource.NewInstanceManager(func(s backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) {
return DataSource{Settings: models.CloudWatchSettings{}}, nil
})
executor := newExecutor(im, newTestConfig(), &fakeSessionCache{}, featuremgmt.WithFeatures())
res, err := executor.QueryData(context.Background(), &backend.QueryDataRequest{
Headers: map[string]string{ngalertmodels.FromAlertHeaderName: "some value"},
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"
}`),
},
},
})
require.Nil(t, res)
require.Error(t, err)
require.Equal(t, "CloudWatch Error: foo: bar", err.Error())
})
}

View File

@ -254,3 +254,24 @@ func (s *mockedCallResourceResponseSenderForOauth) Send(resp *backend.CallResour
s.Response = resp
return nil
}
type fakeAWSError struct {
code string
message string
}
func (e fakeAWSError) OrigErr() error {
return nil
}
func (e fakeAWSError) Error() string {
return e.message
}
func (e fakeAWSError) Code() string {
return e.code
}
func (e fakeAWSError) Message() string {
return e.message
}