Advertisement
Guest User

Untitled

a guest
Mar 22nd, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.32 KB | None | 0 0
  1. ** Invoke crawl_next (first_time)
  2. ** Invoke environment (first_time)
  3. ** Execute environment
  4. ** Execute crawl_next
  5. rake aborted!
  6. NoMethodError: undefined method `clear' for false:FalseClass
  7. /usr/local/rvm/gems/ruby-2.5.0/gems/activemodel-5.1.5/lib/active_model/validations.rb:334:in `valid?'
  8. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/validations.rb:65:in `valid?'
  9. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/validations.rb:82:in `perform_validations'
  10. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/validations.rb:44:in `save'
  11. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/attribute_methods/dirty.rb:35:in `save'
  12. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/transactions.rb:308:in `block (2 levels) in save'
  13. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/transactions.rb:384:in `block in with_transaction_returning_status'
  14. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/connection_adapters/abstract/database_statements.rb:235:in `block in transaction'
  15. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/connection_adapters/abstract/transaction.rb:194:in `block in within_new_transaction'
  16. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/monitor.rb:226:in `mon_synchronize'
  17. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/connection_adapters/abstract/transaction.rb:191:in `within_new_transaction'
  18. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/connection_adapters/abstract/database_statements.rb:235:in `transaction'
  19. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/transactions.rb:210:in `transaction'
  20. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/transactions.rb:381:in `with_transaction_returning_status'
  21. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/transactions.rb:308:in `block in save'
  22. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/transactions.rb:323:in `rollback_active_record_state!'
  23. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/transactions.rb:307:in `save'
  24. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/suppressor.rb:42:in `save'
  25. /home/ubuntu/workspace/web_monitor/lib/tasks/scheduler.rake:19:in `block (2 levels) in <top (required)>'
  26. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/relation/delegation.rb:39:in `each'
  27. /usr/local/rvm/gems/ruby-2.5.0/gems/activerecord-5.1.5/lib/active_record/relation/delegation.rb:39:in `each'
  28. /home/ubuntu/workspace/web_monitor/lib/tasks/scheduler.rake:5:in `block in <top (required)>'
  29. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/task.rb:251:in `block in execute'
  30. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/task.rb:251:in `each'
  31. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/task.rb:251:in `execute'
  32. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/task.rb:195:in `block in invoke_with_call_chain'
  33. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/monitor.rb:226:in `mon_synchronize'
  34. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/task.rb:188:in `invoke_with_call_chain'
  35. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/task.rb:181:in `invoke'
  36. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/application.rb:160:in `invoke_task'
  37. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/application.rb:116:in `block (2 levels) in top_level'
  38. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/application.rb:116:in `each'
  39. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/application.rb:116:in `block in top_level'
  40. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/application.rb:125:in `run_with_threads'
  41. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/application.rb:110:in `top_level'
  42. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/application.rb:83:in `block in run'
  43. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/application.rb:186:in `standard_exception_handling'
  44. /usr/local/rvm/rubies/ruby-2.5.0/lib/ruby/gems/2.5.0/gems/rake-12.3.0/lib/rake/application.rb:80:in `run'
  45. /usr/local/rvm/gems/ruby-2.5.0@global/gems/rake-12.3.0/exe/rake:27:in `<top (required)>'
  46. /usr/local/rvm/rubies/ruby-2.5.0/bin/rake:29:in `load'
  47. /usr/local/rvm/rubies/ruby-2.5.0/bin/rake:29:in `<main>'
  48. Tasks: TOP => crawl_next
  49.  
  50. desc "perform crawls for active alerts if their interval has passed"
  51. task :crawl_next => :environment do
  52. alerts = Alert.where(active: true).includes(:crawls)
  53.  
  54. alerts.each do |alert|
  55. last = alert.crawls.last
  56.  
  57. last_crawl_time = last.crawl_time if !last.nil?
  58.  
  59. if last.nil? ||
  60. (last_crawl_time + alert.crawl_interval_mins*60) < Time.now + 1
  61. crawl_stats = alert.crawl
  62. end
  63.  
  64. if crawl_stats
  65. crawl = Crawl.new(crawl_stats)
  66. crawl.save
  67.  
  68. if crawl.exceeds_limits? || crawl.errors
  69. UserMailer.crawl_alert(alert, crawl).deliver_later
  70. end
  71. else
  72. alert.deactivate
  73. end
  74. end
  75. end
  76.  
  77. class Crawl < ActiveRecord::Base
  78. belongs_to :alert
  79.  
  80. after_save :update_alert_last_crawl
  81.  
  82. def update_alert_last_crawl
  83. alert = self.alert
  84. alert.update(last_crawl: self.crawl_time)
  85. end
  86.  
  87. def exceeds_limits?
  88. self.resp_time_ms > self.alert.response_time_threshold_ms
  89. end
  90.  
  91. def errors
  92. self.resp_code != "200"
  93. end
  94. end
  95.  
  96. class Alert < ActiveRecord::Base
  97. has_many :user_alerts
  98. has_many :users, through: :user_alerts, dependent: :destroy
  99. has_many :crawls, dependent: :destroy
  100.  
  101. before_save :activate # TODO: don't activate all alerts before save
  102.  
  103. validate :valid_url? # Using custom method instead of valid url gem
  104.  
  105. validates :crawl_interval_mins, presence: true, inclusion: {in: [10, 30, 60]}
  106. validates :notify_emails, presence: true, length: {minimum: 6}
  107. validates :name, presence: true, length: {minimum: 2}
  108.  
  109. def activate
  110. self.active = true
  111. end
  112.  
  113. def deactivate
  114. self.active = false
  115. UserMailer.alert_deactivated(self).deliver_later
  116. end
  117.  
  118. # Return a hash corresponding to a Crawl's schema, to be used in creating
  119. # a new crawl record
  120. def crawl
  121. data = {}
  122. resp = nil
  123.  
  124. time = Benchmark.measure do
  125. begin
  126. resp = HTTParty.get(self.url)
  127. rescue => e
  128. data = crawl_error_info(e)
  129. end
  130. end
  131.  
  132. {
  133. alert_id: self.id,
  134. crawl_time: Time.now.to_s,
  135. resp_code: data[:resp_code] || resp.code,
  136. resp_time_ms: data[:resp_time_ms] || time.real * 1_000,
  137. resp_status: data[:resp_status] || resp.message,
  138. resp_size_kb: data[:resp_size_kb] || resp.size # TODO: convert to mb
  139. }
  140. end
  141.  
  142. def valid_url?
  143. if !self.url.match(/^(((http|https)://|)?[a-z0-9]+([-.]{1}[a-z0-9]+)*.[a-z]{2,6}(:[0-9]{1,5})?(/.*)?)$/i)
  144. errors.add(:url, "not valid")
  145. end
  146. end
  147.  
  148. def crawl_error_info(e)
  149. if e.class == SocketError
  150. return {
  151. resp_code: 443,
  152. resp_time_ms: 0,
  153. resp_status: "NAME/SVC NOT KNOWN",
  154. resp_size_kb: 0 # TODO: convert to mb
  155. }
  156. end
  157. end
  158. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement