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 {
|
if result.Tag {
|
||||||
result.DesiredType = "string"
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
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
|
// 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) {
|
func (p *Parser) convertType(input gjson.Result, desiredType string, name string) (interface{}, error) {
|
||||||
switch inputType := input.(type) {
|
switch inputType := input.Value().(type) {
|
||||||
case string:
|
case string:
|
||||||
if desiredType != "string" {
|
if desiredType != "string" {
|
||||||
switch desiredType {
|
switch desiredType {
|
||||||
|
|
@ -537,7 +537,7 @@ func (p *Parser) convertType(input interface{}, desiredType string, name string)
|
||||||
}
|
}
|
||||||
return r, nil
|
return r, nil
|
||||||
case "int":
|
case "int":
|
||||||
r, err := strconv.Atoi(inputType)
|
r, err := strconv.ParseInt(inputType, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("Unable to convert field '%s' to type int: %v", name, err)
|
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":
|
case "string":
|
||||||
return fmt.Sprint(inputType), nil
|
return fmt.Sprint(inputType), nil
|
||||||
case "int":
|
case "int":
|
||||||
return int64(inputType), nil
|
return input.Int(), nil
|
||||||
case "uint":
|
case "uint":
|
||||||
return uint64(inputType), nil
|
return input.Uint(), nil
|
||||||
case "bool":
|
case "bool":
|
||||||
if inputType == 0 {
|
if inputType == 0 {
|
||||||
return false, nil
|
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 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",
|
name: "Test field with null",
|
||||||
test: "null",
|
test: "null",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "Test large numbers (int64, uin64, float64)",
|
||||||
|
test: "large_numbers",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range tests {
|
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