dogtrainer 0.1.0 → 0.1.1

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: 6b195d6ba08f5c8305b7bed4f4aaac84f24e678e
4
- data.tar.gz: 75d793bc0c14824a1c52b8155684a9cb5ab9b3e1
3
+ metadata.gz: 8e6664535d42df53717f7e3c2a08f59c1c69d898
4
+ data.tar.gz: f2dbcdc8d8f59fe052494811e168c577d504ba18
5
5
  SHA512:
6
- metadata.gz: 1ded76cc831e7c7d291db142fc5233362ce5d42afb05e05c448422eba521d122541c64d797fd6920175bc5ef54711e1fc5f7207d6b5825473a7f150026f1d9af
7
- data.tar.gz: d42b5f8d2e501e06f7d40eb297316d85cd295c80a8a89098aff268484d5d6a12e85374123200bf40760575c2a1439a33b3147c62a51a721c4c2aa21dc1a387d3
6
+ metadata.gz: e2f2dc0c0bde395d17d5f082f42945648ddf778ce381a0a342374c1213dc7fca11da4cdac8e47dfd6537309159a533be2095fe8f77044a9d76ea4f1f2e5b2766
7
+ data.tar.gz: 5fb760fa4430b82104498e91851059f35306807954d2244f24257184879a8864d6df9c5422b1c7c5bfe3462d78093e2b1600aab7999aaa815f570effb29bf096
@@ -4,16 +4,16 @@
4
4
  # - 'spec/unit/api_spec.rb'
5
5
 
6
6
  Metrics/AbcSize:
7
- Max: 50
7
+ Max: 100
8
8
 
9
9
  Metrics/ClassLength:
10
- Max: 300
10
+ Max: 999
11
11
 
12
12
  Metrics/CyclomaticComplexity:
13
- Max: 10
13
+ Max: 100
14
14
 
15
15
  Metrics/MethodLength:
16
- Max: 50
16
+ Max: 100
17
17
 
18
18
  Metrics/PerceivedComplexity:
19
19
  Max: 20
@@ -1,3 +1,13 @@
1
- Version 0.0.1
1
+ Version 0.1.1
2
+
3
+ - add ``message`` and ``escalation_message`` options to ``DogTrainer::API.upsert_monitor``
4
+ to allow user to easily override either or both of these
5
+ - handle a ``threshold`` Hash passed to ``DogTrainer::API.upsert_monitor`` and
6
+ ``DogTrainer::API.params_for_monitor``
7
+ - expose ``renotify_interval`` as an option on ``DogTrainer::API.upsert_monitor``
8
+ - pass ``mon_type`` through to ``DogTrainer::API.generate_messages`` and generate
9
+ different messages for service checks (which have warning or alert)
10
+
11
+ Version 0.1.0
2
12
 
3
13
  - initial release
data/README.md CHANGED
@@ -64,6 +64,10 @@ These examples all rely on the ``require`` and class instantiation above.
64
64
 
65
65
  #### Monitors
66
66
 
67
+ These configurations currently make some assumptions; if those aren't correct
68
+ for you, please open an issue. They also generate alert and escalation messages
69
+ from a template; see the example below to override them.
70
+
67
71
  Event alert on sparse data (lack of data should not trigger an alert):
68
72
 
69
73
  ```ruby
@@ -107,6 +111,59 @@ dog.upsert_monitor(
107
111
  )
108
112
  ```
109
113
 
