litmus_paper 0.8.5 → 0.8.6

Sign up to get free protection for your applications and to get access to all the features.
data/lib/litmus_paper.rb CHANGED
@@ -4,6 +4,7 @@ require 'net/https'
4
4
  require 'uri'
5
5
  require 'forwardable'
6
6
  require 'English'
7
+ require 'colorize'
7
8
 
8
9
  # Ruby's stock DNS resolution, by default, blocks the entire Ruby VM from
9
10
  # processing while the lookup is happening, because it calls out to the native
@@ -38,6 +39,7 @@ require 'litmus_paper/metric/constant_metric'
38
39
  require 'litmus_paper/metric/cpu_load'
39
40
  require 'litmus_paper/service'
40
41
  require 'litmus_paper/status_file'
42
+ require 'litmus_paper/terminal_output'
41
43
  require 'litmus_paper/version'
42
44
 
43
45
  module LitmusPaper
@@ -3,20 +3,7 @@ module LitmusPaper
3
3
  disable :show_exceptions
4
4
 
5
5
  get "/" do
6
- output = "Litmus Paper #{LitmusPaper::VERSION}\n"
7
- max_service_length = (LitmusPaper.services.keys << "Service").max { |a, b| a.length <=> b.length }.length
8
- output += sprintf " %-#{max_service_length}s %6s [%s] [%s]\n", "", "", "Measured", "Forced"
9
- output += sprintf " %-#{max_service_length}s %6s [%s] [%s]\n", "Service", "Health", "Health".center(8), "Reason"
10
- LitmusPaper.services.each do |service_name, service|
11
- health = service.current_health
12
- output += sprintf "* %-#{max_service_length}s %6s", service_name, health.value
13
- if health.forced?
14
- output += sprintf " %10s %s", health.measured_health, service.current_health.forced_reason
15
- end
16
- output += "\n"
17
- end
18
-
19
- _text 200, output
6
+ _text 200, LitmusPaper::TerminalOutput.service_status
20
7
  end
21
8
 
22
9
  delete "/down" do
@@ -19,7 +19,7 @@ module LitmusPaper
19
19
  rescue Timeout::Error
20
20
  LitmusPaper.logger.info("Timeout reading #{@path}")
21
21
  false
22
- rescue Exception => e
22
+ rescue => e
23
23
  LitmusPaper.logger.info("Error reading #{@path}: '#{e.message}'")
24
24
  false
25
25
  end
@@ -14,12 +14,15 @@ module LitmusPaper
14
14
  backend = _find_backend(stats, @cluster)
15
15
 
16
16
  if backend['status'] != 'UP'
17
- LitmusPaper.logger.info("HAproxy available check failed, #{@cluster} backend is #{backend['status']}")
17
+ LitmusPaper.logger.info("HAProxy available check failed, #{@cluster} backend is #{backend['status']}")
18
18
  return false
19
19
  end
20
20
  return true
21
21
  rescue Timeout::Error
22
- LitmusPaper.logger.info("HAproxy available check timed out for #{@cluster}")
22
+ LitmusPaper.logger.info("HAProxy available check timed out for #{@cluster}")
23
+ false
24
+ rescue => e
25
+ LitmusPaper.logger.info("HAProxy available check failed for #{@cluster} with #{e.message}")
23
26
  false
24
27
  end
25
28
 
@@ -18,7 +18,10 @@ module LitmusPaper
18
18
  LitmusPaper.logger.info("Available check to #{@uri} did not match #{@expected_content}") unless matches
19
19
 
20
20
  success && matches
21
- rescue Exception => e
21
+ rescue Timeout::Error
22
+ LitmusPaper.logger.info("Timeout fetching #{@uri}")
23
+ false
24
+ rescue => e
22
25
  LitmusPaper.logger.info("Available check to #{@uri} failed with #{e.message}")
23
26
  false
24
27
  end
@@ -24,9 +24,12 @@ module LitmusPaper
24
24
  script_status.success?
25
25
  end
26
26
  rescue Timeout::Error
27
- LitmusPaper.logger.info("Available check to '#{@command}' timed out")
27
+ LitmusPaper.logger.info("Timeout running command: '#{@command}'")
28
28
  kill_and_reap_script(@script_pid)
29
29
  false
