scout_scout 0.0.3 → 0.0.4
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.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
|