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
@@ -4,7 +4,6 @@ class NewRelic::ControlTest < Test::Unit::TestCase
4
4
  attr_reader :control
5
5
 
6
6
  def setup
7
- NewRelic::Agent.manual_start(:dispatcher_instance_id => 'test')
8
7
  @control = NewRelic::Control.instance
9
8
  raise 'oh geez, wrong class' unless NewRelic::Control.instance.is_a?(::NewRelic::Control::Frameworks::Test)
10
9
  end
@@ -17,12 +16,11 @@ class NewRelic::ControlTest < Test::Unit::TestCase
17
16
  assert @control.cert_file_path
18
17
  assert_equal File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'cert', 'cacert.pem')), @control.cert_file_path
19
18
  end
20
-
19
+
21
20
  # This test does not actually use the ruby agent in any way - it's
22
21
  # testing that the CA file we ship actually validates our server's
23
22
  # certificate. It's used for customers who enable verify_certificate
24
23
  def test_cert_file
25
- return if ::RUBY_VERSION == '1.9.3'
26
24
  require 'socket'
27
25
  require 'openssl'
28
26
 
@@ -34,12 +32,11 @@ class NewRelic::ControlTest < Test::Unit::TestCase
34
32
  s.connect
35
33
  # should not raise an error
36
34
  end
37
-
35
+
38
36
  # see above, but for staging, as well. This allows us to test new
39
37
  # certificates in a non-customer-facing place before setting them
40
38
  # live.
41
39
  def test_staging_cert_file
42
- return if ::RUBY_VERSION == '1.9.3'
43
40
  require 'socket'
44
41
  require 'openssl'
45
42
 
@@ -52,26 +49,6 @@ class NewRelic::ControlTest < Test::Unit::TestCase
52
49
  # should not raise an error
53
50
  end
54
51
 
55
- def test_monitor_mode
56
- assert ! @control.monitor_mode?
57
- @control.settings.delete 'enabled'
58
- @control.settings.delete 'monitor_mode'
59
- assert !@control.monitor_mode?
60
- @control['enabled'] = false
61
- assert ! @control.monitor_mode?
62
- @control['enabled'] = true
63
- assert @control.monitor_mode?
64
- @control['monitor_mode'] = nil
65
- assert !@control.monitor_mode?
66
- @control['monitor_mode'] = false
67
- assert !@control.monitor_mode?
68
- @control['monitor_mode'] = true
69
- assert @control.monitor_mode?
70
- ensure
71
- @control['enabled'] = false
72
- @control['monitor_mode'] = false
73
- end
74
-
75
52
  def test_test_config
76
53
  if defined?(Rails) && Rails::VERSION::MAJOR.to_i == 3
77
54
  assert_equal :rails3, control.app
@@ -81,10 +58,10 @@ class NewRelic::ControlTest < Test::Unit::TestCase
81
58
  assert_equal :test, control.app
82
59
  end
83
60
  assert_equal :test, control.framework
84
- assert_match /test/i, control.dispatcher_instance_id
85
- assert("" == control.dispatcher.to_s, "Expected dispatcher to be empty, but was #{control.dispatcher.to_s}")
86
- assert !control['enabled']
87
- assert_equal false, control['monitor_mode']
61
+ assert_match /test/i, control.local_env.dispatcher_instance_id
62
+ assert("" == NewRelic::Agent.config[:dispatcher].to_s,
63
+ "Expected dispatcher to be empty, but was #{NewRelic::Agent.config[:dispatcher].to_s}")
64
+ assert_equal false, NewRelic::Agent.config[:monitor_mode]
88
65
  control.local_env
89
66
  end
90
67
 
@@ -96,19 +73,58 @@ class NewRelic::ControlTest < Test::Unit::TestCase
96
73
  end
97
74
 
98
75
  def test_info
76
+ NewRelic::Agent.manual_start(:dispatcher_instance_id => 'test')
99
77
  props = NewRelic::Control.instance.local_env.snapshot
100
78
  if defined?(Rails)
101
79
  assert_match /jdbc|postgres|mysql|sqlite/, props.assoc('Database adapter').last, props.inspect
102
80
  end
103
81
  end
