wd_newrelic_rpm 3.3.4.1 → 3.5.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (290) hide show
  1. data/.gitignore +20 -0
  2. data/.project +23 -0
  3. data/.travis.yml +9 -0
  4. data/CHANGELOG +317 -39
  5. data/GUIDELINES_FOR_CONTRIBUTING.md +76 -0
  6. data/Gemfile +16 -0
  7. data/LICENSE +1 -1
  8. data/{README.rdoc → README.md} +71 -55
  9. data/Rakefile +62 -0
  10. data/bin/mongrel_rpm +1 -1
  11. data/config.dot +290 -0
  12. data/config/database.yml +5 -0
  13. data/init.rb +31 -0
  14. data/lib/new_relic/agent.rb +31 -60
  15. data/lib/new_relic/agent/agent.rb +277 -502
  16. data/lib/new_relic/agent/agent_logger.rb +165 -0
  17. data/lib/new_relic/agent/audit_logger.rb +72 -0
  18. data/lib/new_relic/agent/beacon_configuration.rb +36 -50
  19. data/lib/new_relic/agent/browser_monitoring.rb +114 -61
  20. data/lib/new_relic/agent/busy_calculator.rb +14 -6
  21. data/lib/new_relic/agent/configuration.rb +74 -0
  22. data/lib/new_relic/agent/configuration/defaults.rb +126 -0
  23. data/lib/new_relic/agent/configuration/environment_source.rb +49 -0
  24. data/lib/new_relic/agent/configuration/manager.rb +136 -0
  25. data/lib/new_relic/agent/configuration/mask_defaults.rb +10 -0
  26. data/lib/new_relic/agent/configuration/server_source.rb +27 -0
  27. data/lib/new_relic/agent/configuration/yaml_source.rb +63 -0
  28. data/lib/new_relic/agent/cross_process_monitoring.rb +43 -0
  29. data/lib/new_relic/agent/database.rb +39 -26
  30. data/lib/new_relic/agent/error_collector.rb +48 -49
  31. data/lib/new_relic/agent/instrumentation/active_merchant.rb +1 -1
  32. data/lib/new_relic/agent/instrumentation/active_record.rb +4 -7
  33. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +1 -1
  34. data/lib/new_relic/agent/instrumentation/authlogic.rb +1 -1
  35. data/lib/new_relic/agent/instrumentation/browser_monitoring_timings.rb +41 -0
  36. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +35 -12
  37. data/lib/new_relic/agent/instrumentation/data_mapper.rb +4 -12
  38. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +2 -2
  39. data/lib/new_relic/agent/instrumentation/memcache.rb +6 -6
  40. data/lib/new_relic/agent/instrumentation/merb/controller.rb +1 -1
  41. data/lib/new_relic/agent/instrumentation/merb/errors.rb +1 -1
  42. data/lib/new_relic/agent/instrumentation/metric_frame.rb +4 -14
  43. data/lib/new_relic/agent/instrumentation/metric_frame/pop.rb +1 -1
  44. data/lib/new_relic/agent/instrumentation/net.rb +1 -1
  45. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +6 -20
  46. data/lib/new_relic/agent/instrumentation/queue_time.rb +2 -2
  47. data/lib/new_relic/agent/instrumentation/rack.rb +1 -1
  48. data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +7 -7
  49. data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +1 -1
  50. data/lib/new_relic/agent/instrumentation/rails/errors.rb +1 -1
  51. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +5 -5
  52. data/lib/new_relic/agent/instrumentation/rails3/errors.rb +6 -2
  53. data/lib/new_relic/agent/instrumentation/resque.rb +81 -0
  54. data/lib/new_relic/agent/instrumentation/sinatra.rb +21 -10
  55. data/lib/new_relic/agent/instrumentation/sunspot.rb +1 -1
  56. data/lib/new_relic/agent/instrumentation/unicorn_instrumentation.rb +5 -4
  57. data/lib/new_relic/agent/method_tracer.rb +11 -9
  58. data/lib/new_relic/agent/new_relic_service.rb +379 -0
  59. data/lib/new_relic/agent/pipe_channel_manager.rb +175 -0
  60. data/lib/new_relic/agent/pipe_service.rb +58 -0
  61. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +86 -0
  62. data/lib/new_relic/agent/samplers/memory_sampler.rb +6 -8
  63. data/lib/new_relic/agent/sql_sampler.rb +31 -74
  64. data/lib/new_relic/agent/stats_engine.rb +0 -5
  65. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +40 -24
  66. data/lib/new_relic/agent/stats_engine/metric_stats.rb +89 -14
  67. data/lib/new_relic/agent/stats_engine/samplers.rb +9 -7
  68. data/lib/new_relic/agent/stats_engine/transactions.rb +20 -12
  69. data/lib/new_relic/agent/thread.rb +32 -0
  70. data/lib/new_relic/agent/thread_profiler.rb +306 -0
  71. data/lib/new_relic/agent/transaction_info.rb +24 -4
  72. data/lib/new_relic/agent/transaction_sample_builder.rb +12 -13
  73. data/lib/new_relic/agent/transaction_sampler.rb +49 -65
  74. data/lib/new_relic/agent/worker_loop.rb +31 -25
  75. data/lib/new_relic/collection_helper.rb +1 -1
  76. data/lib/new_relic/commands/deployments.rb +19 -10
  77. data/lib/new_relic/control.rb +1 -3
  78. data/lib/new_relic/control/class_methods.rb +10 -5
  79. data/lib/new_relic/control/frameworks/merb.rb +0 -6
  80. data/lib/new_relic/control/frameworks/rails.rb +30 -45
  81. data/lib/new_relic/control/frameworks/rails3.rb +23 -18
  82. data/lib/new_relic/control/frameworks/rails4.rb +23 -0
  83. data/lib/new_relic/control/frameworks/ruby.rb +2 -23
  84. data/lib/new_relic/control/instance_methods.rb +35 -73
  85. data/lib/new_relic/control/instrumentation.rb +7 -12
  86. data/lib/new_relic/control/server_methods.rb +17 -19
  87. data/lib/new_relic/delayed_job_injection.rb +2 -2
  88. data/lib/new_relic/helper.rb +34 -0
  89. data/lib/new_relic/language_support.rb +56 -37
  90. data/lib/new_relic/local_environment.rb +32 -67
  91. data/lib/new_relic/metric_data.rb +10 -2
  92. data/lib/new_relic/metric_spec.rb +7 -3
  93. data/lib/new_relic/noticed_error.rb +32 -9
  94. data/lib/new_relic/rack.rb +4 -0
  95. data/lib/new_relic/rack/browser_monitoring.rb +34 -25
  96. data/lib/new_relic/rack/developer_mode.rb +3 -0
  97. data/lib/new_relic/rack/error_collector.rb +56 -0
  98. data/lib/new_relic/stats.rb +9 -7
  99. data/lib/new_relic/transaction_sample.rb +19 -18
  100. data/lib/new_relic/transaction_sample/segment.rb +13 -15
  101. data/lib/new_relic/version.rb +19 -3
  102. data/lib/newrelic_rpm.rb +1 -1
  103. data/lib/tasks/tests.rake +6 -8
  104. data/newrelic.yml +15 -32
  105. data/newrelic_rpm.gemspec +224 -43
  106. data/newrelic_rpm.gemspec.erb +54 -0
  107. data/test/config/newrelic.yml +4 -3
  108. data/test/config/test_control.rb +18 -18
  109. data/test/fixtures/gemspec_no_build.rb +442 -0
  110. data/test/fixtures/gemspec_with_build.rb +442 -0
  111. data/test/fixtures/gemspec_with_build_and_stage.rb +442 -0
  112. data/test/intentional_fail.rb +10 -0
  113. data/test/multiverse/.gitignore +10 -0
  114. data/test/multiverse/README.md +85 -0
  115. data/test/multiverse/lib/multiverse/color.rb +13 -0
  116. data/test/multiverse/lib/multiverse/envfile.rb +66 -0
  117. data/test/multiverse/lib/multiverse/environment.rb +16 -0
  118. data/test/multiverse/lib/multiverse/output_collector.rb +29 -0
  119. data/test/multiverse/lib/multiverse/runner.rb +44 -0
  120. data/test/multiverse/lib/multiverse/suite.rb +162 -0
  121. data/test/multiverse/script/run_one +3 -0
  122. data/test/multiverse/script/runner +9 -0
  123. data/test/multiverse/suites/active_record/Envfile +13 -0
  124. data/test/multiverse/suites/active_record/ar_method_aliasing.rb +94 -0
  125. data/test/multiverse/suites/active_record/config/newrelic.yml +22 -0
  126. data/test/multiverse/suites/active_record/encoding_test.rb +26 -0
  127. data/test/multiverse/suites/agent_only/Envfile +4 -0
  128. data/test/multiverse/suites/agent_only/audit_log_test.rb +99 -0
  129. data/test/multiverse/suites/agent_only/config/newrelic.yml +22 -0
  130. data/test/multiverse/suites/agent_only/http_response_code_test.rb +53 -0
  131. data/test/multiverse/suites/agent_only/marshaling_test.rb +109 -0
  132. data/test/multiverse/suites/agent_only/method_visibility_test.rb +98 -0
  133. data/test/multiverse/suites/agent_only/pipe_manager_test.rb +33 -0
  134. data/test/multiverse/suites/agent_only/service_timeout_test.rb +29 -0
  135. data/test/multiverse/suites/agent_only/test_trace_method_with_punctuation.rb +30 -0
  136. data/test/multiverse/suites/agent_only/test_trace_transaction_with_punctuation.rb +32 -0
  137. data/test/multiverse/suites/agent_only/thread_profiling_test.rb +80 -0
  138. data/test/multiverse/suites/config_file_loading/Envfile +7 -0
  139. data/test/multiverse/suites/config_file_loading/config_file_loading_test.rb +106 -0
  140. data/test/multiverse/suites/datamapper/Envfile +8 -0
  141. data/test/multiverse/suites/datamapper/config/newrelic.yml +22 -0
  142. data/test/multiverse/suites/datamapper/encoding_test.rb +36 -0
  143. data/test/multiverse/suites/logging/Envfile +4 -0
  144. data/test/multiverse/suites/logging/config/newrelic.yml +22 -0
  145. data/test/multiverse/suites/logging/logging_test.rb +143 -0
  146. data/test/multiverse/suites/monitor_mode_false/Envfile +2 -0
  147. data/test/multiverse/suites/monitor_mode_false/config/newrelic.yml +25 -0
  148. data/test/multiverse/suites/monitor_mode_false/no_dns_resolv.rb +29 -0
  149. data/test/multiverse/suites/no_load/Envfile +2 -0
  150. data/test/multiverse/suites/no_load/config/newrelic.yml +22 -0
  151. data/test/multiverse/suites/no_load/start_up_test.rb +14 -0
  152. data/test/multiverse/suites/rails_3_error_tracing/Envfile +15 -0
  153. data/test/multiverse/suites/rails_3_error_tracing/config/newrelic.yml +165 -0
  154. data/test/multiverse/suites/rails_3_error_tracing/error_tracing_test.rb +236 -0
  155. data/test/multiverse/suites/rails_3_gc/Envfile +8 -0
  156. data/test/multiverse/suites/rails_3_gc/config/newrelic.yml +167 -0
  157. data/test/multiverse/suites/rails_3_gc/instrumentation_test.rb +92 -0
  158. data/test/multiverse/suites/rails_3_queue_time/Envfile +15 -0
  159. data/test/multiverse/suites/rails_3_queue_time/config/newrelic.yml +165 -0
  160. data/test/multiverse/suites/rails_3_queue_time/queue_time_test.rb +75 -0
  161. data/test/multiverse/suites/rails_3_views/.gitignore +3 -0
  162. data/test/multiverse/suites/rails_3_views/Envfile +16 -0
  163. data/test/multiverse/suites/rails_3_views/app/views/foos/_foo.html.haml +1 -0
  164. data/test/multiverse/suites/rails_3_views/app/views/test/_a_partial.html.erb +1 -0
  165. data/test/multiverse/suites/rails_3_views/app/views/test/_mid_partial.html.erb +1 -0
  166. data/test/multiverse/suites/rails_3_views/app/views/test/_top_partial.html.erb +3 -0
  167. data/test/multiverse/suites/rails_3_views/app/views/test/deep_partial.html.erb +3 -0
  168. data/test/multiverse/suites/rails_3_views/app/views/test/haml_view.html.haml +6 -0
  169. data/test/multiverse/suites/rails_3_views/app/views/test/index.html.erb +4 -0
  170. data/test/multiverse/suites/rails_3_views/config/newrelic.yml +164 -0
  171. data/test/multiverse/suites/rails_3_views/view_instrumentation_test.rb +245 -0
  172. data/test/multiverse/suites/resque/Envfile +21 -0
  173. data/test/multiverse/suites/resque/config/newrelic.yml +22 -0
  174. data/test/multiverse/suites/resque/dump.rdb +0 -0
  175. data/test/multiverse/suites/resque/instrumentation_test.rb +73 -0
  176. data/test/multiverse/suites/rum_auto_instrumentation/Envfile +4 -0
  177. data/test/multiverse/suites/rum_auto_instrumentation/config/newrelic.yml +24 -0
  178. data/test/multiverse/suites/rum_auto_instrumentation/responses/worst_case_small.html +5000 -0
  179. data/test/multiverse/suites/rum_auto_instrumentation/sanity_test.rb +102 -0
  180. data/test/multiverse/suites/sinatra/Envfile +13 -0
  181. data/test/multiverse/suites/sinatra/config/newrelic.yml +24 -0
  182. data/test/multiverse/suites/sinatra/sinatra_metric_explosion_test.rb +77 -0
  183. data/test/multiverse/suites/sinatra/sinatra_routes_test.rb +46 -0
  184. data/test/multiverse/suites/sinatra/sinatra_test.rb +55 -0
  185. data/test/multiverse/test/multiverse_test.rb +55 -0
  186. data/test/multiverse/test/suite_examples/one/a/Envfile +3 -0
  187. data/test/multiverse/test/suite_examples/one/a/a_test.rb +11 -0
  188. data/test/multiverse/test/suite_examples/one/a/config/newrelic.yml +24 -0
  189. data/test/multiverse/test/suite_examples/one/b/Envfile +3 -0
  190. data/test/multiverse/test/suite_examples/one/b/b_test.rb +11 -0
  191. data/test/multiverse/test/suite_examples/one/b/config/newrelic.yml +24 -0
  192. data/test/multiverse/test/suite_examples/three/a/Envfile +2 -0
  193. data/test/multiverse/test/suite_examples/three/a/fail_test.rb +6 -0
  194. data/test/multiverse/test/suite_examples/three/b/Envfile +2 -0
  195. data/test/multiverse/test/suite_examples/three/b/win_test.rb +6 -0
  196. data/test/multiverse/test/suite_examples/two/a/Envfile +1 -0
  197. data/test/multiverse/test/suite_examples/two/a/fail_test.rb +6 -0
  198. data/test/new_relic/agent/agent/connect_test.rb +151 -227
  199. data/test/new_relic/agent/agent/start_test.rb +68 -118
  200. data/test/new_relic/agent/agent/start_worker_thread_test.rb +12 -74
  201. data/test/new_relic/agent/agent_logger_test.rb +153 -0
  202. data/test/new_relic/agent/agent_test.rb +116 -30
  203. data/test/new_relic/agent/agent_test_controller.rb +1 -1
  204. data/test/new_relic/agent/agent_test_controller_test.rb +42 -10
  205. data/test/new_relic/agent/audit_logger_test.rb +105 -0
  206. data/test/new_relic/agent/beacon_configuration_test.rb +63 -67
  207. data/test/new_relic/agent/browser_monitoring_test.rb +151 -79
  208. data/test/new_relic/agent/busy_calculator_test.rb +7 -0
  209. data/test/new_relic/agent/configuration/environment_source_test.rb +79 -0
  210. data/test/new_relic/agent/configuration/manager_test.rb +204 -0
  211. data/test/new_relic/agent/configuration/server_source_test.rb +45 -0
  212. data/test/new_relic/agent/configuration/yaml_source_test.rb +75 -0
  213. data/test/new_relic/agent/cross_process_monitoring_test.rb +77 -0
  214. data/test/new_relic/agent/database_test.rb +12 -11
  215. data/test/new_relic/agent/error_collector/notice_error_test.rb +64 -53
  216. data/test/new_relic/agent/error_collector_test.rb +33 -19
  217. data/test/new_relic/agent/instrumentation/active_record_instrumentation_test.rb +60 -30
  218. data/test/new_relic/agent/instrumentation/browser_monitoring_timings_test.rb +39 -0
  219. data/test/new_relic/agent/instrumentation/metric_frame/pop_test.rb +1 -1
  220. data/test/new_relic/agent/instrumentation/metric_frame_test.rb +6 -0
  221. data/test/new_relic/agent/instrumentation/queue_time_test.rb +14 -0
  222. data/test/new_relic/agent/instrumentation/sinatra_test.rb +25 -0
  223. data/test/new_relic/agent/instrumentation/task_instrumentation_test.rb +2 -2
  224. data/test/new_relic/agent/method_tracer/class_methods/add_method_tracer_test.rb +4 -10
  225. data/test/new_relic/agent/method_tracer/instance_methods/trace_execution_scoped_test.rb +3 -15
  226. data/test/new_relic/agent/method_tracer_test.rb +7 -6
  227. data/test/new_relic/agent/mock_scope_listener.rb +3 -0
  228. data/test/new_relic/agent/new_relic_service_test.rb +376 -0
  229. data/test/new_relic/agent/pipe_channel_manager_test.rb +131 -0
  230. data/test/new_relic/agent/pipe_service_test.rb +113 -0
  231. data/test/new_relic/agent/rpm_agent_test.rb +27 -50
  232. data/test/new_relic/agent/sql_sampler_test.rb +81 -56
  233. data/test/new_relic/agent/stats_engine/metric_stats/harvest_test.rb +3 -20
  234. data/test/new_relic/agent/stats_engine/metric_stats_test.rb +12 -1
  235. data/test/new_relic/agent/stats_engine_test.rb +17 -8
  236. data/test/new_relic/agent/thread_profiler_test.rb +537 -0
  237. data/test/new_relic/agent/thread_test.rb +89 -0
  238. data/test/new_relic/agent/threaded_test.rb +65 -0
  239. data/test/new_relic/agent/transaction_info_test.rb +45 -4
  240. data/test/new_relic/agent/transaction_sample_builder_test.rb +8 -7
  241. data/test/new_relic/agent/transaction_sampler_test.rb +193 -204
  242. data/test/new_relic/agent/worker_loop_test.rb +26 -11
  243. data/test/new_relic/agent_test.rb +113 -33
  244. data/test/new_relic/collection_helper_test.rb +7 -8
  245. data/test/new_relic/command/deployments_test.rb +18 -2
  246. data/test/new_relic/control/class_methods_test.rb +0 -18
  247. data/test/new_relic/control/frameworks/rails_test.rb +26 -0
  248. data/test/new_relic/control_test.rb +96 -137
  249. data/test/new_relic/delayed_job_injection_test.rb +6 -1
  250. data/test/new_relic/dispatcher_test.rb +54 -0
  251. data/test/new_relic/fake_collector.rb +283 -0
  252. data/test/new_relic/fake_service.rb +53 -0
  253. data/test/new_relic/fakes_sending_data.rb +30 -0
  254. data/test/new_relic/framework_test.rb +53 -0
  255. data/test/new_relic/load_test.rb +13 -0
  256. data/test/new_relic/local_environment_test.rb +11 -11
  257. data/test/new_relic/metric_data_test.rb +45 -16
  258. data/test/new_relic/noticed_error_test.rb +24 -0
  259. data/test/new_relic/rack/browser_monitoring_test.rb +20 -10
  260. data/test/new_relic/rack/developer_mode_test.rb +13 -7
  261. data/test/new_relic/rack/error_collector_test.rb +74 -0
  262. data/test/new_relic/stats_test.rb +10 -0
  263. data/test/new_relic/transaction_sample/segment_test.rb +23 -4
  264. data/test/new_relic/transaction_sample_test.rb +47 -2
  265. data/test/new_relic/version_number_test.rb +32 -0
  266. data/test/script/build_test_gem.sh +9 -3
  267. data/test/script/ci.sh +108 -35
  268. data/test/script/ci_agent-tests_runner.sh +82 -0
  269. data/test/script/ci_multiverse_runner.sh +63 -0
  270. data/test/test_contexts.rb +1 -0
  271. data/test/test_helper.rb +68 -18
  272. data/ui/helpers/developer_mode_helper.rb +21 -11
  273. data/ui/views/layouts/newrelic_default.rhtml +1 -0
  274. data/ui/views/newrelic/file/images/arrow-close.png +0 -0
  275. data/ui/views/newrelic/file/images/arrow-open.png +0 -0
  276. data/ui/views/newrelic/file/images/blue_bar.gif +0 -0
  277. data/ui/views/newrelic/file/images/file_icon.png +0 -0
  278. data/ui/views/newrelic/file/images/gray_bar.gif +0 -0
  279. data/ui/views/newrelic/show_sample.rhtml +1 -1
  280. data/ui/views/newrelic/threads.rhtml +2 -10
  281. data/vendor/gems/metric_parser-0.1.0.pre1/.specification +116 -0
  282. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet_init.rb +7 -0
  283. metadata +191 -65
  284. data/lib/new_relic/agent/samplers/delayed_job_lock_sampler.rb +0 -40
  285. data/lib/new_relic/control/configuration.rb +0 -206
  286. data/lib/new_relic/control/logging_methods.rb +0 -143
  287. data/lib/new_relic/data_serialization.rb +0 -151
  288. data/test/new_relic/control/configuration_test.rb +0 -84
  289. data/test/new_relic/control/logging_methods_test.rb +0 -185
  290. data/test/new_relic/data_serialization_test.rb +0 -208
