monittr 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +4 -4
- data/examples/application.rb +1 -1
- data/lib/monittr.rb +16 -8
- data/lib/monittr/sinatra/monittr.rb +22 -1
- data/lib/monittr/sinatra/style.css +8 -1
- data/lib/monittr/sinatra/template.erb +3 -3
- data/lib/monittr/version.rb +1 -1
- data/test/monittr_test.rb +17 -9
- data/test/test_helper.rb +1 -1
- metadata +2 -2
data/README.markdown
CHANGED
@@ -17,16 +17,16 @@ You can try the interface in a IRB console:
|
|
17
17
|
|
18
18
|
$ irb -Ilib -rubygems -rmonittr
|
19
19
|
|
20
|
-
You have to pass one or more full URLs to a running Monit web server XML output, eg. `http://admin:monit@example.com:2812
|
20
|
+
You have to pass one or more full URLs to a running Monit web server XML output, eg. `http://admin:monit@example.com:2812/`.
|
21
21
|
|
22
22
|
In case you don't have a running Monit handy, fake its output:
|
23
23
|
|
24
24
|
require 'fakeweb'
|
25
|
-
FakeWeb.register_uri(:get, 'http://localhost:2812/
|
25
|
+
FakeWeb.register_uri(:get, 'http://localhost:2812/', :body => File.read('test/fixtures/status.xml') ); nil
|
26
26
|
|
27
27
|
Now, retrieve information from the cluster:
|
28
28
|
|
29
|
-
cluster = Monittr::Cluster.new ['http://localhost:2812/
|
29
|
+
cluster = Monittr::Cluster.new ['http://localhost:2812/']
|
30
30
|
cluster.servers.size
|
31
31
|
|
32
32
|
server = cluster.servers.first
|
@@ -51,7 +51,7 @@ You should see the information about two faked Monit instances in your browser.
|
|
51
51
|
|
52
52
|
Provide the URLs to _Monit_ instances by setting the appropriate option:
|
53
53
|
|
54
|
-
set :monit_urls, [
|
54
|
+
set :monit_urls, %w[ http://production.example.com:2812 http://staging.example.com:2812 ]
|
55
55
|
|
56
56
|
|
57
57
|
## Customization ##
|
data/examples/application.rb
CHANGED
@@ -9,7 +9,7 @@ require 'monittr/sinatra/monittr'
|
|
9
9
|
|
10
10
|
FakeWeb.register_uri(:get, 'http://localhost:2812/_status?format=xml', :body => File.read( File.expand_path('../../test/fixtures/status.xml', __FILE__)))
|
11
11
|
|
12
|
-
set :monit_urls, [
|
12
|
+
set :monit_urls, %w[ http://localhost:2812 http://localhost:2812 ]
|
13
13
|
|
14
14
|
# set :template, Proc.new { File.join(root, 'template.erb') }
|
15
15
|
# set :stylesheet, '/path/to/my/stylesheet'
|
data/lib/monittr.rb
CHANGED
@@ -22,10 +22,11 @@ module Monittr
|
|
22
22
|
#
|
23
23
|
class Server
|
24
24
|
|
25
|
-
attr_reader :xml, :system, :filesystems, :processes
|
25
|
+
attr_reader :url, :xml, :system, :filesystems, :processes
|
26
26
|
|
27
|
-
def initialize(xml)
|
28
|
-
@
|
27
|
+
def initialize(url, xml)
|
28
|
+
@url = url
|
29
|
+
@xml = Nokogiri::XML(xml)
|
29
30
|
if error = @xml.xpath('error').first
|
30
31
|
@system = Services::Base.new :name => error.attributes['name'].content,
|
31
32
|
:message => error.attributes['message'].content,
|
@@ -39,11 +40,13 @@ module Monittr
|
|
39
40
|
|
40
41
|
# Retrieve Monit status XML from the URL
|
41
42
|
#
|
42
|
-
def self.fetch(url=
|
43
|
-
|
44
|
-
|
43
|
+
def self.fetch(url='http://admin:monit@localhost:2812')
|
44
|
+
monit_url = url
|
45
|
+
monit_url += '/' unless url =~ /\/$/
|
46
|
+
monit_url += '_status?format=xml' unless url =~ /_status\?format=xml$/
|
47
|
+
self.new url, RestClient.get(monit_url)
|
45
48
|
rescue Exception => e
|
46
|
-
self.new
|
49
|
+
self.new url, %Q|<error status="3" name="#{e.class}" message="#{e.message}" />|
|
47
50
|
end
|
48
51
|
|
49
52
|
def inspect
|
@@ -59,6 +62,11 @@ module Monittr
|
|
59
62
|
class Base < OpenStruct
|
60
63
|
TYPES = { 0 => "Filesystem", 1 => "Directory", 2 => "File", 3 => "Daemon", 4 => "Connection", 5 => "System" }
|
61
64
|
|
65
|
+
def load
|
66
|
+
# Note: the `load` gives some headaches, let's be explicit
|
67
|
+
@table[:load]
|
68
|
+
end
|
69
|
+
|
62
70
|
def value(matcher, converter=:to_s)
|
63
71
|
@xml.xpath(matcher).first.content.send(converter) rescue nil
|
64
72
|
end
|
@@ -81,7 +89,7 @@ module Monittr
|
|
81
89
|
:load => value('system/load/avg01', :to_f),
|
82
90
|
:cpu => value('system/cpu/user', :to_f),
|
83
91
|
:memory => value('system/memory/percent', :to_f),
|
84
|
-
:uptime => value('//server/uptime', :
|
92
|
+
:uptime => value('//server/uptime', :to_i)
|
85
93
|
} )
|
86
94
|
end
|
87
95
|
end
|
@@ -32,12 +32,33 @@ module Sinatra
|
|
32
32
|
app.settings.stylesheet ? File.read( app.settings.stylesheet ) : ''
|
33
33
|
end
|
34
34
|
|
35
|
+
def time_in_words(seconds)
|
36
|
+
case seconds
|
37
|
+
when 0..60
|
38
|
+
"#{seconds } seconds"
|
39
|
+
when 60..3600
|
40
|
+
value = seconds/60
|
41
|
+
"#{value} minute#{value > 1 ? 's' : ''}"
|
42
|
+
when 3600..86400
|
43
|
+
value = seconds/3600
|
44
|
+
"#{value} hour#{ value > 1 ? 's' : ''}"
|
45
|
+
when 86400..604800
|
46
|
+
value = seconds/86400
|
47
|
+
"#{value} day#{ value > 1 ? 's' : ''}"
|
48
|
+
when 604800..2419200
|
49
|
+
value = seconds/604800
|
50
|
+
"#{value} week#{ value > 1 ? 's' : ''}"
|
51
|
+
else
|
52
|
+
nil
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
35
56
|
end
|
36
57
|
|
37
58
|
def self.registered(app)
|
38
59
|
app.helpers MonittrHTML::Helpers
|
39
60
|
|
40
|
-
app.set :monit_urls, ['http://admin:monit@localhost:2812
|
61
|
+
app.set :monit_urls, ['http://admin:monit@localhost:2812']
|
41
62
|
app.set :template, File.expand_path('../template.erb', __FILE__)
|
42
63
|
app.set :stylesheet, File.expand_path('../style.css', __FILE__)
|
43
64
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#monittr
|
2
|
-
{ font-family: sans-serif; }
|
2
|
+
{ color: #222; font-family: sans-serif; }
|
3
3
|
|
4
4
|
#monittr .clear
|
5
5
|
{ clear:both; display:block; overflow:hidden; visibility:hidden; width:0; height:0 }
|
@@ -9,6 +9,13 @@
|
|
9
9
|
-webkit-border-radius: 0.5em;
|
10
10
|
border-radius: 0.5em }
|
11
11
|
|
12
|
+
#monittr a
|
13
|
+
{ color: #222;
|
14
|
+
text-decoration: none; }
|
15
|
+
|
16
|
+
#monittr a:hover
|
17
|
+
{ text-decoration: underline; }
|
18
|
+
|
12
19
|
#monittr #toggle
|
13
20
|
{ font-size: 80%;
|
14
21
|
text-decoration: underline;
|
@@ -11,7 +11,7 @@
|
|
11
11
|
<strong>
|
12
12
|
<span class="dot status <%= server.system.status == 0 ? 'running' : 'failure' %>">·</span>
|
13
13
|
<span class="dot monitored <%= server.system.monitored == 1 ? 'running' : 'failure' %>">·</span>
|
14
|
-
<%= server.system.name
|
14
|
+
<a href="<%= server.url %>"><%= server.system.name %></a>
|
15
15
|
<%= "<em>#{server.system.message}</em>" if server.system.message %>
|
16
16
|
</strong>
|
17
17
|
|
@@ -19,7 +19,7 @@
|
|
19
19
|
<span class="info"><span class="label">load: </span><%= server.system.load || 'N/A' %></span>
|
20
20
|
<span class="info"><span class="label">cpu: </span><%= server.system.cpu || 'N/A' %></span>
|
21
21
|
<span class="info"><span class="label">memory: </span><%= server.system.memory || 'N/A' %></span>
|
22
|
-
<span class="info"><span class="label">uptime: </span><%= server.system.uptime || 'N/A' %></span>
|
22
|
+
<span class="info"><span class="label">uptime: </span><%= time_in_words(server.system.uptime) || 'N/A' %></span>
|
23
23
|
</small>
|
24
24
|
</h2>
|
25
25
|
|
@@ -56,7 +56,7 @@
|
|
56
56
|
<small>
|
57
57
|
<span class="info"><span class="label">cpu: </span><%= process.cpu || 'N/A' %></span>
|
58
58
|
<span class="info"><span class="label">memory: </span><%= process.memory || 'N/A' %></span>
|
59
|
-
<span class="info"><span class="label">uptime: </span><%= process.uptime || 'N/A' %></span>
|
59
|
+
<span class="info"><span class="label">uptime: </span><%= time_in_words(process.uptime) || 'N/A' %></span>
|
60
60
|
</small>
|
61
61
|
</li>
|
62
62
|
<% end %>
|
data/lib/monittr/version.rb
CHANGED
data/test/monittr_test.rb
CHANGED
@@ -8,8 +8,8 @@ module Monittr
|
|
8
8
|
|
9
9
|
should "be initialized with URLs" do
|
10
10
|
assert_nothing_raised do
|
11
|
-
cluster = Monittr::Cluster.new %w[ http://admin:monit@localhost:2812
|
12
|
-
http://admin:monit@localhost:2812
|
11
|
+
cluster = Monittr::Cluster.new %w[ http://admin:monit@localhost:2812
|
12
|
+
http://admin:monit@localhost:2812 ]
|
13
13
|
assert_not_nil cluster.servers
|
14
14
|
assert_equal 2, cluster.servers.size
|
15
15
|
end
|
@@ -17,16 +17,18 @@ module Monittr
|
|
17
17
|
|
18
18
|
should "not fail on invalid URLS" do
|
19
19
|
assert_nothing_raised do
|
20
|
-
cluster = Monittr::Cluster.new %w[
|
21
|
-
http://admin:monit@localhost:2812
|
20
|
+
cluster = Monittr::Cluster.new %w[ ~INVALID
|
21
|
+
http://admin:monit@localhost:2812 ]
|
22
22
|
assert_not_nil cluster.servers
|
23
23
|
assert_equal 2, cluster.servers.size
|
24
|
+
assert_equal 3, cluster.servers.first.system.status
|
25
|
+
assert cluster.servers.first.system.message =~ /bad hostname/, "Should be bad hostname"
|
24
26
|
end
|
25
27
|
end
|
26
28
|
|
27
29
|
should "not fail on out-of-order URLs" do
|
28
|
-
cluster = Monittr::Cluster.new %w[ http://not-working
|
29
|
-
http://admin:monit@localhost:2812
|
30
|
+
cluster = Monittr::Cluster.new %w[ http://not-working
|
31
|
+
http://admin:monit@localhost:2812 ]
|
30
32
|
assert_not_nil cluster.servers
|
31
33
|
assert_equal 2, cluster.servers.size
|
32
34
|
assert_equal 3, cluster.servers.first.system.status
|
@@ -38,19 +40,25 @@ module Monittr
|
|
38
40
|
context "Server" do
|
39
41
|
|
40
42
|
setup do
|
41
|
-
@server = Server.new( fixture_file('status.xml') )
|
43
|
+
@server = Server.new( 'http://localhost:2812', fixture_file('status.xml') )
|
42
44
|
end
|
43
45
|
|
44
46
|
should "parse error XML on initialization" do
|
45
47
|
assert_nothing_raised do
|
46
|
-
server = Server.new
|
48
|
+
server = Server.new 'http://example.com', %Q|<error status="3" name="ERROR" message="MESSAGE" />|
|
47
49
|
assert_equal 'ERROR', server.system.name
|
48
50
|
end
|
49
51
|
end
|
50
52
|
|
51
53
|
should "fetch info from Monit embedded web server" do
|
52
54
|
assert_nothing_raised { Server.fetch }
|
53
|
-
assert_nothing_raised { Server.fetch('http://admin:monit@localhost:2812
|
55
|
+
assert_nothing_raised { Server.fetch('http://admin:monit@localhost:2812') }
|
56
|
+
assert_nothing_raised { Server.fetch('http://admin:monit@localhost:2812/') }
|
57
|
+
end
|
58
|
+
|
59
|
+
should "return the URL" do
|
60
|
+
server = Server.fetch('http://admin:monit@localhost:2812')
|
61
|
+
assert_equal 'http://admin:monit@localhost:2812', server.url
|
54
62
|
end
|
55
63
|
|
56
64
|
should "return system info" do
|
data/test/test_helper.rb
CHANGED
@@ -17,7 +17,7 @@ class Test::Unit::TestCase
|
|
17
17
|
def setup
|
18
18
|
FakeWeb.register_uri(:get, 'http://admin:monit@localhost:2812/_status?format=xml', :body => fixture_file('status.xml'))
|
19
19
|
FakeWeb.register_uri(:get, 'http://not-working/_status?format=xml', :body => '', :status => ['500'])
|
20
|
-
|
20
|
+
FakeWeb.allow_net_connect = false
|
21
21
|
end
|
22
22
|
|
23
23
|
def fixtures_path
|