diff --git a/plugins/parsers/json_v2/parser.go b/plugins/parsers/json_v2/parser.go index da128880d..ef8981dff 100644 --- a/plugins/parsers/json_v2/parser.go +++ b/plugins/parsers/json_v2/parser.go @@ -323,7 +323,7 @@ func (p *Parser) expandArray(result MetricNode) ([]MetricNode, error) { if result.Tag { result.DesiredType = "string" } - v, err := p.convertType(result.Value(), result.DesiredType, result.SetName) + v, err := p.convertType(result.Result, result.DesiredType, result.SetName) if err != nil { return nil, err } @@ -525,8 +525,8 @@ func (p *Parser) SetDefaultTags(tags map[string]string) { } // convertType will convert the value parsed from the input JSON to the specified type in the config -func (p *Parser) convertType(input interface{}, desiredType string, name string) (interface{}, error) { - switch inputType := input.(type) { +func (p *Parser) convertType(input gjson.Result, desiredType string, name string) (interface{}, error) { + switch inputType := input.Value().(type) { case string: if desiredType != "string" { switch desiredType { @@ -537,7 +537,7 @@ func (p *Parser) convertType(input interface{}, desiredType string, name string) } return r, nil case "int": - r, err := strconv.Atoi(inputType) + r, err := strconv.ParseInt(inputType, 10, 64) if err != nil { return nil, fmt.Errorf("Unable to convert field '%s' to type int: %v", name, err) } @@ -579,9 +579,9 @@ func (p *Parser) convertType(input interface{}, desiredType string, name string) case "string": return fmt.Sprint(inputType), nil case "int": - return int64(inputType), nil + return input.Int(), nil case "uint": - return uint64(inputType), nil + return input.Uint(), nil case "bool": if inputType == 0 { return false, nil @@ -596,5 +596,5 @@ func (p *Parser) convertType(input interface{}, desiredType string, name string) return nil, fmt.Errorf("unknown format '%T' for field '%s'", inputType, name) } - return input, nil + return input.Value(), nil } diff --git a/plugins/parsers/json_v2/parser_test.go b/plugins/parsers/json_v2/parser_test.go index 50c981c4d..9321d7256 100644 --- a/plugins/parsers/json_v2/parser_test.go +++ b/plugins/parsers/json_v2/parser_test.go @@ -77,6 +77,10 @@ func TestData(t *testing.T) { name: "Test field with null", test: "null", }, + { + name: "Test large numbers (int64, uin64, float64)", + test: "large_numbers", + }, } for _, tc := range tests { diff --git a/plugins/parsers/json_v2/testdata/large_numbers/expected.out b/plugins/parsers/json_v2/testdata/large_numbers/expected.out new file mode 100644 index 000000000..1edb0565f --- /dev/null +++ b/plugins/parsers/json_v2/testdata/large_numbers/expected.out @@ -0,0 +1,3 @@ +file large=4294967296i,larger=9007199254740991i,largest=9223372036854775807i +file large=9007199254740991u,larger=9223372036854775807u,largest=18446744073709551615u +file large=4294967296,larger=4.294967296663e+09,largest=9007199254740991 diff --git a/plugins/parsers/json_v2/testdata/large_numbers/input.json b/plugins/parsers/json_v2/testdata/large_numbers/input.json new file mode 100644 index 000000000..a800d0cd0 --- /dev/null +++ b/plugins/parsers/json_v2/testdata/large_numbers/input.json @@ -0,0 +1,17 @@ +{ + "int": { + "large": 4294967296, + "larger": 9007199254740991, + "largest": 9223372036854775807 + }, + "uint": { + "large": 9007199254740991, + "larger": 9223372036854775807, + "largest": 18446744073709551615 + }, + "float": { + "large": 4294967296, + "larger": 4.294967296663e+09, + "largest": 9007199254740991 + } +} diff --git a/plugins/parsers/json_v2/testdata/large_numbers/telegraf.conf b/plugins/parsers/json_v2/testdata/large_numbers/telegraf.conf new file mode 100644 index 000000000..a0b9736a0 --- /dev/null +++ b/plugins/parsers/json_v2/testdata/large_numbers/telegraf.conf @@ -0,0 +1,22 @@ +[[inputs.file]] + files = ["./testdata/large_numbers/input.json"] + data_format = "json_v2" + [[inputs.file.json_v2]] + [[inputs.file.json_v2.object]] + path = "int" + [inputs.file.json_v2.object.fields] + large = "int" + larger = "int" + largest = "int" + [[inputs.file.json_v2.object]] + path = "uint" + [inputs.file.json_v2.object.fields] + large = "uint" + larger = "uint" + largest = "uint" + [[inputs.file.json_v2.object]] + path = "float" + [inputs.file.json_v2.object.fields] + large = "float" + larger = "float" + largest = "float"