@@ -1,26 +1,44 @@
1
1
  ENV['SKIP_RAILS'] = 'true'
2
2
  require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
3
3
  require "new_relic/agent/browser_monitoring"
4
+ require "new_relic/rack/browser_monitoring"
5
+ require 'ostruct'
4
6
 
5
7
  class NewRelic::Agent::BrowserMonitoringTest < Test::Unit::TestCase
6
8
  include NewRelic::Agent::BrowserMonitoring
7
9
  include NewRelic::Agent::Instrumentation::ControllerInstrumentation
8
-
10
+
9
11
  def setup
10
12
  NewRelic::Agent.manual_start
11
- @browser_monitoring_key = "fred"
13
+ @config = {
14
+ :beacon => 'beacon',
15
+ :disable_mobile_headers => false,
16
+ :browser_key => 'browserKey',
17
+ :application_id => '5, 6', # collector can return app multiple ids
18
+ :'rum.enabled' => true,
19
+ :episodes_file => 'this_is_my_file',
20
+ :'rum.jsonp' => true,
21
+ :license_key => 'a' * 40
22
+ }
23
+ NewRelic::Agent.config.apply_config(@config)
12
24
  @episodes_file = "this_is_my_file"
13
25
  NewRelic::Agent.instance.instance_eval do
