stackprof 0.2.9 → 0.2.10

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ccd65300839e0302d1ce83344815ab9ceb5bf00c
4
- data.tar.gz: 693f5630f930e10ae29e0b2eb906749a379fb326
3
+ metadata.gz: afa4ecbd5eba7e06625bb12c770da033682539f4
4
+ data.tar.gz: fc0f0ad1bcc0e1d726c82437a57aa6c0beb8b3e2
5
5
  SHA512:
6
- metadata.gz: ad05091d5ee959c900b12d3bf659b021a51082e99bea2e52d99a35ec2c7b55363a32673f6a9cdc952074e021ff61066c83a43381c5b4d64e41345b2e0bee2853
7
- data.tar.gz: f2dad38ea0bdb1bcb4ad52df7ae3997e8e7e40689eee14f62a255cac1a8449dce032cfb06fee6e522b3d5bbf3dfd971ce5cdcba4d6411237b3e0af4a410b4f3c
6
+ metadata.gz: ddb8ed15ef2275231790a475a770a72753fe87aee98fc77d2c7a19d9405228f72832b76f941c84db94bf62fd5a445fb9d3b8e3521f2bc016f6dc170229d56a0e
7
+ data.tar.gz: b911543ceb1e019086adda7780aa72b48dc6bede83ee99cf746b5cac557f5f9a395c5f88ac3a5f34414e1c1dc8f56c5559e770e8eb355cc9a0c9f7071bb144fe
data/.gitignore CHANGED
@@ -1,4 +1,4 @@
1
1
  /tmp
2
- /lib/stackprof.bundle
3
- /lib/stackprof.so
2
+ /lib/stackprof/stackprof.bundle
3
+ /lib/stackprof/stackprof.so
4
4
  *.sw?
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.8
4
+ - 2.2.4
5
+ - 2.3.0
6
+ - ruby-head
7
+ script: "bundle exec rake test"
8
+ sudo: false
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- stackprof (0.2.7)
4
+ stackprof (0.2.9)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -24,7 +24,7 @@ in ruby:
24
24
 
25
25
  ``` ruby
26
26
  StackProf.run(mode: :cpu, out: 'tmp/stackprof-cpu-myapp.dump') do
27
- ...
27
+ #...
28
28
  end
29
29
  ```
30
30
 
@@ -77,6 +77,22 @@ $ stackprof tmp/stackprof-cpu-*.dump --method 'Object#present?'
77
77
 
