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,35 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper'))
2
+ require 'new_relic/agent/instrumentation/rack'
3
+
4
+ class MinimalRackApp
5
+ def initialize(return_value)
6
+ @return_value = return_value
7
+ end
8
+
9
+ def call(env)
10
+ @return_value
11
+ end
12
+
13
+ include NewRelic::Agent::Instrumentation::Rack
14
+ end
15
+
16
+ class NewRelic::Agent::Instrumentation::RackTest < Test::Unit::TestCase
17
+
18
+ def test_basic_rack_app
19
+ # should return what we send in, even when instrumented
20
+ x = MinimalRackApp.new([200, {}, ["whee"]])
21
+ assert_equal [200, {}, ["whee"]], x.call({})
22
+ end
23
+
24
+ def test_basic_rack_app_404
25
+ x = MinimalRackApp.new([404, {}, ["whee"]])
26
+ assert_equal [404, {}, ["whee"]], x.call({})
27
+ end
28
+
29
+ def test_basic_rack_app_ignores_404
30
+ NewRelic::Agent::Instrumentation::MetricFrame.expects(:abort_transaction!)
31
+ x = MinimalRackApp.new([404, {}, ["whee"]])
32
+ assert_equal [404, {}, ["whee"]], x.call({})
33
+ end
34
+ end
35
+
@@ -0,0 +1,184 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', '..', 'test_helper'))
2
+
3
+ class NewRelic::Agent::Instrumentation::TaskInstrumentationTest < Test::Unit::TestCase
4
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
5
+ extend TestContexts
6
+ attr_accessor :agent
7
+
8
+ with_running_agent do
9
+
10
+ should "run" do
11
+ run_task_inner 0
12
+ stat_names = %w[Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_0
13
+ HttpDispatcher
14
+ Apdex Apdex/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_0].sort
15
+ expected_but_missing = stat_names - @agent.stats_engine.metrics
16
+ assert_equal 0, expected_but_missing.size, @agent.stats_engine.metrics.map { |n|
17
+ stat = @agent.stats_engine.get_stats_no_scope(n)
18
+ "#{'%-26s' % n}: #{stat.call_count} calls @ #{stat.average_call_time} sec/call"
19
+ }.join("\n ") + "\nmissing: #{expected_but_missing.inspect}"
20
+ assert_equal 0, @agent.stats_engine.get_stats_no_scope('Controller').call_count
21
+ assert_equal 1, @agent.stats_engine.get_stats_no_scope('Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_0').call_count
22
+ end
23
+
24
+ should "run_recursive" do
25
+ run_task_inner(3)
26
+ assert_equal 1, @agent.stats_engine.lookup_stats(
27
+ 'Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_0',
28
+ 'Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_1').call_count
29
+ assert_equal 1, @agent.stats_engine.lookup_stats(
30
+ 'Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_1',
31
+ 'Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_2').call_count
32
+ assert_equal 1, @agent.stats_engine.lookup_stats(
33
+ 'Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_2',
34
+ 'Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_3').call_count
35
+ assert_equal 1, @agent.stats_engine.get_stats_no_scope('Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_0').call_count
36
+ assert_equal 1, @agent.stats_engine.get_stats_no_scope('Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_1').call_count
37
+ assert_equal 1, @agent.stats_engine.get_stats_no_scope('Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_2').call_count
38
+ assert_equal 1, @agent.stats_engine.get_stats_no_scope('Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_3').call_count
39
+ assert_equal 0, @agent.stats_engine.get_stats_no_scope('Controller').call_count
40
+ end
41
+
42
+ should "run_nested" do
43
+ run_task_outer(3)
44
+ @agent.stats_engine.metrics.sort.each do |n|
45
+ stat = @agent.stats_engine.get_stats_no_scope(n)
46
+ # puts "#{'%-26s' % n}: #{stat.call_count} calls @ #{stat.average_call_time} sec/call"
47
+ end
48
+ assert_equal 1, @agent.stats_engine.get_stats_no_scope('Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/outer_task').call_count
49
+ assert_equal 2, @agent.stats_engine.get_stats_no_scope('Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_0').call_count
50
+ end
51
+
52
+ should "reentrancy" do
53
+ assert_equal 0, NewRelic::Agent::BusyCalculator.busy_count
54
+ run_task_inner(1)
55
+ assert_equal 1, @agent.stats_engine.get_stats_no_scope('Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_0').call_count
56
+ assert_equal 1, @agent.stats_engine.get_stats_no_scope('Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_1').call_count
57
+ compare_metrics %w[
58
+ Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_0:Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_1
59
+ Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_0
60
+ Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_1
61
+ ], @agent.stats_engine.metrics.grep(/^Controller/)
62
+ end
63
+
64
+ should "transaction" do
65
+ assert_equal 0, @agent.transaction_sampler.scope_depth, "existing unfinished sample"
66
+ assert_nil @agent.transaction_sampler.last_sample
67
+ assert_equal @agent.transaction_sampler, @agent.stats_engine.instance_variable_get("@transaction_sampler")
68
+ run_task_outer(10)
69
+ assert_equal 0, @agent.transaction_sampler.scope_depth, "existing unfinished sample"
70
+ @agent.stats_engine.metrics.sort.each do |n|
71
+ stat = @agent.stats_engine.get_stats_no_scope(n)
72
+ # puts "#{'%-26s' % n}: #{stat.call_count} calls @ #{stat.average_call_time} sec/call"
73
+ end
74
+ assert_equal 1, @agent.stats_engine.get_stats_no_scope('Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/outer_task').call_count
75
+ assert_equal 0, @agent.stats_engine.get_stats_no_scope('Controller').call_count
76
+ assert_equal 2, @agent.stats_engine.get_stats_no_scope('Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/inner_task_0').call_count
77
+ assert_equal 0, @agent.transaction_sampler.scope_depth, "existing unfinished sample"
78
+ sample = @agent.transaction_sampler.last_sample
79
+ assert_not_nil sample
80
+ assert_not_nil sample.params[:cpu_time], "cpu time nil: \n#{sample}"
81
+ assert sample.params[:cpu_time] >= 0, "cpu time: #{sample.params[:cpu_time]},\n#{sample}"
82
+ assert_equal '10', sample.params[:request_params][:level]
83
+ end
84
+
85
+ should "abort" do
86
+ @acct = 'Redrocks'
87
+ perform_action_with_newrelic_trace(:name => 'hello', :force => true, :params => { :account => @acct}) do
88
+ self.class.inspect
89
+ NewRelic::Agent.abort_transaction!
90
+ end
91
+ # We record the controller metric still, but abort any transaction recording.
92
+ assert_equal 1, @agent.stats_engine.get_stats_no_scope('Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/hello').call_count
93
+ assert_nil @agent.transaction_sampler.last_sample
94
+ end
95
+ should "block" do
96
+ assert_equal @agent, NewRelic::Agent.instance
97
+ @acct = 'Redrocks'
98
+ perform_action_with_newrelic_trace(:name => 'hello', :force => true, :params => { :account => @acct}) do
99
+ self.class.inspect
100
+ end
101
+ @agent.stats_engine.metrics.sort.each do |n|
102
+ stat = @agent.stats_engine.get_stats_no_scope(n)
103
+ #puts "#{'%-26s' % n}: #{stat.call_count} calls @ #{stat.average_call_time} sec/call"
104
+ end
105
+ assert_equal @agent, NewRelic::Agent.instance
106
+ assert_equal 1, @agent.stats_engine.get_stats_no_scope('Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/hello').call_count
107
+ sample = @agent.transaction_sampler.last_sample
108
+ assert_not_nil sample
109
+ assert_equal 'Redrocks', sample.params[:request_params][:account]
110
+
111
+ end
112
+
113
+ should "error_handling" do
114
+ @agent.error_collector.ignore_error_filter
115
+ @agent.error_collector.harvest_errors([])
116
+ @agent.error_collector.expects(:notice_error).once
117
+ assert_equal @agent.error_collector, NewRelic::Agent.instance.error_collector
118
+ assert_raise RuntimeError do
119
+ run_task_exception
120
+ end
121
+ end
122
+
123
+ should "custom_params" do
124
+ @agent.error_collector.stubs(:enabled).returns(true)
125
+ @agent.error_collector.ignore_error_filter
126
+ @agent.error_collector.harvest_errors([])
127
+ assert_equal @agent.error_collector, NewRelic::Agent.instance.error_collector
128
+ assert_raise RuntimeError do
129
+ run_task_exception
130
+ end
131
+ errors = @agent.error_collector.harvest_errors([])
132
+ assert_equal 1, errors.size
133
+ error = errors.first
134
+ assert_equal "Controller/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/run_task_exception", error.path
135
+ assert_not_nil error.params[:stack_trace]
136
+ assert_not_nil error.params[:custom_params]
137
+ end
138
+
139
+ should "instrument_bg" do
140
+ run_background_job
141
+ stat_names = %w[OtherTransaction/Background/NewRelic::Agent::Instrumentation::TaskInstrumentationTest/run_background_job
142
+ OtherTransaction/Background/all
143
+ OtherTransaction/all].sort
144
+
145
+ expected_but_missing = stat_names - @agent.stats_engine.metrics
146
+ assert_equal 0, expected_but_missing.size, @agent.stats_engine.metrics.map { |n|
147
+ stat = @agent.stats_engine.get_stats_no_scope(n)
148
+ "#{'%-26s' % n}: #{stat.call_count} calls @ #{stat.average_call_time} sec/call"
149
+ }.join("\n ") + "\nmissing: #{expected_but_missing.inspect}"
150
+ assert_equal 1, @agent.stats_engine.get_stats_no_scope('OtherTransaction/all').call_count
151
+ assert_equal 1, @agent.stats_engine.get_stats_no_scope('OtherTransaction/Background/all').call_count
152
+ end
153
+ end
154
+
155
+ private
156
+
157
+ def run_task_inner(n)
158
+ return if n == 0
159
+ assert_equal 1, NewRelic::Agent::BusyCalculator.busy_count
160
+ run_task_inner(n-1)
161
+ end
162
+
163
+ def run_task_outer(n=0)
164
+ assert_equal 1, NewRelic::Agent::BusyCalculator.busy_count
165
+ run_task_inner(n)
166
+ run_task_inner(n)
167
+ end
168
+
169
+ def run_task_exception
170
+ NewRelic::Agent.add_custom_parameters(:custom_one => 'one custom val')
171
+ assert_equal 1, NewRelic::Agent::BusyCalculator.busy_count
172
+ raise "This is an error"
173
+ end
174
+
175
+ def run_background_job
176
+ "This is a background job"
177
+ end
178
+
179
+ add_transaction_tracer :run_task_exception
180
+ add_transaction_tracer :run_task_inner, :name => 'inner_task_#{args[0]}'
181
+ add_transaction_tracer :run_task_outer, :name => 'outer_task', :params => '{ :level => args[0] }'
182
+ # Eventually we need th change this to :category => :task
183
+ add_transaction_tracer :run_background_job, :category => 'OtherTransaction/Background'
184
+ end
@@ -0,0 +1,143 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
2
+
3
+ memcached_ready = false
4
+ classes = {
5
+ # 'memcache' => 'MemCache',
6
+ # 'dalli' => 'Dalli::Client',
7
+ 'memcached' => 'Memcached'
8
+ # 'spymemcached' => 'Spymemcached'
9
+ }
10
+ begin
11
+ TCPSocket.new('localhost', 11211)
12
+ classes.each do |req, const|
13
+ begin
14
+ require req
15
+ MEMCACHED_CLASS = const.constantize
16
+ puts "Testing #{MEMCACHED_CLASS}"
17
+ memcached_ready = true
18
+ rescue LoadError
19
+ rescue NameError
20
+ end
21
+ end
22
+ rescue Errno::ECONNREFUSED
23
+ rescue Errno::ETIMEDOUT
24
+ end
25
+
26
+ class NewRelic::Agent::MemcacheInstrumentationTest < Test::Unit::TestCase
27
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
28
+
29
+ def setup
30
+ NewRelic::Agent.manual_start
31
+ @engine = NewRelic::Agent.instance.stats_engine
32
+
33
+ case MEMCACHED_CLASS.name
34
+ when 'Memcached'
35
+ @cache = MEMCACHED_CLASS.new('localhost', :support_cas => true)
36
+ when 'Spymemcached'
37
+ @cache = MEMCACHED_CLASS.new('localhost:11211')
38
+ else
39
+ @cache = MEMCACHED_CLASS.new('localhost')
40
+ end
41
+ @key = 'schluessel'
42
+ @cache.set('schluessel', 1)
43
+ end
44
+
45
+ def teardown
46
+ if MEMCACHED_CLASS.name == 'Memcached'
47
+ @cache.flush
48
+ elsif MEMCACHED_CLASS.name == 'Spymemcached'
49
+ @cache.flush
50
+ @cache.instance_eval{ @client.shutdown }
51
+ else
52
+ @cache.flush_all
53
+ end
54
+ end
55
+
56
+ def _call_test_method_in_web_transaction(method, *args)
57
+ @engine.clear_stats
58
+ perform_action_with_newrelic_trace(:name=>'action', :category => :controller) do
59
+ @cache.send(method.to_sym, *[@key, *args])
60
+ end
61
+ end
62
+
63
+ def _call_test_method_in_background_task(method, *args)
64
+ @engine.clear_stats
65
+ perform_action_with_newrelic_trace(:name => 'bg_task', :category => :task) do
66
+ @cache.send(method.to_sym, *[@key, *args])
67
+ end
68
+ end
69
+
70
+ def test_reads__web
71
+ commands = ['get']
72
+ commands << 'get_multi' unless MEMCACHED_CLASS.name == 'Spymemcached'
73
+ commands.each do |method|
74
+ if @cache.class.method_defined?(method)
75
+ _call_test_method_in_web_transaction(method)
76
+ compare_metrics ["Memcache/#{method}", "Memcache/allWeb", "Memcache/#{method}:Controller/NewRelic::Agent::MemcacheInstrumentationTest/action"],
77
+ @engine.metrics.select{|m| m =~ /^memcache.*/i}
78
+ end
79
+ end
80
+ end
81
+
82
+ def test_writes__web
83
+ %w[delete].each do |method|
84
+ if @cache.class.method_defined?(method)
85
+ _call_test_method_in_web_transaction(method)
86
+ expected_metrics = ["Memcache/#{method}", "Memcache/allWeb", "Memcache/#{method}:Controller/NewRelic::Agent::MemcacheInstrumentationTest/action"]
87
+ compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
88
+ end
89
+ end
90
+
91
+ %w[set add].each do |method|
92
+ @cache.delete(@key) rescue nil
93
+ if @cache.class.method_defined?(method)
94
+ expected_metrics = ["Memcache/#{method}", "Memcache/allWeb", "Memcache/#{method}:Controller/NewRelic::Agent::MemcacheInstrumentationTest/action"]
95
+ _call_test_method_in_web_transaction(method, 'value')
96
+ compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
97
+ end
98
+ end
99
+ end
100
+
101
+ def test_reads__background
102
+ commands = ['get']
103
+ commands << 'get_multi' unless MEMCACHED_CLASS.name == 'Spymemcached'
104
+ commands.each do |method|
105
+ if @cache.class.method_defined?(method)
106
+ _call_test_method_in_background_task(method)
107
+ compare_metrics ["Memcache/#{method}", "Memcache/allOther", "Memcache/#{method}:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"],
108
+ @engine.metrics.select{|m| m =~ /^memcache.*/i}
109
+ end
110
+ end
111
+ end
112
+
113
+ def test_writes__background
114
+ %w[delete].each do |method|
115
+ expected_metrics = ["Memcache/#{method}", "Memcache/allOther", "Memcache/#{method}:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"]
116
+ if @cache.class.method_defined?(method)
117
+ _call_test_method_in_background_task(method)
118
+ compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
119
+ end
120
+ end
121
+
122
+ %w[set add].each do |method|
123
+ @cache.delete(@key) rescue nil
124
+ expected_metrics = ["Memcache/#{method}", "Memcache/allOther", "Memcache/#{method}:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"]
125
+ if @cache.class.method_defined?(method)
126
+ _call_test_method_in_background_task(method, 'value')
127
+ compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
128
+ end
129
+ end
130
+ end
131
+
132
+ def test_handles_cas
133
+ expected_metrics = ["Memcache/cas", "Memcache/allOther", "Memcache/cas:OtherTransaction/Background/NewRelic::Agent::MemcacheInstrumentationTest/bg_task"]
134
+ if @cache.class.method_defined?(:cas)
135
+ @engine.clear_stats
136
+ perform_action_with_newrelic_trace(:name => 'bg_task', :category => :task) do
137
+ @cache.cas(@key) {|val| val += 2 }
138
+ end
139
+ compare_metrics expected_metrics, @engine.metrics.select{|m| m =~ /^memcache.*/i}
140
+ assert_equal 3, @cache.get(@key)
141
+ end
142
+ end
143
+ end if memcached_ready
@@ -0,0 +1,164 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','..','test_helper'))
2
+
3
+ require 'set'
4
+ module NewRelic
5
+ module Agent
6
+ class Agent
7
+ module MethodTracer
8
+ module ClassMethods
9
+ class AddMethodTracerTest < Test::Unit::TestCase
10
+ # require 'new_relic/agent/method_tracer'
11
+ include NewRelic::Agent::MethodTracer::ClassMethods::AddMethodTracer
12
+
13
+ def test_validate_options_nonhash
14
+ assert_raise(TypeError) do
15
+ validate_options([])
16
+ end
17
+ end
18
+
19
+ def test_validate_options_defaults
20
+ self.expects(:check_for_illegal_keys!)
21
+ self.expects(:set_deduct_call_time_based_on_metric).with(DEFAULT_SETTINGS)
22
+ self.expects(:check_for_push_scope_and_metric)
23
+ validate_options({})
24
+ end
25
+
26
+ def test_validate_options_override
27
+ opts = {:push_scope => false, :metric => false, :force => true}
28
+ self.expects(:check_for_illegal_keys!)
29
+ self.expects(:check_for_push_scope_and_metric)
30
+ val = validate_options(opts)
31
+ assert val.is_a?(Hash)
32
+ assert (val[:push_scope] == false), val.inspect
33
+ assert (val[:metric] == false), val.inspect
34
+ assert (val[:force] == true), val.inspect
35
+ end
36
+
37
+ def test_default_metric_name_code
38
+ assert_equal "Custom/#{name}/test_method", default_metric_name_code('test_method')
39
+ end
40
+
41
+ def test_newrelic_method_exists_positive
42
+ self.expects(:method_defined?).returns(true)
43
+ assert newrelic_method_exists?('test_method')
44
+ end
45
+
46
+ def test_newrelic_method_exists_negative
47
+ self.expects(:method_defined?).returns(false)
48
+ self.expects(:private_method_defined?).returns(false)
49
+
50
+ fake_log = mock('log')
51
+ NewRelic::Control.instance.expects(:log).returns(fake_log)
52
+ fake_log.expects(:warn).with("Did not trace #{name}#test_method because that method does not exist")
53
+ assert !newrelic_method_exists?('test_method')
54
+ end
55
+
56
+ def test_set_deduct_call_time_based_on_metric_positive
57
+ opts = {:metric => true}
58
+ val = set_deduct_call_time_based_on_metric(opts)
59
+ assert val.is_a?(Hash)
60
+ assert val[:deduct_call_time_from_parent]
61
+ end
62
+
63
+ def test_set_deduct_call_time_based_on_metric_negative
64
+ opts = {:metric => false}
65
+ val = set_deduct_call_time_based_on_metric(opts)
66
+ assert val.is_a?(Hash)
67
+ assert !val[:deduct_call_time_from_parent]
68
+ end
69
+
70
+ def test_set_deduct_call_time_based_on_metric_non_nil
71
+ opts = {:deduct_call_time_from_parent => true, :metric => false}
72
+ val = set_deduct_call_time_based_on_metric(opts)
73
+ assert val.is_a?(Hash)
74
+ assert val[:deduct_call_time_from_parent]
75
+ end
76
+
77
+ def test_set_deduct_call_time_based_on_metric_opposite
78
+ opts = {:deduct_call_time_from_parent => false, :metric => true}
79
+ val = set_deduct_call_time_based_on_metric(opts)
80
+ assert val.is_a?(Hash)
81
+ assert !val[:deduct_call_time_from_parent]
82
+ end
83
+
84
+ def test_unrecognized_keys_positive
85
+ assert_equal [:unrecognized, :keys].to_set, unrecognized_keys([:hello, :world], {:unrecognized => nil, :keys => nil}).to_set
86
+ end
87
+
88
+ def test_unrecognized_keys_negative
89
+ assert_equal [], unrecognized_keys([:hello, :world], {:hello => nil, :world => nil})
90
+ end
91
+
92
+ def test_any_unrecognized_keys_positive
93
+ assert any_unrecognized_keys?([:one], {:one => nil, :two => nil})
94
+ end
95
+
96
+ def test_any_unrecognized_keys_negative
97
+ assert !any_unrecognized_keys?([:one], {:one => nil})
98
+ end
99
+
100
+ def test_check_for_illegal_keys_positive
101
+ assert_raise(RuntimeError) do
102
+ check_for_illegal_keys!({:unknown_key => nil})
103
+ end
104
+ end
105
+
106
+ def test_check_for_illegal_keys_negative
107
+ test_keys = Hash[ALLOWED_KEYS.map {|x| [x, nil]}]
108
+ check_for_illegal_keys!(test_keys)
109
+ end
110
+
111
+ def test_traced_method_exists_positive
112
+ self.expects(:_traced_method_name)
113
+ self.expects(:method_defined?).returns(true)
114
+ fake_log = mock('log')
115
+ NewRelic::Control.instance.expects(:log).returns(fake_log)
116
+ fake_log.expects(:warn).with('Attempt to trace a method twice with the same metric: Method = test_method, Metric Name = Custom/Test/test_method')
117
+ assert traced_method_exists?('test_method', 'Custom/Test/test_method')
118
+ end
119
+
120
+ def test_traced_method_exists_negative
121
+ self.expects(:_traced_method_name)
122
+ self.expects(:method_defined?).returns(false)
123
+ assert !traced_method_exists?(nil, nil)
124
+ end
125
+
126
+ def test_assemble_code_header_forced
127
+ opts = {:force => true, :code_header => 'CODE HEADER'}
128
+ assert_equal "CODE HEADER", assemble_code_header('test_method', 'Custom/Test/test_method', opts)
129
+ end
130
+
131
+ def test_assemble_code_header_unforced
132
+ self.expects(:_untraced_method_name).returns("method_name_without_tracing")
133
+ opts = {:force => false, :code_header => 'CODE HEADER'}
134
+ assert_equal "return method_name_without_tracing(*args, &block) unless NewRelic::Agent.is_execution_traced?\nCODE HEADER", assemble_code_header('test_method', 'Custom/Test/test_method', opts)
135
+ end
136
+
137
+ def test_check_for_push_scope_and_metric_positive
138
+ check_for_push_scope_and_metric({:push_scope => true})
139
+ check_for_push_scope_and_metric({:metric => true})
140
+ end
141
+
142
+ def test_check_for_push_scope_and_metric_negative
143
+ assert_raise(RuntimeError) do
144
+ check_for_push_scope_and_metric({:push_scope => false, :metric => false})
145
+ end
146
+ end
147
+
148
+ def test_code_to_eval_scoped
149
+ self.expects(:validate_options).returns({:push_scope => true})
150
+ self.expects(:method_with_push_scope).with('test_method', 'Custom/Test/test_method', {:push_scope => true})
151
+ code_to_eval('test_method', 'Custom/Test/test_method', {})
152
+ end
153
+
154
+ def test_code_to_eval_unscoped
155
+ self.expects(:validate_options).returns({:push_scope => false})
156
+ self.expects(:method_without_push_scope).with('test', 'Custom/Test/test', {:push_scope => false})
157
+ code_to_eval('test', 'Custom/Test/test', {})
158
+ end
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end