bluepill 0.0.68 → 0.0.69
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -2
- data/bin/bluepill +19 -20
- data/bin/sample_forking_server +26 -13
- data/bluepill.gemspec +12 -18
- data/lib/bluepill.rb +12 -12
- data/lib/bluepill/application.rb +64 -71
- data/lib/bluepill/application/client.rb +0 -2
- data/lib/bluepill/application/server.rb +1 -3
- data/lib/bluepill/condition_watch.rb +12 -7
- data/lib/bluepill/controller.rb +37 -42
- data/lib/bluepill/dsl.rb +1 -2
- data/lib/bluepill/dsl/app_proxy.rb +3 -4
- data/lib/bluepill/dsl/process_factory.rb +40 -44
- data/lib/bluepill/dsl/process_proxy.rb +4 -5
- data/lib/bluepill/group.rb +15 -21
- data/lib/bluepill/logger.rb +4 -4
- data/lib/bluepill/process.rb +107 -109
- data/lib/bluepill/process_conditions.rb +1 -3
- data/lib/bluepill/process_conditions/always_true.rb +2 -3
- data/lib/bluepill/process_conditions/cpu_usage.rb +0 -1
- data/lib/bluepill/process_conditions/file_time.rb +5 -6
- data/lib/bluepill/process_conditions/http.rb +11 -9
- data/lib/bluepill/process_conditions/mem_usage.rb +6 -7
- data/lib/bluepill/process_conditions/process_condition.rb +4 -5
- data/lib/bluepill/process_conditions/running_time.rb +1 -2
- data/lib/bluepill/process_conditions/zombie_process.rb +1 -2
- data/lib/bluepill/process_journal.rb +18 -21
- data/lib/bluepill/process_statistics.rb +2 -4
- data/lib/bluepill/socket.rb +13 -16
- data/lib/bluepill/system.rb +57 -63
- data/lib/bluepill/trigger.rb +9 -11
- data/lib/bluepill/triggers/flapping.rb +12 -16
- data/lib/bluepill/util/rotational_array.rb +1 -2
- data/lib/bluepill/version.rb +1 -2
- metadata +4 -28
- data/.gitignore +0 -12
- data/.rspec +0 -1
- data/.travis.yml +0 -17
- data/Gemfile +0 -27
- data/Rakefile +0 -38
- data/examples/example.rb +0 -87
- data/examples/new_example.rb +0 -89
- data/examples/new_runit_example.rb +0 -29
- data/examples/runit_example.rb +0 -26
- data/local-bluepill +0 -130
- data/spec/lib/bluepill/application_spec.rb +0 -51
- data/spec/lib/bluepill/logger_spec.rb +0 -3
- data/spec/lib/bluepill/process_spec.rb +0 -135
- data/spec/lib/bluepill/process_statistics_spec.rb +0 -24
- data/spec/lib/bluepill/system_spec.rb +0 -45
- data/spec/spec_helper.rb +0 -26
data/lib/bluepill/trigger.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
module Bluepill
|
3
2
|
class Trigger
|
4
3
|
@implementations = {}
|
@@ -20,15 +19,15 @@ module Bluepill
|
|
20
19
|
end
|
21
20
|
|
22
21
|
def reset!
|
23
|
-
|
22
|
+
cancel_all_events
|
24
23
|
end
|
25
24
|
|
26
|
-
def notify(
|
27
|
-
|
25
|
+
def notify(_transition)
|
26
|
+
fail 'Implement in subclass'
|
28
27
|
end
|
29
28
|
|
30
29
|
def dispatch!(event)
|
31
|
-
|
30
|
+
process.dispatch!(event, self.class.name.split('::').last)
|
32
31
|
end
|
33
32
|
|
34
33
|
def schedule_event(event, delay)
|
@@ -38,7 +37,7 @@ module Bluepill
|
|
38
37
|
sleep delay.to_f
|
39
38
|
trigger.dispatch!(event)
|
40
39
|
trigger.mutex.synchronize do
|
41
|
-
trigger.scheduled_events.delete_if { |_,
|
40
|
+
trigger.scheduled_events.delete_if { |_, t| t == Thread.current }
|
42
41
|
end
|
43
42
|
rescue StandardError => e
|
44
43
|
trigger.logger.err(e)
|
@@ -46,15 +45,14 @@ module Bluepill
|
|
46
45
|
end
|
47
46
|
end
|
48
47
|
|
49
|
-
|
48
|
+
scheduled_events.push([event, thread])
|
50
49
|
end
|
51
50
|
|
52
51
|
def cancel_all_events
|
53
|
-
|
54
|
-
|
55
|
-
|
52
|
+
logger.info 'Canceling all scheduled events'
|
53
|
+
mutex.synchronize do
|
54
|
+
scheduled_events.each { |_, thread| thread.kill }
|
56
55
|
end
|
57
56
|
end
|
58
|
-
|
59
57
|
end
|
60
58
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
module Bluepill
|
3
2
|
module Triggers
|
4
3
|
class Flapping < Bluepill::Trigger
|
@@ -6,7 +5,7 @@ module Bluepill
|
|
6
5
|
|
7
6
|
PARAMS = [:times, :within, :retry_in]
|
8
7
|
|
9
|
-
attr_accessor
|
8
|
+
attr_accessor(*PARAMS)
|
10
9
|
attr_reader :timeline
|
11
10
|
|
12
11
|
def initialize(process, options = {})
|
@@ -21,10 +20,9 @@ module Bluepill
|
|
21
20
|
end
|
22
21
|
|
23
22
|
def notify(transition)
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
end
|
23
|
+
return unless TRIGGER_STATES.include?(transition.to_name)
|
24
|
+
timeline << Time.now.to_i
|
25
|
+
check_flapping
|
28
26
|
end
|
29
27
|
|
30
28
|
def reset!
|
@@ -34,22 +32,20 @@ module Bluepill
|
|
34
32
|
|
35
33
|
def check_flapping
|
36
34
|
# The process has not flapped if we haven't encountered enough incidents
|
37
|
-
return unless
|
35
|
+
return unless @timeline.compact.length == times
|
38
36
|
|
39
37
|
# Check if the incident happend within the timeframe
|
40
|
-
|
38
|
+
return unless @timeline.last - @timeline.first <= within
|
41
39
|
|
42
|
-
|
43
|
-
self.logger.info "Flapping detected: retrying in #{self.retry_in} seconds"
|
40
|
+
logger.info "Flapping detected: retrying in #{retry_in} seconds"
|
44
41
|
|
45
|
-
|
46
|
-
|
42
|
+
schedule_event(:start, retry_in) unless retry_in.zero? # retry_in zero means "do not retry, ever"
|
43
|
+
schedule_event(:unmonitor, 0)
|
47
44
|
|
48
|
-
|
45
|
+
@timeline.clear
|
49
46
|
|
50
|
-
|
51
|
-
|
52
|
-
end
|
47
|
+
# This will prevent a transition from happening in the process state_machine
|
48
|
+
throw :halt
|
53
49
|
end
|
54
50
|
end
|
55
51
|
end
|
@@ -1,4 +1,3 @@
|
|
1
|
-
# -*- encoding: utf-8 -*-
|
2
1
|
module Bluepill
|
3
2
|
module Util
|
4
3
|
class RotationalArray < Array
|
@@ -11,7 +10,7 @@ module Bluepill
|
|
11
10
|
def push(value)
|
12
11
|
super(value)
|
13
12
|
|
14
|
-
|
13
|
+
shift if length > @capacity
|
15
14
|
self
|
16
15
|
end
|
17
16
|
alias_method :<<, :push
|
data/lib/bluepill/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bluepill
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.69
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arya Asemanfar
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-11-02 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: activesupport
|
@@ -99,27 +99,16 @@ executables:
|
|
99
99
|
- bpsv
|
100
100
|
- sample_forking_server
|
101
101
|
extensions: []
|
102
|
-
extra_rdoc_files:
|
103
|
-
- LICENSE
|
104
|
-
- README.md
|
102
|
+
extra_rdoc_files: []
|
105
103
|
files:
|
106
|
-
- ".gitignore"
|
107
|
-
- ".rspec"
|
108
|
-
- ".travis.yml"
|
109
104
|
- CONTRIBUTING.md
|
110
105
|
- DESIGN.md
|
111
|
-
- Gemfile
|
112
106
|
- LICENSE
|
113
107
|
- README.md
|
114
|
-
- Rakefile
|
115
108
|
- bin/bluepill
|
116
109
|
- bin/bpsv
|
117
110
|
- bin/sample_forking_server
|
118
111
|
- bluepill.gemspec
|
119
|
-
- examples/example.rb
|
120
|
-
- examples/new_example.rb
|
121
|
-
- examples/new_runit_example.rb
|
122
|
-
- examples/runit_example.rb
|
123
112
|
- lib/bluepill.rb
|
124
113
|
- lib/bluepill/application.rb
|
125
114
|
- lib/bluepill/application/client.rb
|
@@ -150,13 +139,6 @@ files:
|
|
150
139
|
- lib/bluepill/triggers/flapping.rb
|
151
140
|
- lib/bluepill/util/rotational_array.rb
|
152
141
|
- lib/bluepill/version.rb
|
153
|
-
- local-bluepill
|
154
|
-
- spec/lib/bluepill/application_spec.rb
|
155
|
-
- spec/lib/bluepill/logger_spec.rb
|
156
|
-
- spec/lib/bluepill/process_spec.rb
|
157
|
-
- spec/lib/bluepill/process_statistics_spec.rb
|
158
|
-
- spec/lib/bluepill/system_spec.rb
|
159
|
-
- spec/spec_helper.rb
|
160
142
|
homepage: http://github.com/bluepill-rb/bluepill
|
161
143
|
licenses:
|
162
144
|
- MIT
|
@@ -181,11 +163,5 @@ rubygems_version: 2.2.2
|
|
181
163
|
signing_key:
|
182
164
|
specification_version: 4
|
183
165
|
summary: A process monitor written in Ruby with stability and minimalism in mind.
|
184
|
-
test_files:
|
185
|
-
- spec/lib/bluepill/application_spec.rb
|
186
|
-
- spec/lib/bluepill/logger_spec.rb
|
187
|
-
- spec/lib/bluepill/process_spec.rb
|
188
|
-
- spec/lib/bluepill/process_statistics_spec.rb
|
189
|
-
- spec/lib/bluepill/system_spec.rb
|
190
|
-
- spec/spec_helper.rb
|
166
|
+
test_files: []
|
191
167
|
has_rdoc:
|
data/.gitignore
DELETED
data/.rspec
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
-r ./spec/spec_helper.rb -c -f progress
|
data/.travis.yml
DELETED
data/Gemfile
DELETED
@@ -1,27 +0,0 @@
|
|
1
|
-
source 'https://rubygems.org'
|
2
|
-
|
3
|
-
# Specify your gem's dependencies in bluepill.gemspec
|
4
|
-
gemspec
|
5
|
-
|
6
|
-
if RUBY_PLATFORM =~ /jruby|java/ || RUBY_VERSION =~ /1.8|1.9.2/
|
7
|
-
gem 'activesupport', '~> 3.0'
|
8
|
-
else
|
9
|
-
gem 'activesupport', '~> 4.1'
|
10
|
-
end
|
11
|
-
|
12
|
-
gem 'rake'
|
13
|
-
|
14
|
-
group :doc do
|
15
|
-
# YARD helper for ruby 1.8 (already embedded into ruby 1.9)
|
16
|
-
gem 'ripper', :platforms => :mri_18
|
17
|
-
gem 'maruku', '>= 0.7'
|
18
|
-
gem 'yard', '>= 0.8'
|
19
|
-
end
|
20
|
-
|
21
|
-
group :test do
|
22
|
-
gem 'coveralls', :require => false, :platforms => [:mri_19, :mri_20, :mri_21]
|
23
|
-
gem 'faker', '>= 1.2'
|
24
|
-
gem 'rest-client', '~> 1.6.0', :platforms => [:jruby, :ruby_18]
|
25
|
-
gem 'rspec', '>= 3'
|
26
|
-
gem 'simplecov', '>= 0.4', :platforms => :ruby_19
|
27
|
-
end
|
data/Rakefile
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
begin
|
2
|
-
require 'bundler'
|
3
|
-
Bundler::GemHelper.install_tasks
|
4
|
-
rescue LoadError
|
5
|
-
$stderr.puts "Bundler not installed. You should install it with: gem install bundler"
|
6
|
-
end
|
7
|
-
|
8
|
-
$LOAD_PATH << File.expand_path('./lib', File.dirname(__FILE__))
|
9
|
-
require 'bluepill/version'
|
10
|
-
|
11
|
-
begin
|
12
|
-
require 'rspec/core/rake_task'
|
13
|
-
|
14
|
-
RSpec::Core::RakeTask.new
|
15
|
-
|
16
|
-
if RUBY_VERSION >= '1.9'
|
17
|
-
RSpec::Core::RakeTask.new(:cov) do |t|
|
18
|
-
ENV['ENABLE_SIMPLECOV'] = '1'
|
19
|
-
t.ruby_opts = '-w'
|
20
|
-
t.rcov_opts = %q[-Ilib --exclude "spec/*,gems/*"]
|
21
|
-
end
|
22
|
-
end
|
23
|
-
rescue LoadError
|
24
|
-
$stderr.puts "RSpec not available. Install it with: gem install rspec-core rspec-expectations rr faker"
|
25
|
-
end
|
26
|
-
|
27
|
-
begin
|
28
|
-
require 'yard'
|
29
|
-
YARD::Rake::YardocTask.new do |yard|
|
30
|
-
yard.options << "--title='bluepill #{Bluepill::VERSION}'"
|
31
|
-
|
32
|
-
end
|
33
|
-
rescue LoadError
|
34
|
-
$stderr.puts "Please install YARD with: gem install yard"
|
35
|
-
end
|
36
|
-
|
37
|
-
task :test => :spec
|
38
|
-
task :default => :spec
|
data/examples/example.rb
DELETED
@@ -1,87 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bluepill'
|
3
|
-
require 'logger'
|
4
|
-
|
5
|
-
ROOT_DIR = "/tmp/bp"
|
6
|
-
|
7
|
-
# Watch with
|
8
|
-
# watch -n0.2 'ps axu | egrep "(CPU|forking|bluepill|sleep)" | grep -v grep | sort'
|
9
|
-
Bluepill.application(:sample_app) do |app|
|
10
|
-
0.times do |i|
|
11
|
-
app.process("process_#{i}") do |process|
|
12
|
-
process.pid_file = "#{ROOT_DIR}/pids/process_#{i}.pid"
|
13
|
-
|
14
|
-
# Example of use of pid_command option to find memcached process
|
15
|
-
# process.pid_command = "ps -ef | awk '/memcached$/{ print $2 }'"
|
16
|
-
|
17
|
-
# I could not figure out a portable way to
|
18
|
-
# specify the path to the sample forking server across the diff developer laptops.
|
19
|
-
# Since this code is eval'ed we cannot reliably use __FILE__
|
20
|
-
process.start_command = "/Users/rohith/work/bluepill/bin/sample_forking_server #{4242 + i}"
|
21
|
-
process.stop_command = "kill -INT {{PID}}"
|
22
|
-
process.daemonize = true
|
23
|
-
|
24
|
-
process.start_grace_time = 1.seconds
|
25
|
-
process.restart_grace_time = 7.seconds
|
26
|
-
process.stop_grace_time = 7.seconds
|
27
|
-
|
28
|
-
process.uid = "rohith"
|
29
|
-
process.gid = "staff"
|
30
|
-
|
31
|
-
# process.checks :cpu_usage, :every => 10, :below => 0.5, :times => [5, 5]
|
32
|
-
process.checks :flapping, :times => 2, :within => 30.seconds, :retry_in => 7.seconds
|
33
|
-
|
34
|
-
process.monitor_children do |child_process|
|
35
|
-
# child_process.checks :cpu_usage,
|
36
|
-
# :every => 10,
|
37
|
-
# :below => 0.5,
|
38
|
-
# :times => [5, 5]
|
39
|
-
|
40
|
-
# child_process.checks :mem_usage,
|
41
|
-
# :every => 3,
|
42
|
-
# :below => 600.kilobytes,
|
43
|
-
# :times => [3, 5],
|
44
|
-
# :fires => [:stop]
|
45
|
-
|
46
|
-
child_process.stop_command = "kill -QUIT {{PID}}"
|
47
|
-
# child_process.checks :flapping, :times => 2, :within => 30.seconds, :retry_in => 7.seconds
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
0.times do |i|
|
53
|
-
app.process("group_process_#{i}") do |process|
|
54
|
-
process.group = "group_1"
|
55
|
-
process.pid_file = "/Users/rohith/ffs/tmp/pids/mongrel_#{i}.pid"
|
56
|
-
process.start_command = "cd ~/ffs && mongrel_rails start -P #{process.pid_file} -p 3000 -d"
|
57
|
-
|
58
|
-
process.start_grace_time = 10.seconds
|
59
|
-
|
60
|
-
process.uid = "rohith"
|
61
|
-
process.gid = "staff"
|
62
|
-
|
63
|
-
# process.checks :always_true, :every => 10
|
64
|
-
end
|
65
|
-
end
|
66
|
-
|
67
|
-
1.times do |i|
|
68
|
-
app.process("group_process_#{i}") do |process|
|
69
|
-
process.auto_start = false
|
70
|
-
|
71
|
-
process.uid = "rohith"
|
72
|
-
process.gid = "wheel"
|
73
|
-
|
74
|
-
process.stderr = "/tmp/err.log"
|
75
|
-
process.stdout = "/tmp/err.log"
|
76
|
-
|
77
|
-
|
78
|
-
process.group = "grouped"
|
79
|
-
process.start_command = %Q{cd /tmp && ruby -e '$stderr.puts("hello stderr");$stdout.puts("hello stdout"); $stdout.flush; $stderr.flush; sleep 10'}
|
80
|
-
process.daemonize = true
|
81
|
-
process.pid_file = "/tmp/noperm/p_#{process.group}_#{i}.pid"
|
82
|
-
|
83
|
-
# process.checks :always_true, :every => 5
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
data/examples/new_example.rb
DELETED
@@ -1,89 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'bluepill'
|
3
|
-
require 'logger'
|
4
|
-
|
5
|
-
# Note that this syntax supported from bluepill 0.0.50
|
6
|
-
|
7
|
-
ROOT_DIR = "/tmp/bp"
|
8
|
-
|
9
|
-
# Watch with
|
10
|
-
# watch -n0.2 'ps axu | egrep "(CPU|forking|bluepill|sleep)" | grep -v grep | sort'
|
11
|
-
Bluepill.application(:sample_app) do
|
12
|
-
0.times do |i|
|
13
|
-
process("process_#{i}") do
|
14
|
-
pid_file "#{ROOT_DIR}/pids/process_#{i}.pid"
|
15
|
-
|
16
|
-
# Example of use of pid_command option to find memcached process
|
17
|
-
# pid_command = "ps -ef | awk '/memcached$/{ print $2 }'"
|
18
|
-
|
19
|
-
# I could not figure out a portable way to
|
20
|
-
# specify the path to the sample forking server across the diff developer laptops.
|
21
|
-
# Since this code is eval'ed we cannot reliably use __FILE__
|
22
|
-
start_command "/Users/rohith/work/bluepill/bin/sample_forking_server #{4242 + i}"
|
23
|
-
stop_command "kill -INT {{PID}}"
|
24
|
-
daemonize!
|
25
|
-
|
26
|
-
start_grace_time 1.seconds
|
27
|
-
restart_grace_time 7.seconds
|
28
|
-
stop_grace_time 7.seconds
|
29
|
-
|
30
|
-
uid "rohith"
|
31
|
-
gid "staff"
|
32
|
-
|
33
|
-
# checks :cpu_usage, :every => 10, :below => 0.5, :times => [5, 5]
|
34
|
-
checks :flapping, :times => 2, :within => 30.seconds, :retry_in => 7.seconds
|
35
|
-
|
36
|
-
monitor_children do
|
37
|
-
# checks :cpu_usage,
|
38
|
-
# :every => 10,
|
39
|
-
# :below => 0.5,
|
40
|
-
# :times => [5, 5]
|
41
|
-
|
42
|
-
# checks :mem_usage,
|
43
|
-
# :every => 3,
|
44
|
-
# :below => 600.kilobytes,
|
45
|
-
# :times => [3, 5],
|
46
|
-
# :fires => [:stop]
|
47
|
-
|
48
|
-
stop_command "kill -QUIT {{PID}}"
|
49
|
-
# checks :flapping, :times => 2, :within => 30.seconds, :retry_in => 7.seconds
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
0.times do |i|
|
55
|
-
process("group_process_#{i}") do
|
56
|
-
group "group_1"
|
57
|
-
pid_file "/Users/rohith/ffs/tmp/pids/mongrel_#{i}.pid"
|
58
|
-
start_command "cd ~/ffs && mongrel_rails start -P #{pid_file} -p 3000 -d"
|
59
|
-
|
60
|
-
start_grace_time 10.seconds
|
61
|
-
|
62
|
-
uid "rohith"
|
63
|
-
gid "staff"
|
64
|
-
|
65
|
-
# checks :always_true, :every => 10
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
1.times do |i|
|
70
|
-
process("group_process_#{i}") do
|
71
|
-
auto_start false
|
72
|
-
|
73
|
-
uid "rohith"
|
74
|
-
gid "wheel"
|
75
|
-
|
76
|
-
stderr "/tmp/err.log"
|
77
|
-
stdout "/tmp/err.log"
|
78
|
-
|
79
|
-
|
80
|
-
group "grouped"
|
81
|
-
start_command %Q{cd /tmp && ruby -e '$stderr.puts("hello stderr");$stdout.puts("hello stdout"); $stdout.flush; $stderr.flush; sleep 10'}
|
82
|
-
daemonize!
|
83
|
-
pid_file "/tmp/noperm/p_#{group}_#{i}.pid"
|
84
|
-
|
85
|
-
# checks :always_true, :every => 5
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|