114
+ Service Check ("app.ok" on host my.host.name) alert, with separate warning (2),
115
+ critical (5) and OK (1) thresholds, evalulated over the last 6 checks:
116
+
117
+ ```ruby
118
+ dog.upsert_monitor(
119
+ "App Health on my.host.name",
120
+ "\"app.ok\".over(\"host:my.host.name\").last(6).count_by_status()",
121
+ { 'warning' => 2, 'critical' => 5, 'ok' => 1 },
122
+ '<',
123
+ alert_no_data: false,
124
+ mon_type: 'service check'
125
+ )
126
+ ```
127
+
128
+ Override alert and escalation messages with your own:
129
+
130
+ ```ruby
131
+ dog.upsert_monitor(
132
+ "ASG In-Service Instances",
133
+ "avg(last_5m):sum:aws.autoscaling.group_in_service_instances{autoscaling_group:MY_ASG_NAME} < 2",
134
+ 2,
135
+ '>=',
136
+ message: 'my alert message',
137
+ escalation_message: 'my escalation message'
138
+ )
139
+ ```
140
+
141
+ Override only the alert message, leaving the default (generated by #generate_messages )
142
+ escalation message:
143
+
144
+ ```ruby
145
+ dog.upsert_monitor(
146
+ "ASG In-Service Instances",
147
+ "avg(last_5m):sum:aws.autoscaling.group_in_service_instances{autoscaling_group:MY_ASG_NAME} < 2",
148
+ 2,
149
+ '>=',
150
+ message: 'my alert message'
151
+ )
152
+ ```
153
+
154
+ Completely remove the escalation message, leaving the default
155
+ (generated by #generate_messages ) alert message:
156
+
157
+ ```ruby
158
+ dog.upsert_monitor(
159
+ "ASG In-Service Instances",
160
+ "avg(last_5m):sum:aws.autoscaling.group_in_service_instances{autoscaling_group:MY_ASG_NAME} < 2",
161
+ 2,
162
+ '>=',
163
+ escalation_message: nil
164
+ )
165
+ ```
166
+
110
167
  #### Boards
111
168
 
112
169
  Create a TimeBoard with a handful of graphs about the "MY_ELB_NAME" ELB,
@@ -97,7 +97,27 @@ module DogTrainer
97
97
  # monitored.
98
98
  # @param comparison [String] comparison operator or description for metric
99
99
  # vs threshold; i.e. ">=", "<=", "=", "<", etc.
100
- def generate_messages(metric_desc, comparison)
100
+ # @option mon_type [String] type of monitor as defined in DataDog
101
+ # API docs.
102
+ def generate_messages(metric_desc, comparison, mon_type)
103
+ if mon_type == 'service check'
104
+ message = [
105
+ "{{#is_alert}}'#{metric_desc}' is FAILING: {{check_message}}",
106
+ "{{/is_alert}}\n",
107
+ "{{#is_warning}}'#{metric_desc}' is WARNING: {{check_message}}",
108
+ "{{/is_warning}}\n",
109
+ "{{#is_recovery}}'#{metric_desc}' recovered: {{check_message}}",
110
+ "{{/is_recovery}}\n",
111
+ "{{#is_no_data}}'#{metric_desc}' is not reporting data",
112
+ "{{/is_no_data}}\n",
113
+ # repo path and notify to
114
+ '(monitor and threshold configuration for this alert is managed by ',
115
+ "#{@repo_path}) #{@notify_to}"
116
+ ].join('')
117
+ escalation = "'#{metric_desc}' is still in error state: " \
118
+ '{{check_message}}'
119
+ return [message, escalation]
120
+ end
101
121
  message = [
102
122
  "{{#is_alert}}'#{metric_desc}' should be #{comparison} {{threshold}}, ",
103
123
  "but is {{value}}.{{/is_alert}}\n",
@@ -119,7 +139,10 @@ module DogTrainer
119
139
  # account
120
140
  # @param message [String] alert/notification message for the monitor
121
141
  # @param query [String] query for the monitor to evaluate
122
- # @param threshold [Float] evaluation threshold for the monitor
142
+ # @param threshold [Float or Hash] evaluation threshold for the monitor;
143
+ # if a Float is passed, it will be provided as the ``critical`` threshold;
144
+ # otherise, a Hash in the form taken by the DataDog API should be provided
145
+ # (``critical``, ``warning`` and/or ``ok`` keys, Float values)
123
146
  # @param [Hash] options
124
147
  # @option options [String] :escalation_message optional escalation message
125
148
  # for escalation notifications. Defaults to nil.
@@ -127,6 +150,10 @@ module DogTrainer
127
150
  # of data. Defaults to true.
128
151
  # @option options [String] :mon_type type of monitor as defined in DataDog
129
152
  # API docs. Defaults to 'metric alert'.
153
+ # @option options [Integer] :renotify_interval the number of minutes after
154
+ # the last notification before a monitor will re-notify on the current
155
+ # status. It will re-notify only if not resolved. Default: 60. Set to nil
156
+ # to disable re-notification.
130
157
  def params_for_monitor(
131
158
  name,
132
159
  message,
@@ -135,11 +162,21 @@ module DogTrainer
135
162
  options = {
136
163
  escalation_message: nil,
137
164
  alert_no_data: true,
138
- mon_type: 'metric alert'
165
+ mon_type: 'metric alert',
166
+ renotify_interval: 60
139
167
  }
140
168
  )
141
169
  options[:alert_no_data] = true unless options.key?(:alert_no_data)
142
170
  options[:mon_type] = 'metric alert' unless options.key?(:mon_type)
171
+ options[:renotify_interval] = 60 unless options.key?(:renotify_interval)
172
+
173
+ # handle threshold hash
174
+ thresh = if threshold.is_a?(Hash)
175
+ threshold
176
+ else
177
+ { 'critical' => threshold }
178
+ end
179
+
143
180
  monitor_data = {
144
181
  'name' => name,
145
182
  'type' => options[:mon_type],
@@ -151,10 +188,10 @@ module DogTrainer
151
188
  'locked' => false,
152
189
  'timeout_h' => 0,
153
190
  'silenced' => {},
154
- 'thresholds' => { 'critical' => threshold },
191
+ 'thresholds' => thresh,
155
192
  'require_full_window' => false,
156
193
  'notify_no_data' => options[:alert_no_data],
157
- 'renotify_interval' => 60,
194
+ 'renotify_interval' => options[:renotify_interval],
158
195
  'no_data_timeframe' => 20
159
196
  }
160
197
  }
@@ -178,7 +215,10 @@ module DogTrainer
178
215
  # @param mon_name [String] name for the monitor; must be unique per DataDog
179
216
  # account
180
217
  # @param query [String] query for the monitor to evaluate
181
- # @param threshold [Float] evaluation threshold for the monitor
218
+ # @param threshold [Float or Hash] evaluation threshold for the monitor;
219
+ # if a Float is passed, it will be provided as the ``critical`` threshold;
220
+ # otherise, a Hash in the form taken by the DataDog API should be provided
221
+ # (``critical``, ``warning`` and/or ``ok`` keys, Float values)
182
222
  # @param comparator [String] comparison operator for metric vs threshold,
183
223
  # describing the inverse of the query. I.e. if the query is checking for
184
224
  # "< 100", then the comparator would be ">=".
@@ -187,20 +227,50 @@ module DogTrainer
187
227
  # of data. Defaults to true.
188
228
  # @option options [String] :mon_type type of monitor as defined in DataDog
189
229
  # API docs. Defaults to 'metric alert'.
230
+ # @option options [Integer] :renotify_interval the number of minutes after
231
+ # the last notification before a monitor will re-notify on the current
232
+ # status. It will re-notify only if not resolved. Default: 60. Set to nil
233
+ # to disable re-notification.
234
+ # @option options [String] :message alert/notification message for the
235
+ # monitor; if omitted, will be generated by #generate_messages
236
+ # @option options [String] :escalation_message optional escalation message
237
+ # for escalation notifications. If omitted, will be generated by
238
+ # #generate_messages; explicitly set to nil to not add an escalation
239
+ # message to the monitor.
190
240
  def upsert_monitor(
191
241
  mon_name,
192
242
  query,
193
243
  threshold,
194
244
  comparator,
195
- options = { alert_no_data: true, mon_type: 'metric alert' }
245
+ options = {
246
+ alert_no_data: true,
247
+ mon_type: 'metric alert',
248
+ renotify_interval: 60,
249
+ message: nil
250
+ }
196
251
  )
197
252
  options[:alert_no_data] = true unless options.key?(:alert_no_data)
198
253
  options[:mon_type] = 'metric alert' unless options.key?(:mon_type)
199
- message, escalation = generate_messages(mon_name, comparator)
254
+ options[:renotify_interval] = 60 unless options.key?(:renotify_interval)
255
+
256
+ msg, esc = generate_messages(mon_name, comparator, options[:mon_type])
257
+ message = if options[:message].nil?
258
+ msg
259
+ else
260
+ options[:message]
261
+ end
262
+ escalation = if options.key?(:escalation_message)
263
+ options[:escalation_message]
264
+ else
265
+ esc
266
+ end
267
+
268
+ rno = options[:renotify_interval]
200
269
  mon_params = params_for_monitor(mon_name, message, query, threshold,
201
270
  escalation_message: escalation,
202
271
  alert_no_data: options[:alert_no_data],
203
- mon_type: options[:mon_type])
272
+ mon_type: options[:mon_type],
273
+ renotify_interval: rno)
204
274
  logger.info "Upserting monitor: #{mon_name}"
205
275
  monitor = get_existing_monitor_by_name(mon_name)
206
276
  return create_monitor(mon_name, mon_params) if monitor.nil?
@@ -1,4 +1,4 @@
1
1
  module DogTrainer
2
2
  # store the verson of the Gem/module; used in the gemspec and in messages
3
- VERSION = '0.1.0'.freeze
3
+ VERSION = '0.1.1'.freeze
4
4
  end
@@ -148,21 +148,44 @@ describe DogTrainer::API do
148
148
  end
149
149
  end
150
150
  describe '#generate_messages' do
151
- it 'returns the appropriate message' do
152
- expected = "{{#is_alert}}'mydesc' should be comp {{threshold}},"
153
- expected += " but is {{value}}.{{/is_alert}}\n"
154
- expected += "{{#is_recovery}}'mydesc' recovered (current value "
155
- expected += '{{value}} is comp threshold of {{threshold}}).'
156
- expected += "{{/is_recovery}}\n(monitor and threshold configuration "
157
- expected += 'for this alert is managed by my_repo_path) @my-notify-to'
158
- msg, = subject.generate_messages('mydesc', 'comp')
159
- expect(msg).to eq(expected)
151
+ context 'mon_type metric alert' do
152
+ it 'returns the appropriate message' do
153
+ expected = "{{#is_alert}}'mydesc' should be comp {{threshold}},"
154
+ expected += " but is {{value}}.{{/is_alert}}\n"
155
+ expected += "{{#is_recovery}}'mydesc' recovered (current value "
156
+ expected += '{{value}} is comp threshold of {{threshold}}).'
157
+ expected += "{{/is_recovery}}\n(monitor and threshold configuration "
158
+ expected += 'for this alert is managed by my_repo_path) @my-notify-to'
159
+ msg, = subject.generate_messages('mydesc', 'comp', 'metric alert')
160
+ expect(msg).to eq(expected)
161
+ end
162
+ it 'returns the appropriate message' do
163
+ escalation = "'mydesc' is still in error state (current value {{value}}"
164
+ escalation += ' is comp threshold of {{threshold}})'
165
+ _, esc = subject.generate_messages('mydesc', 'comp', 'metric alert')
166
+ expect(esc).to eq(escalation)
167
+ end
160
168
  end
161
- it 'returns the appropriate message' do
162
- escalation = "'mydesc' is still in error state (current value {{value}}"
163
- escalation += ' is comp threshold of {{threshold}})'
164
- _, esc = subject.generate_messages('mydesc', 'comp')
165
- expect(esc).to eq(escalation)
169
+ context 'mon_type service check' do
170
+ it 'returns the appropriate message' do
171
+ expected = "{{#is_alert}}'mydesc' is FAILING: {{check_message}}" \
172
+ "{{/is_alert}}\n"
173
+ expected += "{{#is_warning}}'mydesc' is WARNING: {{check_message}}" \
174
+ "{{/is_warning}}\n"
175
+ expected += "{{#is_recovery}}'mydesc' recovered: {{check_message}}" \
176
+ "{{/is_recovery}}\n"
177
+ expected += "{{#is_no_data}}'mydesc' is not reporting data" \
178
+ "{{/is_no_data}}\n"
179
+ expected += '(monitor and threshold configuration '
180
+ expected += 'for this alert is managed by my_repo_path) @my-notify-to'
181
+ msg, = subject.generate_messages('mydesc', 'comp', 'service check')
182
+ expect(msg).to eq(expected)
183
+ end
184
+ it 'returns the appropriate message' do
185
+ escalation = "'mydesc' is still in error state: {{check_message}}"
186
+ _, esc = subject.generate_messages('mydesc', 'comp', 'service check')
187
+ expect(esc).to eq(escalation)
188
+ end
166
189
  end
167
190
  end
168
191
  describe '#params_for_monitor' do
@@ -247,6 +270,68 @@ describe DogTrainer::API do
247
270
  mon_type: 'foo'
248
271
  )).to eq(expected)
