monittr 0.0.4 → 0.0.5
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 +16 -8
- data/examples/application.rb +2 -0
- data/lib/monittr/sinatra/style.css +3 -0
- data/lib/monittr/sinatra/template.erb +25 -3
- data/lib/monittr/version.rb +1 -1
- data/lib/monittr.rb +35 -11
- data/test/fixtures/status.xml +20 -0
- data/test/monittr_test.rb +10 -0
- metadata +3 -3
data/README.markdown
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Monittr #
|
2
2
|
|
3
|
-
Monittr provides a Ruby interface for the [Monit](http://mmonit.com/monit/) systems management system. Its main goal is to
|
3
|
+
Monittr provides a Ruby interface for the [Monit](http://mmonit.com/monit/) systems management system. Its main goal is to aggregate statistics from multiple Monit instances and display them in an attractive web interface.
|
4
4
|
|
5
5
|
Monittr loads XML from the [web server embedded in Monit](http://mmonit.com/monit/documentation/monit.html#monit_httpd) and makes it accessible as Ruby objects. It also provides helpers for [Sinatra](http://www.sinatrarb.com/) applications, to display the information as HTML. You can insert the statistics into any page, or create a dedicated one. You can use the default template, or create your own. The default template is located in `lib/monittr/sinatra/template.erb` and pictured below.
|
6
6
|
|
@@ -15,11 +15,11 @@ the sources from [Github](https://github.com/karmi/monittr/), to get the latest
|
|
15
15
|
$ git clone http://github.com/karmi/monittr.git
|
16
16
|
$ cd monittr
|
17
17
|
|
18
|
-
You can try the
|
18
|
+
You can try the Ruby interface in a IRB console:
|
19
19
|
|
20
20
|
$ irb -Ilib -rubygems -rmonittr
|
21
21
|
|
22
|
-
You have to pass one or more
|
22
|
+
You have to pass one or more URLs to a local or remote Monit [HTTP server](http://mmonit.com/monit/documentation/monit.html#monit_httpd):
|
23
23
|
|
24
24
|
cluster = Monittr::Cluster.new ['http://localhost:2812/']
|
25
25
|
|
@@ -52,13 +52,23 @@ You can also check out the HTML display by running the example application:
|
|
52
52
|
$ ruby examples/application.rb
|
53
53
|
$ open http://localhost:4567/
|
54
54
|
|
55
|
-
You should see the information about two faked Monit instances in your browser.
|
55
|
+
You should see the information about two faked Monit instances in your browser. (You may need to comment out the FakeWeb section, if you're passing `localhost` URLs.)
|
56
56
|
|
57
|
-
|
57
|
+
To use the gem in a Sinatra application, you have to require the gem, the Sinatra helper and provide the URLs to Monit instances:
|
58
58
|
|
59
|
+
require 'monittr'
|
60
|
+
require 'monittr/sinatra/monittr'
|
59
61
|
set :monit_urls, %w[ http://production.example.com:2812 http://staging.example.com:2812 ]
|
60
62
|
|
61
|
-
|
63
|
+
In a “modular” Sinatra application, you have to register the module explicitely as well:
|
64
|
+
|
65
|
+
register Sinatra::MonittrHTML
|
66
|
+
|
67
|
+
Then, just call the helper in your template:
|
68
|
+
|
69
|
+
<%= monittr.html %>
|
70
|
+
|
71
|
+
You may use the example application as the starting point.
|
62
72
|
|
63
73
|
|
64
74
|
## Customization ##
|
@@ -68,8 +78,6 @@ It's easy to customize the HTML output by setting the appropriate options in you
|
|
68
78
|
set :template, Proc.new { File.join(root, 'template.erb') }
|
69
79
|
set :stylesheet, '/path/to/my/stylesheet'
|
70
80
|
|
71
|
-
Please see the example application for prepared examples.
|
72
|
-
|
73
81
|
|
74
82
|
## Installation ##
|
75
83
|
|
data/examples/application.rb
CHANGED
@@ -5,7 +5,9 @@ require 'monittr'
|
|
5
5
|
require 'sinatra'
|
6
6
|
require 'fakeweb'
|
7
7
|
|
8
|
+
# --- Require the Sinatra extension -------------------------------------------
|
8
9
|
require 'monittr/sinatra/monittr'
|
10
|
+
# -----------------------------------------------------------------------------
|
9
11
|
|
10
12
|
# --- Comment these lines to enable loading data from http://localhost:2812 ---
|
11
13
|
FakeWeb.register_uri(:get, 'http://localhost:2812/_status?format=xml',
|
@@ -19,12 +19,13 @@
|
|
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">swap: </span><%= server.system.swap || 'N/A' %></span>
|
22
23
|
<span class="info"><span class="label">uptime: </span><%= time_in_words(server.system.uptime) || 'N/A' %></span>
|
23
24
|
</small>
|
24
25
|
</h2>
|
25
26
|
|
26
27
|
<div class="content">
|
27
|
-
<div class="segment
|
28
|
+
<div class="segment filesystems">
|
28
29
|
<h3>Filesystem</h3>
|
29
30
|
<ul class="clearfix">
|
30
31
|
<% server.filesystems.each do |fs| %>
|
@@ -39,7 +40,7 @@
|
|
39
40
|
<% end %>
|
40
41
|
</ul>
|
41
42
|
<div class="clear"></div>
|
42
|
-
</div><!-- /
|
43
|
+
</div><!-- /filesystems -->
|
43
44
|
|
44
45
|
<div class="segment processes">
|
45
46
|
<h3>Processes</h3>
|
@@ -62,7 +63,28 @@
|
|
62
63
|
<% end %>
|
63
64
|
</ul>
|
64
65
|
<div class="clear"></div>
|
65
|
-
</div><!-- /
|
66
|
+
</div><!-- /processes -->
|
67
|
+
|
68
|
+
<div class="segment hosts">
|
69
|
+
<h3>Hosts</h3>
|
70
|
+
<ul>
|
71
|
+
<% server.hosts.each do |host| %>
|
72
|
+
<li>
|
73
|
+
<strong>
|
74
|
+
<span class="dot status <%= host.status == 0 ? 'running' : 'failure' %>">·</span>
|
75
|
+
<span class="dot monitored <%= host.monitored == 1 ? 'running' : 'failure' %>">·</span>
|
76
|
+
<%= host.name %>
|
77
|
+
<% unless host.monitored == 1 %><span class="label warning">NOT MONITORED</span><% end %>
|
78
|
+
</strong>
|
79
|
+
|
80
|
+
<small>
|
81
|
+
<span class="info"><span class="label">response time: </span><%= host.response_time || 'N/A' %></span>
|
82
|
+
</small>
|
83
|
+
</li>
|
84
|
+
<% end %>
|
85
|
+
</ul>
|
86
|
+
<div class="clear"></div>
|
87
|
+
</div><!-- /hosts -->
|
66
88
|
|
67
89
|
</div><!-- /content -->
|
68
90
|
|
data/lib/monittr/version.rb
CHANGED
data/lib/monittr.rb
CHANGED
@@ -22,7 +22,7 @@ module Monittr
|
|
22
22
|
#
|
23
23
|
class Server
|
24
24
|
|
25
|
-
attr_reader :url, :xml, :system, :filesystems, :processes
|
25
|
+
attr_reader :url, :xml, :system, :filesystems, :processes, :hosts
|
26
26
|
|
27
27
|
def initialize(url, xml)
|
28
28
|
@url = url
|
@@ -33,10 +33,12 @@ module Monittr
|
|
33
33
|
:status => 3
|
34
34
|
@filesystems = []
|
35
35
|
@processes = []
|
36
|
+
@hosts = []
|
36
37
|
else
|
37
38
|
@system = Services::System.new(@xml.xpath("//service[@type=5]").first)
|
38
39
|
@filesystems = @xml.xpath("//service[@type=0]").map { |xml| Services::Filesystem.new(xml) }
|
39
40
|
@processes = @xml.xpath("//service[@type=3]").map { |xml| Services::Process.new(xml) }
|
41
|
+
@hosts = @xml.xpath("//service[@type=4]").map { |xml| Services::Host.new(xml) }
|
40
42
|
end
|
41
43
|
end
|
42
44
|
|
@@ -91,6 +93,7 @@ module Monittr
|
|
91
93
|
:load => value('system/load/avg01', :to_f),
|
92
94
|
:cpu => value('system/cpu/user', :to_f),
|
93
95
|
:memory => value('system/memory/percent', :to_f),
|
96
|
+
:swap => value('system/swap/percent', :to_f),
|
94
97
|
:uptime => value('//server/uptime', :to_i)
|
95
98
|
} )
|
96
99
|
end
|
@@ -112,11 +115,11 @@ module Monittr
|
|
112
115
|
:usage => value('block/usage' ),
|
113
116
|
:total => value('block/total' )
|
114
117
|
} )
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
118
|
+
rescue Exception => e
|
119
|
+
puts "ERROR: #{e.class} -- #{e.message}, In: #{e.backtrace.first}"
|
120
|
+
super( { :name => 'Error',
|
121
|
+
:status => 3,
|
122
|
+
:message => e.message } )
|
120
123
|
end
|
121
124
|
end
|
122
125
|
|
@@ -136,13 +139,34 @@ module Monittr
|
|
136
139
|
:uptime => value('uptime', :to_i),
|
137
140
|
:memory => value('memory/percent', :to_f),
|
138
141
|
:cpu => value('cpu/percent', :to_i)
|
142
|
+
} )
|
143
|
+
rescue Exception => e
|
144
|
+
puts "ERROR: #{e.class} -- #{e.message}, In: #{e.backtrace.first}"
|
145
|
+
super( { :name => 'Error',
|
146
|
+
:status => 3,
|
147
|
+
:message => e.message } )
|
148
|
+
end
|
149
|
+
end
|
139
150
|
|
151
|
+
# A "host" service in Monit
|
152
|
+
#
|
153
|
+
# http://mmonit.com/monit/documentation/monit.html#connection_testing
|
154
|
+
#
|
155
|
+
# <service type="4">
|
156
|
+
#
|
157
|
+
class Host < Base
|
158
|
+
def initialize(xml)
|
159
|
+
@xml = xml
|
160
|
+
super( { :name => value('name' ),
|
161
|
+
:status => value('status', :to_i),
|
162
|
+
:monitored => value('monitor', :to_i),
|
163
|
+
:response_time => value('port/responsetime' )
|
140
164
|
} )
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
165
|
+
rescue Exception => e
|
166
|
+
puts "ERROR: #{e.class} -- #{e.message}, In: #{e.backtrace.first}"
|
167
|
+
super( { :name => 'Error',
|
168
|
+
:status => 3,
|
169
|
+
:message => e.message } )
|
146
170
|
end
|
147
171
|
end
|
148
172
|
|
data/test/fixtures/status.xml
CHANGED
@@ -496,4 +496,24 @@
|
|
496
496
|
</memory>
|
497
497
|
</system>
|
498
498
|
</service>
|
499
|
+
|
500
|
+
<service type="4">
|
501
|
+
<name>www.google.com</name>
|
502
|
+
<collected_sec>1291193687</collected_sec>
|
503
|
+
<collected_usec>388019</collected_usec>
|
504
|
+
<status>0</status>
|
505
|
+
<status_hint>0</status_hint>
|
506
|
+
<monitor>1</monitor>
|
507
|
+
<monitormode>0</monitormode>
|
508
|
+
<pendingaction>0</pendingaction>
|
509
|
+
<port>
|
510
|
+
<hostname>www.google.com</hostname>
|
511
|
+
<portnumber>80</portnumber>
|
512
|
+
<request>/</request>
|
513
|
+
<protocol>HTTP</protocol>
|
514
|
+
<type>TCP</type>
|
515
|
+
<responsetime>0.009</responsetime>
|
516
|
+
</port>
|
517
|
+
</service>
|
518
|
+
|
499
519
|
</monit>
|
data/test/monittr_test.rb
CHANGED
@@ -96,6 +96,16 @@ module Monittr
|
|
96
96
|
assert_equal 0.0, thin.cpu
|
97
97
|
end
|
98
98
|
|
99
|
+
should "return hosts info" do
|
100
|
+
assert_not_nil @server.hosts
|
101
|
+
assert_equal 1, @server.hosts.size
|
102
|
+
|
103
|
+
assert_equal 'www.google.com', @server.hosts[0].name
|
104
|
+
assert_equal 0, @server.hosts[0].status
|
105
|
+
assert_equal 1, @server.hosts[0].monitored
|
106
|
+
assert_equal '0.009', @server.hosts[0].response_time
|
107
|
+
end
|
108
|
+
|
99
109
|
end
|
100
110
|
|
101
111
|
[ Services::System, Services::Filesystem, Services::Process ].each do |klass|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 5
|
9
|
+
version: 0.0.5
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Karel Minarik
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-12-01 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|