newrelic_rpm 3.4.1 → 3.4.2.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of newrelic_rpm might be problematic. Click here for more details.
- data/CHANGELOG +7 -0
- data/ReleaseNotes.md +638 -0
- data/lib/new_relic/agent/agent.rb +44 -56
- data/lib/new_relic/agent/beacon_configuration.rb +1 -1
- data/lib/new_relic/agent/browser_monitoring.rb +80 -42
- data/lib/new_relic/agent/configuration/defaults.rb +75 -0
- data/lib/new_relic/agent/configuration/environment_source.rb +42 -0
- data/lib/new_relic/agent/configuration/manager.rb +100 -0
- data/lib/new_relic/agent/configuration/server_source.rb +24 -0
- data/lib/new_relic/agent/configuration/yaml_source.rb +61 -0
- data/lib/new_relic/agent/configuration.rb +48 -0
- data/lib/new_relic/agent/error_collector.rb +10 -14
- data/lib/new_relic/agent/instrumentation/active_record.rb +1 -5
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +20 -4
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +1 -1
- data/lib/new_relic/agent/instrumentation/memcache.rb +2 -2
- data/lib/new_relic/agent/instrumentation/metric_frame.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +3 -3
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +2 -2
- data/lib/new_relic/agent/instrumentation/resque.rb +1 -1
- data/lib/new_relic/agent/method_tracer.rb +1 -1
- data/lib/new_relic/agent/new_relic_service.rb +18 -9
- data/lib/new_relic/agent/pipe_channel_manager.rb +5 -6
- data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +2 -5
- data/lib/new_relic/agent/sql_sampler.rb +11 -35
- data/lib/new_relic/agent/stats_engine/transactions.rb +2 -2
- data/lib/new_relic/agent/transaction_info.rb +24 -4
- data/lib/new_relic/agent/transaction_sample_builder.rb +2 -3
- data/lib/new_relic/agent/transaction_sampler.rb +9 -16
- data/lib/new_relic/agent.rb +4 -1
- data/lib/new_relic/collection_helper.rb +1 -1
- data/lib/new_relic/commands/deployments.rb +5 -3
- data/lib/new_relic/control/class_methods.rb +2 -3
- data/lib/new_relic/control/frameworks/rails.rb +8 -8
- data/lib/new_relic/control/frameworks/ruby.rb +2 -2
- data/lib/new_relic/control/instance_methods.rb +26 -32
- data/lib/new_relic/control/logging_methods.rb +5 -23
- data/lib/new_relic/control/server_methods.rb +11 -18
- data/lib/new_relic/control.rb +0 -1
- data/lib/new_relic/delayed_job_injection.rb +1 -1
- data/lib/new_relic/language_support.rb +8 -0
- data/lib/new_relic/noticed_error.rb +1 -1
- data/lib/new_relic/rack/browser_monitoring.rb +18 -6
- data/lib/new_relic/version.rb +2 -2
- data/newrelic.yml +0 -4
- data/newrelic_rpm.gemspec +16 -6
- data/test/config/newrelic.yml +3 -2
- data/test/new_relic/agent/agent/connect_test.rb +88 -83
- data/test/new_relic/agent/agent/start_test.rb +75 -80
- data/test/new_relic/agent/agent/start_worker_thread_test.rb +18 -18
- data/test/new_relic/agent/beacon_configuration_test.rb +13 -11
- data/test/new_relic/agent/browser_monitoring_test.rb +69 -14
- data/test/new_relic/agent/configuration/environment_source_test.rb +58 -0
- data/test/new_relic/agent/configuration/manager_test.rb +120 -0
- data/test/new_relic/agent/configuration/server_source_test.rb +28 -0
- data/test/new_relic/agent/configuration/yaml_source_test.rb +56 -0
- data/test/new_relic/agent/error_collector/notice_error_test.rb +63 -50
- data/test/new_relic/agent/error_collector_test.rb +10 -12
- data/test/new_relic/agent/new_relic_service_test.rb +11 -3
- data/test/new_relic/agent/pipe_channel_manager_test.rb +19 -16
- data/test/new_relic/agent/rpm_agent_test.rb +21 -19
- data/test/new_relic/agent/sql_sampler_test.rb +55 -56
- data/test/new_relic/agent/transaction_info_test.rb +45 -4
- data/test/new_relic/agent/transaction_sampler_test.rb +48 -44
- data/test/new_relic/agent_test.rb +68 -41
- data/test/new_relic/collection_helper_test.rb +7 -8
- data/test/new_relic/command/deployments_test.rb +12 -1
- data/test/new_relic/control/frameworks/rails_test.rb +26 -0
- data/test/new_relic/control/logging_methods_test.rb +77 -52
- data/test/new_relic/control_test.rb +103 -126
- data/test/new_relic/local_environment_test.rb +4 -6
- data/test/new_relic/rack/browser_monitoring_test.rb +4 -4
- data/test/new_relic/rack/developer_mode_test.rb +13 -7
- data/test/new_relic/transaction_sample_test.rb +8 -2
- data/test/script/build_test_gem.sh +9 -3
- data/test/script/ci.sh +13 -3
- data/test/test_helper.rb +9 -2
- data/ui/helpers/developer_mode_helper.rb +2 -7
- metadata +26 -11
- data/lib/new_relic/control/configuration.rb +0 -206
- data/test/new_relic/control/configuration_test.rb +0 -77
@@ -57,47 +57,51 @@ class NewRelic::Agent::ErrorCollector::NoticeErrorTest < Test::Unit::TestCase
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def test_request_params_from_opts_positive
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
assert_equal({}, val, "should delete request_params key from hash")
|
60
|
+
with_config(:capture_params => true) do
|
61
|
+
val = {:request_params => 'foo'}
|
62
|
+
assert_equal('foo', request_params_from_opts(val))
|
63
|
+
assert_equal({}, val, "should delete request_params key from hash")
|
64
|
+
end
|
66
65
|
end
|
67
66
|
|
68
67
|
def test_request_params_from_opts_negative
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
assert_equal({}, val, "should delete request_params key from hash")
|
68
|
+
with_config(:capture_params => false) do
|
69
|
+
val = {:request_params => 'foo'}
|
70
|
+
assert_equal(nil, request_params_from_opts(val))
|
71
|
+
assert_equal({}, val, "should delete request_params key from hash")
|
72
|
+
end
|
75
73
|
end
|
76
74
|
|
77
75
|
def test_normalized_request_and_custom_params_base
|
78
76
|
self.expects(:normalize_params).with(nil).returns(nil)
|
79
77
|
self.expects(:normalize_params).with({}).returns({})
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
78
|
+
with_config(:capture_params => true) do
|
79
|
+
assert_equal({:request_params => nil, :custom_params => {}},
|
80
|
+
normalized_request_and_custom_params({}))
|
81
|
+
end
|
84
82
|
end
|
85
83
|
|
86
84
|
def test_extract_source_base
|
87
|
-
|
88
|
-
|
89
|
-
|
85
|
+
with_config(:'error_collector.capture_source' => true) do
|
86
|
+
error_collector = NewRelic::Agent::ErrorCollector.new
|
87
|
+
error_collector.expects(:sense_method).with(nil, 'source_extract')
|
88
|
+
assert_equal(nil, error_collector.extract_source(nil))
|
89
|
+
end
|
90
90
|
end
|
91
91
|
|
92
92
|
def test_extract_source_disabled
|
93
|
-
|
94
|
-
|
93
|
+
with_config(:'error_collector.capture_source' => false) do
|
94
|
+
error_collector = NewRelic::Agent::ErrorCollector.new
|
95
|
+
assert_equal(nil, error_collector.extract_source(mock('exception')))
|
96
|
+
end
|
95
97
|
end
|
96
98
|
|
97
99
|
def test_extract_source_with_source
|
98
|
-
|
99
|
-
|
100
|
-
|
100
|
+
with_config(:'error_collector.capture_source' => true) do
|
101
|
+
error_collector = NewRelic::Agent::ErrorCollector.new
|
102
|
+
error_collector.expects(:sense_method).with('happy', 'source_extract').returns('THE SOURCE')
|
103
|
+
assert_equal('THE SOURCE', error_collector.extract_source('happy'))
|
104
|
+
end
|
101
105
|
end
|
102
106
|
|
103
107
|
def test_extract_stack_trace
|
@@ -160,53 +164,56 @@ class NewRelic::Agent::ErrorCollector::NoticeErrorTest < Test::Unit::TestCase
|
|
160
164
|
|
161
165
|
def test_should_exit_notice_error_disabled
|
162
166
|
error = mocked_error
|
163
|
-
|
164
|
-
|
167
|
+
with_error_collector_config(:'error_collector.enabled' => false) do |error_collector|
|
168
|
+
assert error_collector.should_exit_notice_error?(error)
|
169
|
+
end
|
165
170
|
end
|
166
171
|
|
167
172
|
def test_should_exit_notice_error_nil
|
168
173
|
error = nil
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
174
|
+
with_error_collector_config(:'error_collector.enabled' => true) do |error_collector|
|
175
|
+
error_collector.expects(:error_is_ignored?).with(error).returns(false)
|
176
|
+
# we increment it for the case that someone calls
|
177
|
+
# NewRelic::Agent.notice_error(foo) # foo is nil
|
178
|
+
# (which is probably not a good idea but is the existing api)
|
179
|
+
error_collector.expects(:increment_error_count!)
|
180
|
+
assert error_collector.should_exit_notice_error?(error)
|
181
|
+
end
|
176
182
|
end
|
177
183
|
|
178
184
|
def test_should_exit_notice_error_positive
|
179
185
|
error = mocked_error
|
180
|
-
|
181
|
-
|
182
|
-
|
186
|
+
with_error_collector_config(:'error_collector.enabled' => true) do |error_collector|
|
187
|
+
error_collector.expects(:error_is_ignored?).with(error).returns(true)
|
188
|
+
assert error_collector.should_exit_notice_error?(error)
|
189
|
+
end
|
183
190
|
end
|
184
191
|
|
185
192
|
def test_should_exit_notice_error_negative
|
186
193
|
error = mocked_error
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
194
|
+
with_error_collector_config(:'error_collector.enabled' => true) do |error_collector|
|
195
|
+
error_collector.expects(:error_is_ignored?).with(error).returns(false)
|
196
|
+
error_collector.expects(:increment_error_count!)
|
197
|
+
assert !error_collector.should_exit_notice_error?(error)
|
198
|
+
end
|
191
199
|
end
|
192
200
|
|
193
201
|
def test_filtered_error_positive
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
202
|
+
with_error_collector_config(:'error_collector.ignore_errors' => 'an_error') do |error_collector|
|
203
|
+
error = mocked_error
|
204
|
+
error_class = mock('error class')
|
205
|
+
error.expects(:class).returns(error_class)
|
206
|
+
error_class.expects(:name).returns('an_error')
|
207
|
+
assert error_collector.filtered_error?(error)
|
208
|
+
end
|
200
209
|
end
|
201
210
|
|
202
211
|
def test_filtered_error_negative
|
203
|
-
@ignore = {}
|
204
212
|
error = mocked_error
|
205
213
|
error_class = mock('error class')
|
206
214
|
error.expects(:class).returns(error_class)
|
207
215
|
error_class.expects(:name).returns('an_error')
|
208
|
-
|
209
|
-
assert !filtered_error?(error)
|
216
|
+
assert !NewRelic::Agent::ErrorCollector.new.filtered_error?(error)
|
210
217
|
end
|
211
218
|
|
212
219
|
def test_filtered_by_error_filter_empty
|
@@ -251,7 +258,13 @@ class NewRelic::Agent::ErrorCollector::NoticeErrorTest < Test::Unit::TestCase
|
|
251
258
|
|
252
259
|
def mocked_control
|
253
260
|
fake_control = mock('control')
|
254
|
-
|
261
|
+
NewRelic::Control.stubs(:instance).returns(fake_control)
|
255
262
|
fake_control
|
256
263
|
end
|
264
|
+
|
265
|
+
def with_error_collector_config(config)
|
266
|
+
with_config(config) do
|
267
|
+
yield NewRelic::Agent::ErrorCollector.new
|
268
|
+
end
|
269
|
+
end
|
257
270
|
end
|
@@ -156,20 +156,18 @@ class NewRelic::Agent::ErrorCollectorTest < Test::Unit::TestCase
|
|
156
156
|
end
|
157
157
|
|
158
158
|
def test_obfuscates_error_messages_when_high_security_is_set
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
@error_collector.notice_error(StandardError.new("YO SQL BAD: serect * flom test where foo in (1,2,3,4,5)"))
|
159
|
+
with_config(:high_security => true) do
|
160
|
+
@error_collector.notice_error(StandardError.new("YO SQL BAD: serect * flom test where foo = 'bar'"))
|
161
|
+
@error_collector.notice_error(StandardError.new("YO SQL BAD: serect * flom test where foo in (1,2,3,4,5)"))
|
163
162
|
|
164
|
-
|
165
|
-
|
163
|
+
old_errors = []
|
164
|
+
errors = @error_collector.harvest_errors([])
|
166
165
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
NewRelic::Control.instance['high_security'] = nil
|
166
|
+
assert_equal('YO SQL BAD: serect * flom test where foo = ?',
|
167
|
+
errors[0].message)
|
168
|
+
assert_equal('YO SQL BAD: serect * flom test where foo in (?,?,?,?,?)',
|
169
|
+
errors[1].message)
|
170
|
+
end
|
173
171
|
end
|
174
172
|
|
175
173
|
private
|
@@ -15,6 +15,13 @@ class NewRelicServiceTest < Test::Unit::TestCase
|
|
15
15
|
@http_handle.respond_to(:connect, connect_response)
|
16
16
|
end
|
17
17
|
|
18
|
+
def test_initialize_uses_correct_license_key_settings
|
19
|
+
with_config(:license_key => 'abcde') do
|
20
|
+
service = NewRelic::Agent::NewRelicService.new
|
21
|
+
assert_equal 'abcde', service.instance_variable_get(:@license_key)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
18
25
|
def test_connect_sets_agent_id_and_config_data
|
19
26
|
response = @service.connect
|
20
27
|
assert_equal 1, response['agent_run_id']
|
@@ -94,9 +101,10 @@ class NewRelicServiceTest < Test::Unit::TestCase
|
|
94
101
|
end
|
95
102
|
|
96
103
|
def test_request_timeout
|
97
|
-
|
98
|
-
|
99
|
-
|
104
|
+
with_config(:timeout => 600) do
|
105
|
+
service = NewRelic::Agent::NewRelicService.new('abcdef', @server)
|
106
|
+
assert_equal 600, service.request_timeout
|
107
|
+
end
|
100
108
|
end
|
101
109
|
|
102
110
|
def test_should_throw_received_errors
|
@@ -4,6 +4,8 @@ require 'new_relic/agent/pipe_channel_manager'
|
|
4
4
|
|
5
5
|
class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
|
6
6
|
def setup
|
7
|
+
@test_config = { 'developer_mode' => true }
|
8
|
+
NewRelic::Agent.config.apply_config(@test_config)
|
7
9
|
NewRelic::Agent::PipeChannelManager.listener.close_all_pipes
|
8
10
|
NewRelic::Agent.manual_start
|
9
11
|
end
|
@@ -11,26 +13,27 @@ class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
|
|
11
13
|
def teardown
|
12
14
|
NewRelic::Agent::PipeChannelManager.listener.stop
|
13
15
|
NewRelic::Agent.shutdown
|
16
|
+
NewRelic::Agent.config.remove_config(@test_config)
|
14
17
|
end
|
15
|
-
|
18
|
+
|
16
19
|
def test_registering_a_pipe
|
17
|
-
NewRelic::Agent::PipeChannelManager.listener.wake.in.expects(:<<).with('.')
|
20
|
+
NewRelic::Agent::PipeChannelManager.listener.wake.in.expects(:<<).with('.')
|
18
21
|
NewRelic::Agent::PipeChannelManager.register_report_channel(1)
|
19
22
|
pipe = NewRelic::Agent::PipeChannelManager.channels[1]
|
20
|
-
|
23
|
+
|
21
24
|
assert pipe.out.kind_of?(IO)
|
22
25
|
assert pipe.in.kind_of?(IO)
|
23
26
|
|
24
27
|
NewRelic::Agent::PipeChannelManager.listener.close_all_pipes
|
25
28
|
end
|
26
|
-
|
29
|
+
|
27
30
|
if NewRelic::LanguageSupport.can_fork? && !NewRelic::LanguageSupport.using_version?('1.9.1')
|
28
31
|
def test_listener_merges_timeslice_metrics
|
29
32
|
metric = 'Custom/test/method'
|
30
33
|
engine = NewRelic::Agent.agent.stats_engine
|
31
34
|
engine.get_stats_no_scope(metric).record_data_point(1.0)
|
32
|
-
|
33
|
-
listener = start_listener_with_pipe(666)
|
35
|
+
|
36
|
+
listener = start_listener_with_pipe(666)
|
34
37
|
|
35
38
|
pid = Process.fork do
|
36
39
|
NewRelic::Agent.after_fork
|
@@ -40,19 +43,19 @@ class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
|
|
40
43
|
end
|
41
44
|
Process.wait(pid)
|
42
45
|
listener.stop
|
43
|
-
|
44
|
-
assert_equal(3.0, engine.lookup_stats(metric).total_call_time)
|
46
|
+
|
47
|
+
assert_equal(3.0, engine.lookup_stats(metric).total_call_time)
|
45
48
|
end
|
46
49
|
|
47
50
|
def test_listener_merges_transaction_traces
|
48
|
-
sampler = NewRelic::Agent.agent.transaction_sampler
|
51
|
+
sampler = NewRelic::Agent.agent.transaction_sampler
|
49
52
|
TransactionSampleTestHelper.run_sample_trace_on(sampler)
|
50
53
|
NewRelic::Agent.agent.merge_data_from([nil, [sampler.samples], nil])
|
51
54
|
|
52
55
|
assert_equal(1, NewRelic::Agent.agent.unsent_traces_size)
|
53
|
-
|
56
|
+
|
54
57
|
listener = start_listener_with_pipe(667)
|
55
|
-
|
58
|
+
|
56
59
|
pid = Process.fork do
|
57
60
|
NewRelic::Agent.after_fork
|
58
61
|
new_sampler = NewRelic::Agent::TransactionSampler.new
|
@@ -62,10 +65,10 @@ class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
|
|
62
65
|
end
|
63
66
|
Process.wait(pid)
|
64
67
|
listener.stop
|
65
|
-
|
68
|
+
|
66
69
|
assert_equal(2, NewRelic::Agent.agent.unsent_traces_size)
|
67
70
|
end
|
68
|
-
|
71
|
+
|
69
72
|
def test_listener_merges_error_traces
|
70
73
|
sampler = NewRelic::Agent.agent.error_collector
|
71
74
|
sampler.notice_error(Exception.new("message"), :uri => '/myurl/',
|
@@ -74,9 +77,9 @@ class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
|
|
74
77
|
NewRelic::Agent.agent.merge_data_from([nil, nil, [sampler.errors]])
|
75
78
|
|
76
79
|
assert_equal(1, NewRelic::Agent.agent.unsent_errors_size)
|
77
|
-
|
80
|
+
|
78
81
|
listener = start_listener_with_pipe(668)
|
79
|
-
|
82
|
+
|
80
83
|
pid = Process.fork do
|
81
84
|
NewRelic::Agent.after_fork
|
82
85
|
new_sampler = NewRelic::Agent::ErrorCollector.new
|
@@ -115,7 +118,7 @@ class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
|
|
115
118
|
end
|
116
119
|
end
|
117
120
|
end
|
118
|
-
|
121
|
+
|
119
122
|
def start_listener_with_pipe(pipe_id)
|
120
123
|
listener = NewRelic::Agent::PipeChannelManager.listener
|
121
124
|
listener.start
|
@@ -34,21 +34,23 @@ class NewRelic::Agent::RpmAgentTest < Test::Unit::TestCase # ActiveSupport::Test
|
|
34
34
|
end
|
35
35
|
|
36
36
|
should "startup_shutdown" do
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
37
|
+
with_config(:agent_enabled => true) do
|
38
|
+
@agent = NewRelic::Agent::ShimAgent.instance
|
39
|
+
@agent.shutdown
|
40
|
+
assert (not @agent.started?)
|
41
|
+
@agent.start
|
42
|
+
assert !@agent.started?
|
43
|
+
# this installs the real agent:
|
44
|
+
NewRelic::Agent.manual_start
|
45
|
+
@agent = NewRelic::Agent.instance
|
46
|
+
assert @agent != NewRelic::Agent::ShimAgent.instance
|
47
|
+
assert @agent.started?
|
48
|
+
@agent.shutdown
|
49
|
+
assert !@agent.started?
|
50
|
+
@agent.start
|
51
|
+
assert @agent.started?
|
52
|
+
NewRelic::Agent.shutdown
|
53
|
+
end
|
52
54
|
end
|
53
55
|
|
54
56
|
should "manual_start" do
|
@@ -67,16 +69,16 @@ class NewRelic::Agent::RpmAgentTest < Test::Unit::TestCase # ActiveSupport::Test
|
|
67
69
|
end
|
68
70
|
should "manual_overrides" do
|
69
71
|
NewRelic::Agent.manual_start :app_name => "testjobs", :dispatcher_instance_id => "mailer"
|
70
|
-
assert_equal "testjobs", NewRelic::
|
71
|
-
assert_equal "mailer", NewRelic::Control.instance.dispatcher_instance_id
|
72
|
+
assert_equal "testjobs", NewRelic::Agent.config.app_names[0]
|
73
|
+
assert_equal "mailer", NewRelic::Control.instance.local_env.dispatcher_instance_id
|
72
74
|
NewRelic::Agent.shutdown
|
73
75
|
end
|
74
76
|
|
75
77
|
should "restart" do
|
76
78
|
NewRelic::Agent.manual_start :app_name => "noapp", :dispatcher_instance_id => ""
|
77
79
|
NewRelic::Agent.manual_start :app_name => "testjobs", :dispatcher_instance_id => "mailer"
|
78
|
-
assert_equal "testjobs", NewRelic::
|
79
|
-
assert_equal "mailer", NewRelic::Control.instance.dispatcher_instance_id
|
80
|
+
assert_equal "testjobs", NewRelic::Agent.config.app_names[0]
|
81
|
+
assert_equal "mailer", NewRelic::Control.instance.local_env.dispatcher_instance_id
|
80
82
|
NewRelic::Agent.shutdown
|
81
83
|
end
|
82
84
|
|
@@ -1,7 +1,6 @@
|
|
1
1
|
require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
|
2
2
|
|
3
3
|
class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
|
4
|
-
|
5
4
|
def setup
|
6
5
|
agent = NewRelic::Agent.instance
|
7
6
|
stats_engine = NewRelic::Agent::StatsEngine.new
|
@@ -10,17 +9,17 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
|
|
10
9
|
@connection = stub('ActiveRecord connection', :execute => 'result')
|
11
10
|
NewRelic::Agent::Database.stubs(:get_connection).returns(@connection)
|
12
11
|
end
|
13
|
-
|
12
|
+
|
14
13
|
def test_notice_first_scope_push
|
15
|
-
assert_nil @sampler.transaction_data
|
14
|
+
assert_nil @sampler.transaction_data
|
16
15
|
@sampler.notice_first_scope_push nil
|
17
16
|
assert_not_nil @sampler.transaction_data
|
18
17
|
@sampler.notice_scope_empty
|
19
18
|
assert_nil @sampler.transaction_data
|
20
19
|
end
|
21
|
-
|
20
|
+
|
22
21
|
def test_notice_sql_no_transaction
|
23
|
-
assert_nil @sampler.transaction_data
|
22
|
+
assert_nil @sampler.transaction_data
|
24
23
|
@sampler.notice_sql "select * from test", "Database/test/select", nil, 10
|
25
24
|
end
|
26
25
|
|
@@ -33,45 +32,45 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
|
|
33
32
|
assert_not_nil @sampler.transaction_data
|
34
33
|
assert_equal 2, @sampler.transaction_data.sql_data.size
|
35
34
|
end
|
36
|
-
|
35
|
+
|
37
36
|
def test_harvest_slow_sql
|
38
37
|
data = NewRelic::Agent::TransactionSqlData.new
|
39
38
|
data.set_transaction_info("WebTransaction/Controller/c/a", "/c/a", {},
|
40
39
|
'guid')
|
41
40
|
data.sql_data.concat [
|
42
|
-
NewRelic::Agent::SlowSql.new("select * from test", "Database/test/select", {}, 1.5),
|
43
|
-
NewRelic::Agent::SlowSql.new("select * from test", "Database/test/select", {}, 1.2),
|
41
|
+
NewRelic::Agent::SlowSql.new("select * from test", "Database/test/select", {}, 1.5),
|
42
|
+
NewRelic::Agent::SlowSql.new("select * from test", "Database/test/select", {}, 1.2),
|
44
43
|
NewRelic::Agent::SlowSql.new("select * from test2", "Database/test2/select", {}, 1.1)
|
45
44
|
]
|
46
45
|
@sampler.harvest_slow_sql data
|
47
|
-
|
46
|
+
|
48
47
|
assert_equal 2, @sampler.sql_traces.size
|
49
48
|
end
|
50
|
-
|
49
|
+
|
51
50
|
def test_sql_aggregation
|
52
|
-
sql_trace = NewRelic::Agent::SqlTrace.new("select * from test",
|
51
|
+
sql_trace = NewRelic::Agent::SqlTrace.new("select * from test",
|
53
52
|
NewRelic::Agent::SlowSql.new("select * from test",
|
54
53
|
"Database/test/select", {}, 1.2),
|
55
54
|
"tx_name", "uri")
|
56
|
-
|
55
|
+
|
57
56
|
sql_trace.aggregate NewRelic::Agent::SlowSql.new("select * from test", "Database/test/select", {}, 1.5), "slowest_tx_name", "slow_uri"
|
58
57
|
sql_trace.aggregate NewRelic::Agent::SlowSql.new("select * from test", "Database/test/select", {}, 1.1), "other_tx_name", "uri2"
|
59
|
-
|
58
|
+
|
60
59
|
assert_equal 3, sql_trace.call_count
|
61
60
|
assert_equal "slowest_tx_name", sql_trace.path
|
62
61
|
assert_equal "slow_uri", sql_trace.url
|
63
62
|
assert_equal 1.5, sql_trace.max_call_time
|
64
63
|
end
|
65
|
-
|
64
|
+
|
66
65
|
def test_harvest
|
67
66
|
data = NewRelic::Agent::TransactionSqlData.new
|
68
67
|
data.set_transaction_info("WebTransaction/Controller/c/a", "/c/a", {},
|
69
68
|
'guid')
|
70
|
-
data.sql_data.concat [NewRelic::Agent::SlowSql.new("select * from test", "Database/test/select", {}, 1.5),
|
71
|
-
NewRelic::Agent::SlowSql.new("select * from test", "Database/test/select", {}, 1.2),
|
69
|
+
data.sql_data.concat [NewRelic::Agent::SlowSql.new("select * from test", "Database/test/select", {}, 1.5),
|
70
|
+
NewRelic::Agent::SlowSql.new("select * from test", "Database/test/select", {}, 1.2),
|
72
71
|
NewRelic::Agent::SlowSql.new("select * from test2", "Database/test2/select", {}, 1.1)]
|
73
72
|
@sampler.harvest_slow_sql data
|
74
|
-
|
73
|
+
|
75
74
|
sql_traces = @sampler.harvest
|
76
75
|
assert_equal 2, sql_traces.size
|
77
76
|
end
|
@@ -83,10 +82,10 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
|
|
83
82
|
data.sql_data << NewRelic::Agent::SlowSql.new("select * from test#{(i+97).chr}",
|
84
83
|
"Database/test#{(i+97).chr}/select", {}, i)
|
85
84
|
end
|
86
|
-
|
85
|
+
|
87
86
|
@sampler.harvest_slow_sql data
|
88
87
|
result = @sampler.harvest
|
89
|
-
|
88
|
+
|
90
89
|
assert_equal(10, result.size)
|
91
90
|
assert_equal(14, result.sort{|a,b| b.max_call_time <=> a.max_call_time}.first.total_call_time)
|
92
91
|
end
|
@@ -96,13 +95,13 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
|
|
96
95
|
data.set_transaction_info("WebTransaction/Controller/c/a", "/c/a", {},
|
97
96
|
'guid')
|
98
97
|
queries = [
|
99
|
-
NewRelic::Agent::SlowSql.new("select * from test where foo in (1, 2) ", "Database/test/select", {}, 1.5),
|
100
|
-
NewRelic::Agent::SlowSql.new("select * from test where foo in (1,2, 3 ,4, 5,6, 'snausage')", "Database/test/select", {}, 1.2),
|
98
|
+
NewRelic::Agent::SlowSql.new("select * from test where foo in (1, 2) ", "Database/test/select", {}, 1.5),
|
99
|
+
NewRelic::Agent::SlowSql.new("select * from test where foo in (1,2, 3 ,4, 5,6, 'snausage')", "Database/test/select", {}, 1.2),
|
101
100
|
NewRelic::Agent::SlowSql.new("select * from test2 where foo in (1,2)", "Database/test2/select", {}, 1.1)
|
102
101
|
]
|
103
102
|
data.sql_data.concat(queries)
|
104
103
|
@sampler.harvest_slow_sql data
|
105
|
-
|
104
|
+
|
106
105
|
sql_traces = @sampler.harvest
|
107
106
|
assert_equal 2, sql_traces.size
|
108
107
|
end
|
@@ -117,19 +116,19 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
|
|
117
116
|
data.set_transaction_info("WebTransaction/Controller/c/a", "/c/a", {},
|
118
117
|
'guid')
|
119
118
|
queries = [
|
120
|
-
NewRelic::Agent::SlowSql.new("select * from test", "Database/test/select", {}, 1.5),
|
121
|
-
NewRelic::Agent::SlowSql.new("select * from test", "Database/test/select", {}, 1.2),
|
119
|
+
NewRelic::Agent::SlowSql.new("select * from test", "Database/test/select", {}, 1.5),
|
120
|
+
NewRelic::Agent::SlowSql.new("select * from test", "Database/test/select", {}, 1.2),
|
122
121
|
NewRelic::Agent::SlowSql.new("select * from test2", "Database/test2/select", {}, 1.1)
|
123
122
|
]
|
124
123
|
data.sql_data.concat(queries)
|
125
|
-
@sampler.harvest_slow_sql data
|
124
|
+
@sampler.harvest_slow_sql data
|
126
125
|
sql_traces = @sampler.harvest
|
127
126
|
assert_equal(["header0", "header1", "header2"],
|
128
127
|
sql_traces[0].params[:explain_plan][0].sort)
|
129
128
|
assert_equal(["header0", "header1", "header2"],
|
130
129
|
sql_traces[1].params[:explain_plan][0].sort)
|
131
130
|
assert_equal(["foo0", "foo1", "foo2"],
|
132
|
-
sql_traces[0].params[:explain_plan][1][0].sort)
|
131
|
+
sql_traces[0].params[:explain_plan][1][0].sort)
|
133
132
|
assert_equal(["bar0", "bar1", "bar2"],
|
134
133
|
sql_traces[1].params[:explain_plan][1][0].sort)
|
135
134
|
end
|
@@ -145,48 +144,48 @@ class NewRelic::Agent::SqlSamplerTest < Test::Unit::TestCase
|
|
145
144
|
assert_equal(NewRelic::Agent.instance.transaction_sampler.builder.sample.guid,
|
146
145
|
NewRelic::Agent.instance.sql_sampler.transaction_data.guid)
|
147
146
|
end
|
148
|
-
|
147
|
+
|
149
148
|
def test_should_not_collect_explain_plans_when_disabled
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
149
|
+
with_config(:'transaction_tracer.explain_enabled' => false) do
|
150
|
+
data = NewRelic::Agent::TransactionSqlData.new
|
151
|
+
data.set_transaction_info("WebTransaction/Controller/c/a", "/c/a", {},
|
152
|
+
'guid')
|
153
|
+
|
154
|
+
queries = [
|
155
|
+
NewRelic::Agent::SlowSql.new("select * from test",
|
156
|
+
"Database/test/select", {}, 1.5)
|
157
|
+
]
|
158
|
+
data.sql_data.concat(queries)
|
159
|
+
@sampler.harvest_slow_sql data
|
160
|
+
sql_traces = @sampler.harvest
|
161
|
+
assert_equal(nil, sql_traces[0].params[:explain_plan])
|
162
|
+
end
|
164
163
|
end
|
165
164
|
|
166
165
|
def test_sql_id_fits_in_a_mysql_int_11
|
167
|
-
sql_trace = NewRelic::Agent::SqlTrace.new("select * from test",
|
166
|
+
sql_trace = NewRelic::Agent::SqlTrace.new("select * from test",
|
168
167
|
NewRelic::Agent::SlowSql.new("select * from test",
|
169
168
|
"Database/test/select", {}, 1.2),
|
170
169
|
"tx_name", "uri")
|
171
|
-
|
170
|
+
|
172
171
|
assert -2147483648 <= sql_trace.sql_id, "sql_id too small"
|
173
172
|
assert 2147483647 >= sql_trace.sql_id, "sql_id too large"
|
174
173
|
end
|
175
174
|
|
176
175
|
def test_sends_obfuscated_queries_when_configured
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
sql_traces = @sampler.harvest
|
176
|
+
with_config(:'transaction_tracer.record_sql' => 'obfuscated') do
|
177
|
+
data = NewRelic::Agent::TransactionSqlData.new
|
178
|
+
data.set_transaction_info("WebTransaction/Controller/c/a", "/c/a", {},
|
179
|
+
'guid')
|
180
|
+
data.sql_data.concat([NewRelic::Agent::SlowSql.new("select * from test where foo = 'bar'",
|
181
|
+
"Database/test/select", {}, 1.5),
|
182
|
+
NewRelic::Agent::SlowSql.new("select * from test where foo in (1,2,3,4,5)",
|
183
|
+
"Database/test/select", {}, 1.2)])
|
184
|
+
@sampler.harvest_slow_sql(data)
|
185
|
+
sql_traces = @sampler.harvest
|
188
186
|
|
189
|
-
|
190
|
-
|
187
|
+
assert_equal('select * from test where foo = ?', sql_traces[0].sql)
|
188
|
+
assert_equal('select * from test where foo in (?,?,?,?,?)', sql_traces[1].sql)
|
189
|
+
end
|
191
190
|
end
|
192
191
|
end
|