ghazel-newrelic_rpm 3.4.0.2 → 3.5.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (231) hide show
  1. data/.gitignore +21 -0
  2. data/.project +23 -0
  3. data/.travis.yml +9 -0
  4. data/CHANGELOG +180 -1
  5. data/GUIDELINES_FOR_CONTRIBUTING.md +73 -0
  6. data/Gemfile +16 -0
  7. data/InstallationNotes.md +15 -0
  8. data/LICENSE +1 -1
  9. data/{README.rdoc → README.md} +71 -55
  10. data/Rakefile +54 -0
  11. data/config.dot +290 -0
  12. data/config/database.yml +5 -0
  13. data/init.rb +38 -0
  14. data/lib/new_relic/agent.rb +9 -4
  15. data/lib/new_relic/agent/agent.rb +189 -230
  16. data/lib/new_relic/agent/beacon_configuration.rb +34 -48
  17. data/lib/new_relic/agent/browser_monitoring.rb +108 -61
  18. data/lib/new_relic/agent/busy_calculator.rb +12 -4
  19. data/lib/new_relic/agent/configuration.rb +49 -0
  20. data/lib/new_relic/agent/configuration/defaults.rb +89 -0
  21. data/lib/new_relic/agent/configuration/environment_source.rb +56 -0
  22. data/lib/new_relic/agent/configuration/manager.rb +116 -0
  23. data/lib/new_relic/agent/configuration/server_source.rb +27 -0
  24. data/lib/new_relic/agent/configuration/yaml_source.rb +61 -0
  25. data/lib/new_relic/agent/database.rb +37 -22
  26. data/lib/new_relic/agent/error_collector.rb +47 -43
  27. data/lib/new_relic/agent/instrumentation/active_record.rb +1 -5
  28. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +27 -6
  29. data/lib/new_relic/agent/instrumentation/data_mapper.rb +2 -10
  30. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +1 -1
  31. data/lib/new_relic/agent/instrumentation/memcache.rb +2 -2
  32. data/lib/new_relic/agent/instrumentation/metric_frame.rb +4 -14
  33. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +4 -18
  34. data/lib/new_relic/agent/instrumentation/rack.rb +1 -1
  35. data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +3 -3
  36. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +2 -2
  37. data/lib/new_relic/agent/instrumentation/rails3/errors.rb +5 -1
  38. data/lib/new_relic/agent/instrumentation/resque.rb +1 -1
  39. data/lib/new_relic/agent/instrumentation/sinatra.rb +14 -10
  40. data/lib/new_relic/agent/instrumentation/unicorn_instrumentation.rb +4 -3
  41. data/lib/new_relic/agent/method_tracer.rb +5 -1
  42. data/lib/new_relic/agent/new_relic_service.rb +231 -61
  43. data/lib/new_relic/agent/pipe_channel_manager.rb +37 -23
  44. data/lib/new_relic/agent/pipe_service.rb +5 -1
  45. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +2 -5
  46. data/lib/new_relic/agent/samplers/memory_sampler.rb +2 -2
  47. data/lib/new_relic/agent/sql_sampler.rb +44 -68
  48. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +40 -24
  49. data/lib/new_relic/agent/stats_engine/metric_stats.rb +89 -14
  50. data/lib/new_relic/agent/stats_engine/samplers.rb +7 -3
  51. data/lib/new_relic/agent/stats_engine/transactions.rb +19 -11
  52. data/lib/new_relic/agent/thread.rb +27 -0
  53. data/lib/new_relic/agent/thread_profiler.rb +295 -0
  54. data/lib/new_relic/agent/transaction_info.rb +24 -4
  55. data/lib/new_relic/agent/transaction_sample_builder.rb +11 -11
  56. data/lib/new_relic/agent/transaction_sampler.rb +51 -61
  57. data/lib/new_relic/agent/worker_loop.rb +29 -15
  58. data/lib/new_relic/collection_helper.rb +1 -1
  59. data/lib/new_relic/commands/deployments.rb +19 -10
  60. data/lib/new_relic/control.rb +0 -1
  61. data/lib/new_relic/control/class_methods.rb +2 -3
  62. data/lib/new_relic/control/frameworks/rails.rb +24 -18
  63. data/lib/new_relic/control/frameworks/rails3.rb +18 -1
  64. data/lib/new_relic/control/frameworks/ruby.rb +2 -2
  65. data/lib/new_relic/control/instance_methods.rb +36 -53
  66. data/lib/new_relic/control/logging_methods.rb +5 -23
  67. data/lib/new_relic/control/server_methods.rb +11 -13
  68. data/lib/new_relic/delayed_job_injection.rb +1 -1
  69. data/lib/new_relic/helper.rb +13 -0
  70. data/lib/new_relic/language_support.rb +19 -22
  71. data/lib/new_relic/local_environment.rb +2 -3
  72. data/lib/new_relic/metric_data.rb +10 -2
  73. data/lib/new_relic/metric_spec.rb +6 -2
  74. data/lib/new_relic/noticed_error.rb +24 -9
  75. data/lib/new_relic/rack.rb +4 -0
  76. data/lib/new_relic/rack/browser_monitoring.rb +28 -10
  77. data/lib/new_relic/rack/developer_mode.rb +3 -0
  78. data/lib/new_relic/rack/error_collector.rb +56 -0
  79. data/lib/new_relic/transaction_sample.rb +23 -13
  80. data/lib/new_relic/transaction_sample/segment.rb +13 -15
  81. data/lib/new_relic/version.rb +3 -3
  82. data/lib/tasks/tests.rake +8 -8
  83. data/newrelic.yml +15 -32
  84. data/newrelic_rpm.gemspec +158 -38
  85. data/newrelic_rpm.gemspec.erb +55 -0
  86. data/test/config/newrelic.yml +3 -2
  87. data/test/intentional_fail.rb +10 -0
  88. data/test/multiverse/.gitignore +10 -0
  89. data/test/multiverse/README.md +90 -0
  90. data/test/multiverse/Rakefile +17 -0
  91. data/test/multiverse/lib/multiverse/color.rb +13 -0
  92. data/test/multiverse/lib/multiverse/envfile.rb +66 -0
  93. data/test/multiverse/lib/multiverse/environment.rb +16 -0
  94. data/test/multiverse/lib/multiverse/output_collector.rb +29 -0
  95. data/test/multiverse/lib/multiverse/runner.rb +44 -0
  96. data/test/multiverse/lib/multiverse/suite.rb +162 -0
  97. data/test/multiverse/script/run_one +3 -0
  98. data/test/multiverse/script/runner +9 -0
  99. data/test/multiverse/suites/active_record/Envfile +13 -0
  100. data/test/multiverse/suites/active_record/ar_method_aliasing.rb +94 -0
  101. data/test/multiverse/suites/active_record/config/newrelic.yml +22 -0
  102. data/test/multiverse/suites/active_record/encoding_test.rb +26 -0
  103. data/test/multiverse/suites/agent_only/Envfile +3 -0
  104. data/test/multiverse/suites/agent_only/config/newrelic.yml +22 -0
  105. data/test/multiverse/suites/agent_only/http_response_code_test.rb +53 -0
  106. data/test/multiverse/suites/agent_only/marshaling_test.rb +109 -0
  107. data/test/multiverse/suites/agent_only/method_visibility_test.rb +98 -0
  108. data/test/multiverse/suites/agent_only/pipe_manager_test.rb +33 -0
  109. data/test/multiverse/suites/agent_only/service_timeout_test.rb +29 -0
  110. data/test/multiverse/suites/agent_only/test_trace_method_with_punctuation.rb +30 -0
  111. data/test/multiverse/suites/agent_only/test_trace_transaction_with_punctuation.rb +32 -0
  112. data/test/multiverse/suites/agent_only/thread_profiling_test.rb +80 -0
  113. data/test/multiverse/suites/datamapper/Envfile +8 -0
  114. data/test/multiverse/suites/datamapper/config/newrelic.yml +22 -0
  115. data/test/multiverse/suites/datamapper/encoding_test.rb +36 -0
  116. data/test/multiverse/suites/monitor_mode_false/Envfile +2 -0
  117. data/test/multiverse/suites/monitor_mode_false/config/newrelic.yml +25 -0
  118. data/test/multiverse/suites/monitor_mode_false/no_dns_resolv.rb +29 -0
  119. data/test/multiverse/suites/no_load/Envfile +2 -0
  120. data/test/multiverse/suites/no_load/config/newrelic.yml +23 -0
  121. data/test/multiverse/suites/no_load/start_up_test.rb +14 -0
  122. data/test/multiverse/suites/rails_3_error_tracing/Envfile +15 -0
  123. data/test/multiverse/suites/rails_3_error_tracing/config/newrelic.yml +165 -0
  124. data/test/multiverse/suites/rails_3_error_tracing/error_tracing_test.rb +236 -0
  125. data/test/multiverse/suites/rails_3_gc/Envfile +8 -0
  126. data/test/multiverse/suites/rails_3_gc/config/newrelic.yml +167 -0
  127. data/test/multiverse/suites/rails_3_gc/instrumentation_test.rb +92 -0
  128. data/test/multiverse/suites/rails_3_queue_time/Envfile +15 -0
  129. data/test/multiverse/suites/rails_3_queue_time/config/newrelic.yml +165 -0
  130. data/test/multiverse/suites/rails_3_queue_time/queue_time_test.rb +75 -0
  131. data/test/multiverse/suites/rails_3_views/.gitignore +3 -0
  132. data/test/multiverse/suites/rails_3_views/Envfile +16 -0
  133. data/test/multiverse/suites/rails_3_views/app/views/foos/_foo.html.haml +1 -0
  134. data/test/multiverse/suites/rails_3_views/app/views/test/_a_partial.html.erb +1 -0
  135. data/test/multiverse/suites/rails_3_views/app/views/test/_mid_partial.html.erb +1 -0
  136. data/test/multiverse/suites/rails_3_views/app/views/test/_top_partial.html.erb +3 -0
  137. data/test/multiverse/suites/rails_3_views/app/views/test/deep_partial.html.erb +3 -0
  138. data/test/multiverse/suites/rails_3_views/app/views/test/haml_view.html.haml +6 -0
  139. data/test/multiverse/suites/rails_3_views/app/views/test/index.html.erb +4 -0
  140. data/test/multiverse/suites/rails_3_views/config/newrelic.yml +164 -0
  141. data/test/multiverse/suites/rails_3_views/view_instrumentation_test.rb +245 -0
  142. data/test/multiverse/suites/resque/Envfile +21 -0
  143. data/test/multiverse/suites/resque/config/newrelic.yml +22 -0
  144. data/test/multiverse/suites/resque/dump.rdb +0 -0
  145. data/test/multiverse/suites/resque/instrumentation_test.rb +73 -0
  146. data/test/multiverse/suites/rum_auto_instrumentation/Envfile +4 -0
  147. data/test/multiverse/suites/rum_auto_instrumentation/config/newrelic.yml +24 -0
  148. data/test/multiverse/suites/rum_auto_instrumentation/problem_response.html +422 -0
  149. data/test/multiverse/suites/rum_auto_instrumentation/responses/worst_case_small.html +5000 -0
  150. data/test/multiverse/suites/rum_auto_instrumentation/sanity_test.rb +115 -0
  151. data/test/multiverse/suites/sinatra/Envfile +13 -0
  152. data/test/multiverse/suites/sinatra/config/newrelic.yml +24 -0
  153. data/test/multiverse/suites/sinatra/sinatra_metric_explosion_test.rb +76 -0
  154. data/test/multiverse/suites/sinatra/sinatra_routes_test.rb +46 -0
  155. data/test/multiverse/test/multiverse_test.rb +55 -0
  156. data/test/multiverse/test/suite_examples/one/a/Envfile +3 -0
  157. data/test/multiverse/test/suite_examples/one/a/a_test.rb +11 -0
  158. data/test/multiverse/test/suite_examples/one/a/config/newrelic.yml +24 -0
  159. data/test/multiverse/test/suite_examples/one/b/Envfile +3 -0
  160. data/test/multiverse/test/suite_examples/one/b/b_test.rb +11 -0
  161. data/test/multiverse/test/suite_examples/one/b/config/newrelic.yml +24 -0
  162. data/test/multiverse/test/suite_examples/three/a/Envfile +2 -0
  163. data/test/multiverse/test/suite_examples/three/a/fail_test.rb +6 -0
  164. data/test/multiverse/test/suite_examples/three/b/Envfile +2 -0
  165. data/test/multiverse/test/suite_examples/three/b/win_test.rb +6 -0
  166. data/test/multiverse/test/suite_examples/two/a/Envfile +1 -0
  167. data/test/multiverse/test/suite_examples/two/a/fail_test.rb +6 -0
  168. data/test/new_relic/agent/agent/connect_test.rb +134 -164
  169. data/test/new_relic/agent/agent/start_test.rb +111 -81
  170. data/test/new_relic/agent/agent/start_worker_thread_test.rb +6 -33
  171. data/test/new_relic/agent/agent_test.rb +88 -9
  172. data/test/new_relic/agent/agent_test_controller.rb +1 -1
  173. data/test/new_relic/agent/agent_test_controller_test.rb +42 -10
  174. data/test/new_relic/agent/beacon_configuration_test.rb +63 -67
  175. data/test/new_relic/agent/browser_monitoring_test.rb +150 -79
  176. data/test/new_relic/agent/configuration/environment_source_test.rb +74 -0
  177. data/test/new_relic/agent/configuration/manager_test.rb +149 -0
  178. data/test/new_relic/agent/configuration/server_source_test.rb +45 -0
  179. data/test/new_relic/agent/configuration/yaml_source_test.rb +56 -0
  180. data/test/new_relic/agent/error_collector/notice_error_test.rb +63 -50
  181. data/test/new_relic/agent/error_collector_test.rb +22 -12
  182. data/test/new_relic/agent/instrumentation/active_record_instrumentation_test.rb +21 -11
  183. data/test/new_relic/agent/instrumentation/metric_frame_test.rb +6 -0
  184. data/test/new_relic/agent/instrumentation/task_instrumentation_test.rb +2 -2
  185. data/test/new_relic/agent/method_tracer/class_methods/add_method_tracer_test.rb +5 -5
  186. data/test/new_relic/agent/method_tracer_test.rb +6 -6
  187. data/test/new_relic/agent/mock_scope_listener.rb +3 -0
  188. data/test/new_relic/agent/new_relic_service_test.rb +208 -23
  189. data/test/new_relic/agent/pipe_channel_manager_test.rb +34 -17
  190. data/test/new_relic/agent/rpm_agent_test.rb +27 -23
  191. data/test/new_relic/agent/sql_sampler_test.rb +81 -56
  192. data/test/new_relic/agent/stats_engine/metric_stats/harvest_test.rb +3 -20
  193. data/test/new_relic/agent/stats_engine/metric_stats_test.rb +12 -1
  194. data/test/new_relic/agent/stats_engine_test.rb +17 -8
  195. data/test/new_relic/agent/thread_profiler_test.rb +536 -0
  196. data/test/new_relic/agent/thread_test.rb +76 -0
  197. data/test/new_relic/agent/threaded_test.rb +65 -0
  198. data/test/new_relic/agent/transaction_info_test.rb +45 -4
  199. data/test/new_relic/agent/transaction_sample_builder_test.rb +8 -6
  200. data/test/new_relic/agent/transaction_sampler_test.rb +193 -204
  201. data/test/new_relic/agent/worker_loop_test.rb +20 -0
  202. data/test/new_relic/agent_test.rb +69 -41
  203. data/test/new_relic/collection_helper_test.rb +7 -8
  204. data/test/new_relic/command/deployments_test.rb +18 -2
  205. data/test/new_relic/control/frameworks/rails_test.rb +26 -0
  206. data/test/new_relic/control/logging_methods_test.rb +78 -52
  207. data/test/new_relic/control_test.rb +91 -129
  208. data/test/new_relic/fake_collector.rb +103 -31
  209. data/test/new_relic/fake_service.rb +8 -2
  210. data/test/new_relic/load_test.rb +13 -0
  211. data/test/new_relic/local_environment_test.rb +7 -10
  212. data/test/new_relic/metric_data_test.rb +45 -16
  213. data/test/new_relic/noticed_error_test.rb +14 -0
  214. data/test/new_relic/rack/browser_monitoring_test.rb +15 -9
  215. data/test/new_relic/rack/developer_mode_test.rb +13 -7
  216. data/test/new_relic/rack/error_collector_test.rb +74 -0
  217. data/test/new_relic/transaction_sample/segment_test.rb +23 -4
  218. data/test/new_relic/transaction_sample_test.rb +47 -2
  219. data/test/script/build_test_gem.sh +9 -3
  220. data/test/script/ci.sh +48 -21
  221. data/test/script/ci_multiverse_runner.sh +11 -11
  222. data/test/test_helper.rb +37 -18
  223. data/ui/helpers/developer_mode_helper.rb +21 -11
  224. data/ui/views/layouts/newrelic_default.rhtml +1 -0
  225. data/ui/views/newrelic/show_sample.rhtml +1 -1
  226. data/ui/views/newrelic/threads.rhtml +2 -10
  227. data/vendor/gems/metric_parser-0.1.0.pre1/.specification +116 -0
  228. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet_init.rb +7 -0
  229. metadata +132 -58
  230. data/lib/new_relic/control/configuration.rb +0 -206
  231. data/test/new_relic/control/configuration_test.rb +0 -77
