fluent-plugin-random 0.0.1

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 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