fluent-plugin-grepcounter 0.0.1 → 0.1.0.pre

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: e62f5b7c59d5196eb5a38630bb8a1292883f1d07
4
- data.tar.gz: 64a2bede2b197b7f693207bc63b6a71101df8c50
3
+ metadata.gz: c342677be8075559528320aa8964dd2208f6d2cb
4
+ data.tar.gz: 28f6b36798b5023e180a9247ef6480b3997633c6
5
5
  SHA512:
6
- metadata.gz: 49ae4eca6395c2b381631ced8bebdb30d3451cd4f504a817b2ec858a45c9acbd198385c465062f93968e547cf49c52ec6f124d6e198b9a72457c1048a37e9cd7
7
- data.tar.gz: f9d7d8b9c50c6d45e22af946edef16d440e147c76f1e2507bf48dd272c837dd52282db09fa9d3411aa6cf44971c35f8c410a40622ac746b23118ec041286be79
6
+ metadata.gz: 96e1fd97aee7feeb3f2843cac84558b4163e95bb175750e766bf5ea66da275556f75b425669c505ab51468b61a1047e8517aa4605f139358acdae4e92d96a7bb
7
+ data.tar.gz: f6fc309ed2057081fe6a724a213f491c146dede6cad7d490ca92c186918a3e5e09874cce81d6e1da18c0de9feff0395956197b70f74d6bb0b2520eed842675e9
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ repo_token: i4DJCtdksuIwhBck1tukIjzKoMCxWIIvQ
data/.gitignore CHANGED
@@ -8,4 +8,5 @@ Gemfile.lock
8
8
  vendor
