mirror of
https://github.com/prometheus/prometheus.git
synced 2024-11-15 18:14:06 -08:00
9eafed0f79
This follow a simple function-based approach to access the count and sum fields of a native Histogram. It might be more elegant to implement “accessors” via the dot operator, as considered in the brainstorming doc [1]. However, that would require the introduction of a whole new concept in PromQL. For the PoC, we should be fine with the function-based approch. Even the obvious inefficiencies (rate'ing a whole histogram twice when we only want to rate each the count and the sum once) could be optimized behind the scenes. Note that the function-based approach elegantly solves the problem of detecting counter resets in the sum of observations in the case of negative observations. (Since the whole native Histogram is rate'd, the counter reset is detected for the Histogram as a whole.) We will decide later if an “accessor” approach is really needed. It would change the example expression for average duration in functions.md from histogram_sum(rate(http_request_duration_seconds[10m])) / histogram_count(rate(http_request_duration_seconds[10m])) to rate(http_request_duration_seconds.sum[10m]) / rate(http_request_duration_seconds.count[10m]) [1]: https://docs.google.com/document/d/1ch6ru8GKg03N02jRjYriurt-CZqUVY09evPg6yKTA1s/edit Signed-off-by: beorn7 <beorn@grafana.com>
394 lines
9.7 KiB
Go
394 lines
9.7 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) (*Function, bool) {
|
|
function, ok := Functions[name]
|
|
return function, ok
|
|
}
|