newrelic_rpm 2.14.1 → 3.0.0.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.

Files changed (123) hide show
  1. data/CHANGELOG +8 -0
  2. data/README.rdoc +2 -0
  3. data/install.rb +2 -2
  4. data/lib/new_relic/agent.rb +34 -1
  5. data/lib/new_relic/agent/agent.rb +34 -25
  6. data/lib/new_relic/agent/browser_monitoring.rb +111 -0
  7. data/lib/new_relic/agent/error_collector.rb +4 -4
  8. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +3 -3
  9. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +5 -7
  10. data/lib/new_relic/agent/instrumentation/data_mapper.rb +8 -8
  11. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +1 -1
  12. data/lib/new_relic/agent/instrumentation/memcache.rb +1 -1
  13. data/lib/new_relic/agent/instrumentation/merb/controller.rb +1 -1
  14. data/lib/new_relic/agent/instrumentation/merb/errors.rb +1 -1
  15. data/lib/new_relic/agent/instrumentation/metric_frame.rb +1 -0
  16. data/lib/new_relic/agent/instrumentation/queue_time.rb +26 -26
  17. data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +1 -1
  18. data/lib/new_relic/agent/instrumentation/rails/errors.rb +1 -1
  19. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +2 -2
  20. data/lib/new_relic/agent/instrumentation/sinatra.rb +1 -1
  21. data/lib/new_relic/agent/method_tracer.rb +15 -15
  22. data/lib/new_relic/agent/shim_agent.rb +2 -0
  23. data/lib/new_relic/agent/stats_engine/metric_stats.rb +3 -3
  24. data/lib/new_relic/agent/stats_engine/samplers.rb +2 -2
  25. data/lib/new_relic/agent/stats_engine/transactions.rb +2 -1
  26. data/lib/new_relic/agent/transaction_sample_builder.rb +101 -0
  27. data/lib/new_relic/agent/transaction_sampler.rb +299 -251
  28. data/lib/new_relic/control.rb +2 -2
  29. data/lib/new_relic/control/class_methods.rb +0 -5
  30. data/lib/new_relic/control/configuration.rb +4 -3
  31. data/lib/new_relic/control/frameworks/rails.rb +9 -12
  32. data/lib/new_relic/control/instance_methods.rb +2 -2
  33. data/lib/new_relic/control/instrumentation.rb +1 -1
  34. data/lib/new_relic/control/server_methods.rb +2 -2
  35. data/lib/new_relic/delayed_job_injection.rb +1 -1
  36. data/lib/new_relic/local_environment.rb +7 -7
  37. data/lib/new_relic/rack/browser_monitoring.rb +61 -0
  38. data/lib/new_relic/stats.rb +6 -6
  39. data/lib/new_relic/version.rb +4 -4
  40. data/newrelic.yml +19 -0
  41. data/newrelic_rpm.gemspec +9 -4
  42. data/test/active_record_fixtures.rb +5 -5
  43. data/test/config/test_control.rb +3 -3
  44. data/test/new_relic/agent/agent/connect_test.rb +27 -6
  45. data/test/new_relic/agent/agent/start_test.rb +13 -13
  46. data/test/new_relic/agent/agent/start_worker_thread_test.rb +8 -8
  47. data/test/new_relic/agent/agent_test.rb +85 -0
  48. data/test/new_relic/agent/agent_test_controller.rb +9 -9
  49. data/test/new_relic/agent/agent_test_controller_test.rb +37 -37
  50. data/test/new_relic/agent/browser_monitoring_test.rb +124 -0
  51. data/test/new_relic/agent/busy_calculator_test.rb +7 -7
  52. data/test/new_relic/agent/error_collector/notice_error_test.rb +9 -9
  53. data/test/new_relic/agent/error_collector_test.rb +54 -54
  54. data/test/new_relic/agent/instrumentation/active_record_instrumentation_test.rb +69 -69
  55. data/test/new_relic/agent/instrumentation/controller_instrumentation_test.rb +36 -0
  56. data/test/new_relic/agent/instrumentation/metric_frame_test.rb +3 -3
  57. data/test/new_relic/agent/instrumentation/net_instrumentation_test.rb +11 -11
  58. data/test/new_relic/agent/instrumentation/queue_time_test.rb +38 -35
  59. data/test/new_relic/agent/instrumentation/task_instrumentation_test.rb +18 -18
  60. data/test/new_relic/agent/memcache_instrumentation_test.rb +12 -12
  61. data/test/new_relic/agent/method_tracer/class_methods/add_method_tracer_test.rb +1 -1
  62. data/test/new_relic/agent/method_tracer/instance_methods/trace_execution_scoped_test.rb +16 -15
  63. data/test/new_relic/agent/method_tracer_test.rb +60 -60
  64. data/test/new_relic/agent/mock_scope_listener.rb +8 -8
  65. data/test/new_relic/agent/rpm_agent_test.rb +26 -26
  66. data/test/new_relic/agent/stats_engine/metric_stats_test.rb +17 -17
  67. data/test/new_relic/agent/stats_engine/samplers_test.rb +4 -4
  68. data/test/new_relic/agent/stats_engine/stats_engine_test.rb +51 -51
  69. data/test/new_relic/agent/transaction_sample_builder_test.rb +36 -36
  70. data/test/new_relic/agent/transaction_sampler_test.rb +727 -178
  71. data/test/new_relic/agent/worker_loop_test.rb +4 -4
  72. data/test/new_relic/collection_helper_test.rb +15 -15
  73. data/test/new_relic/command/deployments_test.rb +5 -5
  74. data/test/new_relic/control_test.rb +25 -25
  75. data/test/new_relic/local_environment_test.rb +11 -11
  76. data/test/new_relic/metric_spec_test.rb +21 -21
  77. data/test/new_relic/rack/episodes_test.rb +35 -35
  78. data/test/new_relic/stats_test.rb +61 -43
  79. data/test/new_relic/transaction_sample_subtest_test.rb +15 -15
  80. data/test/new_relic/transaction_sample_test.rb +25 -25
  81. data/test/new_relic/version_number_test.rb +11 -11
  82. data/test/test_contexts.rb +7 -7
  83. data/test/test_helper.rb +6 -6
  84. data/ui/helpers/developer_mode_helper.rb +67 -67
  85. data/ui/helpers/google_pie_chart.rb +4 -4
  86. data/vendor/gems/dependency_detection-0.0.1.build/lib/dependency_detection.rb +4 -4
  87. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/action_mailer.rb +3 -3
  88. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/active_merchant.rb +7 -7
  89. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/active_record.rb +1 -1
  90. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/apdex.rb +9 -9
  91. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/background_transaction.rb +1 -1
  92. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/client.rb +8 -8
  93. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller.rb +9 -9
  94. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller_cpu.rb +4 -4
  95. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller_ext.rb +2 -2
  96. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/database.rb +8 -8
  97. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/database_pool.rb +3 -3
  98. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/dot_net.rb +6 -6
  99. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/dot_net_parser.rb +3 -3
  100. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/external.rb +2 -2
  101. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/frontend.rb +6 -6
  102. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/gc.rb +2 -2
  103. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/hibernate_session.rb +1 -1
  104. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/java.rb +4 -4
  105. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/java_parser.rb +3 -3
  106. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/jsp.rb +4 -4
  107. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/jsp_tag.rb +1 -1
  108. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/mem_cache.rb +1 -1
  109. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/metric_parser.rb +21 -21
  110. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/orm.rb +2 -2
  111. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/other_transaction.rb +6 -6
  112. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet.rb +2 -2
  113. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet_context_listener.rb +1 -1
  114. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet_filter.rb +1 -1
  115. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/solr.rb +3 -3
  116. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/solr_request_handler.rb +1 -1
  117. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/spring.rb +8 -8
  118. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/struts_action.rb +3 -3
  119. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/struts_result.rb +3 -3
  120. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/view.rb +5 -5
  121. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/web_transaction.rb +20 -20
  122. metadata +15 -9
  123. data/lib/new_relic/agent/instrumentation/sequel.rb +0 -109
