Loki: Fix language provider's start method won't fetch labels with changed timerange (#79631)

Loki: Fix issue with timeranges in language provider
This commit is contained in:
Sven Grossmann 2023-12-19 14:45:33 +01:00 committed by GitHub
parent f7429b79ba
commit 96b5b10e20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 49 additions and 19 deletions

View File

@ -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
);
});

View File

@ -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 [];