fluent-plugin-grepcounter 0.5.4 → 0.5.5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 90eca84d0b796ebd73afe0413d519a7d5d0517ec
4
- data.tar.gz: 39accc620e237df5075a40d8c752535df1c9c989
3
+ metadata.gz: 75e1b135258e27a199ad76aff3b150c6d898ca4e
4
+ data.tar.gz: ce4a20861ad649906f1439f94b0f55f13c6b4bb8
5
5
  SHA512:
6
- metadata.gz: e6fc4b7c068508e720d119c8ce7ed41c1b686259aac99bdaa44dd3e1ecfb0274f92eb6371eab2aee7cef510a437aa5c65f0ecd9c6469af5d53965f9b1d6e0c01
7
- data.tar.gz: fdf50b8f80388238581370f1491a967af796f2cd4dcebaca5be2a0293157a72d5b7098d4d36369193567843740ae8d42b8d8a552706deeaf21716f35ddb89e2e
6
+ metadata.gz: f3a5ace25e1e8a5a68e94e6862849671ce291b93c5c85ca13ee35a9f6c3504de1d71e1c39c400956c77e0d2304f9d1192b8669b274ff32d58a3c531d574fc1e2
7
+ data.tar.gz: 7dee91e123f491709e8e9fabe339f357cddb8192ac50a2c2150823f7ff1f46748e9f810d21f815735d2257fe39782662e624b86b4ede37dfa2fba28c9fff0789
data/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## 0.5.5 (2014/08/06)
2
+
3
+ Enhancements:
4
+
5
+ * Add `remove_tag_slice` option
6
+ * Add `aggregate out_tag` option
7
+
1
8
  ## 0.5.4 (2014/04/12)
2
9
 
3
10
  Changes:
