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
@@ -19,6 +19,23 @@ class NewRelic::Agent::WorkerLoopTest < Test::Unit::TestCase
19
19
  assert @x
20
20
  end
21
21
 
22
+ def test_with_duration
23
+ worker_loop = NewRelic::Agent::WorkerLoop.new(:duration => 0.1)
24
+ count = 0
25
+ worker_loop.run(0.04) do
26
+ count += 1
27
+ end
28
+
29
+ assert_equal 2, count
30
+ end
31
+
32
+ def test_loop_limit
33
+ worker_loop = NewRelic::Agent::WorkerLoop.new(:limit => 2)
34
+ iterations = 0
35
+ worker_loop.run(0) { iterations += 1 }
36
+ assert_equal 2, iterations
37
+ end
38
+
22
39
  def test_density
23
40
  # This shows how the tasks stay aligned with the period and don't drift.
24
41
  count = 0
@@ -33,6 +50,7 @@ class NewRelic::Agent::WorkerLoopTest < Test::Unit::TestCase
33
50
  elapsed = Time.now - start
34
51
  assert_in_delta 0.09, elapsed, 0.03
35
52
  end
53
+
36
54
  def test_task_error__standard
37
55
  @logger.expects(:debug)
38
56
  @logger.expects(:error)
@@ -45,6 +63,7 @@ class NewRelic::Agent::WorkerLoopTest < Test::Unit::TestCase
45
63
  end
46
64
  assert done
47
65
  end
66
+
48
67
  class BadBoy < StandardError; end
49
68
 
50
69
  def test_task_error__exception
@@ -55,6 +74,7 @@ class NewRelic::Agent::WorkerLoopTest < Test::Unit::TestCase
55
74
  raise BadBoy, "oops"
56
75
  end
57
76
  end
77
+
58
78
  def test_task_error__server
59
79
  @logger.expects(:error).never
60
80
  @logger.expects(:debug).once
@@ -3,7 +3,7 @@ require 'ostruct'
3
3
 
4
4
  module NewRelic
5
5
  class MainAgentTest < Test::Unit::TestCase
6
-
6
+
7
7
  # mostly this module just passes through to the active agent
8
8
  # through the agent method or the control instance through
9
9
  # NewRelic::Control.instance . But it's nice to make sure.
@@ -12,13 +12,42 @@ module NewRelic
12
12
  super
13
13
  Thread.current[:newrelic_untraced] = nil
14
14
  end
15
-
15
+
16
16
  def test_shutdown
17
17
  mock_agent = mocked_agent
18
18
  mock_agent.expects(:shutdown).with({})
19
19
  NewRelic::Agent.shutdown
20
20
  end
21
21
 
22
+ def test_shutdown_removes_manual_startup_config
23
+ NewRelic::Agent.manual_start(:some_absurd_setting => true)
24
+ assert NewRelic::Agent.config[:some_absurd_setting]
25
+ NewRelic::Agent.shutdown
26
+ assert !NewRelic::Agent.config[:some_absurd_setting]
27
+ end
28
+
29
+ def test_shutdown_removes_server_config
30
+ NewRelic::Agent.manual_start
31
+ NewRelic::Agent.instance.finish_setup('agent_config' =>
32
+ { :some_absurd_setting => true })
33
+ assert NewRelic::Agent.config[:some_absurd_setting]
34
+ NewRelic::Agent.shutdown
35
+ assert !NewRelic::Agent.config[:some_absurd_setting]
36
+ end
37
+
38
+ def test_finish_setup_applied_server_side_config
39
+ with_config({ :'transction_tracer.enabled' => true,
40
+ 'error_collector.enabled' => true,
41
+ :log_level => 'info' }, 2) do
42
+ NewRelic::Agent.instance.finish_setup('log_level' => 'debug',
43
+ 'agent_config' => { 'transaction_tracer.enabled' => false },
44
+ 'collect_errors' => false)
45
+ assert !NewRelic::Agent.config[:'transaction_tracer.enabled']
46
+ assert !NewRelic::Agent.config[:'error_collector.enabled']
47
+ assert_equal 'debug', NewRelic::Agent.config[:log_level]
48
+ end
49
+ end
50
+
22
51
  def test_after_fork