@@ -0,0 +1,6 @@
1
+ require 'test/unit'
2
+ class ATest < Test::Unit::TestCase
3
+ def test_failure
4
+ fail "This test is failing!!!"
5
+ end
6
+ end
@@ -4,7 +4,7 @@ require 'ostruct'
4
4
 
5
5
  class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
6
6
  include NewRelic::Agent::Agent::Connect
7
-
7
+
8
8
  def setup
9
9
  @connected = nil
10
10
  @keep_retrying = nil
@@ -14,6 +14,7 @@ class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
14
14
  @sql_sampler = NewRelic::Agent::SqlSampler.new
15
15
  server = NewRelic::Control::Server.new('localhost', 30303)
16
16
  @service = NewRelic::Agent::NewRelicService.new('abcdef', server)
17
+ log.stubs(:warn => true, :info => true, :debug => true)
17
18
  end
18
19
 
19
20
  def control
@@ -120,55 +121,44 @@ class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
120
121
  end
121
122
 
122
123
  def test_log_seed_token
123
- fake_control = mocked_control
124
- fake_control.expects(:validate_seed).times(2).returns("many seeds")
125
- fake_control.expects(:validate_token).once.returns("a token, man")
126
- log.expects(:debug).with("Connecting with validation seed/token: many seeds/a token, man").once
127
- log_seed_token
124
+ with_config(:validate_seed => 'many seeds', :validate_token => 'a token, man') do
125
+ log.expects(:debug).with("Connecting with validation seed/token: many seeds/a token, man").once
126
+ log_seed_token
127
+ end
128
128
  end
