From f2574f49447c9d7cb952c3d178750e10eb1275f6 Mon Sep 17 00:00:00 2001 From: Andrej Ocenas Date: Thu, 28 Nov 2019 16:55:38 +0100 Subject: [PATCH] Prometheus: Fix caching for default labels request (#20718) --- .../{specs => }/language_provider.test.ts | 30 +++++++++++++++++-- .../prometheus/language_provider.ts | 13 +++++--- 2 files changed, 36 insertions(+), 7 deletions(-) rename public/app/plugins/datasource/prometheus/{specs => }/language_provider.test.ts (93%) diff --git a/public/app/plugins/datasource/prometheus/specs/language_provider.test.ts b/public/app/plugins/datasource/prometheus/language_provider.test.ts similarity index 93% rename from public/app/plugins/datasource/prometheus/specs/language_provider.test.ts rename to public/app/plugins/datasource/prometheus/language_provider.test.ts index 72a7154275b..11ec8d3d7ed 100644 --- a/public/app/plugins/datasource/prometheus/specs/language_provider.test.ts +++ b/public/app/plugins/datasource/prometheus/language_provider.test.ts @@ -1,9 +1,10 @@ import Plain from 'slate-plain-serializer'; import { Editor as SlateEditor } from 'slate'; -import LanguageProvider from '../language_provider'; -import { PrometheusDatasource } from '../datasource'; +import LanguageProvider from './language_provider'; +import { PrometheusDatasource } from './datasource'; import { HistoryItem } from '@grafana/data'; -import { PromQuery } from '../types'; +import { PromQuery } from './types'; +import Mock = jest.Mock; describe('Language completion provider', () => { const datasource: PrometheusDatasource = ({ @@ -411,5 +412,28 @@ describe('Language completion provider', () => { }, ]); }); + + it('does not re-fetch default labels', async () => { + const datasource: PrometheusDatasource = ({ + metadataRequest: jest.fn(() => ({ data: { data: [] as any[] } })), + getTimeRange: jest.fn(() => ({ start: 0, end: 1 })), + } as any) as PrometheusDatasource; + + const instance = new LanguageProvider(datasource); + const value = Plain.deserialize('{}'); + const ed = new SlateEditor({ value }); + const valueWithSelection = ed.moveForward(1).value; + const args = { + text: '', + prefix: '', + wrapperClasses: ['context-labels'], + value: valueWithSelection, + }; + await instance.provideCompletionItems(args); + // one call for 2 default labels job, instance + expect((datasource.metadataRequest as Mock).mock.calls.length).toBe(2); + await instance.provideCompletionItems(args); + expect((datasource.metadataRequest as Mock).mock.calls.length).toBe(2); + }); }); }); diff --git a/public/app/plugins/datasource/prometheus/language_provider.ts b/public/app/plugins/datasource/prometheus/language_provider.ts index 2409307768e..2be3bcfac80 100644 --- a/public/app/plugins/datasource/prometheus/language_provider.ts +++ b/public/app/plugins/datasource/prometheus/language_provider.ts @@ -308,12 +308,17 @@ export default class PromQlLanguageProvider extends LanguageProvider { const existingKeys = parsedSelector ? parsedSelector.labelKeys : []; // Query labels for selector - if (selector && (!this.labelValues[selector] || this.timeRangeChanged())) { + if (selector) { if (selector === EMPTY_SELECTOR) { - // Query label values for default labels - await Promise.all(DEFAULT_KEYS.map(key => this.fetchLabelValues(key))); + // For empty selector we do not need to check range + if (!this.labelValues[selector]) { + // Query label values for default labels + await Promise.all(DEFAULT_KEYS.map(key => this.fetchLabelValues(key))); + } } else { - await this.fetchSeriesLabels(selector, !containsMetric); + if (!this.labelValues[selector] || this.timeRangeChanged()) { + await this.fetchSeriesLabels(selector, !containsMetric); + } } }