Sha256: c0f683cc321b4c32b64ada3eda91fc6f41584ad7f5a5b5c10b07a538e09a9ca7

Contents?: true

Size: 1.78 KB

Versions: 3

Compression:

Stored size: 1.78 KB

Contents

module ActiveJobLog
  module Loggeable
    extend ActiveSupport::Concern

    STATUSES = %i{queued pending finished failed}

    included do
      extend Enumerize

      validates :job_id, presence: true

      enumerize :status, in: STATUSES, scope: true

      serialize :params, Array
      serialize :stack_trace, Array

      before_save :set_queued_duration
      before_save :set_execution_duration
      before_save :set_total_duration

      def set_queued_duration
        return if queued_at.blank? || started_at.blank?

        self.queued_duration = (started_at.to_f - queued_at.to_f).to_i
      end

      def set_execution_duration
        return if started_at.blank? || ended_at.blank?

        self.execution_duration = (ended_at.to_f - started_at.to_f).to_i
      end

      def set_total_duration
        from = queued_at || started_at
        return if from.blank? || ended_at.blank?

        self.total_duration = (ended_at.to_f - from.to_f).to_i
      end
    end

    module ClassMethods
      def update_job!(job_id, status, params = {})
        params.merge!(status_to_params(status))
        job = find_or_create_job(job_id)
        job.update!(params)
        job
      end

      def find_or_create_job(job_id)
        where(job_id: job_id).where.not(status: :failed).last || create(job_id: job_id)
      end

      def status_to_params(status)
        time_attr = infer_duration_attr_from_status(status)
        {
          time_attr => DateTime.current,
          status: status
        }
      end

      def infer_duration_attr_from_status(status)
        case status
        when :queued
          :queued_at
        when :pending
          :started_at
        when :finished, :failed
          :ended_at
        else
          fail "invalid status"
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
active_job_log-3.0.0 lib/active_job_log/loggeable.rb
active_job_log-2.1.0 lib/active_job_log/loggeable.rb
active_job_log-2.0.0 lib/active_job_log/loggeable.rb