249
272
  end
273
+ it 'sets renotify_interval if provided in options' do
274
+ expected = {
275
+ 'name' => 'monname',
276
+ 'type' => 'metric alert',
277
+ 'query' => 'my_query',
278
+ 'message' => 'my_msg',
279
+ 'tags' => [],
280
+ 'options' => {
281
+ 'notify_audit' => false,
282
+ 'locked' => false,
283
+ 'timeout_h' => 0,
284
+ 'silenced' => {},
285
+ 'thresholds' => { 'critical' => 123.4 },
286
+ 'require_full_window' => false,
287
+ 'notify_no_data' => true,
288
+ 'renotify_interval' => 120,
289
+ 'no_data_timeframe' => 20
290
+ }
291
+ }
292
+ expect(subject.params_for_monitor(
293
+ 'monname',
294
+ 'my_msg',
295
+ 'my_query',
296
+ 123.4,
297
+ renotify_interval: 120
298
+ )).to eq(expected)
299
+ end
300
+ it 'passes through a threshold Hash' do
301
+ expected = {
302
+ 'name' => 'monname',
303
+ 'type' => 'foo',
304
+ 'query' => 'my_query',
305
+ 'message' => 'my_msg',
306
+ 'tags' => [],
307
+ 'options' => {
308
+ 'notify_audit' => false,
309
+ 'locked' => false,
310
+ 'timeout_h' => 0,
311
+ 'silenced' => {},
312
+ 'thresholds' => {
313
+ 'warning' => 50,
314
+ 'critical' => 123.4,
315
+ 'ok' => 20
316
+ },
317
+ 'require_full_window' => false,
318
+ 'notify_no_data' => true,
319
+ 'renotify_interval' => 60,
320
+ 'no_data_timeframe' => 20
321
+ }
322
+ }
323
+ expect(subject.params_for_monitor(
324
+ 'monname',
325
+ 'my_msg',
326
+ 'my_query',
327
+ {
328
+ 'warning' => 50,
329
+ 'critical' => 123.4,
330
+ 'ok' => 20
331
+ },
332
+ mon_type: 'foo'
333
+ )).to eq(expected)
334
+ end
250
335
  it 'sets notify_no_data to false if provided in options' do
