fluent-plugin-fork 0.1.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b0dce65d094e236ecdfd6e71531876c6fb0ec1d0
4
- data.tar.gz: d4d2923c986719fdab2afad5db7be8aac868fd82
3
+ metadata.gz: 396b07f3000837ee1b5857b7882e74891f3e4142
4
+ data.tar.gz: e5916c1b9cb4a13785872846e2078bc9a158511f
5
5
  SHA512:
6
- metadata.gz: 396e2a955d81dc5afdd82a051426a817da5f8e2e4c54716f8cc74fa1dc556c04e7692e3f58d83182e20ffd8407b1e4f62e459c8fda006ac4f38cdc570e94b456
7
- data.tar.gz: 97cdc9fde08efdbc683401a38016ffb8616250d7abce6d292d4cc9e58b2b89c6fda102cc64b2497ad7d19b410424465ce33e90a9fcd3b38616ee26c444a849b8
6
+ metadata.gz: e8dc76716c13d43aceefd791d32f988599dd0a98d33940e58ddaf6dc842be4e8df4792cf9ce52812d38dde9f0f9106f62c36b2e43ed67f7a8c5668970ce08c6b
7
+ data.tar.gz: 2e478c2e49328dead0aee9517c5c140279f35071b9adcb0c1fef5288404ac87acb93228ad4e64dd2cc6693afb4131862a8cb1e044a8ddf83c9a587b4ae960db8
@@ -7,18 +7,9 @@ rvm:
7
7
  - 2.4.1
8
8
  gemfile:
9
9
  - gemfiles/gemfile
10
- - gemfiles/fluentd.0.10.42.gemfile
11
10
 
12
11
  script: "bundle exec rake spec"
13
12
 
14
13
  branches:
15
14
  only:
16
15
  - master
17
- matrix:
18
- exclude:
19
- - rvm: 2.2
20
- gemfile: gemfiles/fluentd.0.10.42.gemfile
21
- - rvm: 2.3.4
22
- gemfile: gemfiles/fluentd.0.10.42.gemfile
23
- - rvm: 2.4.1
24
- gemfile: gemfiles/fluentd.0.10.42.gemfile
data/README.md CHANGED
@@ -20,6 +20,13 @@ to
20
20
  {"id": "1", "key": "2", "segments": "3"}