129
129
 
130
130
  def test_no_seed_token
131
- fake_control = mocked_control
132
- fake_control.expects(:validate_seed).once.returns(nil)
133
- log.expects(:debug).never
134
- log_seed_token
131
+ with_config(:validate_seed => false) do
132
+ log.expects(:debug).never
133
+ log_seed_token
134
+ end
135
135
  end
136
136
 
137
- def mocks_for_positive_environment_for_connect(value_for_control)
138
- control = mocked_control
139
- control.expects(:'[]').with('send_environment_info').once.returns(value_for_control)
137
+ def test_environment_for_connect_positive
140
138
  fake_env = mock('local_env')
141
139
  fake_env.expects(:snapshot).once.returns("snapshot")
142
- control.expects(:local_env).once.returns(fake_env)
143
- end
144
-
145
- def test_environment_for_connect_nil
146
- mocks_for_positive_environment_for_connect(nil)
147
- assert_equal 'snapshot', environment_for_connect
148
- end
149
-
150
- def test_environment_for_connect_positive
151
- mocks_for_positive_environment_for_connect(true)
152
- assert_equal 'snapshot', environment_for_connect
140
+ NewRelic::Control.instance.expects(:local_env).once.returns(fake_env)
141
+ with_config(:send_environment_info => true) do
142
+ assert_equal 'snapshot', environment_for_connect
143
+ end
153
144
  end