23
52
  mock_agent = mocked_agent
24
53
  mock_agent.expects(:after_fork).with({})
@@ -32,43 +61,42 @@ module NewRelic
32
61
 
33
62
  assert agent.forked?
34
63
  end
35
-
36
64
 
37
65
  if NewRelic::LanguageSupport.can_fork? &&
38
66
  !NewRelic::LanguageSupport.using_version?('1.9.1')
39
67
  def test_timeslice_harvest_with_after_fork_report_to_channel
40
- NewRelic::Control.instance.stubs(:agent_enabled?).returns(true)
41
- NewRelic::Control.instance.stubs(:monitor_mode?).returns(true)
42
-
43
- NewRelic::Agent::Agent.instance.service = NewRelic::FakeService.new
44
- NewRelic::Agent.shutdown # make sure the agent is not already started
45
- NewRelic::Agent.manual_start(:license_key => ('1234567890' * 4),
46
- :start_channel_listener => true)
47
-
48
- metric = 'Custom/test/method'
49
- NewRelic::Agent.instance.stats_engine.get_stats_no_scope(metric) \
50
- .record_data_point(1.0)
51
-
52
- # ensure that cached metric ids don't interfere with metric merging
53
- NewRelic::Agent.agent.instance_variable_set(:@metric_ids,
54
- {NewRelic::MetricSpec.new('Instance/Busy') => 1})
55
-
56
- NewRelic::Agent::PipeChannelManager.listener.close_all_pipes
57
- NewRelic::Agent.register_report_channel(:agent_test) # before fork
58
- pid = Process.fork do
59
- NewRelic::Agent.after_fork(:report_to_channel => :agent_test)
60
- NewRelic::Agent.agent.stats_engine.get_stats_no_scope(metric) \
61
- .record_data_point(2.0)
68
+ with_config(:agent_enabled => true, :monitor_mode => true) do
69
+ NewRelic::Agent.shutdown # make sure the agent is not already started
70
+ NewRelic::Agent::Agent.instance.service = NewRelic::FakeService.new
71
+ NewRelic::Agent.manual_start(:license_key => ('1234567890' * 4),
72
+ :start_channel_listener => true)
73
+
74
+ metric = 'Custom/test/method'
75
+ NewRelic::Agent.instance.stats_engine.get_stats_no_scope(metric) \
76
+ .record_data_point(1.0)
77
+
78
+ # ensure that cached metric ids don't interfere with metric merging
79
+ NewRelic::Agent.agent.instance_variable_set(:@metric_ids,
80
+ { NewRelic::MetricSpec.new('Instance/Busy') => 1 })
81
+
82
+ NewRelic::Agent::PipeChannelManager.listener.close_all_pipes
83
+ NewRelic::Agent.register_report_channel(:agent_test) # before fork
84
+ pid = Process.fork do
85
+ NewRelic::Agent.after_fork(:report_to_channel => :agent_test)
86
+ NewRelic::Agent.agent.stats_engine.get_stats_no_scope(metric) \
87
+ .record_data_point(2.0)
88
+ end
89
+ Process.wait(pid)
90
+ NewRelic::Agent::PipeChannelManager.listener.stop
91
+
92
+ engine = NewRelic::Agent.agent.stats_engine
93
+ assert_equal(3.0, engine.lookup_stats(metric).total_call_time)
94
+ assert_equal(2, engine.lookup_stats(metric).call_count)
95
+ engine.reset_stats
62
96
  end
63
- Process.wait(pid)
64
- NewRelic::Agent::PipeChannelManager.listener.stop
65
-
66
- engine = NewRelic::Agent.agent.stats_engine
67
- assert_equal(3.0, engine.lookup_stats(metric).total_call_time)
68
- assert_equal(2, engine.lookup_stats(metric).call_count)
69
97
  end
