monittr 0.0.1 → 0.0.2
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.
- 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
|