traceview 3.1.0-java → 3.2.1-java
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 +4 -4
- data/.travis.yml +2 -2
- data/CHANGELOG.md +12 -0
- data/lib/traceview.rb +1 -0
- data/lib/traceview/api/profiling.rb +146 -0
- data/lib/traceview/api/util.rb +6 -5
- data/lib/traceview/base.rb +2 -3
- data/lib/traceview/config.rb +5 -5
- data/lib/traceview/legacy_method_profiling.rb +97 -0
- data/lib/traceview/method_profiling.rb +16 -88
- data/lib/traceview/support.rb +28 -6
- data/lib/traceview/version.rb +2 -2
- data/test/frameworks/rails4x_test.rb +3 -1
- data/test/minitest_helper.rb +11 -3
- data/test/profiling/{method_test.rb → legacy_method_profiling_test.rb} +0 -0
- data/test/profiling/method_profiling_test.rb +631 -0
- data/test/servers/rails4x_8140.rb +2 -3
- data/test/support/config_test.rb +6 -6
- metadata +8 -5
data/lib/traceview/support.rb
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
# All rights reserved.
|
3
3
|
|
4
4
|
require 'rbconfig'
|
5
|
+
require 'logger'
|
5
6
|
|
6
7
|
module TraceView
|
7
8
|
##
|
@@ -18,6 +19,9 @@ module TraceView
|
|
18
19
|
end
|
19
20
|
|
20
21
|
def self.support_report
|
22
|
+
@logger_level = TraceView.logger.level
|
23
|
+
TraceView.logger.level = ::Logger::DEBUG
|
24
|
+
|
21
25
|
TraceView.logger.warn "********************************************************"
|
22
26
|
TraceView.logger.warn "* BEGIN TraceView Support Report"
|
23
27
|
TraceView.logger.warn "* Please email the output of this report to traceviewsupport@appneta.com"
|
@@ -33,7 +37,7 @@ module TraceView
|
|
33
37
|
using_jruby = defined?(JRUBY_VERSION)
|
34
38
|
TraceView.logger.warn "Using JRuby?: #{yesno(using_jruby)}"
|
35
39
|
if using_jruby
|
36
|
-
TraceView.logger.warn "
|
40
|
+
TraceView.logger.warn "Joboe Agent Status: #{Java::ComTracelyticsAgent::Agent.getStatus}"
|
37
41
|
end
|
38
42
|
|
39
43
|
on_heroku = TraceView.heroku?
|
@@ -53,6 +57,7 @@ module TraceView
|
|
53
57
|
TraceView.logger.warn "Using Rails?: #{yesno(using_rails)}"
|
54
58
|
if using_rails
|
55
59
|
TraceView.logger.warn "TraceView::Rails loaded?: #{yesno(defined?(::TraceView::Rails))}"
|
60
|
+
TraceView.logger.warn "TraceView::Rack middleware loaded?: #{yesno(::Rails.configuration.middleware.include? TraceView::Rack)}"
|
56
61
|
end
|
57
62
|
|
58
63
|
using_sinatra = defined?(::Sinatra)
|
@@ -64,10 +69,25 @@ module TraceView
|
|
64
69
|
using_grape = defined?(::Grape)
|
65
70
|
TraceView.logger.warn "Using Grape?: #{yesno(using_grape)}"
|
66
71
|
|
72
|
+
TraceView.logger.warn "********************************************************"
|
73
|
+
TraceView.logger.warn "* ActiveRecord Adapter"
|
74
|
+
TraceView.logger.warn "********************************************************"
|
75
|
+
if defined?(::ActiveRecord)
|
76
|
+
if defined?(::ActiveRecord::Base.connection.adapter_name)
|
77
|
+
TraceView.logger.warn "ActiveRecord adapter: #{::ActiveRecord::Base.connection.adapter_name}"
|
78
|
+
end
|
79
|
+
else
|
80
|
+
TraceView.logger.warn "No ActiveRecord"
|
81
|
+
end
|
82
|
+
|
67
83
|
TraceView.logger.warn "********************************************************"
|
68
84
|
TraceView.logger.warn "* TraceView Libraries"
|
69
85
|
TraceView.logger.warn "********************************************************"
|
70
|
-
files =
|
86
|
+
files = []
|
87
|
+
['/usr/lib/liboboe*', '/usr/lib64/liboboe*'].each do |d|
|
88
|
+
files = Dir.glob(d)
|
89
|
+
break if !files.empty?
|
90
|
+
end
|
71
91
|
if files.empty?
|
72
92
|
TraceView.logger.warn "Error: No liboboe libs!"
|
73
93
|
else
|
@@ -86,9 +106,9 @@ module TraceView
|
|
86
106
|
TraceView.logger.warn "********************************************************"
|
87
107
|
TraceView.logger.warn "* OS, Platform + Env"
|
88
108
|
TraceView.logger.warn "********************************************************"
|
89
|
-
TraceView.logger.warn RbConfig::CONFIG['host_os']
|
90
|
-
TraceView.logger.warn RbConfig::CONFIG['sitearch']
|
91
|
-
TraceView.logger.warn RbConfig::CONFIG['arch']
|
109
|
+
TraceView.logger.warn "host_os: " + RbConfig::CONFIG['host_os']
|
110
|
+
TraceView.logger.warn "sitearch: " + RbConfig::CONFIG['sitearch']
|
111
|
+
TraceView.logger.warn "arch: " + RbConfig::CONFIG['arch']
|
92
112
|
TraceView.logger.warn RUBY_PLATFORM
|
93
113
|
TraceView.logger.warn "RACK_ENV: #{ENV['RACK_ENV']}"
|
94
114
|
TraceView.logger.warn "RAILS_ENV: #{ENV['RAILS_ENV']}" if using_rails
|
@@ -106,8 +126,10 @@ module TraceView
|
|
106
126
|
TraceView.logger.warn "* Support Email: traceviewsupport@appneta.com"
|
107
127
|
TraceView.logger.warn "* Support Portal: https://support.tv.appneta.com"
|
108
128
|
TraceView.logger.warn "* Freenode IRC: #appneta"
|
109
|
-
TraceView.logger.warn "* Github: https://github.com/appneta/
|
129
|
+
TraceView.logger.warn "* Github: https://github.com/appneta/oboe-ruby"
|
110
130
|
TraceView.logger.warn "********************************************************"
|
131
|
+
|
132
|
+
TraceView.logger.level = @logger_level
|
111
133
|
nil
|
112
134
|
end
|
113
135
|
end
|
data/lib/traceview/version.rb
CHANGED
@@ -71,8 +71,10 @@ if defined?(::Rails)
|
|
71
71
|
traces[2]['Label'].must_equal "profile_entry"
|
72
72
|
traces[2]['Language'].must_equal "ruby"
|
73
73
|
traces[2]['ProfileName'].must_equal "world"
|
74
|
-
traces[2]['
|
74
|
+
traces[2]['MethodName'].must_equal "world"
|
75
75
|
traces[2]['Class'].must_equal "FerroController"
|
76
|
+
traces[2]['Controller'].must_equal "FerroController"
|
77
|
+
traces[2]['Action'].must_equal "world"
|
76
78
|
|
77
79
|
traces[3]['Label'].must_equal "profile_exit"
|
78
80
|
traces[3]['Language'].must_equal "ruby"
|
data/test/minitest_helper.rb
CHANGED
@@ -9,6 +9,11 @@ require "minitest/reporters"
|
|
9
9
|
require "minitest/debugger" if ENV['DEBUG']
|
10
10
|
require "sinatra"
|
11
11
|
|
12
|
+
require "minitest/hell"
|
13
|
+
class Minitest::Test
|
14
|
+
# parallelize_me!
|
15
|
+
end
|
16
|
+
|
12
17
|
ENV["RACK_ENV"] = "test"
|
13
18
|
ENV["TRACEVIEW_GEM_TEST"] = "true"
|
14
19
|
ENV["TRACEVIEW_GEM_VERBOSE"] = "true"
|
@@ -103,8 +108,8 @@ end
|
|
103
108
|
#
|
104
109
|
def validate_event_keys(event, kvs)
|
105
110
|
kvs.each do |k, v|
|
106
|
-
event.
|
107
|
-
event[k]
|
111
|
+
assert_equal true, event.key?(k), "#{k} is missing"
|
112
|
+
assert event[k] == v, "#{k} != #{v}"
|
108
113
|
end
|
109
114
|
end
|
110
115
|
|
@@ -137,7 +142,10 @@ end
|
|
137
142
|
def valid_edges?(traces)
|
138
143
|
traces.reverse.each do |t|
|
139
144
|
if t.key?("Edge")
|
140
|
-
|
145
|
+
unless has_edge?(t["Edge"], traces)
|
146
|
+
require 'byebug'; debugger
|
147
|
+
return false
|
148
|
+
end
|
141
149
|
end
|
142
150
|
end
|
143
151
|
true
|
File without changes
|
@@ -0,0 +1,631 @@
|
|
1
|
+
# Copyright (c) 2015 AppNeta, Inc.
|
2
|
+
# All rights reserved.
|
3
|
+
require 'minitest_helper'
|
4
|
+
|
5
|
+
# TV Method profiling only supports Ruby 1.9.3 or greater. For earlier Ruby versions
|
6
|
+
# see the legacy method profiling in lib/traceview/legacy_method_profiling.rb.
|
7
|
+
if RUBY_VERSION >= '1.9.3'
|
8
|
+
describe "TraceViewMethodProfiling" do
|
9
|
+
before do
|
10
|
+
clear_all_traces
|
11
|
+
# Conditionally Undefine TestWorker
|
12
|
+
# http://stackoverflow.com/questions/11503558/how-to-undefine-class-in-ruby
|
13
|
+
Object.send(:remove_const, :TestKlass) if defined?(TestKlass)
|
14
|
+
Object.send(:remove_const, :TestModule) if defined?(TestModule)
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should be loaded, defined and ready' do
|
18
|
+
defined?(::TraceView::MethodProfiling).wont_match nil
|
19
|
+
assert_equal true, TraceView::API.respond_to?(:profile_method), "has profile_method method"
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'should return false for bad arguments' do
|
23
|
+
class TestKlass
|
24
|
+
def do_work
|
25
|
+
return 687
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Bad first param
|
30
|
+
rv = TraceView::API.profile_method('blah', :do_work)
|
31
|
+
assert_equal false, rv, "Return value must be false for bad args"
|
32
|
+
|
33
|
+
# Bad first param
|
34
|
+
rv = TraceView::API.profile_method(TestKlass, 52)
|
35
|
+
assert_equal false, rv, "Return value must be false for bad args"
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'should profile class instance methods' do
|
39
|
+
class TestKlass
|
40
|
+
def do_work
|
41
|
+
return 687
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
result = TraceView::API.profile_method(TestKlass, :do_work)
|
46
|
+
assert_equal true, result, "profile_method return value must be true"
|
47
|
+
|
48
|
+
result = nil
|
49
|
+
|
50
|
+
::TraceView::API.start_trace('method_profiling', '', {}) do
|
51
|
+
# Call the profiled class method
|
52
|
+
result = TestKlass.new.do_work
|
53
|
+
end
|
54
|
+
|
55
|
+
traces = get_all_traces
|
56
|
+
traces.count.must_equal 4
|
57
|
+
assert valid_edges?(traces), "Trace edge validation"
|
58
|
+
|
59
|
+
validate_outer_layers(traces, 'method_profiling')
|
60
|
+
|
61
|
+
result.must_equal 687
|
62
|
+
|
63
|
+
kvs = {}
|
64
|
+
kvs["Label"] = 'profile_entry'
|
65
|
+
kvs["Language"] = "ruby"
|
66
|
+
kvs["ProfileName"] = "do_work"
|
67
|
+
kvs["Class"] = "TestKlass"
|
68
|
+
kvs["MethodName"] = "do_work"
|
69
|
+
|
70
|
+
validate_event_keys(traces[1], kvs)
|
71
|
+
|
72
|
+
traces[1].key?("Layer").must_equal false
|
73
|
+
traces[1].key?("Module").must_equal false
|
74
|
+
traces[1].key?("File").must_equal true
|
75
|
+
traces[1].key?("LineNumber").must_equal true
|
76
|
+
|
77
|
+
kvs.clear
|
78
|
+
kvs["Label"] = "profile_exit"
|
79
|
+
kvs["Language"] = "ruby"
|
80
|
+
kvs["ProfileName"] = "do_work"
|
81
|
+
|
82
|
+
validate_event_keys(traces[2], kvs)
|
83
|
+
traces[2].key?("Layer").must_equal false
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'should not double profile already profiled methods' do
|
87
|
+
class TestKlass
|
88
|
+
def do_work
|
89
|
+
return 687
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Attempt to double profile
|
94
|
+
rv = TraceView::API.profile_method(TestKlass, :do_work)
|
95
|
+
assert_equal true, rv, "Return value must be true"
|
96
|
+
|
97
|
+
rv = TraceView::API.profile_method(TestKlass, :do_work)
|
98
|
+
assert_equal false, rv, "Return value must be false"
|
99
|
+
|
100
|
+
with_tv = TestKlass.instance_methods.select{ |m| m == :do_work_with_traceview }
|
101
|
+
assert_equal with_tv.count, 1, ":do_work_with_traceview method count"
|
102
|
+
|
103
|
+
without_tv = TestKlass.instance_methods.select{ |m| m == :do_work_without_traceview }
|
104
|
+
assert_equal without_tv.count, 1, ":do_work_without_traceview method count"
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'should error out for non-existent methods' do
|
108
|
+
class TestKlass
|
109
|
+
def do_work
|
110
|
+
return 687
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
rv = TraceView::API.profile_method(TestKlass, :does_not_exist)
|
115
|
+
assert_equal false, rv, "Return value must be false"
|
116
|
+
|
117
|
+
with_tv = TestKlass.instance_methods.select{ |m| m == :does_not_exit_with_traceview }
|
118
|
+
assert_equal with_tv.count, 0, ":does_not_exit_with_traceview method count"
|
119
|
+
|
120
|
+
without_tv = TestKlass.instance_methods.select{ |m| m == :does_not_exit_without_traceview }
|
121
|
+
assert_equal without_tv.count, 0, ":does_not_exit_without_traceview method count"
|
122
|
+
end
|
123
|
+
|
124
|
+
it 'should trace class singleton methods' do
|
125
|
+
class TestKlass
|
126
|
+
def self.do_work
|
127
|
+
return 687
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
result = TraceView::API.profile_method(TestKlass, :do_work)
|
132
|
+
assert_equal true, result, "profile_method return value must be true"
|
133
|
+
|
134
|
+
::TraceView::API.start_trace('method_profiling', '', {}) do
|
135
|
+
result = TestKlass.do_work
|
136
|
+
end
|
137
|
+
|
138
|
+
traces = get_all_traces
|
139
|
+
traces.count.must_equal 4
|
140
|
+
assert valid_edges?(traces), "Trace edge validation"
|
141
|
+
|
142
|
+
validate_outer_layers(traces, 'method_profiling')
|
143
|
+
|
144
|
+
result.must_equal 687
|
145
|
+
|
146
|
+
kvs = {}
|
147
|
+
kvs["Label"] = 'profile_entry'
|
148
|
+
kvs["Language"] = "ruby"
|
149
|
+
kvs["ProfileName"] = "do_work"
|
150
|
+
kvs["Class"] = "TestKlass"
|
151
|
+
kvs["MethodName"] = "do_work"
|
152
|
+
|
153
|
+
validate_event_keys(traces[1], kvs)
|
154
|
+
|
155
|
+
traces[1].key?("Layer").must_equal false
|
156
|
+
traces[1].key?("Module").must_equal false
|
157
|
+
traces[1].key?("File").must_equal true
|
158
|
+
traces[1].key?("LineNumber").must_equal true
|
159
|
+
|
160
|
+
kvs.clear
|
161
|
+
kvs["Label"] = "profile_exit"
|
162
|
+
kvs["Language"] = "ruby"
|
163
|
+
kvs["ProfileName"] = "do_work"
|
164
|
+
|
165
|
+
validate_event_keys(traces[2], kvs)
|
166
|
+
traces[2].key?("Layer").must_equal false
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'should trace class private instance methods' do
|
170
|
+
class TestKlass
|
171
|
+
private
|
172
|
+
def do_work_privately
|
173
|
+
return 687
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
result = TraceView::API.profile_method(TestKlass, :do_work_privately)
|
178
|
+
assert_equal true, result, "profile_method return value must be true"
|
179
|
+
|
180
|
+
result = nil
|
181
|
+
|
182
|
+
::TraceView::API.start_trace('method_profiling', '', {}) do
|
183
|
+
# Call the profiled class method
|
184
|
+
result = TestKlass.new.do_work_privately
|
185
|
+
end
|
186
|
+
|
187
|
+
traces = get_all_traces
|
188
|
+
traces.count.must_equal 4
|
189
|
+
assert valid_edges?(traces), "Trace edge validation"
|
190
|
+
|
191
|
+
validate_outer_layers(traces, 'method_profiling')
|
192
|
+
|
193
|
+
result.must_equal 687
|
194
|
+
|
195
|
+
kvs = {}
|
196
|
+
kvs["Label"] = 'profile_entry'
|
197
|
+
kvs["Language"] = "ruby"
|
198
|
+
kvs["ProfileName"] = "do_work_privately"
|
199
|
+
kvs["Class"] = "TestKlass"
|
200
|
+
kvs["MethodName"] = "do_work_privately"
|
201
|
+
|
202
|
+
validate_event_keys(traces[1], kvs)
|
203
|
+
|
204
|
+
traces[1].key?("Layer").must_equal false
|
205
|
+
traces[1].key?("Module").must_equal false
|
206
|
+
traces[1].key?("File").must_equal true
|
207
|
+
traces[1].key?("LineNumber").must_equal true
|
208
|
+
|
209
|
+
kvs.clear
|
210
|
+
kvs["Label"] = "profile_exit"
|
211
|
+
kvs["Language"] = "ruby"
|
212
|
+
kvs["ProfileName"] = "do_work_privately"
|
213
|
+
|
214
|
+
validate_event_keys(traces[2], kvs)
|
215
|
+
traces[2].key?("Layer").must_equal false
|
216
|
+
end
|
217
|
+
|
218
|
+
it 'should trace class private singleton methods' do
|
219
|
+
class TestKlass
|
220
|
+
private
|
221
|
+
def self.do_work_privately
|
222
|
+
return 687
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
result = TraceView::API.profile_method(TestKlass, :do_work_privately)
|
227
|
+
assert_equal true, result, "profile_method return value must be true"
|
228
|
+
|
229
|
+
::TraceView::API.start_trace('method_profiling', '', {}) do
|
230
|
+
result = TestKlass.do_work_privately
|
231
|
+
end
|
232
|
+
|
233
|
+
traces = get_all_traces
|
234
|
+
traces.count.must_equal 4
|
235
|
+
assert valid_edges?(traces), "Trace edge validation"
|
236
|
+
|
237
|
+
validate_outer_layers(traces, 'method_profiling')
|
238
|
+
|
239
|
+
result.must_equal 687
|
240
|
+
|
241
|
+
kvs = {}
|
242
|
+
kvs["Label"] = 'profile_entry'
|
243
|
+
kvs["Language"] = "ruby"
|
244
|
+
kvs["ProfileName"] = "do_work_privately"
|
245
|
+
kvs["Class"] = "TestKlass"
|
246
|
+
kvs["MethodName"] = "do_work_privately"
|
247
|
+
|
248
|
+
validate_event_keys(traces[1], kvs)
|
249
|
+
|
250
|
+
traces[1].key?("Layer").must_equal false
|
251
|
+
traces[1].key?("Module").must_equal false
|
252
|
+
traces[1].key?("File").must_equal true
|
253
|
+
traces[1].key?("LineNumber").must_equal true
|
254
|
+
|
255
|
+
kvs.clear
|
256
|
+
kvs["Label"] = "profile_exit"
|
257
|
+
kvs["Language"] = "ruby"
|
258
|
+
kvs["ProfileName"] = "do_work_privately"
|
259
|
+
|
260
|
+
validate_event_keys(traces[2], kvs)
|
261
|
+
traces[2].key?("Layer").must_equal false
|
262
|
+
end
|
263
|
+
|
264
|
+
it 'should trace module singleton methods' do
|
265
|
+
module TestModule
|
266
|
+
def self.do_work
|
267
|
+
return 687
|
268
|
+
end
|
269
|
+
end
|
270
|
+
|
271
|
+
result = TraceView::API.profile_method(TestModule, :do_work)
|
272
|
+
assert_equal true, result, "profile_method return value must be true"
|
273
|
+
|
274
|
+
::TraceView::API.start_trace('method_profiling', '', {}) do
|
275
|
+
result = TestModule.do_work
|
276
|
+
end
|
277
|
+
|
278
|
+
traces = get_all_traces
|
279
|
+
traces.count.must_equal 4
|
280
|
+
assert valid_edges?(traces), "Trace edge validation"
|
281
|
+
|
282
|
+
validate_outer_layers(traces, 'method_profiling')
|
283
|
+
|
284
|
+
result.must_equal 687
|
285
|
+
|
286
|
+
kvs = {}
|
287
|
+
kvs["Label"] = 'profile_entry'
|
288
|
+
kvs["Language"] = "ruby"
|
289
|
+
kvs["ProfileName"] = "do_work"
|
290
|
+
kvs["Module"] = "TestModule"
|
291
|
+
kvs["MethodName"] = "do_work"
|
292
|
+
|
293
|
+
validate_event_keys(traces[1], kvs)
|
294
|
+
|
295
|
+
traces[1].key?("Layer").must_equal false
|
296
|
+
traces[1].key?("Class").must_equal false
|
297
|
+
traces[1].key?("File").must_equal true
|
298
|
+
traces[1].key?("LineNumber").must_equal true
|
299
|
+
|
300
|
+
kvs.clear
|
301
|
+
kvs["Label"] = "profile_exit"
|
302
|
+
kvs["Language"] = "ruby"
|
303
|
+
kvs["ProfileName"] = "do_work"
|
304
|
+
|
305
|
+
validate_event_keys(traces[2], kvs)
|
306
|
+
traces[2].key?("Layer").must_equal false
|
307
|
+
end
|
308
|
+
|
309
|
+
it 'should trace module instance methods' do
|
310
|
+
module TestModule
|
311
|
+
def do_work
|
312
|
+
return 687
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
# Profile the module before including in a class
|
317
|
+
result = TraceView::API.profile_method(TestModule, :do_work)
|
318
|
+
assert_equal true, result, "profile_method return value must be true"
|
319
|
+
|
320
|
+
class TestKlass
|
321
|
+
include TestModule
|
322
|
+
end
|
323
|
+
|
324
|
+
::TraceView::API.start_trace('method_profiling', '', {}) do
|
325
|
+
result = TestKlass.new.do_work
|
326
|
+
end
|
327
|
+
|
328
|
+
traces = get_all_traces
|
329
|
+
traces.count.must_equal 4
|
330
|
+
assert valid_edges?(traces), "Trace edge validation"
|
331
|
+
|
332
|
+
validate_outer_layers(traces, 'method_profiling')
|
333
|
+
|
334
|
+
result.must_equal 687
|
335
|
+
|
336
|
+
kvs = {}
|
337
|
+
kvs["Label"] = 'profile_entry'
|
338
|
+
kvs["Language"] = "ruby"
|
339
|
+
kvs["ProfileName"] = "do_work"
|
340
|
+
kvs["Module"] = "TestModule"
|
341
|
+
kvs["MethodName"] = "do_work"
|
342
|
+
|
343
|
+
validate_event_keys(traces[1], kvs)
|
344
|
+
|
345
|
+
traces[1].key?("Layer").must_equal false
|
346
|
+
traces[1].key?("Class").must_equal false
|
347
|
+
traces[1].key?("File").must_equal true
|
348
|
+
traces[1].key?("LineNumber").must_equal true
|
349
|
+
|
350
|
+
kvs.clear
|
351
|
+
kvs["Label"] = "profile_exit"
|
352
|
+
kvs["Language"] = "ruby"
|
353
|
+
kvs["ProfileName"] = "do_work"
|
354
|
+
|
355
|
+
validate_event_keys(traces[2], kvs)
|
356
|
+
traces[2].key?("Layer").must_equal false
|
357
|
+
end
|
358
|
+
|
359
|
+
it 'should profile methods that use blocks' do
|
360
|
+
class TestKlass
|
361
|
+
def self.do_work(&block)
|
362
|
+
yield
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
result = TraceView::API.profile_method(TestKlass, :do_work)
|
367
|
+
assert_equal true, result, "profile_method return value must be true"
|
368
|
+
|
369
|
+
::TraceView::API.start_trace('method_profiling', '', {}) do
|
370
|
+
result = TestKlass.do_work do
|
371
|
+
787
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
traces = get_all_traces
|
376
|
+
traces.count.must_equal 4
|
377
|
+
assert valid_edges?(traces), "Trace edge validation"
|
378
|
+
|
379
|
+
validate_outer_layers(traces, 'method_profiling')
|
380
|
+
|
381
|
+
result.must_equal 787
|
382
|
+
|
383
|
+
kvs = {}
|
384
|
+
kvs["Label"] = 'profile_entry'
|
385
|
+
kvs["Language"] = "ruby"
|
386
|
+
kvs["ProfileName"] = "do_work"
|
387
|
+
kvs["Class"] = "TestKlass"
|
388
|
+
kvs["MethodName"] = "do_work"
|
389
|
+
|
390
|
+
validate_event_keys(traces[1], kvs)
|
391
|
+
|
392
|
+
traces[1].key?("Layer").must_equal false
|
393
|
+
traces[1].key?("Module").must_equal false
|
394
|
+
traces[1].key?("File").must_equal true
|
395
|
+
traces[1].key?("LineNumber").must_equal true
|
396
|
+
|
397
|
+
kvs.clear
|
398
|
+
kvs["Label"] = "profile_exit"
|
399
|
+
kvs["Language"] = "ruby"
|
400
|
+
kvs["ProfileName"] = "do_work"
|
401
|
+
|
402
|
+
validate_event_keys(traces[2], kvs)
|
403
|
+
traces[2].key?("Layer").must_equal false
|
404
|
+
end
|
405
|
+
|
406
|
+
it 'should not store arguments and return value by default' do
|
407
|
+
class TestKlass
|
408
|
+
def do_work(blah = {})
|
409
|
+
return 687
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
result = TraceView::API.profile_method(TestKlass, :do_work)
|
414
|
+
assert_equal true, result, "profile_method return value must be true"
|
415
|
+
|
416
|
+
result = nil
|
417
|
+
|
418
|
+
::TraceView::API.start_trace('method_profiling', '', {}) do
|
419
|
+
# Call the profiled class method
|
420
|
+
result = TestKlass.new.do_work(:ok => :blue)
|
421
|
+
end
|
422
|
+
|
423
|
+
traces = get_all_traces
|
424
|
+
traces.count.must_equal 4
|
425
|
+
assert valid_edges?(traces), "Trace edge validation"
|
426
|
+
|
427
|
+
validate_outer_layers(traces, 'method_profiling')
|
428
|
+
|
429
|
+
result.must_equal 687
|
430
|
+
|
431
|
+
kvs = {}
|
432
|
+
kvs["Label"] = 'profile_entry'
|
433
|
+
kvs["Language"] = "ruby"
|
434
|
+
kvs["ProfileName"] = "do_work"
|
435
|
+
kvs["Class"] = "TestKlass"
|
436
|
+
kvs["MethodName"] = "do_work"
|
437
|
+
|
438
|
+
validate_event_keys(traces[1], kvs)
|
439
|
+
|
440
|
+
traces[1].key?("Layer").must_equal false
|
441
|
+
traces[1].key?("Module").must_equal false
|
442
|
+
traces[1].key?("File").must_equal true
|
443
|
+
traces[1].key?("LineNumber").must_equal true
|
444
|
+
|
445
|
+
kvs.clear
|
446
|
+
kvs["Label"] = "profile_exit"
|
447
|
+
kvs["Language"] = "ruby"
|
448
|
+
kvs["ProfileName"] = "do_work"
|
449
|
+
|
450
|
+
validate_event_keys(traces[2], kvs)
|
451
|
+
traces[2].key?("Layer").must_equal false
|
452
|
+
|
453
|
+
traces[2].key?("Arguments").must_equal false
|
454
|
+
traces[2].key?("ReturnValue").must_equal false
|
455
|
+
end
|
456
|
+
|
457
|
+
it 'should store arguments and return value when asked' do
|
458
|
+
class TestKlass
|
459
|
+
def do_work(blah = {})
|
460
|
+
return 687
|
461
|
+
end
|
462
|
+
end
|
463
|
+
|
464
|
+
opts = {}
|
465
|
+
opts[:arguments] = true
|
466
|
+
opts[:result] = true
|
467
|
+
|
468
|
+
result = TraceView::API.profile_method(TestKlass, :do_work, opts)
|
469
|
+
assert_equal true, result, "profile_method return value must be true"
|
470
|
+
|
471
|
+
result = nil
|
472
|
+
|
473
|
+
::TraceView::API.start_trace('method_profiling', '', {}) do
|
474
|
+
# Call the profiled class method
|
475
|
+
result = TestKlass.new.do_work(:ok => :blue)
|
476
|
+
end
|
477
|
+
|
478
|
+
traces = get_all_traces
|
479
|
+
traces.count.must_equal 4
|
480
|
+
assert valid_edges?(traces), "Trace edge validation"
|
481
|
+
|
482
|
+
validate_outer_layers(traces, 'method_profiling')
|
483
|
+
|
484
|
+
result.must_equal 687
|
485
|
+
|
486
|
+
kvs = {}
|
487
|
+
kvs["Label"] = 'profile_entry'
|
488
|
+
kvs["Language"] = "ruby"
|
489
|
+
kvs["ProfileName"] = "do_work"
|
490
|
+
kvs["Class"] = "TestKlass"
|
491
|
+
kvs["MethodName"] = "do_work"
|
492
|
+
|
493
|
+
validate_event_keys(traces[1], kvs)
|
494
|
+
|
495
|
+
traces[1].key?("Layer").must_equal false
|
496
|
+
traces[1].key?("Module").must_equal false
|
497
|
+
traces[1].key?("File").must_equal true
|
498
|
+
traces[1].key?("LineNumber").must_equal true
|
499
|
+
|
500
|
+
kvs.clear
|
501
|
+
kvs["Label"] = "profile_exit"
|
502
|
+
kvs["Language"] = "ruby"
|
503
|
+
kvs["ProfileName"] = "do_work"
|
504
|
+
|
505
|
+
validate_event_keys(traces[2], kvs)
|
506
|
+
traces[2].key?("Layer").must_equal false
|
507
|
+
|
508
|
+
traces[2].key?("Arguments").must_equal true
|
509
|
+
traces[2]["Arguments"].must_equal "[{:ok=>:blue}]"
|
510
|
+
|
511
|
+
traces[2].key?("ReturnValue").must_equal true
|
512
|
+
traces[2]["ReturnValue"].must_equal 687
|
513
|
+
end
|
514
|
+
|
515
|
+
it 'should not report backtraces by default' do
|
516
|
+
class TestKlass
|
517
|
+
def do_work(blah = {})
|
518
|
+
return 687
|
519
|
+
end
|
520
|
+
end
|
521
|
+
|
522
|
+
result = TraceView::API.profile_method(TestKlass, :do_work)
|
523
|
+
assert_equal true, result, "profile_method return value must be true"
|
524
|
+
|
525
|
+
result = nil
|
526
|
+
|
527
|
+
::TraceView::API.start_trace('method_profiling', '', {}) do
|
528
|
+
# Call the profiled class method
|
529
|
+
result = TestKlass.new.do_work(:ok => :blue)
|
530
|
+
end
|
531
|
+
|
532
|
+
traces = get_all_traces
|
533
|
+
traces.count.must_equal 4
|
534
|
+
assert valid_edges?(traces), "Trace edge validation"
|
535
|
+
|
536
|
+
validate_outer_layers(traces, 'method_profiling')
|
537
|
+
|
538
|
+
result.must_equal 687
|
539
|
+
|
540
|
+
kvs = {}
|
541
|
+
kvs["Label"] = 'profile_entry'
|
542
|
+
kvs["Language"] = "ruby"
|
543
|
+
kvs["ProfileName"] = "do_work"
|
544
|
+
kvs["Class"] = "TestKlass"
|
545
|
+
kvs["MethodName"] = "do_work"
|
546
|
+
|
547
|
+
validate_event_keys(traces[1], kvs)
|
548
|
+
|
549
|
+
traces.each { |t|
|
550
|
+
t.key?("Backtrace").must_equal false, "shoudn't have backtrace"
|
551
|
+
}
|
552
|
+
end
|
553
|
+
|
554
|
+
it 'should report backtraces when requested' do
|
555
|
+
class TestKlass
|
556
|
+
def do_work(blah = {})
|
557
|
+
return 687
|
558
|
+
end
|
559
|
+
end
|
560
|
+
|
561
|
+
opts = { :backtrace => true }
|
562
|
+
result = TraceView::API.profile_method(TestKlass, :do_work, opts)
|
563
|
+
assert_equal true, result, "profile_method return value must be true"
|
564
|
+
|
565
|
+
result = nil
|
566
|
+
|
567
|
+
::TraceView::API.start_trace('method_profiling', '', {}) do
|
568
|
+
# Call the profiled class method
|
569
|
+
result = TestKlass.new.do_work(:ok => :blue)
|
570
|
+
end
|
571
|
+
|
572
|
+
traces = get_all_traces
|
573
|
+
traces.count.must_equal 4
|
574
|
+
assert valid_edges?(traces), "Trace edge validation"
|
575
|
+
|
576
|
+
validate_outer_layers(traces, 'method_profiling')
|
577
|
+
|
578
|
+
result.must_equal 687
|
579
|
+
|
580
|
+
kvs = {}
|
581
|
+
kvs["Label"] = 'profile_entry'
|
582
|
+
kvs["Language"] = "ruby"
|
583
|
+
kvs["ProfileName"] = "do_work"
|
584
|
+
kvs["Class"] = "TestKlass"
|
585
|
+
kvs["MethodName"] = "do_work"
|
586
|
+
|
587
|
+
validate_event_keys(traces[1], kvs)
|
588
|
+
|
589
|
+
traces[1].key?("Backtrace").must_equal true, "should report a backtrace"
|
590
|
+
end
|
591
|
+
|
592
|
+
it 'should report extra KVs when requested' do
|
593
|
+
class TestKlass
|
594
|
+
def do_work(blah = {})
|
595
|
+
return 687
|
596
|
+
end
|
597
|
+
end
|
598
|
+
|
599
|
+
opts = { :backtrace => true }
|
600
|
+
result = TraceView::API.profile_method(TestKlass, :do_work, opts, :another => "value")
|
601
|
+
assert_equal true, result, "profile_method return value must be true"
|
602
|
+
|
603
|
+
result = nil
|
604
|
+
|
605
|
+
::TraceView::API.start_trace('method_profiling', '', {}) do
|
606
|
+
# Call the profiled class method
|
607
|
+
result = TestKlass.new.do_work(:ok => :blue)
|
608
|
+
end
|
609
|
+
|
610
|
+
traces = get_all_traces
|
611
|
+
traces.count.must_equal 4
|
612
|
+
assert valid_edges?(traces), "Trace edge validation"
|
613
|
+
|
614
|
+
validate_outer_layers(traces, 'method_profiling')
|
615
|
+
|
616
|
+
result.must_equal 687
|
617
|
+
|
618
|
+
kvs = {}
|
619
|
+
kvs["Label"] = 'profile_entry'
|
620
|
+
kvs["Language"] = "ruby"
|
621
|
+
kvs["ProfileName"] = "do_work"
|
622
|
+
kvs["Class"] = "TestKlass"
|
623
|
+
kvs["MethodName"] = "do_work"
|
624
|
+
kvs["another"] = "value"
|
625
|
+
|
626
|
+
validate_event_keys(traces[1], kvs)
|
627
|
+
|
628
|
+
traces[1].key?("Backtrace").must_equal true, "should report a backtrace"
|
629
|
+
end
|
630
|
+
end
|
631
|
+
end
|