quietus 1.0.0 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f3a5cc3af003537f8103ca7f78e41d5a38fdec69
4
- data.tar.gz: 9e34862bc1838775b621a9d909c220a9a7f0379d
3
+ metadata.gz: 6d8410205dbca9178b2609a1a76788fdab743cba
4
+ data.tar.gz: fd7fa1a795b0eeff504db7dc6ef8f7f40b2c641f
5
5
  SHA512:
6
- metadata.gz: 8f91b27aed0aa89614aec2a1c2ebb601695612bb698b541c56a7ae244b3593d7ca485e3b36451affb865fa7dbe71660e25577ff0a58a8ace575ff96e4e3d7793
7
- data.tar.gz: 9661023616de348ab98c430dac8e2f1bd0427cf69d0f07c8a866a0ca1846a3ac20e5c0c94c917fea119eb5ae2d576e8079d9b71c9a5fb67e79d53d8dc11c7976
6
+ metadata.gz: 78dc5a4bd4def6ea16a223bf42328eea730e796f9bce5cd7a59e3f27730b9ca9ed8f68a7c73ed335a3637a93f32046a4189887c2c452968084d5c179d7af1085
7
+ data.tar.gz: 4a94d9417bc062b259cc391934bd4a4f71207e7cc34b37098d4d1cf719927481a2d16dcb2a062aa4d416f3f554e28643a050576e348b99e29a8c075d982b7d5c
data/README.md CHANGED
@@ -7,17 +7,25 @@ Simple status check web server.
7
7
 
8
8
  ##Why
9
9
 
10
- You might want to use this to provide a status check to an AWS ELB where you don't have a web server in your app. Having a status check lets you quietly kill unhealthy instances and replace them.
10
+ You might want to use this to provide a status check to an AWS ELB where you don't have a web server in your app. Having a status check lets you quietly kill unhealthy instances and replace them.
11
11
 
