mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
app/vmselect/promql: properly calculate c1 and c2
and c1 or c2
by upgrading github.com/VictoriaMetrics/metricsql to v0.79.0
The fix is in the https://github.com/VictoriaMetrics/metricsql/pull/34 Updates https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6637
This commit is contained in:
parent
8bc30b68cd
commit
b82e2cabc5
8 changed files with 59 additions and 19 deletions
|
@ -3027,6 +3027,12 @@ func TestExecSuccess(t *testing.T) {
|
||||||
resultExpected := []netstorage.Result{r}
|
resultExpected := []netstorage.Result{r}
|
||||||
f(q, resultExpected)
|
f(q, resultExpected)
|
||||||
})
|
})
|
||||||
|
t.Run(`1 and (0 > 1)`, func(t *testing.T) {
|
||||||
|
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6637
|
||||||
|
t.Parallel()
|
||||||
|
q := `1 and (0 > 1)`
|
||||||
|
f(q, nil)
|
||||||
|
})
|
||||||
t.Run(`time() and 2`, func(t *testing.T) {
|
t.Run(`time() and 2`, func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
q := `time() and 2`
|
q := `time() and 2`
|
||||||
|
|
|
@ -36,8 +36,8 @@ See also [LTS releases](https://docs.victoriametrics.com/lts-releases/).
|
||||||
* BUGFIX: [Single-node VictoriaMetrics](https://docs.victoriametrics.com/) and `vmstorage` in [VictoriaMetrics cluster](https://docs.victoriametrics.com/cluster-victoriametrics/): fix metric `vm_object_references{type="indexdb"}`. Previously, it was overcounted.
|
* BUGFIX: [Single-node VictoriaMetrics](https://docs.victoriametrics.com/) and `vmstorage` in [VictoriaMetrics cluster](https://docs.victoriametrics.com/cluster-victoriametrics/): fix metric `vm_object_references{type="indexdb"}`. Previously, it was overcounted.
|
||||||
* BUGFIX: [Single-node VictoriaMetrics](https://docs.victoriametrics.com/) and `vmstorage` in [VictoriaMetrics cluster](https://docs.victoriametrics.com/cluster-victoriametrics/): properly ingest stale NaN samples. Previously it could be dropped if series didn't exist at storage node. See this issue [https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5069] for details.
|
* BUGFIX: [Single-node VictoriaMetrics](https://docs.victoriametrics.com/) and `vmstorage` in [VictoriaMetrics cluster](https://docs.victoriametrics.com/cluster-victoriametrics/): properly ingest stale NaN samples. Previously it could be dropped if series didn't exist at storage node. See this issue [https://github.com/VictoriaMetrics/VictoriaMetrics/issues/5069] for details.
|
||||||
* BUGFIX: [Single-node VictoriaMetrics](https://docs.victoriametrics.com/) and `vmstorage` in [VictoriaMetrics cluster](https://docs.victoriametrics.com/cluster-victoriametrics/): properly track `vm_missing_tsids_for_metric_id_total` metric. See this [issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6931) for details.
|
* BUGFIX: [Single-node VictoriaMetrics](https://docs.victoriametrics.com/) and `vmstorage` in [VictoriaMetrics cluster](https://docs.victoriametrics.com/cluster-victoriametrics/): properly track `vm_missing_tsids_for_metric_id_total` metric. See this [issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6931) for details.
|
||||||
|
|
||||||
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert): do not send notifications without labels to Alertmanager. Such notifications are rejected by Alertmanager anyway. Before, vmalert could send alert notifications even if no label-value pairs left after applying `alert_relabel_configs` from [notifier config](https://docs.victoriametrics.com/vmalert/#notifier-configuration-file).
|
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert): do not send notifications without labels to Alertmanager. Such notifications are rejected by Alertmanager anyway. Before, vmalert could send alert notifications even if no label-value pairs left after applying `alert_relabel_configs` from [notifier config](https://docs.victoriametrics.com/vmalert/#notifier-configuration-file).
|
||||||
|
* BUGFIX: [MetricsQL](https://docs.victoriametrics.com/metricsql/): properly handle `c1 AND c2` and `c1 OR c1` queries for constants `c1` and `c2`. Previously such queries could return unexpected results. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/6637).
|
||||||
|
|
||||||
## [v1.103.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.103.0)
|
## [v1.103.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.103.0)
|
||||||
|
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -10,7 +10,7 @@ require (
|
||||||
github.com/VictoriaMetrics/easyproto v0.1.4
|
github.com/VictoriaMetrics/easyproto v0.1.4
|
||||||
github.com/VictoriaMetrics/fastcache v1.12.2
|
github.com/VictoriaMetrics/fastcache v1.12.2
|
||||||
github.com/VictoriaMetrics/metrics v1.35.1
|
github.com/VictoriaMetrics/metrics v1.35.1
|
||||||
github.com/VictoriaMetrics/metricsql v0.77.0
|
github.com/VictoriaMetrics/metricsql v0.79.0
|
||||||
github.com/aws/aws-sdk-go-v2 v1.30.5
|
github.com/aws/aws-sdk-go-v2 v1.30.5
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.27.33
|
github.com/aws/aws-sdk-go-v2/config v1.27.33
|
||||||
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.18
|
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.18
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -74,8 +74,8 @@ github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkT
|
||||||
github.com/VictoriaMetrics/metrics v1.34.0/go.mod h1:r7hveu6xMdUACXvB8TYdAj8WEsKzWB0EkpJN+RDtOf8=
|
github.com/VictoriaMetrics/metrics v1.34.0/go.mod h1:r7hveu6xMdUACXvB8TYdAj8WEsKzWB0EkpJN+RDtOf8=
|
||||||
github.com/VictoriaMetrics/metrics v1.35.1 h1:o84wtBKQbzLdDy14XeskkCZih6anG+veZ1SwJHFGwrU=
|
github.com/VictoriaMetrics/metrics v1.35.1 h1:o84wtBKQbzLdDy14XeskkCZih6anG+veZ1SwJHFGwrU=
|
||||||
github.com/VictoriaMetrics/metrics v1.35.1/go.mod h1:r7hveu6xMdUACXvB8TYdAj8WEsKzWB0EkpJN+RDtOf8=
|
github.com/VictoriaMetrics/metrics v1.35.1/go.mod h1:r7hveu6xMdUACXvB8TYdAj8WEsKzWB0EkpJN+RDtOf8=
|
||||||
github.com/VictoriaMetrics/metricsql v0.77.0 h1:eD+1RuIBQmbSPdl8ItbghxLifE+gexJxQBWKSJYwhBE=
|
github.com/VictoriaMetrics/metricsql v0.79.0 h1:6wU5oiHMAb0a59So5fV8nvssIfhXaB58wwrRhXf8sdg=
|
||||||
github.com/VictoriaMetrics/metricsql v0.77.0/go.mod h1:1g4hdCwlbJZ851PU9VN65xy9Rdlzupo6fx3SNZ8Z64U=
|
github.com/VictoriaMetrics/metricsql v0.79.0/go.mod h1:1g4hdCwlbJZ851PU9VN65xy9Rdlzupo6fx3SNZ8Z64U=
|
||||||
github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
|
github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
|
||||||
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
|
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=
|
||||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
|
||||||
|
|
4
vendor/github.com/VictoriaMetrics/metricsql/binary_op.go
generated
vendored
4
vendor/github.com/VictoriaMetrics/metricsql/binary_op.go
generated
vendored
|
@ -191,9 +191,9 @@ func binaryOpEvalNumber(op string, left, right float64, isBool bool) float64 {
|
||||||
case "^":
|
case "^":
|
||||||
left = binaryop.Pow(left, right)
|
left = binaryop.Pow(left, right)
|
||||||
case "and":
|
case "and":
|
||||||
// Nothing to do
|
left = binaryop.And(left, right)
|
||||||
case "or":
|
case "or":
|
||||||
// Nothing to do
|
left = binaryop.Or(left, right)
|
||||||
case "unless":
|
case "unless":
|
||||||
left = nan
|
left = nan
|
||||||
case "default":
|
case "default":
|
||||||
|
|
16
vendor/github.com/VictoriaMetrics/metricsql/binaryop/funcs.go
generated
vendored
16
vendor/github.com/VictoriaMetrics/metricsql/binaryop/funcs.go
generated
vendored
|
@ -107,3 +107,19 @@ func Ifnot(left, right float64) float64 {
|
||||||
}
|
}
|
||||||
return nan
|
return nan
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// And return left if left and right is not NaN. Otherwise, NaN is returned.
|
||||||
|
func And(left, right float64) float64 {
|
||||||
|
if math.IsNaN(left) || math.IsNaN(right) {
|
||||||
|
return nan
|
||||||
|
}
|
||||||
|
return left
|
||||||
|
}
|
||||||
|
|
||||||
|
// Or return the first non-NaN item. If both left and right are NaN, it returns NaN.
|
||||||
|
func Or(left, right float64) float64 {
|
||||||
|
if !math.IsNaN(left) {
|
||||||
|
return left
|
||||||
|
}
|
||||||
|
return right
|
||||||
|
}
|
||||||
|
|
42
vendor/github.com/VictoriaMetrics/metricsql/parser.go
generated
vendored
42
vendor/github.com/VictoriaMetrics/metricsql/parser.go
generated
vendored
|
@ -1368,6 +1368,13 @@ func (p *parser) parseLabelFilterExpr() (*labelFilterExpr, error) {
|
||||||
lfe.IsNegative = true
|
lfe.IsNegative = true
|
||||||
lfe.IsRegexp = true
|
lfe.IsRegexp = true
|
||||||
case ",", "}", "or":
|
case ",", "}", "or":
|
||||||
|
// Incomplete label filter 'lf' in the following forms:
|
||||||
|
//
|
||||||
|
// - {lf}
|
||||||
|
// - {lf,other="filter"}
|
||||||
|
// - {lf or other="filter"}
|
||||||
|
//
|
||||||
|
// It must be substituted by complete label filter during WITH template expand.
|
||||||
return &lfe, nil
|
return &lfe, nil
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf(`labelFilterExpr: unexpected token %q; want "=", "!=", "=~", "!~", ",", "or", "}"`, p.lex.Token)
|
return nil, fmt.Errorf(`labelFilterExpr: unexpected token %q; want "=", "!=", "=~", "!~", ",", "or", "}"`, p.lex.Token)
|
||||||
|
@ -1388,8 +1395,12 @@ func (p *parser) parseLabelFilterExpr() (*labelFilterExpr, error) {
|
||||||
//
|
//
|
||||||
// This type isn't exported.
|
// This type isn't exported.
|
||||||
type labelFilterExpr struct {
|
type labelFilterExpr struct {
|
||||||
Label string
|
// Label contains either the label name or the WITH template reference.
|
||||||
Value *StringExpr
|
Label string
|
||||||
|
|
||||||
|
// Value can be nil if Label contains unexpanded WITH template reference.
|
||||||
|
Value *StringExpr
|
||||||
|
|
||||||
IsRegexp bool
|
IsRegexp bool
|
||||||
IsNegative bool
|
IsNegative bool
|
||||||
}
|
}
|
||||||
|
@ -1658,7 +1669,7 @@ func (p *parser) parseMetricExpr() (*MetricExpr, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if p.lex.Token != "{" {
|
if p.lex.Token != "{" {
|
||||||
me.labelFilterss = append(me.labelFilterss[:0], []*labelFilterExpr{mf})
|
me.labelFilterss = append(me.labelFilterss, []*labelFilterExpr{mf})
|
||||||
return &me, nil
|
return &me, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2009,7 +2020,7 @@ func (we *withExpr) AppendString(dst []byte) []byte {
|
||||||
for i, wa := range we.Was {
|
for i, wa := range we.Was {
|
||||||
dst = wa.AppendString(dst)
|
dst = wa.AppendString(dst)
|
||||||
if i+1 < len(we.Was) {
|
if i+1 < len(we.Was) {
|
||||||
dst = append(dst, ',')
|
dst = append(dst, ", "...)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
dst = append(dst, ") "...)
|
dst = append(dst, ") "...)
|
||||||
|
@ -2246,15 +2257,15 @@ func isOnlyMetricNameInLabelFilterss(lfss [][]*labelFilterExpr) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func getMetricNameFromLabelFilterss(lfss [][]*labelFilterExpr) string {
|
func getMetricNameFromLabelFilterss(lfss [][]*labelFilterExpr) string {
|
||||||
if len(lfss) == 0 || len(lfss[0]) == 0 || lfss[0][0].Label != "__name__" || len(lfss[0][0].Value.tokens) != 1 {
|
if len(lfss) == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
metricName := mustGetMetricName(lfss[0])
|
||||||
|
if metricName == "" {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
metricName := mustExtractMetricNameFromToken(lfss[0][0].Value.tokens[0])
|
|
||||||
for _, lfs := range lfss[1:] {
|
for _, lfs := range lfss[1:] {
|
||||||
if len(lfs) == 0 || lfs[0].Label != "__name__" || len(lfs[0].Value.tokens) != 1 {
|
metricNameLocal := mustGetMetricName(lfs)
|
||||||
return ""
|
|
||||||
}
|
|
||||||
metricNameLocal := mustExtractMetricNameFromToken(lfs[0].Value.tokens[0])
|
|
||||||
if metricNameLocal != metricName {
|
if metricNameLocal != metricName {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
@ -2262,8 +2273,15 @@ func getMetricNameFromLabelFilterss(lfss [][]*labelFilterExpr) string {
|
||||||
return metricName
|
return metricName
|
||||||
}
|
}
|
||||||
|
|
||||||
func mustExtractMetricNameFromToken(token string) string {
|
func mustGetMetricName(lfss []*labelFilterExpr) string {
|
||||||
metricName, err := extractStringValue(token)
|
if len(lfss) == 0 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
lfs := lfss[0]
|
||||||
|
if lfs.Label != "__name__" || lfs.Value == nil || len(lfs.Value.tokens) != 1 {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
metricName, err := extractStringValue(lfs.Value.tokens[0])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Errorf("BUG: cannot obtain metric name: %w", err))
|
panic(fmt.Errorf("BUG: cannot obtain metric name: %w", err))
|
||||||
}
|
}
|
||||||
|
|
2
vendor/modules.txt
vendored
2
vendor/modules.txt
vendored
|
@ -118,7 +118,7 @@ github.com/VictoriaMetrics/fastcache
|
||||||
# github.com/VictoriaMetrics/metrics v1.35.1
|
# github.com/VictoriaMetrics/metrics v1.35.1
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
github.com/VictoriaMetrics/metrics
|
github.com/VictoriaMetrics/metrics
|
||||||
# github.com/VictoriaMetrics/metricsql v0.77.0
|
# github.com/VictoriaMetrics/metricsql v0.79.0
|
||||||
## explicit; go 1.13
|
## explicit; go 1.13
|
||||||
github.com/VictoriaMetrics/metricsql
|
github.com/VictoriaMetrics/metricsql
|
||||||
github.com/VictoriaMetrics/metricsql/binaryop
|
github.com/VictoriaMetrics/metricsql/binaryop
|
||||||
|
|
Loading…
Reference in a new issue