dolores_rpm 3.2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (257) hide show
  1. data/CHANGELOG +559 -0
  2. data/LICENSE +64 -0
  3. data/README.rdoc +179 -0
  4. data/bin/mongrel_rpm +33 -0
  5. data/bin/newrelic +13 -0
  6. data/bin/newrelic_cmd +5 -0
  7. data/cert/cacert.pem +118 -0
  8. data/cert/oldsite.pem +28 -0
  9. data/cert/site.pem +27 -0
  10. data/dolores_rpm-3.3.4.fork.gem +0 -0
  11. data/install.rb +9 -0
  12. data/lib/conditional_vendored_dependency_detection.rb +3 -0
  13. data/lib/conditional_vendored_metric_parser.rb +5 -0
  14. data/lib/new_relic/agent/agent.rb +1311 -0
  15. data/lib/new_relic/agent/beacon_configuration.rb +110 -0
  16. data/lib/new_relic/agent/browser_monitoring.rb +102 -0
  17. data/lib/new_relic/agent/busy_calculator.rb +99 -0
  18. data/lib/new_relic/agent/chained_call.rb +13 -0
  19. data/lib/new_relic/agent/database.rb +203 -0
  20. data/lib/new_relic/agent/error_collector.rb +251 -0
  21. data/lib/new_relic/agent/instrumentation/active_merchant.rb +27 -0
  22. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +68 -0
  23. data/lib/new_relic/agent/instrumentation/authlogic.rb +19 -0
  24. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +424 -0
  25. data/lib/new_relic/agent/instrumentation/data_mapper.rb +57 -0
  26. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +52 -0
  27. data/lib/new_relic/agent/instrumentation/memcache.rb +80 -0
  28. data/lib/new_relic/agent/instrumentation/merb/controller.rb +41 -0
  29. data/lib/new_relic/agent/instrumentation/merb/errors.rb +29 -0
  30. data/lib/new_relic/agent/instrumentation/metric_frame/pop.rb +80 -0
  31. data/lib/new_relic/agent/instrumentation/metric_frame.rb +332 -0
  32. data/lib/new_relic/agent/instrumentation/net.rb +29 -0
  33. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +36 -0
  34. data/lib/new_relic/agent/instrumentation/queue_time.rb +210 -0
  35. data/lib/new_relic/agent/instrumentation/rack.rb +98 -0
  36. data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +114 -0
  37. data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +42 -0
  38. data/lib/new_relic/agent/instrumentation/rails/active_record_instrumentation.rb +115 -0
  39. data/lib/new_relic/agent/instrumentation/rails/errors.rb +42 -0
  40. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +118 -0
  41. data/lib/new_relic/agent/instrumentation/rails3/active_record_instrumentation.rb +122 -0
  42. data/lib/new_relic/agent/instrumentation/rails3/errors.rb +37 -0
  43. data/lib/new_relic/agent/instrumentation/sinatra.rb +58 -0
  44. data/lib/new_relic/agent/instrumentation/sunspot.rb +29 -0
  45. data/lib/new_relic/agent/instrumentation/unicorn_instrumentation.rb +21 -0
  46. data/lib/new_relic/agent/instrumentation.rb +9 -0
  47. data/lib/new_relic/agent/method_tracer.rb +528 -0
  48. data/lib/new_relic/agent/sampler.rb +50 -0
  49. data/lib/new_relic/agent/samplers/cpu_sampler.rb +58 -0
  50. data/lib/new_relic/agent/samplers/delayed_job_lock_sampler.rb +40 -0
  51. data/lib/new_relic/agent/samplers/memory_sampler.rb +144 -0
  52. data/lib/new_relic/agent/samplers/object_sampler.rb +26 -0
  53. data/lib/new_relic/agent/shim_agent.rb +29 -0
  54. data/lib/new_relic/agent/sql_sampler.rb +267 -0
  55. data/lib/new_relic/agent/stats_engine/metric_stats.rb +187 -0
  56. data/lib/new_relic/agent/stats_engine/samplers.rb +95 -0
  57. data/lib/new_relic/agent/stats_engine/transactions.rb +208 -0
  58. data/lib/new_relic/agent/stats_engine.rb +25 -0
  59. data/lib/new_relic/agent/transaction_sample_builder.rb +101 -0
  60. data/lib/new_relic/agent/transaction_sampler.rb +397 -0
  61. data/lib/new_relic/agent/worker_loop.rb +89 -0
  62. data/lib/new_relic/agent.rb +454 -0
  63. data/lib/new_relic/collection_helper.rb +75 -0
  64. data/lib/new_relic/command.rb +85 -0
  65. data/lib/new_relic/commands/deployments.rb +105 -0
  66. data/lib/new_relic/commands/install.rb +80 -0
  67. data/lib/new_relic/control/class_methods.rb +53 -0
  68. data/lib/new_relic/control/configuration.rb +202 -0
  69. data/lib/new_relic/control/frameworks/external.rb +16 -0
  70. data/lib/new_relic/control/frameworks/merb.rb +31 -0
  71. data/lib/new_relic/control/frameworks/rails.rb +164 -0
  72. data/lib/new_relic/control/frameworks/rails3.rb +75 -0
  73. data/lib/new_relic/control/frameworks/ruby.rb +42 -0
  74. data/lib/new_relic/control/frameworks/sinatra.rb +20 -0
  75. data/lib/new_relic/control/frameworks.rb +10 -0
  76. data/lib/new_relic/control/instance_methods.rb +179 -0
  77. data/lib/new_relic/control/instrumentation.rb +100 -0
  78. data/lib/new_relic/control/logging_methods.rb +143 -0
  79. data/lib/new_relic/control/profiling.rb +25 -0
  80. data/lib/new_relic/control/server_methods.rb +114 -0
  81. data/lib/new_relic/control.rb +46 -0
  82. data/lib/new_relic/data_serialization.rb +157 -0
  83. data/lib/new_relic/delayed_job_injection.rb +46 -0
  84. data/lib/new_relic/language_support.rb +69 -0
  85. data/lib/new_relic/local_environment.rb +414 -0
  86. data/lib/new_relic/merbtasks.rb +6 -0
  87. data/lib/new_relic/metric_data.rb +51 -0
  88. data/lib/new_relic/metric_spec.rb +75 -0
  89. data/lib/new_relic/metrics.rb +9 -0
  90. data/lib/new_relic/noticed_error.rb +24 -0
  91. data/lib/new_relic/rack/browser_monitoring.rb +68 -0
  92. data/lib/new_relic/rack/developer_mode.rb +268 -0
  93. data/lib/new_relic/recipes.rb +73 -0
  94. data/lib/new_relic/stats.rb +388 -0
  95. data/lib/new_relic/timer_lib.rb +27 -0
  96. data/lib/new_relic/transaction_analysis/segment_summary.rb +49 -0
  97. data/lib/new_relic/transaction_analysis.rb +77 -0
  98. data/lib/new_relic/transaction_sample/composite_segment.rb +27 -0
  99. data/lib/new_relic/transaction_sample/fake_segment.rb +9 -0
  100. data/lib/new_relic/transaction_sample/segment.rb +201 -0
  101. data/lib/new_relic/transaction_sample/summary_segment.rb +21 -0
  102. data/lib/new_relic/transaction_sample.rb +245 -0
  103. data/lib/new_relic/url_rule.rb +14 -0
  104. data/lib/new_relic/version.rb +55 -0
  105. data/lib/newrelic_rpm.rb +49 -0
  106. data/lib/tasks/all.rb +4 -0
  107. data/lib/tasks/install.rake +7 -0
  108. data/lib/tasks/tests.rake +19 -0
  109. data/newrelic.yml +265 -0
  110. data/recipes/newrelic.rb +6 -0
  111. data/test/active_record_fixtures.rb +77 -0
  112. data/test/config/newrelic.yml +48 -0
  113. data/test/config/test_control.rb +48 -0
  114. data/test/new_relic/agent/agent/connect_test.rb +410 -0
  115. data/test/new_relic/agent/agent/start_test.rb +255 -0
  116. data/test/new_relic/agent/agent/start_worker_thread_test.rb +153 -0
  117. data/test/new_relic/agent/agent_test.rb +139 -0
  118. data/test/new_relic/agent/agent_test_controller.rb +77 -0
  119. data/test/new_relic/agent/agent_test_controller_test.rb +363 -0
  120. data/test/new_relic/agent/apdex_from_server_test.rb +9 -0
  121. data/test/new_relic/agent/beacon_configuration_test.rb +108 -0
  122. data/test/new_relic/agent/browser_monitoring_test.rb +278 -0
  123. data/test/new_relic/agent/busy_calculator_test.rb +81 -0
  124. data/test/new_relic/agent/database_test.rb +162 -0
  125. data/test/new_relic/agent/error_collector/notice_error_test.rb +257 -0
  126. data/test/new_relic/agent/error_collector_test.rb +175 -0
  127. data/test/new_relic/agent/instrumentation/active_record_instrumentation_test.rb +538 -0
  128. data/test/new_relic/agent/instrumentation/controller_instrumentation_test.rb +36 -0
  129. data/test/new_relic/agent/instrumentation/instrumentation_test.rb +11 -0
  130. data/test/new_relic/agent/instrumentation/metric_frame/pop_test.rb +172 -0
  131. data/test/new_relic/agent/instrumentation/metric_frame_test.rb +50 -0
  132. data/test/new_relic/agent/instrumentation/net_instrumentation_test.rb +84 -0
  133. data/test/new_relic/agent/instrumentation/queue_time_test.rb +387 -0
  134. data/test/new_relic/agent/instrumentation/rack_test.rb +35 -0
  135. data/test/new_relic/agent/instrumentation/task_instrumentation_test.rb +184 -0
  136. data/test/new_relic/agent/memcache_instrumentation_test.rb +143 -0
  137. data/test/new_relic/agent/method_tracer/class_methods/add_method_tracer_test.rb +164 -0
  138. data/test/new_relic/agent/method_tracer/instance_methods/trace_execution_scoped_test.rb +234 -0
  139. data/test/new_relic/agent/method_tracer_test.rb +386 -0
  140. data/test/new_relic/agent/mock_scope_listener.rb +23 -0
  141. data/test/new_relic/agent/rpm_agent_test.rb +149 -0
  142. data/test/new_relic/agent/sampler_test.rb +19 -0
  143. data/test/new_relic/agent/shim_agent_test.rb +20 -0
  144. data/test/new_relic/agent/sql_sampler_test.rb +160 -0
  145. data/test/new_relic/agent/stats_engine/metric_stats/harvest_test.rb +150 -0
  146. data/test/new_relic/agent/stats_engine/metric_stats_test.rb +82 -0
  147. data/test/new_relic/agent/stats_engine/samplers_test.rb +99 -0
  148. data/test/new_relic/agent/stats_engine_test.rb +185 -0
  149. data/test/new_relic/agent/transaction_sample_builder_test.rb +195 -0
  150. data/test/new_relic/agent/transaction_sampler_test.rb +955 -0
  151. data/test/new_relic/agent/worker_loop_test.rb +66 -0
  152. data/test/new_relic/agent_test.rb +175 -0
  153. data/test/new_relic/collection_helper_test.rb +149 -0
  154. data/test/new_relic/command/deployments_test.rb +68 -0
  155. data/test/new_relic/control/class_methods_test.rb +62 -0
  156. data/test/new_relic/control/configuration_test.rb +72 -0
  157. data/test/new_relic/control/logging_methods_test.rb +185 -0
  158. data/test/new_relic/control_test.rb +254 -0
  159. data/test/new_relic/data_serialization_test.rb +208 -0
  160. data/test/new_relic/delayed_job_injection_test.rb +16 -0
  161. data/test/new_relic/local_environment_test.rb +72 -0
  162. data/test/new_relic/metric_data_test.rb +125 -0
  163. data/test/new_relic/metric_spec_test.rb +95 -0
  164. data/test/new_relic/rack/all_test.rb +11 -0
  165. data/test/new_relic/rack/browser_monitoring_test.rb +84 -0
  166. data/test/new_relic/rack/developer_mode_helper_test.rb +141 -0
  167. data/test/new_relic/rack/developer_mode_test.rb +43 -0
  168. data/test/new_relic/stats_test.rb +426 -0
  169. data/test/new_relic/transaction_analysis/segment_summary_test.rb +91 -0
  170. data/test/new_relic/transaction_analysis_test.rb +121 -0
  171. data/test/new_relic/transaction_sample/composite_segment_test.rb +35 -0
  172. data/test/new_relic/transaction_sample/fake_segment_test.rb +17 -0
  173. data/test/new_relic/transaction_sample/segment_test.rb +389 -0
  174. data/test/new_relic/transaction_sample/summary_segment_test.rb +31 -0
  175. data/test/new_relic/transaction_sample_subtest_test.rb +56 -0
  176. data/test/new_relic/transaction_sample_test.rb +164 -0
  177. data/test/new_relic/version_number_test.rb +89 -0
  178. data/test/test_contexts.rb +29 -0
  179. data/test/test_helper.rb +154 -0
  180. data/ui/helpers/developer_mode_helper.rb +357 -0
  181. data/ui/helpers/google_pie_chart.rb +48 -0
  182. data/ui/views/layouts/newrelic_default.rhtml +47 -0
  183. data/ui/views/newrelic/_explain_plans.rhtml +27 -0
  184. data/ui/views/newrelic/_sample.rhtml +20 -0
  185. data/ui/views/newrelic/_segment.rhtml +28 -0
  186. data/ui/views/newrelic/_segment_limit_message.rhtml +1 -0
  187. data/ui/views/newrelic/_segment_row.rhtml +12 -0
  188. data/ui/views/newrelic/_show_sample_detail.rhtml +24 -0
  189. data/ui/views/newrelic/_show_sample_sql.rhtml +24 -0
  190. data/ui/views/newrelic/_show_sample_summary.rhtml +3 -0
  191. data/ui/views/newrelic/_sql_row.rhtml +16 -0
  192. data/ui/views/newrelic/_stack_trace.rhtml +15 -0
  193. data/ui/views/newrelic/_table.rhtml +12 -0
  194. data/ui/views/newrelic/explain_sql.rhtml +43 -0
  195. data/ui/views/newrelic/file/images/arrow-close.png +0 -0
  196. data/ui/views/newrelic/file/images/arrow-open.png +0 -0
  197. data/ui/views/newrelic/file/images/blue_bar.gif +0 -0
  198. data/ui/views/newrelic/file/images/file_icon.png +0 -0
  199. data/ui/views/newrelic/file/images/gray_bar.gif +0 -0
  200. data/ui/views/newrelic/file/images/new-relic-rpm-desktop.gif +0 -0
  201. data/ui/views/newrelic/file/images/new_relic_rpm_desktop.gif +0 -0
  202. data/ui/views/newrelic/file/images/textmate.png +0 -0
  203. data/ui/views/newrelic/file/javascript/jquery-1.4.2.js +6240 -0
  204. data/ui/views/newrelic/file/javascript/transaction_sample.js +120 -0
  205. data/ui/views/newrelic/file/stylesheets/style.css +490 -0
  206. data/ui/views/newrelic/index.rhtml +71 -0
  207. data/ui/views/newrelic/sample_not_found.rhtml +2 -0
  208. data/ui/views/newrelic/show_sample.rhtml +80 -0
  209. data/ui/views/newrelic/show_source.rhtml +3 -0
  210. data/ui/views/newrelic/threads.rhtml +53 -0
  211. data/vendor/gems/dependency_detection-0.0.1.build/LICENSE +5 -0
  212. data/vendor/gems/dependency_detection-0.0.1.build/lib/dependency_detection/version.rb +3 -0
  213. data/vendor/gems/dependency_detection-0.0.1.build/lib/dependency_detection.rb +62 -0
  214. data/vendor/gems/metric_parser-0.1.0.pre1/lib/metric_parser.rb +1 -0
  215. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/action_mailer.rb +14 -0
  216. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/active_merchant.rb +31 -0
  217. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/active_record.rb +33 -0
  218. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/apdex.rb +89 -0
  219. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/background_transaction.rb +7 -0
  220. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/client.rb +46 -0
  221. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller.rb +67 -0
  222. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller_cpu.rb +43 -0
  223. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller_ext.rb +17 -0
  224. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/database.rb +48 -0
  225. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/database_pool.rb +24 -0
  226. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/dot_net.rb +28 -0
  227. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/dot_net_parser.rb +17 -0
  228. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/errors.rb +11 -0
  229. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/external.rb +55 -0
  230. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/frontend.rb +40 -0
  231. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/gc.rb +20 -0
  232. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/hibernate_session.rb +7 -0
  233. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/java.rb +31 -0
  234. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/java_parser.rb +17 -0
  235. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/jsp.rb +34 -0
  236. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/jsp_tag.rb +7 -0
  237. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/mem_cache.rb +55 -0
  238. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/metric_parser.rb +122 -0
  239. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/orm.rb +27 -0
  240. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/other_transaction.rb +40 -0
  241. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet.rb +7 -0
  242. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet_context_listener.rb +7 -0
  243. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet_filter.rb +7 -0
  244. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/solr.rb +27 -0
  245. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/solr_request_handler.rb +15 -0
  246. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/spring.rb +54 -0
  247. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/spring_controller.rb +6 -0
  248. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/spring_view.rb +6 -0
  249. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/struts_action.rb +20 -0
  250. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/struts_result.rb +20 -0
  251. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/version.rb +5 -0
  252. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/view.rb +70 -0
  253. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/web_frontend.rb +18 -0
  254. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/web_service.rb +14 -0
  255. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/web_transaction.rb +133 -0
  256. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser.rb +64 -0
  257. metadata +398 -0
