mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* feat(loki-monaco-editor): implement extracted label keys * Chore: add missing responseUtils tests * feat(loki-monaco-editor): suggest extracted labels * Chore: fix test case name * feat(loki-monaco-editor): dont suggest labels in logs query * Chore: remove console log * Chore: remove extracted keyword from suggested label * feat(loki-monaco-editor): do not suggest duplicated labels * refactor(loki-monaco-editor): pass query and offset to the completions resolver * Revert "refactor(loki-monaco-editor): pass query and offset to the completions resolver" This reverts commit d39464fd1a4624d5cd5420156dd2d1e2dad2eecf. * refactor(loki-monaco-editor): refactor label completions for grouping * Chore: remove obsolete function
81 lines
2.7 KiB
TypeScript
81 lines
2.7 KiB
TypeScript
import { DataFrame, FieldType, Labels } from '@grafana/data';
|
|
|
|
import { getParser, LogsParsers } from '../../../features/logs/utils';
|
|
|
|
export function dataFrameHasLokiError(frame: DataFrame): boolean {
|
|
const labelSets: Labels[] = frame.fields.find((f) => f.name === 'labels')?.values.toArray() ?? [];
|
|
return labelSets.some((labels) => labels.__error__ !== undefined);
|
|
}
|
|
|
|
export function dataFrameHasLevelLabel(frame: DataFrame): boolean {
|
|
const labelSets: Labels[] = frame.fields.find((f) => f.name === 'labels')?.values.toArray() ?? [];
|
|
return labelSets.some((labels) => labels.level !== undefined);
|
|
}
|
|
|
|
export function extractLogParserFromDataFrame(frame: DataFrame): { hasLogfmt: boolean; hasJSON: boolean } {
|
|
const lineField = frame.fields.find((field) => field.type === FieldType.string);
|
|
if (lineField == null) {
|
|
return { hasJSON: false, hasLogfmt: false };
|
|
}
|
|
|
|
const logLines: string[] = lineField.values.toArray();
|
|
|
|
let hasJSON = false;
|
|
let hasLogfmt = false;
|
|
|
|
logLines.forEach((line) => {
|
|
const parser = getParser(line);
|
|
if (parser === LogsParsers.JSON) {
|
|
hasJSON = true;
|
|
}
|
|
if (parser === LogsParsers.logfmt) {
|
|
hasLogfmt = true;
|
|
}
|
|
});
|
|
|
|
return { hasLogfmt, hasJSON };
|
|
}
|
|
|
|
export function extractLabelKeysFromDataFrame(frame: DataFrame): string[] {
|
|
const labelsArray: Array<{ [key: string]: string }> | undefined =
|
|
frame?.fields?.find((field) => field.name === 'labels')?.values.toArray() ?? [];
|
|
|
|
if (!labelsArray?.length) {
|
|
return [];
|
|
}
|
|
|
|
return Object.keys(labelsArray[0]);
|
|
}
|
|
|
|
export function extractHasErrorLabelFromDataFrame(frame: DataFrame): boolean {
|
|
const labelField = frame.fields.find((field) => field.name === 'labels' && field.type === FieldType.other);
|
|
if (labelField == null) {
|
|
return false;
|
|
}
|
|
|
|
const labels: Array<{ [key: string]: string }> = labelField.values.toArray();
|
|
return labels.some((label) => label['__error__']);
|
|
}
|
|
|
|
export function extractLevelLikeLabelFromDataFrame(frame: DataFrame): string | null {
|
|
const labelField = frame.fields.find((field) => field.name === 'labels' && field.type === FieldType.other);
|
|
if (labelField == null) {
|
|
return null;
|
|
}
|
|
|
|
// Depending on number of labels, this can be pretty heavy operation.
|
|
// Let's just look at first 2 lines If needed, we can introduce more later.
|
|
const labelsArray: Array<{ [key: string]: string }> = labelField.values.toArray().slice(0, 2);
|
|
let levelLikeLabel: string | null = null;
|
|
|
|
// Find first level-like label
|
|
for (let labels of labelsArray) {
|
|
const label = Object.keys(labels).find((label) => label === 'lvl' || label.includes('level'));
|
|
if (label) {
|
|
levelLikeLabel = label;
|
|
break;
|
|
}
|
|
}
|
|
return levelLikeLabel;
|
|
}
|