overwatch 0.0.3.pre

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.
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color --drb --format doc
data/.watchr ADDED
@@ -0,0 +1,22 @@
1
+ def run_spec(file)
2
+ unless File.exist?(file)
3
+ puts "#{file} does not exist"
4
+ return
5
+ end
6
+
7
+ puts "Running #{file}"
8
+ system "bundle exec rspec #{file}"
9
+ puts
10
+ end
11
+
12
+ watch("spec/.*/*_spec\.rb") do |match|
13
+ run_spec match[0]
14
+ end
15
+
16
+ watch("lib/(.*/.*)\.rb") do |match|
17
+ run_spec %{spec/#{match[1]}_spec.rb}
18
+ end
19
+
20
+ watch("lib/monitaur.rb") do |match|
21
+ run_spec %{spec/monitaur_spec.rb}
22
+ end
data/Gemfile ADDED
@@ -0,0 +1,18 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'rest-client', '>= 1.6.3'
4
+ gem 'json', '>= 1.5.1'
5
+ gem 'ohai', '>= 0.6.4'
6
+ # gem 'SystemTimer', :require => 'system_timer'
7
+
8
+ group :development do
9
+ gem "rspec", ">= 2.5.0"
10
+ gem "yard", ">= 0.6.0"
11
+ gem "bundler", ">= 1.0.0"
12
+ gem "jeweler", ">= 1.5.2"
13
+ gem "watchr"
14
+ gem 'spork', '>= 0.9.0.rc'
15
+ gem 'fuubar'
16
+ gem 'fakefs', :git => 'git://github.com/danryan/fakefs.git'
17
+ gem 'webmock'
18
+ end
@@ -0,0 +1,70 @@
1
+ GIT
2
+ remote: git://github.com/danryan/fakefs.git
3
+ revision: 95f4ef407909641218594c51002524a5cc72ab8b
4
+ specs:
5
+ fakefs (0.3.1)
6
+
7
+ GEM
8
+ remote: http://rubygems.org/
9
+ specs:
10
+ addressable (2.2.6)
11
+ crack (0.1.8)
12
+ diff-lcs (1.1.2)
13
+ fuubar (0.0.5)
14
+ rspec (~> 2.0)
15
+ rspec-instafail (~> 0.1.4)
16
+ ruby-progressbar (~> 0.0.10)
17
+ git (1.2.5)
18
+ jeweler (1.6.3)
19
+ bundler (~> 1.0)
20
+ git (>= 1.2.5)
21
+ rake
22
+ json (1.5.3)
23
+ mime-types (1.16)
24
+ mixlib-cli (1.2.0)
25
+ mixlib-config (1.1.2)
26
+ mixlib-log (1.3.0)
27
+ ohai (0.6.4)
28
+ mixlib-cli
29
+ mixlib-config
30
+ mixlib-log
31
+ systemu
32
+ yajl-ruby
33
+ rake (0.9.2)
34
+ rest-client (1.6.3)
35
+ mime-types (>= 1.16)
36
+ rspec (2.6.0)
37
+ rspec-core (~> 2.6.0)
38
+ rspec-expectations (~> 2.6.0)
39
+ rspec-mocks (~> 2.6.0)
40
+ rspec-core (2.6.4)
41
+ rspec-expectations (2.6.0)
42
+ diff-lcs (~> 1.1.2)
43
+ rspec-instafail (0.1.8)
44
+ rspec-mocks (2.6.0)
45
+ ruby-progressbar (0.0.10)
46
+ spork (0.9.0.rc9)
47
+ systemu (2.2.0)
48
+ watchr (0.7)
49
+ webmock (1.6.4)
50
+ addressable (~> 2.2, > 2.2.5)
51
+ crack (>= 0.1.7)
52
+ yajl-ruby (0.8.2)
53
+ yard (0.7.2)
54
+
55
+ PLATFORMS
56
+ ruby
57
+
58
+ DEPENDENCIES
59
+ bundler (>= 1.0.0)
60
+ fakefs!
61
+ fuubar
62
+ jeweler (>= 1.5.2)
63
+ json (>= 1.5.1)
64
+ ohai (>= 0.6.4)
65
+ rest-client (>= 1.6.3)
66
+ rspec (>= 2.5.0)
67
+ spork (>= 0.9.0.rc)
68
+ watchr
69
+ webmock
70
+ yard (>= 0.6.0)
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Dan Ryan
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,29 @@
1
+ # overwatch-client
2
+
3
+ Client for the Overwatch monitoring service
4
+
5
+ ## Installation
6
+
7
+ The client is installed via rubygems
8
+
9
+ gem install overwatch
10
+
11
+ This creates the executable `overwatch`. Currently there is no daemon, so you can run it as a cron job:
12
+
13
+ * * * * * overwatch <api key>
14
+
15
+ ## Plugins
16
+
17
+ Plugins are stored client-side for ease of deployment by your configuration management service. See the Plugin wiki for more info.
18
+
19
+ ## Client run
20
+
21
+ * Client compiles the plugins and executes each, storing the result of each into a hash
22
+ * Client sends the resultant hash to the server for processing.
23
+ * That's it!
24
+
25
+ ## Copyright
26
+
27
+ Copyright (c) 2011 Dan Ryan. See LICENSE.txt for
28
+ further details.
29
+
@@ -0,0 +1,50 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
+ gem.name = "overwatch"
16
+ gem.homepage = "http://github.com/danryan/overwatch-client"
17
+ gem.license = "MIT"
18
+ gem.summary = %Q{Client for Overwatch monitoring service}
19
+ gem.description = %Q{The client to communicate with the Overwatch monitoring service}
20
+ gem.email = "hi@iamdanryan.com"
21
+ gem.authors = ["Dan Ryan"]
22
+ gem.executables = ["overwatch"]
23
+
24
+ # Include your dependencies below. Runtime dependencies are required when using your gem,
25
+ # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
26
+ # gem.add_runtime_dependency 'jabber4r', '> 0.1'
27
+ # gem.add_development_dependency 'rspec', '> 1.2.3'
28
+ end
29
+ Jeweler::RubygemsDotOrgTasks.new
30
+
31
+ require 'rspec/core'
32
+ require 'rspec/core/rake_task'
33
+ RSpec::Core::RakeTask.new(:spec) do |spec|
34
+ spec.pattern = FileList['spec/**/*_spec.rb']
35
+ end
36
+
37
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
38
+ spec.pattern = 'spec/**/*_spec.rb'
39
+ spec.rcov = true
40
+ end
41
+
42
+ task :default => :spec
43
+
44
+ require 'yard'
45
+ YARD::Rake::YardocTask.new
46
+
47
+ desc "Run watchr"
48
+ task :watchr do
49
+ sh %{bundle exec watchr .watchr}
50
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.3.pre
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require 'rubygems'
5
+
6
+ $LOAD_PATH << File.join(File.dirname(__FILE__), *%w[.. lib])
7
+
8
+ require 'overwatch'
9
+ require 'overwatch/client'
10
+
11
+ raise "You must supply an agent key as the first argument" unless ARGV[0]
12
+ api_key = ARGV[0]
13
+
14
+ begin
15
+ Overwatch.run api_key
16
+ rescue => e
17
+ puts e
18
+ end
@@ -0,0 +1,106 @@
1
+ require 'logger'
2
+ require 'fileutils'
3
+ require 'rest-client'
4
+ require 'yajl'
5
+
6
+ require 'overwatch/client'
7
+
8
+ module Overwatch
9
+ VERSION = IO.read(File.join(File.dirname(File.expand_path(__FILE__)), "../VERSION"))
10
+
11
+ class << self
12
+ attr_accessor :log_file_path, :config_dir, :raw_config,
13
+ :config_file_path, :env, :cache_dir
14
+
15
+ def run(api_key)
16
+ # Overwatch.install
17
+ Overwatch::Client.new(api_key).run
18
+ end
19
+
20
+ # def install
21
+ # create_base_dir
22
+ # create_log_file
23
+ # create_cache_dir
24
+ # create_plugin_dir
25
+ # create_config_dir
26
+ # generate_client_config unless File.exist?(config_file_path)
27
+ # end
28
+ #
29
+ # def env=(environment)
30
+ # @env = environment
31
+ # end
32
+ #
33
+ # def env
34
+ # @env ||= "production"
35
+ # end
36
+ #
37
+ # def base_dir
38
+ # @base_dir ||= "#{ENV['HOME']}/.overwatch"
39
+ # end
40
+ #
41
+ # def log
42
+ # @log ||= Logger.new(log_file_path)
43
+ # end
44
+ #
45
+ # def log_file_path
46
+ # @log_file_path ||= File.join(base_dir, "client.log")
47
+ # end
48
+ #
49
+ # def config_dir
50
+ # @config_dir ||= File.join(base_dir, "")
51
+ # end
52
+ #
53
+ # def cache_dir
54
+ # @cache_dir ||= File.join(base_dir, "cache")
55
+ # end
56
+ #
57
+ # def plugin_dir
58
+ # @plugin_dir ||= File.join(cache_dir, "plugins")
59
+ # end
60
+ #
61
+
62
+ def plugin_path
63
+ @plugin_path ||= File.expand_path(File.join(File.dirname(__FILE__), "../plugins"))
64
+ end
65
+
66
+ #
67
+ # def config_file_path
68
+ # @config_file_path ||= File.join(base_dir, "config.yml")
69
+ # end
70
+ #
71
+ # def raw_config
72
+ # @raw_config ||= IO.read(config_file_path)
73
+ # end
74
+ #
75
+ # def create_log_file
76
+ # FileUtils.touch(log_file_path)
77
+ # end
78
+ #
79
+ # def create_base_dir
80
+ # FileUtils.mkdir_p(base_dir)
81
+ # end
82
+ #
83
+ # def create_config_dir
84
+ # FileUtils.mkdir_p(config_dir)
85
+ # end
86
+ #
87
+ # def create_cache_dir
88
+ # FileUtils.mkdir_p(cache_dir)
89
+ # end
90
+ #
91
+ # def create_plugin_dir
92
+ # FileUtils.mkdir_p(plugin_dir)
93
+ # end
94
+ #
95
+ # def generate_client_config
96
+ # File.open(config_file_path, "w") do |file|
97
+ # file.puts(%q{server_url: http://api.overwatchapp.com})
98
+ # file.puts(%q{client_key: CHANGEME})
99
+ # end
100
+ # end
101
+ #
102
+ # def raw_config
103
+ # @raw_config ||= IO.read(config_file_path)
104
+ # end
105
+ end
106
+ end
@@ -0,0 +1,38 @@
1
+ require 'overwatch/mixin'
2
+ require 'yaml'
3
+ require 'ohai'
4
+
5
+ module Overwatch
6
+ class Client
7
+ attr_accessor :logger, :server_url, :config, :raw_config,
8
+ :plugin_manifest, :api_key, :data
9
+
10
+ def initialize(api_key)
11
+ @ohai = Ohai::System.new
12
+ @api_key = api_key
13
+ Ohai::Config[:plugin_path] << Overwatch.plugin_path unless Ohai::Config[:plugin_path].include?(Overwatch.plugin_path)
14
+ end
15
+
16
+ def run
17
+ all_plugins
18
+ post_data
19
+ end
20
+
21
+ def all_plugins
22
+ @ohai.all_plugins
23
+ end
24
+
25
+ def post_data
26
+ res = RestClient.post(
27
+ "http://overwat.ch:9292/nodes/#{api_key}",
28
+ Yajl.dump(data),
29
+ { 'Content-Type' => 'application/json' }
30
+ )
31
+ puts res.body
32
+ end
33
+
34
+ def data
35
+ @ohai.data
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,99 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{overwatch}
8
+ s.version = "0.0.3.pre"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Dan Ryan"]
12
+ s.date = %q{2011-07-01}
13
+ s.default_executable = %q{overwatch}
14
+ s.description = %q{The client to communicate with the Overwatch monitoring service}
15
+ s.email = %q{hi@iamdanryan.com}
16
+ s.executables = ["overwatch"]
17
+ s.extra_rdoc_files = [
18
+ "LICENSE.txt",
19
+ "README.md"
20
+ ]
21
+ s.files = [
22
+ ".document",
23
+ ".rspec",
24
+ ".watchr",
25
+ "Gemfile",
26
+ "Gemfile.lock",
27
+ "LICENSE.txt",
28
+ "README.md",
29
+ "Rakefile",
30
+ "VERSION",
31
+ "bin/overwatch",
32
+ "lib/overwatch.rb",
33
+ "lib/overwatch/client.rb",
34
+ "overwatch.gemspec",
35
+ "plugins/load_average.rb",
36
+ "plugins/mongodb.rb",
37
+ "plugins/mysql.rb",
38
+ "plugins/nginx.rb",
39
+ "plugins/redis.rb",
40
+ "spec/monitaur/client_spec.rb",
41
+ "spec/monitaur_spec.rb",
42
+ "spec/spec_helper.rb",
43
+ "spec/support/bar_plugin.rb",
44
+ "spec/support/client_requests.rb",
45
+ "spec/support/foo_plugin.rb",
46
+ "spec/support/test.rb"
47
+ ]
48
+ s.homepage = %q{http://github.com/danryan/overwatch-client}
49
+ s.licenses = ["MIT"]
50
+ s.require_paths = ["lib"]
51
+ s.rubygems_version = %q{1.6.2}
52
+ s.summary = %q{Client for Overwatch monitoring service}
53
+
54
+ if s.respond_to? :specification_version then
55
+ s.specification_version = 3
56
+
57
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
58
+ s.add_runtime_dependency(%q<rest-client>, [">= 1.6.3"])
59
+ s.add_runtime_dependency(%q<json>, [">= 1.5.1"])
60
+ s.add_runtime_dependency(%q<ohai>, [">= 0.6.4"])
61
+ s.add_development_dependency(%q<rspec>, [">= 2.5.0"])
62
+ s.add_development_dependency(%q<yard>, [">= 0.6.0"])
63
+ s.add_development_dependency(%q<bundler>, [">= 1.0.0"])
64
+ s.add_development_dependency(%q<jeweler>, [">= 1.5.2"])
65
+ s.add_development_dependency(%q<watchr>, [">= 0"])
66
+ s.add_development_dependency(%q<spork>, [">= 0.9.0.rc"])
67
+ s.add_development_dependency(%q<fuubar>, [">= 0"])
68
+ s.add_development_dependency(%q<fakefs>, [">= 0"])
69
+ s.add_development_dependency(%q<webmock>, [">= 0"])
70
+ else
71
+ s.add_dependency(%q<rest-client>, [">= 1.6.3"])
72
+ s.add_dependency(%q<json>, [">= 1.5.1"])
73
+ s.add_dependency(%q<ohai>, [">= 0.6.4"])
74
+ s.add_dependency(%q<rspec>, [">= 2.5.0"])
75
+ s.add_dependency(%q<yard>, [">= 0.6.0"])
76
+ s.add_dependency(%q<bundler>, [">= 1.0.0"])
77
+ s.add_dependency(%q<jeweler>, [">= 1.5.2"])
78
+ s.add_dependency(%q<watchr>, [">= 0"])
79
+ s.add_dependency(%q<spork>, [">= 0.9.0.rc"])
80
+ s.add_dependency(%q<fuubar>, [">= 0"])
81
+ s.add_dependency(%q<fakefs>, [">= 0"])
82
+ s.add_dependency(%q<webmock>, [">= 0"])
83
+ end
84
+ else
85
+ s.add_dependency(%q<rest-client>, [">= 1.6.3"])
86
+ s.add_dependency(%q<json>, [">= 1.5.1"])
87
+ s.add_dependency(%q<ohai>, [">= 0.6.4"])
88
+ s.add_dependency(%q<rspec>, [">= 2.5.0"])
89
+ s.add_dependency(%q<yard>, [">= 0.6.0"])
90
+ s.add_dependency(%q<bundler>, [">= 1.0.0"])
91
+ s.add_dependency(%q<jeweler>, [">= 1.5.2"])
92
+ s.add_dependency(%q<watchr>, [">= 0"])
93
+ s.add_dependency(%q<spork>, [">= 0.9.0.rc"])
94
+ s.add_dependency(%q<fuubar>, [">= 0"])
95
+ s.add_dependency(%q<fakefs>, [">= 0"])
96
+ s.add_dependency(%q<webmock>, [">= 0"])
97
+ end
98
+ end
99
+
@@ -0,0 +1,8 @@
1
+ provides "load_average"
2
+ load_average Mash.new
3
+
4
+ raw_load_averages = %x[uptime|cut -d: -f4].strip.split(" ")
5
+
6
+ load_average[:one_minute] = raw_load_averages[0]
7
+ load_average[:five_minutes] = raw_load_averages[1]
8
+ load_average[:fifteen_minutes] = raw_load_averages[2]
@@ -0,0 +1,113 @@
1
+ provides "mongo"
2
+ mongo Mash.new
3
+
4
+ begin
5
+ require 'mongo'
6
+ rescue LoadError => e
7
+ Ohai::Log.warn e.message
8
+ end
9
+
10
+ connection = Mongo::Connection.new
11
+ server_stats = connection.db("local").command('serverStatus' => 1)
12
+
13
+ mongo[:version] = server_stats['version']
14
+ mongo[:uptime] = server_stats['uptime']
15
+ mongo[:host] = server_stats['host']
16
+ mongo[:uptime_estimate] = server_stats['uptimeEstimate']
17
+
18
+ # DB stats
19
+ mongo[:databases] = {}
20
+ connection.database_names.map(&:to_sym).each do |db_name|
21
+ stats = connection.db(db_name).stats
22
+ mongo[:databases][db_name] = Mash.new
23
+ mongo[:databases][db_name][:collections] = stats['collections']
24
+ mongo[:databases][db_name][:objects] = stats['objects']
25
+ mongo[:databases][db_name][:indexes] = stats['indexes']
26
+ mongo[:databases][db_name][:data_size] = stats['dataSize']
27
+ mongo[:databases][db_name][:storage_size] = stats['storageSize']
28
+ mongo[:databases][db_name][:file_size] = stats['fileSize']
29
+ mongo[:databases][db_name][:avg_obj_size] = stats['avgObjSize']
30
+ mongo[:databases][db_name][:index_size] = stats['indexSize']
31
+ mongo[:databases][db_name][:num_extents] = stats['numExtents']
32
+ end
33
+
34
+ # Connections
35
+ mongo[:connections] = Mash.new
36
+ mongo[:connections][:current] = server_stats['connections']['current']
37
+ mongo[:connections][:available] = server_stats['connections']['available']
38
+
39
+ # Memory usage
40
+ mongo[:memory] = Mash.new
41
+ mongo[:memory][:resident] = server_stats['mem']['resident']
42
+ mongo[:memory][:virtual] = server_stats['mem']['virtual']
43
+ mongo[:memory][:supported] = server_stats['mem']['supported']
44
+ mongo[:memory][:mapped] = server_stats['mem']['mapped']
45
+
46
+ # Global lock
47
+ mongo[:global_lock] = Mash.new
48
+ mongo[:global_lock][:ratio] = server_stats['globalLock']['ratio']
49
+ mongo[:global_lock][:current_queue] = Mash.new
50
+ mongo[:global_lock][:current_queue][:total] = server_stats['globalLock']['currentQueue']['total']
51
+ mongo[:global_lock][:current_queue][:readers] = server_stats['globalLock']['currentQueue']['readers']
52
+ mongo[:global_lock][:current_queue][:writers] = server_stats['globalLock']['currentQueue']['writers']
53
+ mongo[:global_lock][:active_clients] = Mash.new
54
+ mongo[:global_lock][:active_clients][:total] = server_stats['globalLock']['activeClients']['total']
55
+ mongo[:global_lock][:active_clients][:readers] = server_stats['globalLock']['activeClients']['readers']
56
+ mongo[:global_lock][:active_clients][:writers] = server_stats['globalLock']['activeClients']['writers']
57
+
58
+
59
+ # Index counters
60
+ mongo[:index_counters] = Mash.new
61
+ mongo[:index_counters][:accesses] = server_stats['indexCounters']['btree']['accesses']
62
+ mongo[:index_counters][:hits] = server_stats['indexCounters']['btree']['hits']
63
+ mongo[:index_counters][:misses] = server_stats['indexCounters']['btree']['misses']
64
+ mongo[:index_counters][:resets] = server_stats['indexCounters']['btree']['resets']
65
+ mongo[:index_counters][:miss_ratio] = server_stats['indexCounters']['btree']['missRatio']
66
+
67
+ # Background flushing
68
+ mongo[:background_flushing] = Mash.new
69
+ mongo[:background_flushing][:flushes] = server_stats['backgroundFlushing']['flushes']
70
+ mongo[:background_flushing][:total_ms] = server_stats['backgroundFlushing']['average_ms']
71
+ mongo[:background_flushing][:last_ms] = server_stats['backgroundFlushing']['last_ms']
72
+ mongo[:background_flushing][:last_finished] = server_stats['backgroundFlushing']['last_finished'].to_s
73
+
74
+ # Op counters
75
+ mongo[:op_counters] = Mash.new
76
+ mongo[:op_counters][:insert] = server_stats['opcounters']['insert']
77
+ mongo[:op_counters][:query] = server_stats['opcounters']['query']
78
+ mongo[:op_counters][:update] = server_stats['opcounters']['update']
79
+ mongo[:op_counters][:delete] = server_stats['opcounters']['delete']
80
+ mongo[:op_counters][:getmore] = server_stats['opcounters']['getmore']
81
+ mongo[:op_counters][:command] = server_stats['opcounters']['command']
82
+
83
+ # Asserts
84
+ mongo[:asserts] = Mash.new
85
+ mongo[:asserts][:regular] = server_stats['asserts']['regular']
86
+ mongo[:asserts][:warning] = server_stats['asserts']['warning']
87
+ mongo[:asserts][:msg] = server_stats['asserts']['msg']
88
+ mongo[:asserts][:user] = server_stats['asserts']['user']
89
+ mongo[:asserts][:rollovers] = server_stats['asserts']['rollovers']
90
+
91
+ # Network
92
+ mongo[:network] = Mash.new
93
+ mongo[:network][:bytes_in] = server_stats['network']['bytesIn']
94
+ mongo[:network][:bytes_out] = server_stats['network']['bytesOut']
95
+ mongo[:network][:num_requests] = server_stats['network']['numRequests']
96
+
97
+ # Replica Set
98
+
99
+ begin
100
+ admin = connection.db("admin")
101
+ repl_stats = admin.command('replSetGetStatus' => 1)
102
+ rescue Mongo::OperationFailure => e
103
+ Ohai::Log.warn e.message
104
+ end
105
+
106
+ mongo[:repl_set] = Mash.new
107
+ mongo[:repl_set][:set] = repl_set['set']
108
+ mongo[:repl_set][:date] = repl_set['date']
109
+ mongo[:repl_set][:my_state] = repl_set['myState']
110
+ mongo[:repl_set][:members] = []
111
+ repl_set['members'].each do |member|
112
+ mongo[:repl_set][:members] << member.symbolize_keys
113
+ end
@@ -0,0 +1,152 @@
1
+ provides "mysql"
2
+ mysql Mash.new
3
+
4
+ begin
5
+ require 'mysql'
6
+ rescue LoadError => e
7
+ Ohai::Log.warn e.message
8
+ end
9
+
10
+ user = nil
11
+ passwd = nil
12
+ port = nil
13
+ connection = Mysql.connect("localhost", user, passwd, nil, port )
14
+
15
+ global_status = Mash.new
16
+
17
+ raw_status = connection.query("SHOW GLOBAL STATUS")
18
+ raw_status.each do |row|
19
+ global_status[row.first] = row.last.to_i
20
+ end
21
+
22
+ variables = Mash.new
23
+
24
+ raw_variables = connection.query("SHOW VARIABLES")
25
+ raw_variables.each do |row|
26
+ variables[row.first] = row.last.to_i
27
+ end
28
+
29
+ mysql[:max_used_connections] = global_status['Max_used_connections']
30
+ mysql[:connections] = global_status['Connections']
31
+ mysql[:slow_queries] = global_status['Slow_queries']
32
+
33
+ # Threads
34
+ mysql[:threads_cached] = global_status['Threads_cached']
35
+ mysql[:threads_connected] = global_status['Threads_connected']
36
+ mysql[:threads_created] = global_status['Threads_created']
37
+ mysql[:threads_running] = global_status['Threads_running']
38
+
39
+ # Errors
40
+ mysql[:aborted_clients] = global_status['Aborted_clients']
41
+ mysql[:aborted_connects] = global_status['Aborted_connects']
42
+
43
+ # Network
44
+
45
+ mysql[:bytes_received] = global_status['Bytes_received']
46
+ mysql[:bytes_sent] = global_status['Bytes_sent']
47
+
48
+ # Temp tables
49
+
50
+ mysql[:created_tmp_disk_tables] = global_status["Created_tmp_disk_tables"]
51
+ mysql[:created_tmp_files] = global_status["Created_tmp_files"]
52
+ mysql[:created_tmp_tables] = global_status["Created_tmp_tables"]
53
+
54
+ mysql[:table_locks_waited] = global_status["Table_locks_waited"]
55
+
56
+ # InnoDB
57
+
58
+ mysql[:innodb_buffer_pool_pages_data] = global_status["Innodb_buffer_pool_pages_dirty"]
59
+ mysql[:innodb_buffer_pool_pages_dirty] = global_status["Innodb_buffer_pool_pages_flushed"]
60
+ mysql[:innodb_buffer_pool_pages_flushed] = global_status["Innodb_buffer_pool_pages_free"]
61
+ mysql[:innodb_buffer_pool_pages_free] = global_status["Innodb_buffer_pool_pages_misc"]
62
+ mysql[:innodb_buffer_pool_pages_misc] = global_status["Innodb_buffer_pool_pages_total"]
63
+ mysql[:innodb_buffer_pool_pages_total] = global_status["Innodb_buffer_pool_read_ahead"]
64
+ mysql[:innodb_buffer_pool_read_ahead] = global_status["Innodb_buffer_pool_read_ahead_evicted"]
65
+ mysql[:innodb_buffer_pool_read_ahead_evicted] = global_status["Innodb_buffer_pool_read_requests"]
66
+ mysql[:innodb_buffer_pool_read_requests] = global_status["Innodb_buffer_pool_reads"]
67
+ mysql[:innodb_buffer_pool_reads] = global_status["Innodb_buffer_pool_wait_free"]
68
+ mysql[:innodb_buffer_pool_wait_free] = global_status["Innodb_buffer_pool_write_requests"]
69
+ mysql[:innodb_buffer_pool_write_requests] = global_status["Innodb_data_fsyncs"]
70
+ mysql[:innodb_data_fsyncs] = global_status["Innodb_data_pending_fsyncs"]
71
+ mysql[:innodb_data_pending_fsyncs] = global_status["Innodb_data_pending_reads"]
72
+ mysql[:innodb_data_pending_reads] = global_status["Innodb_data_pending_writes"]
73
+ mysql[:innodb_data_pending_writes] = global_status["Innodb_data_read"]
74
+ mysql[:innodb_data_read] = global_status["Innodb_data_reads"]
75
+ mysql[:innodb_data_reads] = global_status["Innodb_data_writes"]
76
+ mysql[:innodb_data_writes] = global_status["Innodb_data_written"]
77
+ mysql[:innodb_data_written] = global_status["Innodb_dblwr_pages_written"]
78
+ mysql[:innodb_dblwr_pages_written] = global_status["Innodb_dblwr_writes"]
79
+ mysql[:innodb_dblwr_writes] = global_status["Innodb_have_atomic_builtins"]
80
+ mysql[:innodb_have_atomic_builtins] = global_status["Innodb_log_waits"]
81
+ mysql[:innodb_log_waits] = global_status["Innodb_log_write_requests"]
82
+ mysql[:innodb_log_write_requests] = global_status["Innodb_log_writes"]
83
+ mysql[:innodb_log_writes] = global_status["Innodb_os_log_fsyncs"]
84
+ mysql[:innodb_os_log_fsyncs] = global_status["Innodb_os_log_pending_fsyncs"]
85
+ mysql[:innodb_os_log_pending_fsyncs] = global_status["Innodb_os_log_pending_writes"]
86
+ mysql[:innodb_os_log_pending_writes] = global_status["Innodb_os_log_written"]
87
+ mysql[:innodb_os_log_written] = global_status["Innodb_page_size"]
88
+ mysql[:innodb_page_size] = global_status["Innodb_pages_created"]
89
+ mysql[:innodb_pages_created] = global_status["Innodb_pages_read"]
90
+ mysql[:innodb_pages_read] = global_status["Innodb_pages_written"]
91
+ mysql[:innodb_pages_written] = global_status["Innodb_row_lock_current_waits"]
92
+ mysql[:innodb_row_lock_current_waits] = global_status["Innodb_row_lock_time"]
93
+ mysql[:innodb_row_lock_time] = global_status["Innodb_row_lock_time_avg"]
94
+ mysql[:innodb_row_lock_time_avg] = global_status["Innodb_row_lock_time_max"]
95
+ mysql[:innodb_row_lock_time_max] = global_status["Innodb_row_lock_waits"]
96
+ mysql[:innodb_row_lock_waits] = global_status["Innodb_rows_deleted"]
97
+ mysql[:innodb_rows_deleted] = global_status["Innodb_rows_inserted"]
98
+ mysql[:innodb_rows_inserted] = global_status["Innodb_rows_read"]
99
+ mysql[:innodb_rows_read] = global_status["Innodb_rows_updated"]
100
+ mysql[:innodb_rows_updated] = global_status["Innodb_truncated_status_writes"]
101
+ mysql[:innodb_truncated_status_writes] = global_status["Innodb_buffer_pool_pages_data"]
102
+
103
+ # Qcache
104
+ mysql[:qcache_free_blocks] = global_status["Qcache_free_blocks"]
105
+ mysql[:qcache_free_memory] = global_status["Qcache_free_memory"]
106
+ mysql[:qcache_hits] = global_status["Qcache_hits"]
107
+ mysql[:qcache_inserts] = global_status["Qcache_inserts"]
108
+ mysql[:qcache_lowmem_prunes] = global_status["Qcache_lowmem_prunes"]
109
+ mysql[:qcache_not_cached] = global_status["Qcache_not_cached"]
110
+ mysql[:qcache_queries_in_cache] = global_status["Qcache_queries_in_cache"]
111
+ mysql[:qcache_total_blocks] = global_status["Qcache_total_blocks"]
112
+
113
+ # Keys
114
+ mysql[:key_blocks_not_flushed] = global_status["Key_blocks_not_flushed"]
115
+ mysql[:key_blocks_unused] = global_status["Key_blocks_unused"]
116
+ mysql[:key_blocks_used] = global_status["Key_blocks_used"]
117
+ mysql[:key_read_requests] = global_status["Key_read_requests"]
118
+ mysql[:key_reads] = global_status["Key_reads"]
119
+ mysql[:key_write_requests] = global_status["Key_write_requests"]
120
+ mysql[:key_writes] = global_status["Key_writes"]
121
+
122
+ ## VARIABLES
123
+
124
+ # Binlog
125
+ mysql[:binlog_cache_size] = variables["binlog_cache_size"]
126
+ mysql[:binlog_direct_non_transactional_updates] = variables["binlog_direct_non_transactional_updates"]
127
+ mysql[:binlog_format] = variables["binlog_format"]
128
+ mysql[:binlog_stmt_cache_size] = variables["binlog_stmt_cache_size"]
129
+
130
+ # Max
131
+
132
+ mysql[:max_allowed_packet] = variables["max_allowed_packet"]
133
+ mysql[:max_binlog_cache_size] = variables["max_binlog_cache_size"]
134
+ mysql[:max_binlog_size] = variables["max_binlog_size"]
135
+ mysql[:max_binlog_stmt_cache_size] = variables["max_binlog_stmt_cache_size"]
136
+ mysql[:max_connect_errors] = variables["max_connect_errors"]
137
+ mysql[:max_connections] = variables["max_connections"]
138
+ mysql[:max_delayed_threads] = variables["max_delayed_threads"]
139
+ mysql[:max_error_count] = variables["max_error_count"]
140
+ mysql[:max_heap_table_size] = variables["max_heap_table_size"]
141
+ mysql[:max_insert_delayed_threads] = variables["max_insert_delayed_threads"]
142
+ mysql[:max_join_size] = variables["max_join_size"]
143
+ mysql[:max_length_for_sort_data] = variables["max_length_for_sort_data"]
144
+ mysql[:max_long_data_size] = variables["max_long_data_size"]
145
+ mysql[:max_prepared_stmt_count] = variables["max_prepared_stmt_count"]
146
+ mysql[:max_relay_log_size] = variables["max_relay_log_size"]
147
+ mysql[:max_seeks_for_key] = variables["max_seeks_for_key"]
148
+ mysql[:max_sort_length] = variables["max_sort_length"]
149
+ mysql[:max_sp_recursion_depth] = variables["max_sp_recursion_depth"]
150
+ mysql[:max_tmp_tables] = variables["max_tmp_tables"]
151
+ mysql[:max_user_connections] = variables["max_user_connections"]
152
+ mysql[:max_write_lock_count] = variables["max_write_lock_count"]
File without changes
@@ -0,0 +1,52 @@
1
+ provides "redis"
2
+ redis Mash.new
3
+
4
+ begin
5
+ require 'redis'
6
+ require 'system_timer'
7
+ rescue LoadError => e
8
+ Ohai::Log.warn e.message
9
+ end
10
+
11
+ port = 6379
12
+ info = Mash.new(Redis.new(:port => port).info).symbolize_keys
13
+
14
+ redis[:version] = info[:redis_version]
15
+ redis[:arch_bits] = info[:arch_bits]
16
+ redis[:multiplexing_api] = info[:multiplexing_api]
17
+ redis[:process_id] = info[:process_id]
18
+ redis[:uptime_in_seconds] = info[:uptime_in_seconds]
19
+ redis[:uptime_in_days] = info[:uptime_in_days]
20
+ redis[:lru_clock] = info[:lru_clock]
21
+ redis[:used_cpu_sys] = info[:used_cpu_sys]
22
+ redis[:used_cpu_user] = info[:used_cpu_user]
23
+ redis[:used_cpu_sys_childrens] = info[:used_cpu_sys_childrens]
24
+ redis[:used_cpu_user_childrens] = info[:used_cpu_user_childrens]
25
+ redis[:connected_clients] = info[:connected_clients]
26
+ redis[:connected_slaves] = info[:connected_slaves]
27
+ redis[:client_longest_output_list] = info[:client_longest_output_list]
28
+ redis[:client_biggest_input_buf] = info[:client_biggest_input_buf]
29
+ redis[:blocked_clients] = info[:blocked_clients]
30
+ redis[:used_memory] = info[:used_memory]
31
+ redis[:used_memory_human] = info[:used_memory_human]
32
+ redis[:used_memory_rss] = info[:used_memory_rss]
33
+ redis[:mem_fragmentation_ratio] = info[:mem_fragmentation_ratio]
34
+ redis[:use_tcmalloc] = info[:use_tcmalloc]
35
+ redis[:loading] = info[:loading]
36
+ redis[:aof_enabled] = info[:aof_enabled]
37
+ redis[:changes_since_last_save] = info[:changes_since_last_save]
38
+ redis[:bgsave_in_progress] = info[:bgsave_in_progress]
39
+ redis[:last_save_time] = info[:last_save_time]
40
+ redis[:bgrewriteaof_in_progress] = info[:bgrewriteaof_in_progress]
41
+ redis[:total_connections_received] = info[:total_connections_received]
42
+ redis[:total_commands_processed] = info[:total_commands_processed]
43
+ redis[:expired_keys] = info[:expired_keys]
44
+ redis[:evicted_keys] = info[:evicted_keys]
45
+ redis[:keyspace_hits] = info[:keyspace_hits]
46
+ redis[:keyspace_misses] = info[:keyspace_misses]
47
+ redis[:hash_max_zipmap_entries] = info[:hash_max_zipmap_entries]
48
+ redis[:hash_max_zipmap_value] = info[:hash_max_zipmap_value]
49
+ redis[:pubsub_channels] = info[:pubsub_channels]
50
+ redis[:pubsub_patterns] = info[:pubsub_patterns]
51
+ redis[:vm_enabled] = info[:vm_enabled]
52
+ redis[:role] = info[:role]
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ module Overwatch
4
+ describe Client do
5
+ let(:server_url) { "http://api.overwatchapp.com" }
6
+ let(:client_key) { "asdf1234" }
7
+
8
+ describe "#load_config" do
9
+ let(:client) { Overwatch::Client.new }
10
+
11
+ before do
12
+ File.open(Overwatch.config_file_path, "w") do |file|
13
+ file.puts "server_url: http://api.overwatchapp.com"
14
+ file.puts "client_key: asdf1234"
15
+ end
16
+ end
17
+
18
+ it "loads up the configuration file" do
19
+ client.load_config
20
+ client.server_url.should == "http://api.overwatchapp.com"
21
+ client.client_key.should == "asdf1234"
22
+ end
23
+ end
24
+
25
+ describe "#get_plugin_manifest" do
26
+ let(:client) { Overwatch::Client.new }
27
+
28
+ before do
29
+ stub_get_plugin_manifest
30
+ end
31
+
32
+ it "retrieves a plugins manifest from the server" do
33
+ client.get_plugin_manifest
34
+ client.plugin_manifest.should == plugin_manifest_response
35
+ end
36
+ end
37
+
38
+ describe "#sync_plugins" do
39
+ let(:client) { Overwatch::Client.new }
40
+
41
+ before do
42
+ Overwatch.install
43
+ stub_get_plugin_manifest
44
+ stub_sync_plugins
45
+ client.get_plugin_manifest
46
+ end
47
+
48
+ it "downloads plugins to the cache directory" do
49
+ client.sync_plugins
50
+ File.exist?(File.join(Overwatch.plugin_dir, "foo_plugin.rb")).should be_true
51
+ File.exist?(File.join(Overwatch.plugin_dir, "bar_plugin.rb")).should be_true
52
+ File.open(File.join(Overwatch.plugin_dir, "bar_plugin.rb")).read.should include("class BarPlugin")
53
+
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,68 @@
1
+ require 'spec_helper'
2
+
3
+ describe Overwatch do
4
+ before do
5
+ ENV['HOME'] = "/home/user"
6
+ end
7
+
8
+ describe '.run' do
9
+ let(:config_file) { mock('config_file') }
10
+
11
+ before do
12
+ end
13
+
14
+ it "creates the required application files" do
15
+ FileUtils.should_receive(:mkdir_p).with(Overwatch.base_dir)
16
+ FileUtils.should_receive(:touch).with(Overwatch.log_file_path)
17
+ FileUtils.should_receive(:mkdir_p).with(Overwatch.cache_dir)
18
+ FileUtils.should_receive(:mkdir_p).with(Overwatch.plugin_dir)
19
+ FileUtils.should_receive(:mkdir_p).with(Overwatch.config_dir)
20
+
21
+ File.should_receive(:open).
22
+ with(Overwatch.config_file_path, "w").
23
+ and_yield(config_file)
24
+ config_file.should_receive(:puts).
25
+ with('server_url: http://api.overwatchapp.com')
26
+ config_file.should_receive(:puts).
27
+ with('client_key: CHANGEME')
28
+ Overwatch.install
29
+ end
30
+ end
31
+
32
+ context "logging" do
33
+ describe '.log_file_path' do
34
+ it "returns '/home/user/.overwatch/client.log'" do
35
+ Overwatch.log_file_path.should == "/home/user/.overwatch/client.log"
36
+ end
37
+ end
38
+
39
+ describe '.log_file_path=' do
40
+ it "sets @log_file_path" do
41
+ Overwatch.log_file_path = "/tmp/something.log"
42
+ Overwatch.log_file_path.should == "/tmp/something.log"
43
+ end
44
+ end
45
+
46
+ describe '.log' do
47
+ it "functions as a logger" do
48
+ Overwatch.log.should be_an_instance_of(Logger)
49
+ lambda { Overwatch.log.info "TEST" }.should_not raise_error
50
+ end
51
+ end
52
+ end
53
+
54
+ context "environment" do
55
+ describe '.env=' do
56
+ it "sets the @env variable" do
57
+ Overwatch.env = "pants"
58
+ Overwatch.env.should == "pants"
59
+ end
60
+ end
61
+
62
+ describe '.env' do
63
+ it "returns 'test' inside specs" do
64
+ Overwatch.env.should == "test"
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,37 @@
1
+ require 'rubygems'
2
+ require 'spork'
3
+
4
+ Spork.prefork do
5
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
6
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
7
+ require 'bundler'
8
+
9
+ Bundler.require
10
+
11
+ require 'rspec'
12
+ require 'fakefs/safe'
13
+ require 'webmock/rspec'
14
+
15
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
16
+
17
+ RSpec.configure do |config|
18
+ config.before do
19
+ FakeFS.activate!
20
+ end
21
+ config.after do
22
+ FakeFS.deactivate!
23
+ end
24
+ end
25
+ end
26
+
27
+ Spork.each_run do
28
+ require 'overwatch'
29
+
30
+ RSpec.configure do |config|
31
+ config.before do
32
+ ENV['HOME'] = "/home/user"
33
+
34
+ Overwatch.env = "test"
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,8 @@
1
+ # class BarPlugin # < Overwatch::Plugin
2
+ # name = "bar_plugin"
3
+ # desc = "A test plugin to determine whether plugin sync works"
4
+ #
5
+ # def run
6
+ # { :bar => 'bar' }
7
+ # end
8
+ # end
@@ -0,0 +1,65 @@
1
+ def stub_get_plugin_manifest
2
+ stub_request(:get, "#{server_url}/nodes/#{client_key}/plugins").
3
+ to_return(
4
+ :status => 200,
5
+ :body => %Q{
6
+ [
7
+ {
8
+ "name": "foo_plugin",
9
+ "checksum": "qwer5678"
10
+ },
11
+ {
12
+ "name": "bar_plugin",
13
+ "checksum": "hjkl4321"
14
+ }
15
+ ]
16
+ }
17
+ )
18
+ end
19
+
20
+ def plugin_manifest_response
21
+ [
22
+ {
23
+ "name" => "foo_plugin",
24
+ "checksum" => "qwer5678"
25
+ },
26
+ {
27
+ "name" => "bar_plugin",
28
+ "checksum" => "hjkl4321"
29
+ }
30
+ ]
31
+ end
32
+
33
+ def stub_sync_plugins
34
+ stub_request(:get, "#{server_url}/plugins/foo_plugin").
35
+ to_return(:body => stub_foo_plugin)
36
+
37
+ stub_request(:get, "#{server_url}/plugins/bar_plugin").
38
+ to_return(:body => stub_bar_plugin)
39
+ end
40
+
41
+ def stub_foo_plugin
42
+ %|
43
+ class FooPlugin < Overwatch::Plugin
44
+ name "foo_plugin"
45
+ desc "A test plugin to determine whether plugin sync works"
46
+
47
+ def run
48
+ { :foo => 'foo' }
49
+ end
50
+ end
51
+ |
52
+ end
53
+
54
+ def stub_bar_plugin
55
+ %|
56
+ class BarPlugin < Overwatch::Plugin
57
+ name "bar_plugin"
58
+ desc "A test plugin to determine whether plugin sync works"
59
+
60
+ def run
61
+ { :bar => 'bar' }
62
+ end
63
+ end
64
+ |
65
+ end
@@ -0,0 +1,8 @@
1
+ # class FooPlugin # < Overwatch::Plugin
2
+ # name = "foo_plugin"
3
+ # desc = "A test plugin to determine whether plugin sync works"
4
+ #
5
+ # def run
6
+ # { :foo => 'foo' }
7
+ # end
8
+ # end
@@ -0,0 +1,3 @@
1
+ def test
2
+ puts "Is it working? :("
3
+ end
metadata ADDED
@@ -0,0 +1,215 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: overwatch
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: 6
5
+ version: 0.0.3.pre
6
+ platform: ruby
7
+ authors:
8
+ - Dan Ryan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-07-01 00:00:00 -04:00
14
+ default_executable: overwatch
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rest-client
18
+ requirement: &id001 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 1.6.3
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: *id001
27
+ - !ruby/object:Gem::Dependency
28
+ name: json
29
+ requirement: &id002 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: 1.5.1
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: *id002
38
+ - !ruby/object:Gem::Dependency
39
+ name: ohai
40
+ requirement: &id003 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: 0.6.4
46
+ type: :runtime
47
+ prerelease: false
48
+ version_requirements: *id003
49
+ - !ruby/object:Gem::Dependency
50
+ name: rspec
51
+ requirement: &id004 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: 2.5.0
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: *id004
60
+ - !ruby/object:Gem::Dependency
61
+ name: yard
62
+ requirement: &id005 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: 0.6.0
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: *id005
71
+ - !ruby/object:Gem::Dependency
72
+ name: bundler
73
+ requirement: &id006 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: 1.0.0
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: *id006
82
+ - !ruby/object:Gem::Dependency
83
+ name: jeweler
84
+ requirement: &id007 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: 1.5.2
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: *id007
93
+ - !ruby/object:Gem::Dependency
94
+ name: watchr
95
+ requirement: &id008 !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: "0"
101
+ type: :development
102
+ prerelease: false
103
+ version_requirements: *id008
104
+ - !ruby/object:Gem::Dependency
105
+ name: spork
106
+ requirement: &id009 !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ">="
110
+ - !ruby/object:Gem::Version
111
+ version: 0.9.0.rc
112
+ type: :development
113
+ prerelease: false
114
+ version_requirements: *id009
115
+ - !ruby/object:Gem::Dependency
116
+ name: fuubar
117
+ requirement: &id010 !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ">="
121
+ - !ruby/object:Gem::Version
122
+ version: "0"
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: *id010
126
+ - !ruby/object:Gem::Dependency
127
+ name: fakefs
128
+ requirement: &id011 !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ">="
132
+ - !ruby/object:Gem::Version
133
+ version: "0"
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: *id011
137
+ - !ruby/object:Gem::Dependency
138
+ name: webmock
139
+ requirement: &id012 !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ">="
143
+ - !ruby/object:Gem::Version
144
+ version: "0"
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: *id012
148
+ description: The client to communicate with the Overwatch monitoring service
149
+ email: hi@iamdanryan.com
150
+ executables:
151
+ - overwatch
152
+ extensions: []
153
+
154
+ extra_rdoc_files:
155
+ - LICENSE.txt
156
+ - README.md
157
+ files:
158
+ - .document
159
+ - .rspec
160
+ - .watchr
161
+ - Gemfile
162
+ - Gemfile.lock
163
+ - LICENSE.txt
164
+ - README.md
165
+ - Rakefile
166
+ - VERSION
167
+ - bin/overwatch
168
+ - lib/overwatch.rb
169
+ - lib/overwatch/client.rb
170
+ - overwatch.gemspec
171
+ - plugins/load_average.rb
172
+ - plugins/mongodb.rb
173
+ - plugins/mysql.rb
174
+ - plugins/nginx.rb
175
+ - plugins/redis.rb
176
+ - spec/monitaur/client_spec.rb
177
+ - spec/monitaur_spec.rb
178
+ - spec/spec_helper.rb
179
+ - spec/support/bar_plugin.rb
180
+ - spec/support/client_requests.rb
181
+ - spec/support/foo_plugin.rb
182
+ - spec/support/test.rb
183
+ has_rdoc: true
184
+ homepage: http://github.com/danryan/overwatch-client
185
+ licenses:
186
+ - MIT
187
+ post_install_message:
188
+ rdoc_options: []
189
+
190
+ require_paths:
191
+ - lib
192
+ required_ruby_version: !ruby/object:Gem::Requirement
193
+ none: false
194
+ requirements:
195
+ - - ">="
196
+ - !ruby/object:Gem::Version
197
+ hash: 1674726256609455612
198
+ segments:
199
+ - 0
200
+ version: "0"
201
+ required_rubygems_version: !ruby/object:Gem::Requirement
202
+ none: false
203
+ requirements:
204
+ - - ">"
205
+ - !ruby/object:Gem::Version
206
+ version: 1.3.1
207
+ requirements: []
208
+
209
+ rubyforge_project:
210
+ rubygems_version: 1.6.2
211
+ signing_key:
212
+ specification_version: 3
213
+ summary: Client for Overwatch monitoring service
214
+ test_files: []
215
+