class AppPerfRpm::Backtrace
Public Class Methods
backtrace(opts = {})
click to toggle source
# File lib/app_perf_rpm/backtrace.rb, line 6 def backtrace(opts = {}) kind = opts[:kind] if kind bt = Kernel.caller bt = clean(bt) bt = filter(bt, kind) trim_backtrace(bt) end end
clean(backtrace)
click to toggle source
# File lib/app_perf_rpm/backtrace.rb, line 17 def clean(backtrace) Array(backtrace) .map {|b| clean_line(b) } .select {|b| b !~ %r{lib/app_perf_rpm} } end
clean_line(line)
click to toggle source
# File lib/app_perf_rpm/backtrace.rb, line 66 def clean_line(line) line .sub(/#{::AppPerfRpm.config.app_root.to_s}\//, "[APP_PATH]/") .sub(gems_regexp, '\2 (\3) [GEM_PATH]/\4') end
filter(backtrace, kind)
click to toggle source
# File lib/app_perf_rpm/backtrace.rb, line 23 def filter(backtrace, kind) case kind when :all backtrace when :app backtrace.select {|b| b =~ /\[APP_PATH\]/ } when :gem backtrace.select {|b| b =~ /\[GEM_PATH\]/ } else [] end end
source_extract(opts = {})
click to toggle source
{ code: source_fragment(file, line_number), line_number: line_number } else nil end
end
# File lib/app_perf_rpm/backtrace.rb, line 49 def source_extract(opts = {}) backtrace = opts[:backtrace] || Kernel.caller(0) Array(backtrace).select {|bt| bt[/^#{::AppPerfRpm.config.app_root.to_s}\//] }.map do |trace| file, line_number = extract_file_and_line_number(trace) source_to_hash(file, line_number) end end
source_to_hash(file, line_number)
click to toggle source
# File lib/app_perf_rpm/backtrace.rb, line 58 def source_to_hash(file, line_number) { "file" => clean_line(file), "code" => source_fragment(file, line_number), "line_number" => line_number } end
Private Class Methods
extract_file_and_line_number(trace)
click to toggle source
# File lib/app_perf_rpm/backtrace.rb, line 95 def extract_file_and_line_number(trace) file, line = trace.match(/^(.+?):(\d+).*$/, &:captures) || trace [file, line.to_i] end
gems_regexp()
click to toggle source
# File lib/app_perf_rpm/backtrace.rb, line 74 def gems_regexp gems_paths = (Gem.path | [Gem.default_dir]).map { |p| Regexp.escape(p) } if gems_paths %r{(#{gems_paths.join('|')})/gems/([^/]+)-([\w.]+)/(.*)} else nil end end
source_fragment(path, line)
click to toggle source
# File lib/app_perf_rpm/backtrace.rb, line 83 def source_fragment(path, line) return unless AppPerfRpm.config.app_root full_path = AppPerfRpm.config.app_root.join(path) if File.exist?(full_path) File.open(full_path, "r") do |file| start = [line - 3, 0].max lines = file.each_line.drop(start).take(6) Hash[*(start + 1..(lines.count + start)).zip(lines).flatten] end end end
trim_backtrace(_backtrace, opts = {})
click to toggle source
# File lib/app_perf_rpm/backtrace.rb, line 100 def trim_backtrace(_backtrace, opts = {}) kind = opts[:kind] return _backtrace unless _backtrace.is_a?(Array) length = _backtrace.size if length > 80 trimmed = _backtrace[0, 80] trimmed += ['...[snip]...'] trimmed += _backtrace[length - 20, 20] else trimmed = _backtrace end trimmed end