104
82
 
105
- def test_resolve_ip
83
+ def test_resolve_ip_for_localhost
106
84
  assert_equal nil, control.send(:convert_to_ip_address, 'localhost')
85
+ end
86
+
87
+ def test_resolve_ip_for_non_existent_domain
88
+ Resolv.stubs(:getaddress).raises(Resolv::ResolvError)
89
+ IPSocket.stubs(:getaddress).raises(SocketError)
107
90
  assert_equal nil, control.send(:convert_to_ip_address, 'q1239988737.us')
108
- # This will fail if you don't have a valid, accessible, DNS server
91
+ end
92
+
93
+ def test_resolves_valid_ip
94
+ Resolv.stubs(:getaddress).with('collector.newrelic.com').returns('204.93.223.153')
109
95
  assert_equal '204.93.223.153', control.send(:convert_to_ip_address, 'collector.newrelic.com')
110
96
  end
111
97
 
98
+ def test_do_not_resolve_if_we_need_to_verify_a_cert
99
+ assert_equal nil, control.send(:convert_to_ip_address, 'localhost')
100
+ with_config(:ssl => true, :verify_certificate => true) do
101
+ assert_equal 'localhost', control.send(:convert_to_ip_address, 'localhost')
102
+ end
103
+ end
104
+
105
+ def test_api_server_uses_configured_values
106
+ control.instance_variable_set(:@api_server, nil)
107
+ with_config(:api_host => 'somewhere', :api_port => 8080) do
108
+ assert_equal 'somewhere', control.api_server.name
109
+ assert_equal 8080, control.api_server.port
110
+ end
111
+ end
112
+
113
+ def test_proxy_server_uses_configured_values
114
+ control.instance_variable_set(:@proxy_server, nil)
115
+ with_config(:proxy_host => 'proxytown', :proxy_port => 81) do
116
+ assert_equal 'proxytown', control.proxy_server.name
117
+ assert_equal 81, control.proxy_server.port
118
+ end
119
+ end
120
+
121
+ def test_server_from_host_uses_configured_values
122
+ with_config(:host => 'donkeytown', :port => 8080) do
123
+ assert_equal 'donkeytown', control.server_from_host.name
124
+ assert_equal 8080, control.server_from_host.port
125
+ end
126
+ end
127
+
112
128
  class FakeResolv
113
129
  def self.getaddress(host)
114
130
  raise 'deliberately broken'
@@ -131,126 +147,72 @@ class NewRelic::ControlTest < Test::Unit::TestCase
131
147
  assert_equal old_ipsocket, IPSocket
132
148
  end
133
149
 
134
- def test_config_yaml_erb
135
- assert_equal 'heyheyhey', control['erb_value']
136
- assert_equal '', control['message']
137
- assert_equal '', control['license_key']
138
- end
139
-
140
- def test_appnames
141
- assert_equal %w[a b c], NewRelic::Control.instance.app_names
142
- end
143
-
144
- def test_config_booleans
145
- assert_equal control['tval'], true
146
- assert_equal control['fval'], false
147
- assert_nil control['not_in_yaml_val']
148
- assert_equal control['yval'], true
149
- assert_equal control['sval'], 'sure'
150
- end
151
-
152
- def test_config_apdex
153
- assert_equal 1.1, control.apdex_t
154
- end
155
-
156
- # def test_transaction_threshold
157
- # assert_equal 'Apdex_f', c['transaction_tracer']['transaction_threshold']
158
- # assert_equal 4.4, NewRelic::Agent::Agent.instance.instance_variable_get('@slowest_transaction_threshold')
159
- # end
160
-
161
150
  def test_log_file_name
162
151
  NewRelic::Control.instance.setup_log
163
152
  assert_match /newrelic_agent.log$/, control.instance_variable_get('@log_file')
164
153
  end
165
154
 
