dead-man 0.0.3

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 29843644af922f92a5d0e528bff03b2a017475f9
4
+ data.tar.gz: 75c26f7434eb4979c34622ce257a2b00b7d86b24
5
+ SHA512:
6
+ metadata.gz: 321dca439854addec1c6c6f8b76bf6676a2fb5a8ee28da418d093eaefb680646e7f815d354ca24b36069dadaa1b92a97010fb2507535545a1c1b29e997e3e2de
7
+ data.tar.gz: d577057965640ee05127a57b41bc0a53c02a4f03d3fdae60f8ebe61a97aa830a0076a94c3159755df6fe379bce1e5fbc6ddbdd591d0d2cc2c5517b8c52bc2592
@@ -0,0 +1,10 @@
1
+ module DeadMan
2
+ module Heartbeat
3
+ extend self
4
+
5
+ def pulse(job)
6
+ key = DeadMan.key(job)
7
+ DeadMan.redis.set(key, Time.now.utc)
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,62 @@
1
+ module DeadMan
2
+ module Switch
3
+ INTERVAL_THRESHOLD = 0.2 # 20% padding
4
+ SWITCHES = {}
5
+ CALLBACKS = []
6
+ extend self
7
+
8
+ def run
9
+ SWITCHES.each_key do |switch|
10
+ check(switch)
11
+ end
12
+ end
13
+
14
+ def register_callback(callback)
15
+ CALLBACKS << callback
16
+ end
17
+
18
+ def register_switch(name, interval)
19
+ SWITCHES[name] = interval
20
+ end
21
+
22
+ def check(switch)
23
+ if SWITCHES.has_key?(switch)
24
+ timestamp = last_heartbeat_at(switch)
25
+ raise 'Unrecorded switch' if timestamp.nil?
26
+ alert(switch, timestamp) if alertable?(timestamp, SWITCHES[switch])
27
+ else
28
+ return false
29
+ end
30
+ rescue
31
+ notify("Check failed for #{switch}. This is usually because an improper heartbeat timestamp was stored.")
32
+ end
33
+
34
+ def last_heartbeat_at(switch)
35
+ key = DeadMan.key(switch)
36
+ timestamp = DeadMan.redis.get(key)
37
+ Time.parse(timestamp)
38
+ rescue
39
+ return nil
40
+ end
41
+
42
+ def alertable?(heartbeat_at, interval)
43
+ heartbeat_at < adjusted_interval(interval).ago
44
+ end
45
+
46
+ # Gives an INTERVAL_THRESHOLD padding on interval
47
+ # e.g. 60.seconds -> 72.seconds
48
+ def adjusted_interval(interval)
49
+ interval + interval * INTERVAL_THRESHOLD
50
+ end
51
+
52
+ def alert(switch, timestamp)
53
+ notify("#{switch} died. The switch was last triggered at #{timestamp}")
54
+ end
55
+
56
+ def notify(message)
57
+ CALLBACKS.each do |callback|
58
+ callback.call(message)
59
+ end
60
+ end
61
+ end
62
+ end
data/lib/dead_man.rb ADDED
@@ -0,0 +1,13 @@
1
+ require 'redis'
2
+ require 'dead_man/switch.rb'
3
+ require 'dead_man/heartbeat.rb'
4
+
5
+ module DeadMan
6
+ extend self
7
+ attr_accessor :redis
8
+ @redis = Redis.new host: 'localhost', db: 8
9
+
10
+ def key(switch)
11
+ "dead-man:#{switch}"
12
+ end
13
+ end
metadata ADDED
@@ -0,0 +1,101 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dead-man
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Sean Coleman
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: timecop
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: redis
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
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
+ description: Know when your systems are dead.
70
+ email: sean@seancoleman.net
71
+ executables: []
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - lib/dead_man.rb
76
+ - lib/dead_man/switch.rb
77
+ - lib/dead_man/heartbeat.rb
78
+ homepage: http://rubygems.org/gems/hola
79
+ licenses: []
80
+ metadata: {}
81
+ post_install_message:
82
+ rdoc_options: []
83
+ require_paths:
84
+ - lib
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - '>='
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ requirements: []
96
+ rubyforge_project:
97
+ rubygems_version: 2.0.14
98
+ signing_key:
99
+ specification_version: 4
100
+ summary: The dead man's switch
101
+ test_files: []