From 4e2446d3e3fd6fde21c036a96d6f54fa4ee0ed32 Mon Sep 17 00:00:00 2001 From: "Grot (@grafanabot)" <43478413+grafanabot@users.noreply.github.com> Date: Thu, 24 Nov 2022 13:02:51 +0200 Subject: [PATCH] [v9.3.x] Azure Monitor: Fix empty/errored responses for Logs variables (#59278) Azure Monitor: Fix empty/errored responses for Logs variables (#59240) (cherry picked from commit 276b54fe9d41d7c435eb255f75cc1a54bf415db3) Co-authored-by: Andres Martinez Gotor --- .../azure-log-analytics-datasource.go | 16 +++++++--- .../azure-response-table-frame.go | 7 +--- .../azure-response-table-frame_test.go | 7 +--- .../variables.test.ts | 32 +++++++++++++++++++ .../variables.ts | 1 + 5 files changed, 47 insertions(+), 16 deletions(-) diff --git a/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go b/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go index b05254bf52f..83ba706cbbf 100644 --- a/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go +++ b/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go @@ -190,7 +190,10 @@ func (e *AzureLogAnalyticsDatasource) executeQuery(ctx context.Context, logger l if err != nil { return dataResponseErrorWithExecuted(err) } - appendErrorNotice(frame, logResponse.Error) + frame = appendErrorNotice(frame, logResponse.Error) + if frame == nil { + return dataResponse + } model, err := simplejson.NewJson(query.JSON) if err != nil { @@ -222,10 +225,15 @@ func (e *AzureLogAnalyticsDatasource) executeQuery(ctx context.Context, logger l return dataResponse } -func appendErrorNotice(frame *data.Frame, err *AzureLogAnalyticsAPIError) { - if err != nil { - frame.AppendNotices(apiErrorToNotice(err)) +func appendErrorNotice(frame *data.Frame, err *AzureLogAnalyticsAPIError) *data.Frame { + if err == nil { + return frame } + if frame == nil { + frame = &data.Frame{} + } + frame.AppendNotices(apiErrorToNotice(err)) + return frame } func (e *AzureLogAnalyticsDatasource) createRequest(ctx context.Context, logger log.Logger, url string) (*http.Request, error) { diff --git a/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame.go b/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame.go index f274d9e2cf4..ad28b2a0e08 100644 --- a/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame.go +++ b/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame.go @@ -45,12 +45,7 @@ func apiErrorToNotice(err *AzureLogAnalyticsAPIError) data.Notice { // ResponseTableToFrame converts an AzureResponseTable to a data.Frame. func ResponseTableToFrame(table *types.AzureResponseTable, refID string, executedQuery string) (*data.Frame, error) { if len(table.Rows) == 0 { - return &data.Frame{ - RefID: refID, - Meta: &data.FrameMeta{ - ExecutedQueryString: executedQuery, - }, - }, nil + return nil, nil } converterFrame, err := converterFrameForTable(table) diff --git a/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame_test.go b/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame_test.go index ba3ae060e79..afda6263816 100644 --- a/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame_test.go +++ b/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame_test.go @@ -173,12 +173,7 @@ func TestLogTableToFrame(t *testing.T) { name: "empty data response", testFile: "loganalytics/11-log-analytics-response-empty.json", expectedFrame: func() *data.Frame { - return &data.Frame{ - RefID: "A", - Meta: &data.FrameMeta{ - ExecutedQueryString: "query", - }, - } + return nil }, }, } diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/variables.test.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/variables.test.ts index cf42c890f0f..957fbfa654f 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/variables.test.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/variables.test.ts @@ -489,6 +489,38 @@ describe('VariableSupport', () => { }); }); + it('passes on the query error for a log query', (done) => { + const variableSupport = new VariableSupport( + createMockDatasource({ + query: () => + from( + Promise.resolve({ + data: [], + error: { + message: 'boom', + }, + }) + ), + }) + ); + const mockRequest = { + targets: [ + { + queryType: AzureQueryType.LogAnalytics, + azureLogAnalytics: { + query: 'some log thing', + }, + } as AzureMonitorQuery, + ], + } as DataQueryRequest; + const observables = variableSupport.query(mockRequest); + observables.subscribe((result: DataQueryResponseData) => { + expect(result.data).toEqual([]); + expect(result.error.message).toEqual('boom'); + done(); + }); + }); + it('should handle http error', (done) => { const error = invalidSubscriptionError(); const variableSupport = new VariableSupport( diff --git a/public/app/plugins/datasource/grafana-azure-monitor-datasource/variables.ts b/public/app/plugins/datasource/grafana-azure-monitor-datasource/variables.ts index 2a57156d2d2..3d8be733ca3 100644 --- a/public/app/plugins/datasource/grafana-azure-monitor-datasource/variables.ts +++ b/public/app/plugins/datasource/grafana-azure-monitor-datasource/variables.ts @@ -94,6 +94,7 @@ export class VariableSupport extends CustomVariableSupport