upstreamstatus 0.2.4 → 0.2.5
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 +4 -4
- data/lib/upstreamstatus/version.rb +1 -1
- data/lib/upstreamstatus.rb +95 -35
- data/upstreamstatus.gemspec +2 -0
- metadata +30 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46e8a906db4b57704842d9182ed382e74e6b9604
|
4
|
+
data.tar.gz: 57315acb232238d2932b2860b9627796c6fac02b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cf7475dacb3d805f689ea558dcedc13c3b430ecf95a824b042e0ac1c129414d74a2886241bbf5d2dc8e52ff0a5b5f62cbf5783b131d35d35a17734cf5a4b4040
|
7
|
+
data.tar.gz: d17cc84a32ee42ac467b1db5f2f3658a1851dd23992d07b75c0120a3d0eda76b35787a888db258914ec9306128e70232c95c75bd6fed89e1144f2109f53b3963
|
data/lib/upstreamstatus.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'upstreamstatus/version'
|
2
|
+
require 'active_support/time'
|
2
3
|
require 'unirest'
|
3
4
|
require 'yaml'
|
4
5
|
require 'ostruct'
|
@@ -6,6 +7,8 @@ require 'trollop'
|
|
6
7
|
require 'forwardable'
|
7
8
|
require 'json'
|
8
9
|
require 'sentry-raven'
|
10
|
+
require 'pagerduty'
|
11
|
+
require 'time'
|
9
12
|
|
10
13
|
class Upstreamstatus
|
11
14
|
extend Forwardable
|
@@ -13,14 +16,32 @@ class Upstreamstatus
|
|
13
16
|
def_delegators :@conf,
|
14
17
|
:status_check_url,
|
15
18
|
:sentry_dsn,
|
16
|
-
:
|
19
|
+
:pagerduty_api_url,
|
20
|
+
:pagerduty_service_id,
|
21
|
+
:pagerduty_api_key,
|
22
|
+
:pagerduty_rest_api_key
|
17
23
|
|
18
24
|
attr_reader :conf
|
19
25
|
|
20
26
|
def initialize
|
21
27
|
@conf = OpenStruct.new load_conf
|
22
28
|
|
23
|
-
return unless opts[:notify]
|
29
|
+
return unless opts[:notify]
|
30
|
+
|
31
|
+
%w(
|
32
|
+
sentry_dsn
|
33
|
+
pagerduty_api_key
|
34
|
+
pagerduty_rest_api_key
|
35
|
+
pagerduty_api_url
|
36
|
+
pagerduty_service_id
|
37
|
+
).each do |key|
|
38
|
+
fail "Config missing #{key}" unless conf[key]
|
39
|
+
end
|
40
|
+
|
41
|
+
Unirest.default_header 'Authorization',
|
42
|
+
"Token token=#{pagerduty_rest_api_key}"
|
43
|
+
Unirest.default_header 'Content-type', 'application/json'
|
44
|
+
|
24
45
|
Raven.configure do |config|
|
25
46
|
config.dsn = sentry_dsn
|
26
47
|
config.logger = logger
|
@@ -36,21 +57,34 @@ class Upstreamstatus
|
|
36
57
|
exit 0
|
37
58
|
end
|
38
59
|
|
60
|
+
puts "Detected down hosts:\n"
|
39
61
|
print_hosts down_hosts
|
40
|
-
logger.
|
62
|
+
logger.info "Detected down hosts: #{down_hosts.to_json}"
|
41
63
|
|
42
64
|
if opts[:notify]
|
43
|
-
puts 'Sending notifications'
|
44
65
|
notify(
|
45
66
|
'One or more API upstream hosts listed as down',
|
46
67
|
JSON.pretty_generate(down_hosts)
|
47
68
|
)
|
48
69
|
end
|
49
70
|
exit 1
|
71
|
+
rescue Interrupt => e
|
72
|
+
puts "Received #{e.class}"
|
73
|
+
exit 99
|
74
|
+
rescue SignalException => e
|
75
|
+
logger.info "Received: #{e.signm} (#{e.signo})"
|
76
|
+
exit 2
|
77
|
+
rescue SystemExit => e
|
78
|
+
exit e.status
|
79
|
+
rescue Exception => e # Need to rescue "Exception" so that Sentry gets it
|
80
|
+
Raven.capture_exception(e) if sentry_dsn
|
81
|
+
logger.fatal e.message
|
82
|
+
logger.fatal e.backtrace.join("\n")
|
83
|
+
raise e
|
50
84
|
end
|
51
85
|
|
52
86
|
def current_status
|
53
|
-
return
|
87
|
+
return fake_response if opts[:simulate]
|
54
88
|
|
55
89
|
r = Unirest.get status_check_url
|
56
90
|
|
@@ -65,34 +99,58 @@ class Upstreamstatus
|
|
65
99
|
|
66
100
|
private
|
67
101
|
|
68
|
-
def
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
'
|
83
|
-
'
|
84
|
-
'
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
102
|
+
def pd_incidents
|
103
|
+
@pd_incidents ||= begin
|
104
|
+
r = Unirest.get(
|
105
|
+
"#{pagerduty_api_url}/incidents",
|
106
|
+
parameters: { service: pagerduty_service_id }
|
107
|
+
)
|
108
|
+
fail "Result: #{r.inspect}" unless (200..299).include?(r.code)
|
109
|
+
r.body['incidents']
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def fake_response
|
114
|
+
{
|
115
|
+
'servers' => {
|
116
|
+
'total' => 2,
|
117
|
+
'generation' => 99,
|
118
|
+
'server' => [
|
119
|
+
{
|
120
|
+
'index' => 0,
|
121
|
+
'upstream' => 'testupstream',
|
122
|
+
'name' => '10.0.0.1 =>8080',
|
123
|
+
'status' => 'up',
|
124
|
+
'rise' => 10_459,
|
125
|
+
'fall' => 0,
|
126
|
+
'type' => 'http',
|
127
|
+
'port' => 0
|
128
|
+
},
|
129
|
+
{
|
130
|
+
'index' => 1,
|
131
|
+
'upstream' => 'testupstream',
|
132
|
+
'name' => '10.0.0.2 =>8080',
|
133
|
+
'status' => 'down',
|
134
|
+
'rise' => 10_029,
|
135
|
+
'fall' => 0,
|
136
|
+
'type' => 'http',
|
137
|
+
'port' => 0
|
138
|
+
}
|
139
|
+
]
|
89
140
|
}
|
90
|
-
|
141
|
+
}
|
91
142
|
end
|
92
143
|
|
93
144
|
def clear_active_alerts!
|
94
|
-
return unless
|
95
|
-
|
145
|
+
return unless opts[:notify]
|
146
|
+
pd_incidents.each do |i|
|
147
|
+
resolve_incident i['incident_key'] unless i['status'] == 'resolved'
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def resolve_incident(incident_key)
|
152
|
+
puts "Resolving incident: #{incident_key}"
|
153
|
+
pagerduty.get_incident(incident_key).resolve
|
96
154
|
end
|
97
155
|
|
98
156
|
def logger
|
@@ -104,7 +162,10 @@ class Upstreamstatus
|
|
104
162
|
end
|
105
163
|
|
106
164
|
def notify(msg, details)
|
107
|
-
|
165
|
+
if active_alert?(msg)
|
166
|
+
puts "Already an active alert. Not sending anything (message: #{msg})"
|
167
|
+
else
|
168
|
+
puts "Notifying PagerDuty (message: #{msg})"
|
108
169
|
pd = pagerduty.trigger(
|
109
170
|
msg,
|
110
171
|
client: ENV['hostname'],
|
@@ -124,14 +185,13 @@ class Upstreamstatus
|
|
124
185
|
}.to_json
|
125
186
|
)
|
126
187
|
end
|
127
|
-
|
128
|
-
Raven.capture_exception(e) if sentry_dsn
|
129
188
|
end
|
130
189
|
|
131
190
|
def active_alert?(msg)
|
132
|
-
|
133
|
-
|
134
|
-
|
191
|
+
pd_incidents.find do |incident|
|
192
|
+
incident['status'] != 'resolved' &&
|
193
|
+
incident['trigger_summary_data']['description'] == msg
|
194
|
+
end
|
135
195
|
end
|
136
196
|
|
137
197
|
def opts
|
data/upstreamstatus.gemspec
CHANGED
@@ -30,6 +30,8 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.add_dependency 'unirest', '~> 1.1'
|
31
31
|
spec.add_dependency 'trollop', '~> 2.1'
|
32
32
|
spec.add_dependency 'sentry-raven'
|
33
|
+
spec.add_dependency 'pagerduty'
|
34
|
+
spec.add_dependency 'activesupport'
|
33
35
|
|
34
36
|
spec.add_development_dependency 'bundler', '~> 1.10'
|
35
37
|
spec.add_development_dependency 'rake', '~> 10.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: upstreamstatus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Herot
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-11-
|
11
|
+
date: 2015-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: unirest
|
@@ -52,6 +52,34 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pagerduty
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: activesupport
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: bundler
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -156,4 +184,3 @@ signing_key:
|
|
156
184
|
specification_version: 4
|
157
185
|
summary: Parse the output of the Nginx Upstream Check plugin
|
158
186
|
test_files: []
|
159
|
-
has_rdoc:
|