166
- # def test_transaction_threshold__apdex
167
- # forced_start
168
- # assert_equal 'Apdex_f', c['transaction_tracer']['transaction_threshold']
169
- # assert_equal 4.4, NewRelic::Agent::Agent.instance.instance_variable_get('@slowest_transaction_threshold')
170
- # end
171
-
172
- def test_transaction_threshold__default
173
- forced_start :transaction_tracer => { :transaction_threshold => nil}
174
- assert_nil control['transaction_tracer']['transaction_threshold']
175
- assert_equal 2.0, NewRelic::Agent::Agent.instance.instance_variable_get('@slowest_transaction_threshold')
176
- end
177
-
178
155
  def test_transaction_threshold__override
179
- forced_start :transaction_tracer => { :transaction_threshold => 1}
180
- assert_equal 1, control['transaction_tracer']['transaction_threshold']
181
- assert_equal 1, NewRelic::Agent::Agent.instance.instance_variable_get('@slowest_transaction_threshold')
156
+ with_config(:transaction_tracer => { :transaction_threshold => 1}) do
157
+ assert_equal 1, NewRelic::Agent.config[:'transaction_tracer.transaction_threshold']
158
+ end
182
159
  end
183
160
 
184
161
  def test_transaction_tracer_disabled
185
- forced_start(:transaction_tracer => { :enabled => false },
186
- :developer_mode => false, :monitor_mode => true)
187
- NewRelic::Agent::Agent.instance.check_transaction_sampler_status
188
-
189
- assert(!NewRelic::Agent::Agent.instance.transaction_sampler.enabled?,
190
- 'transaction tracer enabled when config calls for disabled')
191
-
192
- @control['developer_mode'] = true
193
- @control['monitor_mode'] = false
162
+ with_config(:'transaction_tracer.enabled' => false,
163
+ :developer_mode => false, :monitor_mode => true) do
164
+ assert(!NewRelic::Agent::Agent.instance.transaction_sampler.enabled?,
165
+ 'transaction tracer enabled when config calls for disabled')
166
+ end
194
167
  end
195
-
168
+
196
169
  def test_sql_tracer_disabled
197
- forced_start(:slow_sql => { :enabled => false }, :monitor_mode => true)
198
- NewRelic::Agent::Agent.instance.check_sql_sampler_status
199
-
200
- assert(!NewRelic::Agent::Agent.instance.sql_sampler.enabled?,
201
- 'sql tracer enabled when config calls for disabled')
202
-
203
- @control['monitor_mode'] = false
170
+ with_config(:'slow_sql.enabled' => false, :monitor_mode => true) do
171
+ assert(!NewRelic::Agent::Agent.instance.sql_sampler.enabled?,
172
+ 'sql tracer enabled when config calls for disabled')
173
+ end
204
174
  end
205
-
175
+
206
176
  def test_sql_tracer_disabled_with_record_sql_false
207
- forced_start(:slow_sql => { :enabled => true, :record_sql => 'off' })
208
- NewRelic::Agent::Agent.instance.check_sql_sampler_status
209
-
210
- assert(!NewRelic::Agent::Agent.instance.sql_sampler.enabled?,
211
- 'sql tracer enabled when config calls for disabled')
177
+ with_config(:slow_sql => { :enabled => true, :record_sql => 'off' }) do
178
+ assert(!NewRelic::Agent::Agent.instance.sql_sampler.enabled?,
179
+ 'sql tracer enabled when config calls for disabled')
180
+ end
212
181
  end
213
182
 
214
183
  def test_sql_tracer_disabled_when_tt_disabled
215
- forced_start(:transaction_tracer => { :enabled => false },
216
- :slow_sql => { :enabled => true },
217
- :developer_mode => false, :monitor_mode => true)
218
- NewRelic::Agent::Agent.instance.check_sql_sampler_status
219
-
220
- assert(!NewRelic::Agent::Agent.instance.sql_sampler.enabled?,
221
- 'sql enabled when transaction tracer disabled')
222
-
223
- @control['developer_mode'] = true
224
- @control['monitor_mode'] = false
184
+ with_config(:'transaction_tracer.enabled' => false,
185
+ :'slow_sql.enabled' => true,
186
+ :developer_mode => false, :monitor_mode => true) do
187
+ assert(!NewRelic::Agent::Agent.instance.sql_sampler.enabled?,
188
+ 'sql enabled when transaction tracer disabled')
189
+ end
225
190
  end
226
191
 
