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,538 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','test_helper'))
2
+ class NewRelic::Agent::Instrumentation::ActiveRecordInstrumentationTest < Test::Unit::TestCase
3
+ require 'active_record_fixtures'
4
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
5
+
6
+ @@setup = false
7
+ def setup
8
+ super
9
+ unless @@setup
10
+ NewRelic::Agent.manual_start
11
+ @setup = true
12
+ end
13
+ ActiveRecordFixtures.setup
14
+ NewRelic::Agent.instance.transaction_sampler.reset!
15
+ NewRelic::Agent.instance.stats_engine.clear_stats
16
+ rescue Exception => e
17
+ puts e
18
+ puts e.backtrace.join("\n")
19
+ end
20
+
21
+ def teardown
22
+ super
23
+ NewRelic::Agent.shutdown
24
+ end
25
+
26
+ #####################################################################
27
+ # Note: If these tests are failing, most likely the problem is that #
28
+ # the active record instrumentation is not loading for whichever #
29
+ # version of rails you're testing at the moment. #
30
+ #####################################################################
31
+
32
+ def test_agent_setup
33
+ assert NewRelic::Agent.instance.class == NewRelic::Agent::Agent
34
+ end
35
+
36
+ def test_finder
37
+ ActiveRecordFixtures::Order.create :id => 0, :name => 'jeff'
38
+ find_metric = "ActiveRecord/ActiveRecordFixtures::Order/find"
39
+
40
+ assert_calls_metrics(find_metric) do
41
+ ActiveRecordFixtures::Order.find(:all)
42
+ check_metric_count(find_metric, 1)
43
+ ActiveRecordFixtures::Order.find_all_by_name "jeff"
44
+ check_metric_count(find_metric, 2)
45
+ end
46
+ end
47
+
48
+ def test_exists
49
+ return if NewRelic::Control.instance.rails_version < "2.3.4" ||
50
+ NewRelic::Control.instance.rails_version >= "3.0.7"
51
+
52
+ ActiveRecordFixtures::Order.create :id => 0, :name => 'jeff'
53
+
54
+ find_metric = "ActiveRecord/ActiveRecordFixtures::Order/find"
55
+
56
+ assert_calls_metrics(find_metric) do
57
+ ActiveRecordFixtures::Order.exists?(["name=?", 'jeff'])
58
+ check_metric_count(find_metric, 1)
59
+ end
60
+ end
61
+
62
+ # multiple duplicate find calls should only cause metric trigger on the first
63
+ # call. the others are ignored.
64
+ def test_query_cache
65
+ # Not sure why we get a transaction error with sqlite
66
+ return if isSqlite?
67
+
68
+ find_metric = "ActiveRecord/ActiveRecordFixtures::Order/find"
69
+ ActiveRecordFixtures::Order.cache do
70
+ m = ActiveRecordFixtures::Order.create :id => 0, :name => 'jeff'
71
+ assert_calls_metrics(find_metric) do
72
+ ActiveRecordFixtures::Order.find(:all)
73
+ end
74
+
75
+ check_metric_count(find_metric, 1)
76
+
77
+ assert_calls_metrics(find_metric) do
78
+ 10.times { ActiveRecordFixtures::Order.find m.id }
79
+ end
80
+ check_metric_count(find_metric, 2)
81
+ end
82
+ end
83
+
84
+ def test_metric_names_jruby
85
+ # fails due to a bug in rails 3 - log does not provide the correct
86
+ # transaction type - it returns 'SQL' instead of 'Foo Create', for example.
87
+ return if rails3? || !defined?(JRuby)
88
+ expected = %W[
89
+ ActiveRecord/all
90
+ ActiveRecord/find
91
+ ActiveRecord/ActiveRecordFixtures::Order/find
92
+ Database/SQL/insert]
93
+
94
+ if NewRelic::Control.instance.rails_version < '2.1.0'
95
+ expected += %W[ActiveRecord/save ActiveRecord/ActiveRecordFixtures::Order/save]
96
+ end
97
+
98
+ assert_calls_metrics(*expected) do
99
+ m = ActiveRecordFixtures::Order.create :id => 0, :name => 'jeff'
100
+ m = ActiveRecordFixtures::Order.find(m.id)
101
+ m.id = 999
102
+ m.save!
103
+ end
104
+ metrics = NewRelic::Agent.instance.stats_engine.metrics
105
+
106
+ compare_metrics expected, metrics
107
+ check_metric_count("ActiveRecord/ActiveRecordFixtures::Order/find", 1)
108
+ # zero because jruby uses a different mysql adapter
109
+ check_metric_count("ActiveRecord/ActiveRecordFixtures::Order/create", 0)
110
+ end
111
+
112
+ def test_metric_names_sqlite
113
+ # fails due to a bug in rails 3 - log does not provide the correct
114
+ # transaction type - it returns 'SQL' instead of 'Foo Create', for example.
115
+ return if rails3? || !isSqlite? || defined?(JRuby)
116
+
117
+ expected = %W[
118
+ ActiveRecord/all
119
+ ActiveRecord/find
120
+ ActiveRecord/ActiveRecordFixtures::Order/find
121
+ ActiveRecord/create
122
+ ActiveRecord/ActiveRecordFixtures::Order/create]
123
+
124
+ if NewRelic::Control.instance.rails_version < '2.1.0'
125
+ expected += %W[ActiveRecord/save ActiveRecord/ActiveRecordFixtures::Order/save]
126
+ end
127
+
128
+ assert_calls_metrics(*expected) do
129
+ m = ActiveRecordFixtures::Order.create :id => 0, :name => 'jeff'
130
+ m = ActiveRecordFixtures::Order.find(m.id)
131
+ m.id = 999
132
+ m.save!
133
+ end
134
+ metrics = NewRelic::Agent.instance.stats_engine.metrics
135
+
136
+ compare_metrics expected, metrics
137
+ check_metric_count("ActiveRecord/ActiveRecordFixtures::Order/find", 1)
138
+ check_metric_count("ActiveRecord/ActiveRecordFixtures::Order/create", 1)
139
+ end
140
+
141
+ def test_metric_names_standard
142
+ # fails due to a bug in rails 3 - log does not provide the correct
143
+ # transaction type - it returns 'SQL' instead of 'Foo Create', for example.
144
+ return if rails3? || defined?(JRuby) || isSqlite?
145
+
146
+ expected = %W[
147
+ ActiveRecord/all
148
+ ActiveRecord/find
149
+ ActiveRecord/ActiveRecordFixtures::Order/find
150
+ ActiveRecord/create
151
+ Database/SQL/other
152
+ ActiveRecord/ActiveRecordFixtures::Order/create]
153
+
154
+ if NewRelic::Control.instance.rails_version < '2.1.0'
155
+ expected += ['ActiveRecord/save',
156
+ 'ActiveRecord/ActiveRecordFixtures::Order/save']
157
+ end
158
+
159
+ assert_calls_metrics(*expected) do
160
+ m = ActiveRecordFixtures::Order.create :id => 0, :name => 'donkey'
161
+ m = ActiveRecordFixtures::Order.find(m.id)
162
+ m.id = 999
163
+ m.save!
164
+ end
165
+
166
+ metrics = NewRelic::Agent.instance.stats_engine.metrics
167
+
168
+ compare_metrics expected, metrics
169
+ check_metric_count("ActiveRecord/ActiveRecordFixtures::Order/find", 1)
170
+ check_metric_count("ActiveRecord/ActiveRecordFixtures::Order/create", 1)
171
+ end
172
+
173
+ def test_join_metrics_jruby
174
+ return unless defined?(JRuby)
175
+ return if rails3?
176
+
177
+ expected_metrics = %W[
178
+ ActiveRecord/all
179
+ ActiveRecord/destroy
180
+ ActiveRecord/ActiveRecordFixtures::Order/destroy
181
+ Database/SQL/insert
182
+ Database/SQL/delete
183
+ ActiveRecord/find
184
+ ActiveRecord/ActiveRecordFixtures::Order/find
185
+ ActiveRecord/ActiveRecordFixtures::Shipment/find
186
+ ]
187
+
188
+ assert_calls_metrics(*expected_metrics) do
189
+ m = ActiveRecordFixtures::Order.create :name => 'jeff'
190
+ m = ActiveRecordFixtures::Order.find(m.id)
191
+ s = m.shipments.create
192
+ m.shipments.to_a
193
+ m.destroy
194
+ end
195
+
196
+ metrics = NewRelic::Agent.instance.stats_engine.metrics
197
+
198
+ compare_metrics expected_metrics, metrics
199
+
200
+ check_metric_time('ActiveRecord/all', NewRelic::Agent.get_stats("ActiveRecord/all").total_exclusive_time, 0)
201
+ check_metric_count("ActiveRecord/ActiveRecordFixtures::Order/find", 1)
202
+ check_metric_count("ActiveRecord/ActiveRecordFixtures::Shipment/find", 1)
203
+ check_metric_count("Database/SQL/insert", 3)
204
+ check_metric_count("Database/SQL/delete", 1)
205
+ end
206
+
207
+ def test_join_metrics_sqlite
208
+ return if (defined?(Rails) && Rails.respond_to?(:version) && Rails.version.to_i == 3)
209
+ return if defined?(JRuby)
210
+ return unless isSqlite?
211
+
212
+ expected_metrics = %W[
213
+ ActiveRecord/all
214
+ ActiveRecord/destroy
215
+ ActiveRecord/ActiveRecordFixtures::Order/destroy
216
+ Database/SQL/insert
217
+ Database/SQL/delete
218
+ ActiveRecord/find
219
+ ActiveRecord/ActiveRecordFixtures::Order/find
220
+ ActiveRecord/ActiveRecordFixtures::Shipment/find
221
+ ActiveRecord/create
222
+ ActiveRecord/ActiveRecordFixtures::Shipment/create
223
+ ActiveRecord/ActiveRecordFixtures::Order/create
224
+ ]
225
+
226
+ assert_calls_metrics(*expected_metrics) do
227
+ m = ActiveRecordFixtures::Order.create :name => 'jeff'
228
+ m = ActiveRecordFixtures::Order.find(m.id)
229
+ s = m.shipments.create
230
+ m.shipments.to_a
231
+ m.destroy
232
+ end
233
+
234
+ metrics = NewRelic::Agent.instance.stats_engine.metrics
235
+ compare_metrics expected_metrics, metrics
236
+ if !(defined?(RUBY_DESCRIPTION) && RUBY_DESCRIPTION =~ /Enterprise Edition/)
237
+ check_metric_time('ActiveRecord/all', NewRelic::Agent.get_stats("ActiveRecord/all").total_exclusive_time, 0)
238
+ end
239
+ check_metric_count("ActiveRecord/ActiveRecordFixtures::Order/find", 1)
240
+ check_metric_count("ActiveRecord/ActiveRecordFixtures::Shipment/find", 1)
241
+ check_metric_count("Database/SQL/insert", 3)
242
+ check_metric_count("Database/SQL/delete", 1)
243
+ end
244
+
245
+ def test_join_metrics_standard
246
+ return if (defined?(Rails) && Rails.respond_to?(:version) && Rails.version.to_i == 3)
247
+ return if defined?(JRuby) || isSqlite?
248
+
249
+ expected_metrics = %W[
250
+ ActiveRecord/all
251
+ ActiveRecord/destroy
252
+ ActiveRecord/ActiveRecordFixtures::Order/destroy
253
+ Database/SQL/insert
254
+ Database/SQL/delete
255
+ ActiveRecord/find
256
+ ActiveRecord/ActiveRecordFixtures::Order/find
257
+ ActiveRecord/ActiveRecordFixtures::Shipment/find
258
+ Database/SQL/other
259
+ Database/SQL/show
260
+ ActiveRecord/create
261
+ ActiveRecord/ActiveRecordFixtures::Shipment/create
262
+ ActiveRecord/ActiveRecordFixtures::Order/create
263
+ ]
264
+
265
+ assert_calls_metrics(*expected_metrics) do
266
+ m = ActiveRecordFixtures::Order.create :name => 'jeff'
267
+ m = ActiveRecordFixtures::Order.find(m.id)
268
+ s = m.shipments.create
269
+ m.shipments.to_a
270
+ m.destroy
271
+ end
272
+
273
+ metrics = NewRelic::Agent.instance.stats_engine.metrics
274
+
275
+ compare_metrics expected_metrics, metrics
276
+ if !(defined?(RUBY_DESCRIPTION) && RUBY_DESCRIPTION =~ /Enterprise Edition/)
277
+ check_metric_time('ActiveRecord/all', NewRelic::Agent.get_stats("ActiveRecord/all").total_exclusive_time, 0)
278
+ end
279
+ check_metric_count("ActiveRecord/ActiveRecordFixtures::Order/find", 1)
280
+ check_metric_count("ActiveRecord/ActiveRecordFixtures::Shipment/find", 1)
281
+ check_metric_count("Database/SQL/insert", 1)
282
+ check_metric_count("Database/SQL/delete", 1)
283
+ end
284
+
285
+ def test_direct_sql
286
+ assert_nil NewRelic::Agent::Instrumentation::MetricFrame.current
287
+ assert_nil NewRelic::Agent.instance.stats_engine.scope_name
288
+ assert_equal 0, NewRelic::Agent.instance.stats_engine.metrics.size, NewRelic::Agent.instance.stats_engine.metrics.inspect
289
+
290
+ expected_metrics = %W[
291
+ ActiveRecord/all
292
+ Database/SQL/select
293
+ ]
294
+
295
+ assert_calls_unscoped_metrics(*expected_metrics) do
296
+ ActiveRecordFixtures::Order.connection.select_rows "select * from #{ActiveRecordFixtures::Order.table_name}"
297
+ end
298
+
299
+ metrics = NewRelic::Agent.instance.stats_engine.metrics
300
+ compare_metrics(expected_metrics, metrics)
301
+
302
+ check_unscoped_metric_count('Database/SQL/select', 1)
303
+
304
+ end
305
+
306
+ def test_other_sql
307
+ expected_metrics = %W[
308
+ ActiveRecord/all
309
+ Database/SQL/other
310
+ ]
311
+ assert_calls_unscoped_metrics(*expected_metrics) do
312
+ ActiveRecordFixtures::Order.connection.execute "begin"
313
+ end
314
+
315
+ metrics = NewRelic::Agent.instance.stats_engine.metrics
316
+
317
+ compare_metrics expected_metrics, metrics
318
+ check_unscoped_metric_count('Database/SQL/other', 1)
319
+ end
320
+
321
+ def test_show_sql
322
+ return if isSqlite?
323
+ return if isPostgres?
324
+
325
+ expected_metrics = %W[ActiveRecord/all Database/SQL/show]
326
+
327
+ assert_calls_metrics(*expected_metrics) do
328
+ ActiveRecordFixtures::Order.connection.execute "show tables"
329
+ end
330
+ metrics = NewRelic::Agent.instance.stats_engine.metrics
331
+ compare_metrics expected_metrics, metrics
332
+ check_unscoped_metric_count('Database/SQL/show', 1)
333
+ end
334
+
335
+ def test_blocked_instrumentation
336
+ ActiveRecordFixtures::Order.add_delay
337
+ NewRelic::Agent.disable_all_tracing do
338
+ perform_action_with_newrelic_trace :name => 'bogosity' do
339
+ ActiveRecordFixtures::Order.find(:all)
340
+ end
341
+ end
342
+ assert_nil NewRelic::Agent.instance.transaction_sampler.last_sample
343
+ metrics = NewRelic::Agent.instance.stats_engine.metrics
344
+ compare_metrics [], metrics
345
+ end
346
+ def test_run_explains
347
+ perform_action_with_newrelic_trace :name => 'bogosity' do
348
+ ActiveRecordFixtures::Order.add_delay
349
+ ActiveRecordFixtures::Order.find(:all)
350
+ end
351
+
352
+ # that's a mouthful. perhaps we should ponder our API.
353
+ segment = NewRelic::Agent.instance.transaction_sampler.last_sample.root_segment.called_segments.first.called_segments.first.called_segments.first
354
+ regex = /^SELECT (["`]?#{ActiveRecordFixtures::Order.table_name}["`]?.)?\* FROM ["`]?#{ActiveRecordFixtures::Order.table_name}["`]?$/
355
+ assert_match regex, segment.params[:sql].strip
356
+ end
357
+ def test_prepare_to_send
358
+ perform_action_with_newrelic_trace :name => 'bogosity' do
359
+ ActiveRecordFixtures::Order.add_delay
360
+ ActiveRecordFixtures::Order.find(:all)
361
+ end
362
+ sample = NewRelic::Agent.instance.transaction_sampler.last_sample
363
+ assert_not_nil sample
364
+
365
+ includes_gc = false
366
+ sample.each_segment {|s| includes_gc ||= s.metric_name =~ /GC/ }
367
+
368
+ assert_equal (includes_gc ? 4 : 3), sample.count_segments, sample.to_s
369
+
370
+ sql_segment = sample.root_segment.called_segments.first.called_segments.first.called_segments.first
371
+ assert_not_nil sql_segment, sample.to_s
372
+ assert_match /^SELECT /, sql_segment.params[:sql]
373
+ assert sql_segment.duration > 0.0, "Segment duration must be greater than zero."
374
+ sample = sample.prepare_to_send(:record_sql => :raw, :explain_sql => 0.0)
375
+ sql_segment = sample.root_segment.called_segments.first.called_segments.first.called_segments.first
376
+ assert_match /^SELECT /, sql_segment.params[:sql]
377
+ explanations = sql_segment.params[:explain_plan]
378
+ if isMysql? || isPostgres?
379
+ assert_not_nil explanations, "No explains in segment: #{sql_segment}"
380
+ assert_equal(2, explanations.size,
381
+ "No explains in segment: #{sql_segment}")
382
+ end
383
+ end
384
+
385
+ def test_transaction_mysql
386
+ return unless isMysql? && !defined?(JRuby)
387
+ ActiveRecordFixtures.setup
388
+ sample = NewRelic::Agent.instance.transaction_sampler.reset!
389
+ perform_action_with_newrelic_trace :name => 'bogosity' do
390
+ ActiveRecordFixtures::Order.add_delay
391
+ ActiveRecordFixtures::Order.find(:all)
392
+ end
393
+
394
+ sample = NewRelic::Agent.instance.transaction_sampler.last_sample
395
+
396
+ sample = sample.prepare_to_send(:record_sql => :obfuscated, :explain_sql => 0.0)
397
+ segment = sample.root_segment.called_segments.first.called_segments.first.called_segments.first
398
+ explanation = segment.params[:explain_plan]
399
+ assert_not_nil explanation, "No explains in segment: #{segment}"
400
+ assert_equal 2, explanation.size,"No explains in segment: #{segment}"
401
+
402
+ assert_equal 10, explanation[0].size
403
+ ['id', 'select_type', 'table'].each do |c|
404
+ assert explanation[0].include?(c)
405
+ end
406
+ ['1', 'SIMPLE', ActiveRecordFixtures::Order.table_name].each do |c|
407
+ assert explanation[1][0].include?(c)
408
+ end
409
+
410
+ s = NewRelic::Agent.get_stats("ActiveRecord/ActiveRecordFixtures::Order/find")
411
+ assert_equal 1, s.call_count
412
+ end
413
+
414
+ def test_transaction_postgres
415
+ return unless isPostgres?
416
+ # note that our current test builds do not use postgres, this is
417
+ # here strictly for troubleshooting, not CI builds
418
+ sample = NewRelic::Agent.instance.transaction_sampler.reset!
419
+ perform_action_with_newrelic_trace :name => 'bogosity' do
420
+ ActiveRecordFixtures::Order.add_delay
421
+ ActiveRecordFixtures::Order.find(:all)
422
+ end
423
+
424
+ sample = NewRelic::Agent.instance.transaction_sampler.last_sample
425
+
426
+ sample = sample.prepare_to_send(:record_sql => :obfuscated, :explain_sql => 0.0)
427
+ segment = sample.root_segment.called_segments.first.called_segments.first.called_segments.first
428
+ explanations = segment.params[:explain_plan]
429
+
430
+ assert_not_nil explanations, "No explains in segment: #{segment}"
431
+ assert_equal 1, explanations.size,"No explains in segment: #{segment}"
432
+ assert_equal 1, explanations.first.size
433
+
434
+ assert_equal("Explain Plan", explanations[0][0])
435
+ assert_match /Seq Scan on test_data/, explanations[0][1].join(";")
436
+
437
+ s = NewRelic::Agent.get_stats("ActiveRecord/ActiveRecordFixtures::Order/find")
438
+ assert_equal 1, s.call_count
439
+ end
440
+
441
+ def test_transaction_other
442
+ return if isMysql? || isPostgres?
443
+ sample = NewRelic::Agent.instance.transaction_sampler.reset!
444
+ perform_action_with_newrelic_trace :name => 'bogosity' do
445
+ ActiveRecordFixtures::Order.add_delay
446
+ ActiveRecordFixtures::Order.find(:all)
447
+ end
448
+
449
+ sample = NewRelic::Agent.instance.transaction_sampler.last_sample
450
+
451
+ sample = sample.prepare_to_send(:record_sql => :obfuscated, :explain_sql => 0.0)
452
+ segment = sample.root_segment.called_segments.first.called_segments.first.called_segments.first
453
+
454
+ s = NewRelic::Agent.get_stats("ActiveRecord/ActiveRecordFixtures::Order/find")
455
+ assert_equal 1, s.call_count
456
+ end
457
+
458
+ # These are only valid for rails 2.1 and later
459
+ if NewRelic::Control.instance.rails_version >= NewRelic::VersionNumber.new("2.1.0")
460
+ ActiveRecordFixtures::Order.class_eval do
461
+ if NewRelic::Control.instance.rails_version < NewRelic::VersionNumber.new("3.1")
462
+ named_scope :jeffs, :conditions => { :name => 'Jeff' }
463
+ else
464
+ scope :jeffs, :conditions => { :name => 'Jeff' }
465
+ end
466
+ end
467
+ def test_named_scope
468
+ ActiveRecordFixtures::Order.create :name => 'Jeff'
469
+
470
+ find_metric = "ActiveRecord/ActiveRecordFixtures::Order/find"
471
+
472
+ check_metric_count(find_metric, 0)
473
+ assert_calls_metrics(find_metric) do
474
+ x = ActiveRecordFixtures::Order.jeffs.find(:all)
475
+ end
476
+ check_metric_count(find_metric, 1)
477
+ end
478
+ end
479
+
480
+ # This is to make sure the all metric is recorded for exceptional cases
481
+ def test_error_handling
482
+ # have the AR select throw an error
483
+ ActiveRecordFixtures::Order.connection.stubs(:log_info).with do | sql, x, y |
484
+ raise "Error" if sql =~ /select/
485
+ true
486
+ end
487
+
488
+ expected_metrics = %W[ActiveRecord/all Database/SQL/select]
489
+
490
+ assert_calls_metrics(*expected_metrics) do
491
+ begin
492
+ ActiveRecordFixtures::Order.connection.select_rows "select * from #{ActiveRecordFixtures::Order.table_name}"
493
+ rescue RuntimeError => e
494
+ # catch only the error we raise above
495
+ raise unless e.message == 'Error'
496
+ end
497
+ end
498
+ metrics = NewRelic::Agent.instance.stats_engine.metrics
499
+ compare_metrics expected_metrics, metrics
500
+ check_metric_count('Database/SQL/select', 1)
501
+ check_metric_count('ActiveRecord/all', 1)
502
+ end
503
+
504
+ def test_rescue_handling
505
+ # Not sure why we get a transaction error with sqlite
506
+ return if isSqlite?
507
+
508
+ begin
509
+ ActiveRecordFixtures::Order.transaction do
510
+ raise ActiveRecord::ActiveRecordError.new('preserve-me!')
511
+ end
512
+ rescue ActiveRecord::ActiveRecordError => e
513
+ assert_equal 'preserve-me!', e.message
514
+ end
515
+ end
516
+
517
+ private
518
+
519
+ def rails3?
520
+ (defined?(Rails) && Rails.respond_to?(:version) && Rails.version.to_i == 3)
521
+ end
522
+
523
+ def rails_env
524
+ rails3? ? ::Rails.env : RAILS_ENV
525
+ end
526
+
527
+ def isPostgres?
528
+ ActiveRecordFixtures::Order.configurations[rails_env]['adapter'] =~ /postgres/i
529
+ end
530
+ def isMysql?
531
+ ActiveRecordFixtures::Order.connection.class.name =~ /mysql/i
532
+ end
533
+
534
+ def isSqlite?
535
+ ActiveRecord::Base.configurations[rails_env]['adapter'] =~ /sqlite/i
536
+ end
537
+
538
+ end
@@ -0,0 +1,36 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper'))
2
+ class NewRelic::Agent::Instrumentation::ControllerInstrumentationTest < Test::Unit::TestCase
3
+ require 'new_relic/agent/instrumentation/controller_instrumentation'
4
+ class TestObject
5
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
6
+ end
7
+
8
+ def test_detect_upstream_wait_basic
9
+ start_time = Time.now
10
+ object = TestObject.new
11
+ # should return the start time above by default
12
+ object.expects(:newrelic_request_headers).returns({:request => 'headers'}).twice
13
+ object.expects(:parse_frontend_headers).with({:request => 'headers'}).returns(start_time)
14
+ assert_equal(start_time, object.send(:_detect_upstream_wait, start_time))
15
+ assert_equal(0.0, Thread.current[:newrelic_queue_time])
16
+ end
17
+
18
+ def test_detect_upstream_wait_with_upstream
19
+ start_time = Time.now
20
+ runs_at = start_time + 1
21
+ object = TestObject.new
22
+ object.expects(:newrelic_request_headers).returns(true).twice
23
+ object.expects(:parse_frontend_headers).returns(start_time)
24
+ assert_equal(start_time, object.send(:_detect_upstream_wait, runs_at))
25
+ assert_equal(1.0, Thread.current[:newrelic_queue_time])
26
+ end
27
+
28
+ def test_detect_upstream_wait_swallows_errors
29
+ start_time = Time.now
30
+ object = TestObject.new
31
+ # should return the start time above when an error is raised
32
+ object.expects(:newrelic_request_headers).returns({:request => 'headers'}).twice
33
+ object.expects(:parse_frontend_headers).with({:request => 'headers'}).raises("an error")
34
+ assert_equal(start_time, object.send(:_detect_upstream_wait, start_time))
35
+ end
36
+ end
@@ -0,0 +1,11 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper'))
2
+ class NewRelic::Agent::Instrumentation::InstrumentationTest < Test::Unit::TestCase
3
+ def test_load_all_instrumentation_files
4
+ # just checking for syntax errors and unguarded code
5
+ Dir.glob('new_relic/agent/instrumentation/**/*.rb') do |f|
6
+ require f
7
+ end
8
+ require 'new_relic/delayed_job_injection'
9
+ end
10
+ end
11
+