mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
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:
parent
69b1482bdb
commit
7adfe878e1
2 changed files with 19 additions and 17 deletions
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue