what 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  What? A simple server monitoring tool.
2
2
  ======================================
3
3
 
4
- ![WHAT !](http://rwfitzge.github.com/what.png)
4
+ <img src="http://rwfitzge.github.com/what.png" title="WHAT !">
5
5
 
6
6
  What is a modular, easily-extensible server monitoring tool which is still in
7
7
  the early stages of development.
@@ -0,0 +1,52 @@
1
+ # This is an example custom module.
2
+ class What::Modules::CustomModule < What::Modules::Base
3
+ # You can provide defaults for any settings you're expecting the config file
4
+ # to provide.
5
+ # (optional)
6
+ DEFAULTS = {
7
+ 'hello' => 'hello',
8
+ 'world' => 'world'
9
+ }
10
+
11
+ # You can use the initialize method to set up any data structures you'll be
12
+ # using. If you do write an initialize, make sure to call super to populate
13
+ # the @config object.
14
+ # (optional)
15
+ def initialize
16
+ super
17
+ @hellos = 1
18
+ end
19
+
20
+ # The check! method is called every Config['interval'] seconds. It should
21
+ # collect whatever information is needed and put it into instance vars.
22
+ # (optional)
23
+ def check!
24
+ @hellos = Kernel.rand(4) + 1
25
+ end
26
+
27
+ # The health and details methods are called whenever the server receives
28
+ # an HTTP request.
29
+
30
+ # health should return one of the following symbols:
31
+ # :ok Everything's fine.
32
+ # :warning There's a problem, but it's not critical.
33
+ # :alert I need to get out of bed to fix this.
34
+ # (mandatory)
35
+ def health
36
+ :ok
37
+ end
38
+
39
+ # details can return a hash containing any additional information
40
+ # that might be interesting to the consumer of the status updates.
41
+ # (optional)
42
+ def details
43
+ greeting = []
44
+ @hellos.times do
45
+ greeting << @config['hello']
46
+ end
47
+ @hellos.times do
48
+ greeting << @config['world']
49
+ end
50
+ {:greeting => greeting.join(' ') + '!'}
51
+ end
52
+ end
data/example/what.yml CHANGED
@@ -3,20 +3,24 @@
3
3
  ### Choose between JSON and YAML formatting. (default: json)
4
4
  formatter: yaml
5
5
 
6
- ### Set the polling interval for all services.
7
- interval: 10
6
+ ### Set the polling interval for all services, in seconds. (default: 10)
7
+ # interval: 10
8
8
 
9
9
  ### Specify paths containing custom modules to load, relative to this file.
10
- # module_paths:
11
- # - modules
10
+ module_paths:
11
+ - modules
12
12
 
13
13
  ### List all modules to be monitored.
14
14
  modules:
15
15
  - unicorn
16
+ - custom_module
16
17
  #- processes
17
18
 
18
19
  ### Pass parameters into modules.
19
20
  module_config:
21
+ custom_module:
22
+ hello: world
23
+ world: hello
20
24
  unicorn:
21
25
  # minimum number of workers before warning and alert statuses
22
26
  warning: 1
data/lib/what/config.rb CHANGED
@@ -1,4 +1,13 @@
1
1
  class What::Config
2
+ DEFAULTS = {
3
+ 'interval' => 10,
4
+ 'formatter' => 'json',
5
+ 'configs' => [],
6
+ 'module_paths' => [],
7
+ 'modules' => [],
8
+ 'module_config' => {}
9
+ }
10
+
2
11
  @config = {}
3
12
 
4
13
  def self.load(fn)
@@ -7,7 +16,7 @@ class What::Config
7
16
  end
8
17
 
9
18
  def self.load_primary(fn)
10
- @config = YAML.load_file(fn)
19
+ @config = DEFAULTS.merge(YAML.load_file(fn))
11
20
  @config['base'] ||= File.expand_path(File.dirname(fn))
12
21
  @loaded = true
13
22
  end
@@ -16,12 +25,17 @@ class What::Config
16
25
  return if !fns
17
26
 
18
27
  fns.each do |fn|
19
- path = if fn.match(/^\//)
28
+ path = if fn.match(%r(^/))
20
29
  fn
21
30
  else
22
31
  File.join(@config['base'], fn)
23
32
  end
24
- @config.merge!(YAML.load_file(path))
33
+ begin
34
+ opts = YAML.load_file(path)
35
+ @config.merge!(opts)
36
+ rescue Exception => e
37
+ puts "Error loading config file #{path}: #{e}"
38
+ end
25
39
  end
26
40
  end
27
41
 
@@ -2,11 +2,11 @@ class What::Formatter
2
2
  def self.use(name)
3
3
  @formatter = case name
4
4
  when 'json'
5
- What::Formatters::JSON.new
5
+ Formatters::JSON.new
6
6
  when 'yaml'
7
- What::Formatters::YAML.new
7
+ Formatters::YAML.new
8
8
  else
9
- What::Formatters::JSON.new
9
+ raise "Unknown formatter #{name}"
10
10
  end
11
11
  end
12
12
 
@@ -6,9 +6,9 @@ module What::Formatters
6
6
 
7
7
  globs = [File.join(File.dirname(__FILE__), 'formatters', '*.rb')]
8
8
 
9
- if What::Config['formatter_paths']
10
- What::Config['formatter_paths'].each do |formatter_path|
11
- globs << File.join(What::Config['base'], formatter_path, '*.rb')
9
+ if Config['formatter_paths']
10
+ Config['formatter_paths'].each do |formatter_path|
11
+ globs << File.join(Config['base'], formatter_path, '*.rb')
12
12
  end
13
13
  end
14
14
 
@@ -18,6 +18,6 @@ module What::Formatters
18
18
  end
19
19
  end
20
20
 
21
- What::Formatter.use(What::Config['formatter'])
21
+ Formatter.use(Config['formatter'])
22
22
  end
23
23
  end
data/lib/what/helpers.rb CHANGED
@@ -1,4 +1,19 @@
1
1
  module What::Helpers
2
+ # Take an array of healths and determine overall health, on
3
+ # the principle that overall health == the worst sub-health.
4
+ def self.overall_health(healths)
5
+ healths.reduce(:ok) do |overall, current|
6
+ case current
7
+ when :ok
8
+ overall
9
+ when :warning
10
+ :warning if overall != :alert
11
+ else
12
+ :alert
13
+ end
14
+ end
15
+ end
16
+
2
17
  # Stolen from Rails (http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html)
3
18
  def self.camelize(lower_case_and_underscored_word, first_letter_in_uppercase = true)
4
19
  if first_letter_in_uppercase
@@ -1,10 +1,12 @@
1
1
  class What::Modules::Base
2
+ DEFAULTS = {}
3
+
2
4
  def initialize
3
- @config = What::Config['module_config'] && What::Config['module_config'][self.name]
5
+ @config = DEFAULTS.merge(Config['module_config'][self.name] || {})
4
6
  end
5
7
 
6
8
  def name
7
- What::Helpers.underscore(self.class.name.split('::').last)
9
+ Helpers.underscore(self.class.name.split('::').last)
8
10
  end
9
11
 
10
12
  def check!
@@ -1,4 +1,9 @@
1
1
  class What::Modules::Unicorn < What::Modules::Base
2
+ DEFAULTS = {
3
+ 'warning' => 1,
4
+ 'alert' => 0
5
+ }
6
+
2
7
  def initialize
3
8
  super
4
9
  @unicorns = []
data/lib/what/modules.rb CHANGED
@@ -4,18 +4,23 @@ module What::Modules
4
4
  def self.load_all
5
5
  require 'what/modules/base'
6
6
 
7
- globs = [File.join(File.dirname(__FILE__), 'modules', '*.rb')]
7
+ default_modules_path = File.join(File.dirname(__FILE__), 'modules')
8
+ require_dir(included_modules_path)
8
9
 
9
- if What::Config['module_paths']
10
- What::Config['module_paths'].each do |module_path|
11
- globs << File.join(What::Config['base'], module_path, '*.rb')
12
- end
10
+ Config['module_paths'].each do |module_path|
11
+ path = if module_path.match(%r(^/))
12
+ module_path
13
+ else
14
+ File.join(Config['base'], module_path)
15
+ end
16
+ require_dir(path)
13
17
  end
18
+ end
14
19
 
15
- globs.each do |glob|
16
- Dir[glob].each do |fn|
20
+ private
21
+ def require_dir(path)
22
+ Dir[File.join(path, '*.rb')].each do |fn|
17
23
  require fn
18
24
  end
19
25
  end
20
- end
21
26
  end
data/lib/what/monitor.rb CHANGED
@@ -1,9 +1,9 @@
1
1
  class What::Monitor
2
2
  # don't worry, these method names are ironic
3
3
  def self.go!
4
- @modules = What::Config['modules'].map do |m|
5
- name = What::Helpers.camelize(m)
6
- What::Modules.const_get(name).new
4
+ @modules = Config['modules'].map do |m|
5
+ name = Helpers.camelize(m)
6
+ Modules.const_get(name).new
7
7
  end
8
8
 
9
9
  Thread.abort_on_exception = true
@@ -12,20 +12,14 @@ class What::Monitor
12
12
 
13
13
  def self.do_it(modules)
14
14
  loop do
15
- overall = :ok
15
+ healths = []
16
16
  modules.each do |mod|
17
17
  mod.check!
18
- case mod.health
19
- when :ok
20
- when :warning
21
- overall = :warning if overall != :alert
22
- else
23
- overall = :alert
24
- end
25
- What::Status[mod.name] = mod.status
18
+ healths << mod.health
19
+ Status[mod.name] = mod.status
26
20
  end
27
- What::Status[:health] = overall
28
- sleep What::Config['interval']
21
+ Status[:health] = Helpers.overall_health(healths)
22
+ sleep Config['interval']
29
23
  end
30
24
  end
31
25
  end
data/lib/what/server.rb CHANGED
@@ -1,15 +1,15 @@
1
1
  class What::Server
2
2
  def initialize
3
- What::Modules.load_all
4
- What::Formatters.load_all
5
- What::Monitor.go!
3
+ Modules.load_all
4
+ Formatters.load_all
5
+ Monitor.go!
6
6
  end
7
7
 
8
8
  def call(_)
9
9
  [
10
- What::Status[:health] != :alert ? 200 : 503,
11
- {'Content-Type' => What::Formatter.mime},
12
- What::Formatter.format(What::Status.all)
10
+ Status[:health] != :alert ? 200 : 503,
11
+ {'Content-Type' => Formatter.mime},
12
+ Formatter.format(Status.all)
13
13
  ]
14
14
  end
15
15
  end
data/lib/what/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module What
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: what
3
3
  version: !ruby/object:Gem::Version
4
- hash: 17
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 7
10
- version: 0.0.7
9
+ - 8
10
+ version: 0.0.8
11
11
  platform: ruby
12
12
  authors:
13
13
  - Ryan Lower
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2011-05-16 00:00:00 -07:00
19
+ date: 2011-05-17 00:00:00 -07:00
20
20
  default_executable:
21
21
  dependencies:
22
22
  - !ruby/object:Gem::Dependency
@@ -65,6 +65,7 @@ files:
65
65
  - README.md
66
66
  - Rakefile
67
67
  - bin/what
68
+ - example/modules/custom_module.rb
68
69
  - example/what.yml
69
70
  - lib/what.rb
70
71
  - lib/what/config.rb