30
+ rescue => e
31
+ LitmusPaper.logger.info("Available check to #{@uri} failed with #{e.message}")
32
+ false
30
33
  end
31
34
 
32
35
  def kill_and_reap_script(pid)
@@ -12,7 +12,10 @@ module LitmusPaper
12
12
  socket.close
13
13
  end
14
14
  true
15
- rescue Exception => e
15
+ rescue Timeout::Error
16
+ LitmusPaper.logger.info("Timeout connecting #{@ip}:#{@port}")
17
+ false
18
+ rescue => e
16
19
  LitmusPaper.logger.info("TCP available check to #{@ip}:#{@port} failed with #{e.message}")
17
20
  false
18
21
  end
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+ module LitmusPaper
3
+ class TerminalOutput
4
+ def self.service_status
5
+ max_service_length = (LitmusPaper.services.keys << "Service").max { |a, b| a.length <=> b.length }.length
6
+
7
+ output = "Litmus Paper #{LitmusPaper::VERSION}\n"
8
+ output += sprintf(" %s │ %s │ %s │ %s\n", "Service".ljust(max_service_length), "Reported", "Measured", "Health")
9
+ output += sprintf(" %s │ %s │ %s │ %s\n", "Name".ljust(max_service_length), "Health".ljust(8), "Health".ljust(8), "Forced?")
10
+ output += "─" * (max_service_length + 2) + "┴" + "─" * 10 + "┴" + "─" * 10 + "┴" + "─" * 9 + "\n"
11
+
12
+ LitmusPaper.services.each do |service_name, service|
13
+ health = service.current_health
14
+ measured_health = health.measured_health.to_s.rjust(3)
15
+ reported_health = health.value.to_s.rjust(3)
16
+ service_forced = if health.forced?
17
+ "Yes: #{health.forced_reason}"
18
+ else
19
+ "No"
20
+ end
21
+ output += sprintf("* %-#{max_service_length}s %s %s %s\n",
22
+ service_name,
23
+ reported_health.center(8).colorize(_health_color(health.value)),
24
+ measured_health.center(8),
25
+ service_forced,
26
+ )
27
+ end
28
+
29
+ return output
30
+ end
31
+
32
+ def self._health_color(health)
33
+ if health == 0
34
+ return :red
35
+ elsif health < 80
36
+ return :yellow
37
+ else
38
+ return :green
39
+ end
40
+ end
41
+
42
+ end
43
+ end
@@ -1,3 +1,3 @@
1
1
  module LitmusPaper
2
- VERSION = "0.8.5"
2
+ VERSION = "0.8.6"
3
3
  end
data/litmus_paper.gemspec CHANGED
@@ -21,6 +21,7 @@ Gem::Specification.new do |gem|
21
21
  gem.add_dependency "remote_syslog_logger", "~> 1.0.3"
22
22
  gem.add_dependency "popen4", "~> 0.1.2"
23
23
  gem.add_dependency "unicorn", "~> 4.6.2"
24
+ gem.add_dependency "colorize"
24
25
 
25
26
  gem.add_development_dependency "rspec", "~> 2.9.0"
26
27
  gem.add_development_dependency "rack-test", "~> 0.6.1"
@@ -35,7 +35,8 @@ describe LitmusPaper::App do
35
35
  get "/"
36
36
 
37
37
  last_response.status.should == 200
38
- last_response.body.should match(/\* test +0\n/)
38
+ last_response.body.should include('test')
39
+ last_response.body.should include('0')
39
40
  end
40
41
 
41
42
  it "includes the status if forced" do
@@ -48,8 +49,8 @@ describe LitmusPaper::App do
48
49
  get "/"
49
50
 
50
51
  last_response.status.should == 200
51
- last_response.body.should match(/\* another +0 +0 +Down for testing\n/)
52
- last_response.body.should match(/\* test +100 +0 +Up for testing\n/)
52
+ last_response.body.should include('Down for testing')
53
+ last_response.body.should include('Up for testing')
53
54
  end
54
55
  end
55
56
 
@@ -21,6 +21,12 @@ describe LitmusPaper::Dependency::FileContents do
21
21
  check = LitmusPaper::Dependency::FileContents.new("/dev/zero", /^timeout$/, :timeout => 1)
22
22
  check.should_not be_available
23
23
  end
