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,234 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','..','test_helper'))
2
+ class NewRelic::Agent::MethodTracer::InstanceMethods::TraceExecutionScopedTest < Test::Unit::TestCase
3
+ require 'new_relic/agent/method_tracer'
4
+ include NewRelic::Agent::MethodTracer::InstanceMethods::TraceExecutionScoped
5
+
6
+ def test_trace_disabled_negative
7
+ self.expects(:traced?).returns(false)
8
+ options = {:force => false}
9
+ assert trace_disabled?(options)
10
+ end
11
+
12
+ def test_trace_disabled_forced
13
+ self.expects(:traced?).returns(false)
14
+ options = {:force => true}
15
+ assert !(trace_disabled?(options))
16
+ end
17
+
18
+ def test_trace_disabled_positive
19
+ self.expects(:traced?).returns(true)
20
+ options = {:force => false}
21
+ assert !(trace_disabled?(options))
22
+ end
23
+
24
+ def test_get_stats_unscoped
25
+ fake_engine = mocked_object('stat_engine')
26
+ fake_engine.expects(:get_stats_no_scope).with('foob').returns('fakestats')
27
+ assert_equal 'fakestats', get_stats_unscoped('foob')
28
+ end
29
+
30
+ def test_get_stats_scoped_scoped_only
31
+ fake_engine = mocked_object('stat_engine')
32
+ fake_engine.expects(:get_stats).with('foob', true, true).returns('fakestats')
33
+ assert_equal 'fakestats', get_stats_scoped('foob', true)
34
+ end
35
+
36
+ def test_get_stats_scoped_no_scoped_only
37
+ fake_engine = mocked_object('stat_engine')
38
+ fake_engine.expects(:get_stats).with('foob', true, false).returns('fakestats')
39
+ assert_equal 'fakestats', get_stats_scoped('foob', false)
40
+ end
41
+
42
+ def test_stat_engine
43
+ assert_equal agent_instance.stats_engine, stat_engine
44
+ end
45
+
46
+ def test_agent_instance
47
+ assert_equal NewRelic::Agent.instance, agent_instance
48
+ end
49
+
50
+ def test_main_stat
51
+ self.expects(:get_stats_scoped).with('hello', true)
52
+ opts = {:scoped_metric_only => true}
53
+ main_stat('hello', opts)
54
+ end
55
+
56
+ def test_get_metric_stats_metric
57
+ metrics = ['foo', 'bar', 'baz']
58
+ opts = {:metric => true}
59
+ self.expects(:get_stats_unscoped).twice
60
+ self.expects(:main_stat).with('foo', opts)
61
+ first_name, stats = get_metric_stats(metrics, opts)
62
+ assert_equal 'foo', first_name
63
+ assert_equal 3, stats.length
64
+ end
65
+
66
+ def test_get_metric_stats_no_metric
67
+ metrics = ['foo', 'bar', 'baz']
68
+ opts = {:metric => false}
69
+ self.expects(:get_stats_unscoped).twice
70
+ first_name, stats = get_metric_stats(metrics, opts)
71
+ assert_equal 'foo', first_name
72
+ assert_equal 2, stats.length
73
+ end
74
+
75
+ def test_set_if_nil
76
+ h = {}
77
+ set_if_nil(h, :foo)
78
+ assert h[:foo]
79
+ h[:bar] = false
80
+ set_if_nil(h, :bar)
81
+ assert !h[:bar]
82
+ end
83
+
84
+ def test_push_flag_true
85
+ fake_agent = mocked_object('agent_instance')
86
+ fake_agent.expects(:push_trace_execution_flag).with(true)
87
+ push_flag!(true)
88
+ end
89
+
90
+ def test_push_flag_false
91
+ self.expects(:agent_instance).never
92
+ push_flag!(false)
93
+ end
94
+
95
+ def test_pop_flag_true
96
+ fake_agent = mocked_object('agent_instance')
97
+ fake_agent.expects(:pop_trace_execution_flag)
98
+ pop_flag!(true)
99
+ end
100
+
101
+ def test_pop_flag_false
102
+ self.expects(:agent_instance).never
103
+ pop_flag!(false)
104
+ end
105
+
106
+ def test_log_errors_base
107
+ NewRelic::Control.instance.expects(:log).never
108
+ ran = false
109
+ log_errors("name", "metric") do
110
+ ran = true
111
+ end
112
+ assert ran, "should run the contents of the block"
113
+ end
114
+
115
+ def test_log_errors_with_return
116
+ NewRelic::Control.instance.expects(:log).never
117
+ ran = false
118
+ return_val = log_errors('name', 'metric') do
119
+ ran = true
120
+ 'happy trees'
121
+ end
122
+
123
+ assert ran, "should run contents of block"
124
+ assert_equal 'happy trees', return_val, "should return contents of the block"
125
+ end
126
+
127
+ def test_log_errors_with_error
128
+ fakelog = mock('log')
129
+ NewRelic::Control.instance.expects(:log).returns(fakelog).at_least_once
130
+ # normally I don't do this, but we really don't care what the
131
+ # backtrace looks like, beyond that it actually gets logged. Also,
132
+ # the mocks are reversed because apparently order matters.
133
+ fakelog.expects(:error).with(any_parameters)
134
+ fakelog.expects(:error).with("Caught exception in name. Metric name = metric, exception = should not propagate out of block")
135
+
136
+ log_errors("name", "metric") do
137
+ raise "should not propagate out of block"
138
+ end
139
+ end
140
+
141
+ def test_trace_execution_scoped_header
142
+ options = {:force => false, :deduct_call_time_from_parent => false}
143
+ self.expects(:log_errors).with('trace_execution_scoped header', 'foo').yields
144
+ self.expects(:push_flag!).with(false)
145
+ fakestats = mocked_object('stat_engine')
146
+ fakestats.expects(:push_scope).with('foo', 1.0, false)
147
+ trace_execution_scoped_header('foo', options, 1.0)
148
+ end
149
+
150
+ def test_trace_execution_scoped_footer
151
+ t0 = 1.0
152
+ t1 = 2.0
153
+ metric = 'foo'
154
+ metric_stats = [mock('fakestat')]
155
+ metric_stats.first.expects(:trace_call).with(1.0, 0.5)
156
+ expected_scope = 'an expected scope'
157
+ engine = mocked_object('stat_engine')
158
+ scope = mock('scope')
159
+ engine.expects(:pop_scope).with('an expected scope', 1.0, 2.0).returns(scope)
160
+ scope.expects(:children_time).returns(0.5)
161
+ self.expects(:pop_flag!).with(false)
162
+ self.expects(:log_errors).with('trace_method_execution footer', 'foo').yields
163
+
164
+ trace_execution_scoped_footer(t0, metric, metric_stats, expected_scope, false, t1)
165
+ end
166
+
167
+ def test_trace_execution_scoped_disabled
168
+ self.expects(:trace_disabled?).returns(true)
169
+ # make sure the method doesn't beyond the abort
170
+ self.expects(:set_if_nil).never
171
+ ran = false
172
+ value = trace_execution_scoped(nil, {:options => 'hash'}) do
173
+ ran = true
174
+ 1172
175
+ end
176
+
177
+ assert ran, 'should run contents of block'
178
+ assert_equal 1172, value, 'should return contents of block'
179
+ end
180
+
181
+ def test_trace_execution_scoped_default
182
+ passed_in_opts = {}
183
+ opts_after_correction = {:metric => true, :deduct_call_time_from_parent => true}
184
+ self.expects(:trace_disabled?).returns(false)
185
+ self.expects(:get_metric_stats).with(['metric', 'array'], opts_after_correction).returns(['metric', ['stats']])
186
+ self.expects(:trace_execution_scoped_header).with('metric', opts_after_correction).returns(['start_time', 'expected_scope'])
187
+ self.expects(:trace_execution_scoped_footer).with('start_time', 'metric', ['stats'], 'expected_scope', nil)
188
+ ran = false
189
+ value = trace_execution_scoped(['metric', 'array'], passed_in_opts) do
190
+ ran = true
191
+ 1172
192
+ end
193
+
194
+ assert ran, 'should run contents of the block'
195
+ assert_equal 1172, value, 'should return the contents of the block'
196
+ end
197
+
198
+ def test_trace_execution_scoped_with_error
199
+ passed_in_opts = {}
200
+ opts_after_correction = {:metric => true, :deduct_call_time_from_parent => true}
201
+ self.expects(:trace_disabled?).returns(false)
202
+ self.expects(:get_metric_stats).with(['metric', 'array'], opts_after_correction).returns(['metric', ['stats']])
203
+ self.expects(:trace_execution_scoped_header).with('metric', opts_after_correction).returns(['start_time', 'expected_scope'])
204
+ self.expects(:trace_execution_scoped_footer).with('start_time', 'metric', ['stats'], 'expected_scope', nil)
205
+ ran = false
206
+ assert_raises(RuntimeError) do
207
+ trace_execution_scoped(['metric', 'array'], passed_in_opts) do
208
+ ran = true
209
+ raise 'raising a test error'
210
+ end
211
+ end
212
+
213
+ assert ran, 'should run contents of the block'
214
+ end
215
+
216
+ private
217
+
218
+ def mocked_object(name)
219
+ object = mock(name)
220
+ self.stubs(name).returns(object)
221
+ object
222
+ end
223
+
224
+
225
+ def mocked_log
226
+ mocked_object('log')
227
+ end
228
+
229
+
230
+ def mocked_control
231
+ mocked_object('control')
232
+ end
233
+ end
234
+
@@ -0,0 +1,386 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
2
+ require 'new_relic/agent/mock_scope_listener'
3
+
4
+ class Module
5
+ def method_traced?(method_name, metric_name)
6
+ traced_method_prefix = _traced_method_name(method_name, metric_name)
7
+
8
+ method_defined? traced_method_prefix
9
+ end
10
+ end
11
+
12
+ class Insider
13
+ def initialize(stats_engine)
14
+ @stats_engine = stats_engine
15
+ end
16
+ def catcher(level=0)
17
+ thrower(level) if level>0
18
+ end
19
+ def thrower(level)
20
+ if level == 0
21
+ # don't use a real sampler because we can't instantiate one
22
+ # sampler = NewRelic::Agent::TransactionSampler.new(NewRelic::Agent.instance)
23
+ sampler = "<none>"
24
+ begin
25
+ @stats_engine.transaction_sampler = sampler
26
+ fail "This should not have worked."
27
+ rescue; end
28
+ else
29
+ thrower(level-1)
30
+ end
31
+ end
32
+ end
33
+
34
+ module NewRelic
35
+ module Agent
36
+ extend self
37
+ def module_method_to_be_traced (x, testcase)
38
+ testcase.assert x == "x"
39
+ testcase.assert testcase.stats_engine.peek_scope.name == "x"
40
+ end
41
+ end
42
+ end
43
+
44
+ module TestModuleWithLog
45
+ extend self
46
+ def other_method
47
+ #just here to be traced
48
+ log "12345"
49
+ end
50
+
51
+ def log( msg )
52
+ msg
53
+ end
54
+ include NewRelic::Agent::MethodTracer
55
+ add_method_tracer :other_method, 'Custom/foo/bar'
56
+ end
57
+
58
+ class NewRelic::Agent::MethodTracerTest < Test::Unit::TestCase
59
+ attr_reader :stats_engine
60
+
61
+ def setup
62
+ NewRelic::Agent.manual_start
63
+ @stats_engine = NewRelic::Agent.instance.stats_engine
64
+ @stats_engine.clear_stats
65
+ @scope_listener = NewRelic::Agent::MockScopeListener.new
66
+ @old_sampler = NewRelic::Agent.instance.transaction_sampler
67
+ @stats_engine.transaction_sampler = @scope_listener
68
+ super
69
+ end
70
+
71
+ def teardown
72
+ @stats_engine.transaction_sampler = @old_sampler
73
+ @stats_engine.clear_stats
74
+ begin
75
+ self.class.remove_method_tracer :method_to_be_traced, @metric_name if @metric_name
76
+ rescue RuntimeError
77
+ # ignore 'no tracer' errors from remove method tracer
78
+ end
79
+
80
+ @metric_name = nil
81
+ super
82
+ end
83
+
84
+ def test_preserve_logging
85
+ assert_equal '12345', TestModuleWithLog.other_method
86
+ end
87
+
88
+ def test_basic
89
+ metric = "hello"
90
+ t1 = Time.now
91
+ self.class.trace_execution_scoped metric do
92
+ sleep 0.05
93
+ assert metric == @stats_engine.peek_scope.name
94
+ end
95
+ elapsed = Time.now - t1
96
+
97
+ stats = @stats_engine.get_stats(metric)
98
+ check_time stats.total_call_time, elapsed
99
+ assert stats.call_count == 1
100
+ end
101
+
102
+ def test_basic__original_api
103
+ metric = "hello"
104
+ t1 = Time.now
105
+ self.class.trace_method_execution metric, true, true, true do
106
+ sleep 0.05
107
+ assert metric == @stats_engine.peek_scope.name
108
+ end
109
+ elapsed = Time.now - t1
110
+
111
+ stats = @stats_engine.get_stats(metric)
112
+ check_time stats.total_call_time, elapsed
113
+ assert stats.call_count == 1
114
+ end
115
+
116
+ METRIC = "metric"
117
+ def test_add_method_tracer
118
+ @metric_name = METRIC
119
+ self.class.add_method_tracer :method_to_be_traced, METRIC
120
+
121
+ t1 = Time.now
122
+ method_to_be_traced 1,2,3,true,METRIC
123
+ elapsed = Time.now - t1
124
+
125
+ begin
126
+ self.class.remove_method_tracer :method_to_be_traced, METRIC
127
+ rescue RuntimeError
128
+ # ignore 'no tracer' errors from remove method tracer
129
+ end
130
+
131
+
132
+ stats = @stats_engine.get_stats(METRIC)
133
+ check_time stats.total_call_time, elapsed
134
+ assert stats.call_count == 1
135
+ end
136
+
137
+ def test_add_method_tracer__default
138
+ self.class.add_method_tracer :simple_method
139
+
140
+ simple_method
141
+
142
+ stats = @stats_engine.get_stats("Custom/#{self.class.name}/simple_method")
143
+ assert stats.call_count == 1
144
+
145
+ end
146
+ def test_add_method_tracer__reentry
147
+ self.class.add_method_tracer :simple_method
148
+ self.class.add_method_tracer :simple_method
149
+ self.class.add_method_tracer :simple_method
150
+
151
+ simple_method
152
+
153
+ stats = @stats_engine.get_stats("Custom/#{self.class.name}/simple_method")
154
+ assert stats.call_count == 1
155
+ end
156
+
157
+ def test_method_traced?
158
+ assert !self.class.method_traced?(:method_to_be_traced, METRIC)
159
+ self.class.add_method_tracer :method_to_be_traced, METRIC
160
+ assert self.class.method_traced?(:method_to_be_traced, METRIC)
161
+ begin
162
+ self.class.remove_method_tracer :method_to_be_traced, METRIC
163
+ rescue RuntimeError
164
+ # ignore 'no tracer' errors from remove method tracer
165
+ end
166
+ end
167
+
168
+ def test_tt_only
169
+
170
+ assert_nil @scope_listener.scope["c2"]
171
+ self.class.add_method_tracer :method_c1, "c1", :push_scope => true
172
+
173
+ self.class.add_method_tracer :method_c2, "c2", :metric => false
174
+ self.class.add_method_tracer :method_c3, "c3", :push_scope => false
175
+
176
+ method_c1
177
+
178
+ assert_not_nil @stats_engine.lookup_stats("c1")
179
+ assert_nil @stats_engine.lookup_stats("c2")
180
+ assert_not_nil @stats_engine.lookup_stats("c3")
181
+
182
+ assert_not_nil @scope_listener.scope["c2"]
183
+ end
184
+
185
+ def test_nested_scope_tracer
186
+ Insider.add_method_tracer :catcher, "catcher", :push_scope => true
187
+ Insider.add_method_tracer :thrower, "thrower", :push_scope => true
188
+ sampler = NewRelic::Agent.instance.transaction_sampler
189
+ mock = Insider.new(@stats_engine)
190
+ mock.catcher(0)
191
+ mock.catcher(5)
192
+ stats = @stats_engine.get_stats("catcher")
193
+ assert_equal 2, stats.call_count
194
+ stats = @stats_engine.get_stats("thrower")
195
+ assert_equal 6, stats.call_count
196
+ sample = sampler.harvest
197
+ assert_not_nil sample
198
+ end
199
+
200
+ def test_add_same_tracer_twice
201
+ @metric_name = METRIC
202
+ self.class.add_method_tracer :method_to_be_traced, METRIC
203
+ self.class.add_method_tracer :method_to_be_traced, METRIC
204
+
205
+ t1 = Time.now
206
+ method_to_be_traced 1,2,3,true,METRIC
207
+ elapsed = Time.now - t1
208
+
209
+ begin
210
+ self.class.remove_method_tracer :method_to_be_traced, METRIC
211
+ rescue RuntimeError
212
+ # ignore 'no tracer' errors from remove method tracer
213
+ end
214
+
215
+ stats = @stats_engine.get_stats(METRIC)
216
+ check_time stats.total_call_time, elapsed
217
+ assert stats.call_count == 1
218
+ end
219
+
220
+ def test_add_tracer_with_dynamic_metric
221
+ metric_code = '#{args[0]}.#{args[1]}'
222
+ @metric_name = metric_code
223
+ expected_metric = "1.2"
224
+ self.class.add_method_tracer :method_to_be_traced, metric_code
225
+
226
+ t1 = Time.now
227
+ method_to_be_traced 1,2,3,true,expected_metric
228
+ elapsed = Time.now - t1
229
+
230
+ begin
231
+ self.class.remove_method_tracer :method_to_be_traced, metric_code
232
+ rescue RuntimeError
233
+ # ignore 'no tracer' errors from remove method tracer
234
+ end
235
+
236
+ stats = @stats_engine.get_stats(expected_metric)
237
+ check_time stats.total_call_time, elapsed
238
+ assert stats.call_count == 1
239
+ end
240
+
241
+ def test_trace_method_with_block
242
+ self.class.add_method_tracer :method_with_block, METRIC
243
+
244
+ t1 = Time.now
245
+ method_with_block(1,2,3,true,METRIC) do |scope|
246
+ assert scope == METRIC
247
+ end
248
+ elapsed = Time.now - t1
249
+
250
+ stats = @stats_engine.get_stats(METRIC)
251
+ check_time stats.total_call_time, elapsed
252
+ assert stats.call_count == 1
253
+ end
254
+
255
+ def test_trace_module_method
256
+ NewRelic::Agent.add_method_tracer :module_method_to_be_traced, '#{args[0]}'
257
+ NewRelic::Agent.module_method_to_be_traced "x", self
258
+ NewRelic::Agent.remove_method_tracer :module_method_to_be_traced, '#{args[0]}'
259
+ end
260
+
261
+ def test_remove
262
+ self.class.add_method_tracer :method_to_be_traced, METRIC
263
+ self.class.remove_method_tracer :method_to_be_traced, METRIC
264
+
265
+ t1 = Time.now
266
+ method_to_be_traced 1,2,3,false,METRIC
267
+ elapsed = Time.now - t1
268
+
269
+ stats = @stats_engine.get_stats(METRIC)
270
+ assert stats.call_count == 0
271
+ end
272
+
273
+ def self.static_method(x, testcase, is_traced)
274
+ testcase.assert x == "x"
275
+ testcase.assert((testcase.stats_engine.peek_scope.name == "x") == is_traced)
276
+ end
277
+
278
+ def trace_trace_static_method
279
+ self.add_method_tracer :static_method, '#{args[0]}'
280
+ self.class.static_method "x", self, true
281
+ self.remove_method_tracer :static_method, '#{args[0]}'
282
+ self.class.static_method "x", self, false
283
+ end
284
+
285
+ def test_multiple_metrics__scoped
286
+ metrics = %w[first second third]
287
+ self.class.trace_execution_scoped metrics do
288
+ sleep 0.05
289
+ end
290
+ elapsed = @stats_engine.get_stats('first').average_call_time
291
+ metrics.map{|name| @stats_engine.get_stats name}.each do | m |
292
+ assert_equal 1, m.call_count
293
+ assert_equal elapsed, m.total_call_time
294
+ end
295
+ end
296
+ def test_multiple_metrics__unscoped
297
+ metrics = %w[first second third]
298
+ self.class.trace_execution_unscoped metrics do
299
+ sleep 0.05
300
+ end
301
+ elapsed = @stats_engine.get_stats('first').average_call_time
302
+ metrics.map{|name| @stats_engine.get_stats name}.each do | m |
303
+ assert_equal 1, m.call_count
304
+ assert_equal elapsed, m.total_call_time
305
+ end
306
+ end
307
+ def test_exception
308
+ begin
309
+ metric = "hey"
310
+ self.class.trace_execution_scoped metric do
311
+ assert @stats_engine.peek_scope.name == metric
312
+ throw Exception.new
313
+ end
314
+
315
+ assert false # should never get here
316
+ rescue Exception
317
+ # make sure the scope gets popped
318
+ assert @stats_engine.peek_scope == nil
319
+ end
320
+
321
+ stats = @stats_engine.get_stats metric
322
+ assert stats.call_count == 1
323
+ end
324
+
325
+ def test_add_multiple_tracers
326
+ self.class.add_method_tracer :method_to_be_traced, 'X', :push_scope => false
327
+ method_to_be_traced 1,2,3,true,nil
328
+ self.class.add_method_tracer :method_to_be_traced, 'Y'
329
+ method_to_be_traced 1,2,3,true,'Y'
330
+ self.class.remove_method_tracer :method_to_be_traced, 'Y'
331
+ method_to_be_traced 1,2,3,true,nil
332
+ self.class.remove_method_tracer :method_to_be_traced, 'X'
333
+ method_to_be_traced 1,2,3,false,'X'
334
+ end
335
+
336
+ def trace_no_push_scope
337
+ self.class.add_method_tracer :method_to_be_traced, 'X', :push_scope => false
338
+ method_to_be_traced 1,2,3,true,nil
339
+ self.class.remove_method_tracer :method_to_be_traced, 'X'
340
+ method_to_be_traced 1,2,3,false,'X'
341
+ end
342
+
343
+ def check_time(t1, t2)
344
+ assert_in_delta t2, t1, 0.05
345
+ end
346
+
347
+ # =======================================================
348
+ # test methods to be traced
349
+ def method_to_be_traced(x, y, z, is_traced, expected_metric)
350
+ sleep 0.01
351
+ assert x == 1
352
+ assert y == 2
353
+ assert z == 3
354
+ scope_name = @stats_engine.peek_scope ? @stats_engine.peek_scope.name : nil
355
+ if is_traced
356
+ assert_equal expected_metric, scope_name
357
+ else
358
+ assert_not_equal expected_metric, scope_name
359
+ end
360
+ end
361
+
362
+ def method_with_block(x, y, z, is_traced, expected_metric, &block)
363
+ sleep 0.01
364
+ assert x == 1
365
+ assert y == 2
366
+ assert z == 3
367
+ block.call(@stats_engine.peek_scope.name)
368
+
369
+ scope_name = @stats_engine.peek_scope ? @stats_engine.peek_scope.name : nil
370
+ assert((expected_metric == scope_name) == is_traced)
371
+ end
372
+
373
+ def method_c1
374
+ method_c2
375
+ end
376
+
377
+ def method_c2
378
+ method_c3
379
+ end
380
+
381
+ def method_c3
382
+ end
383
+
384
+ def simple_method
385
+ end
386
+ end
@@ -0,0 +1,23 @@
1
+
2
+ class NewRelic::Agent::MockScopeListener
3
+
4
+ attr_reader :scope
5
+
6
+ def initialize
7
+ @scope = {}
8
+ end
9
+
10
+ def notice_first_scope_push(time)
11
+ end
12
+
13
+ def notice_push_scope(scope, time)
14
+ @scope[scope] = true
15
+ end
16
+
17
+ def notice_pop_scope(scope, time)
18
+ end
19
+
20
+ def notice_scope_empty(time)
21
+
22
+ end
23
+ end