154
145
 
155
146
  def test_environment_for_connect_negative
156
- control = mocked_control
157
- control.expects(:'[]').with('send_environment_info').once.returns(false)
158
- assert_equal [], environment_for_connect
147
+ with_config(:send_environment_info => false) do
148
+ assert_equal [], environment_for_connect
149
+ end
159
150
  end
160
151
 
161
152
  def test_validate_settings
162
- control = mocked_control
163
- control.expects(:validate_seed).once
164
- control.expects(:validate_token).once
165
- assert_equal({:seed => nil, :token => nil}, validate_settings)
153
+ with_config(:validate_seed => 'seed', :validate_token => 'token') do
154
+ assert_equal 'seed', NewRelic::Agent.instance.validate_settings[:seed]
155
+ assert_equal 'token', NewRelic::Agent.instance.validate_settings[:token]
156
+ end
166
157
  end
167
158
 
168
159
  def test_connect_settings
169
160
  control = mocked_control
170
- control.expects(:app_names)
171
- control.expects(:settings)
161
+ NewRelic::Agent.config.expects(:app_names)
172
162
  self.expects(:validate_settings)
173
163
  self.expects(:environment_for_connect)
174
164
  keys = %w(pid host app_name language agent_version environment settings validate)
@@ -179,162 +169,111 @@ class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
179
169
  end
180
170
 
181
171
  def test_configure_error_collector_base
182
- fake_collector = mocked_error_collector
183
- fake_collector.expects(:config_enabled).returns(false)
184
- fake_collector.expects(:enabled=).with(false)
185
- log.expects(:debug).with("Errors will not be sent to the New Relic service.")
186
- configure_error_collector!(false)
172
+ error_collector = NewRelic::Agent::ErrorCollector.new
173
+ NewRelic::Control.instance.log.stubs(:debug)
174
+ NewRelic::Control.instance.log.expects(:debug) \
175
+ .with("Errors will not be sent to the New Relic service.").at_least_once
176
+ with_config(:'error_collector.enabled' => false) do
177
+ # noop
178
+ end
187
179
  end
188
180
 
189
181
  def test_configure_error_collector_enabled
190
- fake_collector = mocked_error_collector
191
- fake_collector.expects(:config_enabled).returns(true)
192
- fake_collector.expects(:enabled=).with(true)
193
- log.expects(:debug).with("Errors will be sent to the New Relic service.")
194
- configure_error_collector!(true)
182
+ with_config(:'error_collector.enabled' => false) do
183
+ error_collector = NewRelic::Agent::ErrorCollector.new
184
+ NewRelic::Control.instance.log.stubs(:debug)
185
+ NewRelic::Control.instance.log.expects(:debug) \
186
+ .with("Errors will be sent to the New Relic service.").at_least_once
187
+ with_config(:'error_collector.enabled' => true) do
188
+ # noop
189
+ end
190
+ end
195
191
  end
196
192
 
197
193
  def test_configure_error_collector_server_disabled
