mirror of
https://github.com/prometheus/prometheus.git
synced 2024-12-26 22:19:40 -08:00
97c7fffbb8
In Thanos we would like to start experimenting with custom functions that are currently not part of the PromQL spec. We would do this by adding an implementation for those functions in the Thanos engine: https://github.com/thanos-community/promql-engine and allow users to decide which engine they want to use on a per-query basis. Since we use the PromQL parser from Prometheus, injecting functions in the global `Functions` variable would mean they also become available for the Prometheus engine. To avoid this side-effect, this commit exposes a Parser interface in which the supported functions can be injected as an option. If not functions are injected, the parser implementation will default to the functions defined in the global Functions variable. Signed-off-by: Filip Petkovski <filip.petkovsky@gmail.com>
394 lines
9.8 KiB
Go
394 lines
9.8 KiB
Go
// Copyright 2015 The Prometheus Authors
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package parser
|
|
|
|
// Function represents a function of the expression language and is
|
|
// used by function nodes.
|
|
type Function struct {
|
|
Name string
|
|
ArgTypes []ValueType
|
|
Variadic int
|
|
ReturnType ValueType
|
|
}
|
|
|
|
// Functions is a list of all functions supported by PromQL, including their types.
|
|
var Functions = map[string]*Function{
|
|
"abs": {
|
|
Name: "abs",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"absent": {
|
|
Name: "absent",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"absent_over_time": {
|
|
Name: "absent_over_time",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"acos": {
|
|
Name: "acos",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"acosh": {
|
|
Name: "acosh",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"asin": {
|
|
Name: "asin",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"asinh": {
|
|
Name: "asinh",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"atan": {
|
|
Name: "atan",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"atanh": {
|
|
Name: "atanh",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"avg_over_time": {
|
|
Name: "avg_over_time",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"ceil": {
|
|
Name: "ceil",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"changes": {
|
|
Name: "changes",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"clamp": {
|
|
Name: "clamp",
|
|
ArgTypes: []ValueType{ValueTypeVector, ValueTypeScalar, ValueTypeScalar},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"clamp_max": {
|
|
Name: "clamp_max",
|
|
ArgTypes: []ValueType{ValueTypeVector, ValueTypeScalar},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"clamp_min": {
|
|
Name: "clamp_min",
|
|
ArgTypes: []ValueType{ValueTypeVector, ValueTypeScalar},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"cos": {
|
|
Name: "cos",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"cosh": {
|
|
Name: "cosh",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"count_over_time": {
|
|
Name: "count_over_time",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"days_in_month": {
|
|
Name: "days_in_month",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
Variadic: 1,
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"day_of_month": {
|
|
Name: "day_of_month",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
Variadic: 1,
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"day_of_week": {
|
|
Name: "day_of_week",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
Variadic: 1,
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"day_of_year": {
|
|
Name: "day_of_year",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
Variadic: 1,
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"deg": {
|
|
Name: "deg",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"delta": {
|
|
Name: "delta",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"deriv": {
|
|
Name: "deriv",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"exp": {
|
|
Name: "exp",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"floor": {
|
|
Name: "floor",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"histogram_count": {
|
|
Name: "histogram_count",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"histogram_sum": {
|
|
Name: "histogram_sum",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"histogram_fraction": {
|
|
Name: "histogram_fraction",
|
|
ArgTypes: []ValueType{ValueTypeScalar, ValueTypeScalar, ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"histogram_quantile": {
|
|
Name: "histogram_quantile",
|
|
ArgTypes: []ValueType{ValueTypeScalar, ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"holt_winters": {
|
|
Name: "holt_winters",
|
|
ArgTypes: []ValueType{ValueTypeMatrix, ValueTypeScalar, ValueTypeScalar},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"hour": {
|
|
Name: "hour",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
Variadic: 1,
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"idelta": {
|
|
Name: "idelta",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"increase": {
|
|
Name: "increase",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"irate": {
|
|
Name: "irate",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"label_replace": {
|
|
Name: "label_replace",
|
|
ArgTypes: []ValueType{ValueTypeVector, ValueTypeString, ValueTypeString, ValueTypeString, ValueTypeString},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"label_join": {
|
|
Name: "label_join",
|
|
ArgTypes: []ValueType{ValueTypeVector, ValueTypeString, ValueTypeString, ValueTypeString},
|
|
Variadic: -1,
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"last_over_time": {
|
|
Name: "last_over_time",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"ln": {
|
|
Name: "ln",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"log10": {
|
|
Name: "log10",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"log2": {
|
|
Name: "log2",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"max_over_time": {
|
|
Name: "max_over_time",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"min_over_time": {
|
|
Name: "min_over_time",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"minute": {
|
|
Name: "minute",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
Variadic: 1,
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"month": {
|
|
Name: "month",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
Variadic: 1,
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"pi": {
|
|
Name: "pi",
|
|
ArgTypes: []ValueType{},
|
|
ReturnType: ValueTypeScalar,
|
|
},
|
|
"predict_linear": {
|
|
Name: "predict_linear",
|
|
ArgTypes: []ValueType{ValueTypeMatrix, ValueTypeScalar},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"present_over_time": {
|
|
Name: "present_over_time",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"quantile_over_time": {
|
|
Name: "quantile_over_time",
|
|
ArgTypes: []ValueType{ValueTypeScalar, ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"rad": {
|
|
Name: "rad",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"rate": {
|
|
Name: "rate",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"resets": {
|
|
Name: "resets",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"round": {
|
|
Name: "round",
|
|
ArgTypes: []ValueType{ValueTypeVector, ValueTypeScalar},
|
|
Variadic: 1,
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"scalar": {
|
|
Name: "scalar",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeScalar,
|
|
},
|
|
"sgn": {
|
|
Name: "sgn",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"sin": {
|
|
Name: "sin",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"sinh": {
|
|
Name: "sinh",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"sort": {
|
|
Name: "sort",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"sort_desc": {
|
|
Name: "sort_desc",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"sqrt": {
|
|
Name: "sqrt",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"stddev_over_time": {
|
|
Name: "stddev_over_time",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"stdvar_over_time": {
|
|
Name: "stdvar_over_time",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"sum_over_time": {
|
|
Name: "sum_over_time",
|
|
ArgTypes: []ValueType{ValueTypeMatrix},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"tan": {
|
|
Name: "tan",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"tanh": {
|
|
Name: "tanh",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"time": {
|
|
Name: "time",
|
|
ArgTypes: []ValueType{},
|
|
ReturnType: ValueTypeScalar,
|
|
},
|
|
"timestamp": {
|
|
Name: "timestamp",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"vector": {
|
|
Name: "vector",
|
|
ArgTypes: []ValueType{ValueTypeScalar},
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
"year": {
|
|
Name: "year",
|
|
ArgTypes: []ValueType{ValueTypeVector},
|
|
Variadic: 1,
|
|
ReturnType: ValueTypeVector,
|
|
},
|
|
}
|
|
|
|
// getFunction returns a predefined Function object for the given name.
|
|
func getFunction(name string, functions map[string]*Function) (*Function, bool) {
|
|
function, ok := functions[name]
|
|
return function, ok
|
|
}
|