rack-perftools_profiler 0.0.2 → 0.1.0

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/README.rdoc CHANGED
@@ -26,12 +26,22 @@ Include the middleware
26
26
 
27
27
  require 'rack/perftools_profiler'
28
28
 
29
- For Rails, add the following to config/environment.rb
29
+ For Rails 2, add the following to config/environment.rb
30
30
 
31
- config.gem 'rack-perftools_profiler', :version => '~> 0.0.1', :lib => 'rack/perftools_profiler'
31
+ config.gem 'rack-perftools_profiler', :version => '~> 0.1', :lib => 'rack/perftools_profiler'
32
32
  require 'rack/perftools_profiler'
33
33
  config.middleware.use Rack::PerftoolsProfiler, :default_printer => 'gif'
34
34
 
35
+ For Rails 3 (or any app using Bundler), add the following to your Gemfile
36
+
37
+ gem 'rack-perftools_profiler', '~> 0.1', :require => 'rack/perftools_profiler'
38
+
39
+ and make sure you pass the option
40
+
41
+ :bundler => true
42
+
43
+ when configuring the middleware.
44
+
35
45
  For Sinatra, call 'use' inside a configure block, like so:
36
46
 
37
47
  configure :profiling do
@@ -49,6 +59,8 @@ For Rack::Builder, call 'use' inside the Builder constructor block
49
59
  * :default_printer - can be set to 'text', 'gif', or 'pdf'. Default is :text
50
60
  * :mode - can be set to 'cputime' or 'walltime'. Default is :cputime
51
61
  * :frequency - in :cputime mode, the number of times per second the app will be sampled. Default is 100 (times/sec)
62
+ * :bundler - run the profiler binary using 'bundle' if set to true. Default is false
63
+ * :gemfile_dir - directory with Gemfile. Default is the current directory.
52
64
 
53
65
  == Usage
54
66
 
@@ -59,7 +71,7 @@ add the 'profile' and (optionally) the 'times' GET params (which will rerun the
59
71
  the specified number of times).
60
72
 
61
73
  Example:
62
- curl http://localhost:8080/foobar?profile=true&times=3
74
+ curl http://localhost:3000/foobar?profile=true&times=3
63
75
 
64
76
  Note that this will change the status, body, and headers of the response (you'll get
65
77
  back the profiling data, NOT the original response).
@@ -67,11 +79,11 @@ back the profiling data, NOT the original response).
67
79
  The other mode is start/stop mode.
68
80
 
69
81
  Example:
70
- curl http://localhost:8080/__start__
71
- curl http://localhost:8080/foobar
72
- curl http://localhost:8080/foobaz
73
- curl http://localhost:8080/__stop__
74
- curl http://localhost:8080/__data__
82
+ curl http://localhost:3000/__start__
83
+ curl http://localhost:3000/foobar
84
+ curl http://localhost:3000/foobaz
85
+ curl http://localhost:3000/__stop__
86
+ curl http://localhost:3000/__data__
75
87
 
76
88
  In this mode, all responses are normal. You must visit \_\_stop\_\_ to complete profiling and
77
89
  then you can view the profiling data by visiting \_\_data\_\_
data/Rakefile CHANGED
@@ -10,7 +10,7 @@ begin
10
10
  gem.email = 'ben@bbrinck.com'
11
11
  gem.homepage = 'http://github.com/bhb/rack-perftools_profiler'
12
12
  gem.authors = ['Ben Brinckerhoff']
13
- gem.add_dependency 'perftools.rb', '~> 0.4'
13
+ gem.add_dependency 'perftools.rb', '~> 0.5'
14
14
  gem.add_dependency 'rack', '~> 1.0'
15
15
  gem.add_dependency('open4', '~> 1.0')
