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
@@ -35,7 +35,7 @@ module NewRelic
35
35
  end
36
36
 
37
37
  def test_default_metric_name_code
38
- assert_equal "Custom/#{name}/test_method", default_metric_name_code('test_method')
38
+ assert_equal "Custom/#{self.class.name}/test_method", self.class.default_metric_name_code('test_method')
39
39
  end
40
40
 
41
41
  def test_newrelic_method_exists_positive
@@ -44,13 +44,13 @@ module NewRelic
44
44
  end
45
45
 
46
46
  def test_newrelic_method_exists_negative
47
- self.expects(:method_defined?).returns(false)
48
- self.expects(:private_method_defined?).returns(false)
47
+ self.class.expects(:method_defined?).returns(false)
48
+ self.class.expects(:private_method_defined?).returns(false)
49
49
 
50
50
  fake_log = mock('log')
51
51
  NewRelic::Control.instance.expects(:log).returns(fake_log)
52
- fake_log.expects(:warn).with("Did not trace #{name}#test_method because that method does not exist")
53
- assert !newrelic_method_exists?('test_method')
52
+ fake_log.expects(:warn).with("Did not trace #{self.class.name}#test_method because that method does not exist")
53
+ assert !self.class.newrelic_method_exists?('test_method')
54
54
  end
55
55
 
56
56
  def test_set_deduct_call_time_based_on_metric_positive
@@ -324,14 +324,14 @@ class NewRelic::Agent::MethodTracerTest < Test::Unit::TestCase
324
324
  end
325
325
 
326
326
  def test_add_multiple_tracers
327
- self.class.add_method_tracer :method_to_be_traced, 'X', :push_scope => false
327
+ self.class.add_method_tracer :method_to_be_traced, 'XX', :push_scope => false
328
328
  method_to_be_traced 1,2,3,true,nil
329
- self.class.add_method_tracer :method_to_be_traced, 'Y'
330
- method_to_be_traced 1,2,3,true,'Y'
331
- self.class.remove_method_tracer :method_to_be_traced, 'Y'
329
+ self.class.add_method_tracer :method_to_be_traced, 'YY'
330
+ method_to_be_traced 1,2,3,true,'YY'
331
+ self.class.remove_method_tracer :method_to_be_traced, 'YY'
332
332
  method_to_be_traced 1,2,3,true,nil
333
- self.class.remove_method_tracer :method_to_be_traced, 'X'
334
- method_to_be_traced 1,2,3,false,'X'
333
+ self.class.remove_method_tracer :method_to_be_traced, 'XX'
334
+ method_to_be_traced 1,2,3,false,'XX'
335
335
  end
336
336
 
337
337
  def trace_no_push_scope
@@ -18,6 +18,9 @@ class NewRelic::Agent::MockScopeListener
18
18
  end
19
19
 
20
20
  def notice_scope_empty(time)
21
+ end
21
22
 
23
+ def enabled?
24
+ true
22
25
  end
23
26
  end
@@ -1,11 +1,34 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'test_helper'))
2
+ require 'new_relic/agent/thread_profiler'
2
3
 
3
4
  class NewRelicServiceTest < Test::Unit::TestCase
5
+ def initialize(*_)
6
+ [ :HTTPSuccess,
7
+ :HTTPUnauthorized,
8
+ :HTTPNotFound,
9
+ :HTTPRequestEntityTooLarge,
10
+ :HTTPUnsupportedMediaType ].each do |class_name|
11
+ extend_with_mock(class_name)
12
+ end
13
+ super
14
+ end
15
+
16
+ def extend_with_mock(class_name)
17
+ if !self.class.const_defined?(class_name)
18
+ klass = self.class.const_set(class_name,
19
+ Class.new(Object.const_get(:Net).const_get(class_name)))
20
+ klass.class_eval { include HTTPResponseMock }
21
+ end
22
+ end
23
+ protected :extend_with_mock
24
+
4
25
  def setup
5
- @server = NewRelic::Control::Server.new('127.0.0.1', 30303)
26
+ @server = NewRelic::Control::Server.new('somewhere.example.com',
27
+ 30303, '10.10.10.10')
6
28
  @service = NewRelic::Agent::NewRelicService.new('license-key', @server)
7
29
  @http_handle = HTTPHandle.new
8
30
  NewRelic::Control.instance.stubs(:http_connection).returns(@http_handle)
31
+
9
32
  @http_handle.respond_to(:get_redirect_host, 'localhost')
