mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* loki: switch to a monaco-based query field, step 1 (#46291) * loki: use monaco-logql (#46318) * loki: use monaco-logql * updated monaco-logql * fix all the tests (#46327) * loki: recommend parser (#46362) * loki: recommend parser * additional improvements * more improvements * type and lint fixes * more improvements * trigger autocomplete on focus * rename * loki: more smart features (#46414) * loki: more smart features * loki: updated syntax-highlight version * better explanation (#46443) * better explanation * improved help-text Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> * Fix label * feat(loki-monaco-editor): add monaco-logql as a dependency * feat(loki-monaco-editor): add back range function removed during merge * feat(loki-monaco-editor): sync imports with recent changes * feat(loki-monaco-editor): add missing lang provider functions * feat(loki-monaco-editor): fix imports * feat(loki-monaco-editor): display monaco editor by default Temporarily * Chore: remove commented code * Chore: minor refactor to NeverCaseError * Chore: minor code cleanups * feat(loki-monaco-editor): add history implementation Will see how it behaves and base the history slicing on tangible feedback * feat(loki-monaco-editor): turn completion data provider into a class * Chore: fix missing imports * feat(loki-monaco-editor): refactor data provider methods Move complexity scattered everywhere to the provider * Chore: clean up redundant code * Chore: minor comments cleanup * Chore: simplify override services * Chore: rename callback * feat(loki-monaco-editor): use query hints implementation to parse expression * feat(loki-monaco-editor): improve function name * Chore: remove superfluous variable in favor of destructuring * Chore: remove unused imports * Chore: make method async * feat(loki-monaco-editor): fix deprecations and errors in situation * feat(loki-monaco-editor): comment failing test case * Chore: remove comment from test * Chore: remove duplicated completion item * Chore: fix linting issues * Chore: update language provider test * Chore: update datasource test * feat(loki-monaco-editor): create feature flag * feat(loki-monaco-editor): place the editor under a feature flag * Chore: add completion unit test * Chore: add completion data provider test * Chore: remove unwanted export * Chore: remove unused export * Chore(loki-query-field): destructure all props * chore(loki-completions): remove odd string * fix(loki-completions): remove rate_interval Not supported * fix(loki-completions): remove line filters for after pipe case We shouldn't offer line filters if we are after first pipe. * refactor(loki-datasource): update default parameter * fix(loki-syntax): remove outdated documentation * Update capitalization in pkg/services/featuremgmt/registry.go Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> * refactor(situation): use node types instead of names * Chore: comment line filters pending implementation It's breaking the build due to a linting error. * Chore: update feature flag test after capitalization change * Revert "fix(loki-completions): remove line filters for after pipe case" This reverts commit3d003ca4bc
. * Revert "Chore: comment line filters pending implementation" This reverts commit84bfe76a6a
. Co-authored-by: Gábor Farkas <gabor.farkas@gmail.com> Co-authored-by: Ivana Huckova <30407135+ivanahuckova@users.noreply.github.com> Co-authored-by: Ivana Huckova <ivana.huckova@gmail.com>
53 lines
1.9 KiB
TypeScript
53 lines
1.9 KiB
TypeScript
import { HistoryItem } from '@grafana/data';
|
|
import { escapeLabelValueInExactSelector } from 'app/plugins/datasource/prometheus/language_utils';
|
|
|
|
import LanguageProvider from '../../../LanguageProvider';
|
|
import { LokiQuery } from '../../../types';
|
|
|
|
import { Label } from './situation';
|
|
|
|
export class CompletionDataProvider {
|
|
constructor(private languageProvider: LanguageProvider, private history: Array<HistoryItem<LokiQuery>> = []) {}
|
|
|
|
private buildSelector(labels: Label[]): string {
|
|
const allLabelTexts = labels.map(
|
|
(label) => `${label.name}${label.op}"${escapeLabelValueInExactSelector(label.value)}"`
|
|
);
|
|
|
|
return `{${allLabelTexts.join(',')}}`;
|
|
}
|
|
|
|
getHistory() {
|
|
return this.history.map((entry) => entry.query.expr).filter((expr) => expr !== undefined);
|
|
}
|
|
|
|
async getLabelNames(otherLabels: Label[] = []) {
|
|
if (otherLabels.length === 0) {
|
|
// if there is no filtering, we have to use a special endpoint
|
|
return this.languageProvider.getLabelKeys();
|
|
}
|
|
const data = await this.getSeriesLabels(otherLabels);
|
|
const possibleLabelNames = Object.keys(data); // all names from datasource
|
|
const usedLabelNames = new Set(otherLabels.map((l) => l.name)); // names used in the query
|
|
return possibleLabelNames.filter((label) => !usedLabelNames.has(label));
|
|
}
|
|
|
|
async getLabelValues(labelName: string, otherLabels: Label[]) {
|
|
if (otherLabels.length === 0) {
|
|
// if there is no filtering, we have to use a special endpoint
|
|
return await this.languageProvider.getLabelValues(labelName);
|
|
}
|
|
|
|
const data = await this.getSeriesLabels(otherLabels);
|
|
return data[labelName] ?? [];
|
|
}
|
|
|
|
async getParserAndLabelKeys(labels: Label[]) {
|
|
return await this.languageProvider.getParserAndLabelKeys(this.buildSelector(labels));
|
|
}
|
|
|
|
async getSeriesLabels(labels: Label[]) {
|
|
return await this.languageProvider.getSeriesLabels(this.buildSelector(labels)).then((data) => data ?? {});
|
|
}
|
|
}
|