Fix json_v2 parser to handle nested objects in arrays properly (#9479)
This commit is contained in:
parent
b3492fcfa0
commit
1b20680e37
|
|
@ -381,6 +381,7 @@ func (p *Parser) processObjects(objects []JSONObject, input []byte) ([]telegraf.
|
||||||
// If the object has multiple array's as elements it won't comine those, they will remain separate metrics
|
// If the object has multiple array's as elements it won't comine those, they will remain separate metrics
|
||||||
func (p *Parser) combineObject(result MetricNode) ([]MetricNode, error) {
|
func (p *Parser) combineObject(result MetricNode) ([]MetricNode, error) {
|
||||||
var results []MetricNode
|
var results []MetricNode
|
||||||
|
var combineObjectResult []MetricNode
|
||||||
if result.IsArray() || result.IsObject() {
|
if result.IsArray() || result.IsObject() {
|
||||||
var err error
|
var err error
|
||||||
var prevArray bool
|
var prevArray bool
|
||||||
|
|
@ -437,7 +438,7 @@ func (p *Parser) combineObject(result MetricNode) ([]MetricNode, error) {
|
||||||
arrayNode.Tag = tag
|
arrayNode.Tag = tag
|
||||||
if val.IsObject() {
|
if val.IsObject() {
|
||||||
prevArray = false
|
prevArray = false
|
||||||
_, err = p.combineObject(arrayNode)
|
combineObjectResult, err = p.combineObject(arrayNode)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
@ -477,6 +478,12 @@ func (p *Parser) combineObject(result MetricNode) ([]MetricNode, error) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if len(results) == 0 {
|
||||||
|
// If the results are empty, use the results of the call to combine object
|
||||||
|
// This happens with nested objects in array's, see the test array_of_objects
|
||||||
|
results = combineObjectResult
|
||||||
|
}
|
||||||
|
|
||||||
return results, nil
|
return results, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,10 @@ func TestData(t *testing.T) {
|
||||||
name string
|
name string
|
||||||
test string
|
test string
|
||||||
}{
|
}{
|
||||||
|
{
|
||||||
|
name: "Test having an array of objects",
|
||||||
|
test: "array_of_objects",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "Test using just fields and tags",
|
name: "Test using just fields and tags",
|
||||||
test: "fields_and_tags",
|
test: "fields_and_tags",
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,2 @@
|
||||||
|
file properties_mag=5.17
|
||||||
|
file properties_mag=6.2
|
||||||
|
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"features": [
|
||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"mag": 5.17
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"properties": {
|
||||||
|
"mag": 6.2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,9 @@
|
||||||
|
# Example taken from: https://github.com/influxdata/telegraf/issues/5940
|
||||||
|
|
||||||
|
[[inputs.file]]
|
||||||
|
files = ["./testdata/array_of_objects/input.json"]
|
||||||
|
data_format = "json_v2"
|
||||||
|
[[inputs.file.json_v2]]
|
||||||
|
[[inputs.file.json_v2.object]]
|
||||||
|
path = "features"
|
||||||
|
|
||||||
Loading…
Reference in New Issue