fluent-plugin-random 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 27ff303f3039a2c269455b9654b316cd30fc6c2b
4
+ data.tar.gz: bdb258ea93944217628e46df2f591f424811c634
5
+ SHA512:
6
+ metadata.gz: 8c09b999b03c61be7a1ae1e5794dd172ec965d59ae988ac67ae77d110d2ee31f6b369bbdbc40dd307aeca727f671022e4c070ce7717fbe5030486f964f4db893
7
+ data.tar.gz: 707f0241898c6bf9b78bf376bc9b2b15f1052df1a54fc49c8b7d2ab6b191abbcf0e7f81e690f18d1baec9dd17cebc18735a81e1379e5f878f9a7d6239b8c91ed
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in fluent-plugin-filter_custom_cart.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,47 @@
1
+ fluent-plugin-random
2
+ ====================
3
+
4
+ (Yet another Fluentd plugin)
5
+
6
+ What
7
+ ----
8
+
9
+ Allows to replace generate random value (only in integer at the time of this README) in a the specified key.
10
+
11
+ How
12
+ ---
13
+
14
+ You want to define :
15
+ - Output field : **field**.
16
+ - Integer interval : **integer** (syntax is the Ruby range..syntax)
17
+
18
+ More random type could come in the future (float, string)
19
+
20
+ Examples
21
+ ========
22
+
23
+ Example 0
24
+ ---------
25
+
26
+ ```
27
+ <match *.test>
28
+ type random
29
+ add_tag_prefix random.
30
+ integer 15..100
31
+ field key1
32
+ </match>
33
+ ```
34
+
35
+ Example of records :
36
+ ```
37
+ {
38
+ 'foo' => "bar"
39
+ }
40
+ ```
41
+ ... *can* output :
42
+ ```
43
+ {
44
+ 'key1' => 42,
45
+ 'foo' => "bar"
46
+ }
47
+ ```
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
3
+ require 'rake/testtask'
4
+
5
+ desc 'Default: run test.'
6
+ task :default => :test
7
+
8
+ Rake::TestTask.new(:test) do |test|
9
+ test.libs << 'lib' << 'test'
10
+ test.pattern = 'test/**/test_*.rb'
11
+ test.verbose = true
12
+ end
@@ -0,0 +1,19 @@
1
+ Gem::Specification.new do |spec|
2
+ spec.name = "fluent-plugin-random"
3
+ spec.version = "0.0.1"
4
+ spec.authors = ["Neozaru"]
5
+ spec.email = ["neozaru@mailoo.org"]
6
+ spec.description = %q{Fluentd custom plugin to generate random values}
7
+ spec.summary = %q{Fluentd custom plugin to generate random values}
8
+ spec.homepage = "https://github.com/Neozaru/fluent-plugin-random.git"
9
+ spec.license = "WTFPL"
10
+
11
+ spec.files = `git ls-files`.split($/)
12
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
13
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
14
+ spec.require_paths = ["lib"]
15
+
16
+ spec.add_development_dependency "bundler"
17
+ spec.add_development_dependency "rake"
18
+ spec.add_development_dependency "fluentd"
19
+ end
@@ -0,0 +1,73 @@
1
+ # coding: utf-8
2
+ require "securerandom"
3
+
4
+ module Fluent
5
+ class RandomOutput < Output
6
+ include Fluent::HandleTagNameMixin
7
+
8
+ Fluent::Plugin.register_output('random', self)
9
+
10
+ config_param :integer, :string, :default => nil
11
+ config_param :field, :string, :default => nil
12
+
13
+
14
+ def parse_integer_field(interval)
15
+ lower_upper = interval.split("..", 2).map{|value| Integer(value) }
16
+ if (lower_upper.length != 2 || !lower_upper[0].is_a?(Integer) || !lower_upper[1].is_a?(Integer))
17
+ raise "random: Bad value for 'integer' (value: '#{interval}')"
18
+ end
19
+ return lower_upper
20
+ end
21
+
22
+ def check_valid_interval(lower, upper)
23
+ if (lower >= upper)
24
+ raise "random: Bad interval for 'integer' (#{lower} >= #{upper})"
25
+ end
26
+ end
27
+
28
+
29
+ def configure(conf)
30
+ super
31
+
32
+ if (field.nil? || integer.nil?)
33
+ raise ConfigError, "random: 'field' is required to be set."
34
+ end
35
+
36
+ if (integer.nil?)
37
+ raise ConfigError, "random: 'integer' is required to be set."
38
+ end
39
+
40
+ @integer_interval = parse_integer_field(integer)
41
+ check_valid_interval(@integer_interval[0], @integer_interval[1])
42
+ @field = field
43
+ @random = Random.new()
44
+ end
45
+
46
+ def emit(tag, es, chain)
47
+ es.each { |time, record|
48
+ t = tag.dup
49
+ filter_record(t, time, record)
50
+ Engine.emit(t, time, record)
51
+ }
52
+
53
+ chain.next
54
+ end
55
+
56
+ private
57
+
58
+ def filter_record(tag, time, record)
59
+ super(tag, time, record)
60
+ record[@field] = process()
61
+ end
62
+
63
+ def process()
64
+
65
+ return generate_integer(@integer_interval[0], @integer_interval[1])
66
+ end
67
+
68
+ def generate_integer(lower, upper)
69
+ return @random.rand(lower..upper)
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,120 @@
1
+ # coding: utf-8
2
+
3
+ require 'test_helper'
4
+ require 'fluent/plugin/out_random'
5
+
6
+ class RandomOutputTest < Test::Unit::TestCase
7
+ def setup
8
+ Fluent::Test.setup
9
+ @p = create_driver(%[
10
+ strict true
11
+ add_tag_prefix random.
12
+ field key1
13
+ integer 1..10
14
+ ])
15
+ end
16
+
17
+ def create_driver(conf, tag = 'test')
18
+ Fluent::Test::OutputTestDriver.new(
19
+ Fluent::RandomOutput, tag
20
+ ).configure(conf)
21
+ end
22
+
23
+ def test_unit_parse_integer
24
+ assert_raise do @p.instance.parse_integer_field("") end
25
+ assert_raise do @p.instance.parse_integer_field("1.10") end
26
+ assert_raise do @p.instance.parse_integer_field("1..10,1") end
27
+ assert_raise do @p.instance.parse_integer_field("10") end
28
+ assert_raise do @p.instance.parse_integer_field("1..10..11") end
29
+ assert_raise do @p.instance.parse_integer_field("1..") end
30
+ assert_raise do @p.instance.parse_integer_field("..10") end
31
+ assert_raise do @p.instance.parse_integer_field("foo..10") end
32
+ assert_raise do @p.instance.parse_integer_field("1..bar") end
33
+ assert_raise do @p.instance.parse_integer_field("foo") end
34
+ assert_raise do @p.instance.parse_integer_field("foo..bar") end
35
+
36
+ lower_upper = @p.instance.parse_integer_field("1..10")
37
+ assert_equal 1, lower_upper[0]
38
+ assert_equal 10, lower_upper[1]
39
+
40
+ lower_upper = @p.instance.parse_integer_field("10..1")
41
+ assert_equal 10, lower_upper[0]
42
+ assert_equal 1, lower_upper[1]
43
+
44
+ lower_upper = @p.instance.parse_integer_field("-10000000000..10000000000")
45
+ assert_equal -10000000000, lower_upper[0]
46
+ assert_equal 10000000000, lower_upper[1]
47
+
48
+ lower_upper = @p.instance.parse_integer_field("-1000000000000000000000000000000..1000000000000000000000000000000")
49
+ assert_equal -1000000000000000000000000000000, lower_upper[0]
50
+ assert_equal 1000000000000000000000000000000, lower_upper[1]
51
+ end
52
+
53
+ def test_unit_check_valid_interval()
54
+ assert_raise do @p.instance.check_valid_interval(10,1) end
55
+ assert_raise do @p.instance.check_valid_interval(10,-1) end
56
+
57
+ @p.instance.check_valid_interval(-50,10)
58
+ @p.instance.check_valid_interval(1,10)
59
+ @p.instance.check_valid_interval(-1000000000000000000000000000000, 1000000000000000000000000000000)
60
+ end
61
+
62
+ def test_configure_on_success
63
+ # All set
64
+ d = create_driver(%[
65
+ strict true
66
+ add_tag_prefix random.
67
+ field key1
68
+ integer 1..10
69
+ ])
70
+
71
+ assert_equal 'key1', d.instance.field
72
+ end
73
+
74
+ def test_configure_on_failure
75
+ # when mandatory keys not set
76
+ assert_raise(Fluent::ConfigError) do
77
+ create_driver(%[
78
+ blah blah
79
+ ])
80
+ end
81
+
82
+ # 'field' is missing
83
+ assert_raise(Fluent::ConfigError) do
84
+ create_driver(%[
85
+ add_tag_prefix random.
86
+ integer 1..10
87
+ ])
88
+ end
89
+
90
+ # 'integer' is missing
91
+ assert_raise(Fluent::ConfigError) do
92
+ create_driver(%[
93
+ add_tag_prefix random.
94
+ field key1
95
+ ])
96
+ end
97
+ end
98
+
99
+ def test_emit
100
+ d = create_driver(%[
101
+ add_tag_prefix random.
102
+ field key1
103
+ integer 1..10
104
+ ])
105
+
106
+ record = {
107
+ 'foo' => 'bar'
108
+ }
109
+
110
+ d.run { d.emit(record) }
111
+ emits = d.emits
112
+
113
+ assert_equal 1, emits.count
114
+ assert_equal 'random.test', emits[0][0]
115
+ assert_equal 'bar', emits[0][2]['foo']
116
+ assert_includes 1..10, emits[0][2]['key1']
117
+
118
+ end
119
+
120
+ end
@@ -0,0 +1,19 @@
1
+ require 'test/unit'
2
+
3
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
4
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
5
+
6
+ require 'fluent/test'
7
+
8
+ unless ENV.has_key?('VERBOSE')
9
+ nulllogger = Object.new
10
+ nulllogger.instance_eval {|obj|
11
+ def method_missing(method, *args)
12
+ # pass
13
+ end
14
+ }
15
+ $log = nulllogger
16
+ end
17
+
18
+ class Test::Unit::TestCase
19
+ end
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fluent-plugin-random
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Neozaru
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-02 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: fluentd
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ description: Fluentd custom plugin to generate random values
56
+ email:
57
+ - neozaru@mailoo.org
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - Gemfile
63
+ - README.md
64
+ - Rakefile
65
+ - fluent-plugin-random.gemspec
66
+ - lib/fluent/plugin/out_random.rb
67
+ - test/plugin/test_out_random.rb
68
+ - test/test_helper.rb
69
+ homepage: https://github.com/Neozaru/fluent-plugin-random.git
70
+ licenses:
71
+ - WTFPL
72
+ metadata: {}
73
+ post_install_message:
74
+ rdoc_options: []
75
+ require_paths:
76
+ - lib
77
+ required_ruby_version: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ required_rubygems_version: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ requirements: []
88
+ rubyforge_project:
89
+ rubygems_version: 2.4.5
90
+ signing_key:
91
+ specification_version: 4
92
+ summary: Fluentd custom plugin to generate random values
93
+ test_files:
94
+ - test/plugin/test_out_random.rb
95
+ - test/test_helper.rb