251
336
  expected = {
252
337
  'name' => 'monname',
@@ -289,7 +374,7 @@ describe DogTrainer::API do
289
374
  'thresholds' => { 'critical' => 123.4 },
290
375
  'require_full_window' => false,
291
376
  'notify_no_data' => false,
292
- 'renotify_interval' => 60,
377
+ 'renotify_interval' => 123,
293
378
  'no_data_timeframe' => 20,
294
379
  'escalation_message' => 'myesc'
295
380
  }
@@ -301,7 +386,8 @@ describe DogTrainer::API do
301
386
  123.4,
302
387
  alert_no_data: false,
303
388
  mon_type: 'foo',
304
- escalation_message: 'myesc'
389
+ escalation_message: 'myesc',
390
+ renotify_interval: 123
305
391
  )).to eq(expected)
306
392
  end
307
393
  end
@@ -321,11 +407,13 @@ describe DogTrainer::API do
321
407
  .and_return('12345')
322
408
 
323
409
  expect(dog).to_not receive(:update_monitor)
324
- expect(subject).to receive(:generate_messages).once.with('mname', '>=')
410
+ expect(subject).to receive(:generate_messages).once
411
+ .with('mname', '>=', 'metric alert')
325
412
  expect(subject).to receive(:params_for_monitor).once
