1
1
package expr
2
2
3
3
import (
4
- "errors"
5
4
"fmt"
6
5
"math"
7
6
"sort"
@@ -27,7 +26,7 @@ func (s *FuncRemoveAboveBelowPercentile) Signature() ([]Arg, []Arg) {
27
26
28
27
return []Arg {
29
28
ArgSeriesList {val : & s .in },
30
- ArgFloat {key : "n" , val : & s .n },
29
+ ArgFloat {key : "n" , val : & s .n , validator : [] Validator { NonNegativePercent } },
31
30
}, []Arg {ArgSeriesList {}}
32
31
}
33
32
@@ -41,16 +40,14 @@ func (s *FuncRemoveAboveBelowPercentile) Exec(cache map[Req][]models.Series) ([]
41
40
return nil , err
42
41
}
43
42
44
- if s .n <= 0 {
45
- return nil , errors .New ("The requested percent is required to be greater than 0" )
46
- }
47
-
48
43
if len (series ) == 0 {
49
44
return series , nil
50
45
}
51
46
52
47
var output []models.Series
53
- sortedDatapointVals := make ([]float64 , 0 , len (series [0 ].Datapoints )) //reuse float64 slice
48
+
49
+ // will be reused for each getPercentileValue call
50
+ sortedDatapointVals := make ([]float64 , 0 , len (series [0 ].Datapoints ))
54
51
for _ , serie := range series {
55
52
if s .above {
56
53
serie .Target = fmt .Sprintf ("removeAbovePercentile(%s, %g)" , serie .Target , s .n )
@@ -90,6 +87,8 @@ func (s *FuncRemoveAboveBelowPercentile) Exec(cache map[Req][]models.Series) ([]
90
87
return output , nil
91
88
}
92
89
90
+ // sortedDatapointVals is an empty slice to be used for sorting datapoints.
91
+ // n must be > 0. if n > 100, the largest value is returned.
93
92
func getPercentileValue (datapoints []schema.Point , n float64 , sortedDatapointVals []float64 ) float64 {
94
93
sortedDatapointVals = sortedDatapointVals [:0 ]
95
94
for _ , p := range datapoints {
0 commit comments