reel-eye 0.4.1 → 0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/.travis.yml +4 -0
  4. data/CHANGES.md +17 -1
  5. data/README.md +3 -3
  6. data/Rakefile +8 -0
  7. data/bin/eye +0 -316
  8. data/bin/loader_eye +3 -3
  9. data/examples/test.eye +2 -2
  10. data/eye.gemspec +6 -10
  11. data/lib/eye.rb +4 -2
  12. data/lib/eye/application.rb +3 -3
  13. data/lib/eye/checker.rb +35 -7
  14. data/lib/eye/checker/cputime.rb +23 -0
  15. data/lib/eye/checker/file_touched.rb +15 -0
  16. data/lib/eye/checker/http.rb +7 -9
  17. data/lib/eye/checker/memory.rb +1 -1
  18. data/lib/eye/checker/runtime.rb +28 -0
  19. data/lib/eye/checker/socket.rb +4 -4
  20. data/lib/eye/cli.rb +166 -0
  21. data/lib/eye/cli/commands.rb +79 -0
  22. data/lib/eye/cli/render.rb +137 -0
  23. data/lib/eye/cli/server.rb +85 -0
  24. data/lib/eye/client.rb +3 -3
  25. data/lib/eye/config.rb +17 -14
  26. data/lib/eye/controller.rb +6 -10
  27. data/lib/eye/controller/commands.rb +6 -10
  28. data/lib/eye/controller/helpers.rb +1 -1
  29. data/lib/eye/controller/send_command.rb +5 -2
  30. data/lib/eye/controller/status.rb +38 -106
  31. data/lib/eye/dsl.rb +1 -1
  32. data/lib/eye/dsl/application_opts.rb +6 -2
  33. data/lib/eye/dsl/child_process_opts.rb +3 -2
  34. data/lib/eye/dsl/config_opts.rb +2 -2
  35. data/lib/eye/dsl/group_opts.rb +2 -1
  36. data/lib/eye/dsl/main.rb +4 -2
  37. data/lib/eye/dsl/opts.rb +11 -4
  38. data/lib/eye/dsl/validation.rb +49 -43
  39. data/lib/eye/group.rb +1 -1
  40. data/lib/eye/http.rb +4 -9
  41. data/lib/eye/http/router.rb +1 -1
  42. data/lib/eye/loader.rb +5 -9
  43. data/lib/eye/{settings.rb → local.rb} +1 -1
  44. data/lib/eye/logger.rb +5 -0
  45. data/lib/eye/notify.rb +12 -6
  46. data/lib/eye/notify/jabber.rb +2 -2
  47. data/lib/eye/process/child.rb +3 -1
  48. data/lib/eye/process/commands.rb +2 -2
  49. data/lib/eye/process/controller.rb +1 -1
  50. data/lib/eye/process/trigger.rb +1 -1
  51. data/lib/eye/sigar.rb +5 -0
  52. data/lib/eye/system.rb +8 -7
  53. data/lib/eye/system_resources.rb +46 -41
  54. data/lib/eye/trigger.rb +15 -8
  55. data/lib/eye/trigger/flapping.rb +1 -1
  56. data/lib/eye/trigger/stop_childs.rb +1 -1
  57. data/lib/eye/trigger/transition.rb +15 -0
  58. data/lib/eye/utils.rb +12 -0
  59. data/lib/eye/utils/leak_19.rb +7 -0
  60. data/lib/eye/utils/mini_active_support.rb +106 -0
  61. metadata +40 -17
  62. data/lib/eye/controller/show_history.rb +0 -63
  63. data/lib/eye/trigger/state.rb +0 -11
@@ -32,7 +32,7 @@ private
32
32
  end
33
33
 
34
34
  def on_flapping
35
- debug "flapping recognized!!!"
35
+ debug 'flapping recognized!!!'
36
36
 
37
37
  process.notify :error, 'flapping!'
38
38
  process.schedule :unmonitor, Eye::Reason.new(:flapping)
@@ -3,7 +3,7 @@ class Eye::Trigger::StopChilds < Eye::Trigger
3
3
  param :timeout, [Fixnum, Float], nil, 60