21
21
  ```
22
22
 
23
+ ## Requirements
24
+
25
+ | fluent-plugin-fork | Fluentd | Ruby |
26
+ |--------------------|------------------|--------|
27
+ | >= 0.2.0 | >= v0.14, < v2.0 | >= 2.1 |
28
+ | < 0.2.0 | <= v0.14 | >= 1.9 |
29
+
23
30
  ## Installation
24
31
 
25
32
  ### td-agent(Linux)
@@ -2,7 +2,7 @@ $:.push File.expand_path('../lib', __FILE__)
2
2
 
3
3
  Gem::Specification.new do |gem|
4
4
  gem.name = "fluent-plugin-fork"
5
- gem.version = "0.1.5"
5
+ gem.version = "0.2.0"
6
6
  gem.authors = ["Daisuke Taniwaki"]
7
7
  gem.email = "daisuketaniwaki@gmail.com"
8
8
  gem.homepage = "https://github.com/dtaniwaki/fluent-plugin-fork"
@@ -15,7 +15,7 @@ Gem::Specification.new do |gem|
15
15
  gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
16
  gem.require_paths = ['lib']
17
17
 
18
- gem.add_runtime_dependency "fluentd", [">= 0.10.0", "< 2"]
18
+ gem.add_runtime_dependency "fluentd", [">= 0.14.0", "< 2"]
19
19
  gem.add_development_dependency "rake"
20
20
  gem.add_development_dependency "rspec"
21
21
  gem.add_development_dependency "coveralls"
@@ -1,16 +1,12 @@
1
- module Fluent
1
+ require 'fluent/plugin/output'
2
+
3
+ module Fluent::Plugin
2
4
  class ForkOutput < Output
3
5
  class MaxForkSizeError < StandardError; end
4
6
 
5
7
  Fluent::Plugin.register_output('fork', self)
6
8
 
7
- unless method_defined?(:log)
8
- define_method(:log) { $log }
9
- end
10
-
11
- unless method_defined?(:router)
12
- define_method(:router) { Fluent::Engine }
13
- end
9
+ helpers :event_emitter
14
10
 
15
11
  def initialize
16
12
  super
@@ -33,7 +29,7 @@ module Fluent
33
29
  raise Fluent::ConfigError, "max_fallback must be one of #{fallbacks.inspect}" unless fallbacks.include?(@max_fallback)
34
30
  end
35
31
 
36
- def emit(tag, es, chain)
32
+ def process(tag, es)
37
33
  es.each do |time, record|
38
34
  org_value = record[@fork_key]
39
35
  if org_value.nil?
@@ -76,8 +72,6 @@ module Fluent
76
72
  end
77
73
  rescue => e
78
74
  log.error "#{e.message}: #{e.backtrace.join(', ')}"
79
- ensure
80
- chain.next
81
75
  end
82
76
  end
83
77
  end
@@ -1,11 +1,13 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Fluent::ForkOutput do
3
+ describe Fluent::Plugin::ForkOutput do
4
+ include Fluent::Test::Helpers
5
+
4
6
  let(:tag) { "test.fork" }
5
7
  let(:required_params) { {output_tag: 'ot', output_key: 'ok', fork_key: 'sk'} }
6
8
  let(:params) { required_params }
7
9
  let(:config) { params.map{ |k, v| "#{k} #{v}" }.join("\n") }
8
- subject { Fluent::Test::OutputTestDriver.new(Fluent::ForkOutput, tag).configure(config) }
10
+ subject { Fluent::Test::Driver::Output.new(Fluent::Plugin::ForkOutput).configure(config) }
9
11
 
10
12
  describe "#configure" do
11
13
  let(:params) { required_params.merge(separator: '-', max_size: 5, max_fallback: 'drop', no_unique: true) }
@@ -50,59 +52,59 @@ describe Fluent::ForkOutput do
50
52
  end
51
53
 
52
54
  describe "#run" do
53
- let(:time) { Time.now.to_i }
55
+ let(:time) { event_time }
54
56
  it "forks" do
55
- subject.run { subject.emit({"sk" => "2,3,4,5"}, time) }
56
- expect(subject.emits.size).to eq(4)
57
- expect(subject.emits).to include(["ot", time, {"ok" => "2"}])
58
- expect(subject.emits).to include(["ot", time, {"ok" => "3"}])
59
- expect(subject.emits).to include(["ot", time, {"ok" => "4"}])
60
- expect(subject.emits).to include(["ot", time, {"ok" => "5"}])
57
+ subject.run(default_tag: tag) { subject.feed(time, {"sk" => "2,3,4,5"}) }
58
+ expect(subject.events.size).to eq(4)
59
+ expect(subject.events).to include(["ot", time, {"ok" => "2"}])
60
+ expect(subject.events).to include(["ot", time, {"ok" => "3"}])
61
+ expect(subject.events).to include(["ot", time, {"ok" => "4"}])
62
+ expect(subject.events).to include(["ot", time, {"ok" => "5"}])
61
63
  end
62
64
  it "forks uniquely" do
63
- subject.run { subject.emit({"sk" => "2,3,4,3"}, time) }
64
- expect(subject.emits.size).to eq(3)
65
- expect(subject.emits).to include(["ot", time, {"ok" => "2"}])
66
- expect(subject.emits).to include(["ot", time, {"ok" => "3"}])
67
- expect(subject.emits).to include(["ot", time, {"ok" => "4"}])
65
+ subject.run(default_tag: tag) { subject.feed(time, {"sk" => "2,3,4,3"}) }
66
+ expect(subject.event_streams.size).to eq(3)
67
+ expect(subject.events).to include(["ot", time, {"ok" => "2"}])
68
+ expect(subject.events).to include(["ot", time, {"ok" => "3"}])
69
+ expect(subject.events).to include(["ot", time, {"ok" => "4"}])
68
70
  end
69
71
  it "forks with other params" do
70
- subject.run { subject.emit({"sk" => "2,3,4,5", "o1" => 1, "o2" => 2}, time) }
71
- expect(subject.emits.size).to eq(4)
72
- expect(subject.emits).to include(["ot", time, {"ok" => "2", "o1" => 1, "o2" => 2}])
73
- expect(subject.emits).to include(["ot", time, {"ok" => "3", "o1" => 1, "o2" => 2}])
74
- expect(subject.emits).to include(["ot", time, {"ok" => "4", "o1" => 1, "o2" => 2}])
75
- expect(subject.emits).to include(["ot", time, {"ok" => "5", "o1" => 1, "o2" => 2}])
72
+ subject.run(default_tag: tag) { subject.feed(time, {"sk" => "2,3,4,5", "o1" => 1, "o2" => 2}) }
73
+ expect(subject.events.size).to eq(4)
74
+ expect(subject.events).to include(["ot", time, {"ok" => "2", "o1" => 1, "o2" => 2}])
75
+ expect(subject.events).to include(["ot", time, {"ok" => "3", "o1" => 1, "o2" => 2}])
76
+ expect(subject.events).to include(["ot", time, {"ok" => "4", "o1" => 1, "o2" => 2}])
77
+ expect(subject.events).to include(["ot", time, {"ok" => "5", "o1" => 1, "o2" => 2}])
76
78
  end
77
79
  it "does nothing for empty value" do
78
- subject.run { subject.emit({"o1" => 1, "o2" => 2}, time) }
79
- expect(subject.emits.size).to eq(0)
80
+ subject.run(default_tag: tag) { subject.feed(time, {"o1" => 1, "o2" => 2}) }
81
+ expect(subject.events.size).to eq(0)
80
82
  end
81
83
  it "ignores exceptions and writes down the log" do
82
84
  expect(subject.instance.log).to receive(:error).with(/^The error/)
83
85
  allow_any_instance_of(String).to receive(:split).and_raise("The error")
84
- subject.emit({"sk" => "2,3,4,5", "o1" => 1, "o2" => 2}, time)
86
+ subject.run(default_tag: tag) { subject.feed(time, {"sk" => "2,3,4,5", "o1" => 1, "o2" => 2}) }
85
87
  end
86
88
  context "with no_unique option" do
87
89
  let(:params) { required_params.merge(no_unique: true) }
88
90
  it "forks for redundant values" do
89
- subject.run { subject.emit({"sk" => "2,3,4,3"}, time) }
90
- expect(subject.emits.size).to eq(4)
91
- expect(subject.emits).to include(["ot", time, {"ok" => "2"}])
92
- expect(subject.emits).to include(["ot", time, {"ok" => "3"}])
93
- expect(subject.emits).to include(["ot", time, {"ok" => "4"}])
94
- expect(subject.emits).to include(["ot", time, {"ok" => "3"}])
91
+ subject.run(default_tag: tag) { subject.feed(time, {"sk" => "2,3,4,3"}) }
92
+ expect(subject.events.size).to eq(4)
93
+ expect(subject.events).to include(["ot", time, {"ok" => "2"}])
94
+ expect(subject.events).to include(["ot", time, {"ok" => "3"}])
95
+ expect(subject.events).to include(["ot", time, {"ok" => "4"}])
96
+ expect(subject.events).to include(["ot", time, {"ok" => "3"}])
95
97
  end
96
98
  end
97
99
  context "with separator option" do
98
100
  let(:params) { required_params.merge(separator: '-') }
99
101
  it "forks by separating with '-'" do
100
- subject.run { subject.emit({"sk" => "2-3-4-5"}, time) }
101
- expect(subject.emits.size).to eq(4)
102
- expect(subject.emits).to include(["ot", time, {"ok" => "2"}])
103
- expect(subject.emits).to include(["ot", time, {"ok" => "3"}])
104
- expect(subject.emits).to include(["ot", time, {"ok" => "4"}])
105
- expect(subject.emits).to include(["ot", time, {"ok" => "5"}])
102
+ subject.run(default_tag: tag) { subject.feed(time, {"sk" => "2-3-4-5"}) }
103
+ expect(subject.events.size).to eq(4)
104
+ expect(subject.events).to include(["ot", time, {"ok" => "2"}])
105
+ expect(subject.events).to include(["ot", time, {"ok" => "3"}])
106
+ expect(subject.events).to include(["ot", time, {"ok" => "4"}])
107
+ expect(subject.events).to include(["ot", time, {"ok" => "5"}])
106
108
  end
107
109
  end
108
110
  context "with max_size and max_fallback options" do
@@ -110,35 +112,35 @@ describe Fluent::ForkOutput do
110
112
  let(:params) { required_params.merge(max_size: 3, max_fallback: 'log') }
111
113
  it "writes a log" do
112
114
  expect(subject.instance.log).to receive(:info).with(/Too many forked values/)
113
- subject.run { subject.emit({"sk" => "2,3,4,5"}, time) }
115
+ subject.run(default_tag: required_params[:output_tag]) { subject.feed(time, {"sk" => "2,3,4,5"}) }
114
116
  end
115
117
  end
116
118
  describe "drop" do
117
119
  let(:params) { required_params.merge(max_size: 3, max_fallback: 'drop') }
118
120
  it "drops exceeded values" do
119
- subject.run { subject.emit({"sk" => "2,3,4,5"}, time) }
120
- expect(subject.emits.size).to eq(3)
121
- expect(subject.emits).to include(["ot", time, {"ok" => "2"}])
122
- expect(subject.emits).to include(["ot", time, {"ok" => "3"}])
123
- expect(subject.emits).to include(["ot", time, {"ok" => "4"}])
121
+ subject.run(default_tag: tag) { subject.feed(time, {"sk" => "2,3,4,5"}) }
122
+ expect(subject.events.size).to eq(3)
123
+ expect(subject.events).to include(["ot", time, {"ok" => "2"}])
124
+ expect(subject.events).to include(["ot", time, {"ok" => "3"}])
125
+ expect(subject.events).to include(["ot", time, {"ok" => "4"}])
124
126
  end
125
127
  end
126
128
  describe "skip" do
127
129
  let(:params) { required_params.merge(max_size: 3, max_fallback: 'skip') }
128
130
  it "skip the values" do
129
- subject.run { subject.emit({"sk" => "2,3,4,5"}, time) }
130
- expect(subject.emits.size).to eq(0)
131
+ subject.run(default_tag: tag) { subject.feed(time, {"sk" => "2,3,4,5"}) }
132
+ expect(subject.events.size).to eq(0)
131
133
  end
132
134
  end
133
135
  end
134
136
  context "with index_key option" do
135
137
  let(:params) { required_params.merge(index_key: 'idx') }
136
138
  it "add index number" do
137
- subject.run { subject.emit({"sk" => "2,3,4,5"}, time) }
138
- expect(subject.emits).to include(["ot", time, {"ok" => "2", "idx" => 0}])
139
- expect(subject.emits).to include(["ot", time, {"ok" => "3", "idx" => 1}])
140
- expect(subject.emits).to include(["ot", time, {"ok" => "4", "idx" => 2}])
141
- expect(subject.emits).to include(["ot", time, {"ok" => "5", "idx" => 3}])
139
+ subject.run(default_tag: tag) { subject.feed(time, {"sk" => "2,3,4,5"}) }
140
+ expect(subject.events).to include(["ot", time, {"ok" => "2", "idx" => 0}])
141
+ expect(subject.events).to include(["ot", time, {"ok" => "3", "idx" => 1}])
142
+ expect(subject.events).to include(["ot", time, {"ok" => "4", "idx" => 2}])
143
+ expect(subject.events).to include(["ot", time, {"ok" => "5", "idx" => 3}])
142
144
  end
143
145
  end
144
146
  end
@@ -3,6 +3,8 @@ require 'coveralls'
3
3
  Coveralls.wear!
4
4
 
5
5
  require 'fluent/test'
6
+ require 'fluent/test/driver/output'
7
+ require 'fluent/test/helpers'
6
8
  require 'fluent/plugin/out_fork'
7
9
 
8
10
  RSpec.configure do |config|
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-fork
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daisuke Taniwaki
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 0.10.0
19
+ version: 0.14.0
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: '2'
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: 0.10.0
29
+ version: 0.14.0
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '2'
@@ -99,7 +99,6 @@ files:
99
99
  - README.md
100
100
  - Rakefile
101
101
  - fluent-plugin-fork.gemspec
102
- - gemfiles/fluentd.0.10.42.gemfile
103
102
  - gemfiles/gemfile
104
103
  - lib/fluent/plugin/out_fork.rb
105
104
  - spec/plugin/out_fork_spec.rb
@@ -1,4 +0,0 @@
1
- source "http://rubygems.org"
2
-
3
- gem 'fluentd', '= 0.10.42'
4
- gemspec :path => '../'