14
- @beacon_configuration = NewRelic::Agent::BeaconConfiguration.new({"rum.enabled" => true, "browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file", 'rum.jsonp' => true})
26
+ @beacon_configuration = NewRelic::Agent::BeaconConfiguration.new
15
27
  end
28
+
29
+ def teardown
16
30
  Thread.current[:last_metric_frame] = nil
17
31
  NewRelic::Agent::TransactionInfo.clear
32
+ NewRelic::Agent.config.remove_config(@config)
18
33
  end
19
34
 
20
- def teardown
21
35
  mocha_teardown
22
36
  end
23
37
 
38
+ def test_auto_instrumentation_config_defaults_to_enabled
39
+ assert NewRelic::Agent.config[:'browser_monitoring.auto_instrument']
40
+ end
41
+
24
42
  def test_browser_monitoring_start_time_is_reset_each_request_when_auto_instrument_is_disabled
25
43
  controller = Object.new
26
44
  def controller.perform_action_without_newrelic_trace(method, options={});
@@ -29,20 +47,21 @@ class NewRelic::Agent::BrowserMonitoringTest < Test::Unit::TestCase
29
47
  def controller.newrelic_metric_path; "foo"; end
30
48
  controller.extend ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
31
49
  controller.extend ::NewRelic::Agent::BrowserMonitoring