data/README.md CHANGED
@@ -1,4 +1,7 @@
1
- # fluent-plugin-grepcounter [![Build Status](https://secure.travis-ci.org/sonots/fluent-plugin-grepcounter.png?branch=master)](http://travis-ci.org/sonots/fluent-plugin-grepcounter)
1
+ # fluent-plugin-grepcounter
2
+
3
+ [![Build Status](https://secure.travis-ci.org/sonots/fluent-plugin-grepcounter.png?branch=master)](http://travis-ci.org/sonots/fluent-plugin-grepcounter)
4
+ [![Coverage Status](https://coveralls.io/repos/sonots/fluent-plugin-grepcounter/badge.png?branch=master)](https://coveralls.io/r/sonots/fluent-plugin-grepcounter?branch=master)
2
5
 
3
6
  Fluentd plugin to count the number of matched messages, and emit if exeeds the `threshold`.
4
7
 
@@ -123,6 +126,24 @@ Then, output bocomes as belows (indented). You can see the `message` field is jo
123
126
 
124
127
  Remove tag suffix for output message
125
128
 
129
+ * remove_tag_slice *min..max*
130
+
131
+ Remove tag parts by slice function. FYI: This option behaves like `tag.split('.').slice(min..max)`.
132
+
133
+ For example,
134
+
135
+ remove_tag_slice 0..-2
136
+
137
+ changes an input tag `foo.bar.host1` to `foo.bar`.
138
+
139
+ * aggregate
140
+
141
+ Aggregation unit. One of `all`, `in_tag`, `out_tag` can be specified. Default is `all`.
142
+
143
+ * `all` counts summation for all input messages and emit one message in each interval.
144
+ * `in_tag` counts summation for each input tag seperately.
145
+ * `out_tag` counts summation for each tag *modified* by `add_tag_prefix`, `remove_tag_prefix`, or `remove_tag_slice`.
146
+
126
147
  - delimiter
127
148
 
128
149
  Output matched messages after `join`ed with the specified delimiter.
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "fluent-plugin-grepcounter"
6
- s.version = "0.5.4"
6
+ s.version = "0.5.5"
7
7
  s.authors = ["Naotoshi Seo"]
8
8
  s.email = ["sonots@gmail.com"]
9
9
  s.homepage = "https://github.com/sonots/fluent-plugin-grepcounter"
@@ -21,6 +21,8 @@ Gem::Specification.new do |s|
21
21
  s.add_runtime_dependency "fluentd"
22
22
  s.add_development_dependency "rake"
23
23
  s.add_development_dependency "rspec"
24
+ s.add_development_dependency "rspec-its"
24
25
  s.add_development_dependency "pry"
25
26
  s.add_development_dependency "pry-nav"
27
+ s.add_development_dependency "coveralls"
26
28
  end
@@ -32,6 +32,7 @@ class Fluent::GrepCounterOutput < Fluent::Output
32
32
  config_param :remove_tag_prefix, :string, :default => nil
33
33
  config_param :add_tag_suffix, :string, :default => nil
34
34
  config_param :remove_tag_suffix, :string, :default => nil
35
+ config_param :remove_tag_slice, :string, :default => nil
35
36
  config_param :output_with_joined_delimiter, :string, :default => nil # obsolete
36
37
  config_param :delimiter, :string, :default => nil
37
38
  config_param :aggregate, :string, :default => 'tag'
@@ -94,7 +95,7 @@ class Fluent::GrepCounterOutput < Fluent::Output
94
95
  end
95
96
  end
96
97
 
97
- if @tag.nil? and @add_tag_prefix.nil? and @remove_tag_prefix.nil? and @add_tag_suffix.nil? and @remove_tag_suffix.nil?
98
+ if @tag.nil? and @add_tag_prefix.nil? and @remove_tag_prefix.nil? and @add_tag_suffix.nil? and @remove_tag_suffix.nil? and @remove_tag_slice.nil?
98
99
  @add_tag_prefix = 'count' # not ConfigError to support lower version compatibility
99
100
  end
100
101
  @tag_proc = tag_proc
@@ -102,11 +103,14 @@ class Fluent::GrepCounterOutput < Fluent::Output
102
103
  case @aggregate
103
104
  when 'all'
104
105
  raise Fluent::ConfigError, "grepcounter: `tag` must be specified with aggregate all" if @tag.nil?
105
- when 'tag'
106
- # raise Fluent::ConfigError, "grepcounter: add_tag_prefix must be specified with aggregate tag" if @add_tag_prefix.nil?
106
+ when 'tag' # obsolete
107
+ @aggregate = 'in_tag'
108
+ when 'in_tag'
109
+ when 'out_tag'
107
110
  else
108
- raise Fluent::ConfigError, "grepcounter: aggregate allows tag/all"
111
+ raise Fluent::ConfigError, "grepcounter: aggregate allows all/in_tag/out_tag"
109
112
  end
113
+ @aggregate_proc = aggregate_proc(@tag_proc)
110
114
 
111
115
  if @store_file
112
116
  f = Pathname.new(@store_file)
@@ -156,12 +160,14 @@ class Fluent::GrepCounterOutput < Fluent::Output
156
160
  count += 1
157
161
  end
158
162
  end
163
+
164
+ aggregate_key = @aggregate_proc.call(tag)
159
165
  # thread safe merge
160
- @counts[tag] ||= 0
161
- @matches[tag] ||= []
166
+ @counts[aggregate_key] ||= 0
167
+ @matches[aggregate_key] ||= []
162
168
  @mutex.synchronize do
163
- @counts[tag] += count
164
- @matches[tag] += matches
169
+ @counts[aggregate_key] += count
170
+ @matches[aggregate_key] += matches
165
171
  end
166
172
 
167
173
  chain.next
@@ -192,22 +198,29 @@ class Fluent::GrepCounterOutput < Fluent::Output
192
198
  time = Fluent::Engine.now
193
199
  flushed_counts, flushed_matches, @counts, @matches = @counts, @matches, {}, {}
194
200
 
195
- if @aggregate == 'all'
196
- count = 0; matches = []
197
- flushed_counts.keys.each do |tag|
198
- count += flushed_counts[tag]
199
- matches += flushed_matches[tag]
200
- end
201
+ case @aggregate
202
+ when 'all'
203
+ count = flushed_counts[:all]
204
+ matches = flushed_matches[:all]
201
205
  output = generate_output(count, matches)
202
206
  Fluent::Engine.emit(@tag, time, output) if output
203
- else
207
+ when 'out_tag'
208
+ flushed_counts.keys.each do |out_tag|
209
+ count = flushed_counts[out_tag]
210
+ matches = flushed_matches[out_tag]
211
+ output = generate_output(count, matches)
212
+ if output
213
+ Fluent::Engine.emit(out_tag, time, output)
214
+ end
215
+ end
216
+ else # in_tag
204
217
  flushed_counts.keys.each do |tag|
205
218
  count = flushed_counts[tag]
206
219
  matches = flushed_matches[tag]
207
220
  output = generate_output(count, matches, tag)
208
221
  if output
209
- emit_tag = @tag_proc.call(tag)
210
- Fluent::Engine.emit(emit_tag, time, output)
222
+ out_tag = @tag_proc.call(tag)
223
+ Fluent::Engine.emit(out_tag, time, output)
211
224
  end
212
225
  end
213
226
  end
@@ -234,7 +247,30 @@ class Fluent::GrepCounterOutput < Fluent::Output
234
247
  output
235
248
  end
236
249
 
250
+ def aggregate_proc(tag_proc)
251
+ case @aggregate
252
+ when 'all'
253
+ Proc.new {|tag| :all }
254
+ when 'in_tag'
255
+ Proc.new {|tag| tag }
256
+ when 'out_tag'
257
+ Proc.new {|tag| tag_proc.call(tag) }
258
+ end
259
+ end
260
+
237
261
  def tag_proc
262
+ tag_slice_proc =
263
+ if @remove_tag_slice
264
+ lindex, rindex = @remove_tag_slice.split('..', 2)
265
+ if lindex.nil? or rindex.nil? or lindex !~ /^-?\d+$/ or rindex !~ /^-?\d+$/
266
+ raise Fluent::ConfigError, "out_grepcounter: remove_tag_slice must be formatted like [num]..[num]"
267
+ end
268
+ l, r = lindex.to_i, rindex.to_i
269
+ Proc.new {|tag| (tags = tag.split('.')[l..r]).nil? ? "" : tags.join('.') }
270
+ else
271
+ Proc.new {|tag| tag }
272
+ end
273
+
238
274
  rstrip = Proc.new {|str, substr| str.chomp(substr) }
239
275
  lstrip = Proc.new {|str, substr| str.start_with?(substr) ? str[substr.size..-1] : str }
240
276
  tag_prefix = "#{rstrip.call(@add_tag_prefix, '.')}." if @add_tag_prefix
@@ -242,16 +278,16 @@ class Fluent::GrepCounterOutput < Fluent::Output
242
278
  tag_prefix_match = "#{rstrip.call(@remove_tag_prefix, '.')}." if @remove_tag_prefix
243
279
  tag_suffix_match = ".#{lstrip.call(@remove_tag_suffix, '.')}" if @remove_tag_suffix
244
280
  tag_fixed = @tag if @tag
245
- if tag_fixed
246
- Proc.new {|tag| tag_fixed }
247
- elsif tag_prefix_match and tag_suffix_match
248
- Proc.new {|tag| "#{tag_prefix}#{rstrip.call(lstrip.call(tag, tag_prefix_match), tag_suffix_match)}#{tag_suffix}" }
281
+ if tag_prefix_match and tag_suffix_match
282
+ Proc.new {|tag| "#{tag_prefix}#{rstrip.call(lstrip.call(tag_slice_proc.call(tag), tag_prefix_match), tag_suffix_match)}#{tag_suffix}" }
249
283
  elsif tag_prefix_match
250
- Proc.new {|tag| "#{tag_prefix}#{lstrip.call(tag, tag_prefix_match)}#{tag_suffix}" }
284
+ Proc.new {|tag| "#{tag_prefix}#{lstrip.call(tag_slice_proc.call(tag), tag_prefix_match)}#{tag_suffix}" }
251
285
  elsif tag_suffix_match
252
- Proc.new {|tag| "#{tag_prefix}#{rstrip.call(tag, tag_suffix_match)}#{tag_suffix}" }
286
+ Proc.new {|tag| "#{tag_prefix}#{rstrip.call(tag_slice_proc.call(tag), tag_suffix_match)}#{tag_suffix}" }
287
+ elsif tag_prefix || @remove_tag_slice || tag_suffix
288
+ Proc.new {|tag| "#{tag_prefix}#{tag_slice_proc.call(tag)}#{tag_suffix}" }
253
289
  else
254
- Proc.new {|tag| "#{tag_prefix}#{tag}#{tag_suffix}" }
290
+ Proc.new {|tag| tag_fixed }
255
291
  end
256
292
  end
257
293
 
@@ -93,8 +93,8 @@ describe Fluent::GrepCounterOutput do
93
93
  context 'default' do
94
94
  let(:config) { CONFIG }
95
95
  before do
96
- Fluent::Engine.stub(:now).and_return(time)
97
- Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, expected)
96
+ allow(Fluent::Engine).to receive(:now).and_return(time)
97
+ expect(Fluent::Engine).to receive(:emit).with("count.#{tag}", time, expected)
98
98
  end
99
99
  it { emit }
100
100
  end
@@ -102,8 +102,8 @@ describe Fluent::GrepCounterOutput do
102
102
  context 'regexp' do
103
103
  let(:config) { CONFIG + %[ regexp WARN ] }
104
104
  before do
105
- Fluent::Engine.stub(:now).and_return(time)
106
- Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, expected.merge({
105
+ allow(Fluent::Engine).to receive(:now).and_return(time)
106
+ expect(Fluent::Engine).to receive(:emit).with("count.#{tag}", time, expected.merge({
107
107
  "count"=>3,
108
108
  "message"=>[
109
109
  "2013/01/13T07:02:13.232645 WARN POST /auth",
@@ -118,8 +118,8 @@ describe Fluent::GrepCounterOutput do
118
118
  context 'regexpN' do
119
119
  let(:config) { %[ regexp1 message WARN ] }
120
120
  before do
121
- Fluent::Engine.stub(:now).and_return(time)
122
- Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, expected.merge({
121
+ allow(Fluent::Engine).to receive(:now).and_return(time)
122
+ expect(Fluent::Engine).to receive(:emit).with("count.#{tag}", time, expected.merge({
123
123
  "count"=>3,
124
124
  }).delete!('message'))
125
125
  end
@@ -129,8 +129,8 @@ describe Fluent::GrepCounterOutput do
129
129
  context 'exclude' do
130
130
  let(:config) { CONFIG + %[regexp WARN \n exclude favicon] }
131
131
  before do
132
- Fluent::Engine.stub(:now).and_return(time)
133
- Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, expected.merge({
132
+ allow(Fluent::Engine).to receive(:now).and_return(time)
133
+ expect(Fluent::Engine).to receive(:emit).with("count.#{tag}", time, expected.merge({
134
134
  "count"=>2,
135
135
  "message"=>[
136
136
  "2013/01/13T07:02:13.232645 WARN POST /auth",
@@ -144,8 +144,8 @@ describe Fluent::GrepCounterOutput do
144
144
  context 'excludeN' do
145
145
  let(:config) { %[regexp1 message WARN \n exclude1 message favicon] }
146
146
  before do
147
- Fluent::Engine.stub(:now).and_return(time)
148
- Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, expected.merge({
147
+ allow(Fluent::Engine).to receive(:now).and_return(time)
148
+ expect(Fluent::Engine).to receive(:emit).with("count.#{tag}", time, expected.merge({
149
149
  "count"=>2,
150
150
  }).delete!('message'))
151
151
  end
@@ -156,8 +156,8 @@ describe Fluent::GrepCounterOutput do
156
156
  context '>= threshold' do
157
157
  let(:config) { CONFIG + %[threshold 4] }
158
158
  before do
159
- Fluent::Engine.stub(:now).and_return(time)
160
- Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, expected)
159
+ allow(Fluent::Engine).to receive(:now).and_return(time)
160
+ expect(Fluent::Engine).to receive(:emit).with("count.#{tag}", time, expected)
161
161
  end
162
162
  it { emit }
163
163
  end
@@ -165,8 +165,8 @@ describe Fluent::GrepCounterOutput do
165
165
  context 'not >= threshold' do
166
166
  let(:config) { CONFIG + %[threshold 5] }
167
167
  before do
168
- Fluent::Engine.stub(:now).and_return(time)
169
- Fluent::Engine.should_not_receive(:emit)
168
+ allow(Fluent::Engine).to receive(:now).and_return(time)
169
+ expect(Fluent::Engine).not_to receive(:emit)
170
170
  end
171
171
  it { emit }
172
172
  end
@@ -174,8 +174,8 @@ describe Fluent::GrepCounterOutput do
174
174
  context '<= threshold' do
175
175
  let(:config) { CONFIG + %[threshold 4 \n comparator <=] }
176
176
  before do
177
- Fluent::Engine.stub(:now).and_return(time)
178
- Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, expected)
177
+ allow(Fluent::Engine).to receive(:now).and_return(time)
178
+ expect(Fluent::Engine).to receive(:emit).with("count.#{tag}", time, expected)
179
179
  end
180
180
  it { emit }
181
181
  end
@@ -183,8 +183,8 @@ describe Fluent::GrepCounterOutput do
183
183
  context 'not <= threshold' do
184
184
  let(:config) { CONFIG + %[threshold 3 \n comparator <=] }
185
185
  before do
186
- Fluent::Engine.stub(:now).and_return(time)
187
- Fluent::Engine.should_not_receive(:emit)
186
+ allow(Fluent::Engine).to receive(:now).and_return(time)
187
+ expect(Fluent::Engine).not_to receive(:emit)
188
188
  end
189
189
  it { emit }
190
190
  end
@@ -194,8 +194,8 @@ describe Fluent::GrepCounterOutput do
194
194
  context 'greater_equal' do
195
195
  let(:config) { CONFIG + %[greater_equal 4] }
196
196
  before do
197
- Fluent::Engine.stub(:now).and_return(time)
198
- Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, expected)
197
+ allow(Fluent::Engine).to receive(:now).and_return(time)
198
+ expect(Fluent::Engine).to receive(:emit).with("count.#{tag}", time, expected)
199
199
  end
200
200
  it { emit }
201
201
  end
@@ -203,8 +203,8 @@ describe Fluent::GrepCounterOutput do
203
203
  context 'not greater_equal' do
204
204
  let(:config) { CONFIG + %[greater_equal 5] }
205
205
  before do
206
- Fluent::Engine.stub(:now).and_return(time)
207
- Fluent::Engine.should_not_receive(:emit)
206
+ allow(Fluent::Engine).to receive(:now).and_return(time)
207
+ expect(Fluent::Engine).not_to receive(:emit)
208
208
  end
209
209
  it { emit }
210
210
  end
@@ -212,8 +212,8 @@ describe Fluent::GrepCounterOutput do
212
212
  context 'greater_than' do
213
213
  let(:config) { CONFIG + %[greater_than 3] }
214
214
  before do
215
- Fluent::Engine.stub(:now).and_return(time)
216
- Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, expected)
215
+ allow(Fluent::Engine).to receive(:now).and_return(time)
216
+ expect(Fluent::Engine).to receive(:emit).with("count.#{tag}", time, expected)
217
217
  end
218
218
  it { emit }
219
219
  end
@@ -221,8 +221,8 @@ describe Fluent::GrepCounterOutput do
221
221
  context 'not greater_than' do
222
222
  let(:config) { CONFIG + %[greater_than 4] }
223
223
  before do
224
- Fluent::Engine.stub(:now).and_return(time)
225
- Fluent::Engine.should_not_receive(:emit)
224
+ allow(Fluent::Engine).to receive(:now).and_return(time)
225
+ expect(Fluent::Engine).not_to receive(:emit)
226
226
  end
227
227
  it { emit }
228
228
  end
@@ -230,8 +230,8 @@ describe Fluent::GrepCounterOutput do
230
230
  context 'less_equal' do
231
231
  let(:config) { CONFIG + %[less_equal 4] }
232
232
  before do
233
- Fluent::Engine.stub(:now).and_return(time)
234
- Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, expected)
233
+ allow(Fluent::Engine).to receive(:now).and_return(time)
234
+ expect(Fluent::Engine).to receive(:emit).with("count.#{tag}", time, expected)
235
235
  end
236
236
  it { emit }
237
237
  end
@@ -239,8 +239,8 @@ describe Fluent::GrepCounterOutput do
239
239
  context 'not less_equal' do
240
240
  let(:config) { CONFIG + %[less_equal 3] }
241
241
  before do
242
- Fluent::Engine.stub(:now).and_return(time)
243
- Fluent::Engine.should_not_receive(:emit)
242
+ allow(Fluent::Engine).to receive(:now).and_return(time)
243
+ expect(Fluent::Engine).not_to receive(:emit)
244
244
  end
245
245
  it { emit }
246
246
  end
@@ -248,8 +248,8 @@ describe Fluent::GrepCounterOutput do
248
248
  context 'less_than' do
249
249
  let(:config) { CONFIG + %[less_than 5] }
250
250
  before do
251
- Fluent::Engine.stub(:now).and_return(time)
252
- Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, expected)
251
+ allow(Fluent::Engine).to receive(:now).and_return(time)
252
+ expect(Fluent::Engine).to receive(:emit).with("count.#{tag}", time, expected)
253
253
  end
254
254
  it { emit }
255
255
  end
@@ -257,8 +257,8 @@ describe Fluent::GrepCounterOutput do
257
257
  context 'not less_than' do
258
258
  let(:config) { CONFIG + %[less_than 4] }
259
259
  before do
260
- Fluent::Engine.stub(:now).and_return(time)
261
- Fluent::Engine.should_not_receive(:emit)
260
+ allow(Fluent::Engine).to receive(:now).and_return(time)
261
+ expect(Fluent::Engine).not_to receive(:emit)
262
262
  end
263
263
  it { emit }
264
264
  end
@@ -266,8 +266,8 @@ describe Fluent::GrepCounterOutput do
266
266
  context 'between' do
267
267
  let(:config) { CONFIG + %[greater_than 1 \n less_than 5] }
268
268
  before do
269
- Fluent::Engine.stub(:now).and_return(time)
270
- Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, expected)
269
+ allow(Fluent::Engine).to receive(:now).and_return(time)
270
+ expect(Fluent::Engine).to receive(:emit).with("count.#{tag}", time, expected)
271
271
  end
272
272
  it { emit }
273
273
  end
@@ -275,8 +275,8 @@ describe Fluent::GrepCounterOutput do
275
275
  context 'not between' do
276
276
  let(:config) { CONFIG + %[greater_than 1 \n less_than 4] }
277
277
  before do
278
- Fluent::Engine.stub(:now).and_return(time)
279
- Fluent::Engine.should_not_receive(:emit)
278
+ allow(Fluent::Engine).to receive(:now).and_return(time)
279
+ expect(Fluent::Engine).not_to receive(:emit)
280
280
  end
281
281
  it { emit }
282
282
  end
@@ -285,8 +285,8 @@ describe Fluent::GrepCounterOutput do
285
285
  context 'output_tag (obsolete)' do
286
286
  let(:config) { CONFIG + %[output_tag foo] }
287
287
  before do
288
- Fluent::Engine.stub(:now).and_return(time)
289
- Fluent::Engine.should_receive(:emit).with("foo", time, expected)
288
+ allow(Fluent::Engine).to receive(:now).and_return(time)
289
+ expect(Fluent::Engine).to receive(:emit).with("foo", time, expected)
290
290
  end
291
291
  it { emit }
292
292
  end
@@ -294,8 +294,8 @@ describe Fluent::GrepCounterOutput do
294
294
  context 'tag' do
295
295
  let(:config) { CONFIG + %[tag foo] }
296
296
  before do
297
- Fluent::Engine.stub(:now).and_return(time)
298
- Fluent::Engine.should_receive(:emit).with("foo", time, expected)
297
+ allow(Fluent::Engine).to receive(:now).and_return(time)
298
+ expect(Fluent::Engine).to receive(:emit).with("foo", time, expected)
299
299
  end
300
300
  it { emit }
301
301
  end
@@ -304,8 +304,8 @@ describe Fluent::GrepCounterOutput do
304
304
  let(:config) { CONFIG + %[add_tag_prefix foo] }
305
305
  let(:tag) { 'syslog.host1' }
306
306
  before do
307
- Fluent::Engine.stub(:now).and_return(time)
308
- Fluent::Engine.should_receive(:emit).with("foo.#{tag}", time, expected)
307
+ allow(Fluent::Engine).to receive(:now).and_return(time)
308
+ expect(Fluent::Engine).to receive(:emit).with("foo.#{tag}", time, expected)
309
309
  end
310
310
  it { emit }
311
311
  end
@@ -314,8 +314,8 @@ describe Fluent::GrepCounterOutput do
314
314
  let(:config) { CONFIG + %[remove_tag_prefix syslog] }
315
315
  let(:tag) { 'syslog.host1' }
316
316
  before do
317
- Fluent::Engine.stub(:now).and_return(time)
318
- Fluent::Engine.should_receive(:emit).with("host1", time, expected)
317
+ allow(Fluent::Engine).to receive(:now).and_return(time)
318
+ expect(Fluent::Engine).to receive(:emit).with("host1", time, expected)
319
319
  end
320
320
  it { emit }
321
321
  end
@@ -324,8 +324,8 @@ describe Fluent::GrepCounterOutput do
324
324
  let(:config) { CONFIG + %[add_tag_suffix foo] }
325
325
  let(:tag) { 'syslog.host1' }
326
326
  before do
327
- Fluent::Engine.stub(:now).and_return(time)
328
- Fluent::Engine.should_receive(:emit).with("#{tag}.foo", time, expected)
327
+ allow(Fluent::Engine).to receive(:now).and_return(time)
328
+ expect(Fluent::Engine).to receive(:emit).with("#{tag}.foo", time, expected)
329
329
  end
330
330
  it { emit }
331
331
  end
@@ -334,8 +334,18 @@ describe Fluent::GrepCounterOutput do
334
334
  let(:config) { CONFIG + %[remove_tag_suffix host1] }
335
335
  let(:tag) { 'syslog.host1' }
336
336
  before do
337
- Fluent::Engine.stub(:now).and_return(time)
338
- Fluent::Engine.should_receive(:emit).with("syslog", time, expected)
337
+ allow(Fluent::Engine).to receive(:now).and_return(time)
338
+ expect(Fluent::Engine).to receive(:emit).with("syslog", time, expected)
339
+ end
340
+ it { emit }
341
+ end
342
+
343
+ context 'remove_tag_slice' do
344
+ let(:config) { CONFIG + %[remove_tag_slice 0..-2] }
345
+ let(:tag) { 'syslog.host1' }
346
+ before do
347
+ allow(Fluent::Engine).to receive(:now).and_return(time)
348
+ expect(Fluent::Engine).to receive(:emit).with("syslog", time, expected)
339
349
  end
340
350
  it { emit }
341
351
  end
@@ -349,8 +359,8 @@ describe Fluent::GrepCounterOutput do
349
359
  ]}
350
360
  let(:tag) { 'syslog.foo.host1' }
351
361
  before do
352
- Fluent::Engine.stub(:now).and_return(time)
353
- Fluent::Engine.should_receive(:emit).with("foo.foo.foo", time, expected)
362
+ allow(Fluent::Engine).to receive(:now).and_return(time)
363
+ expect(Fluent::Engine).to receive(:emit).with("foo.foo.foo", time, expected)
354
364
  end
355
365
  it { emit }
356
366
  end
@@ -359,8 +369,8 @@ describe Fluent::GrepCounterOutput do
359
369
  let(:config) { CONFIG + %[add_tag_prefix foo.] }
360
370
  let(:tag) { 'syslog.host1' }
361
371
  before do
362
- Fluent::Engine.stub(:now).and_return(time)
363
- Fluent::Engine.should_receive(:emit).with("foo.#{tag}", time, expected)
372
+ allow(Fluent::Engine).to receive(:now).and_return(time)
373
+ expect(Fluent::Engine).to receive(:emit).with("foo.#{tag}", time, expected)
364
374
  end
365
375
  it { emit }
366
376
  end
@@ -369,8 +379,8 @@ describe Fluent::GrepCounterOutput do
369
379
  let(:config) { CONFIG + %[remove_tag_prefix syslog.] }
370
380
  let(:tag) { 'syslog.host1' }
371
381
  before do
372
- Fluent::Engine.stub(:now).and_return(time)
373
- Fluent::Engine.should_receive(:emit).with("host1", time, expected)
382
+ allow(Fluent::Engine).to receive(:now).and_return(time)
383
+ expect(Fluent::Engine).to receive(:emit).with("host1", time, expected)
374
384
  end
375
385
  it { emit }
376
386
  end
@@ -379,8 +389,8 @@ describe Fluent::GrepCounterOutput do
379
389
  let(:config) { CONFIG + %[add_tag_suffix .foo] }
380
390
  let(:tag) { 'syslog.host1' }
381
391
  before do
382
- Fluent::Engine.stub(:now).and_return(time)
383
- Fluent::Engine.should_receive(:emit).with("#{tag}.foo", time, expected)
392
+ allow(Fluent::Engine).to receive(:now).and_return(time)
393
+ expect(Fluent::Engine).to receive(:emit).with("#{tag}.foo", time, expected)
384
394
  end
385
395
  it { emit }
386
396
  end
@@ -389,8 +399,8 @@ describe Fluent::GrepCounterOutput do
389
399
  let(:config) { CONFIG + %[remove_tag_suffix .host1] }
390
400
  let(:tag) { 'syslog.host1' }
391
401
  before do
392
- Fluent::Engine.stub(:now).and_return(time)
393
- Fluent::Engine.should_receive(:emit).with("syslog", time, expected)
402
+ allow(Fluent::Engine).to receive(:now).and_return(time)
403
+ expect(Fluent::Engine).to receive(:emit).with("syslog", time, expected)
394
404
  end
395
405
  it { emit }
396
406
  end
@@ -399,9 +409,9 @@ describe Fluent::GrepCounterOutput do
399
409
  # \\n shall be \n in config file
400
410
  let(:config) { CONFIG + %[output_with_joined_delimiter \\n] }
401
411
  before do
402
- Fluent::Engine.stub(:now).and_return(time)
412
+ allow(Fluent::Engine).to receive(:now).and_return(time)
403
413
  message = expected["message"].join('\n')
404
- Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, expected.merge("message" => message))
414
+ expect(Fluent::Engine).to receive(:emit).with("count.#{tag}", time, expected.merge("message" => message))
405
415
  end
406
416
  it { emit }
407
417
  end
@@ -410,9 +420,9 @@ describe Fluent::GrepCounterOutput do
410
420
  # \\n shall be \n in config file
411
421
  let(:config) { CONFIG + %[delimiter \\n] }
412
422
  before do
413
- Fluent::Engine.stub(:now).and_return(time)
423
+ allow(Fluent::Engine).to receive(:now).and_return(time)
414
424
  message = expected["message"].join('\n')
415
- Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, expected.merge("message" => message))
425
+ expect(Fluent::Engine).to receive(:emit).with("count.#{tag}", time, expected.merge("message" => message))
416
426
  end
417
427
  it { emit }
418
428
  end
@@ -433,8 +443,47 @@ describe Fluent::GrepCounterOutput do
433
443
 
434
444
  let(:config) { CONFIG + %[aggregate all \n output_tag count] }
435
445
  before do
436
- Fluent::Engine.stub(:now).and_return(time)
437
- Fluent::Engine.should_receive(:emit).with("count", time, expected)
446
+ allow(Fluent::Engine).to receive(:now).and_return(time)
447
+ expect(Fluent::Engine).to receive(:emit).with("count", time, expected)
448
+ end
449
+ it { emit }
450
+ end
451
+
452
+ context 'aggregate in_tag' do
453
+ let(:messages) { ['foobar', 'foobar'] }
454
+ let(:emit) do
455
+ driver.run { messages.each {|message| driver.emit_with_tag({'message' => message}, time, 'foo.bar') } }
456
+ driver.run { messages.each {|message| driver.emit_with_tag({'message' => message}, time, 'foo.bar2') } }
457
+ driver.instance.flush_emit(0)
458
+ end
459
+
460
+ let(:config) { CONFIG + %[aggregate tag \n remove_tag_slice 0..-2] }
461
+ before do
462
+ allow(Fluent::Engine).to receive(:now).and_return(time)
463
+ expect(Fluent::Engine).to receive(:emit).with("foo", time, {
464
+ "count"=>2, "message"=>["foobar", "foobar"], "input_tag"=>"foo.bar", "input_tag_last"=>"bar"
465
+ })
466
+ expect(Fluent::Engine).to receive(:emit).with("foo", time, {
467
+ "count"=>2, "message"=>["foobar", "foobar"], "input_tag"=>"foo.bar2", "input_tag_last"=>"bar2"
468
+ })
469
+ end
470
+ it { emit }
471
+ end
472
+
473
+ context 'aggregate out_tag' do
474
+ let(:messages) { ['foobar', 'foobar'] }
475
+ let(:emit) do
476
+ driver.run { messages.each {|message| driver.emit_with_tag({'message' => message}, time, 'foo.bar') } }
477
+ driver.run { messages.each {|message| driver.emit_with_tag({'message' => message}, time, 'foo.bar2') } }
478
+ driver.instance.flush_emit(0)
479
+ end
480
+
481
+ let(:config) { CONFIG + %[aggregate out_tag \n remove_tag_slice 0..-2] }
482
+ before do
483
+ allow(Fluent::Engine).to receive(:now).and_return(time)
484
+ expect(Fluent::Engine).to receive(:emit).with("foo", time, {
485
+ "count"=>4, "message"=>["foobar", "foobar", "foobar", "foobar"]
486
+ })
438
487
  end
439
488
  it { emit }
440
489
  end
@@ -443,7 +492,7 @@ describe Fluent::GrepCounterOutput do
443
492
  let(:config) { CONFIG + %[regexp WARN \n replace_invalid_sequence true] }
444
493
  let(:messages) { [ "\xff".force_encoding('UTF-8') ] }
445
494
  before do
446
- Fluent::Engine.stub(:now).and_return(time)
495
+ allow(Fluent::Engine).to receive(:now).and_return(time)
447
496
  end
448
497
  it { expect { emit }.not_to raise_error }
449
498
  end
@@ -477,10 +526,10 @@ describe Fluent::GrepCounterOutput do
477
526
  loaded_saved_at = driver.instance.saved_at
478
527
  loaded_saved_duration = driver.instance.saved_duration
479
528
 
480
- loaded_counts.should == stored_counts
481
- loaded_matches.should == stored_matches
482
- loaded_saved_at.should == stored_saved_at
483
- loaded_saved_duration.should == stored_saved_duration
529
+ expect(loaded_counts).to eql(stored_counts)
530
+ expect(loaded_matches).to eql(stored_matches)
531
+ expect(loaded_saved_at).to eql(stored_saved_at)
532
+ expect(loaded_saved_duration).to eql(stored_saved_duration)
484
533
  end
485
534
  end
486
535
 
data/spec/spec_helper.rb CHANGED
@@ -4,8 +4,14 @@ require 'bundler'
4
4
  Bundler.setup(:default, :test)
5
5
  Bundler.require(:default, :test)
6
6
 
7
+ if ENV['TRAVIS']
8
+ require 'coveralls'
9
+ Coveralls.wear!
10
+ end
11
+
7
12
  require 'fluent/test'
8
13
  require 'rspec'
14
+ require 'rspec/its'
9
15
  require 'pry'
10
16
  # require 'delorean'
11
17
 
metadata CHANGED
@@ -1,83 +1,111 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-grepcounter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Naotoshi Seo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-11 00:00:00.000000000 Z
11
+ date: 2014-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '>='
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec-its
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
53
67
  - !ruby/object:Gem::Version
54
68
  version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: pry
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - '>='
73
+ - - ">="
60
74
  - !ruby/object:Gem::Version
61
75
  version: '0'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - '>='
80
+ - - ">="
67
81
  - !ruby/object:Gem::Version
68
82
  version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: pry-nav
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - '>='
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: coveralls
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
74
102
  - !ruby/object:Gem::Version
75
103
  version: '0'
76
104
  type: :development
77
105
  prerelease: false
78
106
  version_requirements: !ruby/object:Gem::Requirement
79
107
  requirements:
80
- - - '>='
108
+ - - ">="
81
109
  - !ruby/object:Gem::Version
82
110
  version: '0'
83
111
  description: Fluentd plugin to count the number of matched messages, and emit if exceeds
@@ -88,11 +116,10 @@ executables: []
88
116
  extensions: []
89
117
  extra_rdoc_files: []
90
118
  files:
91
- - .coveralls.yml
92
- - .gitignore
93
- - .rdebugrc
94
- - .rspec
95
- - .travis.yml
119
+ - ".coveralls.yml"
120
+ - ".gitignore"
121
+ - ".rspec"
122
+ - ".travis.yml"
96
123
  - CHANGELOG.md
97
124
  - Gemfile
98
125
  - LICENSE
@@ -112,17 +139,17 @@ require_paths:
112
139
  - lib
113
140
  required_ruby_version: !ruby/object:Gem::Requirement
114
141
  requirements:
115
- - - '>='
142
+ - - ">="
116
143
  - !ruby/object:Gem::Version
117
144
  version: '0'
118
145
  required_rubygems_version: !ruby/object:Gem::Requirement
119
146
  requirements:
120
- - - '>='
147
+ - - ">="
121
148
  - !ruby/object:Gem::Version
122
149
  version: '0'
123
150
  requirements: []
124
151
  rubyforge_project: fluent-plugin-grepcounter
125
- rubygems_version: 2.0.3
152
+ rubygems_version: 2.2.2
126
153
  signing_key:
127
154
  specification_version: 4
128
155
  summary: Fluentd plugin to count the number of matched messages, and emit if exceeds
data/.rdebugrc DELETED
@@ -1,4 +0,0 @@
1
- set autolist
2
- set autoeval
3
- set autoreload
4
-