Add support for large uint64 and int64 numbers (#9520)

This commit is contained in:
Alexander Krantz 2021-07-19 20:23:12 -07:00 committed by GitHub
parent ff8ed37762
commit 2eb0ee2e1e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 53 additions and 7 deletions

View File

@ -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
}

View File

@ -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 {

View File

@ -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

View File

@ -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
}
}

View File

@ -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"