198
- fake_collector = mocked_error_collector
199
- fake_collector.expects(:config_enabled).returns(true)
200
- fake_collector.expects(:enabled=).with(false)
201
- log.expects(:debug).with("Errors will not be sent to the New Relic service.")
202
- configure_error_collector!(false)
203
- end
204
-
205
- def test_enable_random_samples
206
- sampling_rate = 10
207
- ts = @transaction_sampler = mock('ts')
208
- ts.expects(:random_sampling=).with(true)
209
- ts.expects(:sampling_rate=).with(sampling_rate)
210
- ts.expects(:sampling_rate).returns(sampling_rate)
211
- log.expects(:info).with("Transaction sampling enabled, rate = 10")
212
- enable_random_samples!(sampling_rate)
213
- end
214
-
215
- def test_enable_random_samples_with_no_sampling_rate
216
- # testing that we set a sane default for sampling rate
217
- sampling_rate = 0
218
- ts = @transaction_sampler = mock('ts')
219
- ts.expects(:random_sampling=).with(true)
220
- ts.expects(:sampling_rate=).with(10)
221
- ts.expects(:sampling_rate).returns(10)
222
- log.expects(:info).with("Transaction sampling enabled, rate = 10")
223
- enable_random_samples!(sampling_rate)
224
- end
225
-
226
- def test_config_transaction_tracer
227
- NewRelic::Control.instance.settings['transaction_tracer'] = {
228
- 'enabled' => true,
229
- 'random_sample' => false,
230
- 'explain_threshold' => 0.75,
231
- 'explain_enabled' => true
232
- }
233
-
234
- config_transaction_tracer
235
-
236
- assert @transaction_sampler.enabled?
237
- assert_equal 0.75, @transaction_sampler.explain_threshold
238
- assert @transaction_sampler.explain_enabled
239
- # assert_equal 1.5, @transaction_sampler.transaction_threshold
194
+ error_collector = NewRelic::Agent::ErrorCollector.new
195
+ NewRelic::Control.instance.log.stubs(:debug)
196
+ NewRelic::Control.instance.log.expects(:debug) \
197
+ .with("Errors will not be sent to the New Relic service.").at_least_once
198
+ config = NewRelic::Agent::Configuration::ServerSource.new('collect_errors' => false)
199
+ with_config(config) do
200
+ # noop
201
+ end
240
202
  end
241
203
 
242
204
  def test_configure_transaction_tracer_with_random_sampling
243
- @config_should_send_samples = true
244
- @should_send_random_samples = true
245
- @slowest_transaction_threshold = 5
246
- log.stubs(:debug)
247
- self.expects(:enable_random_samples!).with(10)
248
- configure_transaction_tracer!(true, 10)
249
- assert @should_send_samples
250
- assert_equal 5, @transaction_sampler.slow_capture_threshold
205
+ with_config(:'transaction_tracer.transaction_threshold' => 5,
206
+ :'transaction_tracer.random_sample' => true) do
207
+ log.stubs(:debug)
208
+ sample = TransactionSampleTestHelper.make_sql_transaction
209
+ @transaction_sampler.store_sample(sample)
210
+
211
+ assert_equal sample, @transaction_sampler.instance_variable_get(:@random_sample)
212
+ end
251
213
  end
252
214
 
253
215
  def test_configure_transaction_tracer_positive
254
- @config_should_send_samples = true
255
- @slowest_transaction_threshold = 5
256
- log.stubs(:debug)
257
- configure_transaction_tracer!(true, 10)
258
- assert @should_send_samples
259
- assert_equal 5, @transaction_sampler.slow_capture_threshold
216
+ with_config(:'transaction_tracer.enabled' => true) do
217
+ assert @transaction_sampler.enabled?
218
+ end
260
219
  end
261
220
 
262
221
  def test_configure_transaction_tracer_negative
263
- @config_should_send_samples = false
264
- log.expects(:debug).with('Transaction traces will not be sent to the New Relic service.')
265
- configure_transaction_tracer!(true, 10)
266
- assert !@should_send_samples
222
+ with_config(:'transaction_tracer.enabled' => false) do
223
+ assert @transaction_sampler.enabled?
224
+ end
267
225
  end
268
226
 
269
227
  def test_configure_transaction_tracer_server_disabled
270
- @config_should_send_samples = true
228
+ @transaction_sampler.stubs(:log).returns(log)
229
+ log.stubs(:debug)
271
230
  log.expects(:debug).with('Transaction traces will not be sent to the New Relic service.')
272
- configure_transaction_tracer!(false, 10)
273
- assert !@should_send_samples
231
+ config = NewRelic::Agent::Configuration::ServerSource.new('collect_traces' => false,
232
+ 'developer_mode' => false)
233
+ with_config(config) do
234
+ assert !@transaction_sampler.enabled?
235
+ end
274
236
  end
275
237
 
276
238
  def test_apdex_f
277
- NewRelic::Control.instance.expects(:apdex_t).returns(10)
278
- assert_equal 40, apdex_f
279
- end
280
-
281
- def test_apdex_f_threshold_positive
282
- NewRelic::Control.instance.settings['transaction_tracer'] = { 'transaction_threshold' => 'apdex_f' }
283
- assert apdex_f_threshold?
284
- end
285
-
286
- def test_apdex_f_threshold_negative
287
- NewRelic::Control.instance.settings['transaction_tracer'] = { 'transaction_threshold' => 'WHEE' }
288
- assert !apdex_f_threshold?
239
+ with_config(:apdex_t => 10) do
240
+ assert_equal 40, apdex_f
241
+ end
289
242
  end
290
243
 
291
244
  def test_set_sql_recording_default
292
- NewRelic::Control.instance.settings['transaction_tracer'] = { }
293
- self.expects(:log_sql_transmission_warning?)
294
- set_sql_recording!
295
- assert_equal :obfuscated, @record_sql, " should default to :obfuscated, was #{@record_sql}"
245
+ with_config(:'transaction_tracer.record_sql' => 'obfuscated') do
246
+ assert_equal(:obfuscated, NewRelic::Agent::Database.record_sql_method,
247
+ "should default to :obfuscated, was #{NewRelic::Agent::Database.record_sql_method}")
248
+ end
296
249
  end
297
250
 
298
251
  def test_set_sql_recording_off
