mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Prometheus: added time range filter to series labels query (#16851)
* fix datasource/prometheus: added time range filter to prom series labels * fix datasource/prometheus: added missing method to test mock
This commit is contained in:
parent
246358344c
commit
c284a11a95
@ -42,6 +42,7 @@ export function addHistoryMetadata(item: CompletionItem, history: any[]): Comple
|
||||
|
||||
export default class PromQlLanguageProvider extends LanguageProvider {
|
||||
histogramMetrics?: string[];
|
||||
timeRange?: { start: number; end: number };
|
||||
labelKeys?: { [index: string]: string[] }; // metric -> [labelKey,...]
|
||||
labelValues?: { [index: string]: { [index: string]: string[] } }; // metric -> labelKey -> [labelValue,...]
|
||||
metrics?: string[];
|
||||
@ -52,6 +53,7 @@ export default class PromQlLanguageProvider extends LanguageProvider {
|
||||
|
||||
this.datasource = datasource;
|
||||
this.histogramMetrics = [];
|
||||
this.timeRange = { start: 0, end: 0 };
|
||||
this.labelKeys = {};
|
||||
this.labelValues = {};
|
||||
this.metrics = [];
|
||||
@ -205,6 +207,18 @@ export default class PromQlLanguageProvider extends LanguageProvider {
|
||||
};
|
||||
}
|
||||
|
||||
roundToMinutes(seconds: number): number {
|
||||
return Math.floor(seconds / 60);
|
||||
}
|
||||
|
||||
timeRangeChanged(): boolean {
|
||||
const dsRange = this.datasource.getTimeRange();
|
||||
return (
|
||||
this.roundToMinutes(dsRange.end) !== this.roundToMinutes(this.timeRange.end) ||
|
||||
this.roundToMinutes(dsRange.start) !== this.roundToMinutes(this.timeRange.start)
|
||||
);
|
||||
}
|
||||
|
||||
getAggregationCompletionItems({ value }: TypeaheadInput): TypeaheadOutput {
|
||||
const refresher: Promise<any> = null;
|
||||
const suggestions: CompletionItemGroup[] = [];
|
||||
@ -253,7 +267,7 @@ export default class PromQlLanguageProvider extends LanguageProvider {
|
||||
const selector = parseSelector(selectorString, selectorString.length - 2).selector;
|
||||
|
||||
const labelKeys = this.labelKeys[selector];
|
||||
if (labelKeys) {
|
||||
if (labelKeys && !this.timeRangeChanged()) {
|
||||
suggestions.push({ label: 'Labels', items: labelKeys.map(wrapLabel) });
|
||||
} else {
|
||||
result.refresher = this.fetchSeriesLabels(selector);
|
||||
@ -304,7 +318,7 @@ export default class PromQlLanguageProvider extends LanguageProvider {
|
||||
}
|
||||
|
||||
// Query labels for selector
|
||||
if (selector && !this.labelValues[selector]) {
|
||||
if (selector && (!this.labelValues[selector] || this.timeRangeChanged())) {
|
||||
if (selector === EMPTY_SELECTOR) {
|
||||
// Query label values for default labels
|
||||
refresher = Promise.all(DEFAULT_KEYS.map(key => this.fetchLabelValues(key)));
|
||||
@ -332,10 +346,12 @@ export default class PromQlLanguageProvider extends LanguageProvider {
|
||||
|
||||
fetchSeriesLabels = async (name: string, withName?: boolean) => {
|
||||
try {
|
||||
const data = await this.request(`/api/v1/series?match[]=${name}`);
|
||||
const tRange = this.datasource.getTimeRange();
|
||||
const data = await this.request(`/api/v1/series?match[]=${name}&start=${tRange['start']}&end=${tRange['end']}`);
|
||||
const { keys, values } = processLabels(data, withName);
|
||||
this.labelKeys[name] = keys;
|
||||
this.labelValues[name] = values;
|
||||
this.timeRange = tRange;
|
||||
} catch (e) {
|
||||
console.error(e);
|
||||
}
|
||||
|
@ -6,6 +6,7 @@ import LanguageProvider from '../language_provider';
|
||||
describe('Language completion provider', () => {
|
||||
const datasource = {
|
||||
metadataRequest: () => ({ data: { data: [] as any[] } }),
|
||||
getTimeRange: () => ({ start: 0, end: 1 }),
|
||||
};
|
||||
|
||||
describe('empty query suggestions', () => {
|
||||
|
Loading…
Reference in New Issue
Block a user