vmalert: fix mistake with object reuse while parsing response (#1370)

* vmalert: fix mistake with object reuse while parsing response

During the refactoring, the wrong optimisations was applied in
parse function which caused metric fields reset. The change removes
optimisation.

https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1369

* vmalert: add test to cover multiple metrics in one response
This commit is contained in:
Roman Khavronenko 2021-06-11 11:22:05 +03:00 committed by GitHub
parent 69b1482bdb
commit 7adfe878e1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 19 additions and 17 deletions

View file

@ -34,23 +34,18 @@ type promRange struct {
func (r promInstant) metrics() ([]Metric, error) { func (r promInstant) metrics() ([]Metric, error) {
var result []Metric var result []Metric
var m Metric
for i, res := range r.Result { for i, res := range r.Result {
f, err := strconv.ParseFloat(res.TV[1].(string), 64) f, err := strconv.ParseFloat(res.TV[1].(string), 64)
if err != nil { if err != nil {
return nil, fmt.Errorf("metric %v, unable to parse float64 from %s: %w", res, res.TV[1], err) return nil, fmt.Errorf("metric %v, unable to parse float64 from %s: %w", res, res.TV[1], err)
} }
m.Labels = nil var m Metric
for k, v := range r.Result[i].Labels { for k, v := range r.Result[i].Labels {
m.AddLabel(k, v) m.AddLabel(k, v)
} }
m.Timestamps = append(m.Timestamps, int64(res.TV[0].(float64))) m.Timestamps = append(m.Timestamps, int64(res.TV[0].(float64)))
m.Values = append(m.Values, f) m.Values = append(m.Values, f)
result = append(result, m) result = append(result, m)
m.Values = m.Values[:0]
m.Labels = m.Labels[:0]
m.Timestamps = m.Timestamps[:0]
} }
return result, nil return result, nil
} }

View file

@ -66,7 +66,7 @@ func TestVMInstantQuery(t *testing.T) {
case 5: case 5:
w.Write([]byte(`{"status":"success","data":{"resultType":"matrix"}}`)) w.Write([]byte(`{"status":"success","data":{"resultType":"matrix"}}`))
case 6: case 6:
w.Write([]byte(`{"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"vm_rows"},"value":[1583786142,"13763"]}]}}`)) w.Write([]byte(`{"status":"success","data":{"resultType":"vector","result":[{"metric":{"__name__":"vm_rows"},"value":[1583786142,"13763"]},{"metric":{"__name__":"vm_requests"},"value":[1583786140,"2000"]}]}}`))
} }
}) })
@ -100,16 +100,23 @@ func TestVMInstantQuery(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("unexpected %s", err) t.Fatalf("unexpected %s", err)
} }
if len(m) != 1 { if len(m) != 2 {
t.Fatalf("expected 1 metric got %d in %+v", len(m), m) t.Fatalf("expected 2 metrics got %d in %+v", len(m), m)
} }
expected := Metric{ expected := []Metric{
Labels: []Label{{Value: "vm_rows", Name: "__name__"}}, {
Timestamps: []int64{1583786142}, Labels: []Label{{Value: "vm_rows", Name: "__name__"}},
Values: []float64{13763}, Timestamps: []int64{1583786142},
Values: []float64{13763},
},
{
Labels: []Label{{Value: "vm_requests", Name: "__name__"}},
Timestamps: []int64{1583786140},
Values: []float64{2000},
},
} }
if !reflect.DeepEqual(m[0], expected) { if !reflect.DeepEqual(m, expected) {
t.Fatalf("unexpected metric %+v want %+v", m[0], expected) t.Fatalf("unexpected metric %+v want %+v", m, expected)
} }
g := NewGraphiteType() g := NewGraphiteType()
@ -122,12 +129,12 @@ func TestVMInstantQuery(t *testing.T) {
if len(m) != 1 { if len(m) != 1 {
t.Fatalf("expected 1 metric got %d in %+v", len(m), m) t.Fatalf("expected 1 metric got %d in %+v", len(m), m)
} }
expected = Metric{ exp := Metric{
Labels: []Label{{Value: "constantLine(10)", Name: "name"}}, Labels: []Label{{Value: "constantLine(10)", Name: "name"}},
Timestamps: []int64{1611758403}, Timestamps: []int64{1611758403},
Values: []float64{10}, Values: []float64{10},
} }
if !reflect.DeepEqual(m[0], expected) { if !reflect.DeepEqual(m[0], exp) {
t.Fatalf("unexpected metric %+v want %+v", m[0], expected) t.Fatalf("unexpected metric %+v want %+v", m[0], expected)
} }
} }