bluepill 0.0.68 → 0.0.69
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.
- 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
|
-
|