scout_scout 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +39 -15
- data/Rakefile +5 -0
- data/lib/scout_scout.rb +25 -6
- data/lib/scout_scout/alert.rb +7 -5
- data/lib/scout_scout/cluster.rb +66 -0
- data/lib/scout_scout/descriptor.rb +38 -0
- data/lib/scout_scout/metric.rb +2 -0
- data/lib/scout_scout/plugin.rb +12 -1
- data/lib/scout_scout/server.rb +81 -0
- data/lib/scout_scout/version.rb +2 -2
- data/spec/fixtures/client.xml +1 -0
- data/spec/fixtures/clients.xml +2 -0
- data/spec/fixtures/data.xml +5 -0
- data/spec/fixtures/descriptors.xml +93 -0
- data/spec/scout_scout_spec.rb +78 -24
- metadata +7 -3
- data/lib/scout_scout/client.rb +0 -53
data/README.rdoc
CHANGED
@@ -1,28 +1,52 @@
|
|
1
1
|
= scout_scout
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
3
|
+
A library for extracting data out of Scout[http//:scoutapp.com], a hosted monitoring service. This is experimental and likely to change.
|
4
|
+
|
5
|
+
require 'scout_scout'
|
6
|
+
scout = ScoutScout.new('youraccountname', 'your@awesome.com', 'sekret')
|
7
|
+
|
8
|
+
#all your servers
|
9
|
+
servers = scout.servers
|
10
|
+
|
11
|
+
#one specific server - pass in hostname
|
12
|
+
ram_hungry = ScoutScout::Server.first('db1.awesome.com')
|
13
|
+
|
14
|
+
#all servers that match the hostname.
|
15
|
+
# see mysql regex formatting: http://dev.mysql.com/doc/refman/5.0/en/regexp.html
|
16
|
+
app_servers = ScoutScout::Server.all(:host => 'db[0-9]*.awesome.com')
|
17
|
+
|
18
|
+
#details on that server's plugins
|
19
|
+
ram_hungry_plugins = ram_hungry.plugins
|
20
|
+
|
21
|
+
#details about a specific plugin
|
22
|
+
data = ram_hungry.plugin(12345)
|
23
|
+
|
24
|
+
#all available descriptors
|
25
|
+
descriptors = ScoutScout::Descriptor.all
|
26
|
+
|
27
|
+
# all descriptors on servers that match the provided host
|
28
|
+
descriptors = ScoutScout::Descriptor.all(:host => 'awesome.com')
|
29
|
+
|
30
|
+
#cluster metrics
|
31
|
+
ScoutScout::Cluster.average('mem_used')
|
32
|
+
|
33
|
+
== Metrics
|
34
|
+
|
35
|
+
The library allows you to extract aggregate metrics across all and/or
|
36
|
+
selected servers in your account. See <tt>Cluster#average</tt> for
|
37
|
+
information and examples.
|
15
38
|
|
16
39
|
== Note on Patches/Pull Requests
|
17
|
-
|
40
|
+
|
18
41
|
* Fork the project.
|
19
42
|
* Make your feature addition or bug fix.
|
20
43
|
* Add tests for it. This is important so I don't break it in a
|
21
44
|
future version unintentionally.
|
22
45
|
* Commit, do not mess with rakefile, version, or history.
|
23
|
-
(if you want to have your own version, that is fine but bump version in a
|
46
|
+
(if you want to have your own version, that is fine but bump version in a
|
47
|
+
commit by itself I can ignore when I pull)
|
24
48
|
* Send me a pull request. Bonus points for topic branches.
|
25
49
|
|
26
50
|
== Copyright
|
27
51
|
|
28
|
-
Copyright (c) 2010 Jesse Newland. See LICENSE for details.
|
52
|
+
Copyright (c) 2010 Jesse Newland, Derek Haynes. See LICENSE for details.
|
data/Rakefile
CHANGED
data/lib/scout_scout.rb
CHANGED
@@ -1,23 +1,29 @@
|
|
1
1
|
require 'hashie'
|
2
2
|
require 'httparty'
|
3
|
+
require 'cgi'
|
3
4
|
require 'scout_scout/version'
|
4
|
-
require 'scout_scout/
|
5
|
+
require 'scout_scout/server'
|
5
6
|
require 'scout_scout/descriptor'
|
6
7
|
require 'scout_scout/plugin'
|
7
8
|
require 'scout_scout/alert'
|
9
|
+
require 'scout_scout/cluster.rb'
|
10
|
+
require 'scout_scout/metric.rb'
|
8
11
|
|
9
12
|
class ScoutScout
|
10
13
|
include HTTParty
|
11
14
|
base_uri 'https://scoutapp.com'
|
12
15
|
format :xml
|
13
16
|
mattr_inheritable :account
|
17
|
+
|
18
|
+
class Error < RuntimeError
|
19
|
+
end
|
14
20
|
|
15
21
|
def initialize(scout_account_name, username, password)
|
16
22
|
self.class.account = scout_account_name
|
17
23
|
self.class.basic_auth username, password
|
18
24
|
end
|
19
25
|
|
20
|
-
# Recent alerts across all
|
26
|
+
# Recent alerts across all servers on this account
|
21
27
|
#
|
22
28
|
# @return [Array] An array of ScoutScout::Alert objects
|
23
29
|
def alerts
|
@@ -25,12 +31,25 @@ class ScoutScout
|
|
25
31
|
response['alerts'].map { |alert| ScoutScout::Alert.new(alert) }
|
26
32
|
end
|
27
33
|
|
28
|
-
# All
|
34
|
+
# All servers on this account
|
29
35
|
#
|
30
|
-
# @return [Array] An array of ScoutScout::
|
31
|
-
def
|
36
|
+
# @return [Array] An array of ScoutScout::Server objects
|
37
|
+
def servers
|
32
38
|
response = self.class.get("/#{self.class.account}/clients.xml")
|
33
|
-
response['clients'].map { |client| ScoutScout::
|
39
|
+
response['clients'].map { |client| ScoutScout::Server.new(client) }
|
40
|
+
end
|
41
|
+
|
42
|
+
class << self
|
43
|
+
alias_method :http_get, :get
|
44
|
+
end
|
45
|
+
|
46
|
+
# Checks for errors via the HTTP status code. If an error is found, a
|
47
|
+
# ScoutScout::Error is raised. Otherwise, the response.
|
48
|
+
#
|
49
|
+
# @return HTTParty::Response
|
50
|
+
def self.get(uri)
|
51
|
+
response = http_get(uri)
|
52
|
+
response.code.to_s =~ /^(4|5)/ ? raise( ScoutScout::Error,response.message) : response
|
34
53
|
end
|
35
54
|
|
36
55
|
end
|
data/lib/scout_scout/alert.rb
CHANGED
@@ -1,15 +1,17 @@
|
|
1
1
|
class ScoutScout::Alert < Hashie::Mash
|
2
|
-
|
2
|
+
attr_writer :server
|
3
|
+
|
4
|
+
# The Scout server that generated this alert
|
3
5
|
#
|
4
|
-
# @return [ScoutScout::
|
5
|
-
def
|
6
|
-
@
|
6
|
+
# @return [ScoutScout::Server]
|
7
|
+
def server
|
8
|
+
@server ||= ScoutScout::Server.first(client_id)
|
7
9
|
end
|
8
10
|
|
9
11
|
# The Scout plugin that generated this alert
|
10
12
|
#
|
11
13
|
# @return [ScoutScout::Plugin]
|
12
14
|
def plugin
|
13
|
-
|
15
|
+
server.plugin(plugin_id)
|
14
16
|
end
|
15
17
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
class ScoutScout::Cluster < Hashie::Mash
|
2
|
+
# Find the average value of a descriptor by name (ex: 'last_minute'). If the descriptor couldn't be found AND/OR
|
3
|
+
# hasn't reported since +options[:start]+, a ScoutScout::Error is raised.
|
4
|
+
#
|
5
|
+
# Options:
|
6
|
+
#
|
7
|
+
# * <tt>:host</tt>: Only selects descriptors from servers w/hostnames matching this pattern.
|
8
|
+
# Use a MySQL-formatted Regex. http://dev.mysql.com/doc/refman/5.0/en/regexp.html
|
9
|
+
# * <tt>:start</tt>: The start time for grabbing metrics. Default is 1 hour ago. Times will be converted to UTC.
|
10
|
+
# * <tt>:end</tt>: The end time for grabbing metrics. Default is NOW. Times will be converted to UTC.
|
11
|
+
# * <tt>:per_server</tt>: Whether the result should be returned per-server or an aggregate of the entire cluster.
|
12
|
+
# Default is false. Note that total is not necessary equal to the value on each server * num of servers.
|
13
|
+
# Examples:
|
14
|
+
#
|
15
|
+
# How much memory are my servers using?
|
16
|
+
# ScoutScout::Cluster.average('mem_used')
|
17
|
+
#
|
18
|
+
# What is the average per-server load on my servers?
|
19
|
+
# ScoutScout::Cluster.average('cpu_last_minute', :per_server => true)
|
20
|
+
#
|
21
|
+
# How much disk space is available on our db servers?
|
22
|
+
# ScoutScout::Cluster.average('disk_avail',:host => "db[0-9]*.awesomeapp.com")
|
23
|
+
#
|
24
|
+
# How much memory did my servers use yesterday?
|
25
|
+
# ScoutScout::Cluster.average('mem_used', :start => Time.now-(24*60*60)*2, :end => Time.now-(24*60*60)*2)
|
26
|
+
#
|
27
|
+
# @return [ScoutScout::Metric]
|
28
|
+
def self.average(descriptor,options = {})
|
29
|
+
calculate('AVG',descriptor,options)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Find the maximum value of a descriptor by name (ex: 'last_minute').
|
33
|
+
#
|
34
|
+
# See +average+ for options and examples.
|
35
|
+
#
|
36
|
+
# @return [ScoutScout::Metric]
|
37
|
+
def self.maximum(descriptor,options = {})
|
38
|
+
calculate('MAX',descriptor,options)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Find the minimum value of a descriptor by name (ex: 'last_minute').
|
42
|
+
#
|
43
|
+
# See +average+ for options and examples.
|
44
|
+
#
|
45
|
+
# @return [ScoutScout::Metric]
|
46
|
+
def self.minimum(descriptor,options = {})
|
47
|
+
calculate('MIN',descriptor,options)
|
48
|
+
end
|
49
|
+
|
50
|
+
def self.calculate(function,descriptor,options = {})
|
51
|
+
consolidate = options[:per_server] ? 'AVG' : 'SUM'
|
52
|
+
start_time,end_time=format_times(options)
|
53
|
+
response = ScoutScout.get("/#{ScoutScout.account}/data/value?descriptor=#{CGI.escape(descriptor)}&function=#{function}&consolidate=#{consolidate}&host=#{options[:host]}&start=#{start_time}&end=#{end_time}")
|
54
|
+
|
55
|
+
if response['data']
|
56
|
+
ScoutScout::Metric.new(response['data'])
|
57
|
+
else
|
58
|
+
raise ScoutScout::Error, response['error']
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# API expects times in epoch.
|
63
|
+
def self.format_times(options)
|
64
|
+
options.values_at(:start,:end).map { |t| t ? t.to_i : nil }
|
65
|
+
end
|
66
|
+
end
|
@@ -1,2 +1,40 @@
|
|
1
1
|
class ScoutScout::Descriptor < Hashie::Mash
|
2
|
+
attr_accessor :server, :plugin
|
3
|
+
|
4
|
+
# Search for descriptors by matching name and hostname.
|
5
|
+
#
|
6
|
+
# Options:
|
7
|
+
#
|
8
|
+
# - :descriptor => The descriptor name to match
|
9
|
+
# - :host => The host name to match
|
10
|
+
#
|
11
|
+
# @return [Array] An array of ScoutScout::Descriptor objects
|
12
|
+
def self.all(options = {})
|
13
|
+
response = ScoutScout.get("/#{ScoutScout.account}/descriptors.xml?descriptor=#{CGI.escape(options[:descriptor] || String.new)}&host=#{options[:host]}")
|
14
|
+
response['ar_descriptors'] ? response['ar_descriptors'].map { |descriptor| ScoutScout::Descriptor.new(descriptor) } : Array.new
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [ScoutScout::Metric]
|
18
|
+
def average(opts = {})
|
19
|
+
ScoutScout::Cluster.average(name, options_for_relationship(opts))
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return [ScoutScout::Metric]
|
23
|
+
def maximum(opts = {})
|
24
|
+
ScoutScout::Cluster.maximum(name, options_for_relationship(opts))
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [ScoutScout::Metric]
|
28
|
+
def maximum(opts = {})
|
29
|
+
ScoutScout::Cluster.maximum(name, options_for_relationship(opts))
|
30
|
+
end
|
31
|
+
|
32
|
+
protected
|
33
|
+
|
34
|
+
def options_for_relationship(opts = {})
|
35
|
+
relationship_options = {}
|
36
|
+
relationship_options[:host] = server.hostname if server
|
37
|
+
opts.merge(relationship_options)
|
38
|
+
end
|
39
|
+
|
2
40
|
end
|
data/lib/scout_scout/plugin.rb
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
class ScoutScout::Plugin < Hashie::Mash
|
2
|
+
attr_accessor :server
|
3
|
+
|
2
4
|
def initialize(hash)
|
3
5
|
if hash['descriptors'] && hash['descriptors']['descriptor']
|
4
6
|
@descriptor_hash = hash['descriptors']['descriptor']
|
@@ -11,6 +13,15 @@ class ScoutScout::Plugin < Hashie::Mash
|
|
11
13
|
#
|
12
14
|
# @return [Array] An array of ScoutScout::Descriptor objects
|
13
15
|
def descriptors
|
14
|
-
@descriptors ||= @descriptor_hash.map { |d| ScoutScout::Descriptor.new(d) }
|
16
|
+
@descriptors ||= @descriptor_hash.map { |d| decorate_with_server_and_plugin(ScoutScout::Descriptor.new(d)) }
|
15
17
|
end
|
18
|
+
|
19
|
+
protected
|
20
|
+
|
21
|
+
def decorate_with_server_and_plugin(hashie)
|
22
|
+
hashie.server = self.server
|
23
|
+
hashie.plugin = self
|
24
|
+
hashie
|
25
|
+
end
|
26
|
+
|
16
27
|
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
class ScoutScout::Server < Hashie::Mash
|
2
|
+
def initialize(hash)
|
3
|
+
if hash['active_alerts']
|
4
|
+
@alert_hash = hash['active_alerts']
|
5
|
+
hash.delete('active_alerts')
|
6
|
+
end
|
7
|
+
super(hash)
|
8
|
+
end
|
9
|
+
|
10
|
+
# Search for a server by id or matching hostname
|
11
|
+
#
|
12
|
+
# @return [ScoutScout::Server]
|
13
|
+
def self.first(server_id_or_hostname)
|
14
|
+
if server_id_or_hostname.is_a?(Fixnum)
|
15
|
+
response = ScoutScout.get("/#{ScoutScout.account}/clients/#{server_id_or_hostname}.xml")
|
16
|
+
ScoutScout::Server.new(response['client'])
|
17
|
+
else
|
18
|
+
response = ScoutScout.get("/#{ScoutScout.account}/clients.xml?host=#{server_id_or_hostname}")
|
19
|
+
raise ScoutScout::Error, 'Not Found' if response['clients'].nil?
|
20
|
+
ScoutScout::Server.new(response['clients'].first)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Search for servers by matching hostname via :host.
|
25
|
+
#
|
26
|
+
# Example: ScoutScout::Server.all(:host => 'soawesome.org')
|
27
|
+
#
|
28
|
+
# @return [Array] An array of ScoutScout::Server objects
|
29
|
+
def self.all(options)
|
30
|
+
hostname = options[:host]
|
31
|
+
raise ScoutScout::Error, "Please specify a host via :host" if hostname.nil?
|
32
|
+
response = ScoutScout.get("/#{ScoutScout.account}/clients.xml?host=#{hostname}")
|
33
|
+
response['clients'] ? response['clients'].map { |client| ScoutScout::Server.new(client) } : Array.new
|
34
|
+
end
|
35
|
+
|
36
|
+
# Active alerts for this server
|
37
|
+
#
|
38
|
+
# @return [Array] An array of ScoutScout::Alert objects
|
39
|
+
def active_alerts
|
40
|
+
@active_alerts ||= @alert_hash.map { |a| decorate_with_server(ScoutScout::Alert.new(a)) }
|
41
|
+
end
|
42
|
+
|
43
|
+
# Recent alerts for this server
|
44
|
+
#
|
45
|
+
# @return [Array] An array of ScoutScout::Alert objects
|
46
|
+
def alerts
|
47
|
+
response = ScoutScout.get("/#{ScoutScout.account}/clients/#{self.id}/activities.xml")
|
48
|
+
response['alerts'].map { |alert| decorate_with_server(ScoutScout::Alert.new(alert)) }
|
49
|
+
end
|
50
|
+
|
51
|
+
# Details about all plugins for this server
|
52
|
+
#
|
53
|
+
# @return [Array] An array of ScoutScout::Plugin objects
|
54
|
+
def plugins
|
55
|
+
response = ScoutScout.get("/#{ScoutScout.account}/clients/#{self.id}/plugins.xml")
|
56
|
+
response['plugins'].map { |plugin| decorate_with_server(ScoutScout::Plugin.new(plugin)) }
|
57
|
+
end
|
58
|
+
|
59
|
+
# Details about a specific plugin
|
60
|
+
#
|
61
|
+
# @return [ScoutScout::Plugin]
|
62
|
+
def plugin(id)
|
63
|
+
response = ScoutScout.get("/#{ScoutScout.account}/clients/#{self.id}/plugins/#{id}.xml")
|
64
|
+
decorate_with_server(ScoutScout::Plugin.new(response['plugin']))
|
65
|
+
end
|
66
|
+
|
67
|
+
# All descriptors for this server
|
68
|
+
#
|
69
|
+
# @return [Array] An array of ScoutScout::Descriptor objects
|
70
|
+
def descriptors
|
71
|
+
ScoutScout::Descriptor.all(:host => hostname).map { |d| decorate_with_server(d) }
|
72
|
+
end
|
73
|
+
|
74
|
+
protected
|
75
|
+
|
76
|
+
def decorate_with_server(hashie)
|
77
|
+
hashie.server = self
|
78
|
+
hashie
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
data/lib/scout_scout/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
1
|
class ScoutScout
|
2
|
-
VERSION = '0.0.
|
3
|
-
end
|
2
|
+
VERSION = '0.0.4'
|
3
|
+
end
|
data/spec/fixtures/client.xml
CHANGED
@@ -16,6 +16,7 @@
|
|
16
16
|
<send-checkup-email type="boolean" nil="true"></send-checkup-email>
|
17
17
|
<send-checkup-sms type="boolean" nil="true"></send-checkup-sms>
|
18
18
|
<take-snapshots type="boolean">false</take-snapshots>
|
19
|
+
<hostname>foobar.com</hostname>
|
19
20
|
<version>3.2.6</version>
|
20
21
|
<active-alerts type="array"/>
|
21
22
|
</client>
|
data/spec/fixtures/clients.xml
CHANGED
@@ -17,6 +17,7 @@
|
|
17
17
|
<send-checkup-email type="boolean" nil="true"></send-checkup-email>
|
18
18
|
<send-checkup-sms type="boolean" nil="true"></send-checkup-sms>
|
19
19
|
<take-snapshots type="boolean">false</take-snapshots>
|
20
|
+
<hostname>foobar.com</hostname>
|
20
21
|
<version>3.2.6</version>
|
21
22
|
<active-alerts type="array"/>
|
22
23
|
</client>
|
@@ -37,6 +38,7 @@
|
|
37
38
|
<send-checkup-email type="boolean" nil="true"></send-checkup-email>
|
38
39
|
<send-checkup-sms type="boolean" nil="true"></send-checkup-sms>
|
39
40
|
<take-snapshots type="boolean">false</take-snapshots>
|
41
|
+
<hostname>foo2.com</hostname>
|
40
42
|
<version>5.0.3</version>
|
41
43
|
<active-alerts type="array">
|
42
44
|
<alert>
|
@@ -0,0 +1,93 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<ar-descriptors type="array">
|
3
|
+
<ar-descriptor>
|
4
|
+
<name>Passenger/apache_private_total</name>
|
5
|
+
</ar-descriptor>
|
6
|
+
<ar-descriptor>
|
7
|
+
<name>Server Overview/cpu_last_fifteen_minutes</name>
|
8
|
+
</ar-descriptor>
|
9
|
+
<ar-descriptor>
|
10
|
+
<name>Server Overview/cpu_last_five_minutes</name>
|
11
|
+
</ar-descriptor>
|
12
|
+
<ar-descriptor>
|
13
|
+
<name>Server Overview/cpu_last_minute</name>
|
14
|
+
</ar-descriptor>
|
15
|
+
<ar-descriptor>
|
16
|
+
<name>Server Overview/disk_avail</name>
|
17
|
+
</ar-descriptor>
|
18
|
+
<ar-descriptor>
|
19
|
+
<name>Server Overview/disk_capacity</name>
|
20
|
+
</ar-descriptor>
|
21
|
+
<ar-descriptor>
|
22
|
+
<name>Server Overview/disk_size</name>
|
23
|
+
</ar-descriptor>
|
24
|
+
<ar-descriptor>
|
25
|
+
<name>Server Overview/disk_used</name>
|
26
|
+
</ar-descriptor>
|
27
|
+
<ar-descriptor>
|
28
|
+
<name>Network Throughput/eth0_in</name>
|
29
|
+
</ar-descriptor>
|
30
|
+
<ar-descriptor>
|
31
|
+
<name>Network Throughput/eth0_in_packets</name>
|
32
|
+
</ar-descriptor>
|
33
|
+
<ar-descriptor>
|
34
|
+
<name>Network Throughput/eth0_out</name>
|
35
|
+
</ar-descriptor>
|
36
|
+
<ar-descriptor>
|
37
|
+
<name>Network Throughput/eth0_out_packets</name>
|
38
|
+
</ar-descriptor>
|
39
|
+
<ar-descriptor>
|
40
|
+
<name>Network Throughput/eth1_in</name>
|
41
|
+
</ar-descriptor>
|
42
|
+
<ar-descriptor>
|
43
|
+
<name>Network Throughput/eth1_in_packets</name>
|
44
|
+
</ar-descriptor>
|
45
|
+
<ar-descriptor>
|
46
|
+
<name>Network Throughput/eth1_out</name>
|
47
|
+
</ar-descriptor>
|
48
|
+
<ar-descriptor>
|
49
|
+
<name>Network Throughput/eth1_out_packets</name>
|
50
|
+
</ar-descriptor>
|
51
|
+
<ar-descriptor>
|
52
|
+
<name>Server Overview/mem_swap_percent</name>
|
53
|
+
</ar-descriptor>
|
54
|
+
<ar-descriptor>
|
55
|
+
<name>Server Overview/mem_swap_total</name>
|
56
|
+
</ar-descriptor>
|
57
|
+
<ar-descriptor>
|
58
|
+
<name>Server Overview/mem_swap_used</name>
|
59
|
+
</ar-descriptor>
|
60
|
+
<ar-descriptor>
|
61
|
+
<name>Server Overview/mem_total</name>
|
62
|
+
</ar-descriptor>
|
63
|
+
<ar-descriptor>
|
64
|
+
<name>Server Overview/mem_used</name>
|
65
|
+
</ar-descriptor>
|
66
|
+
<ar-descriptor>
|
67
|
+
<name>Server Overview/mem_used_percent</name>
|
68
|
+
</ar-descriptor>
|
69
|
+
<ar-descriptor>
|
70
|
+
<name>Passenger/nginx_processes</name>
|
71
|
+
</ar-descriptor>
|
72
|
+
<ar-descriptor>
|
73
|
+
<name>Passenger/passenger_max_pool_size</name>
|
74
|
+
</ar-descriptor>
|
75
|
+
<ar-descriptor>
|
76
|
+
<name>Passenger/passenger_private_total</name>
|
77
|
+
</ar-descriptor>
|
78
|
+
<ar-descriptor>
|
79
|
+
<name>Passenger/passenger_process_active</name>
|
80
|
+
</ar-descriptor>
|
81
|
+
<ar-descriptor>
|
82
|
+
<name>Passenger/passenger_process_current</name>
|
83
|
+
</ar-descriptor>
|
84
|
+
<ar-descriptor>
|
85
|
+
<name>Passenger/passenger_process_inactive</name>
|
86
|
+
</ar-descriptor>
|
87
|
+
<ar-descriptor>
|
88
|
+
<name>Passenger/passenger_queue_depth</name>
|
89
|
+
</ar-descriptor>
|
90
|
+
<ar-descriptor>
|
91
|
+
<name>Passenger/passenger_vmsize_total</name>
|
92
|
+
</ar-descriptor>
|
93
|
+
</ar-descriptors>
|
data/spec/scout_scout_spec.rb
CHANGED
@@ -7,25 +7,25 @@ describe "ScoutScout" do
|
|
7
7
|
it "should provide a version constant" do
|
8
8
|
ScoutScout::VERSION.should be_instance_of(String)
|
9
9
|
end
|
10
|
-
it "should set the
|
10
|
+
it "should set the server and basic auth parameters when initialized" do
|
11
11
|
@scout_scout.class.account.should == 'account'
|
12
12
|
@scout_scout.class.default_options[:basic_auth].should == { :username => 'username', :password => 'password' }
|
13
13
|
end
|
14
14
|
describe "global" do
|
15
|
-
describe "
|
15
|
+
describe "server list" do
|
16
16
|
before(:each) do
|
17
17
|
@scout_scout.stub_get('clients.xml')
|
18
|
-
@
|
18
|
+
@servers = @scout_scout.servers
|
19
19
|
end
|
20
|
-
it 'should list all
|
21
|
-
@
|
20
|
+
it 'should list all servers' do
|
21
|
+
@servers.size.should == 2
|
22
22
|
end
|
23
|
-
it "should be an array ScoutScout::
|
24
|
-
@
|
23
|
+
it "should be an array ScoutScout::Server objects" do
|
24
|
+
@servers.first.class.should == ScoutScout::Server
|
25
25
|
end
|
26
26
|
it "should include active alerts" do
|
27
|
-
@
|
28
|
-
@
|
27
|
+
@servers.last.active_alerts.first.class.should == ScoutScout::Alert
|
28
|
+
@servers.last.active_alerts.first.title.should =~ /Passenger/
|
29
29
|
end
|
30
30
|
end
|
31
31
|
describe 'alert log' do
|
@@ -36,9 +36,9 @@ describe "ScoutScout" do
|
|
36
36
|
it "should be an array ScoutScout::Alert objects" do
|
37
37
|
@activities.first.class.should == ScoutScout::Alert
|
38
38
|
end
|
39
|
-
it "should be associated with it's plugin and
|
39
|
+
it "should be associated with it's plugin and server" do
|
40
40
|
@scout_scout.stub_get('clients/24331.xml', 'client.xml')
|
41
|
-
@activities.first.
|
41
|
+
@activities.first.server.class.should == ScoutScout::Server
|
42
42
|
@scout_scout.stub_get('clients/13431/plugins/122761.xml', 'plugin_data.xml')
|
43
43
|
@activities.first.plugin.class.should == ScoutScout::Plugin
|
44
44
|
end
|
@@ -49,36 +49,60 @@ describe "ScoutScout" do
|
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
52
|
+
describe 'descriptors' do
|
53
|
+
before(:each) do
|
54
|
+
@scout_scout.stub_get('descriptors.xml?descriptor=&host=&','descriptors.xml')
|
55
|
+
@descriptors = ScoutScout::Descriptor.all
|
56
|
+
end
|
57
|
+
it "should be an array ScoutScout::Descriptor objects" do
|
58
|
+
@descriptors.first.class.should == ScoutScout::Descriptor
|
59
|
+
end
|
60
|
+
it "should be accessable" do
|
61
|
+
@descriptors.size.should == 30
|
62
|
+
end
|
63
|
+
end
|
64
|
+
describe 'descriptor metrics' do
|
65
|
+
before(:each) do
|
66
|
+
@scout_scout.stub_get('data/value?descriptor=cpu_last_minute&function=AVG&consolidate=SUM&host=&start=&end=&','data.xml')
|
67
|
+
@metric = ScoutScout::Cluster.average('cpu_last_minute')
|
68
|
+
end
|
69
|
+
it "should be a ScoutScout::Metric object" do
|
70
|
+
@metric.class.should == ScoutScout::Metric
|
71
|
+
end
|
72
|
+
it "should contain the value" do
|
73
|
+
@metric.value.should == '31.10'
|
74
|
+
end
|
75
|
+
end
|
52
76
|
end
|
53
|
-
describe 'individual
|
77
|
+
describe 'individual servers' do
|
54
78
|
describe 'should be accessable' do
|
55
79
|
describe '' do
|
56
80
|
before(:each) do
|
57
81
|
@scout_scout.stub_get('clients/1234.xml', 'client.xml')
|
58
|
-
@
|
82
|
+
@server = ScoutScout::Server.first(1234)
|
59
83
|
end
|
60
84
|
it "by id" do
|
61
|
-
@
|
62
|
-
@
|
85
|
+
@server.key.should == 'FOOBAR'
|
86
|
+
@server.class.should == ScoutScout::Server
|
63
87
|
end
|
64
88
|
end
|
65
89
|
describe '' do
|
66
90
|
before(:each) do
|
67
91
|
@scout_scout.stub_get('clients.xml?host=foo.awesome.com', 'client_by_hostname.xml')
|
68
|
-
@
|
92
|
+
@server = ScoutScout::Server.first('foo.awesome.com')
|
69
93
|
end
|
70
94
|
it "by hostname" do
|
71
|
-
@
|
72
|
-
@
|
95
|
+
@server.key.should == 'FOOBAR'
|
96
|
+
@server.class.should == ScoutScout::Server
|
73
97
|
end
|
74
98
|
end
|
75
99
|
end
|
76
100
|
describe 'alert log' do
|
77
101
|
before(:each) do
|
78
102
|
@scout_scout.stub_get('clients/13431.xml', 'client.xml')
|
79
|
-
@
|
103
|
+
@server = ScoutScout::Server.first(13431)
|
80
104
|
@scout_scout.stub_get('clients/13431/activities.xml', 'activities.xml')
|
81
|
-
@activities = @
|
105
|
+
@activities = @server.alerts
|
82
106
|
end
|
83
107
|
it "should be accessable" do
|
84
108
|
@activities.size.should == 2
|
@@ -94,9 +118,9 @@ describe "ScoutScout" do
|
|
94
118
|
describe 'list' do
|
95
119
|
before(:each) do
|
96
120
|
@scout_scout.stub_get('clients/13431.xml', 'client.xml')
|
97
|
-
@
|
121
|
+
@server = ScoutScout::Server.first(13431)
|
98
122
|
@scout_scout.stub_get('clients/13431/plugins.xml', 'plugins.xml')
|
99
|
-
@plugins = @
|
123
|
+
@plugins = @server.plugins
|
100
124
|
end
|
101
125
|
it "should be accessable" do
|
102
126
|
@plugins.size.should == 2
|
@@ -112,9 +136,9 @@ describe "ScoutScout" do
|
|
112
136
|
describe 'individually' do
|
113
137
|
before(:each) do
|
114
138
|
@scout_scout.stub_get('clients/13431.xml', 'client.xml')
|
115
|
-
@
|
139
|
+
@server = ScoutScout::Server.first(13431)
|
116
140
|
@scout_scout.stub_get('clients/13431/plugins/12345.xml', 'plugin_data.xml')
|
117
|
-
@plugin_data = @
|
141
|
+
@plugin_data = @server.plugin(12345)
|
118
142
|
end
|
119
143
|
it "should be accessable" do
|
120
144
|
@plugin_data.class.should == ScoutScout::Plugin
|
@@ -131,5 +155,35 @@ describe "ScoutScout" do
|
|
131
155
|
end
|
132
156
|
|
133
157
|
end
|
158
|
+
describe 'descriptor list' do
|
159
|
+
before(:each) do
|
160
|
+
@scout_scout.stub_get('clients/13431.xml', 'client.xml')
|
161
|
+
@server = ScoutScout::Server.first(13431)
|
162
|
+
@scout_scout.stub_get('descriptors.xml?descriptor=&host=foobar.com&', 'descriptors.xml')
|
163
|
+
@descriptors = @server.descriptors
|
164
|
+
end
|
165
|
+
it "should be accessable" do
|
166
|
+
@descriptors.size.should == 30
|
167
|
+
end
|
168
|
+
it "should be an array ScoutScout::Descriptor objects" do
|
169
|
+
@descriptors.first.class.should == ScoutScout::Descriptor
|
170
|
+
end
|
171
|
+
end
|
172
|
+
describe 'descriptor metrics' do
|
173
|
+
before(:each) do
|
174
|
+
@scout_scout.stub_get('clients/13431.xml', 'client.xml')
|
175
|
+
@server = ScoutScout::Server.first(13431)
|
176
|
+
@scout_scout.stub_get('clients/13431/plugins.xml', 'plugins.xml')
|
177
|
+
@plugins = @server.plugins
|
178
|
+
@scout_scout.stub_get('data/value?descriptor=passenger_process_active&function=AVG&consolidate=SUM&host=foobar.com&start=&end=&','data.xml')
|
179
|
+
@metric = @plugins.first.descriptors.first.average
|
180
|
+
end
|
181
|
+
it "should be a ScoutScout::Metric object" do
|
182
|
+
@metric.class.should == ScoutScout::Metric
|
183
|
+
end
|
184
|
+
it "should contain the value" do
|
185
|
+
@metric.value.should == '31.10'
|
186
|
+
end
|
187
|
+
end
|
134
188
|
end
|
135
189
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scout_scout
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jesse Newland
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-
|
12
|
+
date: 2010-02-24 00:00:00 -05:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -69,14 +69,18 @@ files:
|
|
69
69
|
- Rakefile
|
70
70
|
- lib/scout_scout.rb
|
71
71
|
- lib/scout_scout/alert.rb
|
72
|
-
- lib/scout_scout/
|
72
|
+
- lib/scout_scout/cluster.rb
|
73
73
|
- lib/scout_scout/descriptor.rb
|
74
|
+
- lib/scout_scout/metric.rb
|
74
75
|
- lib/scout_scout/plugin.rb
|
76
|
+
- lib/scout_scout/server.rb
|
75
77
|
- lib/scout_scout/version.rb
|
76
78
|
- spec/fixtures/activities.xml
|
77
79
|
- spec/fixtures/client.xml
|
78
80
|
- spec/fixtures/client_by_hostname.xml
|
79
81
|
- spec/fixtures/clients.xml
|
82
|
+
- spec/fixtures/data.xml
|
83
|
+
- spec/fixtures/descriptors.xml
|
80
84
|
- spec/fixtures/plugin_data.xml
|
81
85
|
- spec/fixtures/plugins.xml
|
82
86
|
- spec/scout_scout_spec.rb
|
data/lib/scout_scout/client.rb
DELETED
@@ -1,53 +0,0 @@
|
|
1
|
-
class ScoutScout::Client < Hashie::Mash
|
2
|
-
def initialize(hash)
|
3
|
-
if hash['active_alerts']
|
4
|
-
@alert_hash = hash['active_alerts']
|
5
|
-
hash.delete('active_alerts')
|
6
|
-
end
|
7
|
-
super(hash)
|
8
|
-
end
|
9
|
-
|
10
|
-
# Search for a client by id or hostname
|
11
|
-
#
|
12
|
-
# @return [ScoutScout::Client]
|
13
|
-
def self.find(client_id_or_hostname)
|
14
|
-
if client_id_or_hostname.is_a?(Fixnum)
|
15
|
-
response = ScoutScout.get("/#{ScoutScout.account}/clients/#{client_id_or_hostname}.xml")
|
16
|
-
ScoutScout::Client.new(response['client'])
|
17
|
-
else
|
18
|
-
response = ScoutScout.get("/#{ScoutScout.account}/clients.xml?host=#{client_id_or_hostname}")
|
19
|
-
ScoutScout::Client.new(response['clients'].first)
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
# Active alerts for this client
|
24
|
-
#
|
25
|
-
# @return [Array] An array of ScoutScout::Alert objects
|
26
|
-
def active_alerts
|
27
|
-
@active_alerts ||= @alert_hash.map { |a| ScoutScout::Alert.new(a) }
|
28
|
-
end
|
29
|
-
|
30
|
-
# Recent alerts for this client
|
31
|
-
#
|
32
|
-
# @return [Array] An array of ScoutScout::Alert objects
|
33
|
-
def alerts
|
34
|
-
response = ScoutScout.get("/#{ScoutScout.account}/clients/#{self.id}/activities.xml")
|
35
|
-
response['alerts'].map { |alert| ScoutScout::Alert.new(alert) }
|
36
|
-
end
|
37
|
-
|
38
|
-
# Details about all plugins for this client
|
39
|
-
#
|
40
|
-
# @return [Array] An array of ScoutScout::Plugin objects
|
41
|
-
def plugins
|
42
|
-
response = ScoutScout.get("/#{ScoutScout.account}/clients/#{self.id}/plugins.xml")
|
43
|
-
response['plugins'].map { |plugin| ScoutScout::Plugin.new(plugin) }
|
44
|
-
end
|
45
|
-
|
46
|
-
# Details about a specific plugin
|
47
|
-
#
|
48
|
-
# @return [ScoutScout::Plugin]
|
49
|
-
def plugin(id)
|
50
|
-
response = ScoutScout.get("/#{ScoutScout.account}/clients/#{self.id}/plugins/#{id}.xml")
|
51
|
-
ScoutScout::Plugin.new(response['plugin'])
|
52
|
-
end
|
53
|
-
end
|