mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
app/vmselect/promql: add missing trigonometric functions, which are going to be added in Prometheus 2.31
See https://github.com/prometheus/prometheus/issues/9233
This commit is contained in:
parent
8679ba71dd
commit
81c6720392
4 changed files with 174 additions and 12 deletions
|
@ -1039,6 +1039,17 @@ func TestExecSuccess(t *testing.T) {
|
|||
resultExpected := []netstorage.Result{r}
|
||||
f(q, resultExpected)
|
||||
})
|
||||
t.Run("sinh()", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
q := `sinh(pi()*(2000-time())/1000)`
|
||||
r := netstorage.Result{
|
||||
MetricName: metricNameExpected,
|
||||
Values: []float64{11.548739357257748, 6.132140673514712, 3.217113080357038, 1.6144880404748523, 0.6704839982471175, 0},
|
||||
Timestamps: timestampsExpected,
|
||||
}
|
||||
resultExpected := []netstorage.Result{r}
|
||||
f(q, resultExpected)
|
||||
})
|
||||
t.Run("asin()", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
q := `asin((2000-time())/1000)`
|
||||
|
@ -1050,6 +1061,39 @@ func TestExecSuccess(t *testing.T) {
|
|||
resultExpected := []netstorage.Result{r}
|
||||
f(q, resultExpected)
|
||||
})
|
||||
t.Run("asinh(sinh)", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
q := `asinh(sinh((2000-time())/1000))`
|
||||
r := netstorage.Result{
|
||||
MetricName: metricNameExpected,
|
||||
Values: []float64{1, 0.8000000000000002, 0.6, 0.4000000000000001, 0.2, 0},
|
||||
Timestamps: timestampsExpected,
|
||||
}
|
||||
resultExpected := []netstorage.Result{r}
|
||||
f(q, resultExpected)
|
||||
})
|
||||
t.Run("atan()", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
q := `atan((2000-time())/1000)`
|
||||
r := netstorage.Result{
|
||||
MetricName: metricNameExpected,
|
||||
Values: []float64{0.7853981633974483, 0.6747409422235526, 0.5404195002705842, 0.3805063771123649, 0.19739555984988078, 0},
|
||||
Timestamps: timestampsExpected,
|
||||
}
|
||||
resultExpected := []netstorage.Result{r}
|
||||
f(q, resultExpected)
|
||||
})
|
||||
t.Run("atanh(tanh)", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
q := `atanh(tanh((2000-time())/1000))`
|
||||
r := netstorage.Result{
|
||||
MetricName: metricNameExpected,
|
||||
Values: []float64{1, 0.8000000000000002, 0.6, 0.4000000000000001, 0.2, 0},
|
||||
Timestamps: timestampsExpected,
|
||||
}
|
||||
resultExpected := []netstorage.Result{r}
|
||||
f(q, resultExpected)
|
||||
})
|
||||
t.Run("cos()", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
q := `cos(pi()*(2000-time())/1000)`
|
||||
|
@ -1072,6 +1116,28 @@ func TestExecSuccess(t *testing.T) {
|
|||
resultExpected := []netstorage.Result{r}
|
||||
f(q, resultExpected)
|
||||
})
|
||||
t.Run("acosh(cosh)", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
q := `acosh(cosh((2000-time())/1000))`
|
||||
r := netstorage.Result{
|
||||
MetricName: metricNameExpected,
|
||||
Values: []float64{1, 0.8000000000000002, 0.5999999999999999, 0.40000000000000036, 0.20000000000000023, 0},
|
||||
Timestamps: timestampsExpected,
|
||||
}
|
||||
resultExpected := []netstorage.Result{r}
|
||||
f(q, resultExpected)
|
||||
})
|
||||
t.Run("rad(deg)", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
q := `rad(deg(time()/500))`
|
||||
r := netstorage.Result{
|
||||
MetricName: metricNameExpected,
|
||||
Values: []float64{2, 2.3999999999999995, 2.8, 3.2, 3.6, 4},
|
||||
Timestamps: timestampsExpected,
|
||||
}
|
||||
resultExpected := []netstorage.Result{r}
|
||||
f(q, resultExpected)
|
||||
})
|
||||
t.Run("floor(time()/500)", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
q := `floor(time()/500)`
|
||||
|
@ -7241,9 +7307,13 @@ func TestExecError(t *testing.T) {
|
|||
f(`smooth_exponential(1)`)
|
||||
f(`remove_resets()`)
|
||||
f(`sin()`)
|
||||
f(`sinh()`)
|
||||
f(`cos()`)
|
||||
f(`cosh()`)
|
||||
f(`asin()`)
|
||||
f(`asinh()`)
|
||||
f(`acos()`)
|
||||
f(`acosh()`)
|
||||
f(`rand(123, 456)`)
|
||||
f(`rand_normal(123, 456)`)
|
||||
f(`rand_exponential(122, 456)`)
|
||||
|
|
|
@ -43,13 +43,22 @@ var transformFuncs = map[string]transformFunc{
|
|||
// See funcs accepting instant-vector on https://prometheus.io/docs/prometheus/latest/querying/functions/ .
|
||||
"abs": newTransformFuncOneArg(transformAbs),
|
||||
"absent": transformAbsent,
|
||||
"acos": newTransformFuncOneArg(transformAcos),
|
||||
"acosh": newTransformFuncOneArg(transformAcosh),
|
||||
"asin": newTransformFuncOneArg(transformAsin),
|
||||
"asinh": newTransformFuncOneArg(transformAsinh),
|
||||
"atan": newTransformFuncOneArg(transformAtan),
|
||||
"atanh": newTransformFuncOneArg(transformAtanh),
|
||||
"ceil": newTransformFuncOneArg(transformCeil),
|
||||
"clamp": transformClamp,
|
||||
"clamp_max": transformClampMax,
|
||||
"clamp_min": transformClampMin,
|
||||
"cos": newTransformFuncOneArg(transformCos),
|
||||
"cosh": newTransformFuncOneArg(transformCosh),
|
||||
"day_of_month": newTransformFuncDateTime(transformDayOfMonth),
|
||||
"day_of_week": newTransformFuncDateTime(transformDayOfWeek),
|
||||
"days_in_month": newTransformFuncDateTime(transformDaysInMonth),
|
||||
"deg": newTransformFuncOneArg(transformDeg),
|
||||
"exp": newTransformFuncOneArg(transformExp),
|
||||
"floor": newTransformFuncOneArg(transformFloor),
|
||||
"histogram_quantile": transformHistogramQuantile,
|
||||
|
@ -61,12 +70,18 @@ var transformFuncs = map[string]transformFunc{
|
|||
"log10": newTransformFuncOneArg(transformLog10),
|
||||
"minute": newTransformFuncDateTime(transformMinute),
|
||||
"month": newTransformFuncDateTime(transformMonth),
|
||||
"pi": transformPi,
|
||||
"rad": newTransformFuncOneArg(transformRad),
|
||||
"round": transformRound,
|
||||
"sgn": transformSign,
|
||||
"scalar": transformScalar,
|
||||
"sgn": transformSgn,
|
||||
"sin": newTransformFuncOneArg(transformSin),
|
||||
"sinh": newTransformFuncOneArg(transformSinh),
|
||||
"sort": newTransformFuncSort(false),
|
||||
"sort_desc": newTransformFuncSort(true),
|
||||
"sqrt": newTransformFuncOneArg(transformSqrt),
|
||||
"tan": newTransformFuncOneArg(transformTan),
|
||||
"tanh": newTransformFuncOneArg(transformTanh),
|
||||
"time": transformTime,
|
||||
// "timestamp" has been moved to rollup funcs. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/415
|
||||
"vector": transformVector,
|
||||
|
@ -109,11 +124,6 @@ var transformFuncs = map[string]transformFunc{
|
|||
"rand": newTransformRand(newRandFloat64),
|
||||
"rand_normal": newTransformRand(newRandNormFloat64),
|
||||
"rand_exponential": newTransformRand(newRandExpFloat64),
|
||||
"pi": transformPi,
|
||||
"sin": newTransformFuncOneArg(transformSin),
|
||||
"cos": newTransformFuncOneArg(transformCos),
|
||||
"asin": newTransformFuncOneArg(transformAsin),
|
||||
"acos": newTransformFuncOneArg(transformAcos),
|
||||
"prometheus_buckets": transformPrometheusBuckets,
|
||||
"buckets_limit": transformBucketsLimit,
|
||||
"histogram_share": transformHistogramShare,
|
||||
|
@ -1777,7 +1787,7 @@ func transformRound(tfa *transformFuncArg) ([]*timeseries, error) {
|
|||
return doTransformValues(args[0], tf, tfa.fe)
|
||||
}
|
||||
|
||||
func transformSign(tfa *transformFuncArg) ([]*timeseries, error) {
|
||||
func transformSgn(tfa *transformFuncArg) ([]*timeseries, error) {
|
||||
args := tfa.args
|
||||
if err := expectTransformArgsNum(args, 1); err != nil {
|
||||
return nil, err
|
||||
|
@ -1898,18 +1908,58 @@ func transformSin(v float64) float64 {
|
|||
return math.Sin(v)
|
||||
}
|
||||
|
||||
func transformSinh(v float64) float64 {
|
||||
return math.Sinh(v)
|
||||
}
|
||||
|
||||
func transformCos(v float64) float64 {
|
||||
return math.Cos(v)
|
||||
}
|
||||
|
||||
func transformCosh(v float64) float64 {
|
||||
return math.Cosh(v)
|
||||
}
|
||||
|
||||
func transformTan(v float64) float64 {
|
||||
return math.Tan(v)
|
||||
}
|
||||
|
||||
func transformTanh(v float64) float64 {
|
||||
return math.Tanh(v)
|
||||
}
|
||||
|
||||
func transformAsin(v float64) float64 {
|
||||
return math.Asin(v)
|
||||
}
|
||||
|
||||
func transformAsinh(v float64) float64 {
|
||||
return math.Asinh(v)
|
||||
}
|
||||
|
||||
func transformAtan(v float64) float64 {
|
||||
return math.Atan(v)
|
||||
}
|
||||
|
||||
func transformAtanh(v float64) float64 {
|
||||
return math.Atanh(v)
|
||||
}
|
||||
|
||||
func transformAcos(v float64) float64 {
|
||||
return math.Acos(v)
|
||||
}
|
||||
|
||||
func transformAcosh(v float64) float64 {
|
||||
return math.Acosh(v)
|
||||
}
|
||||
|
||||
func transformDeg(v float64) float64 {
|
||||
return v * 180 / math.Pi
|
||||
}
|
||||
|
||||
func transformRad(v float64) float64 {
|
||||
return v * math.Pi / 180
|
||||
}
|
||||
|
||||
func newTransformRand(newRandFunc func(r *rand.Rand) func() float64) transformFunc {
|
||||
return func(tfa *transformFuncArg) ([]*timeseries, error) {
|
||||
args := tfa.args
|
||||
|
|
|
@ -6,6 +6,7 @@ sort: 15
|
|||
|
||||
## tip
|
||||
|
||||
* FEATURE: add missing trigonometric functions, which are going to be added in [Prometheus 2.31](https://github.com/prometheus/prometheus/pull/9239): [acosh](https://docs.victoriametrics.com/MetricsQL.html#acosh), [asinh](https://docs.victoriametrics.com/MetricsQL.html#asinh), [atan](https://docs.victoriametrics.com/MetricsQL.html#atan), [atanh](https://docs.victoriametrics.com/MetricsQL.html#atanh), [cosh](https://docs.victoriametrics.com/MetricsQL.html#cosh), [deg](https://docs.victoriametrics.com/MetricsQL.html#deg), [rad](https://docs.victoriametrics.com/MetricsQL.html#rad), [sinh](https://docs.victoriametrics.com/MetricsQL.html#sinh), [tan](https://docs.victoriametrics.com/MetricsQL.html#tan), [tanh](https://docs.victoriametrics.com/MetricsQL.html#tanh).
|
||||
* FEATURE: consistently return the same set of time series from [limitk](https://docs.victoriametrics.com/MetricsQL.html#limitk) function. This improves the usability of periodically refreshed graphs.
|
||||
|
||||
* BUGFIX: vmstorage: fix `unaligned 64-bit atomic operation` panic on 32-bit architectures (arm and 386). The panic has been introduced in v1.67.0
|
||||
|
|
|
@ -351,11 +351,27 @@ See also [implicit query conversions](#implicit-query-conversions).
|
|||
|
||||
#### acos
|
||||
|
||||
`acos(q)` returns `arccos(v)` for every `v` point of every time series returned by `q`. Metric names are stripped from the resulting series. See also [asin](#asin) and [cos](#cos).
|
||||
`acos(q)` returns [inverse cosine](https://en.wikipedia.org/wiki/Inverse_trigonometric_functions) for every point of every time series returned by `q`. Metric names are stripped from the resulting series. This function is supported by PromQL. See also [asin](#asin) and [cos](#cos).
|
||||
|
||||
#### acosh
|
||||
|
||||
`acosh(q)` returns [inverse hyperbolic cosine](https://en.wikipedia.org/wiki/Inverse_hyperbolic_functions#Inverse_hyperbolic_cosine) for every point of every time series returned by `q`. Metric names are stripped from the resulting series. This function is supported by PromQL. See also [sinh](#cosh).
|
||||
|
||||
#### asin
|
||||
|
||||
`asin(q)` returns `arcsin(v)` for every `v` point of every time series returned by `q`. Metric names are stripped from the resulting series. See also [acos](#acos) and [sin](#sin).
|
||||
`asin(q)` returns [inverse sine](https://en.wikipedia.org/wiki/Inverse_trigonometric_functions) for every point of every time series returned by `q`. Metric names are stripped from the resulting series. This function is supported by PromQL. See also [acos](#acos) and [sin](#sin).
|
||||
|
||||
#### asinh
|
||||
|
||||
`asinh(q)` returns [inverse hyperbolic sine](https://en.wikipedia.org/wiki/Inverse_hyperbolic_functions#Inverse_hyperbolic_sine) for every point of every time series returned by `q`. Metric names are stripped from the resulting series. This function is supported by PromQL. See also [sinh](#sinh).
|
||||
|
||||
#### atan
|
||||
|
||||
`atan(q)` returns [inverse tangent](https://en.wikipedia.org/wiki/Inverse_trigonometric_functions) for every point of every time series returned by `q`. Metric names are stripped from the resulting series. This function is supported by PromQL. See also [tan](#tan).
|
||||
|
||||
#### atanh
|
||||
|
||||
`atanh(q)` returns [inverse hyperbolic tangent](https://en.wikipedia.org/wiki/Inverse_hyperbolic_functions#Inverse_hyperbolic_tangent) for every point of every time series returned by `q`. Metric names are stripped from the resulting series. This function is supported by PromQL. See also [tanh](#tanh).
|
||||
|
||||
#### bitmap_and
|
||||
|
||||
|
@ -391,7 +407,11 @@ See also [implicit query conversions](#implicit-query-conversions).
|
|||
|
||||
#### cos
|
||||
|
||||
`cos(q)` returns `cos(v)` for every `v` point of every time series returned by `q`. Metric names are stripped from the resulting series. See also [sin](#sin).
|
||||
`cos(q)` returns `cos(v)` for every `v` point of every time series returned by `q`. Metric names are stripped from the resulting series. This function is supported by PromQL. See also [sin](#sin).
|
||||
|
||||
#### cosh
|
||||
|
||||
`cosh(q)` returns [hyperbolic cosine](https://en.wikipedia.org/wiki/Hyperbolic_functions) for every point of every time series returned by `q`. Metric names are stripped from the resulting series. This function is supported by PromQL. This function is supported by PromQL. See also [acosh](#acosh).
|
||||
|
||||
#### day_of_month
|
||||
|
||||
|
@ -405,6 +425,10 @@ See also [implicit query conversions](#implicit-query-conversions).
|
|||
|
||||
`days_in_month(q)` returns the number of days in the month identified by every point of every time series returned by `q`. It is expected that `q` returns unix timestamps. The returned values are in the range `[28...31]`. Metric names are stripped from the resulting series. This function is supported by PromQL.
|
||||
|
||||
#### deg
|
||||
|
||||
`deg(q)` converts [Radians to degrees](https://en.wikipedia.org/wiki/Radian#Conversions) for every point of every time series returned by `q`. Metric names are stripped from the resulting series. This function is supported by PromQL. See also [rad](#rad).
|
||||
|
||||
#### end
|
||||
|
||||
`end()` returns the unix timestamp in seconds for the last point. See also [start](#start). It is known as `end` query arg passed to [/api/v1/query_range](https://prometheus.io/docs/prometheus/latest/querying/api/#range-queries).
|
||||
|
@ -479,7 +503,12 @@ See also [implicit query conversions](#implicit-query-conversions).
|
|||
|
||||
#### pi
|
||||
|
||||
`pi()` returns [Pi number](https://en.wikipedia.org/wiki/Pi).
|
||||
`pi()` returns [Pi number](https://en.wikipedia.org/wiki/Pi). This function is supported by PromQL.
|
||||
|
||||
#### rad
|
||||
|
||||
`rad(q)` converts [degrees to Radians](https://en.wikipedia.org/wiki/Radian#Conversions) for every point of every time series returned by `q`. Metric names are stripped from the resulting series. This function is supported by PromQL. See also [deg](#deg).
|
||||
|
||||
|
||||
#### prometheus_buckets
|
||||
|
||||
|
@ -567,7 +596,19 @@ See also [implicit query conversions](#implicit-query-conversions).
|
|||
|
||||
#### sin
|
||||
|
||||
`sin(q)` returns `sin(v)` for every `v` point of every time series returned by `q`. Metric names are stripped from the resulting series. See also [cos](#cos).
|
||||
`sin(q)` returns `sin(v)` for every `v` point of every time series returned by `q`. Metric names are stripped from the resulting series. This function is supported by MetricsQL. See also [cos](#cos).
|
||||
|
||||
#### sinh
|
||||
|
||||
`sinh(q)` returns [hyperbolic sine](https://en.wikipedia.org/wiki/Hyperbolic_functions) for every point of every time series returned by `q`. Metric names are stripped from the resulting series. This function is supported by MetricsQL. See also [cosh](#cosh).
|
||||
|
||||
#### tan
|
||||
|
||||
`tan(q)` returns `tan(v)` for every `v` point of every time series returned by `q`. Metric names are stripped from the resulting series. This function is supported by MetricsQL. See also [atan](#atan).
|
||||
|
||||
#### tanh
|
||||
|
||||
`tanh(q)` returns [hyperbolic tangent](https://en.wikipedia.org/wiki/Hyperbolic_functions) for every point of every time series returned by `q`. Metric names are stripped from the resulting series. This function is supported by MetricsQL. See also [atanh](#atanh).
|
||||
|
||||
#### smooth_exponential
|
||||
|
||||
|
|
Loading…
Reference in a new issue