4
4
 
5
5
  def check(trans)
6
- debug "stop childs"
6
+ debug 'stop childs'
7
7
  process.childs.pmap { |pid, c| c.stop }
8
8
  end
9
9
 
@@ -0,0 +1,15 @@
1
+ class Eye::Trigger::Transition < Eye::Trigger
2
+
3
+ # trigger :transition, :to => :up, :from => :starting, :do => ->{ ... }
4
+
5
+ param :do, [Proc, Symbol]
6
+
7
+ def check(trans)
8
+ act = @options[:do]
9
+ if act
10
+ instance_exec(&@options[:do]) if act.is_a?(Proc)
11
+ send(act, process) if act.is_a?(Symbol)
12
+ end
13
+ end
14
+
15
+ end
@@ -1,3 +1,5 @@
1
+ require 'date'
2
+
1
3
  module Eye::Utils
2
4
  autoload :Tail, 'eye/utils/tail'
3
5
  autoload :AliveArray, 'eye/utils/alive_array'
@@ -11,4 +13,14 @@ module Eye::Utils
11
13
  end
12
14
  end
13
15
 
16
+ D1 = '%H:%M'
17
+ D2 = '%b%d'
18
+
19
+ def self.human_time(unix_time)
20
+ time = Time.at(unix_time.to_i)
21
+ d1 = time.to_date
22
+ d2 = Time.now.to_date
23
+ time.strftime (d1 == d2) ? D1 : D2
24
+ end
25
+
14
26
  end
@@ -0,0 +1,7 @@
1
+ # http://stackoverflow.com/questions/7263268/ruby-symbolto-proc-leaks-references-in-1-9-2-p180
2
+
3
+ class Symbol
4
+ def to_proc
5
+ lambda { |x| x.send(self) }
6
+ end
7
+ end
@@ -0,0 +1,106 @@
1
+ require 'time'
2
+
3
+ def silence_warnings
4
+ old_verbose, $VERBOSE = $VERBOSE, nil
5
+ yield
6
+ ensure
7
+ $VERBOSE = old_verbose
8
+ end
9
+
10
+ class Object
11
+ def blank?
12
+ respond_to?(:empty?) ? empty? : !self
13
+ end
14
+
15
+ def present?
16
+ !blank?
17
+ end
18
+
19
+ def try(m, *args)
20
+ send(m, *args) if respond_to?(m)
21
+ end
22
+ end
23
+
24
+ class NilClass
25
+ def try(*args)
26
+ end
27
+ end
28
+
29
+ class String
30
+ def underscore
31
+ word = self.dup
32
+ word.gsub!('::', '/')
33
+ word.gsub!(/(?:([A-Za-z\d])|^)((?=a)b)(?=\b|[^a-z])/) { "#{$1}#{$1 && '_'}#{$2.downcase}" }
34
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
35
+ word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
36
+ word.tr!("-", "_")
37
+ word.downcase!
38
+ word
39
+ end
40
+
41
+ def truncate(l)
42
+ self[0..l]
43
+ end
44
+ end
45
+
46
+ class Array
47
+ def extract_options!
48
+ self[-1].is_a?(Hash) ? self.pop : {}
49
+ end
50
+ end
51
+
52
+ class Numeric
53
+ def seconds
54
+ self
55
+ end
56
+ alias :second :seconds
57
+
58
+ def minutes
59
+ self * 60
60
+ end
61
+ alias :minute :minutes
62
+
63
+ def hours
64
+ self * 3600
65
+ end
66
+ alias :hour :hours
67
+
68
+ def days
69
+ self * 86400
70
+ end
71
+ alias :day :days
72
+
73
+ def weeks
74
+ self * 86400 * 7
75
+ end
76
+ alias :week :weeks
77
+
78
+ def ago
79
+ ::Time.now - self
80
+ end
81
+
82
+ def bytes
83
+ self
84
+ end
85
+ alias :byte :bytes
86
+
87
+ def kilobytes
88
+ self * 1024
89
+ end
90
+ alias :kilobyte :kilobytes
91
+
92
+ def megabytes
93
+ self * 1024 * 1024
94
+ end
95
+ alias :megabyte :megabytes
96
+
97
+ def gigabytes
98
+ self * 1024 * 1024 * 1024
99
+ end
100
+ alias :gigabyte :gigabytes
101
+
102
+ def terabytes
103
+ self * 1024 * 1024 * 1024 * 1024
104
+ end
105
+ alias :terabyte :terabytes
106
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: reel-eye
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: '0.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Konstantin Makarchev
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-31 00:00:00.000000000 Z
11
+ date: 2013-10-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: celluloid
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: 0.14.0
19
+ version: 0.15.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
- version: 0.14.0
26
+ version: 0.15.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: celluloid-io
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: 0.14.0
33
+ version: 0.15.0
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ~>
39
39
  - !ruby/object:Gem::Version