16
16
  gem.add_development_dependency 'rack', '~> 1.1'
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.2
1
+ 0.1.0
@@ -1,90 +1,3 @@
1
- # REQUIREMENTS
2
- #
3
- # You'll need graphviz to generate call graphs using dot (for the GIF printer):
4
- #
5
- # sudo port install graphviz # osx
6
- # sudo apt-get install graphviz # debian/ubuntu
7
-
8
- # You'll need ps2pdf to generate PDFs
9
- # On OS X, ps2pdf comes is installed as part of Ghostscript
10
- #
11
- # sudo port install ghostscript # osx
12
- # brew install ghostscript # homebrew
13
- # sudo apt-get install ps2pdf # debian/ubuntu
14
-
15
- # CONFIGURATION
16
- #
17
- # Include the middleware
18
- #
19
- # require 'rack/perftools_profiler'
20
- #
21
- # For Rails, add the following to config/environment.rb
22
- #
23
- # config.middleware.use Rack::PerftoolsProfiler, :default_printer => 'gif'
24
- #
25
- # For Sinatra, call 'use' inside a configure block, like so:
26
- #
27
- # configure :profiling do
28
- # use Rack::PerftoolsProfiler, :default_printer => 'gif'
29
- # end
30
- #
31
- # For Rack::Builder, call 'use' inside the Builder constructor block
32
- #
33
- # Rack::Builder.new do
34
- # use Rack::PerftoolsProfiler, :default_printer => 'gif'
35
- # end
36
- #
37
- #
38
- # OPTIONS
39
- #
40
- # :default_printer - can be set to 'text', 'gif', or 'pdf'. Default is :text
41
- # :mode - can be set to 'cputime' or 'walltime'. Default is :cputime
42
- # :frequency - in :cputime mode, the number of times per second the app will be sampled.
43
- # Default is 100 (times/sec)
44
- #
45
- # USAGE
46
- #
47
- # There are two modes for the profiler
48
- #
49
- # First, you can run in 'simple' mode. Just visit the url you want to profile, but
50
- # add the 'profile' and (optionally) the 'times' GET params
51
- #
52
- # example:
53
- # curl http://localhost:8080/foobar?profile=true&times=3
54
- #
55
- # Note that this will change the status, body, and headers of the response (you'll get
56
- # back the profiling data, NOT the original response.
57
- #
58
- #
59
- # The other mode is start/stop mode.
60
- #
61
- # example:
62
- # curl http://localhost:8080/__start__
63
- # curl http://localhost:8080/foobar
64
- # curl http://localhost:8080/foobaz
65
- # curl http://localhost:8080/__stop__
66
- # curl http://localhost:8080/__data__
67
- #
68
- # In this mode, all responses are normal. You must visit __stop__ to complete profiling and
69
- # then you can view the profiling data by visiting __data__
70
-
71
- # PROFILING DATA OPTIONS
72
- #
73
- # In both simple and start/stop modes, you can add additional params to change how the data
74
- # is displayed. In simple mode, these params are just added to the URL being profiled. In
75
- # start/stop mode, they are added to the __data__ URL
76
-
77
- # printer - overrides the default_printer option (see above)
78
- # ignore - a regular expression of the area of code to ignore
79
- # focus - a regular expression of the area of code to solely focus on.
80
-
81
- # (for ignore and focus, please see http://google-perftools.googlecode.com/svn/trunk/doc/cpuprofile.html#pprof
82
- # for more details)
83
- #
84
- # ACKNOWLEDGMENTS
85
- #
86
- # The basic idea and initial implementation was heavily influenced by Rack::Profiler from rack-contrib.
87
-
88
1
  require 'rack'
89
2
  require 'perftools'
90
3
  require 'pstore'
@@ -24,12 +24,15 @@ module Rack::PerftoolsProfiler
24
24
  DEFAULT_PRINTER = :text
25
25
  DEFAULT_MODE = :cputime
26
26
  UNSET_FREQUENCY = -1
27
+ DEFAULT_GEMFILE_DIR = '.'
27
28
 
28
29
  def initialize(app, options)
