Browse Source

Fix special value handling in division and modulo.

This fixes https://github.com/prometheus/prometheus/issues/597
pull/598/head
Julius Volz 10 years ago
parent
commit
b2651027fc
  1. 14
      rules/ast/ast.go
  2. 40
      rules/rules_test.go

14
rules/ast/ast.go

@ -637,15 +637,12 @@ func evalScalarBinop(opType BinOpType,
case Mul:
return lhs * rhs
case Div:
if rhs != 0 {
return lhs / rhs
}
return clientmodel.SampleValue(math.Inf(int(rhs)))
return lhs / rhs
case Mod:
if rhs != 0 {
return clientmodel.SampleValue(int(lhs) % int(rhs))
}
return clientmodel.SampleValue(math.Inf(int(rhs)))
return clientmodel.SampleValue(math.NaN())
case EQ:
if lhs == rhs {
return 1
@ -691,15 +688,12 @@ func evalVectorBinop(opType BinOpType,
case Mul:
return lhs * rhs, true
case Div:
if rhs != 0 {
return lhs / rhs, true
}
return clientmodel.SampleValue(math.Inf(int(rhs))), true
return lhs / rhs, true
case Mod:
if rhs != 0 {
return clientmodel.SampleValue(int(lhs) % int(rhs)), true
}
return clientmodel.SampleValue(math.Inf(int(rhs))), true
return clientmodel.SampleValue(math.NaN()), true
case EQ:
if lhs == rhs {
return lhs, true

40
rules/rules_test.go

@ -1157,6 +1157,46 @@ func TestExpressions(t *testing.T) {
expr: `999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999`,
output: []string{`scalar: +Inf @[%v]`},
},
{
expr: `1 / 0`,
output: []string{`scalar: +Inf @[%v]`},
},
{
expr: `-1 / 0`,
output: []string{`scalar: -Inf @[%v]`},
},
{
expr: `0 / 0`,
output: []string{`scalar: NaN @[%v]`},
},
{
expr: `1 % 0`,
output: []string{`scalar: NaN @[%v]`},
},
{
expr: `http_requests{group="canary", instance="0", job="api-server"} / 0`,
output: []string{
`{group="canary", instance="0", job="api-server"} => +Inf @[%v]`,
},
},
{
expr: `-1 * http_requests{group="canary", instance="0", job="api-server"} / 0`,
output: []string{
`{group="canary", instance="0", job="api-server"} => -Inf @[%v]`,
},
},
{
expr: `0 * http_requests{group="canary", instance="0", job="api-server"} / 0`,
output: []string{
`{group="canary", instance="0", job="api-server"} => NaN @[%v]`,
},
},
{
expr: `0 * http_requests{group="canary", instance="0", job="api-server"} % 0`,
output: []string{
`{group="canary", instance="0", job="api-server"} => NaN @[%v]`,
},
},
}
storage, closer := newTestStorage(t)

Loading…
Cancel
Save