devver-rack-contrib 0.9.3 → 0.9.4
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/lib/rack/contrib/perftools_profiler.rb +119 -0
- data/rack-contrib.gemspec +2 -1
- metadata +42 -20
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'perftools'
|
2
|
+
require 'rbconfig'
|
3
|
+
|
4
|
+
# You'll need graphviz to generate call graphs using dot:
|
5
|
+
#
|
6
|
+
# sudo port install graphviz # osx
|
7
|
+
# sudo apt-get install graphviz # debian/ubuntu
|
8
|
+
|
9
|
+
# You'll need ps2pdf to generate PDFs (comes with ghostscript)
|
10
|
+
# sudo port install ghostscript
|
11
|
+
|
12
|
+
module Rack
|
13
|
+
|
14
|
+
# Pass the :printer option to pick a different result format.
|
15
|
+
class PerftoolsProfiler
|
16
|
+
MODES = %w(
|
17
|
+
process_time
|
18
|
+
#wall_time
|
19
|
+
)
|
20
|
+
|
21
|
+
DEFAULT_PRINTER = :text
|
22
|
+
#DEFAULT_CONTENT_TYPE = 'application/octet-stream'
|
23
|
+
|
24
|
+
PRINTER_CONTENT_TYPE = {
|
25
|
+
:text => 'text/plain',
|
26
|
+
:gif => 'image/gif',
|
27
|
+
:pdf => 'application/pdf'
|
28
|
+
}
|
29
|
+
|
30
|
+
# Accepts a :printer => [:call_tree|:graph_html|:graph|:flat] option
|
31
|
+
# defaulting to :call_tree.
|
32
|
+
def initialize(app, options = {})
|
33
|
+
@app = app
|
34
|
+
@printer = parse_printer(options[:printer])
|
35
|
+
@times = (options[:times] || 1).to_i
|
36
|
+
end
|
37
|
+
|
38
|
+
def call(env)
|
39
|
+
if mode = profiling?(env)
|
40
|
+
profile(env, mode)
|
41
|
+
else
|
42
|
+
@app.call(env)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
def profiling?(env)
|
48
|
+
unless PerfTools::CpuProfiler.running?
|
49
|
+
request = Rack::Request.new(env)
|
50
|
+
if mode = request.params.delete('profile')
|
51
|
+
true
|
52
|
+
#if RubyProf.const_defined?(mode.upcase)
|
53
|
+
# mode
|
54
|
+
#else
|
55
|
+
#env['rack.errors'].write "Invalid RubyProf measure_mode: " +
|
56
|
+
# "#{mode}. Use one of #{MODES.to_a.join(', ')}"
|
57
|
+
# false
|
58
|
+
#end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def profile(env, mode)
|
64
|
+
#RubyProf.measure_mode = RubyProf.const_get(mode.upcase)
|
65
|
+
|
66
|
+
#GC.enable_stats if GC.respond_to?(:enable_stats)
|
67
|
+
#result = RubyProf.profile do
|
68
|
+
temp_file = "/tmp/perftools_file"
|
69
|
+
PerfTools::CpuProfiler.start(temp_file) do
|
70
|
+
@times.times { @app.call(env) }
|
71
|
+
end
|
72
|
+
#end
|
73
|
+
#GC.disable_stats if GC.respond_to?(:disable_stats)
|
74
|
+
|
75
|
+
[200, headers(@printer, env, mode), print(@printer, temp_file)]
|
76
|
+
end
|
77
|
+
|
78
|
+
def print(printer, temp_file)
|
79
|
+
cmd = "pprof.rb --#{printer} #{temp_file}"
|
80
|
+
`#{cmd}`
|
81
|
+
#body = StringIO.new
|
82
|
+
#printer.new(result).print(body, :min_percent => 0.01)
|
83
|
+
#body.rewind
|
84
|
+
#body
|
85
|
+
end
|
86
|
+
|
87
|
+
def headers(printer, env, mode)
|
88
|
+
headers = { 'Content-Type' => PRINTER_CONTENT_TYPE[printer] || DEFAULT_CONTENT_TYPE }
|
89
|
+
if printer==:pdf
|
90
|
+
filetype = printer
|
91
|
+
filename='profile'
|
92
|
+
headers['Content-Disposition'] = %(attachment; filename="#{filename}.#{mode}.#{filetype}")
|
93
|
+
end
|
94
|
+
headers
|
95
|
+
end
|
96
|
+
|
97
|
+
def parse_printer(printer)
|
98
|
+
if printer.nil?
|
99
|
+
DEFAULT_PRINTER
|
100
|
+
else
|
101
|
+
printer.to_sym
|
102
|
+
end
|
103
|
+
#elsif printer.is_a?(Class)
|
104
|
+
# printer
|
105
|
+
#else
|
106
|
+
# name = "#{camel_case(printer)}Printer"
|
107
|
+
# if RubyProf.const_defined?(name)
|
108
|
+
# RubyProf.const_get(name)
|
109
|
+
# else
|
110
|
+
# DEFAULT_PRINTER
|
111
|
+
# end
|
112
|
+
#end
|
113
|
+
end
|
114
|
+
|
115
|
+
def camel_case(word)
|
116
|
+
word.to_s.gsub(/(?:^|_)(.)/) { $1.upcase }
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
data/rack-contrib.gemspec
CHANGED
@@ -3,7 +3,7 @@ Gem::Specification.new do |s|
|
|
3
3
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
4
4
|
|
5
5
|
s.name = 'devver-rack-contrib'
|
6
|
-
s.version = '0.9.
|
6
|
+
s.version = '0.9.4'
|
7
7
|
s.date = '2010-01-10'
|
8
8
|
|
9
9
|
s.description = "The Devver fork of rack-contrib"
|
@@ -35,6 +35,7 @@ Gem::Specification.new do |s|
|
|
35
35
|
lib/rack/contrib/mailexceptions.rb
|
36
36
|
lib/rack/contrib/nested_params.rb
|
37
37
|
lib/rack/contrib/not_found.rb
|
38
|
+
lib/rack/contrib/perftools_profiler.rb
|
38
39
|
lib/rack/contrib/post_body_content_type_parser.rb
|
39
40
|
lib/rack/contrib/proctitle.rb
|
40
41
|
lib/rack/contrib/profiler.rb
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: devver-rack-contrib
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 9
|
8
|
+
- 4
|
9
|
+
version: 0.9.4
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- rack-devel
|
@@ -14,44 +19,58 @@ default_executable:
|
|
14
19
|
dependencies:
|
15
20
|
- !ruby/object:Gem::Dependency
|
16
21
|
name: rack
|
17
|
-
|
18
|
-
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
22
|
+
prerelease: false
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
20
24
|
requirements:
|
21
25
|
- - ">="
|
22
26
|
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
- 9
|
30
|
+
- 1
|
23
31
|
version: 0.9.1
|
24
|
-
|
32
|
+
type: :runtime
|
33
|
+
version_requirements: *id001
|
25
34
|
- !ruby/object:Gem::Dependency
|
26
35
|
name: test-spec
|
27
|
-
|
28
|
-
|
29
|
-
version_requirements: !ruby/object:Gem::Requirement
|
36
|
+
prerelease: false
|
37
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
30
38
|
requirements:
|
31
39
|
- - ~>
|
32
40
|
- !ruby/object:Gem::Version
|
41
|
+
segments:
|
42
|
+
- 0
|
43
|
+
- 9
|
44
|
+
- 0
|
33
45
|
version: 0.9.0
|
34
|
-
|
46
|
+
type: :development
|
47
|
+
version_requirements: *id002
|
35
48
|
- !ruby/object:Gem::Dependency
|
36
49
|
name: tmail
|
37
|
-
|
38
|
-
|
39
|
-
version_requirements: !ruby/object:Gem::Requirement
|
50
|
+
prerelease: false
|
51
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
40
52
|
requirements:
|
41
53
|
- - ">="
|
42
54
|
- !ruby/object:Gem::Version
|
55
|
+
segments:
|
56
|
+
- 1
|
57
|
+
- 2
|
43
58
|
version: "1.2"
|
44
|
-
|
59
|
+
type: :development
|
60
|
+
version_requirements: *id003
|
45
61
|
- !ruby/object:Gem::Dependency
|
46
62
|
name: json
|
47
|
-
|
48
|
-
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
63
|
+
prerelease: false
|
64
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
50
65
|
requirements:
|
51
66
|
- - ">="
|
52
67
|
- !ruby/object:Gem::Version
|
68
|
+
segments:
|
69
|
+
- 1
|
70
|
+
- 1
|
53
71
|
version: "1.1"
|
54
|
-
|
72
|
+
type: :development
|
73
|
+
version_requirements: *id004
|
55
74
|
description: The Devver fork of rack-contrib
|
56
75
|
email: rack-devel@googlegroups.com
|
57
76
|
executables: []
|
@@ -83,6 +102,7 @@ files:
|
|
83
102
|
- lib/rack/contrib/mailexceptions.rb
|
84
103
|
- lib/rack/contrib/nested_params.rb
|
85
104
|
- lib/rack/contrib/not_found.rb
|
105
|
+
- lib/rack/contrib/perftools_profiler.rb
|
86
106
|
- lib/rack/contrib/post_body_content_type_parser.rb
|
87
107
|
- lib/rack/contrib/proctitle.rb
|
88
108
|
- lib/rack/contrib/profiler.rb
|
@@ -135,18 +155,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
135
155
|
requirements:
|
136
156
|
- - ">="
|
137
157
|
- !ruby/object:Gem::Version
|
158
|
+
segments:
|
159
|
+
- 0
|
138
160
|
version: "0"
|
139
|
-
version:
|
140
161
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
162
|
requirements:
|
142
163
|
- - ">="
|
143
164
|
- !ruby/object:Gem::Version
|
165
|
+
segments:
|
166
|
+
- 0
|
144
167
|
version: "0"
|
145
|
-
version:
|
146
168
|
requirements: []
|
147
169
|
|
148
170
|
rubyforge_project:
|
149
|
-
rubygems_version: 1.3.
|
171
|
+
rubygems_version: 1.3.6
|
150
172
|
signing_key:
|
151
173
|
specification_version: 2
|
152
174
|
summary: This gem is the Devver fork of rack-contrib (http://github.com/rack/rack-contrib) so we can play around with new features we're building. You should not use this version and use the official rack-contrib gem instead.
|