299
- NewRelic::Control.instance.settings['transaction_tracer'] = {'record_sql' => 'off'}
300
- self.expects(:log_sql_transmission_warning?)
301
- set_sql_recording!
302
- assert_equal :off, @record_sql, "should be set to :off, was #{@record_sql}"
252
+ with_config(:'transaction_tracer.record_sql' => 'off') do
253
+ assert_equal(:off, NewRelic::Agent::Database.record_sql_method,
254
+ "should be set to :off, was #{NewRelic::Agent::Database.record_sql_method}")
255
+ end
303
256
  end
304
257
 
305
258
  def test_set_sql_recording_none
306
- NewRelic::Control.instance.settings['transaction_tracer'] = {'record_sql' => 'none'}
307
- self.expects(:log_sql_transmission_warning?)
308
- set_sql_recording!
309
- assert_equal :off, @record_sql, "should be set to :off, was #{@record_sql}"
259
+ with_config(:'transaction_tracer.record_sql' => 'none') do
260
+ assert_equal(:off, NewRelic::Agent::Database.record_sql_method,
261
+ "should be set to :off, was #{NewRelic::Agent::Database.record_sql_method}")
262
+ end
310
263
  end
311
264
 
312
265
  def test_set_sql_recording_raw
313
- NewRelic::Control.instance.settings['transaction_tracer'] = {'record_sql' => 'raw'}
314
- self.expects(:log_sql_transmission_warning?)
315
- set_sql_recording!
316
- assert_equal :raw, @record_sql, "should be set to :raw, was #{@record_sql}"
266
+ with_config(:'transaction_tracer.record_sql' => 'raw') do
267
+ assert_equal(:raw, NewRelic::Agent::Database.record_sql_method,
268
+ "should be set to :raw, was #{NewRelic::Agent::Database.record_sql_method}")
269
+ end
317
270
  end
318
271
 
319
272
  def test_set_sql_recording_falsy
320
- NewRelic::Control.instance.settings['transaction_tracer'] = {'record_sql' => false}
321
- self.expects(:log_sql_transmission_warning?)
322
- set_sql_recording!
323
- assert_equal :off, @record_sql, "should be set to :off, was #{@record_sql}"
324
- end
325
-
326
- def test_log_sql_transmission_warning_negative
327
- log = mocked_log
328
- @record_sql = :obfuscated
329
- log.expects(:warn).never
330
- log_sql_transmission_warning?
331
- end
332
-
333
- def test_log_sql_transmission_warning_positive
334
- log = mocked_log
335
- @record_sql = :raw
336
- log.expects(:warn).with('Agent is configured to send raw SQL to the service')
337
- log_sql_transmission_warning?
273
+ with_config(:'transaction_tracer.record_sql' => false) do
274
+ assert_equal(:off, NewRelic::Agent::Database.record_sql_method,
275
+ "should be set to :off, was #{NewRelic::Agent::Database.record_sql_method}")
276
+ end
338
277
  end
339
278
 
340
279
  def test_query_server_for_configuration
@@ -344,9 +283,9 @@ class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
344
283
  end
345
284
 
346
285
  def test_connect_to_server_gets_config_from_collector
286
+ NewRelic::Agent.manual_start
347
287
  service = NewRelic::FakeService.new
348
288
  NewRelic::Agent::Agent.instance.service = service
349
- NewRelic::Agent.manual_start
350
289
  service.mock['connect'] = {'agent_run_id' => 23, 'config' => 'a lot'}
351
290
 
352
291
  response = NewRelic::Agent.agent.connect_to_server
@@ -360,23 +299,38 @@ class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
360
299
  def test_finish_setup
361
300
  config = {
362
301
  'agent_run_id' => 'fishsticks',
363
- 'data_report_period' => 'pasta sauce',
364
- 'url_rules' => 'tamales',
365
302
  'collect_traces' => true,
366
303
  'collect_errors' => true,
367
- 'sample_rate' => 10
304
+ 'sample_rate' => 10,
305
+ 'agent_config' => { 'transaction_tracer.record_sql' => 'raw' }
368
306
  }
369
- NewRelic::Control.instance.settings['transaction_tracer'] = {'enabled' => true}
370
307
  self.expects(:log_connection!).with(config)
371
- self.expects(:configure_transaction_tracer!).with(true, 10)
372
- self.expects(:configure_error_collector!).with(true)
373
308
  @transaction_sampler = stub('transaction sampler', :configure! => true,
374
309
  :config => {})
375
- @sql_sampler = stub('sql sampler', :configure! => true)
376
- finish_setup(config)
377
- assert_equal 'fishsticks', @service.agent_id
378
- assert_equal 'pasta sauce', @report_period
379
- assert_equal 'tamales', @url_rules
310
+ @sql_sampler = stub('sql sampler', :configure! => true)
311
+ with_config(:'transaction_tracer.enabled' => true) do
312
+ finish_setup(config)
313
+ assert_equal 'fishsticks', @service.agent_id
314
+ assert_equal 'raw', NewRelic::Agent.config[:'transaction_tracer.record_sql']
315
+ end
316
+ end
317
+
318
+ def test_logging_collector_messages
319
+ NewRelic::Agent.manual_start
320
+ service = NewRelic::FakeService.new
321
+ NewRelic::Agent::Agent.instance.service = service
322
+ service.mock['connect'] = {
323
+ 'agent_run_id' => 23, 'config' => 'a lot',
324
+ 'messages' => [{ 'message' => 'beep boop', 'level' => 'INFO' },
325
+ { 'message' => 'ha cha cha', 'level' => 'WARN' }]
326
+ }
327
+
328
+ NewRelic::Control.instance.log.stubs(:info)
329
+ NewRelic::Control.instance.log.expects(:info).with('beep boop')
330
+ NewRelic::Control.instance.log.expects(:warn).with('ha cha cha')
331
+
332
+ NewRelic::Agent.agent.query_server_for_configuration
333
+ NewRelic::Agent.shutdown
380
334
  end
381
335
 
382
336
  def test_finish_setup_without_config