78
78
  For an experimental version of WebUI reporting of stackprof, see [stackprof-webnav](https://github.com/alisnic/stackprof-webnav)
79
79
 
80
+ You can generate a flamegraph however additional data must be collected using the `raw: true` flag. Once you've collected results with this flag enabled you can generate a flamegraph:
81
+
82
+ ```
83
+ $ stackprof --flamegraph tmp/stackprof-cpu-myapp.dump > tmp/flamegraph
84
+ ```
85
+
86
+ Once the flamegraph has been generated you can generate a viewer command with:
87
+
88
+ ```
89
+ $ stackprof --flamegraph-viewer=tmp/flamegraph
90
+ ```
91
+
92
+ The `--flamegraph-viewer` command will output the exact shell command you need to run to open the `tmp/flamegraph` you generated with the built in stackprof flamegraph viewer:
93
+
94
+ ![](http://i.imgur.com/EwndrgD.png)
95
+
80
96
  ### sampling
81
97
 
82
98
  four sampling modes are supported:
@@ -89,9 +105,30 @@ four sampling modes are supported:
89
105
  samplers have a tuneable interval which can be used to reduce overhead or increase granularity:
90
106
 
91
107
  - wall time: sample every _interval_ microseconds of wallclock time (default: 1000)
108
+
109
+ ```ruby
110
+ StackProf.run(mode: :wall, out: 'tmp/stackprof.dump', interval: 1000) do
111
+ #...
112
+ end
113
+ ```
114
+
92
115
  - cpu time: sample every _interval_ microseconds of cpu activity (default: 1000 = 1 millisecond)
116
+
117
+ ```ruby
118
+ StackProf.run(mode: :cpu, out: 'tmp/stackprof.dump', interval: 1000) do
119
+ #...
120
+ end
121
+ ```
122
+
93
123
  - object allocation: sample every _interval_ allocations (default: 1)
94
124
 
125
+
126
+ ```ruby
127
+ StackProf.run(mode: :object, out: 'tmp/stackprof.dump', interval: 1) do
128
+ #...
129
+ end
130
+ ```
131
+
95
132
  samples are taken using a combination of three new C-APIs in ruby 2.1:
96
133
 
97
134
  - signal handlers enqueue a sampling job using `rb_postponed_job_register_one`.
@@ -105,7 +142,7 @@ samples are taken using a combination of three new C-APIs in ruby 2.1:
105
142
  - in allocation mode, samples are taken via `rb_tracepoint_new(RUBY_INTERNAL_EVENT_NEWOBJ)`,
106
143
  which provides a notification every time the VM allocates a new object.
107
144
 
108
- ### aggregation
145
+ ### Aggregation
109
146
 
110
147
  each sample consists of N stack frames, where a frame looks something like `MyClass#method` or `block in MySingleton.method`.
111
148
  for each of these frames in the sample, the profiler collects a few pieces of metadata:
data/Rakefile CHANGED
@@ -16,7 +16,7 @@ end
16
16
 
17
17
  require 'rake/extensiontask'
18
18
  Rake::ExtensionTask.new('stackprof', GEMSPEC) do |ext|
19
- ext.ext_dir = 'ext'
19
+ ext.lib_dir = 'lib/stackprof'
20
20
  end
21
21
  task :build => :compile
22
22
 
@@ -22,6 +22,10 @@ parser = OptionParser.new(ARGV) do |o|
22
22
  puts("open file://#{File.expand_path('../../lib/stackprof/flamegraph/viewer.html', __FILE__)}?data=#{File.expand_path(file)}")
23
23
  exit
24
24
  }
25
+ o.on('--select-files []', String, 'Show results of matching files'){ |path| (options[:select_files] ||= []) << File.expand_path(path) }
26
+ o.on('--reject-files []', String, 'Exclude results of matching files'){ |path| (options[:reject_files] ||= []) << File.expand_path(path) }
27
+ o.on('--select-names []', Regexp, 'Show results of matching method names'){ |regexp| (options[:select_names] ||= []) << regexp }
28
+ o.on('--reject-names []', Regexp, 'Exclude results of matching method names'){ |regexp| (options[:reject_names] ||= []) << regexp }
25
29
  o.on('--dump', 'Print marshaled profile dump (combine multiple profiles)'){ options[:format] = :dump }
26
30
  o.on('--debug', 'Pretty print raw profile data'){ options[:format] = :debug }
27
31
  end
@@ -56,7 +60,7 @@ options.delete(:limit) if options[:limit] == 0
56
60
 
57
61
  case options[:format]
58
62
  when :text
59
- report.print_text(options[:sort], options[:limit])
63
+ report.print_text(options[:sort], options[:limit], options[:select_files], options[:reject_files], options[:select_names], options[:reject_names])
60
64
  when :debug
61
65
  report.print_debug
62
66
  when :dump
@@ -3,7 +3,7 @@ if have_func('rb_postponed_job_register_one') &&
3
3
  have_func('rb_profile_frames') &&
4
4
  have_func('rb_tracepoint_new') &&
5
5
  have_const('RUBY_INTERNAL_EVENT_NEWOBJ')
6
- create_makefile('stackprof')
6
+ create_makefile('stackprof/stackprof')
7
7
  else
8
8
  fail 'missing API: are you using ruby 2.1+?'
9
9
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  stackprof.c - Sampling call-stack frame profiler for MRI.
4
4
 
5
- vim: setl noexpandtab shiftwidth=4 tabstop=8 softtabstop=4
5
+ vim: noexpandtab shiftwidth=4 tabstop=8 softtabstop=4
6
6
 
7
7
  **********************************************************************/
8
8
 
@@ -540,8 +540,5 @@ Init_stackprof(void)
540
540
  rb_define_singleton_method(rb_mStackProf, "results", stackprof_results, -1);
541
541
  rb_define_singleton_method(rb_mStackProf, "sample", stackprof_sample, 0);
542
542
 
543
- rb_autoload(rb_mStackProf, rb_intern_const("Report"), "stackprof/report.rb");
544
- rb_autoload(rb_mStackProf, rb_intern_const("Middleware"), "stackprof/middleware.rb");
545
-
546
543
  pthread_atfork(stackprof_atfork_prepare, stackprof_atfork_parent, stackprof_atfork_child);
547
544
  }
@@ -0,0 +1,4 @@
1
+ require "stackprof/stackprof"
2
+
3
+ StackProf.autoload :Report, "stackprof/report.rb"
4
+ StackProf.autoload :Middleware, "stackprof/middleware.rb"
@@ -9,7 +9,8 @@ module StackProf
9
9
  attr_reader :data
10
10
 
11
11
  def frames(sort_by_total=false)
12
- @data[:frames].sort_by{ |iseq, stats| -stats[sort_by_total ? :total_samples : :samples] }.inject({}){|h, (k, v)| h[k] = v; h}
12
+ @data[:"sorted_frames_#{sort_by_total}"] ||=
13
+ @data[:frames].sort_by{ |iseq, stats| -stats[sort_by_total ? :total_samples : :samples] }.inject({}){|h, (k, v)| h[k] = v; h}
13
14
  end
