fluent-plugin-notifier 0.3.0 → 1.0.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: 661e25eea2608a53c2d916f2b70ef0c4b7ffcbb6
4
- data.tar.gz: 5672d2a300cb2009442b678a8bd88caeb3c4ff37
3
+ metadata.gz: 9dff806a4a4e3d1c5301c80cb450e129a3d2a772
4
+ data.tar.gz: c164675d4de2e69db7c28105439924c8a71b5a3a
5
5
  SHA512:
6
- metadata.gz: 65ed2a3ff591e1c35f0d5b423daae24e12e7fbbc4bfbd8eda4282b8ad74a6b7ca63878200a015124433de9f178203d9d45328ab974e7c74e42e0604c64597b17
7
- data.tar.gz: 63cc3d73f7d5daea73f57fa3366c033834e8b93c9348c375382c432b3ef93fcc51e672d264c7a69f2b6c667cf79b4cbf3414dedebe824ef4155ce67db8f65b7b
6
+ metadata.gz: 0d1fbf77d6b32db55cf3d9a9712480794fc80ee52a1114b1e749b343c57411e6ed3d077eb7c156946d8181ba104d52b9265151e8ad007df4b7c714fa54bb4c73
7
+ data.tar.gz: e8ab3552f88d2fb5a870ec4b7d4087d642ea9741166b05a6df5cc029780cd41c55dd38d989fd645b4b99ffbcbca3efdd43fa98349139b194053292985ccc0827
@@ -1,4 +1,7 @@
1
1
  language: ruby
2
+ sudo: false
2
3
  rvm:
3
- - 1.9.3
4
- - 2.0.0
4
+ - 2.1
5
+ - 2.2
6
+ - 2.3.3
7
+ - 2.4.0
@@ -0,0 +1,3 @@
1
+ appraise "fluentd v0.14" do
2
+ gem "fluentd", "~> 0.14.0"
3
+ end
data/README.md CHANGED
@@ -1,9 +1,5 @@
1
1
  # fluent-plugin-notifier
2
2
 
