diff --git a/public/app/plugins/datasource/loki/LanguageProvider.test.ts b/public/app/plugins/datasource/loki/LanguageProvider.test.ts index d5c70b1ad22..2bf25ca53ef 100644 --- a/public/app/plugins/datasource/loki/LanguageProvider.test.ts +++ b/public/app/plugins/datasource/loki/LanguageProvider.test.ts @@ -33,19 +33,50 @@ const mockTimeRange = { to: dateTime(1546380000000), }, }; + +const defaultTimeRange = { + from: dateTime(0), + to: dateTime(1), + raw: { + from: dateTime(0), + to: dateTime(1), + }, +}; jest.mock('@grafana/data', () => ({ ...jest.requireActual('@grafana/data'), - getDefaultTimeRange: jest.fn().mockReturnValue({ - from: 0, - to: 1, - raw: { - from: 0, - to: 1, - }, - }), + getDefaultTimeRange: jest.fn().mockImplementation(() => defaultTimeRange), })); describe('Language completion provider', () => { + describe('start', () => { + const datasource = setup({ testkey: ['label1_val1', 'label1_val2'], label2: [] }); + + it('should fetch labels on initial start', async () => { + const languageProvider = new LanguageProvider(datasource); + const fetchSpy = jest.spyOn(languageProvider, 'fetchLabels').mockResolvedValue([]); + await languageProvider.start(); + expect(fetchSpy).toHaveBeenCalled(); + }); + + it('should not again fetch labels on second start', async () => { + const languageProvider = new LanguageProvider(datasource); + const fetchSpy = jest.spyOn(languageProvider, 'fetchLabels').mockResolvedValue([]); + await languageProvider.start(); + expect(fetchSpy).toHaveBeenCalledTimes(1); + await languageProvider.start(); + expect(fetchSpy).toHaveBeenCalledTimes(1); + }); + + it('should again fetch labels on second start with different timerange', async () => { + const languageProvider = new LanguageProvider(datasource); + const fetchSpy = jest.spyOn(languageProvider, 'fetchLabels').mockResolvedValue([]); + await languageProvider.start(); + expect(fetchSpy).toHaveBeenCalledTimes(1); + await languageProvider.start(mockTimeRange); + expect(fetchSpy).toHaveBeenCalledTimes(2); + }); + }); + describe('fetchSeries', () => { it('should use match[] parameter', () => { const datasource = setup({}, { '{foo="bar"}': [{ label1: 'label_val1' }] }); @@ -416,11 +447,7 @@ describe('Query imports', () => { maxLines: DEFAULT_MAX_LINES_SAMPLE, refId: 'data-samples', }, - // mocked default time range - expect.objectContaining({ - from: 0, - to: 1, - }) + defaultTimeRange ); }); @@ -441,11 +468,7 @@ describe('Query imports', () => { maxLines: 5, refId: 'data-samples', }, - // mocked default time range - expect.objectContaining({ - from: 0, - to: 1, - }) + defaultTimeRange ); }); diff --git a/public/app/plugins/datasource/loki/LanguageProvider.ts b/public/app/plugins/datasource/loki/LanguageProvider.ts index 29f3fb8a7ee..bc91f62ae52 100644 --- a/public/app/plugins/datasource/loki/LanguageProvider.ts +++ b/public/app/plugins/datasource/loki/LanguageProvider.ts @@ -19,6 +19,7 @@ const NS_IN_MS = 1000000; export default class LokiLanguageProvider extends LanguageProvider { labelKeys: string[]; started = false; + startedTimeRange?: TimeRange; datasource: LokiDatasource; /** @@ -53,7 +54,13 @@ export default class LokiLanguageProvider extends LanguageProvider { */ start = (timeRange?: TimeRange) => { const range = timeRange ?? this.getDefaultTimeRange(); - if (!this.startTask) { + // refetch labels if either there's not already a start task or the time range has changed + if ( + !this.startTask || + this.startedTimeRange?.from.isSame(range.from) === false || + this.startedTimeRange?.to.isSame(range.to) === false + ) { + this.startedTimeRange = range; this.startTask = this.fetchLabels({ timeRange: range }).then(() => { this.started = true; return [];