29
- @printer = (options.delete(:default_printer) { DEFAULT_PRINTER }).to_sym
30
+ @printer = (options.delete(:default_printer) { DEFAULT_PRINTER }).to_sym
31
+ @frequency = (options.delete(:frequency) { UNSET_FREQUENCY }).to_s
32
+ @mode = (options.delete(:mode) { DEFAULT_MODE }).to_sym
33
+ @bundler = (options.delete(:bundler) { false })
34
+ @gemfile_dir = (options.delete(:gemfile_dir) { DEFAULT_GEMFILE_DIR })
30
35
  ProfileDataAction.check_printer(@printer)
31
- @frequency = (options.delete(:frequency) { UNSET_FREQUENCY }).to_s
32
- @mode = (options.delete(:mode) { DEFAULT_MODE }).to_sym
33
36
  raise ProfilerArgumentError, "Invalid option(s): #{options.keys.join(' ')}" unless options.empty?
34
37
  end
35
38
 
@@ -43,9 +46,10 @@ module Rack::PerftoolsProfiler
43
46
  def self.clear_data
44
47
  ::File.delete(PROFILING_DATA_FILE) if ::File.exists?(PROFILING_DATA_FILE)
45
48
  end
46
-
49
+
47
50
  def start
48
51
  set_env_vars
52
+ PerfTools::CpuProfiler.stop
49
53
  PerfTools::CpuProfiler.start(PROFILING_DATA_FILE)
50
54
  self.profiling = true
51
55
  end
@@ -71,7 +75,8 @@ module Rack::PerftoolsProfiler
71
75
  args += " --ignore=#{ignore}" if ignore
72
76
  args += " --focus=#{focus}" if focus
73
77
  cmd = "pprof.rb #{args} #{PROFILING_DATA_FILE}"
74
- stdout, stderr, status = run(cmd)
78
+ cmd = "bundle exec " + cmd if @bundler
79
+ stdout, stderr, status = Dir.chdir(@gemfile_dir) { run(cmd) }
75
80
  if(status == 0)
76
81
  [printer, stdout]
77
82
  else
@@ -402,6 +402,30 @@ class RackPerftoolsProfilerTest < Test::Unit::TestCase
402
402
  end
403
403
 
404
404
  end
405
+
406
+ context "when in bundler mode" do
407
+
408
+ should "call pprof.rb using 'bundle' command if bunder is set" do
409
+ status = stub_everything(:exitstatus => 0)
410
+ profiled_app = Rack::PerftoolsProfiler.new(@app, :bundler => true)
411
+ Open4.expects(:popen4).with(regexp_matches(/^bundle exec pprof\.rb/)).returns(status)
412
+ profiled_app.call(@profiled_request_env)
413
+ end
414
+
415
+ should "change directory into the current directory if custom Gemfile dir is not provided" do
416
+ profiled_app = Rack::PerftoolsProfiler.new(@app, :bundler => true, :gemfile_dir => 'bundler')
417
+ Dir.expects(:chdir).with('bundler').returns(["","",0])
418
+ profiled_app.call(@profiled_request_env)
419
+ end
420
+
421
+ should "change directory into custom Gemfile dir if provided" do
422
+ profiled_app = Rack::PerftoolsProfiler.new(@app, :bundler => true)
423
+ Dir.expects(:chdir).with('.').returns(["","",0])
424
+ profiled_app.call(@profiled_request_env)
425
+ end
426
+
427
+ end
428
+
405
429
  end
406
430
 
407
431
  end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
+ - 1
7
8
  - 0
8
- - 2
9
- version: 0.0.2
9
+ version: 0.1.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Ben Brinckerhoff
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-07-23 00:00:00 -06:00
17
+ date: 2010-08-21 00:00:00 -06:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -26,8 +26,8 @@ dependencies:
26
26
  - !ruby/object:Gem::Version
27
27
  segments:
28
28
  - 0
29
- - 4
30
- version: "0.4"
29
+ - 5
30
+ version: "0.5"
31
31
  type: :runtime
32
32
  version_requirements: *id001
33
33
  - !ruby/object:Gem::Dependency