227
192
  def test_sql_tracer_disabled_when_tt_disabled_by_server
228
- forced_start(:slow_sql => { :enabled => true },
229
- :transaction_tracer => { :enabled => true },
230
- :monitor_mode => true)
231
- NewRelic::Agent::Agent.instance.check_sql_sampler_status
232
- NewRelic::Agent::Agent.instance.finish_setup('collect_traces' => false)
233
-
234
- assert(!NewRelic::Agent::Agent.instance.sql_sampler.enabled?,
235
- 'sql enabled when tracing disabled by server')
236
-
237
- @control['monitor_mode'] = false
193
+ with_config({:'slow_sql.enabled' => true,
194
+ :'transaction_tracer.enabled' => true,
195
+ :monitor_mode => true}, 2) do
196
+ NewRelic::Agent.instance.finish_setup('collect_traces' => false)
197
+
198
+ assert(!NewRelic::Agent::Agent.instance.sql_sampler.enabled?,
199
+ 'sql enabled when tracing disabled by server')
200
+ end
238
201
  end
239
202
 
240
- def test_merging_options
241
- NewRelic::Control.send :public, :merge_options
242
- @control.merge_options :api_port => 66, :transaction_tracer => { :explain_threshold => 2.0 }
243
- assert_equal 66, NewRelic::Control.instance['api_port']
244
- assert_equal 2.0, NewRelic::Control.instance['transaction_tracer']['explain_threshold']
245
- assert_equal 'raw', NewRelic::Control.instance['transaction_tracer']['record_sql']
203
+ def test_init_plugin_loads_samplers_enabled
204
+ NewRelic::Agent.shutdown
205
+ with_config(:disable_samplers => false, :agent_enabled => true) do
206
+ NewRelic::Control.instance.init_plugin
207
+ assert NewRelic::Agent.instance.stats_engine.send(:harvest_samplers).any?
208
+ end
246
209
  end
247
-
248
- private
249
210
 
250
- def forced_start(overrides={})
251
- NewRelic::Agent.manual_start overrides
252
- # This is to force the agent to start again.
253
- NewRelic::Agent.instance.stubs(:started?).returns(nil)
254
- NewRelic::Agent.instance.start
211
+ def test_init_plugin_loads_samplers_disabled
212
+ NewRelic::Agent.shutdown
213
+ with_config(:disable_samplers => true, :agent_enabled => true) do
214
+ NewRelic::Control.instance.init_plugin
215
+ assert_equal [], NewRelic::Agent.instance.stats_engine.send(:harvest_samplers)
216
+ end
255
217
  end
256
218
  end
@@ -8,17 +8,18 @@ require 'ostruct'
8
8
  module NewRelic
9
9
  class FakeCollector
10
10
  attr_accessor :agent_data, :mock
11
-
11
+
12
12
  def initialize
13
13
  @id_counter = 0
14
14
  @base_expectations = {
15
- 'get_redirect_host' => 'localhost',
16
- 'connect' => { 'agent_run_id' => agent_run_id },
17
- 'metric_data' => { 'Some/Metric/Spec' => 1 },
18
- 'sql_trace_data' => nil,
19
- 'transaction_sample_data' => nil,
20
- 'error_data' => nil,
21
- 'shutdown' => nil,
15
+ 'get_redirect_host' => [200, {'return_value' => 'localhost'}],
16
+ 'connect' => [200, {'return_value' => {"agent_run_id" => agent_run_id}}],
17
+ 'get_agent_commands' => [200, {'return_value' => []}],
18
+ 'metric_data' => [200, {'return_value' => [[{'name' => 'Some/Metric/Spec'}, 1]]}],
19
+ 'sql_trace_data' => [200, {'return_value' => nil}],
20
+ 'transaction_sample_data' => [200, {'return_value' => nil}],
21
+ 'error_data' => [200, {'return_value' => nil}],
22
+ 'shutdown' => [200, {'return_value' => nil}]
22
23
  }
23
24
  reset
24
25
  end
@@ -26,7 +27,7 @@ module NewRelic
26
27
  def agent_run_id
27
28
  @id_counter += 1
28
29
  end
29
-
30
+
30
31
  def call(env)