@@ -0,0 +1,363 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
2
+ require 'action_controller/test_case'
3
+ class NewRelic::Agent::AgentTestControllerTest < ActionController::TestCase
4
+ require 'action_controller/base'
5
+ require 'new_relic/agent/agent_test_controller'
6
+
7
+ self.controller_class = NewRelic::Agent::AgentTestController
8
+
9
+ attr_accessor :agent, :engine
10
+
11
+ def test_initialization
12
+ # Suggested by cee-dub for merb tests. I'm actually amazed if our tests work with merb.
13
+ if defined?(Merb::Router)
14
+ Merb::Router.prepare do |r|
15
+ match('/:controller(/:action)(.:format)').register
16
+ end
17
+ elsif NewRelic::Control.instance.rails_version < NewRelic::VersionNumber.new("3.0")
18
+ ActionController::Routing::Routes.draw do |map|
19
+ map.connect '/:controller/:action.:format'
20
+ map.connect '/:controller/:action'
21
+ end
22
+ else
23
+ Rails.application.routes.draw do
24
+ match '/:controller/:action.:format'
25
+ match '/:controller/:action'
26
+ end
27
+ end
28
+
29
+ if defined?(Rails) && Rails.respond_to?(:application) && Rails.application.respond_to?(:routes)
30
+ @routes = Rails.application.routes
31
+ end
32
+
33
+ Thread.current[:newrelic_ignore_controller] = nil
34
+ NewRelic::Agent.manual_start
35
+ @agent = NewRelic::Agent.instance
36
+ # @agent.instrument_app
37
+ agent.transaction_sampler.harvest
38
+ NewRelic::Agent::AgentTestController.class_eval do
39
+ newrelic_ignore :only => [:action_to_ignore, :entry_action, :base_action]
40
+ newrelic_ignore_apdex :only => :action_to_ignore_apdex
41
+ end
42
+ @engine = @agent.stats_engine
43
+ end
44
+
45
+ # Normally you can do this with #setup but for some reason in rails 2.0.2
46
+ # setup is not called.
47
+ if NewRelic::Control.instance.rails_version <= '2.1.0'
48
+ def initialize name
49
+ super name
50
+ test_initialization
51
+ end
52
+ else
53
+ alias_method :setup, :test_initialization
54
+ end
55
+
56
+ def teardown
57
+ Thread.current[:newrelic_ignore_controller] = nil
58
+ NewRelic::Agent.shutdown
59
+ NewRelic::Agent::AgentTestController.clear_headers
60
+ super
61
+ end
62
+
63
+ def test_mongrel_queue
64
+ NewRelic::Agent::AgentTestController.clear_headers
65
+ engine.clear_stats
66
+ NewRelic::Control.instance.local_env.stubs(:mongrel).returns( stub('mongrel', :workers => stub('workers', :list => stub('list', :length => '10'))))
67
+
68
+ get :index
69
+ assert_equal 1, stats('HttpDispatcher').call_count
70
+ assert_equal 1, engine.get_stats_no_scope('Mongrel/Queue Length').call_count
71
+ assert_equal 9, engine.get_stats_no_scope('Mongrel/Queue Length').total_call_time
72
+ assert_equal 0, engine.get_stats_no_scope('WebFrontend/Mongrel/Average Queue Time').call_count
73
+ end
74
+
75
+ def test_heroku_queue
76
+ engine.clear_stats
77
+ NewRelic::Agent::AgentTestController.set_some_headers 'HTTP_X_HEROKU_QUEUE_DEPTH'=>'15'
78
+ get :index
79
+ assert_equal 1, stats('HttpDispatcher').call_count
80
+ assert_equal 1, engine.get_stats_no_scope('Mongrel/Queue Length').call_count
81
+ assert_equal 15, engine.get_stats_no_scope('Mongrel/Queue Length').total_call_time
82
+ assert_equal 0, engine.get_stats_no_scope('WebFrontend/Mongrel/Average Queue Time').call_count
83
+ end
84
+
85
+ def test_new_queue_integration
86
+ NewRelic::Agent::AgentTestController.clear_headers
87
+ engine.clear_stats
88
+ start = ((Time.now - 1).to_f * 1_000_000).to_i
89
+ NewRelic::Agent::AgentTestController.set_some_headers 'HTTP_X_QUEUE_START'=> "t=#{start}"
90
+ get :index
91
+
92
+ check_metric_time('WebFrontend/QueueTime', 1, 0.1)
93
+ end
94
+
95
+
96
+ def test_new_middleware_integration
97
+ engine.clear_stats
98
+ start = ((Time.now - 1).to_f * 1_000_000).to_i
99
+ NewRelic::Agent::AgentTestController.set_some_headers 'HTTP_X_MIDDLEWARE_START'=> "t=#{start}"
100
+ get :index
101
+
102
+ check_metric_time('Middleware/all', 1, 0.1)
103
+ end
104
+
105
+ def test_new_server_time_integration
106
+ NewRelic::Agent::AgentTestController.clear_headers
107
+ engine.clear_stats
108
+ start = ((Time.now - 1).to_f * 1_000_000).to_i
109
+ NewRelic::Agent::AgentTestController.set_some_headers 'HTTP_X_REQUEST_START'=> "t=#{start}"
110
+ get :index
111
+
112
+ check_metric_time('WebFrontend/WebServer/all', 1, 0.1)
113
+ end
114
+
115
+ def test_new_frontend_work_integration
116
+ engine.clear_stats
117
+ times = [Time.now - 3, Time.now - 2, Time.now - 1]
118
+ times.map! {|t| (t.to_f * 1_000_000).to_i }
119
+ NewRelic::Agent::AgentTestController.set_some_headers({
120
+ 'HTTP_X_REQUEST_START'=> "t=#{times[0]}", 'HTTP_X_QUEUE_START' => "t=#{times[1]}", 'HTTP_X_MIDDLEWARE_START' => "t=#{times[2]}"})
121
+ get :index
122
+
123
+
124
+ check_metric_time('WebFrontend/WebServer/all', 1, 0.1)
125
+ check_metric_time('Middleware/all', 1, 0.1)
126
+ check_metric_time('WebFrontend/QueueTime', 1, 0.1)
127
+ end
128
+
129
+ def test_render_inline
130
+ engine.clear_stats
131
+ get :action_inline
132
+ assert_equal 'foofah', @response.body
133
+ compare_metrics %w[Controller/new_relic/agent/agent_test/action_inline], engine.metrics.grep(/^Controller/)
134
+ end
135
+ def test_metric__ignore
136
+ engine.clear_stats
137
+ compare_metrics [], engine.metrics
138
+ get :action_to_ignore
139
+ compare_metrics [], engine.metrics
140
+ end
141
+
142
+ def test_controller_rescued_error
143
+ engine.clear_stats
144
+ assert_raise RuntimeError do
145
+ get :action_with_error
146
+ end
147
+ metrics = ['Apdex',
148
+ 'Apdex/new_relic/agent/agent_test/action_with_error',
149
+ 'HttpDispatcher',
150
+ 'Controller/new_relic/agent/agent_test/action_with_error',
151
+ 'Errors/all',
152
+ 'Middleware/all',
153
+ 'WebFrontend/WebServer/all',
154
+ 'WebFrontend/QueueTime']
155
+
156
+ compare_metrics metrics, engine.metrics.reject{|m| m.index('Response')==0 || m.index('CPU')==0}
157
+ assert_equal 1, engine.get_stats_no_scope("Controller/new_relic/agent/agent_test/action_with_error").call_count
158
+ assert_equal 1, engine.get_stats_no_scope("Errors/all").call_count
159
+ apdex = engine.get_stats_no_scope("Apdex")
160
+ score = apdex.get_apdex
161
+ assert_equal 1, score[2], 'failing'
162
+ assert_equal 0, score[1], 'tol'
163
+ assert_equal 0, score[0], 'satisfied'
164
+
165
+ end
166
+ def test_controller_error
167
+ engine.clear_stats
168
+ assert_raise RuntimeError do
169
+ get :action_with_error
170
+ end
171
+ metrics = ['Apdex',
172
+ 'Apdex/new_relic/agent/agent_test/action_with_error',
173
+ 'HttpDispatcher',
174
+ 'Controller/new_relic/agent/agent_test/action_with_error',
175
+ 'Errors/all',
176
+ 'WebFrontend/QueueTime',
177
+ 'Middleware/all',
178
+ 'WebFrontend/WebServer/all']
179
+
180
+ compare_metrics metrics, engine.metrics.reject{|m| m.index('Response')==0 || m.index('CPU')==0}
181
+ assert_equal 1, engine.get_stats_no_scope("Controller/new_relic/agent/agent_test/action_with_error").call_count
182
+ assert_equal 1, engine.get_stats_no_scope("Errors/all").call_count
183
+ apdex = engine.get_stats_no_scope("Apdex")
184
+ score = apdex.get_apdex
185
+ assert_equal 1, score[2], 'failing'
186
+ assert_equal 0, score[1], 'tol'
187
+ assert_equal 0, score[0], 'satisfied'
188
+
189
+ end
190
+ def test_filter_error
191
+ engine.clear_stats
192
+ assert_raise RuntimeError do
193
+ get :action_with_before_filter_error
194
+ end
195
+ metrics = ['Apdex',
196
+ 'Apdex/new_relic/agent/agent_test/action_with_before_filter_error',
197
+ 'HttpDispatcher',
198
+ 'Controller/new_relic/agent/agent_test/action_with_before_filter_error',
199
+ 'Errors/all',
200
+ 'WebFrontend/QueueTime',
201
+ 'Middleware/all',
202
+ 'WebFrontend/WebServer/all']
203
+
204
+ compare_metrics metrics, engine.metrics.reject{|m| m.index('Response')==0 || m.index('CPU')==0 || m.index('GC')==0}
205
+ assert_equal 1, engine.get_stats_no_scope("Controller/new_relic/agent/agent_test/action_with_before_filter_error").call_count
206
+ assert_equal 1, engine.get_stats_no_scope("Errors/all").call_count
207
+ apdex = engine.get_stats_no_scope("Apdex")
208
+ score = apdex.get_apdex
209
+ assert_equal 1, score[2], 'failing'
210
+ assert_equal 0, score[1], 'tol'
211
+ assert_equal 0, score[0], 'satisfied'
212
+ end
213
+ def test_metric__ignore_base
214
+ engine.clear_stats
215
+ get :base_action
216
+ compare_metrics [], engine.metrics
217
+ end
218
+ def test_metric__no_ignore
219
+ path = 'new_relic/agent/agent_test/index'
220
+ index_stats = stats("Controller/#{path}")
221
+ index_apdex_stats = engine.get_custom_stats("Apdex/#{path}", NewRelic::ApdexStats)
222
+ assert_difference 'index_stats.call_count' do
223
+ assert_difference 'index_apdex_stats.call_count' do
224
+ get :index
225
+ end
226
+ end
227
+ assert_nil Thread.current[:newrelic_ignore_controller]
228
+ end
229
+ def test_metric__ignore_apdex
230
+ engine = @agent.stats_engine
231
+ path = 'new_relic/agent/agent_test/action_to_ignore_apdex'
232
+ cpu_stats = stats("ControllerCPU/#{path}")
233
+ index_stats = stats("Controller/#{path}")
234
+ index_apdex_stats = engine.get_custom_stats("Apdex/#{path}", NewRelic::ApdexStats)
235
+ assert_difference 'index_stats.call_count' do
236
+ assert_no_difference 'index_apdex_stats.call_count' do
237
+ get :action_to_ignore_apdex
238
+ end
239
+ end
240
+ assert_nil Thread.current[:newrelic_ignore_controller]
241
+
242
+ end
243
+ def test_metric__dispatched
244
+ engine = @agent.stats_engine
245
+ get :entry_action
246
+ assert_nil Thread.current[:newrelic_ignore_controller]
247
+ assert_nil engine.lookup_stats('Controller/agent_test/entry_action')
248
+ assert_nil engine.lookup_stats('Controller/agent_test_controller/entry_action')
249
+ assert_nil engine.lookup_stats('Controller/AgentTestController/entry_action')
250
+ assert_nil engine.lookup_stats('Controller/NewRelic::Agent::AgentTestController/internal_action')
251
+ assert_nil engine.lookup_stats('Controller/NewRelic::Agent::AgentTestController_controller/internal_action')
252
+ assert_not_nil engine.lookup_stats('Controller/NewRelic::Agent::AgentTestController/internal_traced_action')
253
+ end
254
+ def test_action_instrumentation
255
+ get :index, :foo => 'bar'
256
+ assert_match /bar/, @response.body
257
+ end
258
+
259
+ def test_controller_params
260
+ assert agent.transaction_sampler
261
+ num_samples = NewRelic::Agent.instance.transaction_sampler.samples.length
262
+ assert_equal "[FILTERED]", @controller._filter_parameters({'social_security_number' => 'test'})['social_security_number']
263
+ get :index, 'social_security_number' => "001-555-1212"
264
+ samples = agent.transaction_sampler.samples
265
+ assert_equal num_samples + 1, samples.length
266
+ assert_equal "[FILTERED]", samples.last.params[:request_params]["social_security_number"]
267
+ end
268
+
269
+ def test_controller_params
270
+ agent.transaction_sampler.reset!
271
+ get :index, 'number' => "001-555-1212"
272
+ s = agent.transaction_sampler.harvest(nil, 0.0)
273
+ assert_equal 1, s.size
274
+ assert_equal 5, s.first.params.size
275
+ end
276
+
277
+
278
+ def test_busycalculation
279
+ engine.clear_stats
280
+ assert_equal 0, NewRelic::Agent::BusyCalculator.busy_count
281
+ get :index, 'social_security_number' => "001-555-1212", 'wait' => '0.05'
282
+ NewRelic::Agent::BusyCalculator.harvest_busy
283
+
284
+ assert_equal 1, stats('Instance/Busy').call_count
285
+ assert_equal 1, stats('HttpDispatcher').call_count
286
+ # We are probably busy about 99% of the time, but lets make sure it's at least 50
287
+ assert stats('Instance/Busy').total_call_time > (0.5 * 0.05), stats('Instance/Busy').inspect
288
+ assert_equal 0, stats('WebFrontend/Mongrel/Average Queue Time').call_count
289
+ end
290
+
291
+ def test_queue_headers_no_header
292
+ engine.clear_stats
293
+ queue_length_stat = stats('Mongrel/Queue Length')
294
+ queue_time_stat = stats('WebFrontend/QueueTime')
295
+
296
+ # no request start header
297
+ get 'index'
298
+ assert_equal 0, queue_length_stat.call_count
299
+ end
300
+
301
+ def test_queue_headers_apache
302
+ NewRelic::Agent::AgentTestController.clear_headers
303
+ engine.clear_stats
304
+ queue_length_stat = stats('Mongrel/Queue Length')
305
+ queue_time_stat = stats('WebFrontend/QueueTime')
306
+
307
+ # apache version of header
308
+ request_start = ((Time.now.to_f - 0.5) * 1e6).to_i.to_s
309
+ NewRelic::Agent::AgentTestController.set_some_headers({'HTTP_X_QUEUE_START' => "t=#{request_start}"})
310
+ get :index
311
+ assert_equal(0, queue_length_stat.call_count, 'We should not be seeing a queue length yet')
312
+ assert_equal(1, queue_time_stat.call_count, 'We should have seen the queue header once')
313
+ assert(queue_time_stat.total_call_time > 0.1, "Queue time should be longer than 100ms")
314
+ assert(queue_time_stat.total_call_time < 10, "Queue time should be under 10 seconds (sanity check)")
315
+
316
+ end
317
+ def test_queue_headers_heroku
318
+
319
+ engine.clear_stats
320
+ NewRelic::Agent::AgentTestController.clear_headers
321
+
322
+ queue_length_stat = stats('Mongrel/Queue Length')
323
+ queue_time_stat = stats('WebFrontend/QueueTime')
324
+
325
+ # heroku version
326
+ request_start = ((Time.now.to_f - 0.5) * 1e6).to_i.to_s
327
+ NewRelic::Agent::AgentTestController.set_some_headers({'HTTP_X_QUEUE_START' => "t=#{request_start}", 'HTTP_X_HEROKU_QUEUE_DEPTH' => '0'})
328
+ get :index
329
+ assert_equal(0, queue_length_stat.total_call_time, 'queue should be empty')
330
+ assert_equal(1, queue_time_stat.call_count, 'should have seen the queue header once')
331
+ assert(queue_time_stat.total_call_time > 0.1, "Queue time should be longer than 100ms")
332
+ assert(queue_time_stat.total_call_time < 10, "Queue time should be under 10 seconds (sanity check)")
333
+ end
334
+
335
+ def test_queue_headers_heroku_queue_length
336
+
337
+ engine.clear_stats
338
+ NewRelic::Agent::AgentTestController.clear_headers
339
+
340
+ queue_length_stat = stats('Mongrel/Queue Length')
341
+ queue_time_stat = stats('WebFrontend/QueueTime')
342
+
343
+ # heroku version with queue length > 0
344
+ request_start = ((Time.now.to_f - 0.5) * 1e6).to_i.to_s
345
+ NewRelic::Agent::AgentTestController.set_some_headers({'HTTP_X_QUEUE_START' => "t=#{request_start}", 'HTTP_X_HEROKU_QUEUE_DEPTH' => '3'})
346
+ get :index
347
+
348
+ assert_equal(1, queue_length_stat.call_count, 'queue should have been seen once')
349
+ assert_equal(1, queue_time_stat.call_count, 'should have seen the queue header once')
350
+ assert(queue_time_stat.total_call_time > 0.1, "Queue time should be longer than 100ms")
351
+ assert(queue_time_stat.total_call_time < 10, "Queue time should be under 10 seconds (sanity check)")
352
+ assert_equal(3, queue_length_stat.total_call_time, 'queue should be 3 long')
353
+
354
+ NewRelic::Agent::AgentTestController.clear_headers
355
+ end
356
+
357
+ private
358
+ def stats(name)
359
+ engine.get_stats_no_scope(name)
360
+ end
361
+
362
+ end if defined? Rails
363
+
@@ -0,0 +1,9 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
2
+
3
+ class NewRelic::Agent::ApdexFromServerTest < Test::Unit::TestCase
4
+
5
+ def test_true
6
+ # we need tests in this file - TBD
7
+ assert true
8
+ end
9
+ end
@@ -0,0 +1,108 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
2
+ require "new_relic/agent/beacon_configuration"
3
+ class NewRelic::Agent::BeaconConfigurationTest < Test::Unit::TestCase
4
+ def test_initialize_basic
5
+ connect_data = {}
6
+ bc = NewRelic::Agent::BeaconConfiguration.new(connect_data)
7
+ assert_equal true, bc.rum_enabled
8
+ assert_equal '', bc.browser_timing_header
9
+ %w[application_id browser_monitoring_key beacon].each do |method|
10
+ value = bc.send(method.to_sym)
11
+ assert_equal nil, value, "Expected #{method} to be nil, but was #{value.inspect}"
12
+ end
13
+ end
14
+
15
+ def test_initialize_with_real_data
16
+ connect_data = {'browser_key' => 'a browser monitoring key', 'application_id' => 'an application id', 'beacon' => 'a beacon', 'rum_enabled' => true}
17
+ bc = NewRelic::Agent::BeaconConfiguration.new(connect_data)
18
+ assert_equal(true, bc.rum_enabled)
19
+ assert_equal('a browser monitoring key', bc.browser_monitoring_key)
20
+ assert_equal('an application id', bc.application_id)
21
+ assert_equal('a beacon', bc.beacon)
22
+ assert_equal(117, bc.browser_timing_header.size, "should output the javascript with all the data available")
23
+ end
24
+
25
+ def test_license_bytes_nil
26
+ connect_data = {}
27
+ NewRelic::Control.instance.expects(:license_key).returns('a' * 40).once
28
+ bc = NewRelic::Agent::BeaconConfiguration.new(connect_data)
29
+ assert_equal([97] * 40, bc.license_bytes, 'should return the bytes of the license key')
30
+ end
31
+
32
+ def test_license_bytes_existing_bytes
33
+ connect_data = {}
34
+ bc = NewRelic::Agent::BeaconConfiguration.new(connect_data)
35
+ bc.instance_eval { @license_bytes = [97] * 40 }
36
+ NewRelic::Control.instance.expects(:license_key).never
37
+ assert_equal([97] * 40, bc.license_bytes, "should return the cached value if it exists")
38
+ end
39
+
40
+ def test_license_bytes_should_set_instance_cache
41
+ connect_data = {}
42
+ bc = NewRelic::Agent::BeaconConfiguration.new(connect_data)
43
+ NewRelic::Control.instance.expects(:license_key).returns('a' * 40)
44
+ bc.instance_eval { @license_bytes = nil }
45
+ bc.license_bytes
46
+ assert_equal([97] * 40, bc.instance_variable_get('@license_bytes'), "should cache the license bytes for later")
47
+ end
48
+
49
+ def test_build_browser_timing_header_disabled
50
+ connect_data = {}
51
+ bc = NewRelic::Agent::BeaconConfiguration.new(connect_data)
52
+ bc.instance_eval { @rum_enabled = false }
53
+ assert_equal '', bc.build_browser_timing_header, "should not return a header when rum enabled is false"
54
+ end
55
+
56
+ def test_build_browser_timing_header_enabled_but_no_key
57
+ connect_data = {}
58
+ bc = NewRelic::Agent::BeaconConfiguration.new(connect_data)
59
+ bc.instance_eval { @rum_enabled = true; @browser_monitoring_key = nil }
60
+ assert_equal '', bc.build_browser_timing_header, "should not return a header when browser_monitoring_key is nil"
61
+ end
62
+
63
+ def test_build_browser_timing_header_enabled_with_key
64
+ connect_data = {}
65
+ bc = NewRelic::Agent::BeaconConfiguration.new(connect_data)
66
+ bc.instance_eval { @browser_monitoring_key = 'a browser monitoring key' }
67
+ assert(bc.build_browser_timing_header.include?('NREUMQ'), "header should be generated when rum is enabled and browser monitoring key is set")
68
+ end
69
+
70
+ def test_build_browser_timing_header_should_html_safe_header
71
+ mock_javascript = mock('javascript')
72
+ connect_data = {'browser_key' => 'a' * 40}
73
+ bc = NewRelic::Agent::BeaconConfiguration.new(connect_data)
74
+ assert_equal('a' * 40, bc.instance_variable_get('@browser_monitoring_key'), "should save the key from the config")
75
+ bc.expects(:javascript_header).returns(mock_javascript)
76
+ mock_javascript.expects(:respond_to?).with(:html_safe).returns(true)
77
+ mock_javascript.expects(:html_safe)
78
+ bc.build_browser_timing_header
79
+ end
80
+
81
+ def test_build_load_file_js_load_episodes_file_false
82
+ connect_data = {'rum.load_episodes_file' => false}
83
+ bc = NewRelic::Agent::BeaconConfiguration.new(connect_data)
84
+ assert_equal(160, bc.build_load_file_js(connect_data).size,
85
+ "should include timing footer but not rum.js load")
86
+ end
87
+
88
+ def test_build_load_file_js_load_episodes_file_missing
89
+ connect_data = {}
90
+ bc = NewRelic::Agent::BeaconConfiguration.new(connect_data)
91
+ assert_equal(278, bc.build_load_file_js(connect_data).size,
92
+ "should output the javascript when there is no configuration")
93
+ end
94
+
95
+ def test_build_load_file_js_load_episodes_file_present
96
+ connect_data = {'rum.load_episodes_file' => true}
97
+ bc = NewRelic::Agent::BeaconConfiguration.new(connect_data)
98
+ assert_equal(278, bc.build_load_file_js(connect_data).size,
99
+ "should output the javascript when rum.load_episodes_file is true")
100
+ end
101
+
102
+ def test_build_load_file_js_load_episodes_file_with_episodes_url
103
+ connect_data = {'episodes_url' => 'an episodes url'}
104
+ bc = NewRelic::Agent::BeaconConfiguration.new(connect_data)
105
+ assert(bc.build_load_file_js(connect_data).include?('an episodes url'),
106
+ "should include the episodes url by default")
107
+ end
108
+ end