3
- ## Component
4
-
5
- ### NotifierOutput
6
-
7
3
  [Fluentd](http://fluentd.org) plugin to emit notifications for messages, with numbers over/under threshold, or specified pattern strings.
8
4
 
9
5
  ## Configuration
@@ -11,7 +7,8 @@
11
7
  To notify apache logs with over 1000000 (microseconds) duration for CRITICAL , or status '500' by string pattern match:
12
8
 
13
9
  <match apache.log.**>
14
- type notifier
10
+ @type notifier
11
+ @label @notification_events
15
12
  <def>
16
13
  pattern apache_duration
17
14
  check numeric_upward
@@ -29,7 +26,7 @@ To notify apache logs with over 1000000 (microseconds) duration for CRITICAL , o
29
26
  </def>
30
27
  </match>
31
28
 
32
- With this configuration, you will get notification message like this:
29
+ With this configuration, you will get notification messages in `<label @notification_events>` section, like this:
33
30
 
34
31
  2012-05-15 19:44:29 +0900 notification: {"pattern":"apache_duration","target_tag":"apache.log.xxx","target_key":"duration","check_type":"numeric_upward","level":"crit","threshold":1000000,"value":"1057231","message_time":"2012-05-15 19:44:27 +0900"}
35
32
  2012-05-15 19:44:29 +0900 notification: {"pattern":"status_500","target_tag":"apache.log.xxx","target_key":"status","check_type":"string_find","level":"crit","regexp":"/500/","value":"500","message_time":"2012-05-15 19:44:27 +0900"}
@@ -55,7 +52,8 @@ If you want to get every 5 minutes notifications (after 1 minutes notifications)
55
52
  To include specified messages into check target, or to exclude specified messages from check target, <test> directive is useful.
56
53
 
57
54
  <match apache.log.**>
58
- type notifier
55
+ @type notifier
56
+ @label @notifications
59
57
  <test>
60
58
  check numeric
61
59
  target_key duration # microseconds
@@ -70,6 +68,12 @@ To include specified messages into check target, or to exclude specified message
70
68
  target_key_pattern ^status.*$
71
69
  </def>
72
70
  </match>
71
+
72
+ <label @notifications>
73
+ <match **>
74
+ # send notifications to Slack, email or ...
75
+ </match>
76
+ </label>
73
77
 
74
78
  With configuration above, fluent-plugin-notifier checks messages with specified duration value (d: 5000 <= d <= 5000000), and others are ignored.
75
79
 
@@ -84,7 +88,8 @@ Available 'check' types are: 'numeric', 'regexp' and 'tag'.
84
88
  Multiple <test> directives means logical AND of each tests.
85
89
 
86
90
  <match apache.log.**>
87
- type notifier
91
+ @type notifier
92
+ @label @notifications
88
93
  input_tag_remove_prefix apache.log
89
94
  <test>
90
95
  check tag
@@ -1,7 +1,7 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  Gem::Specification.new do |gem|
3
3
  gem.name = "fluent-plugin-notifier"
4
- gem.version = "0.3.0"
4
+ gem.version = "1.0.0"
5
5
  gem.authors = ["TAGOMORI Satoshi"]
6
6
  gem.email = ["tagomoris@gmail.com"]
7
7
  gem.summary = %q{check matched messages and emit alert message}
@@ -14,7 +14,7 @@ Gem::Specification.new do |gem|
14
14
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
15
15
  gem.require_paths = ["lib"]
16
16
 
17
- gem.add_development_dependency "test-unit"
17
+ gem.add_runtime_dependency "fluentd", [">= 0.14.0"]
18
+ gem.add_development_dependency "test-unit", "~> 3.0"
18
19
  gem.add_development_dependency "rake"
19
- gem.add_runtime_dependency "fluentd", "< 0.14.0"
20
20
  end
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "fluentd", "~> 0.14.0"
6
+
7
+ gemspec :path => "../"
@@ -1,89 +1,125 @@
1
- class Fluent::NotifierOutput < Fluent::Output
1
+ require "fluent/plugin/output"
2
+
3
+ class Fluent::Plugin::NotifierOutput < Fluent::Plugin::Output
2
4
  Fluent::Plugin.register_output('notifier', self)
3
5
 
6
+ helpers :event_emitter
7
+
4
8
  NOTIFICATION_LEVELS = ['OK', 'WARN', 'CRIT', 'LOST'].freeze
5
9
 
6
10
  STATES_CLEAN_INTERVAL = 3600 # 1hours
7
11
  STATES_EXPIRE_SECONDS = 14400 # 4hours
8
12
 
9
- config_param :default_tag, :string, :default => 'notification'
10
- config_param :default_tag_warn, :string, :default => nil
11
- config_param :default_tag_crit, :string, :default => nil
13
+ config_param :default_tag, :string, default: 'notification'
14
+ config_param :default_tag_warn, :string, default: nil
15
+ config_param :default_tag_crit, :string, default: nil
12
16
 
13
- config_param :default_interval_1st, :time, :default => 60
14
- config_param :default_repetitions_1st, :integer, :default => 5
15
- config_param :default_interval_2nd, :time, :default => 300
16
- config_param :default_repetitions_2nd, :integer, :default => 5
17
- config_param :default_interval_3rd, :time, :default => 1800
17
+ config_param :default_intervals, :array, value_type: :time, default: [60, 300, 1800]
18
+ config_param :default_repetitions, :array, value_type: :integer, default: [5, 5]
18
19
 
19
- config_param :input_tag_remove_prefix, :string, :default => nil
20
+ config_param :default_interval_1st, :time, default: nil
21
+ config_param :default_interval_2nd, :time, default: nil
22
+ config_param :default_interval_3rd, :time, default: nil
23
+ config_param :default_repetitions_1st, :integer, default: nil
24
+ config_param :default_repetitions_2nd, :integer, default: nil
20
25
 
21
- attr_accessor :tests, :defs, :states, :match_cache, :negative_cache
26
+ config_param :input_tag_remove_prefix, :string, default: nil
22
27
 
23
- ### output
24
- # {
25
- # 'pattern' => 'http_status_errors',
26
- # 'target_tag' => 'httpstatus.blog',
27
- # 'target_key' => 'blog_5xx_percentage',
28
- # 'check_type' => 'numeric_upward'
29
- # 'level' => 'warn',
30
- # 'threshold' => 25, # or 'regexp' => ....,
31
- # 'value' => 49, # or 'value' => 'matched some string...',
32
- # 'message_time' => Time.instance
33
- # }
34
-
35
- # <match httpstatus.blog>
36
- # type notifier
37
- # default_tag notification
38
- # default_interval_1st 1m
39
- # default_repetitions_1st 5
40
- # default_interval_2nd 5m
41
- # default_repetitions_2nd 5
42
- # default_interval_3rd 30m
43
- # <test>
44
- # check numeric
45
- # target_key xxx
46
- # lower_threshold xxx
47
- # upper_threshold xxx
48
- # </test>
49
- # <test>
50
- # check regexp
51
- # target_key xxx
52
- # include_pattern ^.$
53
- # exclude_pattern ^.$
54
- # </test>
55
- # <def>
56
- # pattern http_status_errors
57
- # check numeric_upward
58
- # warn_threshold 25
59
- # crit_threshold 50
60
- # tag alert
61
- # # tag_warn alert.warn
62
- # # tag_crit alert.crit
63
- # # target_keys blog_5xx_percentage
64
- # target_key_pattern ^.*_5xx_percentage$
65
- # </def>
66
- # <def>
67
- # pattern log_checker
68
- # check string_find
69
- # crit_pattern 'ERROR'
70
- # warn_pattern 'WARNING'
71
- # tag alert
72
- # # target_keys message
73
- # target_key_pattern ^.*_message$
74
- # </def>
75
- # </match>
76
-
77
- # Define `log` method for v0.10.42 or earlier
78
- unless method_defined?(:log)
79
- define_method("log") { $log }
28
+ config_section :test, multi: true, param_name: :test_configs do
29
+ config_param :check, :enum, list: [:tag, :numeric, :regexp]
30
+ config_param :target_key, :string, default: nil
31
+ config_param :lower_threshold, :float, default: nil
32
+ config_param :upper_threshold, :float, default: nil
33
+ config_param :include_pattern, :string, default: nil
34
+ config_param :exclude_pattern, :string, default: nil
80
35
  end
81
36
 
82
- # Define `log` method for v0.10.57 or earlier
83
- unless method_defined?(:router)
84
- define_method(:router) { Fluent::Engine }
37
+ config_section :def, multi: true, param_name: :def_configs do
38
+ config_param :pattern, :string
39
+ config_param :check, :enum, list: [:numeric_upward, :numeric_downward, :string_find]
40
+
41
+ config_param :target_keys, :array, value_type: :string, default: nil
42
+ config_param :target_key_pattern, :string, default: nil
43
+ config_param :exclude_key_pattern, :string, default: '^$'
44
+
45
+ config_param :tag, :string, default: nil
46
+ config_param :tag_warn, :string, default: nil
47
+ config_param :tag_crit, :string, default: nil
48
+
49
+ # numeric_upward/downward
50
+ config_param :crit_threshold, :float, default: nil
51
+ config_param :warn_threshold, :float, default: nil
52
+
53
+ # string_find
54
+ config_param :crit_regexp, :string, default: nil
55
+ config_param :warn_regexp, :string, default: nil
56
+
57
+ # repeat & interval
58
+ config_param :intervals, :array, value_type: :time, default: nil
59
+ config_param :interval_1st, :time, default: nil
60
+ config_param :interval_2nd, :time, default: nil
61
+ config_param :interval_3rd, :time, default: nil
62
+ config_param :repetitions, :array, value_type: :integer, default: nil
63
+ config_param :repetitions_1st, :integer, default: nil
64
+ config_param :repetitions_2nd, :integer, default: nil
85
65
  end
86
66
 
67
+ attr_accessor :tests, :defs, :states, :match_cache, :negative_cache
68
+
69
+ ### output
70
+ # {
71
+ # 'pattern' => 'http_status_errors',
72
+ # 'target_tag' => 'httpstatus.blog',
73
+ # 'target_key' => 'blog_5xx_percentage',
74
+ # 'check_type' => 'numeric_upward'
75
+ # 'level' => 'warn',
76
+ # 'threshold' => 25, # or 'regexp' => ....,
77
+ # 'value' => 49, # or 'value' => 'matched some string...',
78
+ # 'message_time' => Time.instance
79
+ # }
80
+
81
+ # <match httpstatus.blog>
82
+ # type notifier
83
+ # default_tag notification
84
+ # default_interval_1st 1m
85
+ # default_repetitions_1st 5
86
+ # default_interval_2nd 5m
87
+ # default_repetitions_2nd 5
88
+ # default_interval_3rd 30m
89
+ # <test>
90
+ # check numeric
91
+ # target_key xxx
92
+ # lower_threshold xxx
93
+ # upper_threshold xxx
94
+ # </test>
95
+ # <test>
96
+ # check regexp
97
+ # target_key xxx
98
+ # include_pattern ^.$
99
+ # exclude_pattern ^.$
100
+ # </test>
101
+ # <def>
102
+ # pattern http_status_errors
103
+ # check numeric_upward
104
+ # warn_threshold 25
105
+ # crit_threshold 50
106
+ # tag alert
107
+ # # tag_warn alert.warn
108
+ # # tag_crit alert.crit
109
+ # # target_keys blog_5xx_percentage
110
+ # target_key_pattern ^.*_5xx_percentage$
111
+ # </def>
112
+ # <def>
113
+ # pattern log_checker
114
+ # check string_find
115
+ # crit_pattern 'ERROR'
116
+ # warn_pattern 'WARNING'
117
+ # tag alert
118
+ # # target_keys message
119
+ # target_key_pattern ^.*_message$
120
+ # </def>
121
+ # </match>
122
+
87
123
  def configure(conf)
88
124
  super
89
125
 
@@ -98,35 +134,40 @@ class Fluent::NotifierOutput < Fluent::Output
98
134
  @input_tag_remove_prefix_length = @input_tag_remove_prefix_string.length
99
135
  end
100
136
 
101
- defaults = {
102
- :tag => @default_tag, :tag_warn => @default_tag_warn, :tag_crit => @default_tag_crit,
103
- :interval_1st => @default_interval_1st, :repetitions_1st => @default_repetitions_1st,
104
- :interval_2nd => @default_interval_2nd, :repetitions_2nd => @default_repetitions_2nd,
105
- :interval_3rd => @default_interval_3rd,
106
- }
107
-
108
- conf.elements.each do |element|
109
- case element.name
110
- when 'test'
111
- @tests.push(Test.new(element))
112
- when 'def'
113
- @defs.push(Definition.new(element, defaults))
114
- else
115
- raise Fluent::ConfigError, "invalid section name for out_notifier: #{element.name}"
116
- end
137
+ if @default_interval_1st || @default_interval_2nd || @default_interval_3rd
138
+ @default_intervals = [
139
+ @default_interval_1st || @default_intervals[0],
140
+ @default_interval_2nd || @default_intervals[1],
141
+ @default_interval_3rd || @default_intervals[2],
142
+ ]
143
+ end
144
+ if @default_repetitions_1st || @default_repetitions_2nd
145
+ @default_repetitions = [
146
+ @default_repetitions_1st || @default_repetitions[0],
147
+ @default_repetitions_2nd || @default_repetitions[1],
148
+ ]
149
+ end
150
+
151
+ @test_configs.each do |test_config|
152
+ @tests << Test.new(test_config)
153
+ end
154
+ @def_configs.each do |def_config|
155
+ @defs << Definition.new(def_config, self)
117
156
  end
118
157
  end
119
158
 
159
+ def multi_workers_ready?
160
+ true
161
+ end
162
+
120
163
  def start
121
164
  super
122
165
  @mutex = Mutex.new
123
166
  @last_status_cleaned = Fluent::Engine.now
124
167
  end
125
168
 
126
- # def shutdown
127
- # end
128
-
129
169
  def suppressed_emit(notifications)
170
+ now = Fluent::Engine.now
130
171
  notifications.each do |n|
131
172
  hashkey = n.delete(:hashkey)
132
173
  definition = n.delete(:match_def)
@@ -135,11 +176,11 @@ class Fluent::NotifierOutput < Fluent::Output
135
176
  state = @states[hashkey]
136
177
  if state
137
178
  unless state.suppress?(definition, n)
138
- router.emit(tag, Fluent::Engine.now, n)
179
+ router.emit(tag, now, n)
139
180
  state.update_notified(definition, n)
140
181
  end
141
182
  else
142
- router.emit(tag, Fluent::Engine.now, n)
183
+ router.emit(tag, now, n)
143
184
  @states[hashkey] = State.new(n)
144
185
  end
145
186
  end
@@ -191,7 +232,7 @@ class Fluent::NotifierOutput < Fluent::Output
191
232
  notifications
192
233
  end
193
234
 
194
- def emit(tag, es, chain)
235
+ def process(tag, es)
195
236
  notifications = check(tag, es)
196
237
 
197
238
  if notifications.size > 0
@@ -206,8 +247,6 @@ class Fluent::NotifierOutput < Fluent::Output
206
247
  @last_status_cleaned = Fluent::Engine.now
207
248
  end
208
249
  end
209
-
210
- chain.next
211
250
  end
212
251
 
213
252
  class Test
@@ -215,45 +254,32 @@ class Fluent::NotifierOutput < Fluent::Output
215
254
  attr_accessor :lower_threshold, :upper_threshold
216
255
  attr_accessor :include_pattern, :exclude_pattern
217
256
 
218
- def initialize(element)
219
- element.keys.each do |k|
220
- v = element[k]
221
- case k
222
- when 'check'
223
- case v
224
- when 'tag'
225
- @check = :tag
226
- @include_pattern = element['include_pattern'] ? Regexp.compile(element['include_pattern']) : nil
227
- @exclude_pattern = element['exclude_pattern'] ? Regexp.compile(element['exclude_pattern']) : nil
228
- if @include_pattern.nil? and @exclude_pattern.nil?
229
- raise Fluent::ConfigError, "At least one of include_pattern or exclude_pattern must be specified for 'check tag'"
230
- end
231
- when 'numeric'
232
- @check = :numeric
233
- @lower_threshold = element['lower_threshold'] ? element['lower_threshold'].to_f : nil
234
- @upper_threshold = element['upper_threshold'] ? element['upper_threshold'].to_f : nil
235
- if @lower_threshold.nil? and @upper_threshold.nil?
236
- raise Fluent::ConfigError, "At least one of lower_threshold or upper_threshold must be specified for 'check numeric'"
237
- end
238
- when 'regexp'
239
- @check = :regexp
240
- @include_pattern = element['include_pattern'] ? Regexp.compile(element['include_pattern']) : nil
241
- @exclude_pattern = element['exclude_pattern'] ? Regexp.compile(element['exclude_pattern']) : nil
242
- if @include_pattern.nil? and @exclude_pattern.nil?
243
- raise Fluent::ConfigError, "At least one of include_pattern or exclude_pattern must be specified for 'check regexp'"
244
- end
245
- else
246
- raise Fluent::ConfigError, "invalid check value of test [numeric/regexp]: '#{v}'"
247
- end
248
- when 'target_key'
249
- @target_key = v
257
+ def initialize(section)
258
+ @check = section.check
259
+ @target_key = section.target_key
260
+ case @check
261
+ when :tag
262
+ if !section.include_pattern && !section.exclude_pattern
263
+ raise Fluent::ConfigError, "At least one of include_pattern or exclude_pattern must be specified for 'check tag'"
250
264
  end
251
- end
252
- unless @check
253
- raise Fluent::ConfigError, "'check' missing in <test> section"
254
- end
255
- if @target_key.nil? and @check != :tag
256
- raise Fluent::ConfigError, "'target_key' missing in <test> section"
265
+ @include_pattern = section.include_pattern ? Regexp.compile(section.include_pattern) : nil
266
+ @exclude_pattern = section.exclude_pattern ? Regexp.compile(section.exclude_pattern) : nil
267
+ when :numeric
268
+ if !section.lower_threshold && !section.upper_threshold
269
+ raise Fluent::ConfigError, "At least one of lower_threshold or upper_threshold must be specified for 'check numeric'"
270
+ end
271
+ raise Fluent::ConfigError, "'target_key' is needed for 'check numeric'" unless @target_key
272
+ @lower_threshold = section.lower_threshold
273
+ @upper_threshold = section.upper_threshold
274
+ when :regexp
275
+ if !section.include_pattern && !section.exclude_pattern
276
+ raise Fluent::ConfigError, "At least one of include_pattern or exclude_pattern must be specified for 'check regexp'"
277
+ end
278
+ raise Fluent::ConfigError, "'target_key' is needed for 'check regexp'" unless @target_key
279
+ @include_pattern = section.include_pattern ? Regexp.compile(section.include_pattern) : nil
280
+ @exclude_pattern = section.exclude_pattern ? Regexp.compile(section.exclude_pattern) : nil
281
+ else
282
+ raise "BUG: unknown check: #{@check}"
257
283
  end
258
284
  end
259
285
 
@@ -280,66 +306,64 @@ class Fluent::NotifierOutput < Fluent::Output
280
306
  class Definition
281
307
  attr_accessor :tag, :tag_warn, :tag_crit
282
308
  attr_accessor :intervals, :repetitions
283
- attr_accessor :pattern, :check, :target_keys, :target_key_pattern, :exclude_key_pattern
309
+ attr_accessor :pattern, :target_keys, :target_key_pattern, :exclude_key_pattern
284
310
  attr_accessor :crit_threshold, :warn_threshold # for 'numeric_upward', 'numeric_downward'
285
311
  attr_accessor :crit_regexp, :warn_regexp # for 'string_find'
286
312
 
287
- def initialize(element, defaults)
288
- element.keys.each do |k|
289
- case k
290
- when 'pattern'
291
- @pattern = element[k]
292
- when 'check'
293
- case element[k]
294
- when 'numeric_upward'
295
- @check = :upward
296
- unless element.has_key?('crit_threshold') and element.has_key?('warn_threshold')
297
- raise Fluent::ConfigError, "Both of crit_threshold and warn_threshold must be specified for 'check numeric_upward'"
298
- end
299
- @crit_threshold = element['crit_threshold'].to_f
300
- @warn_threshold = element['warn_threshold'].to_f
301
- when 'numeric_downward'
302
- @check = :downward
303
- unless element.has_key?('crit_threshold') and element.has_key?('warn_threshold')
304
- raise Fluent::ConfigError, "Both of crit_threshold and warn_threshold must be specified for 'check_numeric_downward'"
305
- end
306
- @crit_threshold = element['crit_threshold'].to_f
307
- @warn_threshold = element['warn_threshold'].to_f
308
- when 'string_find'
309
- @check = :find
310
- unless element.has_key?('crit_regexp') and element.has_key?('warn_regexp')
311
- raise Fluent::ConfigError, "Both of crit_regexp and warn_regexp must be specified for 'check string_find'"
312
- end
313
- @crit_regexp = Regexp.compile(element['crit_regexp'].to_s)
314
- @warn_regexp = Regexp.compile(element['warn_regexp'].to_s)
315
- else
316
- raise Fluent::ConfigError, "invalid check type: #{element[k]}"
317
- end
318
- when 'target_keys'
319
- @target_keys = element['target_keys'].split(',')
320
- when 'target_key_pattern'
321
- @target_key_pattern = Regexp.compile(element['target_key_pattern'])
322
- @exclude_key_pattern = Regexp.compile(element['exclude_key_pattern'] || '^$')
323
- end
324
- end
325
- if @pattern.nil? or @pattern.length < 1
326
- raise Fluent::ConfigError, "pattern must be set"
313
+ def initialize(section, plugin)
314
+ @pattern = section.pattern
315
+
316
+ @tag = section.tag || plugin.default_tag
317
+ @tag_warn = section.tag_warn || plugin.default_tag_warn
318
+ @tag_crit = section.tag_crit || plugin.default_tag_crit
319
+
320
+ @target_keys = section.target_keys
321
+ @target_key_pattern = section.target_key_pattern ? Regexp.compile(section.target_key_pattern) : nil
322
+ @exclude_key_pattern = section.exclude_key_pattern ? Regexp.compile(section.exclude_key_pattern) : nil
323
+ if !@target_keys and !@target_key_pattern
324
+ raise Fluent::ConfigError, "out_notifier needs one of target_keys or target_key_pattern in <def>"
327
325
  end
328
- if @target_keys.nil? and @target_key_pattern.nil?
329
- raise Fluent::ConfigError, "out_notifier needs one of target_keys or target_key_pattern"
326
+
327
+ case section.check
328
+ when :numeric_upward
329
+ @check = :upward
330
+ if !section.crit_threshold || !section.warn_threshold
331
+ raise Fluent::ConfigError, "Both of crit_threshold and warn_threshold must be specified for 'check numeric_upward'"
332
+ end
333
+ @crit_threshold = section.crit_threshold
334
+ @warn_threshold = section.warn_threshold
335
+ when :numeric_downward
336
+ @check = :downward
337
+ if !section.crit_threshold || !section.warn_threshold
338
+ raise Fluent::ConfigError, "Both of crit_threshold and warn_threshold must be specified for 'check numeric_downward'"
339
+ end
340
+ @crit_threshold = section.crit_threshold
341
+ @warn_threshold = section.warn_threshold
342
+ when :string_find
343
+ @check = :find
344
+ if !section.crit_regexp || !section.warn_regexp
345
+ raise Fluent::ConfigError, "Both of crit_regexp and warn_regexp must be specified for 'check string_find'"
346
+ end
347
+ @crit_regexp = Regexp.compile(section.crit_regexp)
348
+ @warn_regexp = Regexp.compile(section.warn_regexp)
349
+ else
350
+ raise "BUG: unknown check: #{section.check}"
330
351
  end
331
- @tag = element['tag'] || defaults[:tag]
332
- @tag_warn = element['tag_warn'] || defaults[:tag_warn]
333
- @tag_crit = element['tag_crit'] || defaults[:tag_crit]
334
- @intervals = [
335
- (element['interval_1st'] || defaults[:interval_1st]).to_f,
336
- (element['interval_2nd'] || defaults[:interval_2nd]).to_f,
337
- (element['interval_3rd'] || defaults[:interval_3rd]).to_f
338
- ]
339
- @repetitions = [
340
- (element['repetitions_1st'] || defaults[:repetitions_1st]).to_f,
341
- (element['repetitions_2nd'] || defaults[:repetitions_2nd]).to_f
342
- ]
352
+
353
+ @intervals = if section.intervals
354
+ section.intervals
355
+ elsif section.interval_1st || section.interval_2nd || section.interval_3rd
356
+ [section.interval_1st || plugin.default_intervals[0], section.interval_2nd || plugin.default_intervals[1], section.interval_3rd || plugin.default_intervals[2]]
357
+ else
358
+ plugin.default_intervals
359
+ end
360
+ @repetitions = if section.repetitions
361
+ section.repetitions
362
+ elsif section.repetitions_1st || section.repetitions_2nd
363
+ [section.repetitions_1st || plugin.default_repetitions[0], section.repetitions_2nd || plugin.default_repetitions[1]]
364
+ else
365
+ plugin.default_repetitions
366
+ end
343
367
  end
344
368
 
345
369
  def match?(key)
@@ -350,16 +374,16 @@ class Fluent::NotifierOutput < Fluent::Output
350
374
  end
351
375
  end
352
376
 
353
- # {
354
- # 'pattern' => 'http_status_errors',
355
- # 'target_tag' => 'httpstatus.blog',
356
- # 'target_key' => 'blog_5xx_percentage',
357
- # 'check_type' => 'numeric_upward'
358
- # 'level' => 'warn', # 'regexp' => '[WARN] .* MUST BE CHECKED!$'
359
- # 'threshold' => 25,
360
- # 'value' => 49, # 'value' => '2012/05/15 18:01:59 [WARN] wooooops, MUST BE CHECKED!'
361
- # 'message_time' => Time.instance
362
- # }
377
+ # {
378
+ # 'pattern' => 'http_status_errors',
379
+ # 'target_tag' => 'httpstatus.blog',
380
+ # 'target_key' => 'blog_5xx_percentage',
381
+ # 'check_type' => 'numeric_upward'
382
+ # 'level' => 'warn', # 'regexp' => '[WARN] .* MUST BE CHECKED!$'
383
+ # 'threshold' => 25,
384
+ # 'value' => 49, # 'value' => '2012/05/15 18:01:59 [WARN] wooooops, MUST BE CHECKED!'
385
+ # 'message_time' => Time.instance
386
+ # }
363
387
  def check(tag, time, record, key)
364
388
  case @check
365
389
  when :upward