@@ -19,10 +19,10 @@ class NewRelic::Control::Frameworks::Test < parent_class
19
19
  :rails
20
20
  end
21
21
  end
22
-
22
+
23
23
  def initialize *args
24
24
  super
25
- setup_log
25
+ setup_log
26
26
  end
27
27
  # when running tests, don't write out stderr
28
28
  def log!(msg, level=:info)
@@ -37,7 +37,7 @@ class NewRelic::Control::Frameworks::Test < parent_class
37
37
  def draw_with_test_route
38
38
  draw_without_test_route do | map |
39
39
  map.connect ':controller/:action/:id'
40
- yield map
40
+ yield map
41
41
  end
42
42
  end
43
43
  alias_method_chain :draw, :test_route
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__),'..', '..', '..','test_helper'))
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..', '..', '..','test_helper'))
2
2
  class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
3
3
  require 'new_relic/agent/agent'
4
4
  include NewRelic::Agent::Agent::Connect
@@ -9,7 +9,7 @@ class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
9
9
  @connect_attempts = 1
10
10
  @connect_retry_period = 0
11
11
  end
12
-
12
+
13
13
  def test_tried_to_connect?
14
14
  # base case, should default to false
15
15
  assert !tried_to_connect?({})
@@ -20,7 +20,7 @@ class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
20
20
  @connected = true