326
413
  .with('mname', 'msg', 'my_query', 123.4, escalation_message: 'esc',
327
414
  alert_no_data: true,
328
- mon_type: 'metric alert')
415
+ mon_type: 'metric alert',
416
+ renotify_interval: 60)
329
417
  expect(subject).to receive(:get_existing_monitor_by_name).once
330
418
  .with('mname')
331
419
  expect(subject).to receive(:create_monitor).once
@@ -338,6 +426,41 @@ describe DogTrainer::API do
338
426
  '>='
339
427
  )).to eq('12345')
340
428
  end
429
+ it 'handles a hash threshold' do
430
+ params = { 'foo' => 'bar', 'baz' => 'blam' }
431
+ dog = double(Dogapi::Client)
432
+ allow(dog).to receive(:update_monitor).with(any_args)
433
+ subject.instance_variable_set('@dog', dog)
434
+ allow(subject).to receive(:generate_messages).with(any_args)
435
+ .and_return(%w(msg esc))
436
+ allow(subject).to receive(:params_for_monitor).with(any_args)
437
+ .and_return(params)
438
+ allow(subject).to receive(:get_existing_monitor_by_name).with(any_args)
439
+ .and_return(nil)
440
+ allow(subject).to receive(:create_monitor).with(any_args)
441
+ .and_return('12345')
442
+
443
+ expect(dog).to_not receive(:update_monitor)
444
+ expect(subject).to receive(:generate_messages).once
445
+ .with('mname', '>=', 'metric alert')
446
+ expect(subject).to receive(:params_for_monitor).once
447
+ .with('mname', 'msg', 'my_query', { 'warning' => 5.3, 'ok' => 1 },
448
+ escalation_message: 'esc',
449
+ alert_no_data: true,
450
+ mon_type: 'metric alert',
451
+ renotify_interval: 60)
452
+ expect(subject).to receive(:get_existing_monitor_by_name).once
453
+ .with('mname')
454
+ expect(subject).to receive(:create_monitor).once
455
+ .with('mname', params)
456
+
457
+ expect(subject.upsert_monitor(
458
+ 'mname',
459
+ 'my_query',
460
+ { 'warning' => 5.3, 'ok' => 1 },
461
+ '>='
462
+ )).to eq('12345')
463
+ end
341
464
  it 'does nothing if it already exists with the right params' do
342
465
  params = { 'foo' => 'bar', 'baz' => 'blam' }
343
466
  existing = { 'foo' => 'bar', 'baz' => 'blam', 'id' => 'monid' }
@@ -354,11 +477,13 @@ describe DogTrainer::API do
354
477
  .and_return('12345')
355
478
 
356
479
  expect(dog).to_not receive(:update_monitor)
357
- expect(subject).to receive(:generate_messages).once.with('mname', '>=')
480
+ expect(subject).to receive(:generate_messages).once
481
+ .with('mname', '>=', 'metric alert')
358
482
  expect(subject).to receive(:params_for_monitor).once
359
483
  .with('mname', 'msg', 'my_query', 123.4, escalation_message: 'esc',
360
484
  alert_no_data: true,
361
- mon_type: 'metric alert')
485
+ mon_type: 'metric alert',
486
+ renotify_interval: 60)
362
487
  expect(subject).to receive(:get_existing_monitor_by_name).once
363
488
  .with('mname')
364
489
  expect(subject).to_not receive(:create_monitor)
@@ -398,11 +523,13 @@ describe DogTrainer::API do
398
523
 
399
524
  expect(dog).to receive(:update_monitor).once
400
525
  .with('monid', 'my_query', params)
401
- expect(subject).to receive(:generate_messages).once.with('mname', '>=')
526
+ expect(subject).to receive(:generate_messages).once
527
+ .with('mname', '>=', 'metric alert')
402
528
  expect(subject).to receive(:params_for_monitor).once
