Class: Eye::Checker

Inherits:
Object
  • Object
show all
Extended by:
Dsl::Validation
Defined in:
lib/eye/checker.rb

Direct Known Subclasses

Cpu, CustomCell, Defer, FileCTime, FileSize, Memory, Nop

Defined Under Namespace

Classes: Cpu, Custom, CustomCell, CustomDefer, Defer, FileCTime, FileSize, Http, Memory, Nop, Socket

Constant Summary collapse

TYPES =
{:memory => "Memory", :cpu => "Cpu", :http => "Http",
:ctime => "FileCTime", :fsize => "FileSize", :socket => "Socket",
:nop => "Nop" }

Instance Attribute Summary collapse

Attributes included from Dsl::Validation

#defaults, #should_bes, #validates, #variants

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Dsl::Validation

inherited, param, validate

Constructor Details

#initialize(pid, options = {}, process = nil) ⇒ Checker

Returns a new instance of Checker.



52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/eye/checker.rb', line 52

def initialize(pid, options = {}, process = nil)
  @process = process
  @pid = pid
  @options = options.dup
  @type = options[:type]
  @full_name = @process.full_name if @process
  @initialized_at = Time.now

  debug "create checker, with #{options}"

  @value = nil
  @values = Eye::Utils::Tail.new(max_tries)
  @check_count = 0
end

Instance Attribute Details

#check_countObject

Returns the value of attribute check_count.



15
16
17
# File 'lib/eye/checker.rb', line 15

def check_count
  @check_count
end

#optionsObject

Returns the value of attribute options.



15
16
17
# File 'lib/eye/checker.rb', line 15

def options
  @options
end

#pidObject

Returns the value of attribute pid.



15
16
17
# File 'lib/eye/checker.rb', line 15

def pid
  @pid
end

#processObject

Returns the value of attribute process.



15
16
17
# File 'lib/eye/checker.rb', line 15

def process
  @process
end

#typeObject

Returns the value of attribute type.



15
16
17
# File 'lib/eye/checker.rb', line 15

def type
  @type
end

#valueObject

Returns the value of attribute value.



15
16
17
# File 'lib/eye/checker.rb', line 15

def value
  @value
end

#valuesObject

Returns the value of attribute values.



15
16
17
# File 'lib/eye/checker.rb', line 15

def values
  @values
end

Class Method Details

.create(pid, options = {}, process = nil) ⇒ Object



40
41
42
43
44
45
46
# File 'lib/eye/checker.rb', line 40

def self.create(pid, options = {}, process = nil)
  get_class(options[:type]).new(pid, options, process)

rescue Exception, Timeout::Error => ex
  log_ex(ex)
  nil
end

.get_class(type) ⇒ Object



34
35
36
37
38
# File 'lib/eye/checker.rb', line 34

def self.get_class(type)
  klass = eval("Eye::Checker::#{TYPES[type]}") rescue nil
  raise "Unknown checker #{type}" unless klass
  klass
end

.name_and_class(type) ⇒ Object



24
25
26
27
28
29
30
31
32
# File 'lib/eye/checker.rb', line 24

def self.name_and_class(type)
  type = type.to_sym
  return {:name => type, :type => type} if TYPES[type]

  if type =~ /\A(.*?)_?[0-9]+\z/
    ctype = $1.to_sym
    return {:name => type, :type => ctype} if TYPES[ctype]
  end
end

.register(base) ⇒ Object



187
188
189
190
191
192
# File 'lib/eye/checker.rb', line 187

def self.register(base)
  name = base.to_s.gsub("Eye::Checker::", '')
  type = name.underscore.to_sym
  Eye::Checker::TYPES[type] = name
  Eye::Checker.const_set(name, base)
end

.validate!(options) ⇒ Object



48
49
50
# File 'lib/eye/checker.rb', line 48

def self.validate!(options)
  get_class(options[:type]).validate(options)
end

Instance Method Details

#checkObject



88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/eye/checker.rb', line 88

def check
  if initial_grace && (Time.now - @initialized_at < initial_grace)
    debug 'skipped initial grace'
    return true
  else
    @options[:initial_grace] = nil
  end

  @value = get_value_safe
  @good_value = good?(value)
  @values << {:value => @value, :good => @good_value}

  result = true
  @check_count += 1

  if @values.size == max_tries
    bad_count = @values.count{|v| !v[:good] }
    result = false if bad_count >= min_tries
  end

  if skip_initial_fails
    if @good_value
      @options[:skip_initial_fails] = nil
    else
      result = true
    end
  end

  info "#{last_human_values} => #{result ? 'OK' : 'Fail'}"
  result

rescue Exception, Timeout::Error => ex
  log_ex(ex)
end

#check_nameObject



141
142
143
# File 'lib/eye/checker.rb', line 141

def check_name
  @check_name ||= @type.to_s
end

#defer(&block) ⇒ Object



177
178
179
# File 'lib/eye/checker.rb', line 177

def defer(&block)
  Celluloid::Future.new(&block).value
end

#get_valueObject



127
128
129
# File 'lib/eye/checker.rb', line 127

def get_value
  raise 'Realize me'
end

#get_value_safeObject



123
124
125
# File 'lib/eye/checker.rb', line 123

def get_value_safe
  get_value
end

#good?(value) ⇒ Boolean

true if check ok false if check bad

Returns:

  • (Boolean)


137
138
139
# File 'lib/eye/checker.rb', line 137

def good?(value)
  value
end

#human_value(value) ⇒ Object



131
132
133
# File 'lib/eye/checker.rb', line 131

def human_value(value)
  value.to_s
end

#inspectObject



67
68
69
# File 'lib/eye/checker.rb', line 67

def inspect
  "<#{self.class} @process='#{@full_name}' @options=#{@options} @pid=#{@pid}>"
end

#last_human_valuesObject



79
80
81
82
83
84
85
86
# File 'lib/eye/checker.rb', line 79

def last_human_values
  h_values = @values.map do |v|
    sign = v[:good] ? '' : '*'
    sign + human_value(v[:value]).to_s
  end

  '[' + h_values * ', ' + ']'
end

#logger_sub_tagObject



75
76
77
# File 'lib/eye/checker.rb', line 75

def logger_sub_tag
  "check:#{check_name}"
end

#logger_tagObject



71
72
73
# File 'lib/eye/checker.rb', line 71

def logger_tag
  @process.logger.prefix
end

#max_triesObject



145
146
147
148
149
150
151
152
153
154
155
# File 'lib/eye/checker.rb', line 145

def max_tries
  @max_tries ||= if times
    if times.is_a?(Array)
      times[-1].to_i
    else
      times.to_i
    end
  else
    1
  end
end

#min_triesObject



157
158
159
160
161
162
163
164
165
166
167
# File 'lib/eye/checker.rb', line 157

def min_tries
  @min_tries ||= if times
    if times.is_a?(Array)
      times[0].to_i
    else
      max_tries
    end
  else
    max_tries
  end
end

#previous_valueObject



169
170
171
# File 'lib/eye/checker.rb', line 169

def previous_value
  @values[-1][:value] if @values.present?
end

#run_in_process_context(p) ⇒ Object



173
174
175
# File 'lib/eye/checker.rb', line 173

def run_in_process_context(p)
  process.instance_exec(&p) if process.alive?
end