24
+
25
+ it "logs exceptions and returns false" do
26
+ check = LitmusPaper::Dependency::FileContents.new("/tmp/this_file_does_not_exist", /^foo$/)
27
+ LitmusPaper.logger.should_receive(:info)
28
+ check.should_not be_available
29
+ end
24
30
  end
25
31
 
26
32
  describe "to_s" do
@@ -17,6 +17,12 @@ describe LitmusPaper::Dependency::HaproxyBackends do
17
17
  haproxy = LitmusPaper::Dependency::HaproxyBackends.new("/tmp/stub-haproxy-stats", "orange_cluster")
18
18
  haproxy.should_not be_available
19
19
  end
20
+
21
+ it "logs exceptions and returns false" do
22
+ haproxy = LitmusPaper::Dependency::HaproxyBackends.new("/dev/null", "yellow_cluster")
23
+ LitmusPaper.logger.should_receive(:info)
24
+ haproxy.should_not be_available
25
+ end
20
26
  end
21
27
 
22
28
  describe "timeouts" do
@@ -124,6 +124,12 @@ describe LitmusPaper::Dependency::HTTP do
124
124
  check = LitmusPaper::Dependency::HTTP.new("#{@url}/sleep/2", :timeout_seconds => 1)
125
125
  check.should_not be_available
126
126
  end
127
+
128
+ it "logs exceptions and returns false" do
129
+ check = LitmusPaper::Dependency::HTTP.new('http://127.0.0.1:7777')
130
+ LitmusPaper.logger.should_receive(:info)
131
+ check.should_not be_available
132
+ end
127
133
  end
128
134
 
129
135
  describe "to_s" do
@@ -30,6 +30,12 @@ describe LitmusPaper::Dependency::Script do
30
30
  check = LitmusPaper::Dependency::Script.new("ls | grep missing")
31
31
  check.should_not be_available
32
32
  end
33
+
34
+ it "logs exceptions and returns false" do
35
+ check = LitmusPaper::Dependency::Script.new("command_not_found")
36
+ LitmusPaper.logger.should_receive(:info)
37
+ check.should_not be_available
38
+ end
33
39
  end
34
40
 
35
41
  describe "to_s" do
@@ -24,6 +24,20 @@ describe LitmusPaper::Dependency::TCP do
24
24
  check = LitmusPaper::Dependency::TCP.new("127.0.0.1", 3334)
25
25
  check.should_not be_available
26
26
  end
27
+
28
+ it "is false when the request times out" do
29
+ TCPSocket.stub(:new) do
30
+ sleep(5)
31
+ end
32
+ check = LitmusPaper::Dependency::TCP.new("127.0.0.1", 3334, :timeout_seconds => 1)
33
+ check.should_not be_available
34
+ end
35
+
36
+ it "logs exceptions and returns false" do
37
+ check = LitmusPaper::Dependency::TCP.new("127.0.0.1", 3334)
38
+ LitmusPaper.logger.should_receive(:info)
39
+ check.should_not be_available
40
+ end
27
41
  end
28
42
 
29
43
  describe "to_s" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: litmus_paper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.5
4
+ version: 0.8.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-10-21 00:00:00.000000000 Z
12
+ date: 2015-06-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
@@ -91,6 +91,22 @@ dependencies:
91
91
  - - ~>
92
92
  - !ruby/object:Gem::Version
93
93
  version: 4.6.2
94
+ - !ruby/object:Gem::Dependency
95
+ name: colorize
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
94
110
  - !ruby/object:Gem::Dependency
95
111
  name: rspec
96
112
  requirement: !ruby/object:Gem::Requirement
@@ -199,6 +215,7 @@ files:
199
215
  - lib/litmus_paper/metric/cpu_load.rb
200
216
  - lib/litmus_paper/service.rb
201
217
  - lib/litmus_paper/status_file.rb
218
+ - lib/litmus_paper/terminal_output.rb
202
219
  - lib/litmus_paper/version.rb
203
220
  - litmus_paper.gemspec
204
221
  - spec/litmus_paper/app_spec.rb
@@ -254,7 +271,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
254
271
  version: '0'
255
272
  requirements: []
256
273
  rubyforge_project:
257
- rubygems_version: 1.8.24
274
+ rubygems_version: 1.8.23
258
275
  signing_key:
259
276
  specification_version: 3
260
277
  summary: Backend health tester for HA Services, partner project of big_brother