浏览代码

Annotations: Fix failing annotation query when time series query is cancelled (#18532)

Dominik Prokop 6 年之前
父节点
当前提交
993e5636d6

+ 4 - 0
public/app/plugins/datasource/prometheus/datasource.ts

@@ -41,6 +41,7 @@ export interface PromDataQueryResponse {
       result?: DataQueryResponseData[];
       result?: DataQueryResponseData[];
     };
     };
   };
   };
+  cancelled?: boolean;
 }
 }
 
 
 export class PrometheusDatasource extends DataSourceApi<PromQuery, PromOptions> {
 export class PrometheusDatasource extends DataSourceApi<PromQuery, PromOptions> {
@@ -528,6 +529,9 @@ export class PrometheusDatasource extends DataSourceApi<PromQuery, PromOptions>
       const eventList: AnnotationEvent[] = [];
       const eventList: AnnotationEvent[] = [];
       tagKeys = tagKeys.split(',');
       tagKeys = tagKeys.split(',');
 
 
+      if (results.cancelled) {
+        return [];
+      }
       _.each(results.data.data.result, series => {
       _.each(results.data.data.result, series => {
         const tags = _.chain(series.metric)
         const tags = _.chain(series.metric)
           .filter((v, k) => {
           .filter((v, k) => {

+ 13 - 0
public/app/plugins/datasource/prometheus/specs/datasource.test.ts

@@ -667,6 +667,19 @@ describe('PrometheusDatasource', () => {
       },
       },
     };
     };
 
 
+    describe('when time series query is cancelled', () => {
+      it('should return empty results', async () => {
+        backendSrv.datasourceRequest = jest.fn(() => Promise.resolve({ cancelled: true }));
+        ctx.ds = new PrometheusDatasource(instanceSettings, q, backendSrv as any, templateSrv as any, timeSrv as any);
+
+        await ctx.ds.annotationQuery(options).then((data: any) => {
+          results = data;
+        });
+
+        expect(results).toEqual([]);
+      });
+    });
+
     describe('not use useValueForTime', () => {
     describe('not use useValueForTime', () => {
       beforeEach(async () => {
       beforeEach(async () => {
         options.annotation.useValueForTime = false;
         options.annotation.useValueForTime = false;