70
98
  end
71
-
99
+
72
100
  def test_reset_stats
73
101
  mock_agent = mocked_agent
74
102
  mock_agent.expects(:reset_stats)
@@ -80,7 +108,7 @@ module NewRelic
80
108
  mock_control.expects(:init_plugin).with({:agent_enabled => true, :sync_startup => true})
81
109
  NewRelic::Agent.manual_start
82
110
  end
83
-
111
+
84
112
  def test_manual_start_with_opts
85
113
  mock_control = mocked_control
86
114
  mock_control.expects(:init_plugin).with({:agent_enabled => true, :sync_startup => false})
@@ -121,7 +149,7 @@ module NewRelic
121
149
  mock_stats_engine.expects(:get_stats).with('Custom/test/metric', false)
122
150
  NewRelic::Agent.get_stats('Custom/test/metric')
123
151
  end
124
-
152
+
125
153
  # note that this is the same as get_stats above, they're just aliases
126
154
  def test_get_stats_no_scope
127
155
  agent = mocked_agent
@@ -166,7 +194,7 @@ module NewRelic
166
194
  Thread.current[:record_tt] = false
167
195
  assert_equal(false, NewRelic::Agent.is_transaction_traced?, 'should be false since the thread local is false')
168
196
  end
169
-
197
+
170
198
  def test_is_sql_recorded_true
171
199
  Thread.current[:record_sql] = true
172
200
  assert_equal(true, NewRelic::Agent.is_sql_recorded?, 'should be true since the thread local is set')
@@ -181,7 +209,7 @@ module NewRelic
181
209
  Thread.current[:record_sql] = false
182
210
  assert_equal(false, NewRelic::Agent.is_sql_recorded?, 'should be false since the thread local is false')
183
211
  end
184
-
212
+
185
213
  def test_is_execution_traced_true
186
214
  Thread.current[:newrelic_untraced] = [true, true]
187
215
  assert_equal(true, NewRelic::Agent.is_execution_traced?, 'should be true since the thread local is set')
@@ -201,18 +229,18 @@ module NewRelic
201
229
  Thread.current[:newrelic_untraced] = [true, false]
202
230
  assert_equal(false, NewRelic::Agent.is_execution_traced?, 'should be false since the thread local stack has the last element false')
203
231
  end
204
-
232
+
205
233
  def test_instance
206
234
  assert_equal(NewRelic::Agent.agent, NewRelic::Agent.instance, "should return the same agent for both identical methods")
207
235
  end
208
-
236
+
209
237
  def test_register_report_channel
210
238
  NewRelic::Agent.register_report_channel(:channel_id)
211
239
  assert NewRelic::Agent::PipeChannelManager.channels[:channel_id] \
212
240
  .kind_of?(NewRelic::Agent::PipeChannelManager::Pipe)
213
241
  NewRelic::Agent::PipeChannelManager.listener.close_all_pipes
214
242
  end
215
-
243
+
216
244
  private
217
245
 
218
246
  def mocked_agent
@@ -220,7 +248,7 @@ module NewRelic
220
248
  NewRelic::Agent.stubs(:agent).returns(agent)
221
249
  agent
222
250
  end
223
-
251
+
224
252
  def mocked_control
225
253
  server = NewRelic::Control::Server.new('localhost', 3000)
