diff --git a/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go b/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go index 1e75ea5dca5d..d2b0b28ca9ab 100644 --- a/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go +++ b/pkg/tsdb/azuremonitor/loganalytics/azure-log-analytics-datasource.go @@ -187,10 +187,11 @@ func (e *AzureLogAnalyticsDatasource) executeQuery(ctx context.Context, query *A return dataResponseErrorWithExecuted(err) } - frame, err := ResponseTableToFrame(t, logResponse) + frame, err := ResponseTableToFrame(t, query.RefID, query.Params.Get("query")) if err != nil { return dataResponseErrorWithExecuted(err) } + appendErrorNotice(frame, logResponse.Error) model, err := simplejson.NewJson(query.JSON) if err != nil { @@ -222,6 +223,12 @@ func (e *AzureLogAnalyticsDatasource) executeQuery(ctx context.Context, query *A return dataResponse } +func appendErrorNotice(frame *data.Frame, err *AzureLogAnalyticsAPIError) { + if err != nil { + frame.AppendNotices(apiErrorToNotice(err)) + } +} + func (e *AzureLogAnalyticsDatasource) createRequest(ctx context.Context, dsInfo types.DatasourceInfo, url string) (*http.Request, error) { req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) if err != nil { diff --git a/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame.go b/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame.go index afb122cd5394..f274d9e2cf45 100644 --- a/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame.go +++ b/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame.go @@ -43,7 +43,16 @@ func apiErrorToNotice(err *AzureLogAnalyticsAPIError) data.Notice { } // ResponseTableToFrame converts an AzureResponseTable to a data.Frame. -func ResponseTableToFrame(table *types.AzureResponseTable, res AzureLogAnalyticsResponse) (*data.Frame, error) { +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 + } + converterFrame, err := converterFrameForTable(table) if err != nil { return nil, err @@ -57,10 +66,6 @@ func ResponseTableToFrame(table *types.AzureResponseTable, res AzureLogAnalytics } } - if res.Error != nil { - converterFrame.Frame.AppendNotices(apiErrorToNotice(res.Error)) - } - return converterFrame.Frame, nil } 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 9cf19dc81b46..ba3ae060e79a 100644 --- a/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame_test.go +++ b/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame_test.go @@ -169,12 +169,25 @@ func TestLogTableToFrame(t *testing.T) { return frame }, }, + { + 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", + }, + } + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { res := loadLogAnalyticsTestFileWithNumber(t, tt.testFile) - frame, err := ResponseTableToFrame(&res.Tables[0], res) + frame, err := ResponseTableToFrame(&res.Tables[0], "A", "query") + appendErrorNotice(frame, res.Error) require.NoError(t, err) if diff := cmp.Diff(tt.expectedFrame(), frame, data.FrameTestCompareOptions()...); diff != "" { diff --git a/pkg/tsdb/azuremonitor/resourcegraph/azure-resource-graph-datasource.go b/pkg/tsdb/azuremonitor/resourcegraph/azure-resource-graph-datasource.go index f2de8407575b..48554815d808 100644 --- a/pkg/tsdb/azuremonitor/resourcegraph/azure-resource-graph-datasource.go +++ b/pkg/tsdb/azuremonitor/resourcegraph/azure-resource-graph-datasource.go @@ -188,7 +188,7 @@ func (e *AzureResourceGraphDatasource) executeQuery(ctx context.Context, query * return dataResponseErrorWithExecuted(err) } - frame, err := loganalytics.ResponseTableToFrame(&argResponse.Data, loganalytics.AzureLogAnalyticsResponse{}) + frame, err := loganalytics.ResponseTableToFrame(&argResponse.Data, query.RefID, query.InterpolatedQuery) if err != nil { return dataResponseErrorWithExecuted(err) } diff --git a/pkg/tsdb/azuremonitor/testdata/loganalytics/11-log-analytics-response-empty.json b/pkg/tsdb/azuremonitor/testdata/loganalytics/11-log-analytics-response-empty.json new file mode 100644 index 000000000000..e8a1dd53ba90 --- /dev/null +++ b/pkg/tsdb/azuremonitor/testdata/loganalytics/11-log-analytics-response-empty.json @@ -0,0 +1,19 @@ +{ + "tables": [ + { + "name": "PrimaryResult", + "columns": [ + { + "name": "OperationName", + "type": "string" + }, + { + "name": "Level", + "type": "string" + } + ], + "rows": [] + } + ] +} + \ No newline at end of file