32
- NewRelic::Control.instance['browser_monitoring'] = { 'auto_instrument' => false }
33
50
 
34
- controller.perform_action_with_newrelic_trace(:index)
35
- first_request_start_time = controller.send(:browser_monitoring_start_time)
36
- controller.perform_action_with_newrelic_trace(:index)
37
- second_request_start_time = controller.send(:browser_monitoring_start_time)
51
+ with_config(:'browser_monitoring.auto_instrument' => false) do
52
+ controller.perform_action_with_newrelic_trace(:index)
53
+ first_request_start_time = controller.send(:browser_monitoring_start_time)
54
+ controller.perform_action_with_newrelic_trace(:index)
55
+ second_request_start_time = controller.send(:browser_monitoring_start_time)
38
56
 
39
- # assert that these aren't the same time object
40
- # the start time should be reinitialized each request to the controller
41
- assert !(first_request_start_time.equal? second_request_start_time)
57
+ # assert that these aren't the same time object
58
+ # the start time should be reinitialized each request to the controller
59
+ assert !(first_request_start_time.equal? second_request_start_time)
60
+ end
42
61
  end
43
62
 
44
63
  def test_browser_timing_header_with_no_beacon_configuration
45
- NewRelic::Agent.instance.expects(:beacon_configuration).returns( nil)
64
+ NewRelic::Agent.instance.stubs(:beacon_configuration).returns( nil)
46
65
  header = browser_timing_header