21
21
  assert tried_to_connect?({})
22
22
  end
23
-
23
+
24
24
  def test_tried_to_connect_forced
25
25
  # is false if force_reconnect is true
26
26
  assert !tried_to_connect?({:force_reconnect => true})
@@ -116,7 +116,7 @@ class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
116
116
  log.expects(:debug).never
117
117
  log_seed_token
118
118
  end
119
-
119
+
120
120
  def mocks_for_positive_environment_for_connect(value_for_control)
121
121
  control = mocked_control
122
122
  control.expects(:'[]').with('send_environment_info').once.returns(value_for_control)
@@ -124,7 +124,7 @@ class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
124
124
  fake_env.expects(:snapshot).once.returns("snapshot")
125
125
  control.expects(:local_env).once.returns(fake_env)
126
126
  end
127
-
127
+
128
128
  def test_environment_for_connect_nil
129
129
  mocks_for_positive_environment_for_connect(nil)
130
130
  assert_equal 'snapshot', environment_for_connect
@@ -195,6 +195,27 @@ class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
195
195
  enable_random_samples!(sampling_rate)
196
196
  end
197
197
 
198
+ def test_enable_random_samples_with_no_sampling_rate
199
+ # testing that we set a sane default for sampling rate
200
+ sampling_rate = 0
201
+ ts = @transaction_sampler = mock('ts')
202
+ ts.expects(:random_sampling=).with(true)
203
+ ts.expects(:sampling_rate=).with(10)
204
+ ts.expects(:sampling_rate).returns(10)
205
+ log.expects(:info).with("Transaction sampling enabled, rate = 10")
206
+ enable_random_samples!(sampling_rate)
207
+ end
208
+
209
+ def test_configure_transaction_tracer_with_random_sampling
210
+ @config_should_send_samples = true
211
+ @should_send_random_samples = true
212
+ @slowest_transaction_threshold = 5
213
+ log.expects(:debug).with('Transaction tracing threshold is 5 seconds.')
214
+ self.expects(:enable_random_samples!).with(10)
215
+ configure_transaction_tracer!(true, 10)
216
+ assert @should_send_samples
217
+ end
218
+
198
219
  def test_configure_transaction_tracer_positive
199
220
  @config_should_send_samples = true
200
221
  @slowest_transaction_threshold = 5
@@ -266,7 +287,7 @@ class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
266
287
  assert_equal 'pasta sauce', @report_period
267
288
  assert_equal 'tamales', @url_rules
268
289
  end
269
-
290
+
270
291
  private
271
292
 
272
293
  def mocked_control
@@ -1,4 +1,4 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','test_helper'))
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','test_helper'))
2
2
  class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
3
3
  require 'new_relic/agent/agent'
4
4
  include NewRelic::Agent::Agent::Start
@@ -14,7 +14,7 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
14
14
  self.expects(:started?).returns(false)
15
15
  assert !already_started?
16
16
  end
17
-
17
+
18
18
  def test_disabled_positive
19
19
  control = mocked_control
20
20
  control.expects(:agent_enabled?).returns(false)
@@ -79,14 +79,14 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
79
79
  set_sql_recording!
80
80
  assert_equal :off, @record_sql, "should be set to :off, was #{@record_sql}"
81
81
  end
82
-
82
+
83
83
  def test_set_sql_recording_none
84
84
  self.expects(:sampler_config).returns({'record_sql' => 'none'})
85
85
  self.expects(:log_sql_transmission_warning?)
86
86
  set_sql_recording!
87
87
  assert_equal :off, @record_sql, "should be set to :off, was #{@record_sql}"
88
88
  end
89
-
89
+
90
90
  def test_set_sql_recording_raw
91
91
  self.expects(:sampler_config).returns({'record_sql' => 'raw'})
92
92
  self.expects(:log_sql_transmission_warning?)
@@ -129,13 +129,13 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
129
129
  fake_sampler_config.expects(:fetch).with('explain_threshold', 0.5)
