mirror of
https://github.com/prometheus/prometheus.git
synced 2025-02-21 03:16:00 -08:00
Add quantile_over_time function
This commit is contained in:
parent
08891beb5f
commit
b0342ba9ec
|
@ -478,6 +478,51 @@ func funcSumOverTime(ev *evaluator, args Expressions) model.Value {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// === quantile_over_time(matrix model.ValMatrix) Vector ===
|
||||||
|
func funcQuantileOverTime(ev *evaluator, args Expressions) model.Value {
|
||||||
|
q := ev.evalFloat(args[0])
|
||||||
|
mat := ev.evalMatrix(args[1])
|
||||||
|
resultVector := vector{}
|
||||||
|
|
||||||
|
for _, el := range mat {
|
||||||
|
if len(el.Values) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
el.Metric.Del(model.MetricNameLabel)
|
||||||
|
var result float64
|
||||||
|
if q < 0 {
|
||||||
|
result = math.Inf(-1)
|
||||||
|
} else if q > 1 {
|
||||||
|
result = math.Inf(+1)
|
||||||
|
} else {
|
||||||
|
values := make([]float64, 0, len(el.Values))
|
||||||
|
for _, v := range el.Values {
|
||||||
|
values = append(values, float64(v.Value))
|
||||||
|
}
|
||||||
|
sort.Float64s(values)
|
||||||
|
|
||||||
|
n := float64(len(el.Values))
|
||||||
|
// When the quantile lies between two samples,
|
||||||
|
// we use a weighted average of the two samples.
|
||||||
|
rank := q * (n-1)
|
||||||
|
|
||||||
|
lowerIndex := math.Max(0, math.Floor(rank))
|
||||||
|
upperIndex := math.Min(n-1, lowerIndex+1)
|
||||||
|
|
||||||
|
weight := rank - math.Floor(rank)
|
||||||
|
|
||||||
|
result = values[int(lowerIndex)] * (1 - weight) + values[int(upperIndex)] * weight
|
||||||
|
}
|
||||||
|
resultVector = append(resultVector, &sample{
|
||||||
|
Metric: el.Metric,
|
||||||
|
Value: model.SampleValue(result),
|
||||||
|
Timestamp: ev.Timestamp,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return resultVector
|
||||||
|
}
|
||||||
|
|
||||||
// === stddev_over_time(matrix model.ValMatrix) Vector ===
|
// === stddev_over_time(matrix model.ValMatrix) Vector ===
|
||||||
func funcStddevOverTime(ev *evaluator, args Expressions) model.Value {
|
func funcStddevOverTime(ev *evaluator, args Expressions) model.Value {
|
||||||
return aggrOverTime(ev, args, func(values []model.SamplePair) model.SampleValue {
|
return aggrOverTime(ev, args, func(values []model.SamplePair) model.SampleValue {
|
||||||
|
@ -504,7 +549,7 @@ func funcStdvarOverTime(ev *evaluator, args Expressions) model.Value {
|
||||||
avg := sum / count
|
avg := sum / count
|
||||||
return squaredSum/count - avg*avg
|
return squaredSum/count - avg*avg
|
||||||
})
|
})
|
||||||
}
|
|
||||||
|
|
||||||
// === abs(vector model.ValVector) Vector ===
|
// === abs(vector model.ValVector) Vector ===
|
||||||
func funcAbs(ev *evaluator, args Expressions) model.Value {
|
func funcAbs(ev *evaluator, args Expressions) model.Value {
|
||||||
|
@ -973,6 +1018,12 @@ var functions = map[string]*Function{
|
||||||
ReturnType: model.ValVector,
|
ReturnType: model.ValVector,
|
||||||
Call: funcPredictLinear,
|
Call: funcPredictLinear,
|
||||||
},
|
},
|
||||||
|
"quantile_over_time": {
|
||||||
|
Name: "quantile_over_time",
|
||||||
|
ArgTypes: []model.ValueType{model.ValScalar, model.ValMatrix},
|
||||||
|
ReturnType: model.ValVector,
|
||||||
|
Call: funcQuantileOverTime,
|
||||||
|
},
|
||||||
"rate": {
|
"rate": {
|
||||||
Name: "rate",
|
Name: "rate",
|
||||||
ArgTypes: []model.ValueType{model.ValMatrix},
|
ArgTypes: []model.ValueType{model.ValMatrix},
|
||||||
|
|
45
promql/testdata/functions.test
vendored
45
promql/testdata/functions.test
vendored
|
@ -276,7 +276,6 @@ eval instant at 8000s holt_winters(http_requests[1m], 0.01, 0.1)
|
||||||
{job="api-server", instance="0", group="canary"} 24000
|
{job="api-server", instance="0", group="canary"} 24000
|
||||||
{job="api-server", instance="1", group="canary"} -32000
|
{job="api-server", instance="1", group="canary"} -32000
|
||||||
|
|
||||||
|
|
||||||
# Tests for stddev_over_time and stdvar_over_time.
|
# Tests for stddev_over_time and stdvar_over_time.
|
||||||
clear
|
clear
|
||||||
load 10s
|
load 10s
|
||||||
|
@ -287,3 +286,47 @@ eval instant at 1m stdvar_over_time(metric[1m])
|
||||||
|
|
||||||
eval instant at 1m stddev_over_time(metric[1m])
|
eval instant at 1m stddev_over_time(metric[1m])
|
||||||
{} 3.249615
|
{} 3.249615
|
||||||
|
|
||||||
|
# Tests for quantile_over_time
|
||||||
|
clear
|
||||||
|
|
||||||
|
load 10s
|
||||||
|
data{test="two samples"} 0 1
|
||||||
|
data{test="three samples"} 0 1 2
|
||||||
|
data{test="uneven samples"} 0 1 4
|
||||||
|
|
||||||
|
eval instant at 1m quantile_over_time(0, data[1m])
|
||||||
|
{test="two samples"} 0
|
||||||
|
{test="three samples"} 0
|
||||||
|
{test="uneven samples"} 0
|
||||||
|
|
||||||
|
eval instant at 1m quantile_over_time(0.5, data[1m])
|
||||||
|
{test="two samples"} 0.5
|
||||||
|
{test="three samples"} 1
|
||||||
|
{test="uneven samples"} 1
|
||||||
|
|
||||||
|
eval instant at 1m quantile_over_time(0.75, data[1m])
|
||||||
|
{test="two samples"} 0.75
|
||||||
|
{test="three samples"} 1.5
|
||||||
|
{test="uneven samples"} 2.5
|
||||||
|
|
||||||
|
eval instant at 1m quantile_over_time(0.8, data[1m])
|
||||||
|
{test="two samples"} 0.8
|
||||||
|
{test="three samples"} 1.6
|
||||||
|
{test="uneven samples"} 2.8
|
||||||
|
|
||||||
|
eval instant at 1m quantile_over_time(1, data[1m])
|
||||||
|
{test="two samples"} 1
|
||||||
|
{test="three samples"} 2
|
||||||
|
{test="uneven samples"} 4
|
||||||
|
|
||||||
|
eval instant at 1m quantile_over_time(-1, data[1m])
|
||||||
|
{test="two samples"} -Inf
|
||||||
|
{test="three samples"} -Inf
|
||||||
|
{test="uneven samples"} -Inf
|
||||||
|
|
||||||
|
eval instant at 1m quantile_over_time(2, data[1m])
|
||||||
|
{test="two samples"} +Inf
|
||||||
|
{test="three samples"} +Inf
|
||||||
|
{test="uneven samples"} +Inf
|
||||||
|
>>>>>>> Add quantile_over_time function
|
||||||
|
|
Loading…
Reference in a new issue