31
32
  req = ::Rack::Request.new(env)
32
33
  res = ::Rack::Response.new
@@ -34,25 +35,57 @@ module NewRelic
34
35
  if uri.path =~ /agent_listener\/\d+\/.+\/(\w+)/
35
36
  method = $1
36
37
  if @mock.keys.include? method
37
- res.write Marshal.dump(@mock[method])
38
+ res.status = @mock[method][0]
39
+ if json_format?(uri)
40
+ res.write JSON.dump(@mock[method][1])
41
+ else
42
+ res.write Marshal.dump(@mock[method][1])
43
+ end
38
44
  else
39
45
  res.status = 500
40
46
  res.write "Method not found"
41
47
  end
42
48
  run_id = uri.query =~ /run_id=(\d+)/ ? $1 : nil
43
49
  req.body.rewind
50
+ body = if json_format?(uri) && RUBY_VERSION >= '1.9'
51
+ require 'json'
52
+ JSON.load(req.body.read)
53
+ else
54
+ Marshal.load(req.body.read)
55
+ end
44
56
  @agent_data << OpenStruct.new(:action => method,
45
- :body => Marshal.load(req.body.read),
57
+ :body => body,
46
58
  :run_id => run_id)
47
59
  end
48
60
  res.finish
49
61
  end
50
62
 
63
+ def calls_for(method)
64
+ @agent_data. \
65
+ select { |d| d.action == method }. \
66
+ map { |d| d.body }
67
+ end
68
+
69
+ def json_format?(uri)
70
+ uri.query && uri.query.include?('marshal_format=json')
71
+ end
72
+
51
73
  def run(port=30303)
52
- if is_port_available?('127.0.0.1', port)
74
+ return if @thread && @thread.alive?
75
+ serve_on_port(port) do
53
76
  @thread = Thread.new do
54
- ::Rack::Handler::WEBrick.run(self, :Port => port)
77
+ ::Rack::Handler::WEBrick.run(self,
78
+ :Port => port,
79
+ :Logger => WEBrick::Log.new("/dev/null"),
80
+ :AccessLog => [nil, nil])
55
81
  end
82
+ @thread.abort_on_exception = true
83
+ end
84
+ end
85
+
86
+ def serve_on_port(port)
87
+ if is_port_available?('127.0.0.1', port)
88
+ yield
56
89
  loop do
57
90
  break if !is_port_available?('127.0.0.1', port)
58
91
  sleep 0.01
@@ -61,8 +94,10 @@ module NewRelic
61
94
  end
62
95
 
63
96
  def stop
97
+ return unless @thread.alive?
64
98
  ::Rack::Handler::WEBrick.shutdown
65
99
  @thread.join
100
+ reset
66
101
  end
67
102
 
68
103
  def reset
@@ -70,7 +105,7 @@ module NewRelic
70
105
  @id_counter = 0
71
106
  @agent_data = []
72
107
  end
73
-
108
+
74
109
  def is_port_available?(ip, port)
75
110
  begin
76
111
  Timeout::timeout(1) do
@@ -84,16 +119,33 @@ module NewRelic
84
119
  end
85
120
  rescue Timeout::Error
86
121
  end
87
-
122
+
88
123
  return true
89
124
  end
90
125
  end
126
+
127
+ # might we need this? I'll just leave it here for now
128
+ class FakeCollectorProcess < FakeCollector
129
+ def run(port=30303)
130
+ serve_on_port(port) do
131
+ @pid = Process.fork do
132
+ ::Rack::Handler::WEBrick.run(self, :Port => port)
133
+ end
134
+ end
135
+ end
136
+
137
+ def stop
138
+ return unless @pid
139
+ Process.kill('QUIT', @pid)
140
+ Process.wait(@pid)
141
+ end
142
+ end
91
143
  end
92
144
 
93
145
  if $0 == __FILE__
94
146
  require 'test/unit'
95
147
  require 'net/http'
96
-
148
+
97
149
  class FakeCollectorTest < Test::Unit::TestCase
98
150
  def setup
99
151
  @collector = NewRelic::FakeCollector.new
@@ -103,18 +155,18 @@ if $0 == __FILE__
103
155
  def teardown
