eye 0.7 → 0.8.celluloid15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +141 -0
- data/.travis.yml +5 -3
- data/CHANGES.md +9 -1
- data/README.md +5 -2
- data/Rakefile +6 -6
- data/bin/leye +9 -4
- data/bin/loader_eye +14 -15
- data/examples/custom_check.eye +24 -0
- data/examples/custom_trigger.eye +30 -0
- data/examples/delayed_job.eye +3 -3
- data/examples/dependency.eye +10 -11
- data/examples/leye_example/Eyefile +10 -0
- data/examples/notify.eye +3 -4
- data/examples/plugin/main.eye +5 -5
- data/examples/plugin/plugin.rb +10 -2
- data/examples/process_thin.rb +8 -8
- data/examples/processes/em.rb +18 -12
- data/examples/processes/forking.rb +5 -5
- data/examples/processes/sample.rb +46 -44
- data/examples/puma.eye +9 -8
- data/examples/rbenv.eye +5 -5
- data/examples/sidekiq.eye +3 -3
- data/examples/stress_test.eye +4 -4
- data/examples/syslog.eye +1 -1
- data/examples/test.eye +1 -2
- data/examples/thin-farm.eye +7 -8
- data/examples/triggers.eye +13 -15
- data/examples/unicorn.eye +12 -13
- data/eye.gemspec +16 -14
- data/lib/eye.rb +2 -3
- data/lib/eye/application.rb +5 -6
- data/lib/eye/checker.rb +44 -25
- data/lib/eye/checker/children_count.rb +1 -1
- data/lib/eye/checker/file_ctime.rb +1 -1
- data/lib/eye/checker/http.rb +13 -15
- data/lib/eye/checker/nop.rb +1 -0
- data/lib/eye/checker/socket.rb +60 -63
- data/lib/eye/checker/ssl_socket.rb +5 -5
- data/lib/eye/child_process.rb +6 -4
- data/lib/eye/cli.rb +74 -46
- data/lib/eye/cli/commands.rb +4 -5
- data/lib/eye/cli/render.rb +61 -41
- data/lib/eye/cli/server.rb +19 -16
- data/lib/eye/client.rb +1 -0
- data/lib/eye/config.rb +36 -33
- data/lib/eye/controller.rb +2 -3
- data/lib/eye/controller/commands.rb +1 -1
- data/lib/eye/controller/helpers.rb +2 -2
- data/lib/eye/controller/load.rb +19 -17
- data/lib/eye/controller/options.rb +1 -5
- data/lib/eye/controller/send_command.rb +21 -23
- data/lib/eye/controller/status.rb +17 -14
- data/lib/eye/dsl.rb +6 -1
- data/lib/eye/dsl/application_opts.rb +4 -3
- data/lib/eye/dsl/chain.rb +2 -2
- data/lib/eye/dsl/child_process_opts.rb +3 -3
- data/lib/eye/dsl/config_opts.rb +7 -7
- data/lib/eye/dsl/group_opts.rb +3 -3
- data/lib/eye/dsl/helpers.rb +1 -1
- data/lib/eye/dsl/main.rb +4 -3
- data/lib/eye/dsl/opts.rb +31 -28
- data/lib/eye/dsl/process_opts.rb +13 -7
- data/lib/eye/dsl/pure_opts.rb +13 -9
- data/lib/eye/dsl/validation.rb +48 -35
- data/lib/eye/group.rb +23 -8
- data/lib/eye/group/chain.rb +6 -6
- data/lib/eye/loader.rb +3 -3
- data/lib/eye/local.rb +9 -4
- data/lib/eye/logger.rb +11 -4
- data/lib/eye/notify.rb +10 -6
- data/lib/eye/notify/jabber.rb +1 -1
- data/lib/eye/notify/mail.rb +2 -2
- data/lib/eye/notify/slack.rb +4 -3
- data/lib/eye/process.rb +2 -0
- data/lib/eye/process/children.rb +4 -4
- data/lib/eye/process/commands.rb +38 -39
- data/lib/eye/process/config.rb +22 -16
- data/lib/eye/process/controller.rb +5 -19
- data/lib/eye/process/data.rb +11 -9
- data/lib/eye/process/monitor.rb +86 -76
- data/lib/eye/process/notify.rb +10 -10
- data/lib/eye/process/scheduler.rb +36 -31
- data/lib/eye/process/states.rb +7 -5
- data/lib/eye/process/states_history.rb +9 -3
- data/lib/eye/process/system.rb +35 -20
- data/lib/eye/process/trigger.rb +1 -5
- data/lib/eye/process/watchers.rb +12 -9
- data/lib/eye/reason.rb +4 -1
- data/lib/eye/server.rb +3 -2
- data/lib/eye/system.rb +22 -15
- data/lib/eye/system_resources.rb +17 -8
- data/lib/eye/trigger.rb +18 -16
- data/lib/eye/trigger/check_dependency.rb +7 -4
- data/lib/eye/trigger/flapping.rb +24 -7
- data/lib/eye/trigger/starting_guard.rb +7 -6
- data/lib/eye/trigger/stop_children.rb +2 -2
- data/lib/eye/trigger/transition.rb +1 -1
- data/lib/eye/trigger/wait_dependency.rb +3 -2
- data/lib/eye/utils.rb +4 -3
- data/lib/eye/utils/alive_array.rb +9 -4
- data/lib/eye/utils/celluloid_chain.rb +12 -10
- data/lib/eye/utils/mini_active_support.rb +16 -16
- data/lib/eye/utils/pmap.rb +2 -0
- data/lib/eye/utils/tail.rb +2 -2
- metadata +39 -8
- data/lib/eye/utils/leak_19.rb +0 -10
data/examples/sidekiq.eye
CHANGED
@@ -10,14 +10,14 @@ def sidekiq_process(proxy, name)
|
|
10
10
|
daemonize true
|
11
11
|
stop_signals [:USR1, 0, :TERM, 10.seconds, :KILL]
|
12
12
|
|
13
|
-
check :cpu, :
|
14
|
-
check :memory, :
|
13
|
+
check :cpu, every: 30, below: 100, times: 5
|
14
|
+
check :memory, every: 30, below: 300.megabytes, times: 5
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
Eye.application :sidekiq_test do
|
19
19
|
working_dir File.expand_path(File.join(File.dirname(__FILE__), %w[ processes ]))
|
20
|
-
env
|
20
|
+
env 'RAILS_ENV' => 'production'
|
21
21
|
|
22
22
|
sidekiq_process self, :sidekiq
|
23
23
|
end
|
data/examples/stress_test.eye
CHANGED
@@ -3,16 +3,16 @@
|
|
3
3
|
PREFIX = ENV['PRE'] || ENV['EYE_V'] || 1
|
4
4
|
|
5
5
|
Eye.app :stress_test do
|
6
|
-
working_dir
|
6
|
+
working_dir '/tmp'
|
7
7
|
|
8
8
|
100.times do |i|
|
9
9
|
process "sleep-#{i}" do
|
10
10
|
pid_file "sleep-#{PREFIX}-#{i}.pid"
|
11
|
-
start_command
|
11
|
+
start_command 'sleep 120'
|
12
12
|
daemonize true
|
13
13
|
|
14
|
-
checks :cpu, :
|
15
|
-
checks :memory, :
|
14
|
+
checks :cpu, every: 5.seconds, below: 10, times: 5
|
15
|
+
checks :memory, every: 6.seconds, below: 50.megabytes, times: 5
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
data/examples/syslog.eye
CHANGED
data/examples/test.eye
CHANGED
@@ -66,7 +66,7 @@ Eye.application 'test' do
|
|
66
66
|
end
|
67
67
|
|
68
68
|
# eventmachine process, daemonized with eye
|
69
|
-
process :event_machine do
|
69
|
+
process :event_machine do
|
70
70
|
pid_file 'em.pid'
|
71
71
|
start_command 'ruby em.rb'
|
72
72
|
stdout 'em.log'
|
@@ -86,5 +86,4 @@ Eye.application 'test' do
|
|
86
86
|
check :http, url: 'http://127.0.0.1:33233/hello', pattern: /World/,
|
87
87
|
every: 5.seconds, times: [2, 3], timeout: 1.second
|
88
88
|
end
|
89
|
-
|
90
89
|
end
|
data/examples/thin-farm.eye
CHANGED
@@ -1,30 +1,29 @@
|
|
1
1
|
RUBY = 'ruby'
|
2
2
|
BUNDLE = 'bundle'
|
3
3
|
|
4
|
-
Eye.load(
|
4
|
+
Eye.load('process_thin.rb')
|
5
5
|
|
6
6
|
Eye.config do
|
7
|
-
logger
|
7
|
+
logger '/tmp/eye.log'
|
8
8
|
end
|
9
9
|
|
10
10
|
Eye.app 'thin-farm' do
|
11
11
|
working_dir File.expand_path(File.join(File.dirname(__FILE__), %w[ processes ]))
|
12
|
-
env
|
12
|
+
env 'RAILS_ENV' => 'production'
|
13
13
|
|
14
14
|
# more about stop_on_delete: https://github.com/kostya/eye/wiki/About-stop_on_delete-=-true
|
15
15
|
stop_on_delete true
|
16
16
|
|
17
|
-
trigger :flapping, :
|
18
|
-
check :memory, :
|
17
|
+
trigger :flapping, times: 10, within: 1.minute
|
18
|
+
check :memory, below: 60.megabytes, every: 30.seconds, times: 5
|
19
19
|
start_timeout 30.seconds
|
20
20
|
|
21
21
|
group :web do
|
22
|
-
chain :
|
23
|
-
chain :
|
22
|
+
chain action: :restart, grace: 5.seconds
|
23
|
+
chain action: :start, grace: 0.2.seconds
|
24
24
|
|
25
25
|
(5555..5560).each do |port|
|
26
26
|
thin self, port
|
27
27
|
end
|
28
28
|
end
|
29
|
-
|
30
29
|
end
|
data/examples/triggers.eye
CHANGED
@@ -5,15 +5,14 @@
|
|
5
5
|
# process.execute_sync(cmd, opts)
|
6
6
|
|
7
7
|
Eye.config do
|
8
|
-
logger
|
8
|
+
logger '/tmp/eye.log'
|
9
9
|
end
|
10
10
|
|
11
11
|
Eye.app :triggers do
|
12
|
-
|
13
12
|
# Execute shell command before process start
|
14
13
|
process :a do
|
15
|
-
pid_file
|
16
|
-
start_command
|
14
|
+
pid_file '/tmp/a.pid'
|
15
|
+
start_command 'sleep 100'
|
17
16
|
daemonize true
|
18
17
|
|
19
18
|
# send message async which sendxmpp, before process start
|
@@ -24,41 +23,40 @@ Eye.app :triggers do
|
|
24
23
|
|
25
24
|
# Touch some file before process start, remove file after process die
|
26
25
|
process :b do
|
27
|
-
pid_file
|
28
|
-
start_command
|
26
|
+
pid_file '/tmp/b.pid'
|
27
|
+
start_command 'sleep 100'
|
29
28
|
daemonize true
|
30
29
|
|
31
30
|
# before process starting, touch some file
|
32
31
|
trigger :transition1, to: :starting, do: -> {
|
33
|
-
process.execute_sync
|
32
|
+
process.execute_sync 'touch /tmp/bla.file'
|
34
33
|
}
|
35
34
|
|
36
35
|
# after process, crashed, or stopped, remove that file
|
37
36
|
trigger :transition2, to: :down, do: -> {
|
38
|
-
process.execute_sync
|
37
|
+
process.execute_sync 'rm /tmp/bla.file'
|
39
38
|
}
|
40
39
|
end
|
41
40
|
|
42
41
|
# With restart :c process, send restart to process :a
|
43
42
|
process :c do
|
44
|
-
pid_file
|
45
|
-
start_command
|
43
|
+
pid_file '/tmp/c.pid'
|
44
|
+
start_command 'sleep 100'
|
46
45
|
daemonize true
|
47
46
|
|
48
47
|
app_name = app.name
|
49
|
-
trigger :transition, :
|
50
|
-
info
|
48
|
+
trigger :transition, event: :restarting, do: ->{
|
49
|
+
info 'send restarting to :a'
|
51
50
|
Eye::Control.command('restart', "#{app_name}:a")
|
52
51
|
}
|
53
52
|
end
|
54
53
|
|
55
54
|
# process d cant start, until file /tmp/bla contains string 'bla'
|
56
55
|
process :d do
|
57
|
-
pid_file
|
58
|
-
start_command
|
56
|
+
pid_file '/tmp/d.pid'
|
57
|
+
start_command 'sleep 100'
|
59
58
|
daemonize true
|
60
59
|
|
61
60
|
trigger :starting_guard, every: 5.seconds, should: -> { `cat /tmp/bla` =~ /bla/ }
|
62
61
|
end
|
63
|
-
|
64
62
|
end
|
data/examples/unicorn.eye
CHANGED
@@ -3,37 +3,36 @@
|
|
3
3
|
RUBY = '/usr/local/ruby/1.9.3/bin/ruby' # ruby on the server
|
4
4
|
RAILS_ENV = 'production'
|
5
5
|
|
6
|
-
Eye.application
|
7
|
-
env
|
6
|
+
Eye.application 'rails_unicorn' do
|
7
|
+
env 'RAILS_ENV' => RAILS_ENV
|
8
8
|
|
9
9
|
# unicorn requires to be `ruby` in path (for soft restart)
|
10
|
-
env
|
10
|
+
env 'PATH' => "#{File.dirname(RUBY)}:#{ENV['PATH']}"
|
11
11
|
|
12
12
|
working_dir File.expand_path(File.join(File.dirname(__FILE__), %w[ processes ]))
|
13
13
|
|
14
|
-
process(
|
15
|
-
pid_file
|
14
|
+
process('unicorn') do
|
15
|
+
pid_file 'tmp/pids/unicorn.pid'
|
16
16
|
start_command "#{RUBY} ./bin/unicorn -Dc ./config/unicorn.rb -E #{RAILS_ENV}"
|
17
|
-
stdall
|
17
|
+
stdall 'log/unicorn.log'
|
18
18
|
|
19
19
|
# stop signals:
|
20
20
|
# http://unicorn.bogomips.org/SIGNALS.html
|
21
21
|
stop_signals [:TERM, 10.seconds]
|
22
22
|
|
23
23
|
# soft restart
|
24
|
-
restart_command
|
24
|
+
restart_command 'kill -USR2 {PID}'
|
25
25
|
|
26
|
-
check :cpu, :
|
27
|
-
check :memory, :
|
26
|
+
check :cpu, every: 30, below: 80, times: 3
|
27
|
+
check :memory, every: 30, below: 150.megabytes, times: [3, 5]
|
28
28
|
|
29
29
|
start_timeout 100.seconds
|
30
30
|
restart_grace 30.seconds
|
31
31
|
|
32
32
|
monitor_children do
|
33
|
-
stop_command
|
34
|
-
check :cpu, :
|
35
|
-
check :memory, :
|
33
|
+
stop_command 'kill -QUIT {PID}'
|
34
|
+
check :cpu, every: 30, below: 80, times: 3
|
35
|
+
check :memory, every: 30, below: 150.megabytes, times: [3, 5]
|
36
36
|
end
|
37
37
|
end
|
38
|
-
|
39
38
|
end
|
data/eye.gemspec
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
require File.expand_path('../lib/eye', __FILE__)
|
2
2
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
|
-
gem.authors =
|
5
|
-
gem.email =
|
4
|
+
gem.authors = 'Konstantin Makarchev'
|
5
|
+
gem.email = 'eye-rb@googlegroups.com'
|
6
6
|
|
7
7
|
gem.description = gem.summary = \
|
8
|
-
|
9
|
-
gem.homepage =
|
8
|
+
'Process monitoring tool. Inspired from Bluepill and God. Requires Ruby(MRI) >= 1.9.3-p194. Uses Celluloid and Celluloid::IO.'
|
9
|
+
gem.homepage = 'http://github.com/kostya/eye'
|
10
10
|
|
11
|
-
gem.files = `git ls-files`.split($\).reject{|n| n =~ %r[png|gif\z]}.reject{|n| n =~ %r[^(test|spec|features)/]}
|
12
|
-
gem.executables = gem.files.grep(%r
|
13
|
-
#gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
-
gem.name =
|
15
|
-
gem.require_paths = [
|
11
|
+
gem.files = `git ls-files`.split($\).reject { |n| n =~ %r[png|gif\z] }.reject { |n| n =~ %r[^(test|spec|features)/] }
|
12
|
+
gem.executables = gem.files.grep(%r[^bin/]).map { |f| File.basename(f) }
|
13
|
+
# gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
14
|
+
gem.name = 'eye'
|
15
|
+
gem.require_paths = ['lib']
|
16
16
|
gem.version = Eye::VERSION
|
17
|
-
gem.license =
|
17
|
+
gem.license = 'MIT'
|
18
18
|
|
19
19
|
gem.required_ruby_version = '>= 1.9.2'
|
20
20
|
gem.required_rubygems_version = '>= 1.3.6'
|
21
21
|
|
22
|
-
gem.add_dependency 'celluloid', '~> 0.
|
23
|
-
gem.add_dependency 'celluloid-io', '~> 0.
|
22
|
+
gem.add_dependency 'celluloid', '~> 0.15.0'
|
23
|
+
gem.add_dependency 'celluloid-io', '~> 0.15.0'
|
24
24
|
gem.add_dependency 'state_machine'
|
25
25
|
gem.add_dependency 'thor'
|
26
|
-
gem.add_dependency 'sigar',
|
26
|
+
gem.add_dependency 'sigar', '~> 0.7.3'
|
27
27
|
|
28
28
|
gem.add_development_dependency 'rake'
|
29
29
|
gem.add_development_dependency 'rspec', '< 2.14'
|
@@ -31,13 +31,15 @@ Gem::Specification.new do |gem|
|
|
31
31
|
gem.add_development_dependency 'ruby-graphviz'
|
32
32
|
gem.add_development_dependency 'forking'
|
33
33
|
gem.add_development_dependency 'fakeweb'
|
34
|
-
gem.add_development_dependency 'eventmachine',
|
34
|
+
gem.add_development_dependency 'eventmachine', '>= 1.0.3'
|
35
35
|
gem.add_development_dependency 'sinatra'
|
36
36
|
gem.add_development_dependency 'thin'
|
37
37
|
gem.add_development_dependency 'xmpp4r'
|
38
38
|
gem.add_development_dependency 'slack-notifier'
|
39
39
|
gem.add_development_dependency 'coveralls'
|
40
|
+
gem.add_development_dependency 'tins', '1.6.0' # for coveralls
|
40
41
|
gem.add_development_dependency 'simplecov', '>= 0.8.1'
|
41
42
|
gem.add_development_dependency 'parallel_tests', '<= 1.3.1'
|
42
43
|
gem.add_development_dependency 'parallel_split_test'
|
44
|
+
gem.add_development_dependency 'rubocop'
|
43
45
|
end
|
data/lib/eye.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Eye
|
2
|
-
VERSION =
|
2
|
+
VERSION = '0.8.celluloid15'
|
3
3
|
ABOUT = "Eye v#{VERSION} (c) 2012-2015 @kostya"
|
4
4
|
PROCLINE = "eye monitoring v#{VERSION}"
|
5
5
|
|
@@ -8,7 +8,7 @@ module Eye
|
|
8
8
|
autoload :Server, 'eye/server'
|
9
9
|
autoload :Logger, 'eye/logger'
|
10
10
|
autoload :System, 'eye/system'
|
11
|
-
autoload :SystemResources,'eye/system_resources'
|
11
|
+
autoload :SystemResources, 'eye/system_resources'
|
12
12
|
autoload :Checker, 'eye/checker'
|
13
13
|
autoload :Trigger, 'eye/trigger'
|
14
14
|
autoload :Group, 'eye/group'
|
@@ -21,7 +21,6 @@ module Eye
|
|
21
21
|
autoload :Config, 'eye/config'
|
22
22
|
autoload :Reason, 'eye/reason'
|
23
23
|
autoload :Sigar, 'eye/sigar'
|
24
|
-
|
25
24
|
autoload :Controller, 'eye/controller'
|
26
25
|
autoload :Control, 'eye/control'
|
27
26
|
autoload :Cli, 'eye/cli'
|
data/lib/eye/application.rb
CHANGED
@@ -21,13 +21,12 @@ class Eye::Application
|
|
21
21
|
@groups << group
|
22
22
|
end
|
23
23
|
|
24
|
-
# sort processes in name order
|
25
24
|
def resort_groups
|
26
|
-
@groups
|
25
|
+
@groups.sort! # used group method <=> to compare
|
27
26
|
end
|
28
27
|
|
29
|
-
def status_data(
|
30
|
-
h = { name: @name, type: :application, subtree: @groups.map{|gr| gr.status_data(
|
28
|
+
def status_data(opts = {})
|
29
|
+
h = { name: @name, type: :application, subtree: @groups.map { |gr| gr.status_data(opts) } }
|
31
30
|
h[:debug] = debug_data if debug
|
32
31
|
h
|
33
32
|
end
|
@@ -53,13 +52,13 @@ class Eye::Application
|
|
53
52
|
|
54
53
|
def sub_object?(obj)
|
55
54
|
res = @groups.include?(obj)
|
56
|
-
res = @groups.any?{|gr| gr.sub_object?(obj)}
|
55
|
+
res = @groups.any? { |gr| gr.sub_object?(obj) } unless res
|
57
56
|
res
|
58
57
|
end
|
59
58
|
|
60
59
|
def processes
|
61
60
|
out = []
|
62
|
-
@groups.each{|gr| out += gr.processes.to_a }
|
61
|
+
@groups.each { |gr| out += gr.processes.to_a }
|
63
62
|
Eye::Utils::AliveArray.new(out)
|
64
63
|
end
|
65
64
|
|
data/lib/eye/checker.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
class Eye::Checker
|
2
|
+
|
2
3
|
include Eye::Dsl::Validation
|
3
4
|
|
4
5
|
autoload :Memory, 'eye/checker/memory'
|
@@ -6,35 +7,35 @@ class Eye::Checker
|
|
6
7
|
autoload :Http, 'eye/checker/http'
|
7
8
|
autoload :FileCTime, 'eye/checker/file_ctime'
|
8
9
|
autoload :FileSize, 'eye/checker/file_size'
|
9
|
-
autoload :FileTouched,'eye/checker/file_touched'
|
10
|
+
autoload :FileTouched, 'eye/checker/file_touched'
|
10
11
|
autoload :Socket, 'eye/checker/socket'
|
11
12
|
autoload :SslSocket, 'eye/checker/ssl_socket'
|
12
13
|
autoload :Nop, 'eye/checker/nop'
|
13
14
|
autoload :Runtime, 'eye/checker/runtime'
|
14
15
|
autoload :Cputime, 'eye/checker/cputime'
|
15
16
|
autoload :ChildrenCount, 'eye/checker/children_count'
|
16
|
-
autoload :ChildrenMemory,'eye/checker/children_memory'
|
17
|
+
autoload :ChildrenMemory, 'eye/checker/children_memory'
|
17
18
|
|
18
|
-
TYPES = {:
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
TYPES = { memory: 'Memory', cpu: 'Cpu', http: 'Http',
|
20
|
+
ctime: 'FileCTime', fsize: 'FileSize', file_touched: 'FileTouched',
|
21
|
+
socket: 'Socket', nop: 'Nop', runtime: 'Runtime', cputime: 'Cputime',
|
22
|
+
children_count: 'ChildrenCount', children_memory: 'ChildrenMemory', ssl_socket: 'SslSocket' }
|
22
23
|
|
23
24
|
attr_accessor :value, :values, :options, :pid, :type, :check_count, :process
|
24
25
|
|
25
26
|
param :every, [Fixnum, Float], false, 5
|
26
27
|
param :times, [Fixnum, Array], nil, 1
|
27
|
-
param :fires, [Symbol, Array], nil, nil, [:stop, :restart, :unmonitor, :start, :delete, :nothing, :notify]
|
28
|
+
param :fires, [Symbol, Array, Proc], nil, nil, [:stop, :restart, :unmonitor, :start, :delete, :nothing, :notify]
|
28
29
|
param :initial_grace, [Fixnum, Float]
|
29
30
|
param :skip_initial_fails, [TrueClass, FalseClass]
|
30
31
|
|
31
32
|
def self.name_and_class(type)
|
32
33
|
type = type.to_sym
|
33
|
-
return {:
|
34
|
+
return { name: type, type: type } if TYPES[type]
|
34
35
|
|
35
|
-
if type =~
|
36
|
-
ctype =
|
37
|
-
return {:
|
36
|
+
if type =~ %r[\A(.*?)_?[0-9]+\z]
|
37
|
+
ctype = Regexp.last_match(1).to_sym
|
38
|
+
return { name: type, type: ctype } if TYPES[ctype]
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
@@ -50,7 +51,7 @@ class Eye::Checker
|
|
50
51
|
def self.create(pid, options = {}, process = nil)
|
51
52
|
get_class(options[:type]).new(pid, options, process)
|
52
53
|
|
53
|
-
rescue
|
54
|
+
rescue Object => ex
|
54
55
|
log_ex(ex)
|
55
56
|
nil
|
56
57
|
end
|
@@ -79,11 +80,11 @@ class Eye::Checker
|
|
79
80
|
end
|
80
81
|
|
81
82
|
def logger_tag
|
82
|
-
@process.logger.prefix
|
83
|
+
@logger_tag ||= @process ? @process.logger.prefix : nil
|
83
84
|
end
|
84
85
|
|
85
86
|
def logger_sub_tag
|
86
|
-
"check:#{check_name}"
|
87
|
+
@logger_sub_tag ||= "check:#{check_name}"
|
87
88
|
end
|
88
89
|
|
89
90
|
def last_human_values
|
@@ -96,22 +97,24 @@ class Eye::Checker
|
|
96
97
|
end
|
97
98
|
|
98
99
|
def check
|
99
|
-
if initial_grace
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
100
|
+
if initial_grace
|
101
|
+
if Time.now - @initialized_at < initial_grace
|
102
|
+
debug { 'skipped initial grace' }
|
103
|
+
return true
|
104
|
+
else
|
105
|
+
@options[:initial_grace] = nil
|
106
|
+
end
|
104
107
|
end
|
105
108
|
|
106
109
|
@value = get_value_safe
|
107
110
|
@good_value = good?(value)
|
108
|
-
@values << {:
|
111
|
+
@values << { value: @value, good: @good_value }
|
109
112
|
|
110
113
|
result = true
|
111
114
|
@check_count += 1
|
112
115
|
|
113
116
|
if @values.size == max_tries
|
114
|
-
bad_count = @values.count{|v| !v[:good] }
|
117
|
+
bad_count = @values.count { |v| !v[:good] }
|
115
118
|
result = false if bad_count >= min_tries
|
116
119
|
end
|
117
120
|
|
@@ -123,10 +126,10 @@ class Eye::Checker
|
|
123
126
|
end
|
124
127
|
end
|
125
128
|
|
126
|
-
info "#{last_human_values} => #{result ? 'OK' : 'Fail'}"
|
129
|
+
info { "#{last_human_values} => #{result ? 'OK' : 'Fail'}" }
|
127
130
|
result
|
128
131
|
|
129
|
-
rescue
|
132
|
+
rescue Object => ex
|
130
133
|
log_ex(ex)
|
131
134
|
end
|
132
135
|
|
@@ -189,7 +192,12 @@ class Eye::Checker
|
|
189
192
|
process.notify :warn, "Bounded #{check_name}: #{last_human_values} send to #{actions}"
|
190
193
|
|
191
194
|
actions.each do |action|
|
192
|
-
|
195
|
+
reason = Eye::Reason.new("bounded #{check_name}")
|
196
|
+
if action.is_a?(Proc)
|
197
|
+
process.schedule :execute_proc, reason, &action
|
198
|
+
else
|
199
|
+
process.schedule action, reason
|
200
|
+
end
|
193
201
|
end
|
194
202
|
end
|
195
203
|
|
@@ -198,9 +206,11 @@ class Eye::Checker
|
|
198
206
|
end
|
199
207
|
|
200
208
|
class Defer < Eye::Checker
|
209
|
+
|
201
210
|
def get_value_safe
|
202
|
-
Celluloid::Future.new{ get_value }.value
|
211
|
+
Celluloid::Future.new { get_value }.value
|
203
212
|
end
|
213
|
+
|
204
214
|
end
|
205
215
|
|
206
216
|
def self.register(base)
|
@@ -214,27 +224,34 @@ class Eye::Checker
|
|
214
224
|
end
|
215
225
|
|
216
226
|
class CustomCell < Eye::Checker
|
227
|
+
|
217
228
|
def self.inherited(base)
|
218
229
|
super
|
219
230
|
register(base)
|
220
231
|
end
|
232
|
+
|
221
233
|
end
|
222
234
|
|
223
235
|
class Custom < Defer
|
236
|
+
|
224
237
|
def self.inherited(base)
|
225
238
|
super
|
226
239
|
register(base)
|
227
240
|
end
|
241
|
+
|
228
242
|
end
|
229
243
|
|
230
244
|
class CustomDefer < Defer
|
245
|
+
|
231
246
|
def self.inherited(base)
|
232
247
|
super
|
233
248
|
register(base)
|
234
249
|
end
|
250
|
+
|
235
251
|
end
|
236
252
|
|
237
253
|
class Measure < Eye::Checker
|
254
|
+
|
238
255
|
param :below, [Fixnum, Float]
|
239
256
|
param :above, [Fixnum, Float]
|
240
257
|
|
@@ -255,5 +272,7 @@ class Eye::Checker
|
|
255
272
|
'-'
|
256
273
|
end
|
257
274
|
end
|
275
|
+
|
258
276
|
end
|
277
|
+
|
259
278
|
end
|