package promql import ( "testing" "github.com/VictoriaMetrics/VictoriaMetrics/lib/protoparser/prometheus" "github.com/VictoriaMetrics/VictoriaMetrics/lib/storage" "github.com/VictoriaMetrics/metricsql" ) func TestGetCommonLabelFilters(t *testing.T) { f := func(metrics string, lfsExpected string) { t.Helper() var tss []*timeseries var rows prometheus.Rows rows.UnmarshalWithErrLogger(metrics, func(errStr string) { t.Fatalf("unexpected error when parsing %s: %s", metrics, errStr) }) for _, row := range rows.Rows { var tags []storage.Tag for _, tag := range row.Tags { tags = append(tags, storage.Tag{ Key: []byte(tag.Key), Value: []byte(tag.Value), }) } var ts timeseries ts.MetricName.Tags = tags tss = append(tss, &ts) } lfs := getCommonLabelFilters(tss) me := &metricsql.MetricExpr{ LabelFilters: lfs, } lfsMarshaled := me.AppendString(nil) if string(lfsMarshaled) != lfsExpected { t.Fatalf("unexpected common label filters;\ngot\n%s\nwant\n%s", lfsMarshaled, lfsExpected) } } f(``, `{}`) f(`m 1`, `{}`) f(`m{a="b"} 1`, `{a="b"}`) f(`m{c="d",a="b"} 1`, `{a="b", c="d"}`) f(`m1{a="foo"} 1 m2{a="bar"} 1`, `{a=~"bar|foo"}`) f(`m1{a="foo"} 1 m2{b="bar"} 1`, `{}`) f(`m1{a="foo",b="bar"} 1 m2{b="bar",c="x"} 1`, `{b="bar"}`) }