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,66 @@
1
+ ENV['SKIP_RAILS'] = 'true'
2
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','test_helper'))
3
+
4
+ class NewRelic::Agent::WorkerLoopTest < Test::Unit::TestCase
5
+ def setup
6
+ @log = ""
7
+ @logger = Logger.new(StringIO.new(@log))
8
+ @worker_loop = NewRelic::Agent::WorkerLoop.new
9
+ @worker_loop.stubs(:log).returns(@logger)
10
+ @test_start_time = Time.now
11
+ end
12
+
13
+ def test_add_task
14
+ @x = false
15
+ @worker_loop.run(0) do
16
+ @worker_loop.stop
17
+ @x = true
18
+ end
19
+ assert @x
20
+ end
21
+
22
+ def test_density
23
+ # This shows how the tasks stay aligned with the period and don't drift.
24
+ count = 0
25
+ start = Time.now
26
+ @worker_loop.run(0.01) do
27
+ count +=1
28
+ if count == 3
29
+ @worker_loop.stop
30
+ next
31
+ end
32
+ end
33
+ elapsed = Time.now - start
34
+ assert_in_delta 0.03, elapsed, 0.02
35
+ end
36
+ def test_task_error__standard
37
+ @logger.expects(:debug)
38
+ @logger.expects(:error)
39
+ # This loop task will run twice
40
+ done = false
41
+ @worker_loop.run(0) do
42
+ @worker_loop.stop
43
+ done = true
44
+ raise "Standard Error Test"
45
+ end
46
+ assert done
47
+ end
48
+ class BadBoy < Exception; end
49
+
50
+ def test_task_error__exception
51
+ @logger.expects(:error).once
52
+ @logger.expects(:debug).once
53
+ @worker_loop.run(0) do
54
+ @worker_loop.stop
55
+ raise BadBoy, "oops"
56
+ end
57
+ end
58
+ def test_task_error__server
59
+ @logger.expects(:error).never
60
+ @logger.expects(:debug).once
61
+ @worker_loop.run(0) do
62
+ @worker_loop.stop
63
+ raise NewRelic::Agent::ServerError, "Runtime Error Test"
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,175 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','test_helper'))
2
+ module NewRelic
3
+ class MainAgentTest < Test::Unit::TestCase
4
+
5
+ # mostly this module just passes through to the active agent
6
+ # through the agent method or the control instance through
7
+ # NewRelic::Control.instance . But it's nice to make sure.
8
+
9
+ def teardown
10
+ super
11
+ Thread.current[:newrelic_untraced] = nil
12
+ end
13
+
14
+ def test_shutdown
15
+ mock_agent = mocked_agent
16
+ mock_agent.expects(:shutdown).with({})
17
+ NewRelic::Agent.shutdown
18
+ end
19
+
20
+ def test_after_fork
21
+ mock_agent = mocked_agent
22
+ mock_agent.expects(:after_fork).with({})
23
+ NewRelic::Agent.after_fork
24
+ end
25
+
26
+ def test_reset_stats
27
+ mock_agent = mocked_agent
28
+ mock_agent.expects(:reset_stats)
29
+ NewRelic::Agent.reset_stats
30
+ end
31
+
32
+ def test_manual_start_default
33
+ mock_control = mocked_control
34
+ mock_control.expects(:init_plugin).with({:agent_enabled => true, :sync_startup => true})
35
+ NewRelic::Agent.manual_start
36
+ end
37
+
38
+ def test_manual_start_with_opts
39
+ mock_control = mocked_control
40
+ mock_control.expects(:init_plugin).with({:agent_enabled => true, :sync_startup => false})
41
+ NewRelic::Agent.manual_start(:sync_startup => false)
42
+ end
43
+
44
+ def test_logger
45
+ control = mocked_control
46
+ control.expects(:log)
47
+ NewRelic::Agent.logger
48
+ end
49
+
50
+ def test_browser_timing_header
51
+ agent = mocked_agent
52
+ agent.expects(:browser_timing_header)
53
+ NewRelic::Agent.browser_timing_header
54
+ end
55
+
56
+ def test_browser_timing_footer
57
+ agent = mocked_agent
58
+ agent.expects(:browser_timing_footer)
59
+ NewRelic::Agent.browser_timing_footer
60
+ end
61
+
62
+ def test_get_stats
63
+ agent = mocked_agent
64
+ mock_stats_engine = mock('stats_engine')
65
+ agent.expects(:stats_engine).returns(mock_stats_engine)
66
+ mock_stats_engine.expects(:get_stats).with('Custom/test/metric', false)
67
+ NewRelic::Agent.get_stats('Custom/test/metric')
68
+ end
69
+
70
+ # note that this is the same as get_stats above, they're just aliases
71
+ def test_get_stats_no_scope
72
+ agent = mocked_agent
73
+ mock_stats_engine = mock('stats_engine')
74
+ agent.expects(:stats_engine).returns(mock_stats_engine)
75
+ mock_stats_engine.expects(:get_stats).with('Custom/test/metric', false)
76
+ NewRelic::Agent.get_stats_no_scope('Custom/test/metric')
77
+ end
78
+
79
+ def test_agent_not_started
80
+ old_agent = NewRelic::Agent.agent
81
+ NewRelic::Agent.instance_eval { @agent = nil }
82
+ assert_raise(RuntimeError) do
83
+ NewRelic::Agent.agent
84
+ end
85
+ NewRelic::Agent.instance_eval { @agent = old_agent }
86
+ end
87
+
88
+ def test_agent_when_started
89
+ old_agent = NewRelic::Agent.agent
90
+ NewRelic::Agent.instance_eval { @agent = 'not nil' }
91
+ assert_equal('not nil', NewRelic::Agent.agent, "should return the value from @agent")
92
+ NewRelic::Agent.instance_eval { @agent = old_agent }
93
+ end
94
+
95
+ def test_abort_transaction_bang
96
+ NewRelic::Agent::Instrumentation::MetricFrame.expects(:abort_transaction!)
97
+ NewRelic::Agent.abort_transaction!
98
+ end
99
+
100
+ def test_is_transaction_traced_true
101
+ Thread.current[:record_tt] = true
102
+ assert_equal(true, NewRelic::Agent.is_transaction_traced?, 'should be true since the thread local is set')
103
+ end
104
+
105
+ def test_is_transaction_traced_blank
106
+ Thread.current[:record_tt] = nil
107
+ assert_equal(true, NewRelic::Agent.is_transaction_traced?, 'should be true since the thread local is not set')
108
+ end
109
+
110
+ def test_is_transaction_traced_false
111
+ Thread.current[:record_tt] = false
112
+ assert_equal(false, NewRelic::Agent.is_transaction_traced?, 'should be false since the thread local is false')
113
+ end
114
+
115
+ def test_is_sql_recorded_true
116
+ Thread.current[:record_sql] = true
117
+ assert_equal(true, NewRelic::Agent.is_sql_recorded?, 'should be true since the thread local is set')
118
+ end
119
+
120
+ def test_is_sql_recorded_blank
121
+ Thread.current[:record_sql] = nil
122
+ assert_equal(true, NewRelic::Agent.is_sql_recorded?, 'should be true since the thread local is not set')
123
+ end
124
+
125
+ def test_is_sql_recorded_false
126
+ Thread.current[:record_sql] = false
127
+ assert_equal(false, NewRelic::Agent.is_sql_recorded?, 'should be false since the thread local is false')
128
+ end
129
+
130
+ def test_is_execution_traced_true
131
+ Thread.current[:newrelic_untraced] = [true, true]
132
+ assert_equal(true, NewRelic::Agent.is_execution_traced?, 'should be true since the thread local is set')
133
+ end
134
+
135
+ def test_is_execution_traced_blank
136
+ Thread.current[:newrelic_untraced] = nil
137
+ assert_equal(true, NewRelic::Agent.is_execution_traced?, 'should be true since the thread local is not set')
138
+ end
139
+
140
+ def test_is_execution_traced_empty
141
+ Thread.current[:newrelic_untraced] = []
142
+ assert_equal(true, NewRelic::Agent.is_execution_traced?, 'should be true since the thread local is an empty array')
143
+ end
144
+
145
+ def test_is_execution_traced_false
146
+ Thread.current[:newrelic_untraced] = [true, false]
147
+ assert_equal(false, NewRelic::Agent.is_execution_traced?, 'should be false since the thread local stack has the last element false')
148
+ end
149
+
150
+ def test_instance
151
+ assert_equal(NewRelic::Agent.agent, NewRelic::Agent.instance, "should return the same agent for both identical methods")
152
+ end
153
+
154
+ def test_load_data_should_not_write_files_when_serialization_disabled
155
+ NewRelic::Control.instance['disable_serialization'] = true
156
+ NewRelic::DataSerialization.expects(:read_and_write_to_file).never
157
+ NewRelic::Agent.load_data
158
+ NewRelic::Control.instance['disable_serialization'] = false
159
+ end
160
+
161
+ private
162
+
163
+ def mocked_agent
164
+ agent = mock('agent')
165
+ NewRelic::Agent.stubs(:agent).returns(agent)
166
+ agent
167
+ end
168
+
169
+ def mocked_control
170
+ control = mock('control')
171
+ NewRelic::Control.stubs(:instance).returns(control)
172
+ control
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,149 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','test_helper'))
2
+ require 'ostruct'
3
+ require 'active_record_fixtures' if defined?(::ActiveRecord)
4
+
5
+ require 'new_relic/collection_helper'
6
+ class NewRelic::CollectionHelperTest < Test::Unit::TestCase
7
+
8
+ def setup
9
+ NewRelic::Agent.manual_start
10
+ super
11
+ end
12
+ def teardown
13
+ super
14
+ end
15
+
16
+ include NewRelic::CollectionHelper
17
+ def test_string
18
+ val = (('A'..'Z').to_a.join * 1024).to_s
19
+ assert_equal val[0...16384] + "...", normalize_params(val)
20
+ end
21
+ def test_array
22
+ new_array = normalize_params [ 1000 ] * 2000
23
+ assert_equal 128, new_array.size
24
+ assert_equal '1000', new_array[0]
25
+ end
26
+ def test_boolean
27
+ np = normalize_params(NewRelic::Control.instance.settings)
28
+ assert_equal false, np['monitor_mode']
29
+ end
30
+ def test_string__singleton
31
+ val = "This String"
32
+ def val.hello; end
33
+ assert_equal "This String", normalize_params(val)
34
+ assert val.respond_to?(:hello)
35
+ assert !normalize_params(val).respond_to?(:hello)
36
+ end
37
+ class MyString < String; end
38
+ def test_kind_of_string
39
+ s = MyString.new "This is a string"
40
+ assert_equal "This is a string", s.to_s
41
+ assert_equal MyString, s.class
42
+ assert_equal String, s.to_s.class
43
+ params = normalize_params(:val => [s])
44
+ assert_equal String, params[:val][0].class
45
+ assert_equal String, flatten(s).class
46
+ assert_equal String, truncate(s, 2).class
47
+ end
48
+ def test_number
49
+ np = normalize_params({ 'one' => 1.0, 'two' => '2'})
50
+ end
51
+ def test_nil
52
+ np = normalize_params({ nil => 1.0, 'two' => nil})
53
+ assert_equal "1.0", np['']
54
+ assert_equal nil, np['two']
55
+ end
56
+ def test_hash
57
+ val = ('A'..'Z').to_a.join * 100
58
+ assert_equal Hash[(val[0..63] + "...") => (("0"*16384) + "...")], normalize_params({ val => '0' * (16384*2) })
59
+ end
60
+ class MyHash < Hash
61
+
62
+ end
63
+ # Test to ensure that hash subclasses are properly converted
64
+ def test_hash_subclass
65
+ h = MyHash.new
66
+ h[:mine] = 'mine'
67
+ custom_params = { :one => {:hash => { :a => :b}, :myhash => h }}
68
+ nh = normalize_params(custom_params)
69
+ myhash = custom_params[:one][:myhash]
70
+ assert_equal MyHash, myhash.class
71
+ myhash = nh[:one][:myhash]
72
+ assert_equal Hash, myhash.class
73
+ end
74
+
75
+
76
+
77
+ def test_enumerable
78
+ e = MyEnumerable.new
79
+ custom_params = { :one => {:hash => { :a => :b}, :myenum => e }}
80
+ nh = normalize_params(custom_params)
81
+ myenum = nh[:one][:myenum]
82
+ assert_match /MyEnumerable/, myenum
83
+ end
84
+
85
+ def test_stringio
86
+ # Verify StringIO works like this normally:
87
+ s = StringIO.new "start" + ("foo bar bat " * 1000)
88
+ val = nil
89
+ s.each { | entry | val = entry; break }
90
+ assert_match /^startfoo bar/, val
91
+
92
+ # make sure stringios aren't affected by calling normalize_params:
93
+ s = StringIO.new "start" + ("foo bar bat " * 1000)
94
+ v = normalize_params({ :foo => s.string })
95
+ s.each { | entry | val = entry; break }
96
+ assert_match /^startfoo bar/, val
97
+ end
98
+ class MyEnumerable
99
+ include Enumerable
100
+
101
+ def each
102
+ yield "1"
103
+ end
104
+ end
105
+
106
+ def test_object
107
+ assert_equal ["foo", '#<OpenStruct>'], normalize_params(['foo', OpenStruct.new('z'=>'q')])
108
+ end
109
+
110
+ def test_strip_backtrace
111
+ clean_trace = strip_nr_from_backtrace(mock_backtrace)
112
+ assert_equal(0, clean_trace.grep(/newrelic_rpm/).size,
113
+ "should remove all instances of new relic from backtrace but got: #{clean_trace.join("\n")}")
114
+ assert_equal(0, clean_trace.grep(/trace/).size,
115
+ "should remove trace method tags from method names but got: #{clean_trace.join("\n")}")
116
+ assert((clean_trace.grep(/find/).size >= 3),
117
+ "should see at least three frames with 'find' in them: \n#{clean_trace.join("\n")}")
118
+ end
119
+
120
+ def test_disabled_strip_backtrace
121
+ NewRelic::Control.instance['disable_backtrace_cleanup'] = true
122
+ clean_trace = strip_nr_from_backtrace(mock_backtrace)
123
+ assert_equal(1, clean_trace.grep(/new_relic/).size,
124
+ "should not remove instances of new relic from backtrace but got: #{clean_trace.join("\n")}")
125
+ assert_equal(1, clean_trace.grep(/_trace/).size,
126
+ "should not remove trace method tags from method names but got: #{clean_trace.join("\n")}")
127
+ # assert (clean_trace.grep(/find/).size >= 3), "should see at least three frames with 'find' in them (#{e}): \n#{clean_trace.join("\n")}"
128
+ NewRelic::Control.instance['disable_backtrace_cleanup'] = false
129
+ end
130
+
131
+ private
132
+ def mock_backtrace
133
+ [
134
+ %q{/home/app/gems/activerecord-2.3.12/lib/active_record/base.rb:1620:in `find_one_without_trace'},
135
+ %q{/home/app/gems/activerecord-2.3.12/lib/active_record/base.rb:1620:in `find_one'},
136
+ %q{/home/app/gems/activerecord-2.3.12/lib/active_record/base.rb:1603:in `find_from_ids'},
137
+ %q{./test/new_relic/collection_helper_test.rb:112:in `test_strip_stackdump'},
138
+ %q{/home/app/gems/mocha-0.9.8/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb:19:in `__send__'},
139
+ %q{/home/app/gems/mocha-0.9.8/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb:19:in `run'},
140
+ %q{/home/app/test/unit/testsuite.rb:34:in `run'},
141
+ %q{/home/app/test/unit/testsuite.rb:33:in `each'},
142
+ %q{/home/app/test/unit/testsuite.rb:33:in `run'},
143
+ %q{/home/app/test/unit/testsuite.rb:34:in `run'},
144
+ %q{/home/app/test/unit/testsuite.rb:33:in `each'},
145
+ %q{/home/app/test/unit/testsuite.rb:33:in `run'},
146
+ %q{/home/app/test/unit/ui/testrunnermediator.rb:46:in `run_suite'}
147
+ ]
148
+ end
149
+ end
@@ -0,0 +1,68 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'/../../test_helper'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__),'/../../../lib/new_relic/command'))
3
+
4
+ class NewRelic::Command::DeploymentsTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ NewRelic::Command::Deployments.class_eval do
8
+ attr_accessor :messages, :exit_status, :errors, :revision
9
+ def err(message); @errors = @errors ? @errors + message : message; end
10
+ def info(message); @messages = @messages ? @messages + message : message; end
11
+ def just_exit(status=0); @exit_status ||= status; end
12
+ end
13
+ end
14
+ def teardown
15
+ super
16
+ return unless @deployment
17
+ puts @deployment.errors
18
+ puts @deployment.messages
19
+ puts @deployment.exit_status
20
+ end
21
+ def test_help
22
+ begin
23
+ NewRelic::Command::Deployments.new "-h"
24
+ fail "should have thrown"
25
+ rescue NewRelic::Command::CommandFailure => c
26
+ assert_match /^Usage/, c.message
27
+ end
28
+ end
29
+ def test_bad_command
30
+ assert_raise NewRelic::Command::CommandFailure do
31
+ NewRelic::Command::Deployments.new ["-foo", "bar"]
32
+ end
33
+ end
34
+ def test_interactive
35
+ mock_the_connection
36
+ @deployment = NewRelic::Command::Deployments.new :appname => 'APP', :revision => 3838, :user => 'Bill', :description => "Some lengthy description"
37
+ assert_nil @deployment.exit_status
38
+ assert_nil @deployment.errors
39
+ assert_equal '3838', @deployment.revision
40
+ @deployment.run
41
+ @deployment = nil
42
+ end
43
+
44
+ def test_command_line_run
45
+ mock_the_connection
46
+ # @mock_response.expects(:body).returns("<xml>deployment</xml>")
47
+ @deployment = NewRelic::Command::Deployments.new(%w[-a APP -r 3838 --user=Bill] << "Some lengthy description")
48
+ assert_nil @deployment.exit_status
49
+ assert_nil @deployment.errors
50
+ assert_equal '3838', @deployment.revision
51
+ @deployment.run
52
+
53
+ # This should pass because it's a bogus deployment
54
+ #assert_equal 1, @deployment.exit_status
55
+ #assert_match /Unable to upload/, @deployment.errors
56
+
57
+ @deployment = nil
58
+ end
59
+ private
60
+ def mock_the_connection
61
+ mock_connection = mock()
62
+ @mock_response = mock()
63
+ @mock_response.expects(:is_a?).with(Net::HTTPSuccess).returns(true)
64
+ mock_connection.expects(:request).returns(@mock_response)
65
+ NewRelic::Control.instance.stubs(:http_connection).returns(mock_connection)
66
+ end
67
+
68
+ end
@@ -0,0 +1,62 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'test_helper'))
2
+ require 'new_relic/control/class_methods'
3
+
4
+ class BaseClassMethods
5
+ # stub class to enable testing of the module
6
+ include NewRelic::Control::ClassMethods
7
+ end
8
+
9
+ class NewRelic::Control::ClassMethodsTest < Test::Unit::TestCase
10
+ def setup
11
+ @base = ::BaseClassMethods.new
12
+ super
13
+ end
14
+
15
+ def test_instance
16
+ assert_equal(nil, @base.instance_variable_get('@instance'), 'instance should start out nil')
17
+ @base.expects(:new_instance).returns('a new instance')
18
+ assert_equal('a new instance', @base.instance, "should return the result from the #new_instance call")
19
+ end
20
+
21
+ def test_new_instance_non_test
22
+ local_env = mock('local env')
23
+ @base.expects(:local_env).returns(local_env).at_least_once
24
+ local_env.expects(:framework).returns('nontest').twice
25
+ mock_klass = mock('klass')
26
+ mock_klass.expects(:new).with(local_env)
27
+ @base.expects(:load_framework_class).with('nontest').returns(mock_klass)
28
+ @base.new_instance
29
+ end
30
+
31
+ def test_new_instance_test_framework
32
+ local_env = mock('local env')
33
+ local_env.expects(:framework).returns(:test)
34
+ @base.expects(:local_env).returns(local_env)
35
+ @base.expects(:load_test_framework)
36
+ @base.new_instance
37
+ end
38
+
39
+ def test_load_test_framework
40
+ local_env = mock('local env')
41
+ # a loose requirement here because the tests will *all* break if
42
+ # this does not work.
43
+ NewRelic::Control::Frameworks::Test.expects(:new).with(local_env, instance_of(String))
44
+ @base.expects(:local_env).returns(local_env)
45
+ @base.load_test_framework
46
+ end
47
+
48
+ def test_load_framework_class_existing
49
+ %w[rails rails3 sinatra ruby merb external].each do |type|
50
+ @base.load_framework_class(type)
51
+ end
52
+ end
53
+
54
+ def test_load_framework_class_missing
55
+ # this is used to allow other people to insert frameworks without
56
+ # having the file in our agent, i.e. define your own
57
+ # NewRelic::Control::Framework::FooBar
58
+ assert_raise(NameError) do
59
+ @base.load_framework_class('missing')
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,72 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'/../../test_helper'))
2
+
3
+ class NewRelic::Control::ConfigurationTest < Test::Unit::TestCase
4
+ require 'new_relic/control/configuration'
5
+ include NewRelic::Control::Configuration
6
+
7
+ def setup
8
+ # The log stuff is memoized so let's clear it each time.
9
+ NewRelic::Control.instance.instance_variable_set '@log_path', nil
10
+ NewRelic::Control.instance.instance_variable_set '@log_file', nil
11
+ @root = ::Rails::VERSION::MAJOR == 3 ? Rails.root : RAILS_ROOT
12
+ end
13
+
14
+ def teardown
15
+ NewRelic::Control.instance.settings.delete('log_file_path')
16
+ end
17
+
18
+ def test_license_key_defaults_to_env_variable
19
+ ENV['NEWRELIC_LICENSE_KEY'] = nil
20
+ self.expects(:fetch).with('license_key', nil)
21
+ license_key
22
+
23
+ ENV['NEWRELIC_LICENSE_KEY'] = "a string"
24
+ self.expects(:fetch).with('license_key', 'a string')
25
+ license_key
26
+ end
27
+
28
+ def test_log_path_uses_default_if_not_set
29
+ NewRelic::Control.instance.setup_log
30
+ assert_equal(File.expand_path("log/newrelic_agent.log"),
31
+ NewRelic::Control.instance.log_file)
32
+ end
33
+
34
+ def test_log_file_path_uses_given_value
35
+ Dir.stubs(:mkdir).returns(true)
36
+ NewRelic::Control.instance['log_file_path'] = 'lerg'
37
+ NewRelic::Control.instance.setup_log
38
+ assert_match(/\/lerg\/newrelic_agent.log/,
39
+ NewRelic::Control.instance.log_file)
40
+ NewRelic::Control.instance.settings.delete('log_file_path') # = nil
41
+ end
42
+
43
+ def test_server_side_config_ignores_yaml
44
+ settings.merge! 'ssl' => false, 'transaction_tracer' => {'enabled' => true, 'stack_trace_threshold' => 1.0}, 'error_collector' => {'enabled' => true, 'ignore_errors' => 'ActiveRecord::RecordNotFound'}, 'capture_params' => false
45
+ merge_server_side_config 'transaction_tracer.enabled' => false, 'error_collector.enabled' => false
46
+ assert_equal({'ssl' => false, 'transaction_tracer' => {'enabled' => false}, 'error_collector' => {'enabled' => false}}, settings)
47
+ end
48
+
49
+ def test_install_browser_monitoring
50
+ require(File.expand_path(File.join(File.dirname(__FILE__),
51
+ '/../../../lib/new_relic/rack/browser_monitoring')))
52
+ middleware = stub('middleware config')
53
+ config = stub('rails config', :middleware => middleware)
54
+ middleware.expects(:use).with(NewRelic::Rack::BrowserMonitoring)
55
+ NewRelic::Control.instance['browser_monitoring'] = { 'auto_instrument' => true }
56
+ NewRelic::Control.instance.instance_eval { @browser_monitoring_installed = false }
57
+
58
+ NewRelic::Control.instance.install_browser_monitoring(config)
59
+ end
60
+
61
+ def test_install_browser_monitoring_should_not_install_when_not_configured
62
+ middleware = stub('middleware config')
63
+ config = stub('rails config', :middleware => middleware)
64
+ middleware.expects(:use).never
65
+ NewRelic::Control.instance['browser_monitoring'] = { 'auto_instrument' => false }
66
+ NewRelic::Control.instance.instance_eval { @browser_monitoring_installed = false }
67
+
68
+ NewRelic::Control.instance.install_browser_monitoring(config)
69
+
70
+ NewRelic::Control.instance['browser_monitoring'] = { 'auto_instrument' => true }
71
+ end
72
+ end