agent_log.rb 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. # AgentLogs are temporary records of Agent activity, intended for debugging and error tracking. They can be viewed
  2. # in Agents' detail pages. AgentLogs with a `level` of 4 or greater are considered "errors" and automatically update
  3. # Agents' `last_error_log_at` column. These are often used to determine if an Agent is `working?`.
  4. class AgentLog < ActiveRecord::Base
  5. belongs_to :agent
  6. belongs_to :inbound_event, class_name: "Event", optional: true
  7. belongs_to :outbound_event, class_name: "Event", optional: true
  8. validates_presence_of :message
  9. validates_numericality_of :level, only_integer: true, greater_than_or_equal_to: 0, less_than: 5
  10. before_validation :scrub_message
  11. before_save :truncate_message
  12. def self.log_for_agent(agent, message, options = {})
  13. puts "Agent##{agent.id}: #{message}" unless Rails.env.test?
  14. log = agent.logs.create! options.merge(message:)
  15. if agent.logs.count > log_length
  16. oldest_id_to_keep = agent.logs.limit(1).offset(log_length - 1).pluck("agent_logs.id")
  17. agent.logs.where("agent_logs.id < ?", oldest_id_to_keep).delete_all
  18. end
  19. agent.update_column :last_error_log_at, Time.now if log.level >= 4
  20. log
  21. end
  22. def self.log_length
  23. ENV['AGENT_LOG_LENGTH'].present? ? ENV['AGENT_LOG_LENGTH'].to_i : 200
  24. end
  25. protected
  26. def scrub_message
  27. if message_changed? && !message.nil?
  28. self.message = message.inspect unless message.is_a?(String)
  29. self.message.scrub! { |bytes| "<#{bytes.unpack1('H*')}>" }
  30. end
  31. true
  32. end
  33. def truncate_message
  34. self.message = message[0...10_000] if message.present?
  35. end
  36. end