Sha256: e6fb28d561a62b9217498d0b5ffda18c06c51b403b03ad6b85fc0ae1f33d4a1b

Contents?: true

Size: 1.68 KB

Versions: 6

Compression:

Stored size: 1.68 KB

Contents

# Encoding: utf-8

require 'raven'

module Qless
  module Middleware
    # This middleware logs errors to the sentry exception notification service:
    # http://getsentry.com/
    module Sentry
      def around_perform(job)
        super
      rescue Exception => e
        SentryLogger.new(e, job).log
        raise
      end

      # Logs a single exception to Sentry, adding pertinent job info.
      class SentryLogger
        def initialize(exception, job)
          @exception, @job = exception, job
        end

        def log
          event = ::Raven::Event.capture_exception(@exception) do |evt|
            evt.extra = { job: job_metadata }
          end

          safely_send event
        end

      private

        def safely_send(event)
          return unless event
          ::Raven.send(event)
        rescue
          # We don't want to silence our errors when the Sentry server
          # responds with an error. We'll still see the errors on the
          # Qless Web UI.
        end

        def job_metadata
          {
            jid:      @job.jid,
            klass:    @job.klass_name,
            history:  job_history,
            data:     @job.data,
            queue:    @job.queue_name,
            worker:   @job.worker_name,
            tags:     @job.tags,
            priority: @job.priority
          }
        end

        # We want to log formatted timestamps rather than integer timestamps
        def job_history
          @job.queue_history.map do |history_event|
            history_event.each_with_object({}) do |(key, value), hash|
              hash[key] = value.is_a?(Time) ? value.iso8601 : value
            end
          end
        end
      end
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
qless-0.10.5 lib/qless/middleware/sentry.rb
qless-0.10.4 lib/qless/middleware/sentry.rb
qless-0.10.3 lib/qless/middleware/sentry.rb
qless-0.10.2 lib/qless/middleware/sentry.rb
qless-0.10.1 lib/qless/middleware/sentry.rb
qless-0.10.0 lib/qless/middleware/sentry.rb