mirror of
https://github.com/prometheus/prometheus.git
synced 2025-08-06 22:27:17 +02:00
Merge pull request #16725 from MichaHoffmann/mhoffmann/fix-topk-nan-arg-error-on-nonexisting-series
promql: fix topk error on NaN argument for non-existing series
This commit is contained in:
commit
dbee82267a
@ -86,11 +86,6 @@ type engineMetrics struct {
|
|||||||
querySamples prometheus.Counter
|
querySamples prometheus.Counter
|
||||||
}
|
}
|
||||||
|
|
||||||
// convertibleToInt64 returns true if v does not over-/underflow an int64.
|
|
||||||
func convertibleToInt64(v float64) bool {
|
|
||||||
return v <= maxInt64 && v >= minInt64
|
|
||||||
}
|
|
||||||
|
|
||||||
type (
|
type (
|
||||||
// ErrQueryTimeout is returned if a query timed out during processing.
|
// ErrQueryTimeout is returned if a query timed out during processing.
|
||||||
ErrQueryTimeout string
|
ErrQueryTimeout string
|
||||||
@ -1433,6 +1428,15 @@ func (ev *evaluator) rangeEvalAgg(ctx context.Context, aggExpr *parser.Aggregate
|
|||||||
if params.Max() < 1 {
|
if params.Max() < 1 {
|
||||||
return nil, annos
|
return nil, annos
|
||||||
}
|
}
|
||||||
|
if params.HasAnyNaN() {
|
||||||
|
ev.errorf("Parameter value is NaN")
|
||||||
|
}
|
||||||
|
if fParam := params.Min(); fParam <= minInt64 {
|
||||||
|
ev.errorf("Scalar value %v underflows int64", fParam)
|
||||||
|
}
|
||||||
|
if fParam := params.Max(); fParam >= maxInt64 {
|
||||||
|
ev.errorf("Scalar value %v overflows int64", fParam)
|
||||||
|
}
|
||||||
seriess = make(map[uint64]Series, len(inputMatrix))
|
seriess = make(map[uint64]Series, len(inputMatrix))
|
||||||
|
|
||||||
case parser.LIMIT_RATIO:
|
case parser.LIMIT_RATIO:
|
||||||
@ -1440,6 +1444,9 @@ func (ev *evaluator) rangeEvalAgg(ctx context.Context, aggExpr *parser.Aggregate
|
|||||||
if params.Max() == 0 && params.Min() == 0 {
|
if params.Max() == 0 && params.Min() == 0 {
|
||||||
return nil, annos
|
return nil, annos
|
||||||
}
|
}
|
||||||
|
if params.HasAnyNaN() {
|
||||||
|
ev.errorf("Ratio value is NaN")
|
||||||
|
}
|
||||||
if params.Max() > 1.0 {
|
if params.Max() > 1.0 {
|
||||||
annos.Add(annotations.NewInvalidRatioWarning(params.Max(), 1.0, aggExpr.Param.PositionRange()))
|
annos.Add(annotations.NewInvalidRatioWarning(params.Max(), 1.0, aggExpr.Param.PositionRange()))
|
||||||
}
|
}
|
||||||
@ -3325,9 +3332,6 @@ seriesLoop:
|
|||||||
var r float64
|
var r float64
|
||||||
switch op {
|
switch op {
|
||||||
case parser.TOPK, parser.BOTTOMK, parser.LIMITK:
|
case parser.TOPK, parser.BOTTOMK, parser.LIMITK:
|
||||||
if !convertibleToInt64(fParam) {
|
|
||||||
ev.errorf("Scalar value %v overflows int64", fParam)
|
|
||||||
}
|
|
||||||
k = int64(fParam)
|
k = int64(fParam)
|
||||||
if k > int64(len(inputMatrix)) {
|
if k > int64(len(inputMatrix)) {
|
||||||
k = int64(len(inputMatrix))
|
k = int64(len(inputMatrix))
|
||||||
@ -3339,9 +3343,6 @@ seriesLoop:
|
|||||||
return nil, annos
|
return nil, annos
|
||||||
}
|
}
|
||||||
case parser.LIMIT_RATIO:
|
case parser.LIMIT_RATIO:
|
||||||
if math.IsNaN(fParam) {
|
|
||||||
ev.errorf("Ratio value %v is NaN", fParam)
|
|
||||||
}
|
|
||||||
switch {
|
switch {
|
||||||
case fParam == 0:
|
case fParam == 0:
|
||||||
if enh.Ts != ev.endTimestamp {
|
if enh.Ts != ev.endTimestamp {
|
||||||
|
9
promql/promqltest/testdata/aggregators.test
vendored
9
promql/promqltest/testdata/aggregators.test
vendored
@ -388,6 +388,15 @@ eval_info instant at 50m bottomk by (instance) (1, {__name__=~"http_requests(_hi
|
|||||||
{__name__="http_requests", group="production", instance="1", job="api-server"} 200
|
{__name__="http_requests", group="production", instance="1", job="api-server"} 200
|
||||||
{__name__="http_requests", group="production", instance="2", job="api-server"} NaN
|
{__name__="http_requests", group="production", instance="2", job="api-server"} NaN
|
||||||
|
|
||||||
|
eval instant at 50m topk(NaN, non_existent)
|
||||||
|
expect fail msg: Parameter value is NaN
|
||||||
|
|
||||||
|
eval instant at 50m limitk(NaN, non_existent)
|
||||||
|
expect fail msg: Parameter value is NaN
|
||||||
|
|
||||||
|
eval instant at 50m limit_ratio(NaN, non_existent)
|
||||||
|
expect fail msg: Ratio value is NaN
|
||||||
|
|
||||||
clear
|
clear
|
||||||
|
|
||||||
# Tests for count_values.
|
# Tests for count_values.
|
||||||
|
3
promql/promqltest/testdata/histograms.test
vendored
3
promql/promqltest/testdata/histograms.test
vendored
@ -222,6 +222,9 @@ eval_warn instant at 50m histogram_quantile(NaN, testhistogram_bucket)
|
|||||||
{start="positive"} NaN
|
{start="positive"} NaN
|
||||||
{start="negative"} NaN
|
{start="negative"} NaN
|
||||||
|
|
||||||
|
eval instant at 50m histogram_quantile(NaN, non_existent)
|
||||||
|
expect warn msg: PromQL warning: quantile value should be between 0 and 1, got NaN
|
||||||
|
|
||||||
# Quantile value in lowest bucket.
|
# Quantile value in lowest bucket.
|
||||||
|
|
||||||
eval instant at 50m histogram_quantile(0, testhistogram)
|
eval instant at 50m histogram_quantile(0, testhistogram)
|
||||||
|
Loading…
Reference in New Issue
Block a user