47
66
  assert_equal "", header
48
67
  end
@@ -53,15 +72,17 @@ class NewRelic::Agent::BrowserMonitoringTest < Test::Unit::TestCase
53
72
  end
54
73
 
55
74
  def test_browser_timing_header_with_rum_enabled_not_specified
56
- NewRelic::Agent.instance.expects(:beacon_configuration).at_least_once.returns( NewRelic::Agent::BeaconConfiguration.new({"browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"}))
75
+ NewRelic::Agent.instance.stubs(:beacon_configuration).returns( NewRelic::Agent::BeaconConfiguration.new)
57
76
  header = browser_timing_header
58
77
  assert_equal "<script type=\"text/javascript\">var NREUMQ=NREUMQ||[];NREUMQ.push([\"mark\",\"firstbyte\",new Date().getTime()]);</script>", header
59
78
  end
60
79
 
61
80
  def test_browser_timing_header_with_rum_enabled_false
62
- NewRelic::Agent.instance.expects(:beacon_configuration).twice.returns( NewRelic::Agent::BeaconConfiguration.new({"rum.enabled" => false, "browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"}))
63
- header = browser_timing_header
64
- assert_equal "", header
81
+ with_config(:'rum.enabled' => false) do
82
+ NewRelic::Agent.instance.stubs(:beacon_configuration).returns( NewRelic::Agent::BeaconConfiguration.new)
83
+ header = browser_timing_header
84
+ assert_equal "", header
85
+ end
65
86
  end
66
87
 
67
88
  def test_browser_timing_header_disable_all_tracing
@@ -81,28 +102,34 @@ class NewRelic::Agent::BrowserMonitoringTest < Test::Unit::TestCase
81
102
  end
82
103
 
83
104
  def test_browser_timing_footer
84
- browser_timing_header
85
- NewRelic::Control.instance.expects(:license_key).returns("a" * 13)
86
-
87
- footer = browser_timing_footer
88
- snippet = '<script type="text/javascript">if (!NREUMQ.f) { NREUMQ.f=function() {
105
+ with_config(:license_key => 'a' * 13) do
106
+ browser_timing_header
107
+ footer = browser_timing_footer
108
+ snippet = '<script type="text/javascript">if (!NREUMQ.f) { NREUMQ.f=function() {
89
109
  NREUMQ.push(["load",new Date().getTime()]);
90
110
  var e=document.createElement("script");'
91
- assert footer.include?(snippet), "Expected footer to include snippet: #{snippet}, but instead was #{footer}"
111
+ assert(footer.include?(snippet),
112
+ "Expected footer to include snippet: #{snippet}, but instead was #{footer}")
113
+ end
92
114
  end
93
115
 
94
116
  def test_browser_timing_footer_with_no_browser_key_rum_enabled
95
- browser_timing_header
96
- NewRelic::Agent.instance.expects(:beacon_configuration).returns( NewRelic::Agent::BeaconConfiguration.new({"rum.enabled" => true, "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"}))
97
- footer = browser_timing_footer
98
- assert_equal "", footer
117
+ with_config(:browser_key => '') do
118
+ browser_timing_header
119
+ NewRelic::Agent.instance.stubs(:beacon_configuration).returns(NewRelic::Agent::BeaconConfiguration.new)
120
+ footer = browser_timing_footer
121
+ assert_equal "", footer
122
+ end
99
123
  end
100
124
 
101
125
  def test_browser_timing_footer_with_no_browser_key_rum_disabled
102
- browser_timing_header
103
- NewRelic::Agent.instance.expects(:beacon_configuration).returns( NewRelic::Agent::BeaconConfiguration.new({"rum.enabled" => false, "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file"}))
104
- footer = browser_timing_footer
105
- assert_equal "", footer
126
+ with_config(:'rum.enabled' => false) do
127
+ browser_timing_header
128
+ NewRelic::Agent.instance.stubs(:beacon_configuration) \
129
+ .returns(NewRelic::Agent::BeaconConfiguration.new)
130
+ footer = browser_timing_footer
131
+ assert_equal "", footer
132
+ end
106
133
  end
107
134
 
108
135
  def test_browser_timing_footer_with_rum_enabled_not_specified
@@ -110,26 +137,27 @@ var e=document.createElement("script");'
110
137
 
111
138
  license_bytes = [];
112
139
  ("a" * 13).each_byte {|byte| license_bytes << byte}
