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,185 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..', 'test_helper'))
2
+
3
+
4
+ class NewRelic::Agent::StatsEngineTest < Test::Unit::TestCase
5
+ def setup
6
+ NewRelic::Agent.manual_start
7
+ @engine = NewRelic::Agent::StatsEngine.new
8
+ rescue => e
9
+ puts e
10
+ puts e.backtrace.join("\n")
11
+ end
12
+ def teardown
13
+ @engine.harvest_timeslice_data({},{})
14
+ super
15
+ end
16
+
17
+ def test_scope
18
+ @engine.push_scope "scope1"
19
+ assert @engine.peek_scope.name == "scope1"
20
+
21
+ expected = @engine.push_scope "scope2"
22
+ @engine.pop_scope expected, 0
23
+
24
+ scoped = @engine.get_stats "a"
25
+ scoped.trace_call 3
26
+
27
+ assert scoped.total_call_time == 3
28
+ unscoped = @engine.get_stats "a"
29
+
30
+ assert scoped == @engine.get_stats("a")
31
+ assert unscoped.total_call_time == 3
32
+ end
33
+
34
+ def test_scope__overlap
35
+ NewRelic::Agent.instance.stubs(:stats_engine).returns(@engine)
36
+
37
+ @engine.scope_name = 'orlando'
38
+ self.class.trace_execution_scoped('disney', :deduct_call_time_from_parent => false) { sleep 0.1 }
39
+ orlando_disney = @engine.get_stats 'disney'
40
+
41
+ @engine.scope_name = 'anaheim'
42
+ self.class.trace_execution_scoped('disney', :deduct_call_time_from_parent => false) { sleep 0.1 }
43
+ anaheim_disney = @engine.get_stats 'disney'
44
+
45
+ disney = @engine.get_stats_no_scope "disney"
46
+
47
+ assert_not_same orlando_disney, anaheim_disney
48
+ assert_not_equal orlando_disney, anaheim_disney
49
+ assert_equal 1, orlando_disney.call_count
50
+ assert_equal 1, anaheim_disney.call_count
51
+ assert_same disney, orlando_disney.unscoped_stats
52
+ assert_same disney, anaheim_disney.unscoped_stats
53
+ assert_equal 2, disney.call_count
54
+ assert_equal disney.total_call_time, orlando_disney.total_call_time + anaheim_disney.total_call_time
55
+
56
+ end
57
+
58
+ def test_simplethrowcase(depth=0)
59
+
60
+ fail "doh" if depth == 10
61
+
62
+ scope = @engine.push_scope "scope#{depth}"
63
+
64
+ begin
65
+ test_simplethrowcase(depth+1)
66
+ rescue StandardError => e
67
+ if (depth != 0)
68
+ raise e
69
+ end
70
+ ensure
71
+ @engine.pop_scope scope, 0
72
+ end
73
+
74
+ if depth == 0
75
+ assert @engine.peek_scope.nil?
76
+ end
77
+ end
78
+
79
+
80
+ def test_scope_failure
81
+ scope1 = @engine.push_scope "scope1"
82
+ @engine.push_scope "scope2"
83
+
84
+ begin
85
+ @engine.pop_scope scope1
86
+ fail "Didn't throw when scope push/pop mismatched"
87
+ rescue
88
+ # success
89
+ end
90
+ end
91
+
92
+ def test_children_time
93
+ t1 = Time.now
94
+
95
+ expected1 = @engine.push_scope "a"
96
+ sleep 0.001
97
+ t2 = Time.now
98
+
99
+ expected2 = @engine.push_scope "b"
100
+ sleep 0.002
101
+ t3 = Time.now
102
+
103
+ expected = @engine.push_scope "c"
104
+ sleep 0.003
105
+ scope = @engine.pop_scope expected, Time.now - t3
106
+
107
+ t4 = Time.now
108
+
109
+ check_time_approximate 0, scope.children_time
110
+ check_time_approximate 0.003, @engine.peek_scope.children_time
111
+
112
+ sleep 0.001
113
+ t5 = Time.now
114
+
115
+ expected = @engine.push_scope "d"
116
+ sleep 0.002
117
+ scope = @engine.pop_scope expected, Time.now - t5
118
+
119
+ t6 = Time.now
120
+
121
+ check_time_approximate 0, scope.children_time
122
+
123
+ scope = @engine.pop_scope expected2, Time.now - t2
124
+ assert_equal scope.name, 'b'
125
+
126
+ check_time_approximate (t4 - t3) + (t6 - t5), scope.children_time
127
+
128
+ scope = @engine.pop_scope expected1, Time.now - t1
129
+ assert_equal scope.name, 'a'
130
+
131
+ check_time_approximate (t6 - t2), scope.children_time
132
+ end
133
+
134
+ def test_simple_start_transaction
135
+ assert @engine.peek_scope.nil?
136
+ scope = @engine.push_scope "scope"
137
+ @engine.start_transaction
138
+ assert !@engine.peek_scope.nil?
139
+ @engine.pop_scope scope, 0.01
140
+ assert @engine.peek_scope.nil?
141
+ @engine.end_transaction
142
+ assert @engine.peek_scope.nil?
143
+ end
144
+
145
+
146
+ # test for when the scope stack contains an element only used for tts and not metrics
147
+ def test_simple_tt_only_scope
148
+ scope1 = @engine.push_scope "a", 0, true
149
+ scope2 = @engine.push_scope "b", 10, false
150
+ scope3 = @engine.push_scope "c", 20, true
151
+
152
+ @engine.pop_scope scope3, 10
153
+ @engine.pop_scope scope2, 10
154
+ @engine.pop_scope scope1, 10
155
+
156
+ assert_equal 0, scope3.children_time
157
+ assert_equal 10, scope2.children_time
158
+ assert_equal 10, scope1.children_time
159
+ end
160
+
161
+ def test_double_tt_only_scope
162
+ scope1 = @engine.push_scope "a", 0, true
163
+ scope2 = @engine.push_scope "b", 10, false
164
+ scope3 = @engine.push_scope "c", 20, false
165
+ scope4 = @engine.push_scope "d", 30, true
166
+
167
+ @engine.pop_scope scope4, 10
168
+ @engine.pop_scope scope3, 10
169
+ @engine.pop_scope scope2, 10
170
+ @engine.pop_scope scope1, 10
171
+
172
+ assert_equal 0, scope4.children_time
173
+ assert_equal 10, scope3.children_time
174
+ assert_equal 10, scope2.children_time
175
+ assert_equal 10, scope1.children_time
176
+ end
177
+
178
+
179
+ private
180
+ def check_time_approximate(expected, actual)
181
+ assert((expected - actual).abs < 0.1, "Expected between #{expected - 0.1} and #{expected + 0.1}, got #{actual}")
182
+ end
183
+
184
+ end
185
+
@@ -0,0 +1,195 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
2
+
3
+ class NewRelic::Agent::TransationSampleBuilderTest < Test::Unit::TestCase
4
+
5
+ def setup
6
+ @builder = NewRelic::Agent::TransactionSampleBuilder.new
7
+ end
8
+
9
+ def test_build_sample
10
+ build_segment("a") do
11
+ build_segment("aa") do
12
+ build_segment("aaa")
13
+ end
14
+ build_segment("ab") do
15
+ build_segment("aba") do
16
+ build_segment("abaa")
17
+ end
18
+ build_segment("aba")
19
+ build_segment("abc") do
20
+ build_segment("abca")
21
+ build_segment("abcd")
22
+ end
23
+ end
24
+ end
25
+ build_segment "b"
26
+ build_segment "c" do
27
+ build_segment "ca"
28
+ build_segment "cb" do
29
+ build_segment "cba"
30
+ end
31
+ end
32
+
33
+ @builder.finish_trace(Time.now.to_f)
34
+ validate_builder
35
+ end
36
+
37
+ def test_freeze
38
+ build_segment "a" do
39
+ build_segment "aa"
40
+ end
41
+
42
+ begin
43
+ builder.sample
44
+ assert false
45
+ rescue Exception => e
46
+ # expected
47
+ end
48
+
49
+ @builder.finish_trace(Time.now.to_f)
50
+
51
+ validate_builder
52
+
53
+ begin
54
+ build_segment "b"
55
+ assert false
56
+ rescue TypeError => e
57
+ # expected
58
+ end
59
+ end
60
+
61
+ # this is really a test for transaction sample
62
+ def test_omit_segments_with
63
+ build_segment "Controller/my_controller/index" do
64
+ sleep 0.010
65
+
66
+ build_segment "Rails/Application Code Loading" do
67
+ sleep 0.020
68
+
69
+ build_segment "foo/bar" do
70
+ sleep 0.010
71
+ end
72
+ end
73
+
74
+ build_segment "a" do
75
+ build_segment "ab"
76
+ sleep 0.010
77
+ end
78
+ build_segment "b" do
79
+ build_segment "ba"
80
+ sleep 0.05
81
+ build_segment "bb"
82
+ build_segment "bc" do
83
+ build_segment "bca"
84
+ sleep 0.05
85
+ end
86
+ end
87
+ build_segment "c"
88
+ end
89
+ @builder.finish_trace(Time.now.to_f)
90
+
91
+ validate_builder false
92
+
93
+ sample = @builder.sample
94
+
95
+ should_be_a_copy = sample.omit_segments_with('OMIT NOTHING')
96
+ validate_segment should_be_a_copy.root_segment, false
97
+
98
+ assert sample.to_s == should_be_a_copy.to_s
99
+
100
+ without_code_loading = sample.omit_segments_with('Rails/Application Code Loading')
101
+ validate_segment without_code_loading.root_segment, false
102
+
103
+ # after we take out code loading, the delta should be approximately
104
+ # 30 milliseconds
105
+ delta = (sample.duration - without_code_loading.duration) * 1000
106
+
107
+ # Need to allow substantial headroom on the upper bound to prevent
108
+ # spurious errors.
109
+ assert delta >= 28, "delta #{delta} should be between 28 and 100"
110
+ # disable this test for a couple days:
111
+ assert delta <= 100, "delta #{delta} should be between 28 and 100"
112
+
113
+ # ensure none of the segments have this regex
114
+ without_code_loading.each_segment do |segment|
115
+ assert_nil segment.metric_name =~ /Rails\/Application Code Loading/
116
+ end
117
+ end
118
+ def test_unbalanced_handling
119
+ assert_raise RuntimeError do
120
+ build_segment("a") do
121
+ begin
122
+ build_segment("aa") do
123
+ build_segment("aaa") do
124
+ raise "a problem"
125
+ end
126
+ end
127
+ rescue; end
128
+ end
129
+ end
130
+ end
131
+ def test_marshal
132
+ build_segment "a" do
133
+ build_segment "ab"
134
+ end
135
+ build_segment "b" do
136
+ build_segment "ba"
137
+ build_segment "bb"
138
+ build_segment "bc" do
139
+ build_segment "bca"
140
+ end
141
+ end
142
+ build_segment "c"
143
+
144
+ @builder.finish_trace(Time.now.to_f)
145
+ validate_builder
146
+
147
+ dump = Marshal.dump @builder.sample
148
+ sample = Marshal.restore(dump)
149
+ validate_segment(sample.root_segment)
150
+ end
151
+
152
+ def test_parallel_first_level_segments
153
+ build_segment "a" do
154
+ build_segment "ab"
155
+ end
156
+ build_segment "b"
157
+ build_segment "c"
158
+
159
+ @builder.finish_trace(Time.now.to_f)
160
+ validate_builder
161
+ end
162
+
163
+ def validate_builder(check_names = true)
164
+ validate_segment @builder.sample.root_segment, check_names
165
+ end
166
+
167
+ def validate_segment(s, check_names = true)
168
+ p = s.parent_segment
169
+
170
+ unless p.nil? || p.metric_name == 'ROOT'
171
+ assert p.called_segments.include?(s)
172
+ assert_equal p.metric_name.length, s.metric_name.length - 1, "p: #{p.metric_name}, s: #{s.metric_name}" if check_names
173
+ assert p.metric_name < s.metric_name if check_names
174
+ assert p.entry_timestamp <= s.entry_timestamp
175
+ end
176
+
177
+ assert s.exit_timestamp >= s.entry_timestamp
178
+
179
+ children = s.called_segments
180
+ last_segment = s
181
+ children.each do |child|
182
+ assert child.metric_name > last_segment.metric_name if check_names
183
+ assert child.entry_timestamp >= last_segment.entry_timestamp
184
+ last_metric = child
185
+
186
+ validate_segment(child, check_names)
187
+ end
188
+ end
189
+
190
+ def build_segment(metric, time = 0, &proc)
191
+ @builder.trace_entry(metric, Time.now.to_f)
192
+ proc.call if proc
193
+ @builder.trace_exit(metric, Time.now.to_f)
194
+ end
195
+ end