226
254
  control = OpenStruct.new(:license_key => 'abcdef',
@@ -229,7 +257,7 @@ module NewRelic
229
257
  def [](key)
230
258
  nil
231
259
  end
232
-
260
+
233
261
  def fetch(k,d)
234
262
  nil
235
263
  end
@@ -24,7 +24,7 @@ class NewRelic::CollectionHelperTest < Test::Unit::TestCase
24
24
  assert_equal '1000', new_array[0]
25
25
  end
26
26
  def test_boolean
27
- np = normalize_params(NewRelic::Control.instance.settings)
27
+ np = normalize_params('monitor_mode' => false)
28
28
  assert_equal false, np['monitor_mode']
29
29
  end
30
30
  def test_string__singleton
@@ -118,14 +118,13 @@ class NewRelic::CollectionHelperTest < Test::Unit::TestCase
118
118
  end
119
119
 
120
120
  def test_disabled_strip_backtrace
121
- NewRelic::Control.instance['disable_backtrace_cleanup'] = true
122
- clean_trace = strip_nr_from_backtrace(mock_backtrace)
123
- assert_equal(1, clean_trace.grep(/new_relic/).size,
124
- "should not remove instances of new relic from backtrace but got: #{clean_trace.join("\n")}")
125
- assert_equal(1, clean_trace.grep(/_trace/).size,
121
+ with_config(:disable_backtrace_cleanup => true) do
122
+ clean_trace = strip_nr_from_backtrace(mock_backtrace)
123
+ assert_equal(1, clean_trace.grep(/new_relic/).size,
124
+ "should not remove instances of new relic from backtrace but got: #{clean_trace.join("\n")}")
125
+ assert_equal(1, clean_trace.grep(/_trace/).size,
126
126
  "should not remove trace method tags from method names but got: #{clean_trace.join("\n")}")
127
- # assert (clean_trace.grep(/find/).size >= 3), "should see at least three frames with 'find' in them (#{e}): \n#{clean_trace.join("\n")}"
128
- NewRelic::Control.instance['disable_backtrace_cleanup'] = false
127
+ end
129
128
  end
130
129
 
131
130
  private
@@ -10,6 +10,8 @@ class NewRelic::Command::DeploymentsTest < Test::Unit::TestCase
10
10
  def info(message); @messages = @messages ? @messages + message : message; end
11
11
  def just_exit(status=0); @exit_status ||= status; end
12
12
  end
13
+ @config = { :license_key => 'a' * 40 }
14
+ NewRelic::Agent.config.apply_config(@config)
13
15
  end
14
16
  def teardown
15
17
  super
@@ -17,6 +19,7 @@ class NewRelic::Command::DeploymentsTest < Test::Unit::TestCase
17
19
  puts @deployment.errors
18
20
  puts @deployment.messages
19
21
  puts @deployment.exit_status
22
+ NewRelic::Agent.config.remove_config(@config)
20
23
  end
21
24
  def test_help
22
25
  begin
@@ -33,7 +36,10 @@ class NewRelic::Command::DeploymentsTest < Test::Unit::TestCase
33
36
  end
34
37
  def test_interactive
35
38
  mock_the_connection
36
- @deployment = NewRelic::Command::Deployments.new :appname => 'APP', :revision => 3838, :user => 'Bill', :description => "Some lengthy description"
39
+ @deployment = NewRelic::Command::Deployments.new(:appname => 'APP',
40
+ :revision => 3838,
41
+ :user => 'Bill',
42
+ :description => "Some lengthy description")
37
43
  assert_nil @deployment.exit_status
38
44
  assert_nil @deployment.errors
39
45
  assert_equal '3838', @deployment.revision
@@ -56,7 +62,18 @@ class NewRelic::Command::DeploymentsTest < Test::Unit::TestCase
56
62
 
57
63
  @deployment = nil
58
64
  end
65
+
66
+ def test_error_if_no_license_key
67
+ with_config(:license_key => '') do
68
+ assert_raise NewRelic::Command::CommandFailure do
69
+ deployment = NewRelic::Command::Deployments.new(%w[-a APP -r 3838 --user=Bill] << "Some lengthy description")
70
+ deployment.run
71
+ end
72
+ end
73
+ end
74
+
59
75
  private
76
+
60
77
  def mock_the_connection
61
78
  mock_connection = mock()
62
79
  @mock_response = mock()
@@ -64,5 +81,4 @@ class NewRelic::Command::DeploymentsTest < Test::Unit::TestCase
64
81
  mock_connection.expects(:request).returns(@mock_response)
65
82
  NewRelic::Control.instance.stubs(:http_connection).returns(mock_connection)
66
83
  end
67
-
68
84
  end
@@ -0,0 +1,26 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'/../../../test_helper'))
2
+
3
+ class NewRelic::Control::Frameworks::RailsTest < Test::Unit::TestCase
4
+ def test_install_browser_monitoring
5
+ require(File.expand_path(File.join(File.dirname(__FILE__),
6
+ '/../../../../lib/new_relic/rack/browser_monitoring')))
7
+ middleware = stub('middleware config')
8
+ config = stub('rails config', :middleware => middleware)
9
+ middleware.expects(:use).with(NewRelic::Rack::BrowserMonitoring)
10
+ NewRelic::Control.instance.instance_eval { @browser_monitoring_installed = false }
11
+ with_config(:'browser_monitoring.auto_instrument' => true) do
12
+ NewRelic::Control.instance.install_browser_monitoring(config)
13
+ end
14
+ end
15
+
16
+ def test_install_browser_monitoring_should_not_install_when_not_configured
17
+ middleware = stub('middleware config')
18
+ config = stub('rails config', :middleware => middleware)
19
+ middleware.expects(:use).never
20
+ NewRelic::Control.instance.instance_eval { @browser_monitoring_installed = false }
21
+
22
+ with_config(:'browser_monitoring.auto_instrument' => false) do
23
+ NewRelic::Control.instance.install_browser_monitoring(config)
24
+ end
25
+ end
26
+ end
@@ -5,15 +5,15 @@ require 'fileutils'
5
5
  class BaseLoggingMethods