113
- config = NewRelic::Agent::BeaconConfiguration.new({"browser_key" => "browserKey", "application_id" => "apId", "beacon"=>"beacon", "episodes_url"=>"this_is_my_file", "license_bytes" => license_bytes})
140
+ config = NewRelic::Agent::BeaconConfiguration.new
114
141
  config.expects(:license_bytes).returns(license_bytes).at_least_once
115
- NewRelic::Agent.instance.expects(:beacon_configuration).returns(config).at_least_once
142
+ NewRelic::Agent.instance.stubs(:beacon_configuration).returns(config).at_least_once
116
143
  footer = browser_timing_footer
117
144
  beginning_snippet = '<script type="text/javascript">if (!NREUMQ.f) { NREUMQ.f=function() {
118
145
  NREUMQ.push(["load",new Date().getTime()]);
119
146
  var e=document.createElement("script");'
120
- ending_snippet = "])</script>"
121
- assert(footer.include?(beginning_snippet), "expected footer to include beginning snippet: #{beginning_snippet}, but was #{footer}")
122
- assert(footer.include?(ending_snippet), "expected footer to include ending snippet: #{ending_snippet}, but was #{footer}")
147
+ ending_snippet = "]);</script>"
148
+ assert(footer.include?(beginning_snippet),
149
+ "expected footer to include beginning snippet: #{beginning_snippet}, but was #{footer}")
150
+ assert(footer.include?(ending_snippet),
151
+ "expected footer to include ending snippet: #{ending_snippet}, but was #{footer}")
123
152
  end
124
153
 
125
154
  def test_browser_timing_footer_with_no_beacon_configuration
126
155
  browser_timing_header
127
- NewRelic::Agent.instance.expects(:beacon_configuration).returns( nil)
156
+ NewRelic::Agent.instance.stubs(:beacon_configuration).returns( nil)
128
157
  footer = browser_timing_footer
129
158
  assert_equal "", footer
130
159
  end
131
160
 
132
-
133
161
  def test_browser_timing_footer_disable_all_tracing
134
162
  browser_timing_header
135
163
  footer = nil
@@ -148,30 +176,31 @@ var e=document.createElement("script");'
148
176
  assert_equal "", footer
149
177
  end
150
178
 
151
- def test_browser_timing_footer_browser_monitoring_key_missing
152
- fake_config = mock('beacon configuration')
153
- NewRelic::Agent.instance.expects(:beacon_configuration).returns(fake_config)
154
- fake_config.expects(:nil?).returns(false)
155
- fake_config.expects(:rum_enabled).returns(true)
156
- fake_config.expects(:browser_monitoring_key).returns(nil)
157
- self.expects(:generate_footer_js).never
158
- assert_equal('', browser_timing_footer, "should not return a footer when there is no key")
179
+ def test_browser_timing_footer_browser_key_missing
180
+ with_config(:browser_key => '') do
181
+ fake_config = mock('beacon configuration')
182
+ NewRelic::Agent.instance.stubs(:beacon_configuration).returns(fake_config)
183
+ fake_config.expects(:nil?).returns(false)
184
+ fake_config.expects(:enabled?).returns(true)
185
+ self.expects(:generate_footer_js).never
186
+ assert_equal('', browser_timing_footer, "should not return a footer when there is no key")
187
+ end
159
188
  end
160
189
 
161
190
  def test_generate_footer_js_null_case
162
191
  self.expects(:browser_monitoring_start_time).returns(nil)
163
192
  assert_equal('', generate_footer_js(NewRelic::Agent.instance.beacon_configuration), "should not send javascript when there is no start time")
164
193
  end
165
-
194
+
166
195
  def test_generate_footer_js_with_start_time
167
- self.expects(:browser_monitoring_start_time).returns(Time.at(100))
168
- fake_bc = mock('beacon configuration')
169
- fake_bc.expects(:application_id).returns(1)
170
- fake_bc.expects(:beacon).returns('beacon')
171
- fake_bc.expects(:browser_monitoring_key).returns('a' * 40)
172
- NewRelic::Agent.instance.stubs(:beacon_configuration).returns(fake_bc)
173
- self.expects(:footer_js_string).with(NewRelic::Agent.instance.beacon_configuration, 'beacon', 'a' * 40, 1).returns('footer js')
174
- assert_equal('footer js', generate_footer_js(NewRelic::Agent.instance.beacon_configuration), 'should generate and return the footer JS when there is a start time')
196
+ with_config(:browser_key => 'a' * 40) do
197
+ self.expects(:browser_monitoring_start_time).returns(Time.at(100))
198
+ fake_bc = mock('beacon configuration')
199
+ NewRelic::Agent.instance.stubs(:beacon_configuration).returns(fake_bc)
200
+ self.expects(:footer_js_string).with(NewRelic::Agent.instance.beacon_configuration).returns('footer js')
201
+ assert_equal('footer js', generate_footer_js(NewRelic::Agent.instance.beacon_configuration),
202
+ 'should generate and return the footer JS when there is a start time')
203
+ end
175
204
  end
176
205
 
177
206
  def test_browser_monitoring_transaction_name_basic
@@ -193,27 +222,23 @@ var e=document.createElement("script");'
193
222
  def test_browser_monitoring_transaction_name_nil
194
223
  assert_equal('(unknown)', browser_monitoring_transaction_name, "should fill in a default when it is nil")
195
224
  end
196
-
225
+
197
226
  def test_browser_monitoring_transaction_name_when_tt_disabled
198
- @sampler = NewRelic::Agent.instance.transaction_sampler
199
- @sampler.disable
227
+ with_config(:'transaction_tracer.enabled' => false) do
228
+ perform_action_with_newrelic_trace(:name => 'disabled_transactions') do
229
+ self.class.inspect
230
+ end
200
231
 
201
- perform_action_with_newrelic_trace(:name => 'disabled_transactions') do
202
- self.class.inspect
232
+ assert_match(/disabled_transactions/, browser_monitoring_transaction_name,
233
+ "should name transaction when transaction tracing disabled")
203
234
  end
204
-
205
- assert_match(/disabled_transactions/, browser_monitoring_transaction_name,
206
- "should name transaction when transaction tracing disabled")
207
- ensure
208
- @sampler.enable
209
- end
210
-
211
-
235
+ end
236
+
212
237
  def test_browser_monitoring_start_time