403
529
  .with('mname', 'msg', 'my_query', 123.4, escalation_message: 'esc',
404
530
  alert_no_data: true,
405
- mon_type: 'metric alert')
531
+ mon_type: 'metric alert',
532
+ renotify_interval: 60)
406
533
  expect(subject).to receive(:get_existing_monitor_by_name).once
407
534
  .with('mname')
408
535
  expect(subject).to_not receive(:create_monitor)
@@ -437,11 +564,13 @@ describe DogTrainer::API do
437
564
 
438
565
  expect(dog).to receive(:update_monitor).once
439
566
  .with('monid', 'my_query', params)
440
- expect(subject).to receive(:generate_messages).once.with('mname', '>=')
567
+ expect(subject).to receive(:generate_messages).once
568
+ .with('mname', '>=', 'metric alert')
441
569
  expect(subject).to receive(:params_for_monitor).once
442
570
  .with('mname', 'msg', 'my_query', 123.4, escalation_message: 'esc',
443
571
  alert_no_data: true,
444
- mon_type: 'metric alert')
572
+ mon_type: 'metric alert',
573
+ renotify_interval: 60)
445
574
  expect(subject).to receive(:get_existing_monitor_by_name).once
446
575
  .with('mname')
447
576
  expect(subject).to_not receive(:create_monitor)
@@ -484,11 +613,13 @@ describe DogTrainer::API do
484
613
 
485
614
  expect(dog).to receive(:update_monitor).once
486
615
  .with('monid', 'my_query', params)
487
- expect(subject).to receive(:generate_messages).once.with('mname', '>=')
616
+ expect(subject).to receive(:generate_messages).once
617
+ .with('mname', '>=', 'metric alert')
488
618
  expect(subject).to receive(:params_for_monitor).once
489
619
  .with('mname', 'msg', 'my_query', 123.4, escalation_message: 'esc',
490
620
  alert_no_data: true,
491
- mon_type: 'metric alert')
621
+ mon_type: 'metric alert',
622
+ renotify_interval: 60)
492
623
  expect(subject).to receive(:get_existing_monitor_by_name).once
493
624
  .with('mname')
494
625
  expect(subject).to_not receive(:create_monitor)
@@ -518,11 +649,13 @@ describe DogTrainer::API do
518
649
  .and_return('12345')
519
650
 
520
651
  expect(dog).to_not receive(:update_monitor)
521
- expect(subject).to receive(:generate_messages).once.with('mname', '>=')
652
+ expect(subject).to receive(:generate_messages).once
653
+ .with('mname', '>=', 'metric alert')
522
654
  expect(subject).to receive(:params_for_monitor).once
523
655
  .with('mname', 'msg', 'my_query', 123.4, escalation_message: 'esc',
524
656
  alert_no_data: false,
525
- mon_type: 'metric alert')
657
+ mon_type: 'metric alert',
658
+ renotify_interval: 60)
526
659
  expect(subject).to receive(:get_existing_monitor_by_name).once
527
660
  .with('mname')
528
661
  expect(subject).to_not receive(:create_monitor)
@@ -551,11 +684,13 @@ describe DogTrainer::API do
551
684
  .and_return('12345')
552
685
 
553
686
  expect(dog).to_not receive(:update_monitor)
554
- expect(subject).to receive(:generate_messages).once.with('mname', '>=')
687
+ expect(subject).to receive(:generate_messages).once
688
+ .with('mname', '>=', 'foobar')
555
689
  expect(subject).to receive(:params_for_monitor).once
556
690
  .with('mname', 'msg', 'my_query', 123.4, escalation_message: 'esc',
557
691
  alert_no_data: true,
558
- mon_type: 'foobar')
692
+ mon_type: 'foobar',
693
+ renotify_interval: 60)
559
694
  expect(subject).to receive(:get_existing_monitor_by_name).once
560
695
  .with('mname')
561
696
  expect(subject).to_not receive(:create_monitor)
@@ -568,6 +703,221 @@ describe DogTrainer::API do
568
703
  mon_type: 'foobar'
569
704
  )).to eq('monid')
570
705
  end