@@ -385,6 +339,22 @@ class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
385
339
  assert_equal 'blah', @service.agent_id
386
340
  end
387
341
 
342
+ # no idea why this test leaks in Rails 2.0
343
+ # will be moved to a multiverse test eventually anyway
344
+ if !Rails::VERSION::STRING =~ /2\.0.*/
345
+ def test_set_apdex_t_from_server
346
+ service = NewRelic::FakeService.new
347
+ NewRelic::Agent::Agent.instance.service = service
348
+ service.mock['connect'] = { 'apdex_t' => 0.5 }
349
+ with_config(:sync_startup => true, :monitor_mode => true,
350
+ :license_key => 'a' * 40) do
351
+ NewRelic::Agent.manual_start
352
+ assert_equal 0.5, NewRelic::Agent.config[:apdex_t]
353
+ NewRelic::Agent.shutdown
354
+ end
355
+ end
356
+ end
357
+
388
358
  private
389
359
 
390
360
  def mocked_control
@@ -3,6 +3,16 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
3
3
  require 'new_relic/agent/agent'
4
4
  include NewRelic::Agent::Agent::Start
5
5
 
6
+ def setup
7
+ ENV['NEW_RELIC_APP_NAME'] = 'start_test'
8
+ NewRelic::Agent.reset_config
9
+ end
10
+
11
+ def teardown
12
+ ENV['NEW_RELIC_APP_NAME'] = nil
13
+ NewRelic::Agent.reset_config
14
+ end
15
+
6
16
  def test_already_started_positive
7
17
  control = mocked_control
8
18
  control.expects(:log!).with("Agent Started Already!", :error)
@@ -16,39 +26,64 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
16
26
  end
17
27
 
18
28
  def test_disabled_positive
19
- control = mocked_control
20
- control.expects(:agent_enabled?).returns(false)
21
- assert disabled?
29
+ with_config(:agent_enabled => false) do
30
+ assert disabled?
31
+ end
22
32
  end
23
33
 
24
34
  def test_disabled_negative
25
- control = mocked_control
26
- control.expects(:agent_enabled?).returns(true)
27
- assert !disabled?
35
+ with_config(:agent_enabled => true) do
36
+ assert !disabled?
37
+ end
28
38
  end
29
39
 
30
40
  def test_log_dispatcher_positive
31
- control = mocked_control
32
41
  log = mocked_log
33
- control.expects(:dispatcher).returns('Y U NO SERVE WEBPAGE')
34
- log.expects(:info).with("Dispatcher: Y U NO SERVE WEBPAGE")
35
- log_dispatcher
42
+ with_config(:dispatcher => 'Y U NO SERVE WEBPAGE') do
43
+ log.expects(:info).with("Dispatcher: Y U NO SERVE WEBPAGE")
44
+ log_dispatcher
45
+ end
36
46
  end
37
47
 
38
48
  def test_log_dispatcher_negative
39
- control = mocked_control
40
49
  log = mocked_log
41
- control.expects(:dispatcher).returns('')
42
- log.expects(:info).with("No dispatcher detected.")
43
- log_dispatcher
50
+ with_config(:dispatcher => '') do
51
+ log.expects(:info).with("No dispatcher detected.")
52
+ log_dispatcher
53
+ end
44
54
  end
45
55
 
46
- def test_log_app_names
47
- control = mocked_control
48
- log = mocked_log
49
- control.expects(:app_names).returns(%w(zam zam zabam))
50
- log.expects(:info).with("Application: zam, zam, zabam")
51
- log_app_names
56
+ def test_log_app_names_string
57
+ with_config(:app_name => 'zam;zam;zabam') do
58
+ log = mocked_log
59
+ log.expects(:info).with("Application: zam, zam, zabam")
60
+ log_app_names
61
+ end
62
+ end
63
+
64
+ def test_log_app_names_array
65
+ with_config(:app_name => ['zam', 'zam', 'zabam']) do
66
+ log = mocked_log
67
+ log.expects(:info).with("Application: zam, zam, zabam")
68
+ log_app_names
69
+ end
70
+ end
71
+
72
+ def test_log_app_names_with_env_var
73
+ # bad app name after env - used to cover the yaml config
74
+ with_config({:app_name => false}, 1) do
75
+ log = mocked_log
76
+ log.expects(:info).with("Application: start_test") # set in setup
77
+ log_app_names
78
+ end
79
+ end
80
+
81
+ def test_log_app_names_with_unknown
82
+ with_config(:app_name => false) do
83
+ log = mocked_log
84
+ log.expects(:error).with('Unable to determine application name. Please set the application name in your newrelic.yml or in a NEW_RELIC_APP_NAME environment variable.')
85
+ log_app_names
86
+ end
52
87
  end
53
88
 
54
89
  def test_check_config_and_start_agent_disabled
@@ -70,26 +105,20 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
70
105
  end
71
106
 
72
107
  def test_check_config_and_start_agent_normal
73
- self.expects(:monitoring?).returns(true)
74
- self.expects(:has_correct_license_key?).returns(true)
75
- self.expects(:using_forking_dispatcher?).returns(false)
76
- control = mocked_control
77
- control.expects(:sync_startup).returns(false)
78
108
  self.expects(:start_worker_thread)
79
109
  self.expects(:install_exit_handler)
80
- check_config_and_start_agent
110
+ with_config(:sync_startup => false, :monitor_mode => true, :license_key => 'a' * 40) do
111
+ check_config_and_start_agent
112
+ end
81
113
  end
82
114
 
83
115
  def test_check_config_and_start_agent_sync
84
- self.expects(:monitoring?).returns(true)
85
- self.expects(:has_correct_license_key?).returns(true)
86
- self.expects(:using_forking_dispatcher?).returns(false)
87
- control = mocked_control
88
- control.expects(:sync_startup).returns(true)
89
116
  self.expects(:connect_in_foreground)
90
117
  self.expects(:start_worker_thread)
91
118
  self.expects(:install_exit_handler)