130
130
  fake_sampler_config.expects(:fetch).with('explain_enabled', true)
131
131
  self.expects(:set_sql_recording!)
132
-
132
+
133
133
  fake_sampler_config.expects(:fetch).with('transaction_threshold', 2.0)
134
134
  self.expects(:apdex_f_threshold?).returns(true)
135
135
  self.expects(:apdex_f)
136
136
  config_transaction_tracer
137
137
  end
138
-
138
+
139
139
  def test_check_config_and_start_agent_disabled
140
140
  self.expects(:monitoring?).returns(false)
141
141
  check_config_and_start_agent
@@ -146,7 +146,7 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
146
146
  self.expects(:has_correct_license_key?).returns(false)
147
147
  check_config_and_start_agent
148
148
  end
149
-
149
+
150
150
  def test_check_config_and_start_agent_forking
151
151
  self.expects(:monitoring?).returns(true)
152
152
  self.expects(:has_correct_license_key?).returns(true)
@@ -164,7 +164,7 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
164
164
  self.expects(:install_exit_handler)
165
165
  check_config_and_start_agent
166
166
  end
167
-
167
+
168
168
  def test_check_config_and_start_agent_sync
169
169
  self.expects(:monitoring?).returns(true)
170
170
  self.expects(:has_correct_license_key?).returns(true)
@@ -176,17 +176,17 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
176
176
  self.expects(:install_exit_handler)
177
177
  check_config_and_start_agent
178
178
  end
179
-
179
+
180
180
  def test_connect_in_foreground
181
181
  self.expects(:connect).with({:keep_retrying => false })
182
182
  connect_in_foreground
183
183
  end
184
-
184
+
185
185
  def at_exit
186
186
  yield
187
187
  end
188
188
  private :at_exit
189
-
189
+
190
190
  def test_install_exit_handler_positive
191
191
  control = mocked_control
192
192
  control.expects(:send_data_on_exit).returns(true)
@@ -199,7 +199,7 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
199
199
  self.expects(:shutdown)
200
200
  install_exit_handler
201
201
  end
202
-
202
+
203
203
  def test_install_exit_handler_negative
204
204
  control = mocked_control
205
205
  control.expects(:send_data_on_exit).returns(false)
@@ -321,7 +321,7 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
321
321
  def test_log_if_negative
322
322
  assert !log_if(false, :warn, "WHEE")
323
323
  end
324
-
324
+
325
325
  private
326
326
 
327
327
  def mocked_log
@@ -1,8 +1,8 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','test_helper'))
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','test_helper'))
2
2
  class NewRelic::Agent::Agent::StartWorkerThreadTest < Test::Unit::TestCase
3
3
  require 'new_relic/agent/agent'
4
4
  include NewRelic::Agent::Agent::StartWorkerThread
5
-
5
+
6
6
  def test_deferred_work_connects
7
7
  self.expects(:catch_errors).yields
8
8
  self.expects(:connect).with('connection_options')
@@ -71,7 +71,7 @@ class NewRelic::Agent::Agent::StartWorkerThreadTest < Test::Unit::TestCase
71
71
  self.expects(:harvest_and_send_errors)
72
72
  create_and_run_worker_loop
73
73
  end
74
-
74
+
75
75
  def test_handle_force_restart
76
76
  # hooray for methods with no branches
77
77
  error = mock('exception')
@@ -80,12 +80,12 @@ class NewRelic::Agent::Agent::StartWorkerThreadTest < Test::Unit::TestCase
80
80
  log.expects(:info).with('a message')
81
81
  self.expects(:reset_stats)
82
82
  self.expects(:sleep).with(30)
83
-
83
+
84
84
  @metric_ids = 'this is not an empty hash'
85
85
  @connected = true
86
-
86
+
87
87
  handle_force_restart(error)
88
-
88
+
89
89
  assert_equal({}, @metric_ids)
90
90
  assert @connected.nil?
91
91
  end
@@ -125,7 +125,7 @@ class NewRelic::Agent::Agent::StartWorkerThreadTest < Test::Unit::TestCase
125
125
  self.expects(:disconnect)
126
126
  handle_other_error(error)
127
127
  end
128
-
128
+
129
129
  def test_catch_errors_force_restart
130
130
  @runs = 0
131
131
  error = NewRelic::Agent::ForceRestartException.new
@@ -138,7 +138,7 @@ class NewRelic::Agent::Agent::StartWorkerThreadTest < Test::Unit::TestCase
138
138
  end
