interferon 0.0.1 → 0.0.2
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.
- data/.gitignore +2 -0
- data/.travis.yml +8 -0
- data/README.md +2 -0
- data/lib/interferon/destinations/datadog.rb +1 -1
- data/lib/interferon/host_sources/optica.rb +13 -9
- data/lib/interferon/host_sources/optica_services.rb +12 -8
- data/lib/interferon/host_sources/test_host_source.rb +6 -0
- data/lib/interferon/version.rb +1 -1
- data/spec/fixtures/loaders/host_sources/test_host_source.rb +5 -0
- data/spec/fixtures/loaders/test_sources/order_test_source.rb +5 -0
- data/spec/fixtures/loaders/test_sources/test_source.rb +5 -0
- data/spec/fixtures/loaders2/test_sources/order_test_source.rb +5 -0
- data/spec/fixtures/loaders2/test_sources/secondary_source.rb +11 -0
- data/spec/fixtures/loaders2/test_sources/test_source.rb +11 -0
- data/spec/helpers/loader_helper.rb +13 -0
- data/spec/helpers/logging_helper.rb +12 -0
- data/spec/helpers/optica_helper.rb +110 -0
- data/spec/lib/interferon/host_sources/optica_services_spec.rb +60 -0
- data/spec/lib/interferon/host_sources/optica_spec.rb +30 -0
- data/spec/lib/interferon/loaders_spec.rb +96 -0
- data/spec/spec_helper.rb +7 -0
- metadata +43 -27
- checksums.yaml +0 -15
- data/groups/data.yaml +0 -11
- data/groups/dataeng.yaml +0 -4
- data/groups/datainfra.yaml +0 -10
- data/groups/devhap.yaml +0 -6
- data/groups/discover.yaml +0 -13
- data/groups/growth.yaml +0 -17
- data/groups/host.yaml +0 -12
- data/groups/internalproducts.yml +0 -13
- data/groups/logstash.yaml +0 -4
- data/groups/mobile.yaml +0 -17
- data/groups/pagerduty_sysops.yaml +0 -5
- data/groups/panda.yaml +0 -10
- data/groups/payments.yaml +0 -16
- data/groups/payments_finance.yaml +0 -8
- data/groups/prodinfra.yaml +0 -15
- data/groups/search.yaml +0 -10
- data/groups/security.yaml +0 -8
- data/groups/sre.yaml +0 -16
- data/groups/teamx.yaml +0 -8
- data/groups/tns.yaml +0 -14
- data/groups/tools.yml +0 -11
- data/script/convert.rb +0 -29
data/.gitignore
CHANGED
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# Interferon #
|
2
2
|
|
3
|
+
[](https://travis-ci.org/airbnb/interferon)
|
4
|
+
|
3
5
|
This repo contains the interferon gem.
|
4
6
|
This gem enables you to store your alerts configuration in code.
|
5
7
|
You should create your own repository, with a `Gemfile` which imports the interferon gem.
|
@@ -3,7 +3,7 @@ require 'json'
|
|
3
3
|
|
4
4
|
module Interferon::HostSources
|
5
5
|
class Optica
|
6
|
-
include Logging
|
6
|
+
include ::Interferon::Logging
|
7
7
|
|
8
8
|
def initialize(options)
|
9
9
|
raise ArgumentError, "missing host for optica source" \
|
@@ -14,14 +14,7 @@ module Interferon::HostSources
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def list_hosts
|
17
|
-
|
18
|
-
con.read_timeout = 60
|
19
|
-
con.open_timeout = 60
|
20
|
-
|
21
|
-
response = con.get('/')
|
22
|
-
data = JSON::parse(response.body)
|
23
|
-
|
24
|
-
return data['nodes'].map{|ip, host| {
|
17
|
+
return optica_data['nodes'].map{|ip, host| {
|
25
18
|
:source => 'optica',
|
26
19
|
:hostname => host['hostname'],
|
27
20
|
:role => host['role'],
|
@@ -31,5 +24,16 @@ module Interferon::HostSources
|
|
31
24
|
:owner_groups => host['ownership'] && host['ownership']['groups'] || [],
|
32
25
|
}}
|
33
26
|
end
|
27
|
+
|
28
|
+
def optica_data
|
29
|
+
@optica_data ||= begin
|
30
|
+
con = Net::HTTP.new(@host, @port)
|
31
|
+
con.read_timeout = 60
|
32
|
+
con.open_timeout = 60
|
33
|
+
|
34
|
+
response = con.get('/')
|
35
|
+
JSON::parse(response.body)
|
36
|
+
end
|
37
|
+
end
|
34
38
|
end
|
35
39
|
end
|
@@ -4,7 +4,7 @@ require 'set'
|
|
4
4
|
|
5
5
|
module Interferon::HostSources
|
6
6
|
class OpticaServices
|
7
|
-
include Logging
|
7
|
+
include ::Interferon::Logging
|
8
8
|
|
9
9
|
def initialize(options)
|
10
10
|
raise ArgumentError, "missing host for optica source" \
|
@@ -15,14 +15,18 @@ module Interferon::HostSources
|
|
15
15
|
@envs = options['environments'] || []
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
def optica_data
|
19
|
+
@optica_data ||= begin
|
20
|
+
con = Net::HTTP.new(@host, @port)
|
21
|
+
con.read_timeout = 60
|
22
|
+
con.open_timeout = 60
|
22
23
|
|
23
|
-
|
24
|
-
|
24
|
+
response = con.get('/')
|
25
|
+
JSON::parse(response.body)
|
26
|
+
end
|
27
|
+
end
|
25
28
|
|
29
|
+
def list_hosts
|
26
30
|
services = Hash.new{ |h,service| h[service] = {
|
27
31
|
:source => 'optica_services',
|
28
32
|
:service => service,
|
@@ -34,7 +38,7 @@ module Interferon::HostSources
|
|
34
38
|
:provider_machine_count => 0,
|
35
39
|
}}
|
36
40
|
|
37
|
-
|
41
|
+
optica_data['nodes'].each do |ip, host|
|
38
42
|
next unless @envs.empty? or @envs.include?(host['environment'])
|
39
43
|
|
40
44
|
# make it easier by initializing possibly-missing data to sane defaults
|
data/lib/interferon/version.rb
CHANGED
@@ -0,0 +1,13 @@
|
|
1
|
+
|
2
|
+
### some helpers to make this work ###
|
3
|
+
# define the module we're working in
|
4
|
+
module ::Interferon::TestSources; end
|
5
|
+
|
6
|
+
# define a test loader we'll be using
|
7
|
+
class TestLoader < Interferon::DynamicLoader
|
8
|
+
def initialize_attributes
|
9
|
+
@loader_for = 'test fixtures'
|
10
|
+
@type_path = 'test_sources'
|
11
|
+
@module = ::Interferon::TestSources
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
class OpticaHelper
|
2
|
+
def self.example_node_1
|
3
|
+
{
|
4
|
+
"ip" => "10.1.1.1",
|
5
|
+
"environment" => "production",
|
6
|
+
"role" => "role1",
|
7
|
+
"hostname" => "box1",
|
8
|
+
"uptime" => 37335310,
|
9
|
+
"az" => "us-east-1a",
|
10
|
+
"security_groups" => ["internal"],
|
11
|
+
"instance_type" => "m1.large",
|
12
|
+
"ami_id" => "ami-d9d6a6b0",
|
13
|
+
"failed" => false,
|
14
|
+
"roles" => ["role1"],
|
15
|
+
"recipes" => ["airbnb-base","cookbook1"],
|
16
|
+
"synapse_services" => ["service1","service2"],
|
17
|
+
"nerve_services" => [],
|
18
|
+
"ownership" => {
|
19
|
+
"people" => ["test_user@example.com"],
|
20
|
+
"groups" => ["admins"]
|
21
|
+
},
|
22
|
+
"converger" => "ben_hughes"
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.example_node_2
|
27
|
+
{
|
28
|
+
"ip" => "10.1.1.2",
|
29
|
+
"environment" => "production",
|
30
|
+
"role" => "role2",
|
31
|
+
"hostname" => "box2",
|
32
|
+
"uptime" => 37335310,
|
33
|
+
"az" => "us-east-1b",
|
34
|
+
"security_groups" => ["internal"],
|
35
|
+
"instance_type" => "m1.large",
|
36
|
+
"ami_id" => "ami-d9d6a6b0",
|
37
|
+
"failed" => false,
|
38
|
+
"roles" => ["role2"],
|
39
|
+
"recipes" => ["airbnb-base","cookbook2"],
|
40
|
+
"synapse_services" => [],
|
41
|
+
"nerve_services" => ["service1"],
|
42
|
+
"ownership" => {
|
43
|
+
"people" => ["test_user@example.com"],
|
44
|
+
"groups" => ["admins"]
|
45
|
+
},
|
46
|
+
"converger" => "ben_hughes"
|
47
|
+
}
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.example_node_3
|
51
|
+
{
|
52
|
+
"ip" => "10.1.1.3",
|
53
|
+
"environment" => "production",
|
54
|
+
"role" => "role3",
|
55
|
+
"hostname" => "box3",
|
56
|
+
"uptime" => 37335310,
|
57
|
+
"az" => "us-east-1b",
|
58
|
+
"security_groups" => ["internal"],
|
59
|
+
"instance_type" => "m1.large",
|
60
|
+
"ami_id" => "ami-d9d6a6b0",
|
61
|
+
"failed" => false,
|
62
|
+
"roles" => ["role3"],
|
63
|
+
"recipes" => ["airbnb-base","cookbook3"],
|
64
|
+
"synapse_services" => [],
|
65
|
+
"nerve_services" => ["service2"],
|
66
|
+
"converger" => "ben_hughes"
|
67
|
+
}
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.example_node_4
|
71
|
+
{
|
72
|
+
"ip" => "10.1.1.4",
|
73
|
+
"environment" => "production",
|
74
|
+
"role" => "role4",
|
75
|
+
"hostname" => "box4",
|
76
|
+
"uptime" => 37335310,
|
77
|
+
"az" => "us-east-1e",
|
78
|
+
"security_groups" => ["internal"],
|
79
|
+
"instance_type" => "m1.large",
|
80
|
+
"ami_id" => "ami-d9d6a6b0",
|
81
|
+
"failed" => false,
|
82
|
+
"roles" => ["role4"],
|
83
|
+
"recipes" => ["airbnb-base","cookbook4"],
|
84
|
+
"synapse_services" => [],
|
85
|
+
"nerve_services" => ["service1"],
|
86
|
+
"ownership" => {
|
87
|
+
"people" => ["test_user2@example.com"],
|
88
|
+
"groups" => ["engineers"]
|
89
|
+
},
|
90
|
+
"converger" => "ben_hughes"
|
91
|
+
}
|
92
|
+
end
|
93
|
+
|
94
|
+
def self.example_nodes
|
95
|
+
{
|
96
|
+
example_node_1['ip'] => example_node_1,
|
97
|
+
example_node_2['ip'] => example_node_2,
|
98
|
+
example_node_3['ip'] => example_node_3,
|
99
|
+
example_node_4['ip'] => example_node_4,
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.example_output
|
104
|
+
{
|
105
|
+
'examined' => 3,
|
106
|
+
'returned' => 3,
|
107
|
+
'nodes' => example_nodes
|
108
|
+
}
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'helpers/optica_helper'
|
3
|
+
require 'interferon/host_sources/optica_services'
|
4
|
+
|
5
|
+
describe Interferon::HostSources::OpticaServices do
|
6
|
+
let(:optica_services) { Interferon::HostSources::OpticaServices.new({'host'=>'127.0.0.1'}) }
|
7
|
+
|
8
|
+
describe '.list_hosts' do
|
9
|
+
before do
|
10
|
+
expect(optica_services).to receive(:optica_data).and_return(OpticaHelper.example_output)
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:list) { optica_services.list_hosts }
|
14
|
+
let(:service1) { list.select{|s| s[:service] == 'service1'}[0] }
|
15
|
+
let(:service2) { list.select{|s| s[:service] == 'service2'}[0] }
|
16
|
+
|
17
|
+
it 'returns both of the services we know about' do
|
18
|
+
expect(list.length).to eq(2)
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'includes all required attributes with each hostinfo' do
|
22
|
+
list.each do |service|
|
23
|
+
expect(service).to include(
|
24
|
+
:source,
|
25
|
+
:service,
|
26
|
+
:owners,
|
27
|
+
:owner_groups,
|
28
|
+
:consumer_roles,
|
29
|
+
:consumer_machine_count,
|
30
|
+
:provider_machine_count,
|
31
|
+
)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'does not barf if ownership info is missing' do
|
36
|
+
expect(service2[:owners]).to be_empty
|
37
|
+
expect(service2[:owner_groups]).to be_empty
|
38
|
+
end
|
39
|
+
|
40
|
+
it 'knows that box1 is using both of the services' do
|
41
|
+
expect(list).to satisfy{|l| l.all?{
|
42
|
+
|s| s[:consumer_machine_count] == 1 && s[:consumer_roles] == ['role1']}}
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'knows that service1 is provided by two machines' do
|
46
|
+
expect(service1[:provider_machine_count]).to eq(2)
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'merges the ownership for all machines that provide service1' do
|
50
|
+
all_owners = OpticaHelper.example_node_2['ownership']['people'] +
|
51
|
+
OpticaHelper.example_node_4['ownership']['people']
|
52
|
+
all_owner_groups = OpticaHelper.example_node_2['ownership']['groups'] +
|
53
|
+
OpticaHelper.example_node_4['ownership']['groups']
|
54
|
+
|
55
|
+
expect(service1[:owners]).to contain_exactly(*all_owners)
|
56
|
+
expect(service1[:owner_groups]).to contain_exactly(*all_owner_groups)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'helpers/optica_helper'
|
3
|
+
require 'interferon/host_sources/optica'
|
4
|
+
|
5
|
+
describe Interferon::HostSources::Optica do
|
6
|
+
let(:optica) { Interferon::HostSources::Optica.new({'host'=>'127.0.0.1'}) }
|
7
|
+
|
8
|
+
describe '.list_hosts' do
|
9
|
+
before do
|
10
|
+
expect(optica).to receive(:optica_data).and_return(OpticaHelper.example_output)
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:list) { optica.list_hosts }
|
14
|
+
|
15
|
+
it 'returns all of the hosts that optica provides' do
|
16
|
+
expect(list.length).to eq(OpticaHelper.example_nodes.length)
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'includes all required attributes with each hostinfo' do
|
20
|
+
list.each do |host|
|
21
|
+
expect(host).to include(:source, :hostname, :role, :environment, :owners, :owner_groups)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'does not barf if ownership info is missing' do
|
26
|
+
expect(list).to satisfy{|l| l.one?{|h| h[:owners].empty? && h[:owner_groups].empty?}}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "helpers/loader_helper"
|
3
|
+
|
4
|
+
describe 'DynamicLoader' do
|
5
|
+
describe 'custom class retrieval' do
|
6
|
+
it 'properly loads a custom test source of given type' do
|
7
|
+
test_loader = TestLoader.new(['./spec/fixtures/loaders'])
|
8
|
+
expect(test_loader.get_klass('test_source')).to be_a(Class)
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'throws an ArgumentError when the type cannot be found' do
|
12
|
+
test_loader = TestLoader.new(['./spec/fixtures/loaders'])
|
13
|
+
expect{test_loader.get_klass('unknown_source')}.to raise_error(ArgumentError)
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'looks at custom paths in order' do
|
17
|
+
test_loader = TestLoader.new(['./spec/fixtures/loaders', '/spec/fixtures/loaders2'])
|
18
|
+
expect(test_loader.get_klass('order_test_source')::DIR).to eq('loaders')
|
19
|
+
|
20
|
+
test_loader = TestLoader.new(['./spec/fixtures/loaders2', '/spec/fixtures/loaders'])
|
21
|
+
expect(test_loader.get_klass('order_test_source')::DIR).to eq('loaders2')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'eventually looks at all paths' do
|
25
|
+
test_loader = TestLoader.new(['./spec/fixtures/loaders', './spec/fixtures/loaders2'])
|
26
|
+
expect(test_loader.get_klass('secondary_source')::DIR).to eq('loaders2')
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe 'standard class retrieval' do
|
31
|
+
it 'loads a class from a specified location when possible' do
|
32
|
+
loader = Interferon::HostSourcesLoader.new(['./spec/fixtures/loaders'])
|
33
|
+
klass = loader.get_klass('test_host_source')
|
34
|
+
|
35
|
+
expect(klass::DIR).to eq('loaders')
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'falls back to internal classes' do
|
39
|
+
loader = Interferon::HostSourcesLoader.new(['./spec/fixtures/loaders2'])
|
40
|
+
klass = loader.get_klass('test_host_source')
|
41
|
+
|
42
|
+
expect(klass::DIR).to eq('interferon')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe 'get_all' do
|
47
|
+
let(:loader) { TestLoader.new(['./spec/fixtures/loaders2']) }
|
48
|
+
before do
|
49
|
+
require './spec/fixtures/loaders2/test_sources/test_source'
|
50
|
+
require './spec/fixtures/loaders2/test_sources/secondary_source'
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'returns an instance for each enabled source' do
|
54
|
+
instances = loader.get_all(
|
55
|
+
[
|
56
|
+
{'type' => 'test_source', 'enabled' => true, 'options' => {}},
|
57
|
+
{'type' => 'secondary_source', 'enabled' => true, 'options' => {}},
|
58
|
+
])
|
59
|
+
|
60
|
+
expect(instances.count).to eq(2)
|
61
|
+
expect(instances).to contain_exactly(
|
62
|
+
an_instance_of(Interferon::TestSources::TestSource),
|
63
|
+
an_instance_of(Interferon::TestSources::SecondarySource))
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'ignores non-enabled sources' do
|
67
|
+
instances = loader.get_all(
|
68
|
+
[
|
69
|
+
{'type' => 'test_source', 'enabled' => true, 'options' => {}},
|
70
|
+
{'type' => 'secondary_source', 'enabled' => false, 'options' => {}},
|
71
|
+
])
|
72
|
+
|
73
|
+
expect(instances.count).to eq(1)
|
74
|
+
expect(instances).to contain_exactly(an_instance_of(Interferon::TestSources::TestSource))
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'ignores sources with no type set' do
|
78
|
+
instances = loader.get_all(
|
79
|
+
[
|
80
|
+
{'type' => 'test_source', 'enabled' => true, 'options' => {}},
|
81
|
+
{'enabled' => true, 'options' => {}},
|
82
|
+
])
|
83
|
+
|
84
|
+
expect(instances.count).to eq(1)
|
85
|
+
expect(instances).to contain_exactly(an_instance_of(Interferon::TestSources::TestSource))
|
86
|
+
end
|
87
|
+
|
88
|
+
it 'properly sets options on classes it instantiates' do
|
89
|
+
instances = loader.get_all(
|
90
|
+
[{'type' => 'test_source', 'enabled' => true, 'options' => {'testval' => 5}}])
|
91
|
+
|
92
|
+
expect(instances[0].testval).to eq(5)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# This file was generated by the `rspec --init` command.
|
2
2
|
|
3
|
+
# require the thing we're testing
|
4
|
+
require 'interferon'
|
5
|
+
require 'helpers/logging_helper.rb'
|
6
|
+
|
3
7
|
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
4
8
|
RSpec.configure do |config|
|
5
9
|
config.expect_with :rspec do |expectations|
|
@@ -59,4 +63,7 @@ RSpec.configure do |config|
|
|
59
63
|
# test failures related to randomization by passing the same `--seed` value
|
60
64
|
# as the one that triggered the failure.
|
61
65
|
Kernel.srand config.seed
|
66
|
+
|
67
|
+
# allow using the DSL without prefacing `Rspec` to everything
|
68
|
+
config.expose_dsl_globally = true
|
62
69
|
end
|
metadata
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: interferon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Igor Serebryany
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2015-
|
12
|
+
date: 2015-05-07 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: dogapi
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
19
|
- - ~>
|
18
20
|
- !ruby/object:Gem::Version
|
@@ -23,6 +25,7 @@ dependencies:
|
|
23
25
|
type: :runtime
|
24
26
|
prerelease: false
|
25
27
|
version_requirements: !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
26
29
|
requirements:
|
27
30
|
- - ~>
|
28
31
|
- !ruby/object:Gem::Version
|
@@ -33,6 +36,7 @@ dependencies:
|
|
33
36
|
- !ruby/object:Gem::Dependency
|
34
37
|
name: aws-sdk
|
35
38
|
requirement: !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
36
40
|
requirements:
|
37
41
|
- - ~>
|
38
42
|
- !ruby/object:Gem::Version
|
@@ -43,6 +47,7 @@ dependencies:
|
|
43
47
|
type: :runtime
|
44
48
|
prerelease: false
|
45
49
|
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
46
51
|
requirements:
|
47
52
|
- - ~>
|
48
53
|
- !ruby/object:Gem::Version
|
@@ -53,6 +58,7 @@ dependencies:
|
|
53
58
|
- !ruby/object:Gem::Dependency
|
54
59
|
name: dogstatsd-ruby
|
55
60
|
requirement: !ruby/object:Gem::Requirement
|
61
|
+
none: false
|
56
62
|
requirements:
|
57
63
|
- - ~>
|
58
64
|
- !ruby/object:Gem::Version
|
@@ -63,6 +69,7 @@ dependencies:
|
|
63
69
|
type: :runtime
|
64
70
|
prerelease: false
|
65
71
|
version_requirements: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
66
73
|
requirements:
|
67
74
|
- - ~>
|
68
75
|
- !ruby/object:Gem::Version
|
@@ -73,6 +80,7 @@ dependencies:
|
|
73
80
|
- !ruby/object:Gem::Dependency
|
74
81
|
name: rspec
|
75
82
|
requirement: !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
76
84
|
requirements:
|
77
85
|
- - ~>
|
78
86
|
- !ruby/object:Gem::Version
|
@@ -80,6 +88,7 @@ dependencies:
|
|
80
88
|
type: :development
|
81
89
|
prerelease: false
|
82
90
|
version_requirements: !ruby/object:Gem::Requirement
|
91
|
+
none: false
|
83
92
|
requirements:
|
84
93
|
- - ~>
|
85
94
|
- !ruby/object:Gem::Version
|
@@ -87,6 +96,7 @@ dependencies:
|
|
87
96
|
- !ruby/object:Gem::Dependency
|
88
97
|
name: pry
|
89
98
|
requirement: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
90
100
|
requirements:
|
91
101
|
- - ~>
|
92
102
|
- !ruby/object:Gem::Version
|
@@ -94,6 +104,7 @@ dependencies:
|
|
94
104
|
type: :development
|
95
105
|
prerelease: false
|
96
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
none: false
|
97
108
|
requirements:
|
98
109
|
- - ~>
|
99
110
|
- !ruby/object:Gem::Version
|
@@ -107,33 +118,13 @@ extensions: []
|
|
107
118
|
extra_rdoc_files: []
|
108
119
|
files:
|
109
120
|
- .gitignore
|
121
|
+
- .travis.yml
|
110
122
|
- Gemfile
|
111
123
|
- Gemfile.lock
|
112
124
|
- LICENSE
|
113
125
|
- README.md
|
114
126
|
- bin/interferon
|
115
127
|
- config.example.yaml
|
116
|
-
- groups/data.yaml
|
117
|
-
- groups/dataeng.yaml
|
118
|
-
- groups/datainfra.yaml
|
119
|
-
- groups/devhap.yaml
|
120
|
-
- groups/discover.yaml
|
121
|
-
- groups/growth.yaml
|
122
|
-
- groups/host.yaml
|
123
|
-
- groups/internalproducts.yml
|
124
|
-
- groups/logstash.yaml
|
125
|
-
- groups/mobile.yaml
|
126
|
-
- groups/pagerduty_sysops.yaml
|
127
|
-
- groups/panda.yaml
|
128
|
-
- groups/payments.yaml
|
129
|
-
- groups/payments_finance.yaml
|
130
|
-
- groups/prodinfra.yaml
|
131
|
-
- groups/search.yaml
|
132
|
-
- groups/security.yaml
|
133
|
-
- groups/sre.yaml
|
134
|
-
- groups/teamx.yaml
|
135
|
-
- groups/tns.yaml
|
136
|
-
- groups/tools.yml
|
137
128
|
- interferon.gemspec
|
138
129
|
- lib/interferon.rb
|
139
130
|
- lib/interferon/alert.rb
|
@@ -145,35 +136,60 @@ files:
|
|
145
136
|
- lib/interferon/host_sources/aws_rds.rb
|
146
137
|
- lib/interferon/host_sources/optica.rb
|
147
138
|
- lib/interferon/host_sources/optica_services.rb
|
139
|
+
- lib/interferon/host_sources/test_host_source.rb
|
148
140
|
- lib/interferon/loaders.rb
|
149
141
|
- lib/interferon/logging.rb
|
150
142
|
- lib/interferon/version.rb
|
151
|
-
- script/convert.rb
|
152
143
|
- script/pre-commit
|
144
|
+
- spec/fixtures/loaders/host_sources/test_host_source.rb
|
145
|
+
- spec/fixtures/loaders/test_sources/order_test_source.rb
|
146
|
+
- spec/fixtures/loaders/test_sources/test_source.rb
|
147
|
+
- spec/fixtures/loaders2/test_sources/order_test_source.rb
|
148
|
+
- spec/fixtures/loaders2/test_sources/secondary_source.rb
|
149
|
+
- spec/fixtures/loaders2/test_sources/test_source.rb
|
150
|
+
- spec/helpers/loader_helper.rb
|
151
|
+
- spec/helpers/logging_helper.rb
|
152
|
+
- spec/helpers/optica_helper.rb
|
153
|
+
- spec/lib/interferon/host_sources/optica_services_spec.rb
|
154
|
+
- spec/lib/interferon/host_sources/optica_spec.rb
|
155
|
+
- spec/lib/interferon/loaders_spec.rb
|
153
156
|
- spec/spec_helper.rb
|
154
157
|
homepage: https://www.github.com/airbnb/interferon
|
155
158
|
licenses:
|
156
159
|
- MIT
|
157
|
-
metadata: {}
|
158
160
|
post_install_message:
|
159
161
|
rdoc_options: []
|
160
162
|
require_paths:
|
161
163
|
- lib
|
162
164
|
required_ruby_version: !ruby/object:Gem::Requirement
|
165
|
+
none: false
|
163
166
|
requirements:
|
164
167
|
- - ! '>='
|
165
168
|
- !ruby/object:Gem::Version
|
166
169
|
version: '0'
|
167
170
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
|
+
none: false
|
168
172
|
requirements:
|
169
173
|
- - ! '>='
|
170
174
|
- !ruby/object:Gem::Version
|
171
175
|
version: '0'
|
172
176
|
requirements: []
|
173
177
|
rubyforge_project:
|
174
|
-
rubygems_version:
|
178
|
+
rubygems_version: 1.8.23.2
|
175
179
|
signing_key:
|
176
|
-
specification_version:
|
180
|
+
specification_version: 3
|
177
181
|
summary: ': Store metrics alerts in code!'
|
178
182
|
test_files:
|
183
|
+
- spec/fixtures/loaders/host_sources/test_host_source.rb
|
184
|
+
- spec/fixtures/loaders/test_sources/order_test_source.rb
|
185
|
+
- spec/fixtures/loaders/test_sources/test_source.rb
|
186
|
+
- spec/fixtures/loaders2/test_sources/order_test_source.rb
|
187
|
+
- spec/fixtures/loaders2/test_sources/secondary_source.rb
|
188
|
+
- spec/fixtures/loaders2/test_sources/test_source.rb
|
189
|
+
- spec/helpers/loader_helper.rb
|
190
|
+
- spec/helpers/logging_helper.rb
|
191
|
+
- spec/helpers/optica_helper.rb
|
192
|
+
- spec/lib/interferon/host_sources/optica_services_spec.rb
|
193
|
+
- spec/lib/interferon/host_sources/optica_spec.rb
|
194
|
+
- spec/lib/interferon/loaders_spec.rb
|
179
195
|
- spec/spec_helper.rb
|
checksums.yaml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
!binary "U0hBMQ==":
|
3
|
-
metadata.gz: !binary |-
|
4
|
-
ZjQ3ZDE1ZGY2YjRkYTQ1NjU4NDhjNjlhNTc5NzgwMTQzNmQ5MTJmYg==
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
YzNiZjUwMGU0NjNjMGQwN2U3YTNkOGUxYTRlZjkwNDE5ODk0ZWZjMg==
|
7
|
-
SHA512:
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
ZmFkMDI4YjQ3NjQxYTU3MGQ5ZTZhYzZiMjE0MjEwMTFlMTMzMGJhMWEwM2Iw
|
10
|
-
YzcxYjUwMDk3YTI4ZTI0MWY4NTg0MmYzOWYwODViNzRmNzk5MTgxNThmMjY3
|
11
|
-
N2FlOTE0YTQ2M2M1ZThhNTEzYzhkZGNlMWNiODlmYWI3ZGEzYzc=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
OGU0NDM3ZjU1NmNlNTNiMTliZDcyN2RiZTM5MzBhY2MxZDliZTJiMzAyYjhk
|
14
|
-
N2E0ZjI2MWRiYmEyZDk2YzdiY2RlN2FiNDlhNzU1OThiYTdmNDM3YWUwZjFj
|
15
|
-
ZWMxN2VmYjYxOGVlODM4NDRlOGIzNzViZDEwMWM3ZTQyYjYzYjQ=
|
data/groups/data.yaml
DELETED
@@ -1,11 +0,0 @@
|
|
1
|
-
---
|
2
|
-
# deprecated; use datainfra
|
3
|
-
name: data
|
4
|
-
people:
|
5
|
-
- andy.kram@airbnb.com
|
6
|
-
- brenden.matthews@airbnb.com
|
7
|
-
- james.mayfield@airbnb.com
|
8
|
-
- paul.yang@airbnb.com
|
9
|
-
- krishna.puttaswamy@airbnb.com
|
10
|
-
- swaroop.jagadish@airbnb.com
|
11
|
-
- wensheng.hua@airbnb.com
|
data/groups/dataeng.yaml
DELETED
data/groups/datainfra.yaml
DELETED
data/groups/devhap.yaml
DELETED
data/groups/discover.yaml
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
---
|
2
|
-
name: discover
|
3
|
-
people:
|
4
|
-
- frank.lin@airbnb.com
|
5
|
-
- lu.cheng@airbnb.com
|
6
|
-
- naseem@airbnb.com
|
7
|
-
- phillippe.siclait@airbnb.com
|
8
|
-
- surabhi.gupta@airbnb.com
|
9
|
-
- horace.ko@airbnb.com
|
10
|
-
- tao.xu@airbnb.com
|
11
|
-
- josh.perez@airbnb.com
|
12
|
-
- yanxin.shi@airbnb.com
|
13
|
-
- tao.tao@airbnb.com
|
data/groups/growth.yaml
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
---
|
2
|
-
name: growth
|
3
|
-
people:
|
4
|
-
- tanya.breshears@airbnb.com
|
5
|
-
- amy.wibowo@airbnb.com
|
6
|
-
- jimmy.tang@airbnb.com
|
7
|
-
- mona@airbnb.com
|
8
|
-
- roman.fuchs@airbnb.com
|
9
|
-
- jason@airbnb.com
|
10
|
-
- jason.bosinoff@airbnb.com
|
11
|
-
- henry.cai@airbnb.com
|
12
|
-
- rahul.agrawal@airbnb.com
|
13
|
-
- song.xie@airbnb.com
|
14
|
-
- yanxin.shi@airbnb.com
|
15
|
-
- nathaniel.weinman@airbnb.com
|
16
|
-
- fengming.wang@airbnb.com
|
17
|
-
- winnie.wang@airbnb.com
|
data/groups/host.yaml
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
---
|
2
|
-
name: host
|
3
|
-
people:
|
4
|
-
- alanna.scott@airbnb.com
|
5
|
-
- james.ostrowski@airbnb.com
|
6
|
-
- barbara.raitz@airbnb.com
|
7
|
-
- yat.choi@airbnb.com
|
8
|
-
- edmund.ye@airbnb.com
|
9
|
-
- spike@airbnb.com
|
10
|
-
- raph@airbnb.com
|
11
|
-
- jessica.ho@airbnb.com
|
12
|
-
- trunal.bhanse@airbnb.com
|
data/groups/internalproducts.yml
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
---
|
2
|
-
name: internalproducts
|
3
|
-
people:
|
4
|
-
- alvin.sng@airbnb.com
|
5
|
-
- emre.ozdemir@airbnb.com
|
6
|
-
- phil.busby@airbnb.com
|
7
|
-
- adrian.wisernig@airbnb.com
|
8
|
-
- bekki.jam@airbnb.com
|
9
|
-
- jujhaar.singh@airbnb.com
|
10
|
-
- jessica.toy@airbnb.com
|
11
|
-
- james.nichols@airbnb.com
|
12
|
-
- harry@airbnb.com
|
13
|
-
- davide.cerri@airbnb.com
|
data/groups/logstash.yaml
DELETED
data/groups/mobile.yaml
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
---
|
2
|
-
name: mobile
|
3
|
-
people:
|
4
|
-
- arthur.pang@airbnb.com
|
5
|
-
- brandon.withrow@airbnb.com
|
6
|
-
- youssef.francis@airbnb.com
|
7
|
-
- zane.claes@airbnb.com
|
8
|
-
- ian.pappas@airbnb.com
|
9
|
-
- xiao.pan@airbnb.com
|
10
|
-
- alex.davis@airbnb.com
|
11
|
-
- nick.adams@airbnb.com
|
12
|
-
- carol.leung@airbnb.com
|
13
|
-
- geobio.boo@airbnb.com
|
14
|
-
- eric.petzel@airbnb.com
|
15
|
-
- christian.deonier@airbnb.com
|
16
|
-
- michael.potter@airbnb.com
|
17
|
-
- sean.abraham@airbnb.com
|
data/groups/panda.yaml
DELETED
data/groups/payments.yaml
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
---
|
2
|
-
name: payments
|
3
|
-
people:
|
4
|
-
- allen.kerr@airbnb.com
|
5
|
-
- ian@airbnb.com
|
6
|
-
- john.terenzio@airbnb.com
|
7
|
-
- joseph.sofaer@airbnb.com
|
8
|
-
- josh.lee@airbnb.com
|
9
|
-
- juliusz.gonera@airbnb.com
|
10
|
-
- karen.kim@airbnb.com
|
11
|
-
- kevin.sun@airbnb.com
|
12
|
-
- lou.kosak@airbnb.com
|
13
|
-
- michel.weksler@airbnb.com
|
14
|
-
- mike.lewis@airbnb.com
|
15
|
-
- tao.cui@airbnb.com
|
16
|
-
- varun.pai@airbnb.com
|
data/groups/prodinfra.yaml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
name: prodinfra
|
3
|
-
people:
|
4
|
-
- alexis.midon@airbnb.com
|
5
|
-
- ben.hughes@airbnb.com
|
6
|
-
- jon.tai@airbnb.com
|
7
|
-
- joseph.sofaer@airbnb.com
|
8
|
-
- kai.liu@airbnb.com
|
9
|
-
- kevin.rice@airbnb.com
|
10
|
-
- nija.mashruwala@airbnb.com
|
11
|
-
- philip.snowberger@airbnb.com
|
12
|
-
- rahul.iyer@airbnb.com
|
13
|
-
- sonic.wang@airbnb.com
|
14
|
-
- willie.yao@airbnb.com
|
15
|
-
|
data/groups/search.yaml
DELETED
data/groups/security.yaml
DELETED
data/groups/sre.yaml
DELETED
@@ -1,16 +0,0 @@
|
|
1
|
-
---
|
2
|
-
# deprecated; use prodinfra
|
3
|
-
name: sre
|
4
|
-
people:
|
5
|
-
- alexis.midon@airbnb.com
|
6
|
-
- ben.hughes@airbnb.com
|
7
|
-
- jon.tai@airbnb.com
|
8
|
-
- joseph.sofaer@airbnb.com
|
9
|
-
- kai.liu@airbnb.com
|
10
|
-
- kevin.rice@airbnb.com
|
11
|
-
- nija.mashruwala@airbnb.com
|
12
|
-
- philip.snowberger@airbnb.com
|
13
|
-
- rahul.iyer@airbnb.com
|
14
|
-
- sonic.wang@airbnb.com
|
15
|
-
- willie.yao@airbnb.com
|
16
|
-
|
data/groups/teamx.yaml
DELETED
data/groups/tns.yaml
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
---
|
2
|
-
name: tns
|
3
|
-
people:
|
4
|
-
- alok.gupta@airbnb.com
|
5
|
-
- anish.muppalaneni@airbnb.com
|
6
|
-
- dmitry.alexeenko@airbnb.com
|
7
|
-
- eric.levine@airbnb.com
|
8
|
-
- freddy.chen@airbnb.com
|
9
|
-
- jerry.luan@airbnb.com
|
10
|
-
- justin.chen@airbnb.com
|
11
|
-
- sean.albito@airbnb.com
|
12
|
-
- siddharth.kar@airbnb.com
|
13
|
-
- tony.wen@airbnb.com
|
14
|
-
- lee.zhang@airbnb.com
|
data/groups/tools.yml
DELETED
data/script/convert.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'json'
|
4
|
-
require 'yaml'
|
5
|
-
|
6
|
-
script_dir = File.dirname(File.expand_path __FILE__)
|
7
|
-
alerts_dir = File.join(script_dir, '..', 'alerts')
|
8
|
-
|
9
|
-
Dir.glob(File.join(alerts_dir, '*.json')) do |alert_file|
|
10
|
-
alert = JSON::parse(File.read(alert_file))
|
11
|
-
|
12
|
-
# convert old to new filters
|
13
|
-
alert['filter'] ||= {}
|
14
|
-
%w{role host}.each do |field|
|
15
|
-
%w{included excluded}.each do |type|
|
16
|
-
old_field = "#{type}_#{field}s"
|
17
|
-
if alert['filter'].include?(old_field)
|
18
|
-
alert['filter'][field] ||= {}
|
19
|
-
alert['filter'][field][type] = alert['filter'][old_field]
|
20
|
-
alert['filter'].delete(old_field)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
# write out new filter file
|
26
|
-
new_name = alert_file.chomp(File.extname(alert_file)) + ".yaml"
|
27
|
-
File.write(new_name, YAML.dump(alert))
|
28
|
-
File.delete(alert_file)
|
29
|
-
end
|