40
- version: 0.14.0
40
+ version: 0.15.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: state_machine
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,22 +66,36 @@ dependencies:
66
66
  - - '>='
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: sigar
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: 0.7.2
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: 0.7.2
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: reel
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - ~>
74
88
  - !ruby/object:Gem::Version
75
- version: 0.4.0.pre
89
+ version: 0.4.0
76
90
  type: :runtime
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - ~>
81
95
  - !ruby/object:Gem::Version
82
- version: 0.4.0.pre
96
+ version: 0.4.0
83
97
  - !ruby/object:Gem::Dependency
84
- name: cuba
98
+ name: reel-rack
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - '>='
@@ -95,19 +109,19 @@ dependencies:
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
- name: activesupport
112
+ name: cuba
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - '>='
102
116
  - !ruby/object:Gem::Version
103
- version: '3'
117
+ version: '0'
104
118
  type: :runtime
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - '>='
109
123
  - !ruby/object:Gem::Version
110
- version: '3'
124
+ version: '0'
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: rake
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -278,7 +292,7 @@ dependencies:
278
292
  version: '0'
279
293
  description: Process monitoring tool. Inspired from Bluepill and God. Requires Ruby(MRI)
280
294
  >= 1.9.3-p194. Uses Celluloid and Celluloid::IO.
281
- email: kostya27@gmail.com
295
+ email: eye-rb@googlegroups.com
282
296
  executables:
283
297
  - eye
284
298
  - loader_eye
@@ -312,13 +326,20 @@ files:
312
326
  - lib/eye/application.rb
313
327
  - lib/eye/checker.rb
314
328
  - lib/eye/checker/cpu.rb
329
+ - lib/eye/checker/cputime.rb
315
330
  - lib/eye/checker/file_ctime.rb
316
331
  - lib/eye/checker/file_size.rb
332
+ - lib/eye/checker/file_touched.rb
317
333
  - lib/eye/checker/http.rb
318
334
  - lib/eye/checker/memory.rb
319
335
  - lib/eye/checker/nop.rb
336
+ - lib/eye/checker/runtime.rb
320
337
  - lib/eye/checker/socket.rb
321
338
  - lib/eye/child_process.rb
339
+ - lib/eye/cli.rb
340
+ - lib/eye/cli/commands.rb
341
+ - lib/eye/cli/render.rb
342
+ - lib/eye/cli/server.rb
322
343
  - lib/eye/client.rb
323
344
  - lib/eye/config.rb
324
345
  - lib/eye/control.rb
@@ -328,7 +349,6 @@ files:
328
349
  - lib/eye/controller/load.rb
329
350
  - lib/eye/controller/options.rb
330
351
  - lib/eye/controller/send_command.rb
331
- - lib/eye/controller/show_history.rb
332
352
  - lib/eye/controller/status.rb
333
353
  - lib/eye/dsl.rb
334
354
  - lib/eye/dsl/application_opts.rb
@@ -347,6 +367,7 @@ files:
347
367
  - lib/eye/http.rb
348
368
  - lib/eye/http/router.rb
349
369
  - lib/eye/loader.rb
