fluent-plugin-stats-notifier 0.0.2 → 0.0.3

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: 7d2cfc5f24520dc1e1e27a516f2e9546de7eaf74
4
- data.tar.gz: b3dbf5efeb2ce58932e2d1519e4b95010985f39a
3
+ metadata.gz: 20ebee510eb1403230e4baee3b2b302e9d5a82dd
4
+ data.tar.gz: 64c9831470b6871e9f7df06efeb61d7c2d14466c
5
5
  SHA512:
6
- metadata.gz: 1496c8c85cf8ea9c720aa9405aaf8cfb668b4368fab424da0d5e67661657622e2cebc910b69b382923a8f8b442ac578ada134c75f29f7f6eb1eb38b5b1f6e210
7
- data.tar.gz: ac5fc0fb7203ab2674a090e424501b441a71b948fb86b3a94b754f96ba7acd5c07dfa27163be7f8de9d19a94bb0a9a7f58ee970dff4d6ca12763bf0d49f26ba9
6
+ metadata.gz: 3f5b4655b1d325fa5bfcb018f82ccc78e01815a5a7b2e7e8d57d042e3f48a0713eb6bd3671f36967f1910401b019ab4a04b4e091b69c150c8899e3e620dfa7ab
7
+ data.tar.gz: 0172ea3071a0713239147954b68818b8f57ccf8505c043f51a47977930b4ac3093a5452153ae2eadaf737cb695464612b1549967c39e524dfc9d2cdaffa605d5
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 0.0.3
2
+
3
+ Enchancements
4
+
5
+ * Add `aggregate` and `add_tag_prefix`, `remove_tag_prefix` options
6
+
1
7
  ## 0.0.2
2
8
 
3
9
  Changes
data/README.md CHANGED
@@ -55,15 +55,15 @@ then this plugin emits an message because the max of `4xx_count` is greater than
55
55
 
56
56
  - tag
57
57
 
58
- The output tag name.
58
+ The output tag name. Required for `aggregate all`.
59
59
 
60
60
  - add_tag_prefix
61
61
 
62
- (not available yet) Add tag prefix for output message.
62
+ Add tag prefix for output message. Required for `aggregate tag`.
63
63
 
64
64
  - aggragate
65
65
 
66
- (not available yet) Do calculation by each `tag` or `all`. The default value is `tag`.
66
+ Do calculation for each `tag` or `all`. The defaultis `all`.
67
67
 
68
68
  - store_file
69
69
 
@@ -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-stats-notifier"
6
- s.version = "0.0.2"
6
+ s.version = "0.0.3"
7
7
  s.authors = ["Naotoshi Seo"]
8
8
  s.email = ["sonots@gmail.com"]
9
9
  s.homepage = "https://github.com/sonots/fluent-plugin-stats-notifier"
@@ -15,6 +15,9 @@ class Fluent::StatsNotifierOutput < Fluent::Output
15
15
  config_param :greater_equal, :float, :default => nil
16
16
  config_param :compare_with, :string, :default => "max"
17
17
  config_param :tag, :string
18
+ config_param :add_tag_prefix, :string, :default => nil
19
+ config_param :remove_tag_prefix, :string, :default => nil
20
+ config_param :aggregate, :string, :default => 'all'
18
21
  config_param :store_file, :string, :default => nil
19
22
 
20
23
  attr_accessor :counts
@@ -48,6 +51,30 @@ class Fluent::StatsNotifierOutput < Fluent::Output
48
51
  raise Fluent::ConfigError, "out_stats_notiifer: `compare_with` must be one of `sum`, `max`, `min`, `avg`"
49
52
  end
50
53
 
54
+ case @aggregate
55
+ when 'all'
56
+ raise Fluent::ConfigError, "anomalydetect: `tag` must be specified with aggregate all" if @tag.nil?
57
+ when 'tag'
58
+ raise Fluent::ConfigError, "anomalydetect: `add_tag_prefix` must be specified with aggregate tag" if @add_tag_prefix.nil?
59
+ else
60
+ raise Fluent::ConfigError, "anomalydetect: aggregate allows tag/all"
61
+ end
62
+
63
+ @tag_prefix = "#{@add_tag_prefix}." if @add_tag_prefix
64
+ @tag_prefix_match = "#{@remove_tag_prefix}." if @remove_tag_prefix
65
+ @tag_proc =
66
+ if @tag_prefix and @tag_prefix_match
67
+ Proc.new {|tag| "#{@tag_prefix}#{lstrip(tag, @tag_prefix_match)}" }
68
+ elsif @tag_prefix_match
69
+ Proc.new {|tag| lstrip(tag, @tag_prefix_match) }
70
+ elsif @tag_prefix
71
+ Proc.new {|tag| "#{@tag_prefix}#{tag}" }
72
+ elsif @tag
73
+ Proc.new {|tag| @tag }
74
+ else
75
+ Proc.new {|tag| tag }
76
+ end
77
+
51
78
  @counts = {}