706
+ it 'handles sparse options, with only renotify_interval' do
707
+ params = { 'foo' => 'bar', 'baz' => 'blam' }
708
+ existing = { 'foo' => 'bar', 'baz' => 'blam', 'id' => 'monid' }
709
+ dog = double(Dogapi::Client)
710
+ allow(dog).to receive(:update_monitor).with(any_args)
711
+ subject.instance_variable_set('@dog', dog)
712
+ allow(subject).to receive(:generate_messages).with(any_args)
713
+ .and_return(%w(msg esc))
714
+ allow(subject).to receive(:params_for_monitor).with(any_args)
715
+ .and_return(params)
716
+ allow(subject).to receive(:get_existing_monitor_by_name).with(any_args)
717
+ .and_return(existing)
718
+ allow(subject).to receive(:create_monitor).with(any_args)
719
+ .and_return('12345')
720
+
721
+ expect(dog).to_not receive(:update_monitor)
722
+ expect(subject).to receive(:generate_messages).once
723
+ .with('mname', '>=', 'metric alert')
724
+ expect(subject).to receive(:params_for_monitor).once
725
+ .with('mname', 'msg', 'my_query', 123.4, escalation_message: 'esc',
726
+ alert_no_data: true,
727
+ mon_type: 'metric alert',
728
+ renotify_interval: 100)
729
+ expect(subject).to receive(:get_existing_monitor_by_name).once
730
+ .with('mname')
731
+ expect(subject).to_not receive(:create_monitor)
732
+
733
+ expect(subject.upsert_monitor(
734
+ 'mname',
735
+ 'my_query',
736
+ 123.4,
737
+ '>=',
738
+ renotify_interval: 100
739
+ )).to eq('monid')
740
+ end
741
+ it 'handles sparse options, with only message' do
742
+ params = { 'foo' => 'bar', 'baz' => 'blam' }
743
+ existing = { 'foo' => 'bar', 'baz' => 'blam', 'id' => 'monid' }
744
+ dog = double(Dogapi::Client)
745
+ allow(dog).to receive(:update_monitor).with(any_args)
746
+ subject.instance_variable_set('@dog', dog)
747
+ allow(subject).to receive(:generate_messages).with(any_args)
748
+ .and_return(%w(msg esc))
749
+ allow(subject).to receive(:params_for_monitor).with(any_args)
750
+ .and_return(params)
751
+ allow(subject).to receive(:get_existing_monitor_by_name).with(any_args)
752
+ .and_return(existing)
753
+ allow(subject).to receive(:create_monitor).with(any_args)
754
+ .and_return('12345')
755
+
756
+ expect(dog).to_not receive(:update_monitor)
757
+ expect(subject).to receive(:generate_messages).once
758
+ .with('mname', '>=', 'metric alert')
759
+ expect(subject).to receive(:params_for_monitor).once
760
+ .with('mname', 'foo', 'my_query', 123.4, escalation_message: 'esc',
761
+ alert_no_data: true,
762
+ mon_type: 'metric alert',
763
+ renotify_interval: 60)
764
+ expect(subject).to receive(:get_existing_monitor_by_name).once
765
+ .with('mname')
766
+ expect(subject).to_not receive(:create_monitor)
767
+
768
+ expect(subject.upsert_monitor(
769
+ 'mname',
770
+ 'my_query',
771
+ 123.4,
772
+ '>=',
773
+ message: 'foo'
774
+ )).to eq('monid')
775
+ end
776
+ it 'handles sparse options, with only escalation_message' do
777
+ params = { 'foo' => 'bar', 'baz' => 'blam' }
778
+ existing = { 'foo' => 'bar', 'baz' => 'blam', 'id' => 'monid' }
779
+ dog = double(Dogapi::Client)
780
+ allow(dog).to receive(:update_monitor).with(any_args)
781
+ subject.instance_variable_set('@dog', dog)
782
+ allow(subject).to receive(:generate_messages).with(any_args)
783
+ .and_return(%w(msg esc))
784
+ allow(subject).to receive(:params_for_monitor).with(any_args)
785
+ .and_return(params)
786
+ allow(subject).to receive(:get_existing_monitor_by_name).with(any_args)
787
+ .and_return(existing)
788
+ allow(subject).to receive(:create_monitor).with(any_args)
789
+ .and_return('12345')
790
+
791
+ expect(dog).to_not receive(:update_monitor)
792
+ expect(subject).to receive(:generate_messages).once
793
+ .with('mname', '>=', 'metric alert')
794
+ expect(subject).to receive(:params_for_monitor).once
795
+ .with('mname', 'msg', 'my_query', 123.4, escalation_message: 'bar',
796
+ alert_no_data: true,
797
+ mon_type: 'metric alert',
798
+ renotify_interval: 60)
799
+ expect(subject).to receive(:get_existing_monitor_by_name).once
800
+ .with('mname')
801
+ expect(subject).to_not receive(:create_monitor)
802
+
803
+ expect(subject.upsert_monitor(
804
+ 'mname',
805
+ 'my_query',
806
+ 123.4,
807
+ '>=',
808
+ escalation_message: 'bar'
809
+ )).to eq('monid')
810
+ end
811
+ it 'handles sparse options, with only message and escalation_message' do
812
+ params = { 'foo' => 'bar', 'baz' => 'blam' }
813
+ existing = { 'foo' => 'bar', 'baz' => 'blam', 'id' => 'monid' }
814
+ dog = double(Dogapi::Client)
815
+ allow(dog).to receive(:update_monitor).with(any_args)
816
+ subject.instance_variable_set('@dog', dog)
817
+ allow(subject).to receive(:generate_messages).with(any_args)
818
+ .and_return(%w(msg esc))
819
+ allow(subject).to receive(:params_for_monitor).with(any_args)
820
+ .and_return(params)
821
+ allow(subject).to receive(:get_existing_monitor_by_name).with(any_args)
822
+ .and_return(existing)
823
+ allow(subject).to receive(:create_monitor).with(any_args)
824
+ .and_return('12345')
825
+
826
+ expect(dog).to_not receive(:update_monitor)
827
+ expect(subject).to receive(:generate_messages).once
828
+ .with('mname', '>=', 'metric alert')
829
+ expect(subject).to receive(:params_for_monitor).once
830
+ .with('mname', 'foo', 'my_query', 123.4, escalation_message: 'bar',
831
+ alert_no_data: true,
832
+ mon_type: 'metric alert',
833
+ renotify_interval: 60)
834
+ expect(subject).to receive(:get_existing_monitor_by_name).once
835
+ .with('mname')
836
+ expect(subject).to_not receive(:create_monitor)
837
+
838
+ expect(subject.upsert_monitor(
839
+ 'mname',
840
+ 'my_query',
841
+ 123.4,
842
+ '>=',
843
+ message: 'foo',
844
+ escalation_message: 'bar'
845
+ )).to eq('monid')
846
+ end
847
+ it 'handles sparse options, with only escalation_message set to nil' do
848
+ params = { 'foo' => 'bar', 'baz' => 'blam' }
849
+ existing = { 'foo' => 'bar', 'baz' => 'blam', 'id' => 'monid' }
850
+ dog = double(Dogapi::Client)
851
+ allow(dog).to receive(:update_monitor).with(any_args)
852
+ subject.instance_variable_set('@dog', dog)
853
+ allow(subject).to receive(:generate_messages).with(any_args)
854
+ .and_return(%w(msg esc))
855
+ allow(subject).to receive(:params_for_monitor).with(any_args)
856
+ .and_return(params)
857
+ allow(subject).to receive(:get_existing_monitor_by_name).with(any_args)
858
+ .and_return(existing)
859
+ allow(subject).to receive(:create_monitor).with(any_args)
860
+ .and_return('12345')
861
+
862
+ expect(dog).to_not receive(:update_monitor)
863
+ expect(subject).to receive(:generate_messages).once
864
+ .with('mname', '>=', 'metric alert')
865
+ expect(subject).to receive(:params_for_monitor).once
866
+ .with('mname', 'msg', 'my_query', 123.4, alert_no_data: true,
867
+ mon_type: 'metric alert',
868
+ renotify_interval: 60,
869
+ escalation_message: nil)
870
+ expect(subject).to receive(:get_existing_monitor_by_name).once
871
+ .with('mname')
872
+ expect(subject).to_not receive(:create_monitor)
873
+
874
+ expect(subject.upsert_monitor(
875
+ 'mname',
876
+ 'my_query',
877
+ 123.4,
878
+ '>=',
879
+ escalation_message: nil
880
+ )).to eq('monid')
881
+ end
882
+ it 'handles all options' do
883
+ params = { 'foo' => 'bar', 'baz' => 'blam' }
884
+ existing = { 'foo' => 'bar', 'baz' => 'blam', 'id' => 'monid' }
885
+ dog = double(Dogapi::Client)
886
+ allow(dog).to receive(:update_monitor).with(any_args)
887
+ subject.instance_variable_set('@dog', dog)
888
+ allow(subject).to receive(:generate_messages).with(any_args)
889
+ .and_return(%w(msg esc))
890
+ allow(subject).to receive(:params_for_monitor).with(any_args)
891
+ .and_return(params)
892
+ allow(subject).to receive(:get_existing_monitor_by_name).with(any_args)
893
+ .and_return(existing)
894
+ allow(subject).to receive(:create_monitor).with(any_args)
895
+ .and_return('12345')
896
+
897
+ expect(dog).to_not receive(:update_monitor)
898
+ expect(subject).to receive(:generate_messages).once
899
+ .with('mname', '>=', 'service check')
900
+ expect(subject).to receive(:params_for_monitor).once
901
+ .with('mname', 'foo', 'my_query', 123.4, escalation_message: 'bar',
902
+ alert_no_data: false,
903
+ mon_type: 'service check',
904
+ renotify_interval: 10)
905
+ expect(subject).to receive(:get_existing_monitor_by_name).once
906
+ .with('mname')
907
+ expect(subject).to_not receive(:create_monitor)
908
+
909
+ expect(subject.upsert_monitor(
910
+ 'mname',
911
+ 'my_query',
912
+ 123.4,
913
+ '>=',
914
+ renotify_interval: 10,
915
+ alert_no_data: false,
916
+ mon_type: 'service check',
917
+ message: 'foo',
918
+ escalation_message: 'bar'
919
+ )).to eq('monid')
920
+ end
571
921
  end
572
922
  describe '#create_monitor' do
573
923
  it 'returns the monitor id if created successfully' do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dogtrainer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - jantman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-08-30 00:00:00.000000000 Z
11
+ date: 2016-09-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: dogapi