owl_tracer 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/owl_tracer.rb +66 -0
  3. metadata +44 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bd34f7276d431db57cfd33224737a6d1939e2349
4
+ data.tar.gz: 1f348cd1b367c5417966597a21689a426e8b8eb4
5
+ SHA512:
6
+ metadata.gz: 6d65cdcf3812026d74e714f56250bf7956019f6e89e3e266a534046524210b5c629e5a613ac91cb97753c98ad94ed051b6ba63ceaf9b4fb2290e8aebadb6f6fc
7
+ data.tar.gz: 2b657bdad02fed2369b058e5e55d001cbd6a47b10cadca0678c4a2af0d2b482f844ae77d8e166660bad67fadf769ccf2634f437ed0b2a0e32b428a6557ce4eff
data/lib/owl_tracer.rb ADDED
@@ -0,0 +1,66 @@
1
+ class OwlTracer
2
+ def initialize
3
+ start
4
+ end
5
+
6
+ def dump_results(min_ms = 0)
7
+ @trace.disable if @trace.enabled?
8
+
9
+ result = []
10
+
11
+ @spent.each do |call|
12
+ if call[:time_ms] && call[:time_ms] >= min_ms
13
+ src = call[:defined_class].name || call[:defined_class].inspect
14
+ method_id = call[:method_id]
15
+ if method_id.to_s.include?("_slim__") || method_id.to_s.include?("_erb__")
16
+ method_id = "rendering"
17
+ src = call[:path].split("/").last
18
+ end
19
+
20
+ src = (' ' * call[:level]) + src
21
+
22
+ result << "#{src}::#{method_id} (#{call[:time_ms]} ms)"
23
+ end
24
+ end
25
+
26
+ result
27
+ end
28
+
29
+ private
30
+
31
+ def start
32
+ @spent = []
33
+ @level = 0
34
+ @trace = TracePoint.new(:call, :return, :b_return) do |tp|
35
+
36
+ calls_to_ignore = ["/lib/ruby/", "/gems/", "(eval)"]
37
+ if calls_to_ignore.none? { |substr| tp.path.include?(substr) } # app's method calls only
38
+ if tp.event == :call
39
+ @spent << { path: tp.path, method_id: tp.method_id, defined_class: tp.defined_class,
40
+ start: Time.now.to_f, level: @level}
41
+ @level += 1
42
+ else
43
+ last_call = get_most_recent_unfinished_call(tp)
44
+ if last_call
45
+ @level -= 1
46
+ last_call[:end] = Time.now.to_f
47
+ last_call[:time_ms] = ((last_call[:end] - last_call[:start]) * 1000).round
48
+ end
49
+ end
50
+ end
51
+ end
52
+ @trace.enable
53
+ end
54
+
55
+ def get_most_recent_unfinished_call(trace_point)
56
+ @spent.reverse_each do |old|
57
+ next unless old[:path] == trace_point.path
58
+ next unless old[:method_id] == trace_point.method_id
59
+ next if old[:end]
60
+
61
+ return old
62
+ end
63
+
64
+ nil
65
+ end
66
+ end
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: owl_tracer
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Gui Carvalho
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-11-05 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Logs how much time each method call is taking
14
+ email: guilherme@konkix.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/owl_tracer.rb
20
+ homepage: http://rubygems.org/gems/owl_tracer
21
+ licenses:
22
+ - MIT
23
+ metadata: {}
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ requirements: []
39
+ rubyforge_project:
40
+ rubygems_version: 2.5.1
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: Helps optimize performance by identifying how long each method is taking
44
+ test_files: []