Loki: Added support for disabled operations in Query Builder (#96751)
* Loki operations: define basic toggleable operations * LokiQueryModeller: skip disabled operations * Loki operations: define toggleable operations * Add test * Add test
This commit is contained in:
@@ -334,4 +334,15 @@ describe('LokiQueryModeller', () => {
|
||||
expect(result.operations[1].id).toBe(LokiOperationId.Unwrap);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Disabled operations', () => {
|
||||
it('Can query with line filter contains operation with empty params', () => {
|
||||
expect(
|
||||
modeller.renderQuery({
|
||||
labels: [{ label: 'app', op: '=', value: 'grafana' }],
|
||||
operations: [{ id: LokiOperationId.LineContains, params: [''], disabled: true }],
|
||||
})
|
||||
).toBe('{app="grafana"}');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -25,6 +25,9 @@ export class LokiQueryModeller extends QueryModellerBase {
|
||||
|
||||
renderOperations(queryString: string, operations: QueryBuilderOperation[]): string {
|
||||
for (const operation of operations) {
|
||||
if (operation.disabled) {
|
||||
continue;
|
||||
}
|
||||
const def = this.operationsRegistry.getIfExists(operation.id);
|
||||
if (!def) {
|
||||
console.error(`Could not find operation ${operation.id} in the registry`);
|
||||
|
||||
@@ -95,6 +95,7 @@ export const binaryScalarOperations: QueryBuilderOperationDefinition[] = binaryS
|
||||
name: opDef.name,
|
||||
params,
|
||||
defaultParams,
|
||||
toggleable: true,
|
||||
alternativesKey: 'binary scalar operations',
|
||||
category: LokiVisualQueryOperationCategory.BinaryOps,
|
||||
renderer: getSimpleBinaryRenderer(opDef.sign),
|
||||
|
||||
+63
-1
@@ -7,7 +7,7 @@ import { config } from '@grafana/runtime';
|
||||
import { createLokiDatasource } from '../../__mocks__/datasource';
|
||||
import { LokiOperationId, LokiVisualQuery } from '../types';
|
||||
|
||||
import { LokiQueryBuilder, TIME_SPAN_TO_TRIGGER_SAMPLES } from './LokiQueryBuilder';
|
||||
import { LokiQueryBuilder, Props, TIME_SPAN_TO_TRIGGER_SAMPLES } from './LokiQueryBuilder';
|
||||
import { EXPLAIN_LABEL_FILTER_CONTENT } from './LokiQueryBuilderExplained';
|
||||
|
||||
const MISSING_LABEL_FILTER_ERROR_MESSAGE = 'Select at least 1 label filter (label and value)';
|
||||
@@ -317,6 +317,68 @@ describe('LokiQueryBuilder', () => {
|
||||
expect(props.datasource.getDataSamples).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Disabling operations', () => {
|
||||
let props: Omit<Props, 'query'>;
|
||||
beforeEach(() => {
|
||||
props = createDefaultProps();
|
||||
props.datasource.getDataSamples = jest.fn().mockReturnValue(new Promise(() => {}));
|
||||
props.datasource.languageProvider.fetchLabelValues = jest.fn().mockReturnValue(['a', 'b']);
|
||||
});
|
||||
it('Allows to disable operations', async () => {
|
||||
const onChange = jest.fn();
|
||||
|
||||
const query: LokiVisualQuery = {
|
||||
labels: [{ op: '=', label: 'job', value: 'grafana' }],
|
||||
operations: [
|
||||
{
|
||||
id: LokiOperationId.Logfmt,
|
||||
params: [],
|
||||
},
|
||||
],
|
||||
};
|
||||
render(<LokiQueryBuilder {...props} onChange={onChange} query={query} />);
|
||||
|
||||
expect(screen.getByText('Logfmt')).toBeInTheDocument();
|
||||
await userEvent.click(screen.getByTitle('Disable operation'));
|
||||
expect(onChange).toHaveBeenCalledWith({
|
||||
...query,
|
||||
operations: [
|
||||
{
|
||||
...query.operations[0],
|
||||
disabled: true,
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
it('Allows to enable operations', async () => {
|
||||
const onChange = jest.fn();
|
||||
const query: LokiVisualQuery = {
|
||||
labels: [{ op: '=', label: 'job', value: 'grafana' }],
|
||||
operations: [
|
||||
{
|
||||
id: LokiOperationId.Logfmt,
|
||||
params: [],
|
||||
disabled: true,
|
||||
},
|
||||
],
|
||||
};
|
||||
render(<LokiQueryBuilder {...props} onChange={onChange} query={query} />);
|
||||
|
||||
expect(screen.getByText('Logfmt')).toBeInTheDocument();
|
||||
await userEvent.click(screen.getByTitle('Enable operation'));
|
||||
expect(onChange).toHaveBeenCalledWith({
|
||||
...query,
|
||||
operations: [
|
||||
{
|
||||
...query.operations[0],
|
||||
disabled: false,
|
||||
},
|
||||
],
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
const getSelectParent = (input: HTMLElement) =>
|
||||
|
||||
@@ -48,6 +48,7 @@ export function createRangeOperation(
|
||||
name: getLokiOperationDisplayName(name),
|
||||
params: params,
|
||||
defaultParams,
|
||||
toggleable: true,
|
||||
alternativesKey: 'range function',
|
||||
category: LokiVisualQueryOperationCategory.RangeFunctions,
|
||||
orderRank: LokiOperationOrder.RangeVectorFunction,
|
||||
@@ -86,6 +87,7 @@ export function createRangeOperationWithGrouping(name: string): QueryBuilderOper
|
||||
},
|
||||
],
|
||||
defaultParams: [...rangeOperation.defaultParams, ''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'range function with grouping',
|
||||
category: LokiVisualQueryOperationCategory.RangeFunctions,
|
||||
renderer: getRangeAggregationWithGroupingRenderer(name, 'by'),
|
||||
@@ -431,6 +433,7 @@ export function createAggregationOperation(
|
||||
},
|
||||
],
|
||||
defaultParams: [],
|
||||
toggleable: true,
|
||||
alternativesKey: 'plain aggregations',
|
||||
category: LokiVisualQueryOperationCategory.Aggregations,
|
||||
renderer: functionRendererLeft,
|
||||
|
||||
@@ -87,6 +87,7 @@ function getOperationDefinitions(): QueryBuilderOperationDefinition[] {
|
||||
},
|
||||
],
|
||||
defaultParams: [],
|
||||
toggleable: true,
|
||||
alternativesKey: 'format',
|
||||
category: LokiVisualQueryOperationCategory.Formats,
|
||||
orderRank: LokiOperationOrder.Parsers,
|
||||
@@ -125,6 +126,7 @@ function getOperationDefinitions(): QueryBuilderOperationDefinition[] {
|
||||
},
|
||||
],
|
||||
defaultParams: [false, false],
|
||||
toggleable: true,
|
||||
alternativesKey: 'format',
|
||||
category: LokiVisualQueryOperationCategory.Formats,
|
||||
orderRank: LokiOperationOrder.Parsers,
|
||||
@@ -147,6 +149,7 @@ function getOperationDefinitions(): QueryBuilderOperationDefinition[] {
|
||||
},
|
||||
],
|
||||
defaultParams: [''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'format',
|
||||
category: LokiVisualQueryOperationCategory.Formats,
|
||||
orderRank: LokiOperationOrder.Parsers,
|
||||
@@ -169,6 +172,7 @@ function getOperationDefinitions(): QueryBuilderOperationDefinition[] {
|
||||
},
|
||||
],
|
||||
defaultParams: [''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'format',
|
||||
category: LokiVisualQueryOperationCategory.Formats,
|
||||
orderRank: LokiOperationOrder.Parsers,
|
||||
@@ -182,6 +186,7 @@ function getOperationDefinitions(): QueryBuilderOperationDefinition[] {
|
||||
name: 'Unpack',
|
||||
params: [],
|
||||
defaultParams: [],
|
||||
toggleable: true,
|
||||
alternativesKey: 'format',
|
||||
category: LokiVisualQueryOperationCategory.Formats,
|
||||
orderRank: LokiOperationOrder.Parsers,
|
||||
@@ -204,6 +209,7 @@ function getOperationDefinitions(): QueryBuilderOperationDefinition[] {
|
||||
},
|
||||
],
|
||||
defaultParams: [''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'format',
|
||||
category: LokiVisualQueryOperationCategory.Formats,
|
||||
orderRank: LokiOperationOrder.PipeOperations,
|
||||
@@ -225,6 +231,7 @@ Example: \`{{.status_code}} - {{.message}}\`
|
||||
{ name: 'Rename to', type: 'string' },
|
||||
],
|
||||
defaultParams: ['', ''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'format',
|
||||
category: LokiVisualQueryOperationCategory.Formats,
|
||||
orderRank: LokiOperationOrder.PipeOperations,
|
||||
@@ -255,6 +262,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
},
|
||||
],
|
||||
defaultParams: [''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'line filter',
|
||||
category: LokiVisualQueryOperationCategory.LineFilters,
|
||||
orderRank: LokiOperationOrder.LineFilters,
|
||||
@@ -278,6 +286,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
},
|
||||
],
|
||||
defaultParams: [''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'line filter',
|
||||
category: LokiVisualQueryOperationCategory.LineFilters,
|
||||
orderRank: LokiOperationOrder.LineFilters,
|
||||
@@ -301,6 +310,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
},
|
||||
],
|
||||
defaultParams: [''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'line filter',
|
||||
category: LokiVisualQueryOperationCategory.LineFilters,
|
||||
orderRank: LokiOperationOrder.LineFilters,
|
||||
@@ -324,6 +334,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
},
|
||||
],
|
||||
defaultParams: [''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'line filter',
|
||||
category: LokiVisualQueryOperationCategory.LineFilters,
|
||||
orderRank: LokiOperationOrder.LineFilters,
|
||||
@@ -347,6 +358,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
},
|
||||
],
|
||||
defaultParams: [''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'line filter',
|
||||
category: LokiVisualQueryOperationCategory.LineFilters,
|
||||
orderRank: LokiOperationOrder.LineFilters,
|
||||
@@ -370,6 +382,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
},
|
||||
],
|
||||
defaultParams: [''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'line filter',
|
||||
category: LokiVisualQueryOperationCategory.LineFilters,
|
||||
orderRank: LokiOperationOrder.LineFilters,
|
||||
@@ -397,6 +410,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
},
|
||||
],
|
||||
defaultParams: ['|=', ''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'line filter',
|
||||
category: LokiVisualQueryOperationCategory.LineFilters,
|
||||
orderRank: LokiOperationOrder.LineFilters,
|
||||
@@ -427,6 +441,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
{ name: 'Value', type: 'string', minWidth: 14 },
|
||||
],
|
||||
defaultParams: ['', '=', ''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'label filter',
|
||||
category: LokiVisualQueryOperationCategory.LabelFilters,
|
||||
orderRank: LokiOperationOrder.PipeOperations,
|
||||
@@ -448,6 +463,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
{ name: 'Value', type: 'string', minWidth: 14 },
|
||||
],
|
||||
defaultParams: ['', '=', ''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'label filter',
|
||||
category: LokiVisualQueryOperationCategory.LabelFilters,
|
||||
orderRank: LokiOperationOrder.PipeOperations,
|
||||
@@ -461,6 +477,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
name: 'No pipeline errors',
|
||||
params: [],
|
||||
defaultParams: [],
|
||||
toggleable: true,
|
||||
alternativesKey: 'label filter',
|
||||
category: LokiVisualQueryOperationCategory.LabelFilters,
|
||||
orderRank: LokiOperationOrder.NoErrors,
|
||||
@@ -489,6 +506,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
},
|
||||
],
|
||||
defaultParams: ['', ''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'format',
|
||||
category: LokiVisualQueryOperationCategory.Formats,
|
||||
orderRank: LokiOperationOrder.Unwrap,
|
||||
@@ -509,6 +527,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
name: 'Decolorize',
|
||||
params: [],
|
||||
defaultParams: [],
|
||||
toggleable: true,
|
||||
alternativesKey: 'format',
|
||||
category: LokiVisualQueryOperationCategory.Formats,
|
||||
orderRank: LokiOperationOrder.PipeOperations,
|
||||
@@ -533,6 +552,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
},
|
||||
],
|
||||
defaultParams: [''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'format',
|
||||
category: LokiVisualQueryOperationCategory.Formats,
|
||||
orderRank: LokiOperationOrder.PipeOperations,
|
||||
@@ -557,6 +577,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
},
|
||||
],
|
||||
defaultParams: [''],
|
||||
toggleable: true,
|
||||
alternativesKey: 'format',
|
||||
category: LokiVisualQueryOperationCategory.Formats,
|
||||
orderRank: LokiOperationOrder.PipeOperations,
|
||||
@@ -571,6 +592,7 @@ Example: \`\`error_level=\`level\` \`\`
|
||||
name: 'Binary operation with query',
|
||||
params: [],
|
||||
defaultParams: [],
|
||||
toggleable: true,
|
||||
category: LokiVisualQueryOperationCategory.BinaryOps,
|
||||
renderer: (model, def, innerExpr) => innerExpr,
|
||||
addOperationHandler: addNestedQueryHandler,
|
||||
|
||||
Reference in New Issue
Block a user