diff --git a/public/app/plugins/datasource/loki/querybuilder/operations.ts b/public/app/plugins/datasource/loki/querybuilder/operations.ts index aaef1e81cc7..d44f3e9ba7a 100644 --- a/public/app/plugins/datasource/loki/querybuilder/operations.ts +++ b/public/app/plugins/datasource/loki/querybuilder/operations.ts @@ -18,6 +18,9 @@ export function getOperationDefinitions(): QueryBuilderOperationDef[] { LokiOperationId.Avg, LokiOperationId.TopK, LokiOperationId.BottomK, + LokiOperationId.Stddev, + LokiOperationId.Stdvar, + LokiOperationId.Count, ].flatMap((opId) => createAggregationOperation(opId, { addOperationHandler: addLokiOperation, @@ -32,6 +35,14 @@ export function getOperationDefinitions(): QueryBuilderOperationDef[] { createRangeOperation(LokiOperationId.BytesRate), createRangeOperation(LokiOperationId.BytesOverTime), createRangeOperation(LokiOperationId.AbsentOverTime), + createRangeOperation(LokiOperationId.AvgOverTime), + createRangeOperation(LokiOperationId.MaxOverTime), + createRangeOperation(LokiOperationId.MinOverTime), + createRangeOperation(LokiOperationId.FirstOverTime), + createRangeOperation(LokiOperationId.LastOverTime), + createRangeOperation(LokiOperationId.StdvarOverTime), + createRangeOperation(LokiOperationId.StddevOverTime), + createRangeOperation(LokiOperationId.QuantileOverTime), ...aggregations, { id: LokiOperationId.Json, @@ -303,15 +314,28 @@ export function getOperationDefinitions(): QueryBuilderOperationDef[] { } function createRangeOperation(name: string): QueryBuilderOperationDef { + const params = [getRangeVectorParamDef()]; + const defaultParams = ['$__interval']; + let renderer = operationWithRangeVectorRenderer; + + if (name === LokiOperationId.QuantileOverTime) { + defaultParams.push('0.95'); + params.push({ + name: 'Quantile', + type: 'number', + }); + renderer = operationWithRangeVectorRendererAndParam; + } + return { id: name, name: getPromAndLokiOperationDisplayName(name), - params: [getRangeVectorParamDef()], - defaultParams: ['$__interval'], + params, + defaultParams, alternativesKey: 'range function', category: LokiVisualQueryOperationCategory.RangeFunctions, orderRank: LokiOperationOrder.RangeVectorFunction, - renderer: operationWithRangeVectorRenderer, + renderer, addOperationHandler: addLokiOperation, explainHandler: (op, def) => { let opDocs = FUNCTIONS.find((x) => x.insertText === op.id)?.documentation ?? ''; @@ -342,6 +366,17 @@ function operationWithRangeVectorRenderer( return `${def.id}(${innerExpr} [${rangeVector}])`; } +function operationWithRangeVectorRendererAndParam( + model: QueryBuilderOperation, + def: QueryBuilderOperationDef, + innerExpr: string +) { + const params = model.params ?? []; + const rangeVector = params[0] ?? '$__interval'; + const param = params[1]; + return `${def.id}(${param}, ${innerExpr} [${rangeVector}])`; +} + function getLineFilterRenderer(operation: string) { return function lineFilterRenderer(model: QueryBuilderOperation, def: QueryBuilderOperationDef, innerExpr: string) { if (model.params[0] === '') { diff --git a/public/app/plugins/datasource/loki/querybuilder/types.ts b/public/app/plugins/datasource/loki/querybuilder/types.ts index 75d0a8e0a14..36939dc783d 100644 --- a/public/app/plugins/datasource/loki/querybuilder/types.ts +++ b/public/app/plugins/datasource/loki/querybuilder/types.ts @@ -38,6 +38,14 @@ export enum LokiOperationId { Rate = 'rate', CountOverTime = 'count_over_time', SumOverTime = 'sum_over_time', + AvgOverTime = 'avg_over_time', + MaxOverTime = 'max_over_time', + MinOverTime = 'min_over_time', + FirstOverTime = 'first_over_time', + LastOverTime = 'last_over_time', + StdvarOverTime = 'stdvar_over_time', + StddevOverTime = 'stddev_over_time', + QuantileOverTime = 'quantile_over_time', BytesRate = 'bytes_rate', BytesOverTime = 'bytes_over_time', AbsentOverTime = 'absent_over_time', @@ -45,6 +53,9 @@ export enum LokiOperationId { Avg = 'avg', Min = 'min', Max = 'max', + Stddev = 'stddev', + Stdvar = 'stdvar', + Count = 'count', TopK = 'topk', BottomK = 'bottomk', LineContains = '__line_contains',