14
15
 
15
16
  def normalized_frames
@@ -209,7 +210,7 @@ module StackProf
209
210
  f.puts "}"
210
211
  end
211
212
 
212
- def print_text(sort_by_total=false, limit=nil, f = STDOUT)
213
+ def print_text(sort_by_total=false, limit=nil, select_files= nil, reject_files=nil, select_names=nil, reject_names=nil, f = STDOUT)
213
214
  f.puts "=================================="
214
215
  f.printf " Mode: #{modeline}\n"
215
216
  f.printf " Samples: #{@data[:samples]} (%.2f%% miss rate)\n", 100.0*@data[:missed_samples]/(@data[:missed_samples]+@data[:samples])
@@ -217,6 +218,10 @@ module StackProf
217
218
  f.puts "=================================="
218
219
  f.printf "% 10s (pct) % 10s (pct) FRAME\n" % ["TOTAL", "SAMPLES"]
219
220
  list = frames(sort_by_total)
221
+ list.select!{|_, info| select_files.any?{|path| info[:file].start_with?(path)}} if select_files
222
+ list.select!{|_, info| select_names.any?{|reg| info[:name] =~ reg}} if select_names
223
+ list.reject!{|_, info| reject_files.any?{|path| info[:file].start_with?(path)}} if reject_files
224
+ list.reject!{|_, info| reject_names.any?{|reg| info[:name] =~ reg}} if reject_names
220
225
  list = list.first(limit) if limit
221
226
  list.each do |frame, info|
222
227
  call, total = info.values_at(:samples, :total_samples)
@@ -1,13 +1,13 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'stackprof'
3
- s.version = '0.2.9'
3
+ s.version = '0.2.10'
4
4
  s.homepage = 'http://github.com/tmm1/stackprof'
5
5
 
6
6
  s.authors = 'Aman Gupta'
7
7
  s.email = 'aman@tmm1.net'
8
8
 
9
9
  s.files = `git ls-files`.split("\n")
10
- s.extensions = 'ext/extconf.rb'
10
+ s.extensions = 'ext/stackprof/extconf.rb'
11
11
 
12
12
  s.bindir = 'bin'
13
13
  s.executables << 'stackprof'
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stackprof
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.9
4
+ version: 0.2.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aman Gupta
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-13 00:00:00.000000000 Z
11
+ date: 2016-09-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake-compiler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '0.9'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0.9'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: mocha
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ~>
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0.14'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ~>
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0.14'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: minitest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ~>
45
+ - - "~>"
46
46
  - !ruby/object:Gem::Version
47
47
  version: '5.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ~>
52
+ - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '5.0'
55
55
  description: stackprof is a fast sampling profiler for ruby code, with cpu, wallclock
@@ -60,10 +60,11 @@ executables:
60
60
  - stackprof-flamegraph.pl
61
61
  - stackprof-gprof2dot.py
62
62
  extensions:
63
- - ext/extconf.rb
63
+ - ext/stackprof/extconf.rb
64
64
  extra_rdoc_files: []
65
65
  files:
66
- - .gitignore
66
+ - ".gitignore"
67
+ - ".travis.yml"
67
68
  - Gemfile
68
69
  - Gemfile.lock
69
70
  - LICENSE
@@ -72,8 +73,9 @@ files:
72
73
  - bin/stackprof
73
74
  - bin/stackprof-flamegraph.pl
74
75
  - bin/stackprof-gprof2dot.py
75
- - ext/extconf.rb
76
- - ext/stackprof.c
76
+ - ext/stackprof/extconf.rb
77
+ - ext/stackprof/stackprof.c
78
+ - lib/stackprof.rb
77
79
  - lib/stackprof/flamegraph/flamegraph.js
78
80
  - lib/stackprof/flamegraph/viewer.html
79
81
  - lib/stackprof/middleware.rb
@@ -97,17 +99,17 @@ require_paths:
97
99
  - lib
98
100
  required_ruby_version: !ruby/object:Gem::Requirement
99
101
  requirements:
100
- - - '>='
102
+ - - ">="
101
103
  - !ruby/object:Gem::Version
102
104
  version: '0'
103
105
  required_rubygems_version: !ruby/object:Gem::Requirement
104
106
  requirements:
105
- - - '>='
107
+ - - ">="
106
108
  - !ruby/object:Gem::Version
107
109
  version: '0'
108
110
  requirements: []
109
111
  rubyforge_project:
110
- rubygems_version: 2.0.14.1
112
+ rubygems_version: 2.4.5.1
111
113
  signing_key:
112
114
  specification_version: 4
113
115
  summary: sampling callstack-profiler for ruby 2.1+