god 0.9.0 → 0.10.1
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/History.txt +6 -0
- data/Rakefile +106 -48
- data/god.gemspec +36 -74
- data/lib/god.rb +3 -1
- data/lib/god/process.rb +14 -9
- data/lib/god/watch.rb +7 -4
- data/test/configs/stop_options/simple_server.rb +12 -0
- data/test/configs/stop_options/stop_options.god +39 -0
- metadata +169 -28
- data/examples/events.god +0 -84
- data/examples/gravatar.god +0 -54
- data/examples/single.god +0 -66
data/History.txt
CHANGED
data/Rakefile
CHANGED
@@ -2,11 +2,41 @@ require 'rubygems'
|
|
2
2
|
require 'rake'
|
3
3
|
require 'date'
|
4
4
|
|
5
|
+
#############################################################################
|
6
|
+
#
|
7
|
+
# The name of the package
|
8
|
+
#
|
9
|
+
#############################################################################
|
10
|
+
|
11
|
+
NAME = 'god'
|
12
|
+
|
13
|
+
#############################################################################
|
14
|
+
#
|
15
|
+
# Helper functions
|
16
|
+
#
|
17
|
+
#############################################################################
|
18
|
+
|
5
19
|
def source_version
|
6
|
-
line = File.read(
|
7
|
-
line.match(/.*VERSION
|
20
|
+
line = File.read("lib/#{NAME}.rb")[/^\s*VERSION\s*=\s*.*/]
|
21
|
+
line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
|
22
|
+
end
|
23
|
+
|
24
|
+
def gemspec_file
|
25
|
+
"#{NAME}.gemspec"
|
8
26
|
end
|
9
27
|
|
28
|
+
def gem_file
|
29
|
+
"#{NAME}-#{source_version}.gem"
|
30
|
+
end
|
31
|
+
|
32
|
+
#############################################################################
|
33
|
+
#
|
34
|
+
# Standard tasks
|
35
|
+
#
|
36
|
+
#############################################################################
|
37
|
+
|
38
|
+
task :default => :test
|
39
|
+
|
10
40
|
require 'rake/testtask'
|
11
41
|
Rake::TestTask.new(:test) do |test|
|
12
42
|
test.libs << 'lib' << 'test'
|
@@ -14,13 +44,33 @@ Rake::TestTask.new(:test) do |test|
|
|
14
44
|
test.verbose = true
|
15
45
|
end
|
16
46
|
|
17
|
-
|
47
|
+
desc "Generate and open coverage stats via rcov"
|
48
|
+
task :coverage do
|
49
|
+
require 'rcov'
|
50
|
+
sh "rm -fr coverage"
|
51
|
+
sh "rcov test/test_*.rb"
|
52
|
+
sh "open coverage/index.html"
|
53
|
+
end
|
54
|
+
|
55
|
+
require 'rake/rdoctask'
|
56
|
+
Rake::RDocTask.new do |rdoc|
|
57
|
+
rdoc.rdoc_dir = 'rdoc'
|
58
|
+
rdoc.title = "#{NAME} #{source_version}"
|
59
|
+
rdoc.rdoc_files.include('README*')
|
60
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
61
|
+
end
|
18
62
|
|
19
63
|
desc "Open an irb session preloaded with this library"
|
20
64
|
task :console do
|
21
|
-
sh "irb -rubygems -r ./lib
|
65
|
+
sh "irb -rubygems -r ./lib/#{NAME}.rb"
|
22
66
|
end
|
23
67
|
|
68
|
+
#############################################################################
|
69
|
+
#
|
70
|
+
# Custom tasks (add your own tasks here)
|
71
|
+
#
|
72
|
+
#############################################################################
|
73
|
+
|
24
74
|
desc "Upload site to Rubyforge"
|
25
75
|
task :site do
|
26
76
|
sh "scp -r site/* mojombo@god.rubyforge.org:/var/www/gforge-projects/god"
|
@@ -31,54 +81,62 @@ task :site_edge do
|
|
31
81
|
sh "scp -r site/* mojombo@god.rubyforge.org:/var/www/gforge-projects/god/edge"
|
32
82
|
end
|
33
83
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
84
|
+
#############################################################################
|
85
|
+
#
|
86
|
+
# Packaging tasks
|
87
|
+
#
|
88
|
+
#############################################################################
|
89
|
+
|
90
|
+
task :release => :build do
|
91
|
+
unless `git branch` =~ /^\* master$/
|
92
|
+
puts "You must be on the master branch to release!"
|
93
|
+
exit!
|
94
|
+
end
|
95
|
+
sh "git commit --allow-empty -a -m 'up to #{source_version}'"
|
96
|
+
sh "git tag v#{source_version}"
|
97
|
+
sh "git push origin master --tags"
|
98
|
+
sh "gem push pkg/#{NAME}-#{source_version}.gem"
|
39
99
|
end
|
40
100
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
rdoc.rdoc_files.include('README*')
|
46
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
101
|
+
task :build => :gemspec do
|
102
|
+
sh "mkdir -p pkg"
|
103
|
+
sh "gem build #{gemspec_file}"
|
104
|
+
sh "mv #{gem_file} pkg"
|
47
105
|
end
|
48
106
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
sh "git push origin master"
|
54
|
-
sh "gem push pkg/god-#{source_version}.gem"
|
55
|
-
end
|
107
|
+
task :gemspec => :validate do
|
108
|
+
# read spec file and split out manifest section
|
109
|
+
spec = File.read(gemspec_file)
|
110
|
+
head, manifest, tail = spec.split(" # = MANIFEST =\n")
|
56
111
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
112
|
+
# replace version and date
|
113
|
+
head.sub!(/\.version = '.*'/, ".version = '#{source_version}'")
|
114
|
+
head.sub!(/\.date = '.*'/, ".date = '#{Date.today.to_s}'")
|
115
|
+
|
116
|
+
# determine file list from git ls-files
|
117
|
+
files = `git ls-files`.
|
118
|
+
split("\n").
|
119
|
+
sort.
|
120
|
+
reject { |file| file =~ /^\./ }.
|
121
|
+
reject { |file| file =~ /^(examples|ideas|init|site)/ }.
|
122
|
+
map { |file| " #{file}" }.
|
123
|
+
join("\n")
|
62
124
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
reject { |file| file =~ /^(ideas|init|site)/ }.
|
76
|
-
map { |file| " #{file}" }.
|
77
|
-
join("\n")
|
78
|
-
# piece file back together and write...
|
79
|
-
manifest = " s.files = %w[\n#{files}\n ]\n"
|
80
|
-
spec = [head, manifest, tail].join(" # = MANIFEST =\n")
|
81
|
-
File.open('god.gemspec', 'w') { |io| io.write(spec) }
|
82
|
-
puts "updated god.gemspec"
|
125
|
+
# piece file back together and write
|
126
|
+
manifest = " s.files = %w[\n#{files}\n ]\n"
|
127
|
+
spec = [head, manifest, tail].join(" # = MANIFEST =\n")
|
128
|
+
File.open(gemspec_file, 'w') { |io| io.write(spec) }
|
129
|
+
puts "Updated #{gemspec_file}"
|
130
|
+
end
|
131
|
+
|
132
|
+
task :validate do
|
133
|
+
libfiles = Dir['lib/*'] - ["lib/#{NAME}.rb", "lib/#{NAME}"]
|
134
|
+
unless libfiles.empty?
|
135
|
+
puts "Directory `lib` should only contain a `#{NAME}.rb` file and `#{NAME}` dir."
|
136
|
+
exit!
|
83
137
|
end
|
84
|
-
|
138
|
+
unless Dir['VERSION*'].empty?
|
139
|
+
puts "A `VERSION` file at root level violates Gem best practices."
|
140
|
+
exit!
|
141
|
+
end
|
142
|
+
end
|
data/god.gemspec
CHANGED
@@ -1,18 +1,39 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
|
-
s.
|
3
|
-
s.version = '0.9.0'
|
4
|
-
|
2
|
+
s.specification_version = 2 if s.respond_to? :specification_version=
|
5
3
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
6
|
-
|
7
|
-
s.
|
8
|
-
s.
|
9
|
-
s.
|
10
|
-
|
4
|
+
|
5
|
+
s.name = 'god'
|
6
|
+
s.version = '0.10.1'
|
7
|
+
s.date = '2010-05-17'
|
8
|
+
|
9
|
+
s.summary = "Process monitoring framework."
|
10
|
+
s.description = "An easy to configure, easy to extend monitoring framework written in Ruby."
|
11
|
+
|
12
|
+
s.authors = ["Tom Preston-Werner", "Kevin Clark", "Eric Lindvall"]
|
13
|
+
s.email = 'god-rb@googlegroups.com'
|
14
|
+
s.homepage = 'http://god.rubyforge.org/'
|
15
|
+
|
16
|
+
s.rubyforge_project = 'god'
|
17
|
+
s.rubygems_version = '1.3.5'
|
18
|
+
s.require_paths = %w[lib ext]
|
19
|
+
|
11
20
|
s.executables = ["god"]
|
12
|
-
s.
|
13
|
-
s.
|
14
|
-
|
15
|
-
]
|
21
|
+
s.default_executable = 'god'
|
22
|
+
s.extensions = %w[ext/god/extconf.rb]
|
23
|
+
|
24
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
25
|
+
s.extra_rdoc_files = %w[README.txt]
|
26
|
+
|
27
|
+
s.add_development_dependency('twitter', [">= 0.3.7"])
|
28
|
+
s.add_development_dependency('prowly', [">= 0.2.1"])
|
29
|
+
s.add_development_dependency('tinder', [">= 1.3.1", "< 2.0.0"])
|
30
|
+
s.add_development_dependency('xmpp4r', [">= 0.4.0"])
|
31
|
+
s.add_development_dependency('dike', [">= 0.0.3"])
|
32
|
+
s.add_development_dependency('snapshot', [">= 1.0.0", "< 2.0.0"])
|
33
|
+
s.add_development_dependency('rcov', [">= 0.9.8"])
|
34
|
+
s.add_development_dependency('daemons', [">= 1.0.10", "< 2.0.0"])
|
35
|
+
s.add_development_dependency('mocha', [">= 0.9.1"])
|
36
|
+
|
16
37
|
# = MANIFEST =
|
17
38
|
s.files = %w[
|
18
39
|
Announce.txt
|
@@ -20,9 +41,6 @@ Gem::Specification.new do |s|
|
|
20
41
|
README.txt
|
21
42
|
Rakefile
|
22
43
|
bin/god
|
23
|
-
examples/events.god
|
24
|
-
examples/gravatar.god
|
25
|
-
examples/single.god
|
26
44
|
ext/god/.gitignore
|
27
45
|
ext/god/extconf.rb
|
28
46
|
ext/god/kqueue_handler.c
|
@@ -102,6 +120,8 @@ Gem::Specification.new do |s|
|
|
102
120
|
test/configs/matias/matias.god
|
103
121
|
test/configs/real.rb
|
104
122
|
test/configs/running_load/running_load.god
|
123
|
+
test/configs/stop_options/simple_server.rb
|
124
|
+
test/configs/stop_options/stop_options.god
|
105
125
|
test/configs/stress/simple_server.rb
|
106
126
|
test/configs/stress/stress.god
|
107
127
|
test/configs/task/logs/.placeholder
|
@@ -140,64 +160,6 @@ Gem::Specification.new do |s|
|
|
140
160
|
test/test_webhook.rb
|
141
161
|
]
|
142
162
|
# = MANIFEST =
|
143
|
-
s.homepage = %q{http://god.rubyforge.org/}
|
144
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
145
|
-
s.require_paths = ["lib", "ext"]
|
146
|
-
s.rubyforge_project = %q{god}
|
147
|
-
s.rubygems_version = %q{1.3.5}
|
148
|
-
s.summary = %q{Like monit, only awesome}
|
149
|
-
s.test_files = [
|
150
|
-
"test/configs/child_events/simple_server.rb",
|
151
|
-
"test/configs/child_polls/simple_server.rb",
|
152
|
-
"test/configs/complex/simple_server.rb",
|
153
|
-
"test/configs/contact/simple_server.rb",
|
154
|
-
"test/configs/daemon_events/simple_server.rb",
|
155
|
-
"test/configs/daemon_events/simple_server_stop.rb",
|
156
|
-
"test/configs/daemon_polls/simple_server.rb",
|
157
|
-
"test/configs/degrading_lambda/tcp_server.rb",
|
158
|
-
"test/configs/real.rb",
|
159
|
-
"test/configs/stress/simple_server.rb",
|
160
|
-
"test/configs/test.rb",
|
161
|
-
"test/helper.rb",
|
162
|
-
"test/suite.rb",
|
163
|
-
"test/test_behavior.rb",
|
164
|
-
"test/test_campfire.rb",
|
165
|
-
"test/test_condition.rb",
|
166
|
-
"test/test_conditions_disk_usage.rb",
|
167
|
-
"test/test_conditions_http_response_code.rb",
|
168
|
-
"test/test_conditions_process_running.rb",
|
169
|
-
"test/test_conditions_tries.rb",
|
170
|
-
"test/test_contact.rb",
|
171
|
-
"test/test_dependency_graph.rb",
|
172
|
-
"test/test_driver.rb",
|
173
|
-
"test/test_email.rb",
|
174
|
-
"test/test_event_handler.rb",
|
175
|
-
"test/test_god.rb",
|
176
|
-
"test/test_handlers_kqueue_handler.rb",
|
177
|
-
"test/test_jabber.rb",
|
178
|
-
"test/test_logger.rb",
|
179
|
-
"test/test_metric.rb",
|
180
|
-
"test/test_process.rb",
|
181
|
-
"test/test_registry.rb",
|
182
|
-
"test/test_socket.rb",
|
183
|
-
"test/test_sugar.rb",
|
184
|
-
"test/test_system_portable_poller.rb",
|
185
|
-
"test/test_system_process.rb",
|
186
|
-
"test/test_task.rb",
|
187
|
-
"test/test_timeline.rb",
|
188
|
-
"test/test_trigger.rb",
|
189
|
-
"test/test_watch.rb",
|
190
|
-
"test/test_webhook.rb"
|
191
|
-
]
|
192
|
-
|
193
|
-
if s.respond_to? :specification_version then
|
194
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
195
|
-
s.specification_version = 3
|
196
163
|
|
197
|
-
|
198
|
-
else
|
199
|
-
end
|
200
|
-
else
|
201
|
-
end
|
164
|
+
s.test_files = s.files.select { |path| path =~ /^test\/test_.*\.rb/ }
|
202
165
|
end
|
203
|
-
|
data/lib/god.rb
CHANGED
@@ -150,13 +150,15 @@ class Module
|
|
150
150
|
end
|
151
151
|
|
152
152
|
module God
|
153
|
-
VERSION = '0.
|
153
|
+
VERSION = '0.10.1'
|
154
154
|
LOG_BUFFER_SIZE_DEFAULT = 100
|
155
155
|
PID_FILE_DIRECTORY_DEFAULTS = ['/var/run/god', '~/.god/pids']
|
156
156
|
DRB_PORT_DEFAULT = 17165
|
157
157
|
DRB_ALLOW_DEFAULT = ['127.0.0.1']
|
158
158
|
LOG_LEVEL_DEFAULT = :info
|
159
159
|
TERMINATE_TIMEOUT_DEFAULT = 10
|
160
|
+
STOP_TIMEOUT_DEFAULT = 10
|
161
|
+
STOP_SIGNAL_DEFAULT = 'TERM'
|
160
162
|
|
161
163
|
class << self
|
162
164
|
# user configurable
|
data/lib/god/process.rb
CHANGED
@@ -2,8 +2,9 @@ module God
|
|
2
2
|
class Process
|
3
3
|
WRITES_PID = [:start, :restart]
|
4
4
|
|
5
|
-
attr_accessor :name, :uid, :gid, :log, :log_cmd, :err_log, :err_log_cmd,
|
6
|
-
:unix_socket, :chroot, :env, :dir
|
5
|
+
attr_accessor :name, :uid, :gid, :log, :log_cmd, :err_log, :err_log_cmd,
|
6
|
+
:start, :stop, :restart, :unix_socket, :chroot, :env, :dir,
|
7
|
+
:stop_timeout, :stop_signal
|
7
8
|
|
8
9
|
def initialize
|
9
10
|
self.log = '/dev/null'
|
@@ -14,6 +15,8 @@ module God
|
|
14
15
|
@pid = nil
|
15
16
|
@unix_socket = nil
|
16
17
|
@log_cmd = nil
|
18
|
+
@stop_timeout = God::STOP_TIMEOUT_DEFAULT
|
19
|
+
@stop_signal = God::STOP_SIGNAL_DEFAULT
|
17
20
|
end
|
18
21
|
|
19
22
|
def alive?
|
@@ -203,11 +206,11 @@ module God
|
|
203
206
|
command = lambda do
|
204
207
|
applog(self, :info, "#{self.name} stop: default lambda killer")
|
205
208
|
|
206
|
-
::Process.kill(
|
207
|
-
applog(self, :info, "#{self.name} sent
|
209
|
+
::Process.kill(@stop_signal, pid) rescue nil
|
210
|
+
applog(self, :info, "#{self.name} sent SIG#{@stop_signal}")
|
208
211
|
|
209
212
|
# Poll to see if it's dead
|
210
|
-
|
213
|
+
@stop_timeout.times do
|
211
214
|
begin
|
212
215
|
::Process.kill(0, pid)
|
213
216
|
rescue Errno::ESRCH
|
@@ -220,14 +223,14 @@ module God
|
|
220
223
|
end
|
221
224
|
|
222
225
|
::Process.kill('KILL', pid) rescue nil
|
223
|
-
applog(self, :
|
226
|
+
applog(self, :warn, "#{self.name} still alive after #{@stop_timeout}s; sent SIGKILL")
|
224
227
|
end
|
225
228
|
end
|
226
229
|
|
227
230
|
if command.kind_of?(String)
|
228
231
|
pid = nil
|
229
232
|
|
230
|
-
if @tracking_pid
|
233
|
+
if [:start, :restart].include?(action) && @tracking_pid
|
231
234
|
# double fork god-daemonized processes
|
232
235
|
# we don't want to wait for them to finish
|
233
236
|
r, w = IO.pipe
|
@@ -326,13 +329,15 @@ module God
|
|
326
329
|
#
|
327
330
|
# Returns nothing
|
328
331
|
def ensure_stop
|
332
|
+
applog(self, :warn, "#{self.name} ensuring stop...")
|
333
|
+
|
329
334
|
unless self.pid
|
330
335
|
applog(self, :warn, "#{self.name} stop called but pid is uknown")
|
331
336
|
return
|
332
337
|
end
|
333
338
|
|
334
339
|
# Poll to see if it's dead
|
335
|
-
|
340
|
+
@stop_timeout.times do
|
336
341
|
begin
|
337
342
|
::Process.kill(0, self.pid)
|
338
343
|
rescue Errno::ESRCH
|
@@ -345,7 +350,7 @@ module God
|
|
345
350
|
|
346
351
|
# last resort
|
347
352
|
::Process.kill('KILL', self.pid) rescue nil
|
348
|
-
applog(self, :warn, "#{self.name}
|
353
|
+
applog(self, :warn, "#{self.name} still alive after #{@stop_timeout}s; sent SIGKILL")
|
349
354
|
end
|
350
355
|
|
351
356
|
private
|
data/lib/god/watch.rb
CHANGED
@@ -12,10 +12,13 @@ module God
|
|
12
12
|
|
13
13
|
extend Forwardable
|
14
14
|
def_delegators :@process, :name, :uid, :gid, :start, :stop, :restart, :dir,
|
15
|
-
:name=, :uid=, :gid=, :start=, :stop=, :restart=,
|
16
|
-
:pid_file, :pid_file=, :log, :log=,
|
17
|
-
:
|
18
|
-
:
|
15
|
+
:name=, :uid=, :gid=, :start=, :stop=, :restart=,
|
16
|
+
:dir=, :pid_file, :pid_file=, :log, :log=,
|
17
|
+
:log_cmd, :log_cmd=, :err_log, :err_log=,
|
18
|
+
:err_log_cmd, :err_log_cmd=, :alive?, :pid,
|
19
|
+
:unix_socket, :unix_socket=, :chroot, :chroot=,
|
20
|
+
:env, :env=, :signal, :stop_timeout=,
|
21
|
+
:stop_signal=
|
19
22
|
#
|
20
23
|
def initialize
|
21
24
|
super
|
@@ -0,0 +1,39 @@
|
|
1
|
+
God.watch do |w|
|
2
|
+
w.name = 'stop-options'
|
3
|
+
w.start = File.join(GOD_ROOT, *%w[test configs stop_options simple_server.rb])
|
4
|
+
w.stop_signal = 'USR1'
|
5
|
+
w.stop_timeout = 5
|
6
|
+
w.interval = 5
|
7
|
+
w.grace = 2
|
8
|
+
|
9
|
+
w.start_if do |start|
|
10
|
+
start.condition(:process_running) do |c|
|
11
|
+
c.running = false
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
w.restart_if do |restart|
|
16
|
+
restart.condition(:cpu_usage) do |c|
|
17
|
+
c.above = 30.percent
|
18
|
+
c.times = [3, 5]
|
19
|
+
end
|
20
|
+
|
21
|
+
restart.condition(:memory_usage) do |c|
|
22
|
+
c.above = 10.megabytes
|
23
|
+
c.times = [3, 5]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# lifecycle
|
28
|
+
w.lifecycle do |on|
|
29
|
+
on.condition(:flapping) do |c|
|
30
|
+
c.to_state = [:start, :restart]
|
31
|
+
c.times = 3
|
32
|
+
c.within = 60.seconds
|
33
|
+
c.transition = :unmonitored
|
34
|
+
c.retry_in = 10.seconds
|
35
|
+
c.retry_times = 2
|
36
|
+
c.retry_within = 5.minutes
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
metadata
CHANGED
@@ -1,25 +1,177 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: god
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 10
|
8
|
+
- 1
|
9
|
+
version: 0.10.1
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Tom Preston-Werner
|
13
|
+
- Kevin Clark
|
14
|
+
- Eric Lindvall
|
8
15
|
autorequire:
|
9
16
|
bindir: bin
|
10
17
|
cert_chain: []
|
11
18
|
|
12
|
-
date:
|
19
|
+
date: 2010-05-17 00:00:00 -07:00
|
13
20
|
default_executable: god
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
|
17
|
-
|
21
|
+
dependencies:
|
22
|
+
- !ruby/object:Gem::Dependency
|
23
|
+
name: twitter
|
24
|
+
prerelease: false
|
25
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
- 3
|
32
|
+
- 7
|
33
|
+
version: 0.3.7
|
34
|
+
type: :development
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: prowly
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
segments:
|
44
|
+
- 0
|
45
|
+
- 2
|
46
|
+
- 1
|
47
|
+
version: 0.2.1
|
48
|
+
type: :development
|
49
|
+
version_requirements: *id002
|
50
|
+
- !ruby/object:Gem::Dependency
|
51
|
+
name: tinder
|
52
|
+
prerelease: false
|
53
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
segments:
|
58
|
+
- 1
|
59
|
+
- 3
|
60
|
+
- 1
|
61
|
+
version: 1.3.1
|
62
|
+
- - <
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
segments:
|
65
|
+
- 2
|
66
|
+
- 0
|
67
|
+
- 0
|
68
|
+
version: 2.0.0
|
69
|
+
type: :development
|
70
|
+
version_requirements: *id003
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: xmpp4r
|
73
|
+
prerelease: false
|
74
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
segments:
|
79
|
+
- 0
|
80
|
+
- 4
|
81
|
+
- 0
|
82
|
+
version: 0.4.0
|
83
|
+
type: :development
|
84
|
+
version_requirements: *id004
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: dike
|
87
|
+
prerelease: false
|
88
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
segments:
|
93
|
+
- 0
|
94
|
+
- 0
|
95
|
+
- 3
|
96
|
+
version: 0.0.3
|
97
|
+
type: :development
|
98
|
+
version_requirements: *id005
|
99
|
+
- !ruby/object:Gem::Dependency
|
100
|
+
name: snapshot
|
101
|
+
prerelease: false
|
102
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
103
|
+
requirements:
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
segments:
|
107
|
+
- 1
|
108
|
+
- 0
|
109
|
+
- 0
|
110
|
+
version: 1.0.0
|
111
|
+
- - <
|
112
|
+
- !ruby/object:Gem::Version
|
113
|
+
segments:
|
114
|
+
- 2
|
115
|
+
- 0
|
116
|
+
- 0
|
117
|
+
version: 2.0.0
|
118
|
+
type: :development
|
119
|
+
version_requirements: *id006
|
120
|
+
- !ruby/object:Gem::Dependency
|
121
|
+
name: rcov
|
122
|
+
prerelease: false
|
123
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
124
|
+
requirements:
|
125
|
+
- - ">="
|
126
|
+
- !ruby/object:Gem::Version
|
127
|
+
segments:
|
128
|
+
- 0
|
129
|
+
- 9
|
130
|
+
- 8
|
131
|
+
version: 0.9.8
|
132
|
+
type: :development
|
133
|
+
version_requirements: *id007
|
134
|
+
- !ruby/object:Gem::Dependency
|
135
|
+
name: daemons
|
136
|
+
prerelease: false
|
137
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
segments:
|
142
|
+
- 1
|
143
|
+
- 0
|
144
|
+
- 10
|
145
|
+
version: 1.0.10
|
146
|
+
- - <
|
147
|
+
- !ruby/object:Gem::Version
|
148
|
+
segments:
|
149
|
+
- 2
|
150
|
+
- 0
|
151
|
+
- 0
|
152
|
+
version: 2.0.0
|
153
|
+
type: :development
|
154
|
+
version_requirements: *id008
|
155
|
+
- !ruby/object:Gem::Dependency
|
156
|
+
name: mocha
|
157
|
+
prerelease: false
|
158
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
159
|
+
requirements:
|
160
|
+
- - ">="
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
segments:
|
163
|
+
- 0
|
164
|
+
- 9
|
165
|
+
- 1
|
166
|
+
version: 0.9.1
|
167
|
+
type: :development
|
168
|
+
version_requirements: *id009
|
169
|
+
description: An easy to configure, easy to extend monitoring framework written in Ruby.
|
170
|
+
email: god-rb@googlegroups.com
|
18
171
|
executables:
|
19
172
|
- god
|
20
173
|
extensions:
|
21
174
|
- ext/god/extconf.rb
|
22
|
-
- ext/god/extconf.rb
|
23
175
|
extra_rdoc_files:
|
24
176
|
- README.txt
|
25
177
|
files:
|
@@ -28,9 +180,6 @@ files:
|
|
28
180
|
- README.txt
|
29
181
|
- Rakefile
|
30
182
|
- bin/god
|
31
|
-
- examples/events.god
|
32
|
-
- examples/gravatar.god
|
33
|
-
- examples/single.god
|
34
183
|
- ext/god/.gitignore
|
35
184
|
- ext/god/extconf.rb
|
36
185
|
- ext/god/kqueue_handler.c
|
@@ -110,6 +259,8 @@ files:
|
|
110
259
|
- test/configs/matias/matias.god
|
111
260
|
- test/configs/real.rb
|
112
261
|
- test/configs/running_load/running_load.god
|
262
|
+
- test/configs/stop_options/simple_server.rb
|
263
|
+
- test/configs/stop_options/stop_options.god
|
113
264
|
- test/configs/stress/simple_server.rb
|
114
265
|
- test/configs/stress/stress.god
|
115
266
|
- test/configs/task/logs/.placeholder
|
@@ -160,35 +311,24 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
160
311
|
requirements:
|
161
312
|
- - ">="
|
162
313
|
- !ruby/object:Gem::Version
|
314
|
+
segments:
|
315
|
+
- 0
|
163
316
|
version: "0"
|
164
|
-
version:
|
165
317
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
166
318
|
requirements:
|
167
319
|
- - ">="
|
168
320
|
- !ruby/object:Gem::Version
|
321
|
+
segments:
|
322
|
+
- 0
|
169
323
|
version: "0"
|
170
|
-
version:
|
171
324
|
requirements: []
|
172
325
|
|
173
326
|
rubyforge_project: god
|
174
|
-
rubygems_version: 1.3.
|
327
|
+
rubygems_version: 1.3.6
|
175
328
|
signing_key:
|
176
|
-
specification_version:
|
177
|
-
summary:
|
329
|
+
specification_version: 2
|
330
|
+
summary: Process monitoring framework.
|
178
331
|
test_files:
|
179
|
-
- test/configs/child_events/simple_server.rb
|
180
|
-
- test/configs/child_polls/simple_server.rb
|
181
|
-
- test/configs/complex/simple_server.rb
|
182
|
-
- test/configs/contact/simple_server.rb
|
183
|
-
- test/configs/daemon_events/simple_server.rb
|
184
|
-
- test/configs/daemon_events/simple_server_stop.rb
|
185
|
-
- test/configs/daemon_polls/simple_server.rb
|
186
|
-
- test/configs/degrading_lambda/tcp_server.rb
|
187
|
-
- test/configs/real.rb
|
188
|
-
- test/configs/stress/simple_server.rb
|
189
|
-
- test/configs/test.rb
|
190
|
-
- test/helper.rb
|
191
|
-
- test/suite.rb
|
192
332
|
- test/test_behavior.rb
|
193
333
|
- test/test_campfire.rb
|
194
334
|
- test/test_condition.rb
|
@@ -207,6 +347,7 @@ test_files:
|
|
207
347
|
- test/test_logger.rb
|
208
348
|
- test/test_metric.rb
|
209
349
|
- test/test_process.rb
|
350
|
+
- test/test_prowl.rb
|
210
351
|
- test/test_registry.rb
|
211
352
|
- test/test_socket.rb
|
212
353
|
- test/test_sugar.rb
|
data/examples/events.god
DELETED
@@ -1,84 +0,0 @@
|
|
1
|
-
# This example shows how you might keep a local development Rails server up
|
2
|
-
# and running on your Mac.
|
3
|
-
|
4
|
-
# Run with:
|
5
|
-
# god -c /path/to/events.god
|
6
|
-
|
7
|
-
RAILS_ROOT = ENV['GOD_TEST_RAILS_ROOT']
|
8
|
-
|
9
|
-
%w{3002}.each do |port|
|
10
|
-
God.watch do |w|
|
11
|
-
w.name = "local-#{port}"
|
12
|
-
w.interval = 5.seconds
|
13
|
-
w.start = "mongrel_rails start -p #{port} -P #{RAILS_ROOT}/log/mongrel.#{port}.pid -c #{RAILS_ROOT} -d"
|
14
|
-
w.stop = "mongrel_rails stop -P #{RAILS_ROOT}/log/mongrel.#{port}.pid -c #{RAILS_ROOT}"
|
15
|
-
w.pid_file = File.join(RAILS_ROOT, "log/mongrel.#{port}.pid")
|
16
|
-
w.log = File.join(RAILS_ROOT, "log/commands.#{port}.log")
|
17
|
-
|
18
|
-
# clean pid files before start if necessary
|
19
|
-
w.behavior(:clean_pid_file)
|
20
|
-
|
21
|
-
# determine the state on startup
|
22
|
-
w.transition(:init, { true => :up, false => :start }) do |on|
|
23
|
-
on.condition(:process_running) do |c|
|
24
|
-
c.running = true
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
# determine when process has finished starting
|
29
|
-
w.transition([:start, :restart], :up) do |on|
|
30
|
-
on.condition(:process_running) do |c|
|
31
|
-
c.running = true
|
32
|
-
end
|
33
|
-
|
34
|
-
# failsafe
|
35
|
-
on.condition(:tries) do |c|
|
36
|
-
c.times = 8
|
37
|
-
c.within = 2.minutes
|
38
|
-
c.transition = :start
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
# start if process is not running
|
43
|
-
w.transition(:up, :start) do |on|
|
44
|
-
on.condition(:process_exits)
|
45
|
-
end
|
46
|
-
|
47
|
-
# restart if memory or cpu is too high
|
48
|
-
w.transition(:up, :restart) do |on|
|
49
|
-
on.condition(:memory_usage) do |c|
|
50
|
-
c.interval = 20
|
51
|
-
c.above = 50.megabytes
|
52
|
-
c.times = [3, 5]
|
53
|
-
end
|
54
|
-
|
55
|
-
on.condition(:cpu_usage) do |c|
|
56
|
-
c.interval = 10
|
57
|
-
c.above = 10.percent
|
58
|
-
c.times = 5
|
59
|
-
end
|
60
|
-
|
61
|
-
on.condition(:http_response_code) do |c|
|
62
|
-
c.host = 'localhost'
|
63
|
-
c.port = port
|
64
|
-
c.path = '/'
|
65
|
-
c.code_is = 500
|
66
|
-
c.timeout = 10.seconds
|
67
|
-
c.times = [3, 5]
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
# lifecycle
|
72
|
-
w.lifecycle do |on|
|
73
|
-
on.condition(:flapping) do |c|
|
74
|
-
c.to_state = [:start, :restart]
|
75
|
-
c.times = 5
|
76
|
-
c.within = 1.minute
|
77
|
-
c.transition = :unmonitored
|
78
|
-
c.retry_in = 10.minutes
|
79
|
-
c.retry_times = 5
|
80
|
-
c.retry_within = 2.hours
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
data/examples/gravatar.god
DELETED
@@ -1,54 +0,0 @@
|
|
1
|
-
# run with: god -c /path/to/gravatar.god
|
2
|
-
#
|
3
|
-
# This is the actual config file used to keep the mongrels of
|
4
|
-
# gravatar.com running.
|
5
|
-
|
6
|
-
RAILS_ROOT = "/Users/tom/dev/gravatar2"
|
7
|
-
|
8
|
-
%w{8200 8201 8202}.each do |port|
|
9
|
-
God.watch do |w|
|
10
|
-
w.name = "gravatar2-mongrel-#{port}"
|
11
|
-
w.interval = 30.seconds # default
|
12
|
-
w.start = "mongrel_rails start -c #{RAILS_ROOT} -p #{port} \
|
13
|
-
-P #{RAILS_ROOT}/log/mongrel.#{port}.pid -d"
|
14
|
-
w.stop = "mongrel_rails stop -P #{RAILS_ROOT}/log/mongrel.#{port}.pid"
|
15
|
-
w.restart = "mongrel_rails restart -P #{RAILS_ROOT}/log/mongrel.#{port}.pid"
|
16
|
-
w.start_grace = 10.seconds
|
17
|
-
w.restart_grace = 10.seconds
|
18
|
-
w.pid_file = File.join(RAILS_ROOT, "log/mongrel.#{port}.pid")
|
19
|
-
|
20
|
-
w.behavior(:clean_pid_file)
|
21
|
-
|
22
|
-
w.start_if do |start|
|
23
|
-
start.condition(:process_running) do |c|
|
24
|
-
c.interval = 5.seconds
|
25
|
-
c.running = false
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
w.restart_if do |restart|
|
30
|
-
restart.condition(:memory_usage) do |c|
|
31
|
-
c.above = 150.megabytes
|
32
|
-
c.times = [3, 5] # 3 out of 5 intervals
|
33
|
-
end
|
34
|
-
|
35
|
-
restart.condition(:cpu_usage) do |c|
|
36
|
-
c.above = 50.percent
|
37
|
-
c.times = 5
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
# lifecycle
|
42
|
-
w.lifecycle do |on|
|
43
|
-
on.condition(:flapping) do |c|
|
44
|
-
c.to_state = [:start, :restart]
|
45
|
-
c.times = 5
|
46
|
-
c.within = 5.minute
|
47
|
-
c.transition = :unmonitored
|
48
|
-
c.retry_in = 10.minutes
|
49
|
-
c.retry_times = 5
|
50
|
-
c.retry_within = 2.hours
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
data/examples/single.god
DELETED
@@ -1,66 +0,0 @@
|
|
1
|
-
RAILS_ROOT = "/Users/tom/dev/gravatar2"
|
2
|
-
|
3
|
-
God.watch do |w|
|
4
|
-
w.name = "local-3000"
|
5
|
-
w.interval = 5.seconds # default
|
6
|
-
w.start = "mongrel_rails start -c #{RAILS_ROOT} -P #{RAILS_ROOT}/log/mongrel.pid -p 3000 -d"
|
7
|
-
w.stop = "mongrel_rails stop -P #{RAILS_ROOT}/log/mongrel.pid"
|
8
|
-
w.restart = "mongrel_rails restart -P #{RAILS_ROOT}/log/mongrel.pid"
|
9
|
-
w.pid_file = File.join(RAILS_ROOT, "log/mongrel.pid")
|
10
|
-
|
11
|
-
# clean pid files before start if necessary
|
12
|
-
w.behavior(:clean_pid_file)
|
13
|
-
|
14
|
-
# determine the state on startup
|
15
|
-
w.transition(:init, { true => :up, false => :start }) do |on|
|
16
|
-
on.condition(:process_running) do |c|
|
17
|
-
c.running = true
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
# determine when process has finished starting
|
22
|
-
w.transition([:start, :restart], :up) do |on|
|
23
|
-
on.condition(:process_running) do |c|
|
24
|
-
c.running = true
|
25
|
-
end
|
26
|
-
|
27
|
-
# failsafe
|
28
|
-
on.condition(:tries) do |c|
|
29
|
-
c.times = 5
|
30
|
-
c.transition = :start
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
# start if process is not running
|
35
|
-
w.transition(:up, :start) do |on|
|
36
|
-
on.condition(:process_exits)
|
37
|
-
end
|
38
|
-
|
39
|
-
# restart if memory or cpu is too high
|
40
|
-
w.transition(:up, :restart) do |on|
|
41
|
-
on.condition(:memory_usage) do |c|
|
42
|
-
c.interval = 20
|
43
|
-
c.above = 50.megabytes
|
44
|
-
c.times = [3, 5]
|
45
|
-
end
|
46
|
-
|
47
|
-
on.condition(:cpu_usage) do |c|
|
48
|
-
c.interval = 10
|
49
|
-
c.above = 10.percent
|
50
|
-
c.times = [3, 5]
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
# lifecycle
|
55
|
-
w.lifecycle do |on|
|
56
|
-
on.condition(:flapping) do |c|
|
57
|
-
c.to_state = [:start, :restart]
|
58
|
-
c.times = 5
|
59
|
-
c.within = 5.minute
|
60
|
-
c.transition = :unmonitored
|
61
|
-
c.retry_in = 10.minutes
|
62
|
-
c.retry_times = 5
|
63
|
-
c.retry_within = 2.hours
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|