fluent-plugin-json-transform 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +4 -4
- data/README.md +99 -90
- data/fluent-plugin-json-transform.gemspec +20 -20
- data/lib/fluent/plugin/filter_json_transform.rb +29 -0
- data/lib/fluent/plugin/parser_json_transform.rb +37 -32
- data/lib/transform/flatten.rb +26 -26
- data/lib/transform/nothing.rb +5 -5
- metadata +16 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 36c342eeda778ad22180e136d3f489a8dc88f396
|
4
|
+
data.tar.gz: 0c1459d3f96f5d0c47ce96283714b3f398509667
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c62858b9bad3b81f81cfa5e99919f8fa89adc2393ceb3c226827c16244b02a68e69285936a31b86458e5567d5ae7a1ccadfafed7ba1ab5368f89a79e9f1afc27
|
7
|
+
data.tar.gz: c1fa5de9c667ce0fbe34cf0ae5f655953fe31c5b12cbffae813a0de0ce7960e4b9a6ab45e072cc3441a53de57ca2b41542273679c5b18a93f705fb1c15bd2339
|
data/.gitignore
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
*.gem
|
2
|
-
.vagrant/
|
3
|
-
Vagrantfile
|
4
|
-
test.sh
|
1
|
+
*.gem
|
2
|
+
.vagrant/
|
3
|
+
Vagrantfile
|
4
|
+
test.sh
|
data/README.md
CHANGED
@@ -1,90 +1,99 @@
|
|
1
|
-
# JSON Transform parser plugin for Fluentd
|
2
|
-
|
3
|
-
##Overview
|
4
|
-
This is a [parser plugin](http://docs.fluentd.org/articles/parser-plugin-overview) for fluentd. It is **INCOMPATIBLE WITH FLUENTD v0.10.45 AND BELOW.**
|
5
|
-
|
6
|
-
|
7
|
-
It was created for the purpose of modifying [**good.js**](https://github.com/hapijs/good) logs
|
8
|
-
before storing them in Elasticsearch. It may not be useful for any other purpose, but be creative.
|
9
|
-
|
10
|
-
##Installation
|
11
|
-
```bash
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
`
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
"
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
1
|
+
# JSON Transform parser plugin for Fluentd
|
2
|
+
|
3
|
+
##Overview
|
4
|
+
This is a [parser plugin](http://docs.fluentd.org/articles/parser-plugin-overview) for fluentd. It is **INCOMPATIBLE WITH FLUENTD v0.10.45 AND BELOW.**
|
5
|
+
|
6
|
+
|
7
|
+
It was created for the purpose of modifying [**good.js**](https://github.com/hapijs/good) logs
|
8
|
+
before storing them in Elasticsearch. It may not be useful for any other purpose, but be creative.
|
9
|
+
|
10
|
+
##Installation
|
11
|
+
```bash
|
12
|
+
gem install fluent-plugin-json-transform
|
13
|
+
```
|
14
|
+
|
15
|
+
##Configuration
|
16
|
+
```
|
17
|
+
<source>
|
18
|
+
type [tail|tcp|udp|syslog|http] # or a custom input type which accepts the "format" parameter
|
19
|
+
format json_transform
|
20
|
+
transform_script [nothing|flatten|custom]
|
21
|
+
script_path "/home/grayson/transform_script.rb" # ignored if transform_script != custom
|
22
|
+
</source>
|
23
|
+
```
|
24
|
+
|
25
|
+
`transform_script`: `nothing` to do nothing, `flatten` to flatten JSON by concatenating nested keys (see below), or `custom`
|
26
|
+
|
27
|
+
`script_path`: ignored if not using `custom` script. Point this to a Ruby script which implements the `JSONTransformer` class.
|
28
|
+
|
29
|
+
###Flatten script
|
30
|
+
Flattens nested JSON by concatenating nested keys with '.'. Example:
|
31
|
+
|
32
|
+
```
|
33
|
+
{
|
34
|
+
"hello": {
|
35
|
+
"world": true
|
36
|
+
},
|
37
|
+
"goodbye": {
|
38
|
+
"for": {
|
39
|
+
"now": true,
|
40
|
+
"ever": false
|
41
|
+
}
|
42
|
+
}
|
43
|
+
}
|
44
|
+
```
|
45
|
+
|
46
|
+
Becomes
|
47
|
+
|
48
|
+
```
|
49
|
+
{
|
50
|
+
"hello.world": true,
|
51
|
+
"goodbye.for.now": true,
|
52
|
+
"goodbye.for.ever": false
|
53
|
+
}
|
54
|
+
```
|
55
|
+
|
56
|
+
###New Filter Option
|
57
|
+
Filtering is now supported, if you want to flatten your json after doing other parsing from the original source log.
|
58
|
+
```
|
59
|
+
<filter pattern>
|
60
|
+
@type json_transform
|
61
|
+
transform_script [nothing|flatten|custom]
|
62
|
+
script_path "/home/grayson/transform_script.rb" # ignored if transform_script != custom
|
63
|
+
</filter>
|
64
|
+
```
|
65
|
+
|
66
|
+
|
67
|
+
##Implementing JSONTransformer
|
68
|
+
|
69
|
+
The `JSONTransformer` class should have an instance method `transform` which takes a Ruby hash and returns a Ruby hash:
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
# lib/transform/flatten.rb
|
73
|
+
class JSONTransformer
|
74
|
+
def transform(json)
|
75
|
+
return flatten(json, "")
|
76
|
+
end
|
77
|
+
|
78
|
+
def flatten(json, prefix)
|
79
|
+
json.keys.each do |key|
|
80
|
+
if prefix.empty?
|
81
|
+
full_path = key
|
82
|
+
else
|
83
|
+
full_path = [prefix, key].join('.')
|
84
|
+
end
|
85
|
+
|
86
|
+
if json[key].is_a?(Hash)
|
87
|
+
value = json[key]
|
88
|
+
json.delete key
|
89
|
+
json.merge! flatten(value, full_path)
|
90
|
+
else
|
91
|
+
value = json[key]
|
92
|
+
json.delete key
|
93
|
+
json[full_path] = value
|
94
|
+
end
|
95
|
+
end
|
96
|
+
return json
|
97
|
+
end
|
98
|
+
end
|
99
|
+
```
|
@@ -1,20 +1,20 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
Gem::Specification.new do |spec|
|
3
|
-
spec.name = "fluent-plugin-json-transform"
|
4
|
-
spec.version = "0.0.
|
5
|
-
spec.authors = ["Grayson Chao"]
|
6
|
-
spec.email = ["grayson.chao@gmail.com"]
|
7
|
-
spec.description = %q{Input parser plugin which allows arbitrary transformation of input JSON}
|
8
|
-
spec.summary = %q{Input parser plugin which allows arbitrary transformation of input JSON}
|
9
|
-
spec.homepage = "https://github.com/
|
10
|
-
spec.license = "MIT"
|
11
|
-
|
12
|
-
spec.files = `git ls-files`.split($/)
|
13
|
-
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
14
|
-
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
15
|
-
spec.require_paths = ["lib"]
|
16
|
-
|
17
|
-
spec.add_development_dependency "bundler", "~> 1.3"
|
18
|
-
spec.add_development_dependency "rake"
|
19
|
-
spec.add_development_dependency "rspec"
|
20
|
-
end
|
1
|
+
# coding: utf-8
|
2
|
+
Gem::Specification.new do |spec|
|
3
|
+
spec.name = "fluent-plugin-json-transform"
|
4
|
+
spec.version = "0.0.2"
|
5
|
+
spec.authors = ["Grayson Chao","Matthew Jourard"]
|
6
|
+
spec.email = ["grayson.chao@gmail.com","mjourard@gmail.com"]
|
7
|
+
spec.description = %q{Input parser plugin which allows arbitrary transformation of input JSON}
|
8
|
+
spec.summary = %q{Input parser plugin which allows arbitrary transformation of input JSON}
|
9
|
+
spec.homepage = "https://github.com/mjourard/fluent-plugin-json-transform/"
|
10
|
+
spec.license = "MIT"
|
11
|
+
|
12
|
+
spec.files = `git ls-files`.split($/)
|
13
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
14
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
15
|
+
spec.require_paths = ["lib"]
|
16
|
+
|
17
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
18
|
+
spec.add_development_dependency "rake"
|
19
|
+
spec.add_development_dependency "rspec"
|
20
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Fluent
|
2
|
+
class JSONTransformFilter < Filter
|
3
|
+
Fluent::Plugin.register_filter('json_transform', self)
|
4
|
+
|
5
|
+
DEFAULTS = [ 'nothing', 'flatten' ]
|
6
|
+
|
7
|
+
include Configurable
|
8
|
+
config_param :transform_script, :string
|
9
|
+
config_param :script_path, :string
|
10
|
+
|
11
|
+
def configure(conf)
|
12
|
+
@transform_script = conf['transform_script']
|
13
|
+
|
14
|
+
if DEFAULTS.include?(@transform_script)
|
15
|
+
@transform_script = "#{__dir__}/../../transform/#{@transform_script}.rb"
|
16
|
+
elsif @transform_script == 'custom'
|
17
|
+
@transform_script = conf['script_path']
|
18
|
+
end
|
19
|
+
|
20
|
+
require @transform_script
|
21
|
+
@transformer = JSONTransformer.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def filter(tag, time, record)
|
25
|
+
flattened = @transformer.transform(record)
|
26
|
+
return flattened
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -1,32 +1,37 @@
|
|
1
|
-
module Fluent
|
2
|
-
class TextParser
|
3
|
-
class JSONTransformParser
|
4
|
-
DEFAULTS = [ 'nothing', 'flatten' ]
|
5
|
-
|
6
|
-
include Configurable
|
7
|
-
config_param :transform_script, :string
|
8
|
-
config_param :script_path, :string
|
9
|
-
|
10
|
-
def configure(conf)
|
11
|
-
@transform_script = conf['transform_script']
|
12
|
-
|
13
|
-
if DEFAULTS.include?(@transform_script)
|
14
|
-
@transform_script =
|
15
|
-
"#{__dir__}/../../transform/#{@transform_script}.rb"
|
16
|
-
elsif @transform_script == 'custom'
|
17
|
-
@transform_script = conf['script_path']
|
18
|
-
end
|
19
|
-
|
20
|
-
require @transform_script
|
21
|
-
@transformer = JSONTransformer.new
|
22
|
-
end
|
23
|
-
|
24
|
-
def call(text)
|
25
|
-
raw_json = JSON.parse(text)
|
26
|
-
return nil, @transformer.transform(raw_json)
|
27
|
-
end
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
1
|
+
module Fluent
|
2
|
+
class TextParser
|
3
|
+
class JSONTransformParser
|
4
|
+
DEFAULTS = [ 'nothing', 'flatten' ]
|
5
|
+
|
6
|
+
include Configurable
|
7
|
+
config_param :transform_script, :string
|
8
|
+
config_param :script_path, :string
|
9
|
+
|
10
|
+
def configure(conf)
|
11
|
+
@transform_script = conf['transform_script']
|
12
|
+
|
13
|
+
if DEFAULTS.include?(@transform_script)
|
14
|
+
@transform_script =
|
15
|
+
"#{__dir__}/../../transform/#{@transform_script}.rb"
|
16
|
+
elsif @transform_script == 'custom'
|
17
|
+
@transform_script = conf['script_path']
|
18
|
+
end
|
19
|
+
|
20
|
+
require @transform_script
|
21
|
+
@transformer = JSONTransformer.new
|
22
|
+
end
|
23
|
+
|
24
|
+
def call(text)
|
25
|
+
raw_json = JSON.parse(text)
|
26
|
+
return nil, @transformer.transform(raw_json)
|
27
|
+
end
|
28
|
+
|
29
|
+
def parse(text)
|
30
|
+
raw_json = JSON.parse(text)
|
31
|
+
return nil, @transformer.transform(raw_json)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
register_template("json_transform", Proc.new { JSONTransformParser.new })
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
data/lib/transform/flatten.rb
CHANGED
@@ -1,26 +1,26 @@
|
|
1
|
-
class JSONTransformer
|
2
|
-
def transform(json)
|
3
|
-
return flatten(json, "")
|
4
|
-
end
|
5
|
-
|
6
|
-
def flatten(json, prefix)
|
7
|
-
json.keys.each do |key|
|
8
|
-
if prefix.empty?
|
9
|
-
full_path = key
|
10
|
-
else
|
11
|
-
full_path = [prefix, key].join('.')
|
12
|
-
end
|
13
|
-
|
14
|
-
if json[key].is_a?(Hash)
|
15
|
-
value = json[key]
|
16
|
-
json.delete key
|
17
|
-
json.merge! flatten(value, full_path)
|
18
|
-
else
|
19
|
-
value = json[key]
|
20
|
-
json.delete key
|
21
|
-
json[full_path] = value
|
22
|
-
end
|
23
|
-
end
|
24
|
-
return json
|
25
|
-
end
|
26
|
-
end
|
1
|
+
class JSONTransformer
|
2
|
+
def transform(json)
|
3
|
+
return flatten(json, "")
|
4
|
+
end
|
5
|
+
|
6
|
+
def flatten(json, prefix)
|
7
|
+
json.keys.each do |key|
|
8
|
+
if prefix.empty?
|
9
|
+
full_path = key
|
10
|
+
else
|
11
|
+
full_path = [prefix, key].join('.')
|
12
|
+
end
|
13
|
+
|
14
|
+
if json[key].is_a?(Hash)
|
15
|
+
value = json[key]
|
16
|
+
json.delete key
|
17
|
+
json.merge! flatten(value, full_path)
|
18
|
+
else
|
19
|
+
value = json[key]
|
20
|
+
json.delete key
|
21
|
+
json[full_path] = value
|
22
|
+
end
|
23
|
+
end
|
24
|
+
return json
|
25
|
+
end
|
26
|
+
end
|
data/lib/transform/nothing.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
class JSONTransformer
|
2
|
-
def transform(json)
|
3
|
-
return json
|
4
|
-
end
|
5
|
-
end
|
1
|
+
class JSONTransformer
|
2
|
+
def transform(json)
|
3
|
+
return json
|
4
|
+
end
|
5
|
+
end
|
metadata
CHANGED
@@ -1,71 +1,74 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-json-transform
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Grayson Chao
|
8
|
+
- Matthew Jourard
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date:
|
12
|
+
date: 2016-07-27 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: bundler
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
16
17
|
requirements:
|
17
|
-
- - ~>
|
18
|
+
- - "~>"
|
18
19
|
- !ruby/object:Gem::Version
|
19
20
|
version: '1.3'
|
20
21
|
type: :development
|
21
22
|
prerelease: false
|
22
23
|
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
|
-
- - ~>
|
25
|
+
- - "~>"
|
25
26
|
- !ruby/object:Gem::Version
|
26
27
|
version: '1.3'
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
29
|
name: rake
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
|
-
- -
|
32
|
+
- - ">="
|
32
33
|
- !ruby/object:Gem::Version
|
33
34
|
version: '0'
|
34
35
|
type: :development
|
35
36
|
prerelease: false
|
36
37
|
version_requirements: !ruby/object:Gem::Requirement
|
37
38
|
requirements:
|
38
|
-
- -
|
39
|
+
- - ">="
|
39
40
|
- !ruby/object:Gem::Version
|
40
41
|
version: '0'
|
41
42
|
- !ruby/object:Gem::Dependency
|
42
43
|
name: rspec
|
43
44
|
requirement: !ruby/object:Gem::Requirement
|
44
45
|
requirements:
|
45
|
-
- -
|
46
|
+
- - ">="
|
46
47
|
- !ruby/object:Gem::Version
|
47
48
|
version: '0'
|
48
49
|
type: :development
|
49
50
|
prerelease: false
|
50
51
|
version_requirements: !ruby/object:Gem::Requirement
|
51
52
|
requirements:
|
52
|
-
- -
|
53
|
+
- - ">="
|
53
54
|
- !ruby/object:Gem::Version
|
54
55
|
version: '0'
|
55
56
|
description: Input parser plugin which allows arbitrary transformation of input JSON
|
56
57
|
email:
|
57
58
|
- grayson.chao@gmail.com
|
59
|
+
- mjourard@gmail.com
|
58
60
|
executables: []
|
59
61
|
extensions: []
|
60
62
|
extra_rdoc_files: []
|
61
63
|
files:
|
62
|
-
- .gitignore
|
64
|
+
- ".gitignore"
|
63
65
|
- README.md
|
64
66
|
- fluent-plugin-json-transform.gemspec
|
67
|
+
- lib/fluent/plugin/filter_json_transform.rb
|
65
68
|
- lib/fluent/plugin/parser_json_transform.rb
|
66
69
|
- lib/transform/flatten.rb
|
67
70
|
- lib/transform/nothing.rb
|
68
|
-
homepage: https://github.com/
|
71
|
+
homepage: https://github.com/mjourard/fluent-plugin-json-transform/
|
69
72
|
licenses:
|
70
73
|
- MIT
|
71
74
|
metadata: {}
|
@@ -75,17 +78,17 @@ require_paths:
|
|
75
78
|
- lib
|
76
79
|
required_ruby_version: !ruby/object:Gem::Requirement
|
77
80
|
requirements:
|
78
|
-
- -
|
81
|
+
- - ">="
|
79
82
|
- !ruby/object:Gem::Version
|
80
83
|
version: '0'
|
81
84
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
85
|
requirements:
|
83
|
-
- -
|
86
|
+
- - ">="
|
84
87
|
- !ruby/object:Gem::Version
|
85
88
|
version: '0'
|
86
89
|
requirements: []
|
87
90
|
rubyforge_project:
|
88
|
-
rubygems_version: 2.
|
91
|
+
rubygems_version: 2.5.1
|
89
92
|
signing_key:
|
90
93
|
specification_version: 4
|
91
94
|
summary: Input parser plugin which allows arbitrary transformation of input JSON
|