10
33
  connect_response = {
11
34
  'config' => 'some config directives',
@@ -14,6 +37,13 @@ class NewRelicServiceTest < Test::Unit::TestCase
14
37
  @http_handle.respond_to(:connect, connect_response)
15
38
  end
16
39
 
40
+ def test_initialize_uses_correct_license_key_settings
41
+ with_config(:license_key => 'abcde') do
42
+ service = NewRelic::Agent::NewRelicService.new
43
+ assert_equal 'abcde', service.instance_variable_get(:@license_key)
44
+ end
45
+ end
46
+
17
47
  def test_connect_sets_agent_id_and_config_data
18
48
  response = @service.connect
19
49
  assert_equal 1, response['agent_run_id']
@@ -21,32 +51,37 @@ class NewRelicServiceTest < Test::Unit::TestCase
21
51
  end
22
52
 
23
53
  def test_connect_sets_redirect_host
24
- assert_equal '127.0.0.1', @service.collector.name
25
- @service.connect
54
+ assert_equal 'somewhere.example.com', @service.collector.name
55
+ @service.connect
26
56
  assert_equal 'localhost', @service.collector.name
27
57
  end
28
58
 
59
+ def test_connect_resets_cached_ip_address
60
+ assert_equal '10.10.10.10', @service.collector.ip
61
+ @service.connect
62
+ assert_nil @service.collector.ip # 'localhost' resolves to nil
63
+ end
64
+
29
65
  def test_connect_uses_proxy_collector_if_no_redirect_host
30
66
  @http_handle.reset
31
67
  @http_handle.respond_to(:get_redirect_host, nil)
32
- @http_handle.respond_to(:connect, {'agent_run_id' => 1})
68
+ @http_handle.respond_to(:connect, 'agent_run_id' => 1)
33
69
 
34
70
  @service.connect
35
- assert_equal '127.0.0.1', @service.collector.name
71
+ assert_equal 'somewhere.example.com', @service.collector.name
36
72
  end
37
73
 
38
74
  def test_connect_sets_agent_id
39
75
  @http_handle.reset
40
76
  @http_handle.respond_to(:get_redirect_host, 'localhost')
41
- @http_handle.respond_to(:connect, {'agent_run_id' => 666})
77
+ @http_handle.respond_to(:connect, 'agent_run_id' => 666)
42
78
 
43
79
  @service.connect
44
80
  assert_equal 666, @service.agent_id
45
81
  end
46
82
 
47
83
  def test_get_redirect_host
48
- host = @service.get_redirect_host
49
- assert_equal 'localhost', host
84
+ assert_equal 'localhost', @service.get_redirect_host
50
85
  end
51
86
 
52
87
  def test_shutdown
@@ -64,20 +99,20 @@ class NewRelicServiceTest < Test::Unit::TestCase
64
99
 
65
100
  def test_metric_data
66
101
  @http_handle.respond_to(:metric_data, 'met rick date uhhh')
67
- response = @service.metric_data(Time.now - 60, Time.now, {})
102
+ response = @service.metric_data((Time.now - 60).to_f, Time.now.to_f, {})
68
103
  assert_equal 'met rick date uhhh', response
69
104
  end
70
105
 
71
106
  def test_error_data
72
107
  @http_handle.respond_to(:error_data, 'too human')
73
108
  response = @service.error_data([])
74
- assert_equal 'too human', response
109
+ assert_equal 'too human', response
75
110
  end
76
111
 
77
112
  def test_transaction_sample_data
78
113
  @http_handle.respond_to(:transaction_sample_data, 'MPC1000')
79
114
  response = @service.transaction_sample_data([])
80
- assert_equal 'MPC1000', response
115
+ assert_equal 'MPC1000', response
81
116
  end
82
117
 
83
118
  def test_sql_trace_data
@@ -86,10 +121,49 @@ class NewRelicServiceTest < Test::Unit::TestCase
86
121
  assert_equal 'explain this', response
87
122
  end
88
123
 
124
+
125
+ # Thread profiling only available in 1.9.2 and above
126
+ if RUBY_VERSION >= '1.9.2'
127
+ def test_profile_data
128
+ @http_handle.respond_to(:profile_data, 'profile' => 123)
129
+ response = @service.profile_data(NewRelic::Agent::ThreadProfile.new(0, 0, 0, true))
130
+ assert_equal({ "profile" => 123 }, response)
131
+ end
132
+
133
+ def test_get_agent_commands
134
+ @service.agent_id = 666
135
+ @http_handle.respond_to(:get_agent_commands, [1,2,3])
136
+
137
+ response = @service.get_agent_commands
138
+ assert_equal [1,2,3], response
139
+ end
140
+
141
+ def test_get_agent_commands_with_no_response
142
+ @service.agent_id = 666
143
+ @http_handle.respond_to(:get_agent_commands, nil)
144
+
145
+ response = @service.get_agent_commands
146
+ assert_equal nil, response
147
+ end
148
+
149
+ def test_agent_command_results
150
+ @http_handle.respond_to(:agent_command_results, {})
151
+ response = @service.agent_command_results(4200)
152
+ assert_equal({}, response)
153
+ end
154
+
155
+ def test_agent_command_results_with_errors
156
+ @http_handle.respond_to(:agent_command_results, [123])
157
+ response = @service.agent_command_results(4200, 'Boo!')
158
+ assert_equal [123], response
159
+ end
160
+ end
161
+
89
162
  def test_request_timeout
90
- NewRelic::Control.instance['timeout'] = 600
91
- service = NewRelic::Agent::NewRelicService.new('abcdef', @server)
92
- assert_equal 600, service.request_timeout
163
+ with_config(:timeout => 600) do
164
+ service = NewRelic::Agent::NewRelicService.new('abcdef', @server)
165
+ assert_equal 600, service.request_timeout
166
+ end
93
167
  end
94
168
 
95
169
  def test_should_throw_received_errors
@@ -98,6 +172,93 @@ class NewRelicServiceTest < Test::Unit::TestCase
98
172
  end
99
173
  end
100
174
 
175
+ def test_should_connect_to_proxy_only_once_per_run
176
+ @service.expects(:get_redirect_host).once
177
+
178
+ @service.connect
179
+ @http_handle.respond_to(:metric_data, 0)
180
+ @service.metric_data((Time.now - 60).to_f, Time.now.to_f, {})
181
+
182
+ @http_handle.respond_to(:transaction_sample_data, 1)
183
+ @service.transaction_sample_data([])
184
+
185
+ @http_handle.respond_to(:sql_trace_data, 2)
186
+ @service.sql_trace_data([])
187
+ end
188
+
189
+ # for PRUBY proxy compatibility
190
+ def test_should_raise_exception_on_401
191
+ @http_handle.reset
192
+ @http_handle.respond_to(:get_redirect_host, 'bad license', :code => 401)
193
+ assert_raise NewRelic::Agent::LicenseException do
194
+ @service.get_redirect_host
195
+ end
196
+ end
197
+
198
+ # protocol 9
199
+ def test_should_raise_exception_on_413
200
+ @http_handle.respond_to(:metric_data, 'too big', :code => 413)
201
+ assert_raise NewRelic::Agent::UnrecoverableServerException do
202
+ @service.metric_data((Time.now - 60).to_f, Time.now.to_f, {})
203
+ end
204
+ end
205
+
206
+ # protocol 9
207
+ def test_should_raise_exception_on_415
208
+ @http_handle.respond_to(:metric_data, 'too big', :code => 415)
209
+ assert_raise NewRelic::Agent::UnrecoverableServerException do
210
+ @service.metric_data((Time.now - 60).to_f, Time.now.to_f, {})
211
+ end
212
+ end
213
+
214
+ if NewRelic::LanguageSupport.using_version?('1.9')
215
+ def test_json_marshaller_handles_responses_from_collector
216
+ marshaller = NewRelic::Agent::NewRelicService::JsonMarshaller.new
217
+ assert_equal ['beep', 'boop'], marshaller.load('{"return_value": ["beep","boop"]}')
218
+ end
219
+
220
+ def test_json_marshaller_handles_errors_from_collector
221
+ marshaller = NewRelic::Agent::NewRelicService::JsonMarshaller.new
222
+ assert_raise(NewRelic::Agent::NewRelicService::CollectorError,
223
+ 'JavaCrash: error message') do
224
+ marshaller.load('{"exception": {"message": "error message", "error_type": "JavaCrash"}}')
225
+ end
226
+ end
227
+ end
228
+
229
+ def test_pruby_marshaller_handles_errors_from_collector
230
+ marshaller = NewRelic::Agent::NewRelicService::PrubyMarshaller.new
231
+ assert_raise(NewRelic::Agent::NewRelicService::CollectorError, 'error message') do
232
+ marshaller.load(Marshal.dump({"exception" => {"message" => "error message",
233
+ "error_type" => "JavaCrash"}}))
234
+ end
235
+ end
236
+
237
+ def test_pruby_marshaller_compresses_large_payloads
238
+ marshaller = NewRelic::Agent::NewRelicService::PrubyMarshaller.new
239
+ large_payload = 'a' * 64 * 1024
240
+ result = marshaller.dump(large_payload)
241
+ assert_equal 'deflate', marshaller.encoding
242
+ assert_equal large_payload, Marshal.load(Zlib::Inflate.inflate(result))
243
+ end
244
+
245
+ def test_marshaller_handles_known_errors
246
+ error_data = {
247
+ 'error_type' => 'NewRelic::Agent::ForceRestartException',
248
+ 'message' => 'test'
249
+ }
250
+ error = @service.marshaller.parsed_error(error_data)
251
+ assert_equal NewRelic::Agent::ForceRestartException, error.class
252
+ assert_equal 'test', error.message
253
+ end
254
+
255
+ def test_marshaller_handles_unknown_errors
256
+ error = @service.marshaller.parsed_error('error_type' => 'OogBooga',
257
+ 'message' => 'test')
258
+ assert_equal NewRelic::Agent::NewRelicService::CollectorError, error.class
259
+ assert_equal 'OogBooga: test', error.message
260
+ end
261
+
101
262
  class HTTPHandle
102
263
  attr_accessor :read_timeout, :route_table
103
264
 
@@ -105,9 +266,38 @@ class NewRelicServiceTest < Test::Unit::TestCase
105
266
  reset
106
267
  end
107
268
 
108
- def respond_to(method, payload)
109
- register(HTTPResponse.new(Marshal.dump(payload))) do |request|
110
- request.path.include?(method.to_s)
269
+ def respond_to(method, payload, opts={})
270
+ if NewRelic::Agent::NewRelicService::JsonMarshaller.is_supported?
271
+ format = :json
272
+ else
273
+ format = :pruby
274
+ end
275
+
276
+ opts = {
277
+ :code => 200,
278
+ :format => format
279
+ }.merge(opts)
280
+
281
+ if opts[:code] == 401
282
+ klass = HTTPUnauthorized
283
+ elsif opts[:code] == 413
284
+ klass = HTTPRequestEntityTooLarge
285
+ elsif opts[:code] == 415
286
+ klass = HTTPUnsupportedMediaType
287
+ elsif opts[:code] >= 400
288
+ klass = HTTPServerError
289
+ else
290
+ klass = HTTPSuccess
291
+ end
292
+
293
+ if opts[:format] == :json
294
+ register(klass.new(JSON.dump('return_value' => payload), opts[:code])) do |request|
295
+ request.path.include?(method.to_s)
296
+ end
297
+ else
298
+ register(klass.new(Marshal.dump('return_value' => payload), opts[:code])) do |request|
299
+ request.path.include?(method.to_s)
300
+ end
111
301
  end
112
302
  end
113
303
 
@@ -121,7 +311,7 @@ class NewRelicServiceTest < Test::Unit::TestCase
121
311
  return response
122
312
  end
123
313
  end
124
- HTTPFailure.new('not found', 404)
314
+ HTTPNotFound.new('not found', 404)
125
315
  end
126
316
 
127
317
  def reset
@@ -143,9 +333,4 @@ class NewRelicServiceTest < Test::Unit::TestCase
143
333
  @headers[key]
144
334
  end
145
335
  end
146
-
147
- HTTPResponse = Class.new(Net::HTTPOK)
148
- HTTPResponse.class_eval { include HTTPResponseMock }
149
- HTTPFailure = Class.new(Net::HTTPError)
150
- HTTPFailure.class_eval { include HTTPResponseMock }
151
336
  end
@@ -4,6 +4,8 @@ require 'new_relic/agent/pipe_channel_manager'
4
4
 
5
5
  class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
6
6
  def setup
7
+ @test_config = { 'developer_mode' => true }
8
+ NewRelic::Agent.config.apply_config(@test_config)
7
9
  NewRelic::Agent::PipeChannelManager.listener.close_all_pipes
8
10
  NewRelic::Agent.manual_start
9
11
  end
@@ -11,26 +13,27 @@ class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
11
13
  def teardown
12
14
  NewRelic::Agent::PipeChannelManager.listener.stop
13
15
  NewRelic::Agent.shutdown
16
+ NewRelic::Agent.config.remove_config(@test_config)
14
17
  end
15
-
18
+
16
19
  def test_registering_a_pipe
17
- NewRelic::Agent::PipeChannelManager.listener.wake.in.expects(:<<).with('.')
20
+ NewRelic::Agent::PipeChannelManager.listener.wake.in.expects(:<<).with('.')
18
21
  NewRelic::Agent::PipeChannelManager.register_report_channel(1)
19
22
  pipe = NewRelic::Agent::PipeChannelManager.channels[1]
20
-
23
+
21
24
  assert pipe.out.kind_of?(IO)
22
25
  assert pipe.in.kind_of?(IO)
23
26
 
24
27
  NewRelic::Agent::PipeChannelManager.listener.close_all_pipes
25
28
  end
26
-
29
+
27
30
  if NewRelic::LanguageSupport.can_fork? && !NewRelic::LanguageSupport.using_version?('1.9.1')
28
31
  def test_listener_merges_timeslice_metrics
29
32
  metric = 'Custom/test/method'
30
33
  engine = NewRelic::Agent.agent.stats_engine
31
34
  engine.get_stats_no_scope(metric).record_data_point(1.0)
32
-
33
- listener = start_listener_with_pipe(666)
35
+
36
+ listener = start_listener_with_pipe(666)
34
37
 
35
38
  pid = Process.fork do
36
39
  NewRelic::Agent.after_fork
@@ -40,32 +43,35 @@ class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
40
43
  end
41
44
  Process.wait(pid)
42
45
  listener.stop
43
-
44
- assert_equal(3.0, engine.lookup_stats(metric).total_call_time)
46
+
47
+ assert_equal(3.0, engine.lookup_stats(metric).total_call_time)
48
+ engine.reset_stats
45
49
  end
46
50
 
47
51
  def test_listener_merges_transaction_traces
48
- sampler = NewRelic::Agent.agent.transaction_sampler
52
+ sampler = NewRelic::Agent.agent.transaction_sampler
49
53
  TransactionSampleTestHelper.run_sample_trace_on(sampler)
50
54
  NewRelic::Agent.agent.merge_data_from([nil, [sampler.samples], nil])
51
55
 
52
56
  assert_equal(1, NewRelic::Agent.agent.unsent_traces_size)
53
-
57
+
54
58
  listener = start_listener_with_pipe(667)
55
-
59
+
56
60
  pid = Process.fork do
57
61
  NewRelic::Agent.after_fork
58
62
  new_sampler = NewRelic::Agent::TransactionSampler.new
59
63
  sample = TransactionSampleTestHelper.run_sample_trace_on(new_sampler)
60
64
  new_sampler.store_force_persist(sample)
61
- listener.pipes[667].write(:transaction_traces => new_sampler.harvest([], 0))
65
+ with_config(:'transaction_tracer.transaction_threshold' => 0.0) do
66
+ listener.pipes[667].write(:transaction_traces => new_sampler.harvest([]))
67
+ end
62
68
  end
63
69
  Process.wait(pid)
64
70
  listener.stop
65
-
71
+
66
72
  assert_equal(2, NewRelic::Agent.agent.unsent_traces_size)
67
73
  end
68
-
74
+
69
75
  def test_listener_merges_error_traces
70
76
  sampler = NewRelic::Agent.agent.error_collector
71
77
  sampler.notice_error(Exception.new("message"), :uri => '/myurl/',
@@ -74,9 +80,9 @@ class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
74
80
  NewRelic::Agent.agent.merge_data_from([nil, nil, [sampler.errors]])
75
81
 
76
82
  assert_equal(1, NewRelic::Agent.agent.unsent_errors_size)
77
-
83
+
78
84
  listener = start_listener_with_pipe(668)
79
-
85
+
80
86
  pid = Process.fork do
81
87
  NewRelic::Agent.after_fork
82
88
  new_sampler = NewRelic::Agent::ErrorCollector.new
@@ -103,8 +109,19 @@ class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
103
109
  assert(!NewRelic::Agent::PipeChannelManager.channels[669] ||
104
110
  NewRelic::Agent::PipeChannelManager.channels[669].closed?)
105
111
  end
112
+
113
+ def test_manager_does_not_crash_when_given_bad_data
114
+ listener = start_listener_with_pipe(670)
115
+ assert_nothing_raised do
116
+ pid = Process.fork do
117
+ listener.pipes[670].in << 'some unloadable garbage'
118
+ end
119
+ Process.wait(pid)
120
+ listener.stop
121
+ end
122
+ end
106
123
  end
107
-
124
+
108
125
  def start_listener_with_pipe(pipe_id)
109
126
  listener = NewRelic::Agent::PipeChannelManager.listener
110
127
  listener.start