class Dynflow::Actor::BacktraceCollector

Constants

CONCURRENT_RUBY_LINE
SIDEKIQ_LINE

Public Class Methods

current_actor_backtrace() click to toggle source
# File lib/dynflow/actor.rb, line 73
def current_actor_backtrace
  Thread.current[:_dynflow_actor_backtrace] || []
end
full_backtrace(backtrace) click to toggle source
# File lib/dynflow/actor.rb, line 77
def full_backtrace(backtrace)
  filter_backtrace((backtrace || []) + current_actor_backtrace)
end
with_backtrace(backtrace) { || ... } click to toggle source
# File lib/dynflow/actor.rb, line 65
def with_backtrace(backtrace)
  previous_actor_backtrace = Thread.current[:_dynflow_actor_backtrace]
  Thread.current[:_dynflow_actor_backtrace] = backtrace
  yield
ensure
  Thread.current[:_dynflow_actor_backtrace] = previous_actor_backtrace
end

Private Class Methods

filter_backtrace(backtrace) click to toggle source

takes an array of backtrace lines and replaces each chunk

# File lib/dynflow/actor.rb, line 94
def filter_backtrace(backtrace)
  trace = backtrace.map { |line| filter_line(line) }
                   .chunk_while { |l1, l2| l1 == l2}
                   .map(&:first)
  if BACKTRACE_LIMIT
    count = trace.count
    trace = trace.take(BACKTRACE_LIMIT)
    trace << "[ backtrace omitted #{count - BACKTRACE_LIMIT} lines ]" if trace.count < count
  end
  trace
end
filter_line(line) click to toggle source
# File lib/dynflow/actor.rb, line 83
def filter_line(line)
  if %w[concurrent-ruby gems/logging actor.rb].any? { |pattern| line.include?(pattern) }
    CONCURRENT_RUBY_LINE
  elsif line.include?('lib/sidekiq')
    SIDEKIQ_LINE
  else
    line
  end
end