stackprof 0.2.6 → 0.2.7
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.
- data/Gemfile.lock +1 -1
- data/README.md +13 -0
- data/Rakefile +1 -1
- data/ext/stackprof.c +1 -1
- data/lib/stackprof/middleware.rb +12 -4
- data/lib/stackprof/report.rb +34 -34
- data/stackprof.gemspec +1 -1
- data/test/test_middleware.rb +22 -0
- metadata +18 -12
- checksums.yaml +0 -7
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -7,6 +7,19 @@ and written as a replacement for [perftools.rb](https://github.com/tmm1/perftool
|
|
7
7
|
|
8
8
|
### getting started
|
9
9
|
|
10
|
+
#### Install
|
11
|
+
|
12
|
+
In your Gemfile add:
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
gem 'stackprof'
|
16
|
+
```
|
17
|
+
|
18
|
+
Then run `$ bundle install`. Alternatively you can run `$ gem install stackprof`.
|
19
|
+
|
20
|
+
|
21
|
+
#### Run
|
22
|
+
|
10
23
|
in ruby:
|
11
24
|
|
12
25
|
``` ruby
|
data/Rakefile
CHANGED
@@ -4,7 +4,7 @@ task :default => :test
|
|
4
4
|
# Packaging
|
5
5
|
# ==========================================================
|
6
6
|
|
7
|
-
GEMSPEC =
|
7
|
+
GEMSPEC = Gem::Specification::load('stackprof.gemspec')
|
8
8
|
|
9
9
|
require 'rubygems/package_task'
|
10
10
|
Gem::PackageTask.new(GEMSPEC) do |pkg|
|
data/ext/stackprof.c
CHANGED
@@ -92,7 +92,7 @@ stackprof_start(int argc, VALUE *argv, VALUE self)
|
|
92
92
|
if (mode == sym_object) {
|
93
93
|
if (!RTEST(interval)) interval = INT2FIX(1);
|
94
94
|
|
95
|
-
objtracer = rb_tracepoint_new(
|
95
|
+
objtracer = rb_tracepoint_new(Qnil, RUBY_INTERNAL_EVENT_NEWOBJ, stackprof_newobj_handler, 0);
|
96
96
|
rb_tracepoint_enable(objtracer);
|
97
97
|
} else if (mode == sym_wall || mode == sym_cpu) {
|
98
98
|
if (!RTEST(interval)) interval = INT2FIX(1000);
|
data/lib/stackprof/middleware.rb
CHANGED
@@ -11,14 +11,15 @@ module StackProf
|
|
11
11
|
Middleware.interval = options[:interval] || 1000
|
12
12
|
Middleware.enabled = options[:enabled]
|
13
13
|
Middleware.path = options[:path] || 'tmp'
|
14
|
-
at_exit{ Middleware.save
|
14
|
+
at_exit{ Middleware.save } if options[:save_at_exit]
|
15
15
|
end
|
16
16
|
|
17
17
|
def call(env)
|
18
|
-
|
18
|
+
enabled = Middleware.enabled?(env)
|
19
|
+
StackProf.start(mode: Middleware.mode, interval: Middleware.interval) if enabled
|
19
20
|
@app.call(env)
|
20
21
|
ensure
|
21
|
-
if
|
22
|
+
if enabled
|
22
23
|
StackProf.stop
|
23
24
|
if @num_reqs && (@num_reqs-=1) == 0
|
24
25
|
@num_reqs = @options[:save_every]
|
@@ -29,7 +30,14 @@ module StackProf
|
|
29
30
|
|
30
31
|
class << self
|
31
32
|
attr_accessor :enabled, :mode, :interval, :path
|
32
|
-
|
33
|
+
|
34
|
+
def enabled?(env)
|
35
|
+
if enabled.respond_to?(:call)
|
36
|
+
enabled.call(env)
|
37
|
+
else
|
38
|
+
enabled
|
39
|
+
end
|
40
|
+
end
|
33
41
|
|
34
42
|
def save(filename = nil)
|
35
43
|
if results = StackProf.results
|
data/lib/stackprof/report.rb
CHANGED
@@ -285,40 +285,6 @@ module StackProf
|
|
285
285
|
end
|
286
286
|
end
|
287
287
|
|
288
|
-
private
|
289
|
-
|
290
|
-
def root_frames
|
291
|
-
frames.select{ |addr, frame| callers_for(addr).size == 0 }
|
292
|
-
end
|
293
|
-
|
294
|
-
def callers_for(addr)
|
295
|
-
@callers_for ||= {}
|
296
|
-
@callers_for[addr] ||= data[:frames].map{ |id, other| [other[:name], other[:edges][addr]] if other[:edges] && other[:edges].include?(addr) }.compact
|
297
|
-
end
|
298
|
-
|
299
|
-
def source_display(f, file, lines, range=nil)
|
300
|
-
File.readlines(file).each_with_index do |code, i|
|
301
|
-
next unless range.nil? || range.include?(i)
|
302
|
-
if lines and lineinfo = lines[i+1]
|
303
|
-
total_samples, samples = lineinfo
|
304
|
-
if version == 1.0
|
305
|
-
samples = total_samples
|
306
|
-
f.printf "% 5d % 7s | % 5d | %s", samples, "(%2.1f%%)" % (100.0*samples/overall_samples), i+1, code
|
307
|
-
elsif samples > 0
|
308
|
-
f.printf "% 5d % 8s / % 5d % 7s | % 5d | %s", total_samples, "(%2.1f%%)" % (100.0*total_samples/overall_samples), samples, "(%2.1f%%)" % (100.0*samples/overall_samples), i+1, code
|
309
|
-
else
|
310
|
-
f.printf "% 5d % 8s | % 5d | %s", total_samples, "(%3.1f%%)" % (100.0*total_samples/overall_samples), i+1, code
|
311
|
-
end
|
312
|
-
else
|
313
|
-
if version == 1.0
|
314
|
-
f.printf " | % 5d | %s", i+1, code
|
315
|
-
else
|
316
|
-
f.printf " | % 5d | %s", i+1, code
|
317
|
-
end
|
318
|
-
end
|
319
|
-
end
|
320
|
-
end
|
321
|
-
|
322
288
|
def +(other)
|
323
289
|
raise ArgumentError, "cannot combine #{other.class}" unless self.class == other.class
|
324
290
|
raise ArgumentError, "cannot combine #{modeline} with #{other.modeline}" unless modeline == other.modeline
|
@@ -364,5 +330,39 @@ module StackProf
|
|
364
330
|
|
365
331
|
self.class.new(data)
|
366
332
|
end
|
333
|
+
|
334
|
+
private
|
335
|
+
def root_frames
|
336
|
+
frames.select{ |addr, frame| callers_for(addr).size == 0 }
|
337
|
+
end
|
338
|
+
|
339
|
+
def callers_for(addr)
|
340
|
+
@callers_for ||= {}
|
341
|
+
@callers_for[addr] ||= data[:frames].map{ |id, other| [other[:name], other[:edges][addr]] if other[:edges] && other[:edges].include?(addr) }.compact
|
342
|
+
end
|
343
|
+
|
344
|
+
def source_display(f, file, lines, range=nil)
|
345
|
+
File.readlines(file).each_with_index do |code, i|
|
346
|
+
next unless range.nil? || range.include?(i)
|
347
|
+
if lines and lineinfo = lines[i+1]
|
348
|
+
total_samples, samples = lineinfo
|
349
|
+
if version == 1.0
|
350
|
+
samples = total_samples
|
351
|
+
f.printf "% 5d % 7s | % 5d | %s", samples, "(%2.1f%%)" % (100.0*samples/overall_samples), i+1, code
|
352
|
+
elsif samples > 0
|
353
|
+
f.printf "% 5d % 8s / % 5d % 7s | % 5d | %s", total_samples, "(%2.1f%%)" % (100.0*total_samples/overall_samples), samples, "(%2.1f%%)" % (100.0*samples/overall_samples), i+1, code
|
354
|
+
else
|
355
|
+
f.printf "% 5d % 8s | % 5d | %s", total_samples, "(%3.1f%%)" % (100.0*total_samples/overall_samples), i+1, code
|
356
|
+
end
|
357
|
+
else
|
358
|
+
if version == 1.0
|
359
|
+
f.printf " | % 5d | %s", i+1, code
|
360
|
+
else
|
361
|
+
f.printf " | % 5d | %s", i+1, code
|
362
|
+
end
|
363
|
+
end
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
367
|
end
|
368
368
|
end
|
data/stackprof.gemspec
CHANGED
data/test/test_middleware.rb
CHANGED
@@ -38,4 +38,26 @@ class StackProf::MiddlewareTest < Test::Unit::TestCase
|
|
38
38
|
StackProf::Middleware.save
|
39
39
|
end
|
40
40
|
|
41
|
+
def test_enabled_should_use_a_proc_if_passed
|
42
|
+
env = {}
|
43
|
+
|
44
|
+
StackProf::Middleware.new(Object.new, enabled: Proc.new{ false })
|
45
|
+
refute StackProf::Middleware.enabled?(env)
|
46
|
+
|
47
|
+
StackProf::Middleware.new(Object.new, enabled: Proc.new{ true })
|
48
|
+
assert StackProf::Middleware.enabled?(env)
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_enabled_should_use_a_proc_if_passed_and_use_the_request_env
|
52
|
+
enable_proc = Proc.new {|env| env['PROFILE'] }
|
53
|
+
|
54
|
+
env = Hash.new { false }
|
55
|
+
StackProf::Middleware.new(Object.new, enabled: enable_proc)
|
56
|
+
refute StackProf::Middleware.enabled?(env)
|
57
|
+
|
58
|
+
env = Hash.new { true}
|
59
|
+
StackProf::Middleware.new(Object.new, enabled: enable_proc)
|
60
|
+
assert StackProf::Middleware.enabled?(env)
|
61
|
+
end
|
62
|
+
|
41
63
|
end
|
metadata
CHANGED
@@ -1,41 +1,46 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stackprof
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Aman Gupta
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2014-
|
12
|
+
date: 2014-06-17 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: rake-compiler
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
|
-
- -
|
19
|
+
- - ~>
|
18
20
|
- !ruby/object:Gem::Version
|
19
21
|
version: '0.9'
|
20
22
|
type: :development
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
|
-
- -
|
27
|
+
- - ~>
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '0.9'
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: mocha
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
|
-
- -
|
35
|
+
- - ~>
|
32
36
|
- !ruby/object:Gem::Version
|
33
37
|
version: '0.14'
|
34
38
|
type: :development
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
|
-
- -
|
43
|
+
- - ~>
|
39
44
|
- !ruby/object:Gem::Version
|
40
45
|
version: '0.14'
|
41
46
|
description: stackprof is a fast sampling profiler for ruby code, with cpu, wallclock
|
@@ -49,7 +54,7 @@ extensions:
|
|
49
54
|
- ext/extconf.rb
|
50
55
|
extra_rdoc_files: []
|
51
56
|
files:
|
52
|
-
-
|
57
|
+
- .gitignore
|
53
58
|
- Gemfile
|
54
59
|
- Gemfile.lock
|
55
60
|
- README.md
|
@@ -74,26 +79,27 @@ files:
|
|
74
79
|
homepage: http://github.com/tmm1/stackprof
|
75
80
|
licenses:
|
76
81
|
- MIT
|
77
|
-
metadata: {}
|
78
82
|
post_install_message:
|
79
83
|
rdoc_options: []
|
80
84
|
require_paths:
|
81
85
|
- lib
|
82
86
|
required_ruby_version: !ruby/object:Gem::Requirement
|
87
|
+
none: false
|
83
88
|
requirements:
|
84
|
-
- -
|
89
|
+
- - ! '>='
|
85
90
|
- !ruby/object:Gem::Version
|
86
91
|
version: '0'
|
87
92
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
93
|
+
none: false
|
88
94
|
requirements:
|
89
|
-
- -
|
95
|
+
- - ! '>='
|
90
96
|
- !ruby/object:Gem::Version
|
91
97
|
version: '0'
|
92
98
|
requirements: []
|
93
99
|
rubyforge_project:
|
94
|
-
rubygems_version:
|
100
|
+
rubygems_version: 1.8.23
|
95
101
|
signing_key:
|
96
|
-
specification_version:
|
102
|
+
specification_version: 3
|
97
103
|
summary: sampling callstack-profiler for ruby 2.1+
|
98
104
|
test_files: []
|
99
105
|
has_rdoc:
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: e783faab7c8c97296d52c602c971eddb3e4c85eb
|
4
|
-
data.tar.gz: 4952c5aec78540e9a2509e37f6e2195f56568712
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: 3a0f36b8202aefb65836dbe71b359fbcea3f7ecf4252fce52ec127f47db0ea9995f177f808c631d6803f5b40e1697d2e065028a15ceb17387351b2d3fa7af0e7
|
7
|
-
data.tar.gz: 685c58d929c5681693c64a1a63e939382171420ecc83856cabc9efeb2d0f7e65c25802d6f0c5c47e0b6def8addda2f0b78985048c7829f6b23e7ccb636be79ff
|