6
6
  # stub class to enable testing of the module
7
7
  include NewRelic::Control::LoggingMethods
8
- include NewRelic::Control::Configuration
9
8
  def root; "."; end
10
9
  end
11
10
 
12
11
  class NewRelic::Control::LoggingMethodsTest < Test::Unit::TestCase
13
12
  def setup
14
13
  @base = BaseLoggingMethods.new
15
- @base.settings['log_file_path'] = 'log/'
16
- @base.settings['log_file_name'] = 'newrelic_agent.log'
14
+ NewRelic::Control.instance.instance_variable_set '@log_path', nil
15
+ NewRelic::Control.instance.instance_variable_set '@log_file', nil
16
+ @root = ::Rails::VERSION::MAJOR == 3 ? Rails.root : RAILS_ROOT
17
17
  super
18
18
  end
19
19
 
@@ -60,30 +60,34 @@ class NewRelic::Control::LoggingMethodsTest < Test::Unit::TestCase
60
60
 
61
61
  def test_should_log_agent_disabled
62
62
  @base.instance_eval { @settings = true }
63
- @base.expects(:agent_enabled?).returns(false)
64
- assert !@base.should_log?
63
+ with_config(:agent_enabled => false) do
64
+ assert !@base.should_log?
65
+ end
65
66
  end
66
67
 
67
68
  def test_should_log_agent_enabled
68
69
  @base.instance_eval { @settings = true }
69
- @base.expects(:agent_enabled?).returns(true)
70
- assert @base.should_log?
70
+ with_config(:agent_enabled => true) do
71
+ assert @base.should_log?
72
+ end
71
73
  end
72
74
 
73
75
  def test_set_log_level_base
74
76
  fake_logger = mock('logger')
75
77
  # bad configuration
76
- @base.expects(:fetch).with('log_level', 'info').returns('whee')
77
- fake_logger.expects(:level=).with(Logger::INFO)
78
- assert_equal fake_logger, @base.set_log_level!(fake_logger)
78
+ with_config(:log_level => 'whee') do
79
+ fake_logger.expects(:level=).with(Logger::INFO)
80
+ assert_equal fake_logger, @base.set_log_level!(fake_logger)
81
+ end
79
82
  end
80
83
 
81
84
  def test_set_log_level_with_each_level
82
85
  fake_logger = mock('logger')
83
86
  %w[debug info warn error fatal].each do |level|
