goodguide-pinglish 1.1.0 → 1.2.0
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 +8 -8
- data/.travis.yml +4 -1
- data/Gemfile +1 -1
- data/README.md +0 -3
- data/goodguide-pinglish.gemspec +11 -11
- data/lib/pinglish.rb +67 -80
- data/test/helper.rb +2 -0
- data/test/pinglish_test.rb +75 -99
- metadata +3 -4
- data/script/bootstrap +0 -9
- data/script/release +0 -38
- data/script/test +0 -9
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
N2QyYmIwZjlmNjU0ODk0MDk4NDAzMWI5NDEyYzkyNzU4NWI5YzUyYg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NmVlMmFjNDhmY2JjZTdiN2U1M2Q5ZjBlMTY2OTU5MDJjYTg5ZDI4Ng==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
OTRmMmJiOTkyNzFlYmRkMjFmOTAyYTBhY2FmZGJjNDlhYmVkZDVmNWNkYjMx
|
10
|
+
NWE2YjUwOTFlZThlNjIwMDk4MTExOWUwZTExODkyODYzZWNkNGFmNDRkN2M0
|
11
|
+
ZDI1MjAyMDZjNGFjYzI2NjU4NGQ3NzA4MzgxNzM5ZmY0OTJiZGE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
NWNlYmY5NzcwZmNjNDc0YTE1YWE1NDI0Mzc0NTUwMWU1Mzk0YTgzYTNhODVh
|
14
|
+
OTIzZWVkY2EzZmY3MzEwZDVmNjRlZmE3NGExOGExYzMzYzU0Mzg0ODI5OTM3
|
15
|
+
M2VlYjNmNWIwYjliYmY0NGM2MWI4YTAzOTk3N2RiMTUwNzY0NWY=
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
source
|
1
|
+
source 'https://rubygems.org'
|
2
2
|
gemspec
|
data/README.md
CHANGED
@@ -11,9 +11,6 @@ A simple Rack app for checking application health. Pinglish responds to `GET` re
|
|
11
11
|
agains my MySQL database," "Can I create/read keys in Redis," or "How
|
12
12
|
many docs are in my ElasticSearch index?"
|
13
13
|
|
14
|
-
0. The response __must__ return within 29 seconds. This is one second
|
15
|
-
less than the default timeout for many monitoring services.
|
16
|
-
|
17
14
|
0. The response __must__ return an `HTTP 200 OK` status code if all
|
18
15
|
health checks pass.
|
19
16
|
|
data/goodguide-pinglish.gemspec
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
2
2
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
|
-
gem.name =
|
5
|
-
gem.version =
|
6
|
-
gem.authors = [
|
7
|
-
gem.email = [
|
8
|
-
gem.description =
|
9
|
-
gem.summary =
|
10
|
-
gem.homepage =
|
4
|
+
gem.name = 'goodguide-pinglish'
|
5
|
+
gem.version = '1.2.0'
|
6
|
+
gem.authors = ['John Barnette', 'Will Farrington', 'Ryan Long']
|
7
|
+
gem.email = ['jbarnette@github.com', 'wfarr@github.com', 'ryan@rtlong.com']
|
8
|
+
gem.description = 'A simple Rack middleware for checking app health.'
|
9
|
+
gem.summary = '/_ping your way to freedom.'
|
10
|
+
gem.homepage = 'https://github.com/goodguide/pinglish'
|
11
11
|
|
12
12
|
gem.files = `git ls-files`.split($/)
|
13
13
|
gem.test_files = gem.files.grep(/^test/)
|
14
|
-
gem.require_paths = [
|
14
|
+
gem.require_paths = ['lib']
|
15
15
|
|
16
|
-
gem.add_dependency
|
16
|
+
gem.add_dependency 'rack'
|
17
17
|
gem.add_development_dependency 'rake', '~> 10.4.0'
|
18
|
-
gem.add_development_dependency
|
19
|
-
gem.add_development_dependency
|
18
|
+
gem.add_development_dependency 'minitest', '~> 4.5'
|
19
|
+
gem.add_development_dependency 'rack-test', '~> 0.6'
|
20
20
|
end
|
data/lib/pinglish.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require "timeout"
|
1
|
+
require 'json'
|
2
|
+
require 'pinglish/check'
|
3
|
+
require 'rack/request'
|
5
4
|
|
6
5
|
# This Rack app provides an endpoint for configurable
|
7
6
|
# system health checks. It's intended to be consumed by machines.
|
@@ -10,96 +9,97 @@ class Pinglish
|
|
10
9
|
|
11
10
|
# The HTTP headers sent for every response.
|
12
11
|
HEADERS = {
|
13
|
-
|
12
|
+
'Content-Type' => 'application/json; charset=UTF-8'
|
14
13
|
}
|
15
14
|
|
16
|
-
#
|
17
|
-
class TooLong < RuntimeError; end
|
18
|
-
|
19
|
-
# Create a new instance of the app, with optional parameter `:max` timeout in seconds (default: `29`); yields itself to an optional block for configuring checks.
|
15
|
+
# Create a new instance of the app; yields itself to an optional block for configuring checks.
|
20
16
|
def initialize(options=nil, &block)
|
21
17
|
options ||= {}
|
22
18
|
|
23
19
|
@checks = {}
|
24
|
-
@max = options[:max] || 29 # seconds
|
25
20
|
|
26
|
-
yield
|
21
|
+
yield(self) if block_given?
|
27
22
|
end
|
28
23
|
|
29
24
|
def call(env)
|
30
25
|
request = Rack::Request.new(env)
|
26
|
+
results = {}
|
31
27
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
28
|
+
selected_checks(request.params).each do |check|
|
29
|
+
check_thread = Thread.new do
|
30
|
+
check.call
|
31
|
+
end
|
32
|
+
sleep_thread = Thread.new do
|
33
|
+
sleep check.timeout
|
34
|
+
check_thread.kill
|
35
|
+
:timeout
|
36
|
+
end
|
37
|
+
begin
|
38
|
+
val = check_thread.value
|
39
|
+
rescue => e
|
40
|
+
val = e
|
41
|
+
end
|
42
|
+
sleep_thread.kill
|
43
|
+
results[check.name] = sleep_thread.value || val
|
44
|
+
end
|
45
45
|
|
46
|
-
|
47
|
-
|
48
|
-
|
46
|
+
failed = results.values.any? { |v| failure?(v) }
|
47
|
+
http_status = failed ? 503 : 200
|
48
|
+
text_status = failed ? 'failures' : 'ok'
|
49
49
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
data = {
|
51
|
+
now: Time.now.to_i,
|
52
|
+
status: text_status,
|
53
|
+
}
|
54
|
+
|
55
|
+
results.each do |name, value|
|
56
|
+
if timeout?(value)
|
57
|
+
# If the check failed because it timed out, its name is
|
58
|
+
# added to a `timeouts` array instead.
|
59
|
+
(data[:timeouts] ||= []) << name
|
60
|
+
|
61
|
+
elsif failure?(value)
|
62
|
+
# If a check fails its name is added to a `failures` array.
|
54
63
|
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
if key == :failures and value.is_a?(Exception)
|
65
|
-
data[name] = {
|
66
|
-
state: :error,
|
67
|
-
exception: value.class.name,
|
68
|
-
message: value.message,
|
69
|
-
}
|
70
|
-
end
|
71
|
-
|
72
|
-
elsif value
|
73
|
-
# If the check passed and returned a value, the stringified
|
74
|
-
# version of the value is returned under the `name` key.
|
75
|
-
|
76
|
-
data[name] = value
|
77
|
-
end
|
64
|
+
(data[:failures] ||= []) << name
|
65
|
+
|
66
|
+
if value.is_a?(Exception)
|
67
|
+
data[name] = {
|
68
|
+
state: :error,
|
69
|
+
exception: value.class.name,
|
70
|
+
message: value.message,
|
71
|
+
}
|
78
72
|
end
|
79
73
|
|
80
|
-
|
74
|
+
elsif value
|
75
|
+
# If the check passed and returned a value, the stringified
|
76
|
+
# version of the value is returned under the `name` key.
|
77
|
+
|
78
|
+
data[name] = value
|
81
79
|
end
|
80
|
+
end
|
82
81
|
|
83
|
-
|
84
|
-
# Something catastrophic happened. We can't even run the checks
|
85
|
-
# and render a JSON response. Fall back on a pre-rendered string
|
86
|
-
# and interpolate the current epoch time.
|
82
|
+
[http_status, HEADERS, [JSON.generate(data)]]
|
87
83
|
|
88
|
-
|
84
|
+
rescue Exception => ex
|
85
|
+
# Something catastrophic happened. We can't even run the checks
|
86
|
+
# and render a JSON response. Fall back on a pre-rendered string
|
87
|
+
# and interpolate the current epoch time.
|
89
88
|
|
90
|
-
|
89
|
+
now = Time.now.to_i
|
90
|
+
|
91
|
+
body = <<-EOF.gsub(/^ {6}/, '')
|
91
92
|
{
|
92
93
|
"status": "failures",
|
93
|
-
"now":
|
94
|
+
"now": #{now},
|
94
95
|
"error": {
|
95
96
|
"class": "#{ex.class.name}",
|
96
97
|
"message": "#{ex.message.tr('"', '')}"
|
97
98
|
}
|
98
99
|
}
|
99
|
-
|
100
|
+
EOF
|
100
101
|
|
101
|
-
|
102
|
-
end
|
102
|
+
[500, HEADERS, [body]]
|
103
103
|
end
|
104
104
|
|
105
105
|
def selected_checks(params)
|
@@ -124,23 +124,10 @@ class Pinglish
|
|
124
124
|
# Subclasses can override this method for different behavior.
|
125
125
|
|
126
126
|
def failure?(value)
|
127
|
-
value.is_a?(Exception) || value == false
|
127
|
+
value.is_a?(Exception) || value == false || timeout?(value)
|
128
128
|
end
|
129
129
|
|
130
|
-
# Raise Pinglish::TooLong after `seconds` has elapsed. This default
|
131
|
-
# implementation uses Ruby's built-in Timeout class. Subclasses can
|
132
|
-
# override this method for different behavior, but any new
|
133
|
-
# implementation must raise Pinglish::TooLong when the timeout is
|
134
|
-
# exceeded or override `timeout?` appropriately.
|
135
|
-
|
136
|
-
def timeout(seconds, &block)
|
137
|
-
Timeout.timeout seconds, Pinglish::TooLong, &block
|
138
|
-
end
|
139
|
-
|
140
|
-
# Does `value` represent a check timeout? Returns `true` for any
|
141
|
-
# value that is an instance of Pinglish::TooLong.
|
142
|
-
|
143
130
|
def timeout?(value)
|
144
|
-
value
|
131
|
+
value == :timeout
|
145
132
|
end
|
146
133
|
end
|
data/test/helper.rb
CHANGED
data/test/pinglish_test.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'helper'
|
2
|
+
require 'rack/test'
|
3
3
|
|
4
4
|
class PinglishTest < MiniTest::Unit::TestCase
|
5
|
-
FakeApp = lambda { |env| [200, {}, [
|
5
|
+
FakeApp = lambda { |env| [200, {}, ['fake']] }
|
6
6
|
|
7
7
|
def build_app(*args, &block)
|
8
8
|
Rack::Builder.new do |builder|
|
@@ -18,7 +18,7 @@ class PinglishTest < MiniTest::Unit::TestCase
|
|
18
18
|
builder.map '/_ping' do
|
19
19
|
run Pinglish.new(*args, &block)
|
20
20
|
end
|
21
|
-
builder.run lambda { |env| raise
|
21
|
+
builder.run lambda { |env| raise 'boom' }
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -27,7 +27,7 @@ class PinglishTest < MiniTest::Unit::TestCase
|
|
27
27
|
session = Rack::Test::Session.new(app)
|
28
28
|
|
29
29
|
assert_raises RuntimeError do
|
30
|
-
session.get
|
30
|
+
session.get '/something'
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -35,14 +35,14 @@ class PinglishTest < MiniTest::Unit::TestCase
|
|
35
35
|
app = build_app
|
36
36
|
|
37
37
|
session = Rack::Test::Session.new(app)
|
38
|
-
session.get
|
38
|
+
session.get '/_ping'
|
39
39
|
assert_equal 200, session.last_response.status
|
40
|
-
assert_equal
|
40
|
+
assert_equal 'application/json; charset=UTF-8',
|
41
41
|
session.last_response.content_type
|
42
42
|
|
43
43
|
json = JSON.load(session.last_response.body)
|
44
|
-
assert json.key?(
|
45
|
-
assert_equal
|
44
|
+
assert json.key?('now')
|
45
|
+
assert_equal 'ok', json['status']
|
46
46
|
end
|
47
47
|
|
48
48
|
def test_with_good_check
|
@@ -52,16 +52,16 @@ class PinglishTest < MiniTest::Unit::TestCase
|
|
52
52
|
end
|
53
53
|
|
54
54
|
session = Rack::Test::Session.new(app)
|
55
|
-
session.get
|
55
|
+
session.get '/_ping'
|
56
56
|
|
57
|
-
assert_equal
|
57
|
+
assert_equal 'application/json; charset=UTF-8',
|
58
58
|
session.last_response.content_type
|
59
59
|
|
60
60
|
json = JSON.load(session.last_response.body)
|
61
|
-
assert json.key?(
|
62
|
-
assert_equal
|
63
|
-
assert_equal
|
64
|
-
assert_equal
|
61
|
+
assert json.key?('now')
|
62
|
+
assert_equal 'ok', json['status']
|
63
|
+
assert_equal 'up_and_at_em', json['db']
|
64
|
+
assert_equal 'pushin_and_poppin', json['queue']
|
65
65
|
end
|
66
66
|
|
67
67
|
def test_with_unnamed_check
|
@@ -70,62 +70,62 @@ class PinglishTest < MiniTest::Unit::TestCase
|
|
70
70
|
end
|
71
71
|
|
72
72
|
session = Rack::Test::Session.new(app)
|
73
|
-
session.get
|
73
|
+
session.get '/_ping'
|
74
74
|
|
75
|
-
assert_equal
|
75
|
+
assert_equal 'application/json; charset=UTF-8',
|
76
76
|
session.last_response.content_type
|
77
77
|
|
78
78
|
json = JSON.load(session.last_response.body)
|
79
|
-
assert json.key?(
|
80
|
-
assert_equal
|
81
|
-
assert_equal
|
79
|
+
assert json.key?('now')
|
80
|
+
assert_equal 'ok', json['status']
|
81
|
+
assert_equal 'yohoho', json['default']
|
82
82
|
end
|
83
83
|
|
84
84
|
def test_with_unnamed_check_that_raises
|
85
85
|
app = build_app do |ping|
|
86
|
-
ping.check { raise
|
86
|
+
ping.check { raise 'nooooope' }
|
87
87
|
end
|
88
88
|
|
89
89
|
session = Rack::Test::Session.new(app)
|
90
|
-
session.get
|
90
|
+
session.get '/_ping'
|
91
91
|
|
92
|
-
assert_equal
|
92
|
+
assert_equal 'application/json; charset=UTF-8',
|
93
93
|
session.last_response.content_type
|
94
94
|
|
95
95
|
json = JSON.load(session.last_response.body)
|
96
|
-
assert json.key?(
|
97
|
-
assert_equal 'failures', json[
|
98
|
-
assert_equal ['default'], json[
|
96
|
+
assert json.key?('now')
|
97
|
+
assert_equal 'failures', json['status']
|
98
|
+
assert_equal ['default'], json['failures']
|
99
99
|
assert_equal({
|
100
100
|
'state' => 'error',
|
101
101
|
'exception' => 'RuntimeError',
|
102
102
|
'message' => 'nooooope'
|
103
|
-
}, json[
|
103
|
+
}, json['default'])
|
104
104
|
end
|
105
105
|
|
106
106
|
|
107
107
|
def test_with_check_that_raises
|
108
108
|
app = build_app do |ping|
|
109
109
|
ping.check(:db) { :ok }
|
110
|
-
ping.check(:raise) { raise
|
110
|
+
ping.check(:raise) { raise 'nooooope' }
|
111
111
|
end
|
112
112
|
|
113
113
|
session = Rack::Test::Session.new(app)
|
114
|
-
session.get
|
114
|
+
session.get '/_ping'
|
115
115
|
|
116
116
|
assert_equal 503, session.last_response.status
|
117
|
-
assert_equal
|
117
|
+
assert_equal 'application/json; charset=UTF-8',
|
118
118
|
session.last_response.content_type
|
119
119
|
|
120
120
|
json = JSON.load(session.last_response.body)
|
121
|
-
assert json.key?(
|
122
|
-
assert_equal
|
123
|
-
assert_equal ['raise'], json[
|
121
|
+
assert json.key?('now')
|
122
|
+
assert_equal 'failures', json['status']
|
123
|
+
assert_equal ['raise'], json['failures']
|
124
124
|
assert_equal({
|
125
125
|
'state' => 'error',
|
126
126
|
'exception' => 'RuntimeError',
|
127
127
|
'message' => 'nooooope'
|
128
|
-
}, json[
|
128
|
+
}, json['raise'])
|
129
129
|
end
|
130
130
|
|
131
131
|
def test_with_check_that_returns_false
|
@@ -135,68 +135,50 @@ class PinglishTest < MiniTest::Unit::TestCase
|
|
135
135
|
end
|
136
136
|
|
137
137
|
session = Rack::Test::Session.new(app)
|
138
|
-
session.get
|
138
|
+
session.get '/_ping'
|
139
139
|
|
140
140
|
assert_equal 503, session.last_response.status
|
141
|
-
assert_equal
|
141
|
+
assert_equal 'application/json; charset=UTF-8',
|
142
142
|
session.last_response.content_type
|
143
143
|
|
144
144
|
json = JSON.load(session.last_response.body)
|
145
|
-
assert json.key?(
|
146
|
-
assert_equal
|
147
|
-
assert_equal [
|
148
|
-
assert_equal false, json.key?(
|
145
|
+
assert json.key?('now')
|
146
|
+
assert_equal 'failures', json['status']
|
147
|
+
assert_equal ['fail'], json['failures']
|
148
|
+
assert_equal false, json.key?('fail')
|
149
149
|
end
|
150
150
|
|
151
151
|
def test_with_check_that_times_out
|
152
152
|
app = build_app do |ping|
|
153
153
|
ping.check(:db) { :ok }
|
154
|
-
ping.check(:long, :timeout =>
|
154
|
+
ping.check(:long, :timeout => TIME_UNIT) { sleep TIME_UNIT * 5 }
|
155
155
|
end
|
156
156
|
|
157
157
|
session = Rack::Test::Session.new(app)
|
158
|
-
session.get
|
158
|
+
session.get '/_ping'
|
159
159
|
|
160
|
-
assert_equal 503, session.last_response.status
|
161
|
-
assert_equal
|
160
|
+
assert_equal 503, session.last_response.status, session.last_response.body
|
161
|
+
assert_equal 'application/json; charset=UTF-8',
|
162
162
|
session.last_response.content_type
|
163
163
|
|
164
164
|
json = JSON.load(session.last_response.body)
|
165
|
-
assert json.key?(
|
166
|
-
assert_equal
|
167
|
-
assert_equal [
|
168
|
-
end
|
169
|
-
|
170
|
-
def test_with_checks_taking_more_than_max
|
171
|
-
app = build_app(:max => 0.001) do |ping|
|
172
|
-
ping.check(:long) { sleep 0.003 }
|
173
|
-
end
|
174
|
-
|
175
|
-
session = Rack::Test::Session.new(app)
|
176
|
-
session.get "/_ping"
|
177
|
-
|
178
|
-
assert_equal 503, session.last_response.status
|
179
|
-
assert_equal "application/json; charset=UTF-8",
|
180
|
-
session.last_response.content_type
|
181
|
-
|
182
|
-
json = JSON.load(session.last_response.body)
|
183
|
-
assert json.key?("now")
|
184
|
-
assert_equal "failures", json["status"]
|
185
|
-
assert_equal ['long'], json["timeouts"]
|
165
|
+
assert json.key?('now')
|
166
|
+
assert_equal 'failures', json['status']
|
167
|
+
assert_equal ['long'], json['timeouts']
|
186
168
|
end
|
187
169
|
|
188
170
|
def test_with_script_name
|
189
171
|
app = build_app
|
190
172
|
|
191
173
|
session = Rack::Test::Session.new(app)
|
192
|
-
session.get
|
174
|
+
session.get '/_ping', {}, 'SCRIPT_NAME' => '/myapp'
|
193
175
|
assert_equal 200, session.last_response.status
|
194
|
-
assert_equal
|
176
|
+
assert_equal 'application/json; charset=UTF-8',
|
195
177
|
session.last_response.content_type
|
196
178
|
|
197
179
|
json = JSON.load(session.last_response.body)
|
198
|
-
assert json.key?(
|
199
|
-
assert_equal
|
180
|
+
assert json.key?('now')
|
181
|
+
assert_equal 'ok', json['status']
|
200
182
|
end
|
201
183
|
|
202
184
|
def test_with_selective_checks
|
@@ -207,17 +189,17 @@ class PinglishTest < MiniTest::Unit::TestCase
|
|
207
189
|
end
|
208
190
|
|
209
191
|
session = Rack::Test::Session.new(app)
|
210
|
-
session.get
|
192
|
+
session.get '/_ping?checks=db,foo'
|
211
193
|
|
212
194
|
assert_equal 200, session.last_response.status
|
213
|
-
assert_equal
|
195
|
+
assert_equal 'application/json; charset=UTF-8',
|
214
196
|
session.last_response.content_type
|
215
197
|
|
216
198
|
json = JSON.load(session.last_response.body)
|
217
|
-
assert json.key?(
|
218
|
-
assert_equal
|
219
|
-
assert_equal false, json.key?(
|
220
|
-
assert_equal false, json.key?(
|
199
|
+
assert json.key?('now')
|
200
|
+
assert_equal 'ok', json['status']
|
201
|
+
assert_equal false, json.key?('timeouts')
|
202
|
+
assert_equal false, json.key?('failures')
|
221
203
|
assert_equal 'ok', json['db']
|
222
204
|
assert_equal 'bar', json['foo']
|
223
205
|
end
|
@@ -245,19 +227,13 @@ class PinglishTest < MiniTest::Unit::TestCase
|
|
245
227
|
refute pinglish.failure?(:ok)
|
246
228
|
end
|
247
229
|
|
248
|
-
def test_timeout
|
249
|
-
pinglish = Pinglish.new(FakeApp)
|
250
|
-
|
251
|
-
assert_raises Pinglish::TooLong do
|
252
|
-
pinglish.timeout(0.001) { sleep 0.003 }
|
253
|
-
end
|
254
|
-
end
|
255
|
-
|
256
230
|
def test_timeout_boolean
|
257
231
|
pinglish = Pinglish.new(FakeApp)
|
258
232
|
|
259
|
-
assert pinglish.timeout?(
|
260
|
-
refute pinglish.timeout?(
|
233
|
+
assert pinglish.timeout?(:timeout)
|
234
|
+
refute pinglish.timeout?(:foo)
|
235
|
+
refute pinglish.timeout?(false)
|
236
|
+
refute pinglish.timeout?(StandardError.new)
|
261
237
|
end
|
262
238
|
|
263
239
|
def test_enabled_by_default_false
|
@@ -267,19 +243,19 @@ class PinglishTest < MiniTest::Unit::TestCase
|
|
267
243
|
end
|
268
244
|
|
269
245
|
session = Rack::Test::Session.new(app)
|
270
|
-
session.get
|
246
|
+
session.get '/_ping'
|
271
247
|
|
272
248
|
assert_equal 200, session.last_response.status
|
273
|
-
assert_equal
|
249
|
+
assert_equal 'application/json; charset=UTF-8',
|
274
250
|
session.last_response.content_type
|
275
251
|
|
276
252
|
json = JSON.load(session.last_response.body)
|
277
|
-
assert json.key?(
|
278
|
-
assert_equal
|
279
|
-
assert_equal false, json.key?(
|
280
|
-
assert_equal false, json.key?(
|
253
|
+
assert json.key?('now')
|
254
|
+
assert_equal 'ok', json['status']
|
255
|
+
assert_equal false, json.key?('timeouts')
|
256
|
+
assert_equal false, json.key?('failures')
|
281
257
|
assert_equal 'ok', json['db']
|
282
|
-
assert_equal false, json.key?(
|
258
|
+
assert_equal false, json.key?('intense')
|
283
259
|
end
|
284
260
|
|
285
261
|
def test_enabled_by_default_selected
|
@@ -289,18 +265,18 @@ class PinglishTest < MiniTest::Unit::TestCase
|
|
289
265
|
end
|
290
266
|
|
291
267
|
session = Rack::Test::Session.new(app)
|
292
|
-
session.get
|
268
|
+
session.get '/_ping?checks=db,intense'
|
293
269
|
|
294
270
|
assert_equal 200, session.last_response.status
|
295
|
-
assert_equal
|
271
|
+
assert_equal 'application/json; charset=UTF-8',
|
296
272
|
session.last_response.content_type
|
297
273
|
|
298
274
|
json = JSON.load(session.last_response.body)
|
299
|
-
assert json.key?(
|
300
|
-
assert_equal
|
301
|
-
assert_equal false, json.key?(
|
302
|
-
assert_equal false, json.key?(
|
275
|
+
assert json.key?('now')
|
276
|
+
assert_equal 'ok', json['status']
|
277
|
+
assert_equal false, json.key?('timeouts')
|
278
|
+
assert_equal false, json.key?('failures')
|
303
279
|
assert_equal 'ok', json['db']
|
304
|
-
assert_equal 'ok', json[
|
280
|
+
assert_equal 'ok', json['intense']
|
305
281
|
end
|
306
282
|
end
|
metadata
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: goodguide-pinglish
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Barnette
|
8
8
|
- Will Farrington
|
9
|
+
- Ryan Long
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
@@ -71,6 +72,7 @@ description: A simple Rack middleware for checking app health.
|
|
71
72
|
email:
|
72
73
|
- jbarnette@github.com
|
73
74
|
- wfarr@github.com
|
75
|
+
- ryan@rtlong.com
|
74
76
|
executables: []
|
75
77
|
extensions: []
|
76
78
|
extra_rdoc_files: []
|
@@ -84,9 +86,6 @@ files:
|
|
84
86
|
- goodguide-pinglish.gemspec
|
85
87
|
- lib/pinglish.rb
|
86
88
|
- lib/pinglish/check.rb
|
87
|
-
- script/bootstrap
|
88
|
-
- script/release
|
89
|
-
- script/test
|
90
89
|
- test/check_test.rb
|
91
90
|
- test/helper.rb
|
92
91
|
- test/pinglish_test.rb
|
data/script/bootstrap
DELETED
data/script/release
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
#!/bin/sh
|
2
|
-
# Tag and push a release.
|
3
|
-
|
4
|
-
set -e
|
5
|
-
|
6
|
-
# Make sure we're in the project root.
|
7
|
-
|
8
|
-
cd $(dirname "$0")/..
|
9
|
-
|
10
|
-
# Build a new gem archive.
|
11
|
-
|
12
|
-
rm -rf pinglish-*.gem
|
13
|
-
gem build -q pinglish.gemspec
|
14
|
-
|
15
|
-
# Make sure we're on the master branch.
|
16
|
-
|
17
|
-
(git branch | grep -q '* master') || {
|
18
|
-
echo "Only release from the master branch."
|
19
|
-
exit 1
|
20
|
-
}
|
21
|
-
|
22
|
-
# Figure out what version we're releasing.
|
23
|
-
|
24
|
-
tag=v`ls pinglish-*.gem | sed 's/^pinglish-\(.*\)\.gem$/\1/'`
|
25
|
-
|
26
|
-
# Make sure we haven't released this version before.
|
27
|
-
|
28
|
-
git fetch -t origin
|
29
|
-
|
30
|
-
(git tag -l | grep -q "$tag") && {
|
31
|
-
echo "Whoops, there's already a '${tag}' tag."
|
32
|
-
exit 1
|
33
|
-
}
|
34
|
-
|
35
|
-
# Tag it and bag it.
|
36
|
-
|
37
|
-
gem push pinglish-*.gem && git tag "$tag" &&
|
38
|
-
git push origin master && git push origin "$tag"
|