139
139
  assert_equal 3, @runs, 'should retry the block when it fails'
140
140
  end
141
-
141
+
142
142
  private
143
143
 
144
144
  def mocked_log
@@ -0,0 +1,85 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
2
+ module NewRelic
3
+ module Agent
4
+ class AgentTest < Test::Unit::TestCase
5
+ def test_sql_normalization
6
+
7
+ # basic statement
8
+ assert_equal "INSERT INTO X values(?,?, ? , ?)",
9
+ NewRelic::Agent.instance.send(:default_sql_obfuscator, "INSERT INTO X values('test',0, 1 , 2)")
10
+
11
+ # escaped literals
12
+ assert_equal "INSERT INTO X values(?, ?,?, ? , ?)",
13
+ NewRelic::Agent.instance.send(:default_sql_obfuscator, "INSERT INTO X values('', 'jim''s ssn',0, 1 , 'jim''s son''s son')")
14
+
15
+ # multiple string literals
16
+ assert_equal "INSERT INTO X values(?,?,?, ? , ?)",
17
+ NewRelic::Agent.instance.send(:default_sql_obfuscator, "INSERT INTO X values('jim''s ssn','x',0, 1 , 2)")
18
+
19
+ # empty string literal
20
+ # NOTE: the empty string literal resolves to empty string, which for our purposes is acceptable
21
+ assert_equal "INSERT INTO X values(?,?,?, ? , ?)",
22
+ NewRelic::Agent.instance.send(:default_sql_obfuscator, "INSERT INTO X values('','x',0, 1 , 2)")
23
+
24
+ # try a select statement
25
+ assert_equal "select * from table where name=? and ssn=?",
26
+ NewRelic::Agent.instance.send(:default_sql_obfuscator, "select * from table where name='jim gochee' and ssn=0012211223")
27
+
28
+ # number literals embedded in sql - oh well
29
+ assert_equal "select * from table_? where name=? and ssn=?",
30
+ NewRelic::Agent.instance.send(:default_sql_obfuscator, "select * from table_007 where name='jim gochee' and ssn=0012211223")
31
+ end
32
+
33
+ def test_sql_normalization__single_quotes
34
+ assert_equal "INSERT ? into table",
35
+ NewRelic::Agent.instance.send(:default_sql_obfuscator, "INSERT 'this isn''t a real value' into table")
36
+ assert_equal "INSERT ? into table",
37
+ NewRelic::Agent.instance.send(:default_sql_obfuscator, %q[INSERT '"' into table])
38
+ assert_equal "INSERT ? into table",
39
+ NewRelic::Agent.instance.send(:default_sql_obfuscator, %q[INSERT ' "some text" \" ' into table])
40
+ # could not get this one licked. no biggie
41
+ # assert_equal "INSERT ? into table",
42
+ # NewRelic::Agent.instance.send(:default_sql_obfuscator, %q[INSERT '\'' into table])
43
+ assert_equal "INSERT ? into table",
44
+ NewRelic::Agent.instance.send(:default_sql_obfuscator, %q[INSERT ''' ' into table])
45
+ end
46
+ def test_sql_normalization__double_quotes
47
+ assert_equal "INSERT ? into table",
48
+ NewRelic::Agent.instance.send(:default_sql_obfuscator, %q[INSERT "this isn't a real value" into table])
49
+ assert_equal "INSERT ? into table",
50
+ NewRelic::Agent.instance.send(:default_sql_obfuscator, %q[INSERT "'" into table])
51
+ assert_equal "INSERT ? into table",
52
+ NewRelic::Agent.instance.send(:default_sql_obfuscator, %q[INSERT " \" " into table])
53
+ assert_equal "INSERT ? into table",
54
+ NewRelic::Agent.instance.send(:default_sql_obfuscator, %q[INSERT " 'some text' " into table])
55
+ end
56
+ def test_sql_obfuscation_filters
57
+ orig = NewRelic::Agent.agent.obfuscator
58
+
59
+ NewRelic::Agent.set_sql_obfuscator(:replace) do |sql|
60
+ sql = "1" + sql
61
+ end
62
+
63
+ sql = "SELECT * FROM TABLE 123 'jim'"
64
+
65
+ assert_equal "1" + sql, NewRelic::Agent.instance.obfuscator.call(sql)
66
+
67
+ NewRelic::Agent.set_sql_obfuscator(:before) do |sql|
68
+ sql = "2" + sql
69
+ end
70
+
71
+ assert_equal "12" + sql, NewRelic::Agent.instance.obfuscator.call(sql)
72
+
73
+ NewRelic::Agent.set_sql_obfuscator(:after) do |sql|
74
+ sql = sql + "3"
75
+ end
76
+
77
+ assert_equal "12" + sql + "3", NewRelic::Agent.instance.obfuscator.call(sql)
78
+
79
+ NewRelic::Agent.agent.set_sql_obfuscator(:replace, &orig)
80
+ end
81
+
82
+
83
+ end
84
+ end
85
+ end
@@ -1,4 +1,4 @@
1
- # Defining a test controller class with a superclass, used to
1
+ # Defining a test controller class with a superclass, used to
2
2
  # verify correct attribute inheritence
3
3
  class NewRelic::Agent::SuperclassController < ActionController::Base
4
4
  def base_action
@@ -8,7 +8,7 @@ end
8
8
  # This is a controller class used in testing controller instrumentation
9
9
  class NewRelic::Agent::AgentTestController < NewRelic::Agent::SuperclassController
10
10
  filter_parameter_logging :social_security_number
11
-
11
+
12
12
  @@headers_to_add = nil
13
13
 
14
14
  def index
@@ -21,7 +21,7 @@ class NewRelic::Agent::AgentTestController < NewRelic::Agent::SuperclassControll
21
21
  def action_inline
22
22
  render(:inline => "<%= 'foo' %>fah")
23
23
  end
24
-
24
+
25
25
  def action_to_render
26
26
  render :text => params.inspect
27
27
  end
@@ -40,7 +40,7 @@ class NewRelic::Agent::AgentTestController < NewRelic::Agent::SuperclassControll
40
40
  end
41
41
  class TestException < RuntimeError
42
42
  end
43
-
43
+
44
44
  def rescue_action_locally(exception)
45
45
  if exception.is_a? TestException
46
46
  raise "error in the handler"
@@ -52,22 +52,22 @@ class NewRelic::Agent::AgentTestController < NewRelic::Agent::SuperclassControll
52
52
  def entry_action
53
53
  perform_action_with_newrelic_trace('internal_action') do
54
54
  internal_action
55
- end
55
+ end
56
56
  end
57
-
57
+
58
58
  def self.set_some_headers(hash_of_headers)
59
59
  @@headers_to_add ||= {}
60
60
  @@headers_to_add.merge!(hash_of_headers)
61
61
  end
62
-
62
+
63
63
  def self.clear_headers
64
64
  @@headers_to_add = nil
65
65
  end
66
-
66
+
67
67
  def newrelic_request_headers
68
68
  @@headers_to_add ||= {}
69
69
  end
70
-
70
+
71
71
  private
72
72
  def internal_action
73
73
  perform_action_with_newrelic_trace(:name => 'internal_traced_action', :force => true) do
@@ -1,13 +1,13 @@
1
- require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
2
2
  require 'action_controller/test_case'
3
3
  class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
4
4
  require 'action_controller/base'
5
5
  require 'new_relic/agent/agent_test_controller'
6
-
6
+
7
7
  self.controller_class = NewRelic::Agent::AgentTestController
8
-
8
+
9
9
  attr_accessor :agent, :engine
10
-
10
+
11
11
  # Normally you can do this with #setup but for some reason in rails 2.0.2
12
12
  # setup is not called.
13
13
  def initialize name
@@ -28,7 +28,7 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
28
28
  if defined?(Rails) && Rails.respond_to?(:application) && Rails.application.respond_to?(:routes)
29
29
  @routes = Rails.application.routes
30
30
  end
31
-
31
+
32
32
  Thread.current[:newrelic_ignore_controller] = nil
33
33
  NewRelic::Agent.manual_start
34
34
  @agent = NewRelic::Agent.instance
@@ -40,26 +40,26 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
40
40
  end
41
41
  @engine = @agent.stats_engine
42
42
  end
43
-
43
+
44
44
  def teardown
45
45
  Thread.current[:newrelic_ignore_controller] = nil
46
46
  NewRelic::Agent.shutdown
47
47
  NewRelic::Agent::AgentTestController.clear_headers
48
48
  super
49
49
  end
50
-
50
+
51
51
  def test_mongrel_queue
52
- NewRelic::Agent::AgentTestController.clear_headers
52
+ NewRelic::Agent::AgentTestController.clear_headers
53
53
  engine.clear_stats
54
54
  NewRelic::Control.instance.local_env.stubs(:mongrel).returns( stub('mongrel', :workers => stub('workers', :list => stub('list', :length => '10'))))
55
-
55
+
56
56
  get :index
57
57
  assert_equal 1, stats('HttpDispatcher').call_count
58
58
  assert_equal 1, engine.get_stats_no_scope('Mongrel/Queue Length').call_count
59
59
  assert_equal 9, engine.get_stats_no_scope('Mongrel/Queue Length').total_call_time
60
60
  assert_equal 0, engine.get_stats_no_scope('WebFrontend/Mongrel/Average Queue Time').call_count
61
61
  end
62
-
62
+
63
63
  def test_heroku_queue
64
64
  engine.clear_stats
65
65
  NewRelic::Agent::AgentTestController.set_some_headers 'HTTP_X_HEROKU_QUEUE_DEPTH'=>'15'
@@ -71,7 +71,7 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
71
71
  end
72
72
 
73
73
  def test_new_queue_integration
74
- NewRelic::Agent::AgentTestController.clear_headers
74
+ NewRelic::Agent::AgentTestController.clear_headers
75
75
  engine.clear_stats
76
76
  start = ((Time.now - 1).to_f * 1_000_000).to_i
77
77
  NewRelic::Agent::AgentTestController.set_some_headers 'HTTP_X_QUEUE_START'=> "t=#{start}"
@@ -79,7 +79,7 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
79
79
 
80
80
  check_metric_time('WebFrontend/QueueTime', 1, 0.1)
81
81
  end
82
-
82
+
83
83
 
84
84
  def test_new_middleware_integration
85
85
  engine.clear_stats
@@ -91,7 +91,7 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
91
91
  end
92
92
 
93
93
  def test_new_server_time_integration
94
- NewRelic::Agent::AgentTestController.clear_headers
94
+ NewRelic::Agent::AgentTestController.clear_headers
95
95
  engine.clear_stats
96
96
  start = ((Time.now - 1).to_f * 1_000_000).to_i
97
97
  NewRelic::Agent::AgentTestController.set_some_headers 'HTTP_X_REQUEST_START'=> "t=#{start}"
@@ -107,13 +107,13 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
107
107
  NewRelic::Agent::AgentTestController.set_some_headers({
108
108
  'HTTP_X_REQUEST_START'=> "t=#{times[0]}", 'HTTP_X_QUEUE_START' => "t=#{times[1]}", 'HTTP_X_MIDDLEWARE_START' => "t=#{times[2]}"})
109
109
  get :index
110
-
111
-
110
+
111
+
112
112
  check_metric_time('WebFrontend/WebServer/all', 1, 0.1)
113
113
  check_metric_time('Middleware/all', 1, 0.1)
114
- check_metric_time('WebFrontend/QueueTime', 1, 0.1)
114
+ check_metric_time('WebFrontend/QueueTime', 1, 0.1)
115
115
  end
116
-
116
+
117
117
  def test_render_inline
118
118
  engine.clear_stats
119
119
  get :action_inline
@@ -126,7 +126,7 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
126
126
  get :action_to_ignore
127
127
  compare_metrics [], engine.metrics
128
128
  end
129
-
129
+
130
130
  def test_controller_rescued_error
131
131
  engine.clear_stats
132
132
  assert_raise RuntimeError do
@@ -149,7 +149,7 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
149
149
  assert_equal 1, score[2], 'failing'
150
150
  assert_equal 0, score[1], 'tol'
151
151
  assert_equal 0, score[0], 'satisfied'
152
-
152
+
153
153
  end
154
154
  def test_controller_error
155
155
  engine.clear_stats
@@ -226,7 +226,7 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
226
226
  end
227
227
  end
228
228
  assert_nil Thread.current[:newrelic_ignore_controller]
229
-
229
+
230
230
  end
231
231
  def test_metric__dispatched
232
232
  engine = @agent.stats_engine
@@ -247,7 +247,7 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
247
247
  # you might get here if you don't have the default route installed.
248
248
  end
249
249
  end
250
-
250
+
251
251
  def test_controller_params
252
252
  assert agent.transaction_sampler
253
253
  num_samples = NewRelic::Agent.instance.transaction_sampler.samples.length
@@ -257,7 +257,7 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
257
257
  assert_equal num_samples + 1, samples.length
258
258
  assert_equal "[FILTERED]", samples.last.params[:request_params]["social_security_number"]
259
259
  end
260
-
260
+
261
261
  def test_controller_params
262
262
  agent.transaction_sampler.reset!
263
263
  get :index, 'number' => "001-555-1212"
@@ -266,10 +266,10 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
266
266
  assert_equal 5, s.first.params.size
267
267
  end
268
268
 
269
-
269
+
270
270
  def test_busycalculation
271
271
  engine.clear_stats
272
-
272
+
273
273
  assert_equal 0, NewRelic::Agent::BusyCalculator.busy_count
274
274
  get :index, 'social_security_number' => "001-555-1212", 'wait' => '1.0'
275
275
  NewRelic::Agent::BusyCalculator.harvest_busy
@@ -280,7 +280,7 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
280
280
  assert stats('Instance/Busy').total_call_time > 0.5, stats('Instance/Busy').inspect
281
281
  assert_equal 0, stats('WebFrontend/Mongrel/Average Queue Time').call_count
282
282
  end
283
-
283
+
284
284
  def test_histogram
285
285
  engine.clear_stats
286
286
  get :index, 'social_security_number' => "001-555-1212"
@@ -294,18 +294,18 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
294
294
  engine.clear_stats
295
295
  queue_length_stat = stats('Mongrel/Queue Length')
296
296
  queue_time_stat = stats('WebFrontend/QueueTime')
297
-
297
+
298
298
  # no request start header
299
299
  get 'index'
300
300
  assert_equal 0, queue_length_stat.call_count
301
301
  end
302
302
 
303
303
  def test_queue_headers_apache
304
- NewRelic::Agent::AgentTestController.clear_headers
304
+ NewRelic::Agent::AgentTestController.clear_headers
305
305
  engine.clear_stats
306
306
  queue_length_stat = stats('Mongrel/Queue Length')
307
307
  queue_time_stat = stats('WebFrontend/QueueTime')
308
-
308
+
309
309
  # apache version of header
310
310
  request_start = ((Time.now.to_f - 0.5) * 1e6).to_i.to_s
311
311
  NewRelic::Agent::AgentTestController.set_some_headers({'HTTP_X_QUEUE_START' => "t=#{request_start}"})
@@ -317,13 +317,13 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
317
317
 
318
318
  end
319
319
  def test_queue_headers_heroku
320
-
320
+
321
321
  engine.clear_stats
322
- NewRelic::Agent::AgentTestController.clear_headers
322
+ NewRelic::Agent::AgentTestController.clear_headers
323
323
 
324
324
  queue_length_stat = stats('Mongrel/Queue Length')
325
325
  queue_time_stat = stats('WebFrontend/QueueTime')
326
-
326
+
327
327
  # heroku version
328
328
  request_start = ((Time.now.to_f - 0.5) * 1e6).to_i.to_s
329
329
  NewRelic::Agent::AgentTestController.set_some_headers({'HTTP_X_QUEUE_START' => "t=#{request_start}", 'HTTP_X_HEROKU_QUEUE_DEPTH' => '0'})
@@ -335,18 +335,18 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
335
335
  end
336
336
 
337
337
  def test_queue_headers_heroku_queue_length
338
-
338
+
339
339
  engine.clear_stats
340
340
  NewRelic::Agent::AgentTestController.clear_headers
341
-
341
+
342
342
  queue_length_stat = stats('Mongrel/Queue Length')
343
- queue_time_stat = stats('WebFrontend/QueueTime')
343
+ queue_time_stat = stats('WebFrontend/QueueTime')
344
344
 
345
345
  # heroku version with queue length > 0
346
346
  request_start = ((Time.now.to_f - 0.5) * 1e6).to_i.to_s
347
347
  NewRelic::Agent::AgentTestController.set_some_headers({'HTTP_X_QUEUE_START' => "t=#{request_start}", 'HTTP_X_HEROKU_QUEUE_DEPTH' => '3'})
348
348
  get :index
349
-
349
+
350
350
  assert_equal(1, queue_length_stat.call_count, 'queue should have been seen once')
351
351
  assert_equal(1, queue_time_stat.call_count, 'should have seen the queue header once')
352
352
  assert(queue_time_stat.total_call_time > 0.1, "Queue time should be longer than 100ms")
@@ -355,11 +355,11 @@ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
355
355
 
356
356
  NewRelic::Agent::AgentTestController.clear_headers
357
357
  end
358
-
358
+
359
359
  private
360
360
  def stats(name)
361
361
  engine.get_stats_no_scope(name)
362
362
  end
363
-
363
+
364
364
  end if defined? Rails
365
365