class Stackflame

Constants

DEFAULT_OPTIONS
VERSION

Public Class Methods

profile(options = {}, &block) click to toggle source
# File lib/stackflame.rb, line 13
def self.profile(options = {}, &block)
  stackflame = self.new
  stackflame.run(options, &block)
  stackflame.open_flamegraph
end

Public Instance Methods

open_flamegraph(params = {}) click to toggle source
# File lib/stackflame.rb, line 28
def open_flamegraph(params = {})
  params = params.merge(data: temp_js_path)
  if system("which osascript > /dev/null")
    # NOTE: `open` can't open path with query string
    `osascript -e 'open location "#{flamegraph_path(params)}"'`
  else
    puts "This OS is not supported. Please open: #{flamegraph_path(params)}"
  end
end
run(options = {}, &block) click to toggle source
# File lib/stackflame.rb, line 19
def run(options = {}, &block)
  options = DEFAULT_OPTIONS.merge(options)
  result  = StackProf.run(options, &block)

  File.open(temp_js_path, 'w') do |f|
    StackProf::Report.new(result).print_flamegraph(f)
  end
end

Private Instance Methods

flamegraph_path(params) click to toggle source
# File lib/stackflame.rb, line 40
def flamegraph_path(params)
  viewer_path = File.expand_path('../../vendor/viewer.html', __FILE__)
  "file://#{viewer_path}#{to_query(params)}"
end
temp_js_path() click to toggle source
# File lib/stackflame.rb, line 55
def temp_js_path
  return @js_path if @js_path

  temp = `mktemp /tmp/stackflame-XXXXXXXX`.strip
  @js_path = "#{temp}.js"
  `mv #{temp} #{@js_path}`
  @js_path
end
to_query(params) click to toggle source
# File lib/stackflame.rb, line 45
def to_query(params)
  return '' if params.size == 0

  queries = []
  params.each do |key, value|
    queries << "#{URI.escape(key.to_s)}=#{URI.escape(value.to_s)}"
  end
  "?#{queries.join('&')}"
end