213
238
  mock = mock('transaction info')
214
-
239
+
215
240
  NewRelic::Agent::TransactionInfo.set(mock)
216
-
241
+
217
242
  mock.stubs(:start_time).returns(Time.at(100))
218
243
  mock.stubs(:guid).returns('ABC')
219
244
  assert_equal(Time.at(100), browser_monitoring_start_time, "should take the value from the thread local")
@@ -228,7 +253,7 @@ var e=document.createElement("script");'
228
253
  def test_browser_monitoring_app_time_nonzero
229
254
  start = Time.now
230
255
  self.expects(:browser_monitoring_start_time).returns(start - 1)
231
- Time.expects(:now).returns(start)
256
+ Time.stubs(:now).returns(start)
232
257
  assert_equal(1000, browser_monitoring_app_time, 'should return a rounded time')
233
258
  end
234
259
 
@@ -255,10 +280,6 @@ var e=document.createElement("script");'
255
280
  end
256
281
 
257
282
  def test_footer_js_string_basic
258
- beacon = ''
259
- license_key = ''
260
- application_id = 1
261
-
262
283
  # mocking this because JRuby thinks that Time.now - Time.now
263
284
  # always takes at least 1ms
264
285
  self.expects(:browser_monitoring_app_time).returns(0)
@@ -269,21 +290,21 @@ var e=document.createElement("script");'
269
290
 
270
291
  sample = mock('transaction info')
271
292
  NewRelic::Agent::TransactionInfo.set(sample)
272
-
293
+
273
294
  sample.stubs(:start_time).returns(Time.at(100))
274
295
  sample.stubs(:guid).returns('ABC')
275
296
  sample.stubs(:transaction_name).returns('most recent transaction')
276
297
  sample.stubs(:include_guid?).returns(true)
277
298
  sample.stubs(:duration).returns(12.0)
278
299
  sample.stubs(:token).returns('0123456789ABCDEF')
279
-
300
+
280
301
  self.expects(:obfuscate).with(NewRelic::Agent.instance.beacon_configuration, 'most recent transaction').returns('most recent transaction')
281
302
  self.expects(:obfuscate).with(NewRelic::Agent.instance.beacon_configuration, 'user').returns('user')
282
303
  self.expects(:obfuscate).with(NewRelic::Agent.instance.beacon_configuration, 'account').returns('account')
283
304
  self.expects(:obfuscate).with(NewRelic::Agent.instance.beacon_configuration, 'product').returns('product')
284
305
 
285
- value = footer_js_string(NewRelic::Agent.instance.beacon_configuration, beacon, license_key, application_id)
286
- assert_equal("<script type=\"text/javascript\">if (!NREUMQ.f) { NREUMQ.f=function() {\nNREUMQ.push([\"load\",new Date().getTime()]);\nvar e=document.createElement(\"script\");\ne.type=\"text/javascript\";e.async=true;e.src=\"this_is_my_file\";\ndocument.body.appendChild(e);\nif(NREUMQ.a)NREUMQ.a();\n};\nNREUMQ.a=window.onload;window.onload=NREUMQ.f;\n};\nNREUMQ.push([\"nrfj\",\"\",\"\",1,\"most recent transaction\",0,0,new Date().getTime(),\"ABC\",\"0123456789ABCDEF\",\"user\",\"account\",\"product\"])</script>", value, "should return the javascript given some default values")
306
+ value = footer_js_string(NewRelic::Agent.instance.beacon_configuration)
307
+ assert_equal(%'<script type="text/javascript">if (!NREUMQ.f) { NREUMQ.f=function() {\nNREUMQ.push(["load",new Date().getTime()]);\nvar e=document.createElement("script");\ne.type="text/javascript";\ne.src=(("http:"===document.location.protocol)?"http:":"https:") + "//" +\n "this_is_my_file";\ndocument.body.appendChild(e);\nif(NREUMQ.a)NREUMQ.a();\n};\nNREUMQ.a=window.onload;window.onload=NREUMQ.f;\n};\nNREUMQ.push(["nrfj","beacon","browserKey","5, 6","most recent transaction",0,0,new Date().getTime(),"ABC","0123456789ABCDEF","user","account","product"]);</script>', value, "should return the javascript given some default values")
287
308
  end
288
309
 
289
310
  def test_html_safe_if_needed_unsafed
@@ -320,4 +341,55 @@ var e=document.createElement("script");'
320
341
  output = obfuscate(NewRelic::Agent.instance.beacon_configuration, text)
321
342
  assert_equal('YCJrZXV2fih5Y25vaCFtZSR2a2ZkZSp/aXV1YyNsZHZ3cSl6YmluZCJsYiV1amllZit4aHl2YiRtZ3d4cCp7ZWhiZyNrYyZ0ZWhmZyx5ZHp3ZSVuZnh5cyt8ZGRhZiRqYCd7ZGtnYC11Z3twZCZvaXl6cix9aGdgYSVpYSh6Z2pgYSF2Znxx', output, "should output obfuscated text")
322
343
  end
