Add support for large uint64 and int64 numbers (#9520)
This commit is contained in:
parent
ff8ed37762
commit
2eb0ee2e1e
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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"
|
||||
Loading…
Reference in New Issue