84
- @base.expects(:fetch).with('log_level', 'info').returns(level)
85
- fake_logger.expects(:level=).with(Logger.const_get(level.upcase))
86
- assert_equal fake_logger, @base.set_log_level!(fake_logger)
87
+ with_config(:log_level => level) do
88
+ fake_logger.expects(:level=).with(Logger.const_get(level.upcase))
89
+ assert_equal fake_logger, @base.set_log_level!(fake_logger)
90
+ end
87
91
  end
88
92
  end
89
93
 
@@ -96,14 +100,14 @@ class NewRelic::Control::LoggingMethodsTest < Test::Unit::TestCase
96
100
 
97
101
  def test_setup_log_existing_file
98
102
  fake_logger = mock('logger')
99
- Logger.expects(:new).with('logpath/logfilename').returns(fake_logger)
100
- @base.expects(:log_path).returns('logpath').at_least_once
101
- @base.expects(:log_file_name).returns('logfilename')
103
+ Logger.expects(:new).returns(fake_logger)
102
104
  @base.expects(:set_log_format!).with(fake_logger)
103
105
  @base.expects(:set_log_level!).with(fake_logger)
104
- assert_equal fake_logger, @base.setup_log
105
- assert_equal fake_logger, @base.instance_eval { @log }
106
- assert_equal 'logpath/logfilename', @base.instance_eval { @log_file }
106
+ with_config(:log_file_path => 'logpath', :log_file_name => 'logfilename') do
107
+ assert_equal fake_logger, @base.setup_log
108
+ assert_equal fake_logger, @base.instance_eval { @log }
109
+ assert_match(/logpath\/logfilename$/, @base.instance_eval { @log_file })
110
+ end
107
111
  end
108
112
 
109
113
  def test_to_stdout
@@ -117,69 +121,91 @@ class NewRelic::Control::LoggingMethodsTest < Test::Unit::TestCase
117
121
  end
118
122
 
119
123
  def test_log_path_path_exists
120
- @base.settings['log_file_path'] = 'log'
121
- assert File.directory?('log')
122
- assert_equal File.expand_path('log'), @base.log_path
124
+ with_config(:log_file_path => 'log') do
125
+ assert File.directory?('log')
126
+ assert_equal File.expand_path('log'), @base.log_path
127
+ end
123
128
  end
124
129
 
125
130
  def test_log_path_path_created
126
131
  path = File.expand_path('tmp/log_path_test')
132
+ FileUtils.mkdir_p(File.dirname(path))
127
133
  @base.instance_eval { @log_path = nil }
128
- @base.settings['log_file_path'] = 'tmp/log_path_test'
129
- assert !File.directory?(path) || FileUtils.rmdir(path)
130
- @base.expects(:log!).never
131
- assert_equal path, @base.log_path
132
- assert File.directory?(path)
134
+ with_config(:log_file_path => 'tmp/log_path_test') do
135
+ assert !File.directory?(path) || FileUtils.rmdir(path)
136
+ @base.expects(:log!).never
137
+ assert_equal path, @base.log_path
138
+ assert File.directory?(path)
139
+ end
133
140
  end
134
141
 
135
142
  def test_log_path_path_unable_to_create
136
143
  path = File.expand_path('tmp/log_path_test')
137
144
  @base.instance_eval { @log_path = nil }
138
- @base.settings['log_file_path'] = 'tmp/log_path_test'
139
- assert !File.directory?(path) || FileUtils.rmdir(path)
140
- @base.expects(:log!).with("Error creating log directory tmp/log_path_test, using standard out for logging.", :warn)
141
- Dir.expects(:mkdir).with(path).raises('cannot make directory bro!').twice # once for the relative directory, once for the directory relative to Rails.root
142
- assert_nil @base.log_path
143
- assert !File.directory?(path)
144
- assert_equal STDOUT, @base.log.instance_eval { @logdev }.dev
145
- end
146
-
147
- def test_log_file_name
148
- @base.expects(:fetch).with('log_file_name', 'newrelic_agent.log').returns('log_file_name')
149
- assert_equal 'log_file_name', @base.log_file_name
145
+ with_config(:log_file_path => 'tmp/log_path_test') do
146
+ assert !File.directory?(path) || FileUtils.rmdir(path)
147
+ @base.expects(:log!).with("Error creating log directory tmp/log_path_test, using standard out for logging.", :warn)
148
+ # once for the relative directory, once for the directory relative to Rails.root
149
+ Dir.expects(:mkdir).with(path).raises('cannot make directory bro!').twice
150
+ assert_nil @base.log_path
151
+ assert !File.directory?(path)
152
+ assert_equal STDOUT, @base.log.instance_eval { @logdev }.dev
153
+ end
150
154
  end