52
79
  @matches = {}
53
80
  @mutex = Mutex.new
@@ -74,7 +101,7 @@ class Fluent::StatsNotifierOutput < Fluent::Output
74
101
  count = 0; matches = {}
75
102
  es.each do |time,record|
76
103
  if record[key]
77
- # @todo: make an option for statsuation in the same tag. now only sum is supported
104
+ # @todo: make an option for calcuation in the same tag. now only sum is supported
78
105
  matches[key] = (matches[key] ? matches[key] + record[key] : record[key])
79
106
  end
80
107
  count += 1
@@ -85,7 +112,7 @@ class Fluent::StatsNotifierOutput < Fluent::Output
85
112
  @matches[tag] ||= {}
86
113
  @mutex.synchronize do
87
114
  if matches[key]
88
- # @todo: make an option for statsuation in the same tag. now only sum is supported
115
+ # @todo: make an option for calcuation in the same tag. now only sum is supported
89
116
  @matches[tag][key] = (@matches[tag][key] ? @matches[tag][key] + matches[key] : matches[key])
90
117
  end
91
118
  @counts[tag] += count
@@ -119,15 +146,23 @@ class Fluent::StatsNotifierOutput < Fluent::Output
119
146
  # This method is the real one to emit
120
147
  def flush_emit(step)
121
148
  time = Fluent::Engine.now
122
- flushed_counts, flushed_matches, @counts, @matches = @counts, @matches, {}, {}
123
-
124
- output = generate_output(flushed_counts, flushed_matches)
125
- Fluent::Engine.emit(@tag, time, output) if output
149
+ counts, matches, @counts, @matches = @counts, @matches, {}, {}
150
+
151
+ if @aggregate == 'all'
152
+ values = matches.values.map {|match| match[@target_key] }.compact
153
+ output = generate_output(values)
154
+ Fluent::Engine.emit(@tag, time, output) if output
155
+ else # aggregate tag
156
+ matches.each do |tag, match|
157
+ values = [match[@target_key]]
158
+ output = generate_output(values)
159
+ emit_tag = @tag_proc.call(tag)
160
+ Fluent::Engine.emit(emit_tag, time, output) if output
161
+ end
162
+ end
126
163
  end
127
164
 
128
- def generate_output(counts, matches)
129
- values = matches.values.map {|match| match[@target_key] }.compact
130
-
165
+ def generate_output(values)
131
166
  case @compare_with
132
167
  when :sum
133
168
  target_value = values.inject(:+)
@@ -145,6 +145,35 @@ describe Fluent::StatsNotifierOutput do
145
145
  end
146
146
  end
147
147
 
148
+ context 'aggregate' do
149
+ let(:emit) do
150
+ driver.run do
151
+ driver.emit_with_tag({"5xx_count"=>2}, time, 'foo.bar1')
152
+ driver.emit_with_tag({"5xx_count"=>6}, time, 'foo.bar2')
153
+ end
154
+ driver.instance.flush_emit(0)
155
+ end
156
+
157
+ context 'all' do
158
+ let(:config) { CONFIG + %[aggregate all \n tag foo \n compare_with sum] }
159
+ before do
160
+ Fluent::Engine.stub(:now).and_return(time)
161
+ Fluent::Engine.should_receive(:emit).with("foo", time, {"5xx_count"=>8.0})
162
+ end
163
+ it { emit }
164
+ end
165
+
166
+ context 'tag' do
167
+ let(:config) { CONFIG + %[aggregate tag \n add_tag_prefix add] }
168
+ before do
169
+ Fluent::Engine.stub(:now).and_return(time)
170
+ Fluent::Engine.should_receive(:emit).with("add.foo.bar1", time, {"5xx_count"=>2.0})
171
+ Fluent::Engine.should_receive(:emit).with("add.foo.bar2", time, {"5xx_count"=>6.0})
172
+ end
173
+ it { emit }
174
+ end
175
+ end
176
+
148
177
  context 'compare_with' do
149
178
  let(:emit) do
150
179
  driver.run do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-stats-notifier
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
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-12-27 00:00:00.000000000 Z
11
+ date: 2014-01-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fluentd