92
- check_config_and_start_agent
119
+ with_config(:sync_startup => true, :monitor_mode => true, :license_key => 'a' * 40) do
120
+ check_config_and_start_agent
121
+ end
93
122
  end
94
123
 
95
124
  def test_connect_in_foreground
@@ -103,8 +132,6 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
103
132
  private :at_exit
104
133
 
105
134
  def test_install_exit_handler_positive
106
- control = mocked_control
107
- control.expects(:send_data_on_exit).returns(true)
108
135
  NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(false)
109
136
  NewRelic::LanguageSupport.expects(:using_engine?).with('jruby').returns(false)
110
137
  self.expects(:using_sinatra?).returns(false)
@@ -112,27 +139,30 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
112
139
  # test the shutdown logic. It's somewhat unfortunate, but we can't
113
140
  # kill the interpreter during a test.
114
141
  self.expects(:shutdown)
115
- install_exit_handler
142
+ with_config(:send_data_on_exit => true) do
143
+ install_exit_handler
144
+ end
116
145
  end
117
146
 
118
147
  def test_install_exit_handler_negative
119
- control = mocked_control
120
- control.expects(:send_data_on_exit).returns(false)
121
- install_exit_handler
148
+ with_config(:send_data_on_exit => false) do
149
+ install_exit_handler
150
+ end
151
+ # should not raise excpetion
122
152
  end
123
153
 
124
154
  def test_install_exit_handler_weird_ruby
125
- control = mocked_control
126
- control.expects(:send_data_on_exit).times(3).returns(true)
127
- NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(false)
128
- NewRelic::LanguageSupport.expects(:using_engine?).with('jruby').returns(false)
129
- self.expects(:using_sinatra?).returns(true)
130
- install_exit_handler
131
- NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(false)
132
- NewRelic::LanguageSupport.expects(:using_engine?).with('jruby').returns(true)
133
- install_exit_handler
134
- NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(true)
135
- install_exit_handler
155
+ with_config(:send_data_one_exit => true) do
156
+ NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(false)
157
+ NewRelic::LanguageSupport.expects(:using_engine?).with('jruby').returns(false)
158
+ self.expects(:using_sinatra?).returns(true)
159
+ install_exit_handler
160
+ NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(false)
161
+ NewRelic::LanguageSupport.expects(:using_engine?).with('jruby').returns(true)
162
+ install_exit_handler
163
+ NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(true)
164
+ install_exit_handler
165
+ end
136
166
  end
137
167
 
138
168
  def test_notify_log_file_location_positive
@@ -149,32 +179,32 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
149
179
  end
150
180
 
151
181
  def test_monitoring_positive
152
- control = mocked_control
153
- control.expects(:monitor_mode?).returns(true)
154
- log = mocked_log
155
- assert monitoring?
182
+ with_config(:monitor_mode => true) do
183
+ log = mocked_log
184
+ assert monitoring?
185
+ end
156
186
  end
157
187
 
158
188
  def test_monitoring_negative
159
- control = mocked_control
160
189
  log = mocked_log
161
- control.expects(:monitor_mode?).returns(false)
162
- log.expects(:send).with(:warn, "Agent configured not to send data in this environment - edit newrelic.yml to change this")
163
- assert !monitoring?
190
+ with_config(:monitor_mode => false) do
191
+ log.expects(:send).with(:warn, "Agent configured not to send data in this environment.")
192
+ assert !monitoring?
193
+ end
164
194
  end
165
195
 
166
196
  def test_has_license_key_positive
167
- control = mocked_control
168
- control.expects(:license_key).returns("a" * 40)
169
- assert has_license_key?
197
+ with_config(:license_key => 'a' * 40) do
198
+ assert has_license_key?
199
+ end
170
200
  end
171
201
 
172
202
  def test_has_license_key_negative
173
- control = mocked_control
174
- control.expects(:license_key).returns(nil)
175
- log = mocked_log
176
- log.expects(:send).with(:error, 'No license key found. Please edit your newrelic.yml file and insert your license key.')
177
- assert !has_license_key?
203
+ with_config(:license_key => false) do
204
+ log = mocked_log
205
+ log.expects(:send).with(:warn, 'No license key found in newrelic.yml config.')
206
+ assert !has_license_key?
207
+ end
178
208
  end
179
209
 
180
210
  def test_has_correct_license_key_positive
@@ -189,31 +219,31 @@ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
189
219
  end
190
220
 
191
221
  def test_correct_license_length_positive
192
- control = mocked_control
193
- control.expects(:license_key).returns("a" * 40)
194
- assert correct_license_length
222
+ with_config(:license_key => 'a' * 40) do
223
+ assert correct_license_length
224
+ end
195
225
  end
196
226
 
197
227
  def test_correct_license_length_negative
198
- control = mocked_control
199
- log = mocked_log
200
- control.expects(:license_key).returns("a"*30)
201
- log.expects(:send).with(:error, "Invalid license key: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
202
- assert !correct_license_length
228
+ with_config(:license_key => 'a' * 30) do
229
+ log = mocked_log
230
+ log.expects(:send).with(:error, "Invalid license key: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
231
+ assert !correct_license_length
232
+ end
203
233
  end
204
234
 
205
235
  def test_using_forking_dispatcher_positive
206
- control = mocked_control
207
- control.expects(:dispatcher).returns(:passenger)
208
- log = mocked_log
209
- log.expects(:send).with(:info, "Connecting workers after forking.")
210
- assert using_forking_dispatcher?
236
+ with_config(:dispatcher => :passenger) do
237
+ log = mocked_log
238
+ log.expects(:send).with(:info, "Connecting workers after forking.")
239
+ assert using_forking_dispatcher?
240
+ end
211
241
  end
212
242
 
213
243
  def test_using_forking_dispatcher_negative
214
- control = mocked_control
215
- control.expects(:dispatcher).returns(:frobnitz)
216
- assert !using_forking_dispatcher?
244
+ with_config(:dispatcher => :frobnitz) do
245
+ assert !using_forking_dispatcher?
246
+ end
217
247
  end
218
248
 
219
249
  def test_log_unless_positive