-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathsinged.rb
More file actions
94 lines (71 loc) · 2.12 KB
/
singed.rb
File metadata and controls
94 lines (71 loc) · 2.12 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# frozen_string_literal: true
require "json"
require "stackprof"
require "colorize"
require "vernier"
module Singed
extend self
# Where should flamegraphs be saved?
def output_directory=(directory)
@output_directory = Pathname.new(directory)
end
def self.output_directory
@output_directory
end
def enabled=(enabled)
@enabled = enabled
end
def enabled?
return @enabled if defined?(@enabled)
@enabled = true
end
def backtrace_cleaner=(backtrace_cleaner)
@backtrace_cleaner = backtrace_cleaner
end
def backtrace_cleaner
@backtrace_cleaner
end
def vernier_hooks
@vernier_hooks ||= []
end
def silence_line?(line)
return backtrace_cleaner.silence_line?(line) if backtrace_cleaner
false
end
def filter_line(line)
return backtrace_cleaner.filter_line(line) if backtrace_cleaner
line
end
def profiler_class_for(profiler)
case profiler
when :stackprof, nil then Singed::Flamegraph::Stackprof
when :vernier then Singed::Flamegraph::Vernier
else
raise ArgumentError, "Unknown profiler: #{profiler}"
end
end
def profile(label = "flamegraph", profiler: nil, open: true, announce_io: $stdout, **profiler_options, &)
profiler_class = profiler_class_for(profiler)
fg = profiler_class.new(
label: label,
announce_io: announce_io,
**profiler_options
)
result = fg.record(&)
fg.save
fg.open if open
result
end
def stackprof(label = "stackprof", open: true, announce_io: $stdout, **stackprof_options, &)
profile(label, profiler: :stackprof, open: open, announce_io: announce_io, **stackprof_options, &)
end
def vernier(label = "vernier", open: true, announce_io: $stdout, **vernier_options, &)
profile(label, profiler: :vernier, open: open, announce_io: announce_io, **vernier_options, &)
end
autoload :Flamegraph, "singed/flamegraph"
autoload :Report, "singed/report"
autoload :RackMiddleware, "singed/rack_middleware"
end
require "singed/kernel_ext"
require "singed/railtie" if defined?(Rails::Railtie)
require "singed/rspec" if defined?(RSpec) && RSpec.respond_to?(:configure)