Skip to content
This repository has been archived by the owner on Mar 27, 2024. It is now read-only.

Commit

Permalink
logs: support nested json
Browse files Browse the repository at this point in the history
  • Loading branch information
ilyam8 committed Nov 11, 2023
1 parent 25cc818 commit 2e8cda1
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 19 deletions.
55 changes: 36 additions & 19 deletions pkg/logs/json.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,15 @@ func (p *JSONParser) Parse(row []byte, line LogLine) error {
if err != nil {
return err
}

if err := p.parseObject("", val, line); err != nil {
return &ParseError{msg: fmt.Sprintf("json parse: %v", err), err: err}
}

return nil
}

func (p *JSONParser) parseObject(prefix string, val *fastjson.Value, line LogLine) error {
obj, err := val.Object()
if err != nil {
return err
Expand All @@ -55,34 +64,42 @@ func (p *JSONParser) Parse(row []byte, line LogLine) error {
if err != nil {
return
}

switch v.Type() {
case fastjson.TypeString, fastjson.TypeNumber:
err = p.parseStringNumber(jsonObjKey(prefix, string(key)), v, line)
case fastjson.TypeObject:
err = p.parseObject(jsonObjKey(prefix, string(key)), v, line)
default:
return
}
})

name := string(key)
if mapped, ok := p.mapping[name]; ok {
name = mapped
}
return err
}

p.buf = p.buf[:0]
if p.buf = v.MarshalTo(p.buf); len(p.buf) == 0 {
return
}
func jsonObjKey(prefix, key string) string {
if prefix == "" {
return key
}
return prefix + "." + key
}

switch v.Type() {
case fastjson.TypeString:
// trim "
err = line.Assign(name, string(p.buf[1:len(p.buf)-1]))
default:
err = line.Assign(name, string(p.buf))
}
})
if err != nil {
return &ParseError{msg: fmt.Sprintf("json parse: %v", err), err: err}
func (p *JSONParser) parseStringNumber(key string, val *fastjson.Value, line LogLine) error {
if mapped, ok := p.mapping[key]; ok {
key = mapped
}
return nil

p.buf = p.buf[:0]
if p.buf = val.MarshalTo(p.buf); len(p.buf) == 0 {
return nil
}

if val.Type() == fastjson.TypeString {
// trim "
return line.Assign(key, string(p.buf[1:len(p.buf)-1]))
}
return line.Assign(key, string(p.buf))
}

func (p *JSONParser) Info() string {
Expand Down
12 changes: 12 additions & 0 deletions pkg/logs/json_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,18 @@ func TestJSONParser_ReadLine(t *testing.T) {
"FLOAT": "1.1",
},
},
"nested": {
input: `{"one": {"two": 2, "three": {"four": 4}}, "five": 5}`,
config: JSONConfig{Mapping: map[string]string{
"one.two": "mapped_value",
}},
wantErr: false,
wantAssigned: map[string]string{
"mapped_value": "2",
"one.three.four": "4",
"five": "5",
},
},
"error on malformed JSON": {
input: `{ "host"": unquoted_string}`,
wantErr: true,
Expand Down

0 comments on commit 2e8cda1

Please sign in to comment.