mirror of https://github.com/grafana/grafana
Loki: Update labels in log browser when time range changes (#37520)
* Refresh label when time range changes * Refactor solution * Add tests * Update tests comments * Update test * Update public/app/plugins/datasource/loki/components/LokiQueryField.tsx * Update public/app/plugins/datasource/loki/components/LokiQueryField.tsxpull/37541/head
parent
224b062cac
commit
7fd94e69c3
@ -0,0 +1,79 @@ |
||||
import React, { ComponentProps } from 'react'; |
||||
import { render } from '@testing-library/react'; |
||||
import { LokiQueryField } from './LokiQueryField'; |
||||
import { dateTime } from '@grafana/data'; |
||||
|
||||
type Props = ComponentProps<typeof LokiQueryField>; |
||||
|
||||
const defaultProps: Props = { |
||||
datasource: { |
||||
languageProvider: { |
||||
start: () => Promise.resolve(['label1']), |
||||
fetchLabels: Promise.resolve(['label1']), |
||||
getSyntax: () => {}, |
||||
getLabelKeys: () => ['label1'], |
||||
getLabelValues: () => ['value1'], |
||||
} as any, |
||||
getInitHints: () => [], |
||||
} as any, |
||||
range: { |
||||
from: dateTime([2021, 1, 11, 12, 0, 0]), |
||||
to: dateTime([2021, 1, 11, 18, 0, 0]), |
||||
raw: { |
||||
from: 'now-1h', |
||||
to: 'now', |
||||
}, |
||||
}, |
||||
query: { expr: '', refId: '' }, |
||||
onRunQuery: () => {}, |
||||
onChange: () => {}, |
||||
history: [], |
||||
}; |
||||
|
||||
describe('LokiQueryField', () => { |
||||
it('refreshes metrics when time range changes over 1 minute', async () => { |
||||
const fetchLabelsMock = jest.fn(); |
||||
const props = defaultProps; |
||||
props.datasource.languageProvider.fetchLabels = fetchLabelsMock; |
||||
|
||||
const { rerender } = render(<LokiQueryField {...props} />); |
||||
|
||||
expect(fetchLabelsMock).not.toHaveBeenCalled(); |
||||
|
||||
// 2 minutes difference over the initial time
|
||||
const newRange = { |
||||
from: dateTime([2021, 1, 11, 12, 2, 0]), |
||||
to: dateTime([2021, 1, 11, 18, 2, 0]), |
||||
raw: { |
||||
from: 'now-1h', |
||||
to: 'now', |
||||
}, |
||||
}; |
||||
|
||||
rerender(<LokiQueryField {...props} range={newRange} />); |
||||
expect(fetchLabelsMock).toHaveBeenCalledTimes(1); |
||||
}); |
||||
|
||||
it('does not refreshes metrics when time range change by less than 1 minute', async () => { |
||||
const fetchLabelsMock = jest.fn(); |
||||
const props = defaultProps; |
||||
props.datasource.languageProvider.fetchLabels = fetchLabelsMock; |
||||
|
||||
const { rerender } = render(<LokiQueryField {...props} />); |
||||
|
||||
expect(fetchLabelsMock).not.toHaveBeenCalled(); |
||||
|
||||
// 20 seconds difference over the initial time
|
||||
const newRange = { |
||||
from: dateTime([2021, 1, 11, 12, 0, 20]), |
||||
to: dateTime([2021, 1, 11, 18, 0, 20]), |
||||
raw: { |
||||
from: 'now-1h', |
||||
to: 'now', |
||||
}, |
||||
}; |
||||
|
||||
rerender(<LokiQueryField {...props} range={newRange} />); |
||||
expect(fetchLabelsMock).not.toHaveBeenCalled(); |
||||
}); |
||||
}); |
@ -0,0 +1,19 @@ |
||||
import { TimeRange } from '@grafana/data'; |
||||
|
||||
function roundMsToMin(milliseconds: number): number { |
||||
return roundSecToMin(milliseconds / 1000); |
||||
} |
||||
|
||||
function roundSecToMin(seconds: number): number { |
||||
return Math.floor(seconds / 60); |
||||
} |
||||
|
||||
export function shouldRefreshLabels(range?: TimeRange, prevRange?: TimeRange): boolean { |
||||
if (range && prevRange) { |
||||
const sameMinuteFrom = roundMsToMin(range.from.valueOf()) === roundMsToMin(prevRange.from.valueOf()); |
||||
const sameMinuteTo = roundMsToMin(range.to.valueOf()) === roundMsToMin(prevRange.to.valueOf()); |
||||
// If both are same, don't need to refresh
|
||||
return !(sameMinuteFrom && sameMinuteTo); |
||||
} |
||||
return false; |
||||
} |
Loading…
Reference in new issue