104
156
  @collector.stop
105
157
  end
106
-
158
+
107
159
  def test_get_redirect
108
- @collector.mock['get_redirect_host'] = 'test.example.com'
160
+ @collector.mock['get_redirect_host'] = [200, 'test.example.com']
109
161
  response = invoke('get_redirect_host')
110
-
162
+
111
163
  assert_equal 'test.example.com', response
112
164
  assert_equal 'get_redirect_host', @collector.agent_data[0].action
113
165
  end
114
-
166
+
115
167
  def test_connect
116
168
  response = invoke('connect')
117
-
169
+
118
170
  assert_equal 1, response['agent_run_id']
119
171
  assert_equal 'connect', @collector.agent_data[0].action
120
172
  end
@@ -122,7 +174,7 @@ if $0 == __FILE__
122
174
  def test_metric_data
123
175
  response = invoke('metric_data?run_id=1',
124
176
  {'Foo/Bar' => [1,2,3], 'Baz/Cux' => [4,5,6]})
125
-
177
+
126
178
  assert_equal 1, response['Some/Metric/Spec']
127
179
  post = @collector.agent_data[0]
128
180
  assert_equal 'metric_data', post.action
@@ -151,16 +203,27 @@ if $0 == __FILE__
151
203
  assert_equal ['node', ['node', 'node'], 'node'], post.body
152
204
  assert_equal 3, post.run_id.to_i
153
205
  end
154
-
206
+
207
+ def test_transaction_sample_data_json
208
+ response = invoke('transaction_sample_data?run_id=3&marshal_format=json',
209
+ '["node",["node","node"],"node"]')
210
+
211
+ assert_equal '', response
212
+ post = @collector.agent_data[0]
213
+ assert_equal 'transaction_sample_data', post.action
214
+ assert_equal '["node",["node","node"],"node"]', post.body
215
+ assert_equal 3, post.run_id.to_i
216
+ end
217
+
155
218
  def test_error_data
156
219
  response = invoke('error_data?run_id=4', ['error'])
157
-
220
+
158
221
  assert_nil response
159
222
  post = @collector.agent_data[0]
160
223
  assert_equal 'error_data', post.action
161
224
  assert_equal ['error'], post.body
162
225
  end
163
-
226
+
164
227
  def test_shutdown
165
228
  response = invoke('shutdown?run_id=1')
166
229
 
@@ -183,7 +246,7 @@ if $0 == __FILE__
183
246
  invoke('shutdown?run_id=2')
184
247
 
185
248
  Process.wait(pid)
186
-
249
+
187
250
  expected = ['get_redirect_host', 'connect', 'metric_data',
188
251
  'transaction_sample_data', 'shutdown',
189
252
  'get_redirect_host', 'connect', 'metric_data',
@@ -192,19 +255,28 @@ if $0 == __FILE__
192
255
  end
193
256
 
194
257
  def test_reset
195
- @collector.mock['get_redirect_host'] = 'never!'
258
+ @collector.mock['get_redirect_host'] = [200, 'never!']
196
259
  @collector.reset
197
- assert_equal 'localhost', @collector.mock['get_redirect_host']
260
+ assert_equal [200, 'localhost'], @collector.mock['get_redirect_host']
198
261
  end
199
-
262
+
200
263
  def invoke(method, post={}, code=200)
201
264
  uri = URI.parse("http://127.0.0.1:30303/agent_listener/8/12345/#{method}")
202
265
  request = Net::HTTP::Post.new("#{uri.path}?#{uri.query}")
203
- request.body = Marshal.dump(post)
266
+ if uri.query && uri.query.include?('marsha_format=json')
267
+ request.body = JSON.dump(post)
268
+ else
269
+ request.body = Marshal.dump(post)
270
+ end
204
271
  response = Net::HTTP.start(uri.host, uri.port) do |http|
205
272
  http.request(request)
206
273
  end
207
- Marshal.load(response.body)
274
+ if uri.query && uri.query.include?('marshal_format=json')
275
+ JSON.load(response.body)
276
+ else
277
+ Marshal.load(response.body)
278
+ end
208
279
  end
209
280
  end
210
281
  end
282
+