12
- See these [AWS Docs](http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-maintain-instance-levels.html).
12
+ See these AWS Docs
13
+ - [Maintainging instance levels](http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-maintain-instance-levels.html)
14
+ - [Health check API](http://docs.aws.amazon.com/ElasticLoadBalancing/latest/APIReference/API_HealthCheck.html)
15
+ - [Configure the Health state of an instance](http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/as-configure-healthcheck.html)
13
16
 
14
17
  ##Usage
15
18
 
19
+ ###Passive (TCP Server only)
20
+
21
+ This setup requires you to have an ELB setup monitoring the specified port for a
22
+ TCP response.
23
+
16
24
  ```rb
17
25
  require 'quietus'
18
26
 
19
- optional_hostname = 'localhost'
20
- optional_port = '2347'
27
+ hostname = 'localhost'
28
+ port = '2347'
21
29
 
22
30
  # quietus runs your check in a loop, so you might want to sleep
23
31
  def your_status_check
@@ -27,10 +35,40 @@ end
27
35
 
28
36
  # quietus is blocking so you might want to run it in a thread or fork depending on your Ruby version
29
37
  t = Thread.new do
30
- Quietus::Server.new(optional_hostname, optional_port) { your_status_check }
38
+ Quietus::PassiveServer.new(optional_hostname, optional_port) { your_status_check }
31
39
  end
32
40
  ```
33
41
 
34
- **The Quietus server will return a 200 if your_status_check is truthy, 500 otherwise**
42
+ **The Passive Quietus server will accept a TCP connection if your_status_check is truthy, otherwise it will refuse**
35
43
 
36
44
  By default quietus runs on port 2347.
45
+
46
+ ###Active (uses AWS SDK to contact Health Check API)
47
+
48
+ This setup will actively contact AWS to update instance health. Use this if you
49
+ don't want an ELB.
50
+
51
+ ```rb
52
+ require 'quietus'
53
+ require 'aws-sdk'
54
+
55
+ # You'll need to get an auto_scaling_instance from the API
56
+ auto_scaling = AWS::AutoScaling.new
57
+ auto_scaling_instance = auto_scaling.instances['i-12345678']
58
+
59
+ # quietus runs your check in a loop, so you might want to sleep
60
+ def your_status_check
61
+ sleep 1
62
+ is_my_app_healthy?
63
+ end
64
+
65
+ # quietus is blocking so you might want to run it in a thread or fork depending on your Ruby version
66
+ t = Thread.new do
67
+ Quietus::ActiveServer.new(auto_scaling_instance) { your_status_check }
68
+ end
69
+ ```
70
+
71
+ **It's important to remember if your app simply crashes, using the active setup
72
+ the health check API won't get updated.**
73
+
74
+
@@ -0,0 +1,29 @@
1
+ module Quietus
2
+ class ActiveServer
3
+ attr_reader :instance_id, :respect_grace_period, :status
4
+
5
+ def initialize(auto_scaling_instance, respect_grace_period = true)
6
+ @respect_grace_period = respect_grace_period
7
+ @auto_scaling_instance = auto_scaling_instance
8
+
9
+ server &Proc.new
10
+ end
11
+
12
+ private
13
+
14
+ def server(&proc)
15
+ loop do
16
+ new_status = proc.call
17
+ update new_status if new_status != status
18
+ end
19
+ end
20
+
21
+ def update(status)
22
+ @auto_scaling_instance.set_health(
23
+ status ? 'Healthy' : 'Unhealthy',
24
+ :should_respect_grace_period => respect_grace_period
25
+ )
26
+ end
27
+ end
28
+ end
29
+
@@ -0,0 +1,28 @@
1
+ require "socket"
2
+
3
+ module Quietus
4
+ class PassiveServer
5
+ attr_reader :port, :hostname
6
+
7
+ DEFAULT_HOSTNAME = 'localhost'
8
+ DEFAULT_PORT = 2347
9
+
10
+ def initialize(hostname = nil, port = nil)
11
+ @hostname = hostname || DEFAULT_HOSTNAME
12
+ @port = port || DEFAULT_PORT
13
+
14
+ server &Proc.new
15
+ end
16
+
17
+ private
18
+
19
+ def server(&proc)
20
+ loop { respond if proc.call }
21
+ end
22
+
23
+ def respond
24
+ TCPServer.open(hostname, port) { |s| s.accept.close }
25
+ end
26
+ end
27
+ end
28
+
@@ -1,3 +1,3 @@
1
1
  module Quietus
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.0"
3
3
  end
data/lib/quietus.rb CHANGED
@@ -1,26 +1,9 @@
1
1
  require "quietus/version"
2
- require "socket"
3
2
 
4
- module Quietus
5
- class Server
6
- attr_reader :port, :hostname
7
-
8
- def initialize(hostname = 'localhost', port = 2347)
9
- @hostname = hostname
10
- @port = port
11
-
12
- server &Proc.new
13
- end
3
+ require "quietus/active_server"
4
+ require "quietus/passive_server"
14
5
 
15
- private
16
-
17
- def server(&proc)
18
- loop { respond if proc.call }
19
- end
20
-
21
- def respond
22
- TCPServer.open(hostname, port) { |s| s.accept.close }
23
- end
24
- end
6
+ module Quietus
7
+ # Space left deliberatly blank
25
8
  end
26
9
 
@@ -0,0 +1,42 @@
1
+ require 'spec_helper'
2
+
3
+ describe Quietus::ActiveServer do
4
+ context "creating" do
5
+ context "passed a truthy block" do
6
+ it "updates instance health to 'Healthy'" do
7
+ aws_instance = double('instance')
8
+ aws_instance.should_receive(:set_health).with(
9
+ 'Healthy',
10
+ {
11
+ :should_respect_grace_period => true
12
+ }
13
+ ).and_raise RspecLoopStop
14
+
15
+ begin
16
+ Quietus::ActiveServer.new(aws_instance) { true }
17
+ rescue RspecLoopStop
18
+ # Done
19
+ end
20
+ end
21
+ end
22
+
23
+ context "passed a falsy block" do
24
+ it "updates instance health to 'Unhealthy'" do
25
+ aws_instance = double('instance')
26
+ aws_instance.should_receive(:set_health).with(
27
+ 'Unhealthy',
28
+ {
29
+ :should_respect_grace_period => true
30
+ }
31
+ ).and_raise RspecLoopStop
32
+
33
+ begin
34
+ Quietus::ActiveServer.new(aws_instance) { false }
35
+ rescue RspecLoopStop
36
+ # Done
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+
@@ -1,14 +1,14 @@
1
1
  require 'spec_helper'
2
2
  require 'socket'
3
3
 
4
- describe Quietus::Server do
4
+ describe Quietus::PassiveServer do
5
5
  context "creating" do
6
6
 
7
7
  context "passed a falsy block" do
8
8
  it "refuses a TCP connection" do
9
9
  pid = fork do
10
10
  Signal.trap("HUP") { exit }
11
- Quietus::Server.new { false }
11
+ Quietus::PassiveServer.new { false }
12
12
  end
13
13
 
14
14
  sleep 1
@@ -24,7 +24,7 @@ describe Quietus::Server do
24
24
  it "allows a TCP connection" do
25
25
  pid = fork do
26
26
  Signal.trap("HUP") { exit }
27
- Quietus::Server.new { true }
27
+ Quietus::PassiveServer.new { true }
28
28
  end
29
29
 
30
30
  sleep 1
@@ -38,3 +38,4 @@ describe Quietus::Server do
38
38
 
39
39
  end
40
40
  end
41
+
data/spec/spec_helper.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  $: << File.join(File.dirname(__FILE__), '..', 'lib')
2
2
 
3
+ class RspecLoopStop < Exception; end
4
+
3
5
  require 'pry'
4
6
  require 'quietus'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: quietus
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Kenny
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-24 00:00:00.000000000 Z
11
+ date: 2014-05-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,9 +80,12 @@ files:
80
80
  - README.md
81
81
  - Rakefile
82
82
  - lib/quietus.rb
83
+ - lib/quietus/active_server.rb
84
+ - lib/quietus/passive_server.rb
83
85
  - lib/quietus/version.rb
84
86
  - quietus.gemspec
85
- - spec/quietus_spec.rb
87
+ - spec/active_server_spec.rb
88
+ - spec/passive_server_spec.rb
86
89
  - spec/spec_helper.rb
87
90
  homepage: https://github.com/kenoir/quietus
88
91
  licenses: