2019-05-22 21:16:55 +00:00
|
|
|
package opentsdb
|
|
|
|
|
|
|
|
import (
|
|
|
|
"reflect"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestRowsUnmarshalFailure(t *testing.T) {
|
|
|
|
f := func(s string) {
|
|
|
|
t.Helper()
|
|
|
|
var rows Rows
|
2019-08-24 09:54:17 +00:00
|
|
|
rows.Unmarshal(s)
|
|
|
|
if len(rows.Rows) != 0 {
|
|
|
|
t.Fatalf("unexpected number of rows parsed; got %d; want 0", len(rows.Rows))
|
2019-05-22 21:16:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Try again
|
2019-08-24 09:54:17 +00:00
|
|
|
rows.Unmarshal(s)
|
|
|
|
if len(rows.Rows) != 0 {
|
|
|
|
t.Fatalf("unexpected number of rows parsed; got %d; want 0", len(rows.Rows))
|
2019-05-22 21:16:55 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Missing put prefix
|
|
|
|
f("xx")
|
|
|
|
|
2019-08-24 10:35:29 +00:00
|
|
|
// Missing metric
|
|
|
|
f("put 111 34")
|
|
|
|
|
2019-05-22 21:16:55 +00:00
|
|
|
// Missing timestamp
|
|
|
|
f("put aaa")
|
|
|
|
|
|
|
|
// Missing value
|
|
|
|
f("put aaa 1123")
|
|
|
|
|
|
|
|
// Invalid timestamp
|
|
|
|
f("put aaa timestamp")
|
2020-09-15 23:03:35 +00:00
|
|
|
f("put foobar 3df4 -123456 a=b")
|
2019-05-22 21:16:55 +00:00
|
|
|
|
|
|
|
// Invalid value
|
|
|
|
f("put aaa 123 invalid-value")
|
2020-09-15 23:03:35 +00:00
|
|
|
f("put foobar 789 -123foo456 a=b")
|
2019-05-22 21:16:55 +00:00
|
|
|
|
|
|
|
// Invalid multiline
|
|
|
|
f("put aaa\nbbb 123 34")
|
|
|
|
|
|
|
|
// Invalid tag
|
|
|
|
f("put aaa 123 4.5 foo")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRowsUnmarshalSuccess(t *testing.T) {
|
|
|
|
f := func(s string, rowsExpected *Rows) {
|
|
|
|
t.Helper()
|
|
|
|
var rows Rows
|
2019-08-24 09:54:17 +00:00
|
|
|
rows.Unmarshal(s)
|
2019-05-22 21:16:55 +00:00
|
|
|
if !reflect.DeepEqual(rows.Rows, rowsExpected.Rows) {
|
|
|
|
t.Fatalf("unexpected rows;\ngot\n%+v;\nwant\n%+v", rows.Rows, rowsExpected.Rows)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Try unmarshaling again
|
2019-08-24 09:54:17 +00:00
|
|
|
rows.Unmarshal(s)
|
2019-05-22 21:16:55 +00:00
|
|
|
if !reflect.DeepEqual(rows.Rows, rowsExpected.Rows) {
|
|
|
|
t.Fatalf("unexpected rows;\ngot\n%+v;\nwant\n%+v", rows.Rows, rowsExpected.Rows)
|
|
|
|
}
|
|
|
|
|
|
|
|
rows.Reset()
|
|
|
|
if len(rows.Rows) != 0 {
|
|
|
|
t.Fatalf("non-empty rows after reset: %+v", rows.Rows)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Empty line
|
|
|
|
f("", &Rows{})
|
2019-08-24 09:54:17 +00:00
|
|
|
f("\r", &Rows{})
|
2019-05-22 21:16:55 +00:00
|
|
|
f("\n\n", &Rows{})
|
2019-08-24 09:54:17 +00:00
|
|
|
f("\n\r\n", &Rows{})
|
2019-05-22 21:16:55 +00:00
|
|
|
|
|
|
|
// Single line
|
|
|
|
f("put foobar 789 -123.456 a=b", &Rows{
|
|
|
|
Rows: []Row{{
|
|
|
|
Metric: "foobar",
|
|
|
|
Value: -123.456,
|
|
|
|
Timestamp: 789,
|
|
|
|
Tags: []Tag{{
|
|
|
|
Key: "a",
|
|
|
|
Value: "b",
|
|
|
|
}},
|
|
|
|
}},
|
|
|
|
})
|
2019-08-24 10:35:29 +00:00
|
|
|
// Empty tag
|
|
|
|
f("put foobar 789 -123.456 a= b=c =d", &Rows{
|
2019-05-22 21:16:55 +00:00
|
|
|
Rows: []Row{{
|
|
|
|
Metric: "foobar",
|
|
|
|
Value: -123.456,
|
|
|
|
Timestamp: 789,
|
|
|
|
Tags: []Tag{
|
|
|
|
{
|
|
|
|
Key: "b",
|
|
|
|
Value: "c",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}},
|
|
|
|
})
|
2022-11-09 13:34:02 +00:00
|
|
|
// Missing first tag
|
|
|
|
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3290
|
|
|
|
f("put aaa 123 43", &Rows{
|
2022-11-09 13:32:47 +00:00
|
|
|
Rows: []Row{{
|
2022-11-09 13:34:02 +00:00
|
|
|
Metric: "aaa",
|
|
|
|
Value: 43,
|
|
|
|
Timestamp: 123,
|
2022-11-09 13:32:47 +00:00
|
|
|
}},
|
|
|
|
})
|
2022-11-09 13:34:02 +00:00
|
|
|
f("put aaa 123 43 ", &Rows{
|
|
|
|
Rows: []Row{{
|
|
|
|
Metric: "aaa",
|
|
|
|
Value: 43,
|
|
|
|
Timestamp: 123,
|
|
|
|
}},
|
|
|
|
})
|
|
|
|
|
2019-05-22 21:16:55 +00:00
|
|
|
// Fractional timestamp that is supported by Akumuli.
|
|
|
|
f("put foobar 789.4 -123.456 a=b", &Rows{
|
|
|
|
Rows: []Row{{
|
|
|
|
Metric: "foobar",
|
|
|
|
Value: -123.456,
|
|
|
|
Timestamp: 789,
|
|
|
|
Tags: []Tag{{
|
|
|
|
Key: "a",
|
|
|
|
Value: "b",
|
|
|
|
}},
|
|
|
|
}},
|
|
|
|
})
|
|
|
|
f("put foo.bar 789 123.456 a=b\n", &Rows{
|
|
|
|
Rows: []Row{{
|
|
|
|
Metric: "foo.bar",
|
|
|
|
Value: 123.456,
|
|
|
|
Timestamp: 789,
|
|
|
|
Tags: []Tag{{
|
|
|
|
Key: "a",
|
|
|
|
Value: "b",
|
|
|
|
}},
|
|
|
|
}},
|
|
|
|
})
|
|
|
|
|
|
|
|
// Tags
|
|
|
|
f("put foo 2 1 bar=baz", &Rows{
|
|
|
|
Rows: []Row{{
|
|
|
|
Metric: "foo",
|
|
|
|
Tags: []Tag{{
|
|
|
|
Key: "bar",
|
|
|
|
Value: "baz",
|
|
|
|
}},
|
|
|
|
Value: 1,
|
|
|
|
Timestamp: 2,
|
|
|
|
}},
|
|
|
|
})
|
|
|
|
f("put foo 2 1 bar=baz x=y", &Rows{
|
|
|
|
Rows: []Row{{
|
|
|
|
Metric: "foo",
|
|
|
|
Tags: []Tag{
|
|
|
|
{
|
|
|
|
Key: "bar",
|
|
|
|
Value: "baz",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Key: "x",
|
|
|
|
Value: "y",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Value: 1,
|
|
|
|
Timestamp: 2,
|
|
|
|
}},
|
|
|
|
})
|
|
|
|
f("put foo 2 1 bar=baz=aaa x=y", &Rows{
|
|
|
|
Rows: []Row{{
|
|
|
|
Metric: "foo",
|
|
|
|
Tags: []Tag{
|
|
|
|
{
|
|
|
|
Key: "bar",
|
|
|
|
Value: "baz=aaa",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Key: "x",
|
|
|
|
Value: "y",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
Value: 1,
|
|
|
|
Timestamp: 2,
|
|
|
|
}},
|
|
|
|
})
|
|
|
|
|
|
|
|
// Multi lines
|
|
|
|
f("put foo 2 0.3 a=b\nput bar.baz 43 0.34 a=b\n", &Rows{
|
|
|
|
Rows: []Row{
|
|
|
|
{
|
|
|
|
Metric: "foo",
|
|
|
|
Value: 0.3,
|
|
|
|
Timestamp: 2,
|
|
|
|
Tags: []Tag{{
|
|
|
|
Key: "a",
|
|
|
|
Value: "b",
|
|
|
|
}},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Metric: "bar.baz",
|
|
|
|
Value: 0.34,
|
|
|
|
Timestamp: 43,
|
|
|
|
Tags: []Tag{{
|
|
|
|
Key: "a",
|
|
|
|
Value: "b",
|
|
|
|
}},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
2019-08-24 09:54:17 +00:00
|
|
|
// Multi lines with invalid line
|
|
|
|
f("put foo 2 0.3 a=b\naaa bbb\nput bar.baz 43 0.34 a=b\n", &Rows{
|
|
|
|
Rows: []Row{
|
|
|
|
{
|
|
|
|
Metric: "foo",
|
|
|
|
Value: 0.3,
|
|
|
|
Timestamp: 2,
|
|
|
|
Tags: []Tag{{
|
|
|
|
Key: "a",
|
|
|
|
Value: "b",
|
|
|
|
}},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Metric: "bar.baz",
|
|
|
|
Value: 0.34,
|
|
|
|
Timestamp: 43,
|
|
|
|
Tags: []Tag{{
|
|
|
|
Key: "a",
|
|
|
|
Value: "b",
|
|
|
|
}},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
})
|
2021-08-29 08:38:32 +00:00
|
|
|
|
|
|
|
// Multi spaces
|
|
|
|
f("put foobar 789 -123.456 a=b", &Rows{
|
|
|
|
Rows: []Row{{
|
|
|
|
Metric: "foobar",
|
|
|
|
Value: -123.456,
|
|
|
|
Timestamp: 789,
|
|
|
|
Tags: []Tag{
|
|
|
|
{
|
|
|
|
Key: "a",
|
|
|
|
Value: "b",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}},
|
|
|
|
})
|
|
|
|
f("put foobar 789 -123.456 a=b", &Rows{
|
|
|
|
Rows: []Row{{
|
|
|
|
Metric: "foobar",
|
|
|
|
Value: -123.456,
|
|
|
|
Timestamp: 789,
|
|
|
|
Tags: []Tag{
|
|
|
|
{
|
|
|
|
Key: "a",
|
|
|
|
Value: "b",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}},
|
|
|
|
})
|
|
|
|
f("put foobar 789 -123.456 a=b", &Rows{
|
|
|
|
Rows: []Row{{
|
|
|
|
Metric: "foobar",
|
|
|
|
Value: -123.456,
|
|
|
|
Timestamp: 789,
|
|
|
|
Tags: []Tag{
|
|
|
|
{
|
|
|
|
Key: "a",
|
|
|
|
Value: "b",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}},
|
|
|
|
})
|
|
|
|
f("put foobar 789 -123.456 a=b", &Rows{
|
|
|
|
Rows: []Row{{
|
|
|
|
Metric: "foobar",
|
|
|
|
Value: -123.456,
|
|
|
|
Timestamp: 789,
|
|
|
|
Tags: []Tag{
|
|
|
|
{
|
|
|
|
Key: "a",
|
|
|
|
Value: "b",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}},
|
|
|
|
})
|
|
|
|
f("put foobar 789 -123.456 a=b c=d", &Rows{
|
|
|
|
Rows: []Row{{
|
|
|
|
Metric: "foobar",
|
|
|
|
Value: -123.456,
|
|
|
|
Timestamp: 789,
|
|
|
|
Tags: []Tag{
|
|
|
|
{
|
|
|
|
Key: "a",
|
|
|
|
Value: "b",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Key: "c",
|
|
|
|
Value: "d",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}},
|
|
|
|
})
|
|
|
|
// Soace after tags
|
|
|
|
f("put foobar 789 -123.456 a=b ", &Rows{
|
|
|
|
Rows: []Row{{
|
|
|
|
Metric: "foobar",
|
|
|
|
Value: -123.456,
|
|
|
|
Timestamp: 789,
|
|
|
|
Tags: []Tag{
|
|
|
|
{
|
|
|
|
Key: "a",
|
|
|
|
Value: "b",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}},
|
|
|
|
})
|
|
|
|
|
2019-05-22 21:16:55 +00:00
|
|
|
}
|