app/vminsert/opentsdbhttp: allow timestamp as float64 and as string, since it occurs in real life

This commit is contained in:
Aliaksandr Valialkin 2019-08-23 18:35:11 +03:00
parent 0ea21eb9dc
commit 8da8dd0876
2 changed files with 29 additions and 5 deletions

View file

@ -65,7 +65,7 @@ func (r *Row) unmarshal(o *fastjson.Value, tagsPool []Tag) ([]Tag, error) {
rawTs := o.Get("timestamp") rawTs := o.Get("timestamp")
if rawTs != nil { if rawTs != nil {
ts, err := rawTs.Int64() ts, err := getFloat64(rawTs)
if err != nil { if err != nil {
return tagsPool, fmt.Errorf("invalid `timestamp` in %s: %s", o, err) return tagsPool, fmt.Errorf("invalid `timestamp` in %s: %s", o, err)
} }
@ -80,7 +80,7 @@ func (r *Row) unmarshal(o *fastjson.Value, tagsPool []Tag) ([]Tag, error) {
if rawV == nil { if rawV == nil {
return tagsPool, fmt.Errorf("missing `value` in %s", o) return tagsPool, fmt.Errorf("missing `value` in %s", o)
} }
v, err := getValue(rawV) v, err := getFloat64(rawV)
if err != nil { if err != nil {
return tagsPool, fmt.Errorf("invalid `value` in %s: %s", o, err) return tagsPool, fmt.Errorf("invalid `value` in %s: %s", o, err)
} }
@ -106,7 +106,7 @@ func (r *Row) unmarshal(o *fastjson.Value, tagsPool []Tag) ([]Tag, error) {
return tagsPool, nil return tagsPool, nil
} }
func getValue(v *fastjson.Value) (float64, error) { func getFloat64(v *fastjson.Value) (float64, error) {
switch v.Type() { switch v.Type() {
case fastjson.TypeNumber: case fastjson.TypeNumber:
return v.Float64() return v.Float64()

View file

@ -54,8 +54,8 @@ func TestRowsUnmarshalFailure(t *testing.T) {
// Invalid timestamp type // Invalid timestamp type
f(`{"metric": "aaa", "timestamp": "foobar", "value": 0.45, "tags": {"foo": "bar"}}`) f(`{"metric": "aaa", "timestamp": "foobar", "value": 0.45, "tags": {"foo": "bar"}}`)
f(`{"metric": "aaa", "timestamp": 123.456, "value": 0.45, "tags": {"foo": "bar"}}`) f(`{"metric": "aaa", "timestamp": [1,2], "value": 0.45, "tags": {"foo": "bar"}}`)
f(`{"metric": "aaa", "timestamp": "123", "value": 0.45, "tags": {"foo": "bar"}}`) f(`{"metric": "aaa", "timestamp": {"a":1}, "value": 0.45, "tags": {"foo": "bar"}}`)
// Invalid value type // Invalid value type
f(`{"metric": "aaa", "timestamp": 1122, "value": [0,1], "tags": {"foo":"bar"}}`) f(`{"metric": "aaa", "timestamp": 1122, "value": [0,1], "tags": {"foo":"bar"}}`)
@ -120,6 +120,30 @@ func TestRowsUnmarshalSuccess(t *testing.T) {
}}, }},
}}, }},
}) })
// Timestamp as string
f(`{"metric": "foobar", "timestamp": "1789", "value": -123.456, "tags": {"a":"b"}}`, &Rows{
Rows: []Row{{
Metric: "foobar",
Value: -123.456,
Timestamp: 1789,
Tags: []Tag{{
Key: "a",
Value: "b",
}},
}},
})
// Timestamp as float64 (it is truncated to integer)
f(`{"metric": "foobar", "timestamp": 17.89, "value": -123.456, "tags": {"a":"b"}}`, &Rows{
Rows: []Row{{
Metric: "foobar",
Value: -123.456,
Timestamp: 17,
Tags: []Tag{{
Key: "a",
Value: "b",
}},
}},
})
// Empty tags // Empty tags
f(`{"metric": "foobar", "timestamp": 789, "value": -123.456, "tags": {}}`, &Rows{ f(`{"metric": "foobar", "timestamp": 789, "value": -123.456, "tags": {}}`, &Rows{
Rows: []Row{{ Rows: []Row{{