interferon 0.1.0 → 0.1.3
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 +7 -0
- data/.rubocop.yml +4 -0
- data/.rubocop_todo.yml +83 -0
- data/.travis.yml +4 -1
- data/bin/interferon +10 -9
- data/interferon.gemspec +18 -17
- data/lib/interferon/alert.rb +4 -10
- data/lib/interferon/alert_dsl.rb +12 -7
- data/lib/interferon/destinations/datadog.rb +103 -103
- data/lib/interferon/group_sources/filesystem.rb +5 -5
- data/lib/interferon/host_sources/aws_dynamo.rb +17 -19
- data/lib/interferon/host_sources/aws_elasticache.rb +20 -22
- data/lib/interferon/host_sources/aws_rds.rb +33 -33
- data/lib/interferon/host_sources/optica.rb +12 -10
- data/lib/interferon/host_sources/optica_services.rb +17 -15
- data/lib/interferon/host_sources/test_host_source.rb +1 -1
- data/lib/interferon/loaders.rb +4 -5
- data/lib/interferon/logging.rb +2 -3
- data/lib/interferon/version.rb +1 -1
- data/lib/interferon/work_hours_helper.rb +5 -5
- data/lib/interferon.rb +79 -80
- data/script/pre-commit +15 -20
- data/spec/fixtures/loaders/host_sources/test_host_source.rb +1 -1
- data/spec/fixtures/loaders/test_sources/order_test_source.rb +1 -1
- data/spec/fixtures/loaders/test_sources/test_source.rb +1 -1
- data/spec/fixtures/loaders2/test_sources/order_test_source.rb +1 -1
- data/spec/fixtures/loaders2/test_sources/secondary_source.rb +1 -1
- data/spec/fixtures/loaders2/test_sources/test_source.rb +1 -2
- data/spec/helpers/logging_helper.rb +2 -2
- data/spec/helpers/mock_alert.rb +1 -1
- data/spec/helpers/optica_helper.rb +70 -70
- data/spec/lib/interferon/destinations/datadog_spec.rb +58 -59
- data/spec/lib/interferon/group_sources/filesystem_spec.rb +29 -24
- data/spec/lib/interferon/host_sources/optica_services_spec.rb +11 -9
- data/spec/lib/interferon/host_sources/optica_spec.rb +6 -3
- data/spec/lib/interferon/loaders_spec.rb +19 -15
- data/spec/lib/interferon_spec.rb +61 -59
- data/spec/lib/work_hours_helper_spec.rb +15 -15
- data/spec/spec_helper.rb +1 -1
- metadata +61 -65
data/spec/lib/interferon_spec.rb
CHANGED
@@ -5,60 +5,73 @@ require 'interferon/destinations/datadog'
|
|
5
5
|
include Interferon
|
6
6
|
|
7
7
|
describe Interferon::Interferon do
|
8
|
+
let(:the_existing_alerts) { mock_existing_alerts }
|
9
|
+
let(:dest) { MockDest.new(the_existing_alerts) }
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
context "when checking alerts have changed" do
|
13
|
-
it "detects a change if alert message is different" do
|
11
|
+
context 'when checking alerts have changed' do
|
12
|
+
it 'detects a change if alert message is different' do
|
14
13
|
alert1 = create_test_alert('name1', 'testquery', 'message1')
|
15
14
|
alert2 = mock_alert_json('name2', 'testquery', 'message2')
|
16
15
|
|
17
16
|
expect(Interferon::Interferon.same_alerts(dest, [alert1, []], alert2)).to be false
|
18
17
|
end
|
19
18
|
|
20
|
-
it
|
19
|
+
it 'detects a change if datadog query is different' do
|
21
20
|
alert1 = create_test_alert('name1', 'testquery1', 'message1')
|
22
21
|
alert2 = mock_alert_json('name2', 'testquery2', 'message2')
|
23
22
|
|
24
23
|
expect(Interferon::Interferon.same_alerts(dest, [alert1, []], alert2)).to be false
|
25
24
|
end
|
26
25
|
|
27
|
-
it
|
28
|
-
alert1 = create_test_alert('name1', 'testquery1', 'message1',
|
26
|
+
it 'detects a change if alert notify_no_data is different' do
|
27
|
+
alert1 = create_test_alert('name1', 'testquery1', 'message1', notify_no_data: false)
|
28
|
+
alert2 = mock_alert_json('name2', 'testquery2', 'message2', nil, [1], notify_no_data: true)
|
29
|
+
|
30
|
+
expect(Interferon::Interferon.same_alerts(dest, [alert1, []], alert2)).to be false
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'detects a change if alert silenced is different' do
|
34
|
+
alert1 = create_test_alert('name1', 'testquery1', 'message1', silenced: true)
|
35
|
+
alert2 = mock_alert_json('name2', 'testquery2', 'message2', nil, [1], silenced: {})
|
36
|
+
|
37
|
+
expect(Interferon::Interferon.same_alerts(dest, [alert1, []], alert2)).to be false
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'detects a change if alert no_data_timeframe is different' do
|
41
|
+
alert1 = create_test_alert('name1', 'testquery1', 'message1', no_data_timeframe: nil)
|
42
|
+
alert2 = mock_alert_json('name2', 'testquery2', 'message2', nil, [1], no_data_timeframe: 60)
|
43
|
+
|
44
|
+
expect(Interferon::Interferon.same_alerts(dest, [alert1, []], alert2)).to be false
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'detects a change if alert require_full_window is different' do
|
48
|
+
alert1 = create_test_alert('name1', 'testquery1', 'message1', require_full_window: false)
|
29
49
|
alert2 = mock_alert_json(
|
30
|
-
'name2',
|
31
|
-
'testquery2',
|
32
|
-
'message2',
|
33
|
-
nil,
|
34
|
-
[1],
|
35
|
-
{ :notify_no_data => true }
|
50
|
+
'name2', 'testquery2', 'message2', nil, [1], require_full_window: true
|
36
51
|
)
|
37
52
|
|
38
53
|
expect(Interferon::Interferon.same_alerts(dest, [alert1, []], alert2)).to be false
|
39
54
|
end
|
40
55
|
|
41
|
-
it
|
42
|
-
alert1 = create_test_alert('name1', 'testquery1', 'message1',
|
43
|
-
alert2 = mock_alert_json('name2', 'testquery2', 'message2', nil, [1],
|
56
|
+
it 'detects a change if alert evaluation_delay is different' do
|
57
|
+
alert1 = create_test_alert('name1', 'testquery1', 'message1', evaluation_delay: nil)
|
58
|
+
alert2 = mock_alert_json('name2', 'testquery2', 'message2', nil, [1], evaluation_delay: 300)
|
44
59
|
|
45
60
|
expect(Interferon::Interferon.same_alerts(dest, [alert1, []], alert2)).to be false
|
46
61
|
end
|
47
62
|
|
48
|
-
it
|
63
|
+
it 'does not detect a change when alert datadog query and message are the same' do
|
49
64
|
alert1 = create_test_alert('name1', 'testquery1', 'message1')
|
50
65
|
alert2 = mock_alert_json(
|
51
|
-
'name1',
|
52
|
-
'testquery1',
|
53
|
-
"message1\nThis alert was created via the alerts framework"
|
66
|
+
'name1', 'testquery1', "message1\nThis alert was created via the alerts framework"
|
54
67
|
)
|
55
68
|
|
56
69
|
expect(Interferon::Interferon.same_alerts(dest, [alert1, []], alert2)).to be true
|
57
70
|
end
|
58
71
|
end
|
59
72
|
|
60
|
-
context
|
61
|
-
let(:interferon) {Interferon::Interferon.new(nil,nil,nil,nil,true,0)}
|
73
|
+
context 'dry_run_update_alerts_on_destination' do
|
74
|
+
let(:interferon) { Interferon::Interferon.new(nil, nil, nil, nil, true, 0) }
|
62
75
|
|
63
76
|
before do
|
64
77
|
allow_any_instance_of(MockAlert).to receive(:evaluate)
|
@@ -73,10 +86,7 @@ describe Interferon::Interferon do
|
|
73
86
|
expect(dest).not_to receive(:remove_alert_by_id)
|
74
87
|
|
75
88
|
interferon.update_alerts_on_destination(
|
76
|
-
dest,
|
77
|
-
['host'],
|
78
|
-
[alerts['name1'], alerts['name2']],
|
79
|
-
{}
|
89
|
+
dest, ['host'], [alerts['name1'], alerts['name2']], {}
|
80
90
|
)
|
81
91
|
end
|
82
92
|
|
@@ -87,10 +97,7 @@ describe Interferon::Interferon do
|
|
87
97
|
expect(dest).to receive(:remove_alert_by_id).with('3').once
|
88
98
|
|
89
99
|
interferon.update_alerts_on_destination(
|
90
|
-
dest,
|
91
|
-
['host'],
|
92
|
-
[alerts['name1'], alerts['name2'], added],
|
93
|
-
{}
|
100
|
+
dest, ['host'], [alerts['name1'], alerts['name2'], added], {}
|
94
101
|
)
|
95
102
|
end
|
96
103
|
|
@@ -111,7 +118,7 @@ describe Interferon::Interferon do
|
|
111
118
|
it 'deletes duplicate old alerts' do
|
112
119
|
alert1 = mock_alert_json('name1', 'testquery1', '', nil, [1, 2, 3])
|
113
120
|
alert2 = mock_alert_json('name2', 'testquery2', '')
|
114
|
-
existing_alerts = {'name1' => alert1, 'name2' => alert2}
|
121
|
+
existing_alerts = { 'name1' => alert1, 'name2' => alert2 }
|
115
122
|
dest = MockDest.new(existing_alerts)
|
116
123
|
allow(dest).to receive(:remove_alert)
|
117
124
|
allow(dest).to receive(:remove_alert_by_id)
|
@@ -126,7 +133,7 @@ describe Interferon::Interferon do
|
|
126
133
|
it 'deletes duplicate old alerts when creating new alert' do
|
127
134
|
alert1 = mock_alert_json('name1', 'testquery1', '', nil, [1, 2, 3])
|
128
135
|
alert2 = mock_alert_json('name2', 'testquery2', '')
|
129
|
-
existing_alerts = {'name1' => alert1, 'name2' => alert2}
|
136
|
+
existing_alerts = { 'name1' => alert1, 'name2' => alert2 }
|
130
137
|
dest = MockDest.new(existing_alerts)
|
131
138
|
allow(dest).to receive(:remove_alert)
|
132
139
|
allow(dest).to receive(:remove_alert_by_id)
|
@@ -143,8 +150,8 @@ describe Interferon::Interferon do
|
|
143
150
|
end
|
144
151
|
end
|
145
152
|
|
146
|
-
context
|
147
|
-
let(:interferon) {Interferon::Interferon.new(nil,nil,nil,nil,false,0)}
|
153
|
+
context 'update_alerts_on_destination' do
|
154
|
+
let(:interferon) { Interferon::Interferon.new(nil, nil, nil, nil, false, 0) }
|
148
155
|
|
149
156
|
before do
|
150
157
|
allow_any_instance_of(MockAlert).to receive(:evaluate)
|
@@ -158,7 +165,9 @@ describe Interferon::Interferon do
|
|
158
165
|
expect(dest).not_to receive(:create_alert)
|
159
166
|
expect(dest).not_to receive(:remove_alert_by_id)
|
160
167
|
|
161
|
-
interferon.update_alerts_on_destination(
|
168
|
+
interferon.update_alerts_on_destination(
|
169
|
+
dest, ['host'], [alerts['name1'], alerts['name2']], {}
|
170
|
+
)
|
162
171
|
end
|
163
172
|
|
164
173
|
it 'runs added alerts' do
|
@@ -168,10 +177,7 @@ describe Interferon::Interferon do
|
|
168
177
|
expect(dest).not_to receive(:remove_alert_by_id).with('3')
|
169
178
|
|
170
179
|
interferon.update_alerts_on_destination(
|
171
|
-
dest,
|
172
|
-
['host'],
|
173
|
-
[alerts['name1'], alerts['name2'], added],
|
174
|
-
{}
|
180
|
+
dest, ['host'], [alerts['name1'], alerts['name2'], added], {}
|
175
181
|
)
|
176
182
|
end
|
177
183
|
|
@@ -194,7 +200,7 @@ describe Interferon::Interferon do
|
|
194
200
|
it 'deletes duplicate old alerts' do
|
195
201
|
alert1 = mock_alert_json('name1', 'testquery1', '', nil, [1, 2, 3])
|
196
202
|
alert2 = mock_alert_json('name2', 'testquery2', '')
|
197
|
-
existing_alerts = {'name1' => alert1, 'name2' => alert2}
|
203
|
+
existing_alerts = { 'name1' => alert1, 'name2' => alert2 }
|
198
204
|
dest = MockDest.new(existing_alerts)
|
199
205
|
allow(dest).to receive(:remove_alert)
|
200
206
|
allow(dest).to receive(:remove_alert_by_id)
|
@@ -209,19 +215,15 @@ describe Interferon::Interferon do
|
|
209
215
|
it 'deletes duplicate old alerts when creating new alert' do
|
210
216
|
alert1 = mock_alert_json('name1', 'testquery1', '', nil, [1, 2, 3])
|
211
217
|
alert2 = mock_alert_json('name2', 'testquery2', '')
|
212
|
-
existing_alerts = {'name1' => alert1, 'name2' => alert2}
|
218
|
+
existing_alerts = { 'name1' => alert1, 'name2' => alert2 }
|
213
219
|
dest = MockDest.new(existing_alerts)
|
214
220
|
allow(dest).to receive(:report_stats)
|
215
221
|
|
216
222
|
added = create_test_alert('name1', 'testquery1', '')
|
217
223
|
|
218
|
-
expect(dest).to receive(:remove_alert).with(
|
219
|
-
'name1',
|
220
|
-
|
221
|
-
'',
|
222
|
-
nil,
|
223
|
-
[2, 3]
|
224
|
-
))
|
224
|
+
expect(dest).to receive(:remove_alert).with(
|
225
|
+
mock_alert_json('name1', 'testquery1', '', nil, [2, 3])
|
226
|
+
)
|
225
227
|
expect(dest).to receive(:remove_alert).with(existing_alerts['name2'])
|
226
228
|
|
227
229
|
interferon.update_alerts_on_destination(dest, ['host'], [added], {})
|
@@ -231,26 +233,25 @@ describe Interferon::Interferon do
|
|
231
233
|
def mock_existing_alerts
|
232
234
|
alert1 = mock_alert_json('name1', 'testquery1', '')
|
233
235
|
alert2 = mock_alert_json('name2', 'testquery2', '')
|
234
|
-
{'name1' => alert1, 'name2' => alert2}
|
236
|
+
{ 'name1' => alert1, 'name2' => alert2 }
|
235
237
|
end
|
236
238
|
|
237
239
|
class MockDest < Interferon::Destinations::Datadog
|
240
|
+
attr_reader :existing_alerts
|
241
|
+
|
238
242
|
def initialize(the_existing_alerts)
|
239
243
|
@existing_alerts = the_existing_alerts
|
240
244
|
end
|
241
245
|
|
242
|
-
def create_alert(alert,
|
246
|
+
def create_alert(alert, _people)
|
243
247
|
name = alert['name']
|
244
248
|
id = [alert['name'][-1]]
|
245
249
|
[name, id]
|
246
250
|
end
|
247
|
-
|
248
|
-
def existing_alerts
|
249
|
-
@existing_alerts
|
250
|
-
end
|
251
251
|
end
|
252
252
|
|
253
253
|
DEFAULT_OPTIONS = {
|
254
|
+
'evaluation_delay' => nil,
|
254
255
|
'notify_audit' => true,
|
255
256
|
'notify_no_data' => false,
|
256
257
|
'silenced' => {},
|
@@ -258,13 +259,13 @@ describe Interferon::Interferon do
|
|
258
259
|
'no_data_timeframe' => nil,
|
259
260
|
'require_full_window' => nil,
|
260
261
|
'timeout' => nil,
|
261
|
-
}
|
262
|
+
}.freeze
|
262
263
|
|
263
|
-
def mock_alert_json(name, datadog_query, message, type=
|
264
|
+
def mock_alert_json(name, datadog_query, message, type = 'metric alert', id = nil, options = {})
|
264
265
|
options = DEFAULT_OPTIONS.merge(options)
|
265
266
|
|
266
267
|
{
|
267
|
-
'name'=> name,
|
268
|
+
'name' => name,
|
268
269
|
'query' => datadog_query,
|
269
270
|
'type' => type,
|
270
271
|
'message' => message,
|
@@ -273,7 +274,7 @@ describe Interferon::Interferon do
|
|
273
274
|
}
|
274
275
|
end
|
275
276
|
|
276
|
-
def create_test_alert(name, datadog_query, message, options={})
|
277
|
+
def create_test_alert(name, datadog_query, message, options = {})
|
277
278
|
options = DEFAULT_OPTIONS.merge(options)
|
278
279
|
|
279
280
|
alert_dsl = AlertDSL.new({})
|
@@ -292,6 +293,7 @@ describe Interferon::Interferon do
|
|
292
293
|
|
293
294
|
alert_dsl.no_data_timeframe(options['no_data_timeframe'])
|
294
295
|
alert_dsl.notify_no_data(options['notify_no_data'])
|
296
|
+
alert_dsl.evaluation_delay(options['evaluation_delay'])
|
295
297
|
alert_dsl.require_full_window(options['require_full_window'])
|
296
298
|
alert_dsl.thresholds(options['thresholds'])
|
297
299
|
alert_dsl.timeout(options['timeout'])
|
@@ -1,39 +1,39 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'interferon/work_hours_helper'
|
3
3
|
|
4
4
|
describe Interferon::WorkHoursHelper do
|
5
5
|
subject { described_class }
|
6
6
|
|
7
|
-
describe
|
8
|
-
context
|
9
|
-
it
|
7
|
+
describe '.now_is_work_hour?' do
|
8
|
+
context 'when it is a work hour in a work day' do
|
9
|
+
it 'return true' do
|
10
10
|
expect(subject.is_work_hour?(
|
11
|
-
|
11
|
+
Time.parse('Mon Nov 26 9:01:20 PST 2001').utc
|
12
12
|
)).to be_truthy
|
13
13
|
expect(subject.is_work_hour?(
|
14
|
-
|
14
|
+
Time.parse('Fri Nov 30 16:35:20 PST 2001').utc
|
15
15
|
)).to be_truthy
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
context
|
20
|
-
it
|
19
|
+
context 'when it is a work hour in a weekend' do
|
20
|
+
it 'return false' do
|
21
21
|
expect(subject.is_work_hour?(
|
22
|
-
|
22
|
+
Time.parse('Sat Nov 24 09:01:20 PST 2001').utc
|
23
23
|
)).to be_falsy
|
24
24
|
expect(subject.is_work_hour?(
|
25
|
-
|
25
|
+
Time.parse('Sun Nov 25 09:01:20 PST 2001').utc
|
26
26
|
)).to be_falsy
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
context
|
31
|
-
it
|
30
|
+
context 'when it is not a work hour' do
|
31
|
+
it 'return false' do
|
32
32
|
expect(subject.is_work_hour?(
|
33
|
-
|
33
|
+
Time.parse('Thu Nov 29 08:33:20 PST 2001').utc
|
34
34
|
)).to be_falsy
|
35
35
|
expect(subject.is_work_hour?(
|
36
|
-
|
36
|
+
Time.parse('Fri Nov 30 17:33:20 PST 2001').utc
|
37
37
|
)).to be_falsy
|
38
38
|
end
|
39
39
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -7,7 +7,7 @@ require 'helpers/logging_helper.rb'
|
|
7
7
|
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
8
8
|
RSpec.configure do |config|
|
9
9
|
config.expect_with :rspec do |expectations|
|
10
|
-
|
10
|
+
expectations.include_chain_clauses_in_custom_matcher_descriptions = true
|
11
11
|
end
|
12
12
|
|
13
13
|
# rspec-mocks config goes here. You can use an alternate test double
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: interferon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.3
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Igor Serebryany
|
@@ -10,189 +9,185 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date: 2017-
|
12
|
+
date: 2017-07-26 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: dogapi
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
|
-
- - ~>
|
18
|
+
- - "~>"
|
21
19
|
- !ruby/object:Gem::Version
|
22
|
-
version: '1.
|
23
|
-
- -
|
20
|
+
version: '1.27'
|
21
|
+
- - ">="
|
24
22
|
- !ruby/object:Gem::Version
|
25
|
-
version: 1.
|
23
|
+
version: 1.27.0
|
26
24
|
type: :runtime
|
27
25
|
prerelease: false
|
28
26
|
version_requirements: !ruby/object:Gem::Requirement
|
29
|
-
none: false
|
30
27
|
requirements:
|
31
|
-
- - ~>
|
28
|
+
- - "~>"
|
32
29
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
34
|
-
- -
|
30
|
+
version: '1.27'
|
31
|
+
- - ">="
|
35
32
|
- !ruby/object:Gem::Version
|
36
|
-
version: 1.
|
33
|
+
version: 1.27.0
|
37
34
|
- !ruby/object:Gem::Dependency
|
38
35
|
name: aws-sdk
|
39
36
|
requirement: !ruby/object:Gem::Requirement
|
40
|
-
none: false
|
41
37
|
requirements:
|
42
|
-
- - ~>
|
38
|
+
- - "~>"
|
43
39
|
- !ruby/object:Gem::Version
|
44
40
|
version: '1.35'
|
45
|
-
- -
|
41
|
+
- - ">="
|
46
42
|
- !ruby/object:Gem::Version
|
47
43
|
version: 1.35.1
|
48
44
|
type: :runtime
|
49
45
|
prerelease: false
|
50
46
|
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
none: false
|
52
47
|
requirements:
|
53
|
-
- - ~>
|
48
|
+
- - "~>"
|
54
49
|
- !ruby/object:Gem::Version
|
55
50
|
version: '1.35'
|
56
|
-
- -
|
51
|
+
- - ">="
|
57
52
|
- !ruby/object:Gem::Version
|
58
53
|
version: 1.35.1
|
59
54
|
- !ruby/object:Gem::Dependency
|
60
55
|
name: dogstatsd-ruby
|
61
56
|
requirement: !ruby/object:Gem::Requirement
|
62
|
-
none: false
|
63
57
|
requirements:
|
64
|
-
- - ~>
|
58
|
+
- - "~>"
|
65
59
|
- !ruby/object:Gem::Version
|
66
60
|
version: '1.4'
|
67
|
-
- -
|
61
|
+
- - ">="
|
68
62
|
- !ruby/object:Gem::Version
|
69
63
|
version: 1.4.1
|
70
64
|
type: :runtime
|
71
65
|
prerelease: false
|
72
66
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
67
|
requirements:
|
75
|
-
- - ~>
|
68
|
+
- - "~>"
|
76
69
|
- !ruby/object:Gem::Version
|
77
70
|
version: '1.4'
|
78
|
-
- -
|
71
|
+
- - ">="
|
79
72
|
- !ruby/object:Gem::Version
|
80
73
|
version: 1.4.1
|
81
74
|
- !ruby/object:Gem::Dependency
|
82
75
|
name: diffy
|
83
76
|
requirement: !ruby/object:Gem::Requirement
|
84
|
-
none: false
|
85
77
|
requirements:
|
86
|
-
- - ~>
|
78
|
+
- - "~>"
|
87
79
|
- !ruby/object:Gem::Version
|
88
80
|
version: 3.1.0
|
89
|
-
- -
|
81
|
+
- - ">="
|
90
82
|
- !ruby/object:Gem::Version
|
91
83
|
version: 3.1.0
|
92
84
|
type: :runtime
|
93
85
|
prerelease: false
|
94
86
|
version_requirements: !ruby/object:Gem::Requirement
|
95
|
-
none: false
|
96
87
|
requirements:
|
97
|
-
- - ~>
|
88
|
+
- - "~>"
|
98
89
|
- !ruby/object:Gem::Version
|
99
90
|
version: 3.1.0
|
100
|
-
- -
|
91
|
+
- - ">="
|
101
92
|
- !ruby/object:Gem::Version
|
102
93
|
version: 3.1.0
|
103
94
|
- !ruby/object:Gem::Dependency
|
104
95
|
name: parallel
|
105
96
|
requirement: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
97
|
requirements:
|
108
|
-
- - ~>
|
98
|
+
- - "~>"
|
109
99
|
- !ruby/object:Gem::Version
|
110
100
|
version: '1.9'
|
111
|
-
- -
|
101
|
+
- - ">="
|
112
102
|
- !ruby/object:Gem::Version
|
113
103
|
version: 1.9.0
|
114
104
|
type: :runtime
|
115
105
|
prerelease: false
|
116
106
|
version_requirements: !ruby/object:Gem::Requirement
|
117
|
-
none: false
|
118
107
|
requirements:
|
119
|
-
- - ~>
|
108
|
+
- - "~>"
|
120
109
|
- !ruby/object:Gem::Version
|
121
110
|
version: '1.9'
|
122
|
-
- -
|
111
|
+
- - ">="
|
123
112
|
- !ruby/object:Gem::Version
|
124
113
|
version: 1.9.0
|
125
114
|
- !ruby/object:Gem::Dependency
|
126
115
|
name: nokogiri
|
127
116
|
requirement: !ruby/object:Gem::Requirement
|
128
|
-
none: false
|
129
117
|
requirements:
|
130
|
-
- - <
|
118
|
+
- - "<"
|
131
119
|
- !ruby/object:Gem::Version
|
132
120
|
version: 1.7.0
|
133
121
|
type: :runtime
|
134
122
|
prerelease: false
|
135
123
|
version_requirements: !ruby/object:Gem::Requirement
|
136
|
-
none: false
|
137
124
|
requirements:
|
138
|
-
- - <
|
125
|
+
- - "<"
|
139
126
|
- !ruby/object:Gem::Version
|
140
127
|
version: 1.7.0
|
141
128
|
- !ruby/object:Gem::Dependency
|
142
129
|
name: tzinfo
|
143
130
|
requirement: !ruby/object:Gem::Requirement
|
144
|
-
none: false
|
145
131
|
requirements:
|
146
|
-
- - ~>
|
132
|
+
- - "~>"
|
147
133
|
- !ruby/object:Gem::Version
|
148
134
|
version: 1.2.2
|
149
|
-
- -
|
135
|
+
- - ">="
|
150
136
|
- !ruby/object:Gem::Version
|
151
137
|
version: 1.2.2
|
152
138
|
type: :runtime
|
153
139
|
prerelease: false
|
154
140
|
version_requirements: !ruby/object:Gem::Requirement
|
155
|
-
none: false
|
156
141
|
requirements:
|
157
|
-
- - ~>
|
142
|
+
- - "~>"
|
158
143
|
- !ruby/object:Gem::Version
|
159
144
|
version: 1.2.2
|
160
|
-
- -
|
145
|
+
- - ">="
|
161
146
|
- !ruby/object:Gem::Version
|
162
147
|
version: 1.2.2
|
163
148
|
- !ruby/object:Gem::Dependency
|
164
149
|
name: rspec
|
165
150
|
requirement: !ruby/object:Gem::Requirement
|
166
|
-
none: false
|
167
151
|
requirements:
|
168
|
-
- - ~>
|
152
|
+
- - "~>"
|
169
153
|
- !ruby/object:Gem::Version
|
170
154
|
version: '3.2'
|
171
155
|
type: :development
|
172
156
|
prerelease: false
|
173
157
|
version_requirements: !ruby/object:Gem::Requirement
|
174
|
-
none: false
|
175
158
|
requirements:
|
176
|
-
- - ~>
|
159
|
+
- - "~>"
|
177
160
|
- !ruby/object:Gem::Version
|
178
161
|
version: '3.2'
|
179
162
|
- !ruby/object:Gem::Dependency
|
180
163
|
name: pry
|
181
164
|
requirement: !ruby/object:Gem::Requirement
|
182
|
-
none: false
|
183
165
|
requirements:
|
184
|
-
- - ~>
|
166
|
+
- - "~>"
|
185
167
|
- !ruby/object:Gem::Version
|
186
168
|
version: '0.10'
|
187
169
|
type: :development
|
188
170
|
prerelease: false
|
189
171
|
version_requirements: !ruby/object:Gem::Requirement
|
190
|
-
none: false
|
191
172
|
requirements:
|
192
|
-
- - ~>
|
173
|
+
- - "~>"
|
193
174
|
- !ruby/object:Gem::Version
|
194
175
|
version: '0.10'
|
195
|
-
|
176
|
+
- !ruby/object:Gem::Dependency
|
177
|
+
name: rubocop
|
178
|
+
requirement: !ruby/object:Gem::Requirement
|
179
|
+
requirements:
|
180
|
+
- - '='
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: 0.41.2
|
183
|
+
type: :development
|
184
|
+
prerelease: false
|
185
|
+
version_requirements: !ruby/object:Gem::Requirement
|
186
|
+
requirements:
|
187
|
+
- - '='
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: 0.41.2
|
190
|
+
description: ": Store metrics alerts in code!"
|
196
191
|
email:
|
197
192
|
- igor.serebryany@airbnb.com
|
198
193
|
- jimmy.ngo@airbnb.com
|
@@ -201,8 +196,10 @@ executables:
|
|
201
196
|
extensions: []
|
202
197
|
extra_rdoc_files: []
|
203
198
|
files:
|
204
|
-
- .gitignore
|
205
|
-
- .
|
199
|
+
- ".gitignore"
|
200
|
+
- ".rubocop.yml"
|
201
|
+
- ".rubocop_todo.yml"
|
202
|
+
- ".travis.yml"
|
206
203
|
- Gemfile
|
207
204
|
- LICENSE
|
208
205
|
- README.md
|
@@ -246,28 +243,27 @@ files:
|
|
246
243
|
homepage: https://www.github.com/airbnb/interferon
|
247
244
|
licenses:
|
248
245
|
- MIT
|
246
|
+
metadata: {}
|
249
247
|
post_install_message:
|
250
248
|
rdoc_options: []
|
251
249
|
require_paths:
|
252
250
|
- lib
|
253
251
|
required_ruby_version: !ruby/object:Gem::Requirement
|
254
|
-
none: false
|
255
252
|
requirements:
|
256
|
-
- -
|
253
|
+
- - ">="
|
257
254
|
- !ruby/object:Gem::Version
|
258
255
|
version: '0'
|
259
256
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
260
|
-
none: false
|
261
257
|
requirements:
|
262
|
-
- -
|
258
|
+
- - ">="
|
263
259
|
- !ruby/object:Gem::Version
|
264
260
|
version: '0'
|
265
261
|
requirements: []
|
266
262
|
rubyforge_project:
|
267
|
-
rubygems_version:
|
263
|
+
rubygems_version: 2.5.2
|
268
264
|
signing_key:
|
269
|
-
specification_version:
|
270
|
-
summary:
|
265
|
+
specification_version: 4
|
266
|
+
summary: ": Store metrics alerts in code!"
|
271
267
|
test_files:
|
272
268
|
- spec/fixtures/loaders/host_sources/test_host_source.rb
|
273
269
|
- spec/fixtures/loaders/test_sources/order_test_source.rb
|