9
9
  doc/*
10
10
  tmp/*
11
+ coverage
11
12
  .yardoc
data/CHANGELOG.md ADDED
@@ -0,0 +1,16 @@
1
+ ## 0.1.0 (2013/05/01)
2
+
3
+ Features:
4
+
5
+ - aggregate tag/all
6
+
7
+ Changes:
8
+
9
+ - Remove `output_matched_message` option, and make it default.
10
+ - Rename `output_with_joined_delimiter` to `output_delimiter`.
11
+
12
+ Bugfixes:
13
+
14
+ ## 0.0.1
15
+
16
+ First version
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
1
  source "http://rubygems.org"
2
2
 
3
+ gem 'simplecov', git: 'https://github.com/colszowka/simplecov.git'
3
4
  gemspec
data/README.md CHANGED
@@ -1,15 +1,9 @@
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) [![Dependency Status](https://gemnasium.com/sonots/fluent-plugin-grepcounter.png)](https://gemnasium.com/sonots/fluent-plugin-grepcounter)
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) [![Dependency Status](https://gemnasium.com/sonots/fluent-plugin-grepcounter.png)](https://gemnasium.com/sonots/fluent-plugin-grepcounter) [![Coverage Status](https://coveralls.io/repos/sonots/fluent-plugin-grepcounter/badge.png?branch=master)](https://coveralls.io/r/sonots/fluent-plugin-grepcounter)
2
2
 
3
- ## Component
4
-
5
- ### GrepCounterOutput
6
-
7
- Fluentd plugin to count the number of matched messages
3
+ Fluentd plugin to count the number of matched messages.
8
4
 
9
5
  ## Configuration
10
6
 
11
- ## GrepCounterOutput
12
-
13
7
  Assume inputs from another plugin are as belows:
14
8
 
15
9
  syslog.host1: {"message":"2013/01/13T07:02:11.124202 INFO GET /ping" }
@@ -29,11 +23,11 @@ An example of grepcounter configuration:
29
23
  add_tag_prefix warn.count
30
24
  </source>
31
25
 
32
- Outputs as belows:
26
+ Then, output bocomes as belows:
33
27
 
34
- warn.count.syslog.host1: {"count":2,"input_tag":"syslog.host1","input_tag_last":"host1"}
28
+ warn.count.syslog.host1: {"count":2,"message":["2013/01/13T07:02:13.232645 WARN POST /auth","2013/01/13T07:02:43.632145 WARN POST /login"]}
35
29
 
36
- Another example of grepcounter configuration:
30
+ Another example of grepcounter configuration to use `output_delimiter`:
37
31
 
38
32
  <match syslog.**>
39
33
  type grepcounter
@@ -43,13 +37,26 @@ Another example of grepcounter configuration:
43
37
  exclude favicon.ico
44
38
  threshold 1
45
39
  add_tag_prefix warn.count
46
- output_matched_message true
47
- output_with_joined_delimiter \n
40
+ output_delimiter \n
48
41
  </source>
49
42
 
50
- Outputs as belows:
43
+ Then, output bocomes as belows. You can use the `message` field is joined with \n.
44
+
45
+ warn.count.syslog.host1: {"count":2,"message":"2013/01/13T07:02:13.232645 WARN POST /auth\n2013/01/13T07:02:43.632145 WARN POST /login"}
46
+
47
+ ## Parameters
48
+
49
+ - aggregate
51
50
 
52
- warn.count.syslog.host1: {"count":2,"input_tag":"syslog.host1","input_tag_last":"host1","message":"2013/01/13T07:02:13.232645 WARN POST /auth\n2013/01/13T07:02:43.632145 WARN POST /login"}
51
+ Count by each `tag` or `all`. The default value is `tag`.
52
+
53
+ - output_tag
54
+
55
+ The output tag. Required for aggregate `all`.
56
+
57
+ ## ChaangeLog
58
+
59
+ See [CHANGELOG.md](CHANGELOG.md) for details.
53
60
 
54
61
  ## Contributing
55
62
 
@@ -62,3 +69,4 @@ Outputs as belows:
62
69
  ## Copyright
63
70
 
64
71
  Copyright (c) 2013 Naotoshi SEO. See [LICENSE](LICENSE) for details.
72
+
@@ -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.0.1"
6
+ s.version = "0.1.0.pre"
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,5 +21,6 @@ Gem::Specification.new do |s|
21
21
  s.add_development_dependency "rake"
22
22
  s.add_development_dependency "rspec"
23
23
  s.add_development_dependency "pry"
24
+ s.add_development_dependency 'coveralls'
24
25
  # s.add_development_dependency "delorean"
25
26
  end
@@ -1,15 +1,16 @@
1
+ # encoding: UTF-8
1
2
  class Fluent::GrepCounterOutput < Fluent::Output
2
3
  Fluent::Plugin.register_output('grepcounter', self)
3
4
 
4
5
  config_param :input_key, :string
5
- config_param :regexp, :string
6
+ config_param :regexp, :string, :default => nil
6
7
  config_param :count_interval, :time, :default => 5
7
8
  config_param :exclude, :string, :default => nil
8
9
  config_param :threshold, :integer, :default => 1
9
- config_param :output_tag, :string, :default => 'count'
10
- config_param :add_tag_prefix, :string, :default => nil
11
- config_param :output_matched_message, :bool, :default => false
12
- config_param :output_with_joined_delimiter, :string, :default => nil
10
+ config_param :output_tag, :string, :default => nil
11
+ config_param :add_tag_prefix, :string, :default => 'count'
12
+ config_param :output_delimiter, :string, :default => nil
13
+ config_param :aggregate, :string, :default => 'tag'
13
14
 
14
15
  attr_accessor :matches
15
16
  attr_accessor :last_checked
@@ -23,8 +24,15 @@ class Fluent::GrepCounterOutput < Fluent::Output
23
24
  @exclude = Regexp.compile(@exclude) if @exclude
24
25
  @threshold = @threshold.to_i
25
26
 
26
- if @output_with_joined_delimiter and @output_matched_message == false
27
- raise Fluent::ConfigError, "'output_matched_message' must be true to use 'output_with_joined_delimiter'"
27
+ unless ['tag', 'all'].include?(@aggregate)
28
+ raise Fluent::ConfigError, "grepcounter aggregate allows tag/all"
29
+ end
30
+
31
+ case @aggregate
32
+ when 'all'
33
+ raise Fluent::ConfigError, "output_tag must be specified with aggregate all" if @output_tag.nil?
34
+ when 'tag'
35
+ # raise Fluent::ConfigError, "add_tag_prefix must be specified with aggregate tag" if @add_tag_prefix.nil?
28
36
  end
29
37
 
30
38
  @matches = {}
@@ -49,9 +57,9 @@ class Fluent::GrepCounterOutput < Fluent::Output
49
57
  # filter out and insert
50
58
  es.each do |time,record|
51
59
  value = record[@input_key]
52
- next unless @regexp and @regexp.match(value)
60
+ next if @regexp and !@regexp.match(value)
53
61
  next if @exclude and @exclude.match(value)
54
- matches << value if @output_matched_message
62
+ matches << value
55
63
  count += 1
56
64
  end
57
65
  # thread safe merge
@@ -83,23 +91,34 @@ class Fluent::GrepCounterOutput < Fluent::Output
83
91
  def flush_emit(step)
84
92
  time = Fluent::Engine.now
85
93
  flushed_counts, flushed_matches, @counts, @matches = @counts, @matches, {}, {}
86
- flushed_counts.keys.each do |tag|
87
- count = flushed_counts[tag]
88
- matches = flushed_matches[tag]
89
- output = generate_output(tag, count, matches)
90
- tag = @add_tag_prefix ? "#{@add_tag_prefix}.#{tag}" : @output_tag
91
- Fluent::Engine.emit(tag, time, output) if output
94
+
95
+ if @aggregate == 'all'
96
+ count = 0; matches = []
97
+ flushed_counts.keys.each do |tag|
98
+ count += flushed_counts[tag]
99
+ matches += flushed_matches[tag]
100
+ end
101
+ output = generate_output(count, matches)
102
+ Fluent::Engine.emit(@output_tag, time, output) if output
103
+ else
104
+ flushed_counts.keys.each do |tag|
105
+ count = flushed_counts[tag]
106
+ matches = flushed_matches[tag]
107
+ output = generate_output(count, matches, tag)
108
+ tag = @output_tag ? @output_tag : "#{@add_tag_prefix}.#{tag}"
109
+ Fluent::Engine.emit(tag, time, output) if output
110
+ end
92
111
  end
93
112
  end
94
113
 
95
- def generate_output(input_tag, count, matches)
114
+ def generate_output(count, matches, tag = nil)
96
115
  return nil if count < @threshold
97
116
  output = {}
98
117
  output['count'] = count
99
- output['input_tag'] = input_tag
100
- output['input_tag_last'] = input_tag.split(".").last
101
- if @output_matched_message
102
- output['message'] = @output_with_joined_delimiter.nil? ? matches : matches.join(@output_with_joined_delimiter)
118
+ output['message'] = @output_delimiter.nil? ? matches : matches.join(@output_delimiter)
119
+ if tag
120
+ output['input_tag'] = tag
121
+ output['input_tag_last'] = tag.split('.').last
103
122
  end
104
123
  output
105
124
  end
@@ -5,7 +5,6 @@ describe Fluent::GrepCounterOutput do
5
5
  before { Fluent::Test.setup }
6
6
  CONFIG = %[
7
7
  input_key message
8
- regexp WARN
9
8
  ]
10
9
  let(:tag) { 'syslog.host1' }
11
10
  let(:driver) { Fluent::Test::OutputTestDriver.new(Fluent::GrepCounterOutput, tag).configure(config) }
@@ -17,8 +16,21 @@ describe Fluent::GrepCounterOutput do
17
16
  it { expect { driver }.to raise_error(Fluent::ConfigError) }
18
17
  end
19
18
 
20
- context "check output_with_joined_delimiter" do
21
- let(:config) { CONFIG + %[ output_with_joined_delimiter \\n ] }
19
+ context 'invalid aggregate' do
20
+ let(:config) do
21
+ CONFIG + %[
22
+ aggregate foo
23
+ ]
24
+ end
25
+ it { expect { driver }.to raise_error(Fluent::ConfigError) }
26
+ end
27
+
28
+ context 'no tag for aggregate all' do
29
+ let(:config) do
30
+ CONFIG + %[
31
+ aggregate all
32
+ ]
33
+ end
22
34
  it { expect { driver }.to raise_error(Fluent::ConfigError) }
23
35
  end
24
36
  end
@@ -30,13 +42,11 @@ describe Fluent::GrepCounterOutput do
30
42
  let(:config) { CONFIG }
31
43
  its(:input_key) { should == "message" }
32
44
  its(:count_interval) { should == 5 }
33
- its(:regexp) { should == /WARN/ }
45
+ its(:regexp) { should be_nil }
34
46
  its(:exclude) { should be_nil }
35
47
  its(:threshold) { should == 1 }
36
- its(:output_tag) { should == 'count' }
37
- its(:add_tag_prefix) { should be_nil }
38
- its(:output_matched_message) { should be_false }
39
- its(:output_with_joined_delimiter) { should be_nil }
48
+ its(:output_tag) { should be_nil }
49
+ its(:add_tag_prefix) { should == 'count' }
40
50
  end
41
51
  end
42
52
  end
@@ -60,11 +70,28 @@ describe Fluent::GrepCounterOutput do
60
70
  pending
61
71
  end
62
72
 
73
+ context 'default' do
74
+ let(:config) { CONFIG }
75
+ before do
76
+ Fluent::Engine.stub(:now).and_return(time)
77
+ Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, {"count"=>4,
78
+ "message"=>["2013/01/13T07:02:11.124202 INFO GET /ping","2013/01/13T07:02:13.232645 WARN POST /auth","2013/01/13T07:02:21.542145 WARN GET /favicon.ico","2013/01/13T07:02:43.632145 WARN POST /login"],
79
+ "input_tag" => tag,
80
+ "input_tag_last" => tag.split('.').last,
81
+ })
82
+ end
83
+ it { emit }
84
+ end
85
+
63
86
  context 'regexp' do
64
87
  let(:config) { CONFIG + %[ regexp WARN ] }
65
88
  before do
66
89
  Fluent::Engine.stub(:now).and_return(time)
67
- Fluent::Engine.should_receive(:emit).with("count", time, {"count"=>3, "input_tag"=>tag, "input_tag_last"=>tag.split(".").last})
90
+ Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, {"count"=>3,
91
+ "message"=>["2013/01/13T07:02:13.232645 WARN POST /auth","2013/01/13T07:02:21.542145 WARN GET /favicon.ico","2013/01/13T07:02:43.632145 WARN POST /login"],
92
+ "input_tag" => tag,
93
+ "input_tag_last" => tag.split('.').last,
94
+ })
68
95
  end
69
96
  it { emit }
70
97
  end
@@ -72,12 +99,17 @@ describe Fluent::GrepCounterOutput do
72
99
  context 'exclude' do
73
100
  let(:config) do
74
101
  CONFIG + %[
102
+ regexp WARN
75
103
  exclude favicon
76
104
  ]
77
105
  end
78
106
  before do
79
107
  Fluent::Engine.stub(:now).and_return(time)
80
- Fluent::Engine.should_receive(:emit).with("count", time, {"count"=>2, "input_tag"=>tag, "input_tag_last"=>tag.split(".").last})
108
+ Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, {"count"=>2,
109
+ "message"=>["2013/01/13T07:02:13.232645 WARN POST /auth","2013/01/13T07:02:43.632145 WARN POST /login"],
110
+ "input_tag" => tag,
111
+ "input_tag_last" => tag.split('.').last,
112
+ })
81
113
  end
82
114
  it { emit }
83
115
  end
@@ -85,12 +117,17 @@ describe Fluent::GrepCounterOutput do
85
117
  context 'threshold (less than or equal to)' do
86
118
  let(:config) do
87
119
  CONFIG + %[
120
+ regexp WARN
88
121
  threshold 3
89
122
  ]
90
123
  end
91
124
  before do
92
125
  Fluent::Engine.stub(:now).and_return(time)
93
- Fluent::Engine.should_receive(:emit).with("count", time, {"count"=>3, "input_tag"=>tag, "input_tag_last"=>tag.split(".").last})
126
+ Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, {"count"=>3,
127
+ "message"=>["2013/01/13T07:02:13.232645 WARN POST /auth","2013/01/13T07:02:21.542145 WARN GET /favicon.ico","2013/01/13T07:02:43.632145 WARN POST /login"],
128
+ "input_tag" => tag,
129
+ "input_tag_last" => tag.split('.').last,
130
+ })
94
131
  end
95
132
  it { emit }
96
133
  end
@@ -98,6 +135,7 @@ describe Fluent::GrepCounterOutput do
98
135
  context 'threshold (greater)' do
99
136
  let(:config) do
100
137
  CONFIG + %[
138
+ regexp WARN
101
139
  threshold 4
102
140
  ]
103
141
  end
@@ -111,12 +149,17 @@ describe Fluent::GrepCounterOutput do
111
149
  context 'output_tag' do
112
150
  let(:config) do
113
151
  CONFIG + %[
152
+ regexp WARN
114
153
  output_tag foo
115
154
  ]
116
155
  end
117
156
  before do
118
157
  Fluent::Engine.stub(:now).and_return(time)
119
- Fluent::Engine.should_receive(:emit).with("foo", time, {"count"=>3, "input_tag"=>tag, "input_tag_last"=>tag.split(".").last})
158
+ Fluent::Engine.should_receive(:emit).with("foo", time, {"count"=>3,
159
+ "message"=>["2013/01/13T07:02:13.232645 WARN POST /auth","2013/01/13T07:02:21.542145 WARN GET /favicon.ico","2013/01/13T07:02:43.632145 WARN POST /login"],
160
+ "input_tag" => tag,
161
+ "input_tag_last" => tag.split('.').last,
162
+ })
120
163
  end
121
164
  it { emit }
122
165
  end
@@ -124,45 +167,52 @@ describe Fluent::GrepCounterOutput do
124
167
  context 'add_tag_prefix' do
125
168
  let(:config) do
126
169
  CONFIG + %[
170
+ regexp WARN
127
171
  add_tag_prefix foo
128
172
  ]
129
173
  end
130
174
  before do
131
175
  Fluent::Engine.stub(:now).and_return(time)
132
- Fluent::Engine.should_receive(:emit).with("foo.#{tag}", time, {"count"=>3, "input_tag"=>tag, "input_tag_last"=>tag.split(".").last})
176
+ Fluent::Engine.should_receive(:emit).with("foo.#{tag}", time, {"count"=>3,
177
+ "message"=>["2013/01/13T07:02:13.232645 WARN POST /auth","2013/01/13T07:02:21.542145 WARN GET /favicon.ico","2013/01/13T07:02:43.632145 WARN POST /login"],
178
+ "input_tag" => tag,
179
+ "input_tag_last" => tag.split('.').last,
180
+ })
133
181
  end
134
182
  it { emit }
135
183
  end
136
184
 
137
- context 'output_matched_message' do
185
+ context 'output_delimiter' do
138
186
  let(:config) do
187
+ # \\n shall be \n in config file
139
188
  CONFIG + %[
140
- output_matched_message true
189
+ regexp WARN
190
+ output_delimiter \\n
141
191
  ]
142
192
  end
143
193
  before do
144
194
  Fluent::Engine.stub(:now).and_return(time)
145
- Fluent::Engine.should_receive(:emit).with("count", time, {
146
- "count"=>3, "input_tag"=>tag, "input_tag_last"=>tag.split(".").last,
147
- "message"=>["2013/01/13T07:02:13.232645 WARN POST /auth","2013/01/13T07:02:21.542145 WARN GET /favicon.ico","2013/01/13T07:02:43.632145 WARN POST /login"]
195
+ Fluent::Engine.should_receive(:emit).with("count.#{tag}", time, {"count"=>3,
196
+ "message"=>"2013/01/13T07:02:13.232645 WARN POST /auth\\n2013/01/13T07:02:21.542145 WARN GET /favicon.ico\\n2013/01/13T07:02:43.632145 WARN POST /login",
197
+ "input_tag" => tag,
198
+ "input_tag_last" => tag.split('.').last,
148
199
  })
149
200
  end
150
201
  it { emit }
151
202
  end
152
203
 
153
- context 'output_with_joined_delimiter' do
204
+ context 'aggregate all' do
154
205
  let(:config) do
155
- # \\n shall be \n in config file
156
206
  CONFIG + %[
157
- output_matched_message true
158
- output_with_joined_delimiter \\n
207
+ regexp WARN
208
+ aggregate all
209
+ output_tag count
159
210
  ]
160
211
  end
161
212
  before do
162
213
  Fluent::Engine.stub(:now).and_return(time)
163
- Fluent::Engine.should_receive(:emit).with("count", time, {
164
- "count"=>3, "input_tag"=>tag, "input_tag_last"=>tag.split(".").last,
165
- "message"=>"2013/01/13T07:02:13.232645 WARN POST /auth\\n2013/01/13T07:02:21.542145 WARN GET /favicon.ico\\n2013/01/13T07:02:43.632145 WARN POST /login"
214
+ Fluent::Engine.should_receive(:emit).with("count", time, {"count"=>3,
215
+ "message"=>["2013/01/13T07:02:13.232645 WARN POST /auth","2013/01/13T07:02:21.542145 WARN GET /favicon.ico","2013/01/13T07:02:43.632145 WARN POST /login"],
166
216
  })
167
217
  end
168
218
  it { emit }
data/spec/spec_helper.rb CHANGED
@@ -4,6 +4,9 @@ require 'bundler'
4
4
  Bundler.setup(:default, :test)
5
5
  Bundler.require(:default, :test)
6
6
 
7
+ require 'coveralls'
8
+ Coveralls.wear!
9
+
7
10
  require 'fluent/test'
8
11
  require 'rspec'
9
12
  require 'pry'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-grepcounter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Naotoshi SEO
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-03-11 00:00:00.000000000 Z
11
+ date: 2013-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: coveralls
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: Count the number of matched messages
70
84
  email:
71
85
  - sonots@gmail.com
@@ -73,10 +87,12 @@ executables: []
73
87
  extensions: []
74
88
  extra_rdoc_files: []
75
89
  files:
90
+ - .coveralls.yml
76
91
  - .gitignore
77
92
  - .rdebugrc
78
93
  - .rspec
79
94
  - .travis.yml
95
+ - CHANGELOG.md
80
96
  - Gemfile
81
97
  - LICENSE
82
98
  - README.md
@@ -99,9 +115,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
99
115
  version: '0'
100
116
  required_rubygems_version: !ruby/object:Gem::Requirement
101
117
  requirements:
102
- - - '>='
118
+ - - '>'
103
119
  - !ruby/object:Gem::Version
104
- version: '0'
120
+ version: 1.3.1
105
121
  requirements: []
106
122
  rubyforge_project: fluent-plugin-grepcounter
107
123
  rubygems_version: 2.0.0