fluent-plugin-script_append 0.0.1 → 0.1.0
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/README.md +44 -10
- data/lib/fluent/plugin/out_script_append.rb +21 -9
- data/lib/fluent/plugin/script_append/version.rb +1 -1
- data/test/plugin/test_out_script_append.rb +89 -8
- data/wercker.yml +16 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4de353b594ee8b985c00c7a4e00f007aec9b8ade
|
4
|
+
data.tar.gz: 59e139968b6ef81edeeac4062b400526b29a275b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28cb5c8fd6e11e1e67fd86f3a8b43d4ece148b1b15d708fd61f03951fc5460bc76fed0e8a40443209934d5c2e756dc6b39f43ed909f67614e2641ca3cfebea91
|
7
|
+
data.tar.gz: e5eb2819657bd7038f0e7a4c4f99a4af537420d4ab9324ba6d28d33c5c00d42475c69b3fd7a042df65c91f5420fa91aa0dc092acd58e5519d7c4434f3bdd6671
|
data/README.md
CHANGED
@@ -1,26 +1,60 @@
|
|
1
1
|
# Fluent::Plugin::ScriptAppend
|
2
2
|
|
3
|
-
|
3
|
+
A fluent plugin to add script-run result to existing json data
|
4
|
+
|
5
|
+
[](https://app.wercker.com/project/bykey/56186aa7c9f166ffea49aba97971e40d)
|
4
6
|
|
5
7
|
## Installation
|
6
8
|
|
7
|
-
|
9
|
+
Install it yourself as:
|
10
|
+
|
11
|
+
$ fluent-gem install fluent-plugin-script_append
|
8
12
|
|
9
|
-
|
10
|
-
|
13
|
+
## Usage
|
14
|
+
|
15
|
+
```conf
|
16
|
+
<match access.foo>
|
17
|
+
type script_append
|
18
|
+
# currently only ruby supported
|
19
|
+
language ruby
|
20
|
+
run_script record['one'].to_i + record['two'].to_i
|
21
|
+
key three
|
22
|
+
</match>
|
11
23
|
```
|
12
24
|
|
13
|
-
|
25
|
+
Input:
|
14
26
|
|
15
|
-
|
27
|
+
```json
|
28
|
+
{
|
29
|
+
"one" : 1,
|
30
|
+
"two" : 2
|
31
|
+
}
|
32
|
+
```
|
16
33
|
|
17
|
-
|
34
|
+
Then get emitted:
|
18
35
|
|
19
|
-
|
36
|
+
```json
|
37
|
+
{
|
38
|
+
"one" : 1,
|
39
|
+
"two" : 2,
|
40
|
+
"three" : 3
|
41
|
+
}
|
42
|
+
```
|
20
43
|
|
21
|
-
##
|
44
|
+
## Parameters
|
45
|
+
|
46
|
+
* `key`, A key for added record to use in json. Required
|
47
|
+
* `language`, A language of script, default to ruby, available: `ruby, sh(ell)`
|
48
|
+
* In `language ruby`, the record to add is the value of specified expression
|
49
|
+
* In `language shell`, the record to add is the stdout of specified shell script
|
50
|
+
* `run_script`, A script for generating data. Required
|
51
|
+
* `record_var_name`, A variable name for original json data in `ruby` script. Default to `record`
|
52
|
+
* `new_tag`, A tag name to use in new emissions
|
53
|
+
* `prefix`, A tag prefix to add original tag in new emissions. `new_tag` or `prefix` is required
|
54
|
+
|
55
|
+
## See also
|
22
56
|
|
23
|
-
|
57
|
+
* https://github.com/ephemeralsnow/fluent-plugin-eval-filter
|
24
58
|
|
25
59
|
## Contributing
|
26
60
|
|
@@ -4,11 +4,13 @@ class Fluent::ScriptAppendOutput < Fluent::Output
|
|
4
4
|
|
5
5
|
config_param :key, :string, :default => nil
|
6
6
|
config_param :language, :string, :default => 'ruby'
|
7
|
-
config_param :run_script, :string, :default =>
|
7
|
+
config_param :run_script, :string, :default => nil
|
8
8
|
config_param :record_var_name, :string, :default => 'record'
|
9
9
|
config_param :new_tag, :string, :default => nil
|
10
10
|
config_param :prefix, :string, :default => nil
|
11
11
|
|
12
|
+
SUPPORTED_SCRIPT_NAME = %w(ruby sh shell)
|
13
|
+
|
12
14
|
def configure(conf)
|
13
15
|
super
|
14
16
|
ensure_param_set!(:key, @key)
|
@@ -17,16 +19,26 @@ class Fluent::ScriptAppendOutput < Fluent::Output
|
|
17
19
|
|
18
20
|
@script_runner = Object.new
|
19
21
|
|
20
|
-
|
21
|
-
if @language != 'ruby'
|
22
|
+
unless SUPPORTED_SCRIPT_NAME.include? @language
|
22
23
|
warn "Plugin out_script_append would not accept 'language' value other than 'ruby'. Ignoring."
|
24
|
+
@language = 'ruby'
|
23
25
|
end
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
case @language
|
28
|
+
when 'ruby'
|
29
|
+
eval <<-RUBY
|
30
|
+
def @script_runner.run(#{@record_var_name})
|
31
|
+
#{@run_script}
|
32
|
+
end
|
33
|
+
RUBY
|
34
|
+
when 'sh', 'shell'
|
35
|
+
script = @run_script.gsub(/`/, '\\\`')
|
36
|
+
eval <<-RUBY
|
37
|
+
def @script_runner.run(*)
|
38
|
+
`#{@run_script}`
|
39
|
+
end
|
40
|
+
RUBY
|
41
|
+
end
|
30
42
|
end
|
31
43
|
|
32
44
|
def emit(tag, event_stream, chain)
|
@@ -49,7 +61,7 @@ class Fluent::ScriptAppendOutput < Fluent::Output
|
|
49
61
|
|
50
62
|
def ensure_param_set!(name, value)
|
51
63
|
unless value
|
52
|
-
raise "#{name} must be set"
|
64
|
+
raise Fluent::ConfigError, "#{name} must be set"
|
53
65
|
end
|
54
66
|
end
|
55
67
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'helper'
|
2
2
|
|
3
3
|
class ScriptAppendOutputTest < Test::Unit::TestCase
|
4
|
-
def create_driver(conf
|
4
|
+
def create_driver(conf, tag='test')
|
5
5
|
Fluent::Test::OutputTestDriver.new(Fluent::ScriptAppendOutput, tag).configure(conf)
|
6
6
|
end
|
7
7
|
|
@@ -16,20 +16,54 @@ class ScriptAppendOutputTest < Test::Unit::TestCase
|
|
16
16
|
new_tag test.result
|
17
17
|
FLUENTD
|
18
18
|
|
19
|
+
def config_with_run_script(script)
|
20
|
+
CONFIG_DEFAULT.sub(
|
21
|
+
/^ +run_script.*$/,
|
22
|
+
"run_script #{script}"
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
19
26
|
test 'configure' do
|
20
27
|
d = create_driver CONFIG_DEFAULT
|
21
28
|
assert_equal "sample", d.instance.config['key']
|
22
29
|
assert_equal '"Hello, World"', d.instance.config['run_script']
|
23
30
|
end
|
24
31
|
|
25
|
-
test '
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
+
test 'invalid config' do
|
33
|
+
assert_raise Fluent::ConfigError do
|
34
|
+
create_driver <<-FLUENTD
|
35
|
+
language ruby
|
36
|
+
run_script "Hello, World"
|
37
|
+
new_tag test.result
|
38
|
+
FLUENTD
|
39
|
+
end
|
40
|
+
|
41
|
+
assert_raise Fluent::ConfigError do
|
42
|
+
create_driver <<-FLUENTD
|
43
|
+
key invakid
|
44
|
+
language ruby
|
45
|
+
new_tag test.result
|
46
|
+
FLUENTD
|
47
|
+
end
|
48
|
+
|
49
|
+
assert_raise Fluent::ConfigError do
|
50
|
+
create_driver <<-FLUENTD
|
51
|
+
key invakid
|
52
|
+
language ruby
|
53
|
+
run_script "Hello, World"
|
54
|
+
FLUENTD
|
55
|
+
end
|
56
|
+
|
57
|
+
assert_nothing_raised do
|
58
|
+
create_driver <<-FLUENTD
|
59
|
+
key invalid
|
60
|
+
run_script "Hello, World"
|
61
|
+
new_tag test.result
|
62
|
+
FLUENTD
|
63
|
+
end
|
64
|
+
end
|
32
65
|
|
66
|
+
test 'appends a result' do
|
33
67
|
d = create_driver CONFIG_DEFAULT, 'input.access'
|
34
68
|
d.run do
|
35
69
|
d.emit({'domain' => 'www.google.com', 'path' => '/foo/bar?key=value', 'agent' => 'Googlebot', 'response_time' => 1000000})
|
@@ -39,4 +73,51 @@ class ScriptAppendOutputTest < Test::Unit::TestCase
|
|
39
73
|
assert_equal 'test.result', emits[0][0]
|
40
74
|
assert_equal 'Hello, World', emits[0][2]['sample']
|
41
75
|
end
|
76
|
+
|
77
|
+
test 'appends a result using record' do
|
78
|
+
d = create_driver config_with_run_script("record['one'].to_i + record['two'].to_i")
|
79
|
+
d.run do
|
80
|
+
d.emit({'one' => 1, 'two' => 2})
|
81
|
+
end
|
82
|
+
|
83
|
+
emits = d.emits
|
84
|
+
assert_equal 'test.result', emits[0][0]
|
85
|
+
assert_equal 3, emits[0][2]['sample']
|
86
|
+
end
|
87
|
+
|
88
|
+
test 'appends with prefix' do
|
89
|
+
d = create_driver CONFIG_DEFAULT.sub(/new_tag.*$/m, 'prefix the_prefix'), 'with_suffix'
|
90
|
+
d.run do
|
91
|
+
d.emit({'domain' => 'www.google.com', 'path' => '/foo/bar?key=value', 'agent' => 'Googlebot', 'response_time' => 1000000})
|
92
|
+
end
|
93
|
+
|
94
|
+
emits = d.emits
|
95
|
+
assert_equal 'the_prefix.with_suffix', emits[0][0]
|
96
|
+
assert_equal 'Hello, World', emits[0][2]['sample']
|
97
|
+
end
|
98
|
+
|
99
|
+
test 'customizes variable name in script' do
|
100
|
+
d = create_driver \
|
101
|
+
config_with_run_script("data['one'].to_i + data['two'].to_i * 10").
|
102
|
+
sub(/\z/, "\n record_var_name data")
|
103
|
+
d.run do
|
104
|
+
d.emit({'one' => 1, 'two' => 2})
|
105
|
+
end
|
106
|
+
|
107
|
+
emits = d.emits
|
108
|
+
assert_equal 21, emits[0][2]['sample']
|
109
|
+
end
|
110
|
+
|
111
|
+
test 'runs shell via Kernel#`' do
|
112
|
+
d = create_driver \
|
113
|
+
config_with_run_script(%{echo "Hello world via shell"}).
|
114
|
+
sub(/language.*$/, "language shell")
|
115
|
+
|
116
|
+
d.run do
|
117
|
+
d.emit({'domain' => 'www.google.com', 'path' => '/foo/bar?key=value', 'agent' => 'Googlebot', 'response_time' => 1000000})
|
118
|
+
end
|
119
|
+
|
120
|
+
emits = d.emits
|
121
|
+
assert_equal "Hello world via shell\n", emits[0][2]['sample']
|
122
|
+
end
|
42
123
|
end
|
data/wercker.yml
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
box: wercker/rvm
|
2
|
+
build:
|
3
|
+
steps:
|
4
|
+
- rvm-use:
|
5
|
+
version: ruby-2.1.5
|
6
|
+
- bundle-install
|
7
|
+
- script:
|
8
|
+
name: run test-unit
|
9
|
+
code: bundle exec rake test
|
10
|
+
|
11
|
+
- rvm-use:
|
12
|
+
version: ruby-2.0.0-p598
|
13
|
+
- bundle-install
|
14
|
+
- script:
|
15
|
+
name: run test-unit
|
16
|
+
code: bundle exec rake test
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fluent-plugin-script_append
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Uchio KONDO
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fluentd
|
@@ -126,6 +126,7 @@ files:
|
|
126
126
|
- lib/fluent/plugin/script_append/version.rb
|
127
127
|
- test/helper.rb
|
128
128
|
- test/plugin/test_out_script_append.rb
|
129
|
+
- wercker.yml
|
129
130
|
homepage: https://github.com/udzura/fluent-plugin-script_append
|
130
131
|
licenses:
|
131
132
|
- Apache 2.0
|