370
+ - lib/eye/local.rb
350
371
  - lib/eye/logger.rb
351
372
  - lib/eye/notify.rb
352
373
  - lib/eye/notify/jabber.rb
@@ -368,17 +389,19 @@ files:
368
389
  - lib/eye/process/watchers.rb
369
390
  - lib/eye/reason.rb
370
391
  - lib/eye/server.rb
371
- - lib/eye/settings.rb
392
+ - lib/eye/sigar.rb
372
393
  - lib/eye/system.rb
373
394
  - lib/eye/system_resources.rb
374
395
  - lib/eye/trigger.rb
375
396
  - lib/eye/trigger/flapping.rb
376
- - lib/eye/trigger/state.rb
377
397
  - lib/eye/trigger/stop_childs.rb
398
+ - lib/eye/trigger/transition.rb
378
399
  - lib/eye/utils.rb
379
400
  - lib/eye/utils/alive_array.rb
380
401
  - lib/eye/utils/celluloid_chain.rb
381
402
  - lib/eye/utils/celluloid_klass.rb
403
+ - lib/eye/utils/leak_19.rb
404
+ - lib/eye/utils/mini_active_support.rb
382
405
  - lib/eye/utils/pmap.rb
383
406
  - lib/eye/utils/tail.rb
384
407
  homepage: http://github.com/kostya/eye
@@ -401,7 +424,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
401
424
  version: 1.3.6
402
425
  requirements: []
403
426
  rubyforge_project:
404
- rubygems_version: 2.0.2
427
+ rubygems_version: 2.1.4
405
428
  signing_key:
406
429
  specification_version: 4
407
430
  summary: Process monitoring tool. Inspired from Bluepill and God. Requires Ruby(MRI)
@@ -1,63 +0,0 @@
1
- module Eye::Controller::ShowHistory
2
-
3
- def history_string(*args)
4
- data = history_data(*args)
5
-
6
- res = []
7
- data.each do |name, data|
8
- res << detail_process_info(name, data)
9
- end
10
-
11
- res * "\n"
12
- end
13
-
14
- def history_data(*args)
15
- res = {}
16
- get_processes_for_history(*args).each do |process|
17
- res[process.full_name] = process.schedule_history.reject{|c| c[:state] == :check_crash }
18
- end
19
- res
20
- end
21
-
22
- private
23
-
24
- def get_processes_for_history(*args)
25
- args = ['*'] if args.empty?
26
- res = []
27
- matched_objects(*args) do |obj|
28
- if (obj.is_a?(Eye::Process) || obj.is_a?(Eye::ChildProcess))
29
- res << obj
30
- else
31
- res += obj.processes.to_a
32
- end
33
- end
34
- Eye::Utils::AliveArray.new(res)
35
- end
36
-
37
- def detail_process_info(name, history)
38
- return if history.empty?
39
-
40
- res = "\033[1m#{name}\033[0m:\n"
41
- history = history.reverse
42
-
43
- history.chunk{|h| [h[:state], h[:reason].to_s] }.each do |_, hist|
44
- if hist.size >= 3
45
- res << detail_process_info_string(hist[0])
46
- res << detail_process_info_string(:state => "... #{hist.size - 2} times", :reason => '...', :at => hist[-1][:at])
47
- res << detail_process_info_string(hist[-1])
48
- else
49
- hist.each do |h|
50
- res << detail_process_info_string(h)
51
- end
52
- end
53
- end
54
-
55
- res
56
- end
57
-
58
- def detail_process_info_string(h)
59
- state = h[:state].to_s.ljust(14)
60
- "#{Time.at(h[:at]).to_s(:db)} - #{state} (#{h[:reason]})\n"
61
- end
62
-
63
- end
@@ -1,11 +0,0 @@
1
- class Eye::Trigger::State < Eye::Trigger
2
-
3
- # triggers :state, :to => :up, :from => :starting, :do => ->{ ... }
4
-
5
- param :do, [Proc]
6
-
7
- def check(trans)
8
- instance_exec(&@options[:do]) if @options[:do]
9
- end
10
-
11
- end