344
+
345
+ def test_no_mobile_response_header_if_no_mobile_request_header_given
346
+ request = Rack::Request.new({})
347
+ response = Rack::Response.new
348
+
349
+ NewRelic::Agent::BrowserMonitoring.insert_mobile_response_header(request, response)
350
+ assert_nil response['X-NewRelic-Beacon-Url']
351
+ end
352
+
353
+ def test_no_mobile_response_header_if_mobile_request_header_is_false
354
+ request = Rack::Request.new('HTTP_X_NEWRELIC_MOBILE_TRACE' => 'false')
355
+ response = Rack::Response.new
356
+
357
+ NewRelic::Agent::BrowserMonitoring.insert_mobile_response_header(request, response)
358
+ assert_nil response['X-NewRelic-Beacon-Url']
359
+ end
360
+
361
+ def test_place_beacon_url_header_when_given_mobile_request_header
362
+ response = mobile_transaction
363
+ assert_equal('http://beacon/mobile/1/browserKey',
364
+ response['X-NewRelic-Beacon-Url'])
365
+ end
366
+
367
+ def test_place_beacon_url_header_when_given_mobile_request_header_with_https
368
+ request = Rack::Request.new('X_NEWRELIC_MOBILE_TRACE' => 'true',
369
+ 'rack.url_scheme' => 'https')
370
+ response = mobile_transaction(request)
371
+ assert_equal('https://beacon/mobile/1/browserKey',
372
+ response['X-NewRelic-Beacon-Url'])
373
+ end
374
+
375
+ def test_place_beacon_payload_head_when_given_mobile_request_header
376
+ Time.stubs(:now).returns(6)
377
+ response = mobile_transaction
378
+ txn_name = obfuscate(NewRelic::Agent.instance.beacon_configuration,
379
+ browser_monitoring_transaction_name)
380
+ expected_payload = %|["5, 6","#{txn_name}",#{browser_monitoring_queue_time},#{browser_monitoring_app_time}]|
381
+
382
+ assert_equal expected_payload, response['X-NewRelic-App-Server-Metrics'].strip
383
+ end
384
+
385
+ def mobile_transaction(request=nil)
386
+ request ||= Rack::Request.new('X-NewRelic-Mobile-Trace' => 'true')
387
+ response = Rack::Response.new
388
+ txn_data = OpenStruct.new(:transaction_name => 'a transaction name',
389
+ :start_time => 5,
390
+ :force_persist_sample? => false)
391
+ NewRelic::Agent::TransactionInfo.set(txn_data)
392
+ NewRelic::Agent::BrowserMonitoring.insert_mobile_response_header(request, response)
393
+ response
394
+ end
323
395
  end
@@ -78,4 +78,11 @@ class NewRelic::Agent::BusyCalculatorTest < Test::Unit::TestCase
78
78
  NewRelic::Agent::BusyCalculator.harvest_busy
79
79
  assert_equal 3, @instance_busy.call_count
80
80
  end
81
+ def test_can_turn_off_recording
82
+ with_config(:report_instance_busy => false) do
83
+ assert_equal 0, @instance_busy.call_count, "Problem with test--instance busy not starting off at zero."
84
+ NewRelic::Agent::BusyCalculator.harvest_busy
85
+ assert_equal 0, @instance_busy.call_count
86
+ end
87
+ end
81
88
  end
@@ -0,0 +1,79 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','test_helper'))
2
+ require 'new_relic/agent/configuration/environment_source'
3
+
4
+ module NewRelic::Agent::Configuration
5
+ class EnvironmentSourceTest < Test::Unit::TestCase
6
+
7
+ def setup
8
+ @original_env = {}
9
+ @original_env.replace(ENV)
10
+ end
11
+
12
+ def teardown
13
+ ENV.replace(@original_env)
14
+ end
15
+
16
+ def test_environment_strings_are_applied
17
+ assert_applied_string 'NRCONFIG', 'config_path'
18
+ assert_applied_string 'NEW_RELIC_LICENSE_KEY', 'license_key'
19
+ assert_applied_string 'NEWRELIC_LICENSE_KEY', 'license_key'
20
+ assert_applied_string 'NEW_RELIC_APP_NAME', 'app_name'
21
+ assert_applied_string 'NEWRELIC_APP_NAME', 'app_name'
22
+ assert_applied_string 'NEW_RELIC_HOST', 'host'
23
+ assert_applied_string 'NEW_RELIC_PORT', 'port'
24
+ end
25
+
26
+ def test_environment_symbols_are_applied
27
+ assert_applied_symbol 'NEW_RELIC_DISPATCHER', 'dispatcher'
28
+ assert_applied_symbol 'NEWRELIC_DISPATCHER', 'dispatcher'
29
+ assert_applied_symbol 'NEW_RELIC_FRAMEWORK', 'framework'
30
+ assert_applied_symbol 'NEWRELIC_FRAMEWORK', 'framework'
31
+ end
32
+
33
+ def test_environment_booleans_truths_are_applied
34
+ ENV['NEWRELIC_ENABLE'] = 'true'
35
+ assert EnvironmentSource.new[:agent_enabled]
36
+ ENV['NEWRELIC_ENABLE'] = 'on'
37
+ assert EnvironmentSource.new[:agent_enabled]
38
+ ENV['NEWRELIC_ENABLE'] = 'yes'
39
+ assert EnvironmentSource.new[:agent_enabled]
40
+ ENV.delete('NEWRELIC_ENABLE')
41
+ end
42
+
43
+ def test_environment_booleans_falsehoods_are_applied
44
+ ENV['NEWRELIC_ENABLE'] = 'false'
45
+ assert !EnvironmentSource.new[:agent_enabled]
46
+ ENV['NEWRELIC_ENABLE'] = 'off'
47
+ assert !EnvironmentSource.new[:agent_enabled]
48
+ ENV['NEWRELIC_ENABLE'] = 'no'
49
+ assert !EnvironmentSource.new[:agent_enabled]
50
+ ENV.delete('NEWRELIC_ENABLE')
51
+ end
52
+
53
+ def test_set_log_config_from_environment
54
+ ENV['NEW_RELIC_LOG'] = 'off/in/space.log'
55
+ source = EnvironmentSource.new
56
+ assert_equal 'off/in', source[:log_file_path]
57
+ assert_equal 'space.log', source[:log_file_name]
58
+ end
59
+
60
+ def test_set_log_config_STDOUT_from_environment
61
+ ENV['NEW_RELIC_LOG'] = 'STDOUT'
62
+ source = EnvironmentSource.new
63
+ assert_equal 'STDOUT', source[:log_file_name]
64
+ assert_equal 'STDOUT', source[:log_file_path]
65
+ end
66
+
67
+ def assert_applied_string(env_var, config_var)
68
+ ENV[env_var] = 'test value'
69
+ assert_equal 'test value', EnvironmentSource.new[config_var.to_sym]
70
+ ENV.delete(env_var)
71
+ end
72
+
73
+ def assert_applied_symbol(env_var, config_var)
74
+ ENV[env_var] = 'test value'
75
+ assert_equal :'test value', EnvironmentSource.new[config_var.to_sym]
76
+ ENV.delete(env_var)
77
+ end
78
+ end
79
+ end