redis-health 0.0.1

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.
Files changed (3) hide show
  1. data/README.md +42 -0
  2. data/lib/redis_health.rb +80 -0
  3. metadata +70 -0
data/README.md ADDED
@@ -0,0 +1,42 @@
1
+ ### Redis Health is a simple monitoring tool for Redis that notifies when abnormal things are happening in Redis.
2
+
3
+ Install:
4
+ gem install 'redis-health'
5
+
6
+ Use:
7
+ require 'redis'
8
+ require 'redis-health'
9
+ require 'pony'
10
+
11
+ RedisHealth.configure do
12
+ watch('worker count fell below 2 for more then 1 minute') do
13
+ v = redis.scard('resque:party:workers')
14
+ {triggered: v < 2, value: v}
15
+ end
16
+
17
+ watch('redis connected client count fell below 3 for more then 30 seconds', 30) do
18
+ client_count = redis.info['connected_clients'].to_i
19
+ {triggered: client_count < 3, value: client_count}
20
+ end
21
+
22
+ watch('HOLY **** TEH FAIL LOGZ IZ HUGE', 1) do
23
+ v = redis.llen('resque:party:failed')
24
+ {triggered: v > 1000, value: v}
25
+ end
26
+
27
+ notify do |notices|
28
+ #TEXT EMAIL FAX POSTCARD TWEET GOES HERE
29
+ Pony.mail(:to => 'steve@hypermegaglobacorp.web', :from => 'failbot@hypermegaglobacorp.web', :html_body => '<h1>Some stuff seems to have failed, take a look pretty please</h1> ' + notices.join(', '))
30
+ end
31
+ end
32
+
33
+ redis = Redis.new
34
+
35
+ #runs watches and sleeps for 1 second in a loop
36
+ RedisHealth.new(redis).run
37
+
38
+ It calls your notifier block if a watch has been triggered for the specified number of seconds, passing it a list of triggered messages such as:
39
+ ['HOLY **** TEH FAIL LOGZ IZ HUGE, value is now 100000', 'worker count fell below 2 for more then 1 minute, value is now 0']
40
+
41
+ And calls it again if a watch ceases to trigger, with a list of triggered messages such as:
42
+ ['HOLY **** TEH FAIL LOGZ IZ HUGE no longer in effect, value is 10', 'worker count fell below 2 for more then 1 minute no longer in effect, value is now 100000']
@@ -0,0 +1,80 @@
1
+ class RedisHealth
2
+ VERSION = '0.0.1'
3
+ attr_accessor :redis, :triggered_times
4
+ @watchers = {}
5
+
6
+ class << self
7
+ attr_accessor :watchers, :notifier
8
+
9
+ def configure(&blk)
10
+ instance_eval(&blk)
11
+ end
12
+
13
+ def watch(label, time = 60, &blk)
14
+ w = {
15
+ :time => time,
16
+ :matcher => blk
17
+ }
18
+ watchers[label] = w
19
+ [label, w]
20
+ end
21
+
22
+ def notify(&blk)
23
+ @notifier = blk
24
+ end
25
+ end
26
+
27
+ def initialize(redis)
28
+ @redis = redis
29
+ @triggered_times = {}
30
+ end
31
+
32
+ def execute_watches
33
+ self.class.watchers.collect do |watcher_array|
34
+ label, watcher_hash = watcher_array
35
+ triggered_times[label] ||= 0
36
+
37
+ matcher_result = self.instance_eval(&watcher_hash[:matcher])#.call(@redis)
38
+ triggered = matcher_result[:triggered]
39
+ value = matcher_result[:value]
40
+ notice = append_label_value(label, value, triggered)
41
+ times_was = triggered_times[label]
42
+
43
+ if triggered
44
+ triggered_times[label] += 1
45
+ if times_was == watcher_hash[:time]
46
+ notice
47
+ end
48
+ else
49
+ triggered_times[label] = 0
50
+ if times_was > 0 && times_was >= watcher_hash[:time]
51
+ notice
52
+ else
53
+ nil
54
+ end
55
+ end
56
+ end.compact
57
+ end
58
+
59
+ def notify
60
+ notices = execute_watches
61
+ self.class.notifier.call(notices) unless notices.empty?
62
+ end
63
+
64
+ def run
65
+ loop do
66
+ notify
67
+ sleep 1
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ def append_label_value(label, v, triggered)
74
+ notice = label
75
+ notice += ' is no longer in effect' unless triggered
76
+ notice += ", value is now #{v}" if v
77
+ notice
78
+ end
79
+ end
80
+
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: redis-health
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Max Justus Spransy
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-10-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: redis
16
+ requirement: &70131276238940 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70131276238940
25
+ - !ruby/object:Gem::Dependency
26
+ name: rspec
27
+ requirement: &70131276238200 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: 2.6.0
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70131276238200
36
+ description: When shit hits the fan in your redis db, Redis Health lets you know before
37
+ your customers do
38
+ email: maxjustus@gmail.com
39
+ executables: []
40
+ extensions: []
41
+ extra_rdoc_files: []
42
+ files:
43
+ - lib/redis_health.rb
44
+ - README.md
45
+ homepage: http://github.com/maxjustus/Redis-Health
46
+ licenses:
47
+ - MIT
48
+ post_install_message:
49
+ rdoc_options: []
50
+ require_paths:
51
+ - lib
52
+ required_ruby_version: !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ requirements: []
65
+ rubyforge_project:
66
+ rubygems_version: 1.8.11
67
+ signing_key:
68
+ specification_version: 3
69
+ summary: Knowing is half the battle
70
+ test_files: []