151
155
 
152
156
  def test_log_to_stdout_when_log_file_path_set_to_STDOUT
153
- @base.stubs(:fetch).returns('whatever')
154
- @base.expects(:fetch).with('log_file_path', 'log').returns('STDOUT')
155
157
  Dir.expects(:mkdir).never
156
- @base.setup_log
157
- assert_equal STDOUT, @base.log.instance_eval { @logdev }.dev
158
+ with_config(:log_file_path => 'STDOUT') do
159
+ @base.setup_log
160
+ assert_equal STDOUT, @base.log.instance_eval { @logdev }.dev
161
+ end
158
162
  end
159
163
 
160
164
  def test_logs_to_stdout_include_newrelic_prefix
161
- @base.stubs(:fetch).returns('whatever')
162
- @base.expects(:fetch).with('log_file_path', 'log').returns('STDOUT')
163
- STDOUT.expects(:write).with(regexp_matches(/\*\* \[NewRelic\].*whee/))
164
- @base.setup_log
165
- @base.log.info('whee')
165
+ with_config(:log_file_path => 'STDOUT') do
166
+ STDOUT.expects(:write).with(regexp_matches(/\*\* \[NewRelic\].*whee/))
167
+ @base.setup_log
168
+ @base.log.info('whee')
169
+ end
166
170
  end
167
171
 
168
172
  def test_set_stdout_destination_from_NEW_RELIC_LOG_env_var
169
- @base.stubs(:fetch).returns('whatever')
170
173
  ENV['NEW_RELIC_LOG'] = 'stdout'
174
+ reset_environment_config
171
175
  Dir.expects(:mkdir).never
172
176
  @base.setup_log
173
177
  assert_equal STDOUT, @base.log.instance_eval { @logdev }.dev
174
178
  ENV['NEW_RELIC_LOG'] = nil
179
+ reset_environment_config
175
180
  end
176
181
 
177
182
  def test_set_file_destination_from_NEW_RELIC_LOG_env_var
178
- @base.stubs(:fetch).returns('whatever')
179
183
  ENV['NEW_RELIC_LOG'] = 'log/file.log'
184
+ reset_environment_config
180
185
  @base.setup_log
181
186
  assert_equal 'log', File.basename(@base.log_path)
182
- assert_equal 'file.log', @base.log_file_name
183
- ENV['NEW_RELIC_LOG'] = nil
187
+ assert_equal 'file.log', NewRelic::Agent.config['log_file_name']
188
+ ENV['NEW_RELIC_LOG'] = nil
189
+ reset_environment_config
190
+ end
191
+
192
+ def test_log_path_uses_default_if_not_set
193
+ NewRelic::Control.instance.setup_log
194
+ assert_match(/log\/newrelic_agent.log$/,
195
+ NewRelic::Control.instance.log_file)
196
+ end
197
+
198
+ def test_log_file_path_uses_given_value
199
+ Dir.stubs(:mkdir).returns(true)
200
+ with_config(:log_file_path => 'lerg') do
201
+ NewRelic::Control.instance.setup_log
202
+ assert_match(/\/lerg\/newrelic_agent.log$/,
203
+ NewRelic::Control.instance.log_file)
204
+ end
205
+ end
206
+
207
+ def reset_environment_config
208
+ NewRelic::Agent.config.config_stack[0] =
209
+ NewRelic::Agent::Configuration::EnvironmentSource.new
184
210
  end
185
211
  end