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,410 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..', '..', '..','test_helper'))
2
+ class NewRelic::Agent::Agent::ConnectTest < Test::Unit::TestCase
3
+ require 'new_relic/agent/agent'
4
+
5
+ # I don't like this, we should be testing a third party, not ourselves -Jon
6
+ include NewRelic::Agent::Agent::Connect
7
+
8
+ def setup
9
+ @connected = nil
10
+ @keep_retrying = nil
11
+ @connect_attempts = 1
12
+ @connect_retry_period = 0
13
+ @transaction_sampler = NewRelic::Agent::TransactionSampler.new
14
+ @sql_sampler = NewRelic::Agent::SqlSampler.new
15
+ end
16
+
17
+ def test_tried_to_connect?
18
+ # base case, should default to false
19
+ assert !tried_to_connect?({})
20
+ end
21
+
22
+ def test_tried_to_connect_connected
23
+ # is true if connected is true.
24
+ @connected = true
25
+ assert tried_to_connect?({})
26
+ end
27
+
28
+ def test_tried_to_connect_forced
29
+ # is false if force_reconnect is true
30
+ assert !tried_to_connect?({:force_reconnect => true})
31
+ end
32
+
33
+ def test_should_keep_retrying_base
34
+ # default to true
35
+ should_keep_retrying?({})
36
+ assert @keep_retrying, "should keep retrying by default"
37
+ end
38
+
39
+ def test_should_keep_retrying_option_true
40
+ # should be true if keep_retrying is true
41
+ should_keep_retrying?({:keep_retrying => true})
42
+ end
43
+
44
+ def test_get_retry_period
45
+ (1..6).each do |x|
46
+ @connect_attempts = x
47
+ assert_equal get_retry_period, x * 60, "should be #{x} minutes"
48
+ end
49
+ @connect_attempts = 100
50
+ assert_equal get_retry_period, 600, "should max out at 10 minutes after 6 tries"
51
+ end
52
+
53
+ def test_increment_retry_period
54
+ @connect_retry_period = 0
55
+ @connect_attempts = 1
56
+ assert_equal 0, connect_retry_period
57
+ increment_retry_period!
58
+ assert_equal 60, connect_retry_period
59
+ end
60
+
61
+ def test_should_retry_true
62
+ @keep_retrying = true
63
+ @connect_attempts = 1
64
+ log.expects(:info).once
65
+ self.expects(:increment_retry_period!).once
66
+ assert should_retry?, "should retry in this circumstance"
67
+ assert_equal 2, @connect_attempts, "should be on the second attempt"
68
+ end
69
+
70
+ def test_should_retry_false
71
+ @keep_retrying = false
72
+ self.expects(:disconnect).once
73
+ assert !should_retry?
74
+ end
75
+
76
+ def test_disconnect
77
+ assert disconnect
78
+ end
79
+
80
+ def test_attr_accessor_connect_retry_period
81
+ assert_accessor(:connect_retry_period)
82
+ end
83
+
84
+ def test_attr_accessor_connect_attempts
85
+ assert_accessor(:connect_attempts)
86
+ end
87
+
88
+ def test_log_error
89
+ error = mock('error')
90
+ error.expects(:backtrace).once.returns(["line", "secondline"])
91
+ error.expects(:message).once.returns("message")
92
+ fake_control = mock()
93
+ fake_control.expects(:server).returns("server")
94
+ self.expects(:control).once.returns(fake_control)
95
+ log.expects(:error).with("Error establishing connection with New Relic Service at server: message")
96
+ log.expects(:debug).with("line\nsecondline")
97
+ log_error(error)
98
+ end
99
+
100
+ def test_handle_license_error
101
+ error = mock('error')
102
+ self.expects(:disconnect).once
103
+ log.expects(:error).once.with("error message")
104
+ log.expects(:info).once.with("Visit NewRelic.com to obtain a valid license key, or to upgrade your account.")
105
+ error.expects(:message).returns("error message")
106
+ handle_license_error(error)
107
+ end
108
+
109
+ def test_log_seed_token
110
+ fake_control = mocked_control
111
+ fake_control.expects(:validate_seed).times(2).returns("many seeds")
112
+ fake_control.expects(:validate_token).once.returns("a token, man")
113
+ log.expects(:debug).with("Connecting with validation seed/token: many seeds/a token, man").once
114
+ log_seed_token
115
+ end
116
+
117
+ def test_no_seed_token
118
+ fake_control = mocked_control
119
+ fake_control.expects(:validate_seed).once.returns(nil)
120
+ log.expects(:debug).never
121
+ log_seed_token
122
+ end
123
+
124
+ def mocks_for_positive_environment_for_connect(value_for_control)
125
+ control = mocked_control
126
+ control.expects(:'[]').with('send_environment_info').once.returns(value_for_control)
127
+ fake_env = mock('local_env')
128
+ fake_env.expects(:snapshot).once.returns("snapshot")
129
+ control.expects(:local_env).once.returns(fake_env)
130
+ end
131
+
132
+ def test_environment_for_connect_nil
133
+ mocks_for_positive_environment_for_connect(nil)
134
+ assert_equal 'snapshot', environment_for_connect
135
+ end
136
+
137
+ def test_environment_for_connect_positive
138
+ mocks_for_positive_environment_for_connect(true)
139
+ assert_equal 'snapshot', environment_for_connect
140
+ end
141
+
142
+ def test_environment_for_connect_negative
143
+ control = mocked_control
144
+ control.expects(:'[]').with('send_environment_info').once.returns(false)
145
+ assert_equal [], environment_for_connect
146
+ end
147
+
148
+ def test_validate_settings
149
+ control = mocked_control
150
+ control.expects(:validate_seed).once
151
+ control.expects(:validate_token).once
152
+ assert_equal({:seed => nil, :token => nil}, validate_settings)
153
+ end
154
+
155
+ def test_connect_settings
156
+ control = mocked_control
157
+ control.expects(:app_names)
158
+ control.expects(:settings)
159
+ self.expects(:validate_settings)
160
+ self.expects(:environment_for_connect)
161
+ keys = %w(pid host app_name language agent_version environment settings validate)
162
+ value = connect_settings
163
+ keys.each do |k|
164
+ assert(value.has_key?(k.to_sym), "should include the key #{k}")
165
+ end
166
+ end
167
+
168
+ def test_configure_error_collector_base
169
+ fake_collector = mocked_error_collector
170
+ fake_collector.expects(:config_enabled).returns(false)
171
+ fake_collector.expects(:enabled=).with(false)
172
+ log.expects(:debug).with("Errors will not be sent to the New Relic service.")
173
+ configure_error_collector!(false)
174
+ end
175
+
176
+ def test_configure_error_collector_enabled
177
+ fake_collector = mocked_error_collector
178
+ fake_collector.expects(:config_enabled).returns(true)
179
+ fake_collector.expects(:enabled=).with(true)
180
+ log.expects(:debug).with("Errors will be sent to the New Relic service.")
181
+ configure_error_collector!(true)
182
+ end
183
+
184
+ def test_configure_error_collector_server_disabled
185
+ fake_collector = mocked_error_collector
186
+ fake_collector.expects(:config_enabled).returns(true)
187
+ fake_collector.expects(:enabled=).with(false)
188
+ log.expects(:debug).with("Errors will not be sent to the New Relic service.")
189
+ configure_error_collector!(false)
190
+ end
191
+
192
+ def test_enable_random_samples
193
+ sampling_rate = 10
194
+ ts = @transaction_sampler = mock('ts')
195
+ ts.expects(:random_sampling=).with(true)
196
+ ts.expects(:sampling_rate=).with(sampling_rate)
197
+ ts.expects(:sampling_rate).returns(sampling_rate)
198
+ log.expects(:info).with("Transaction sampling enabled, rate = 10")
199
+ enable_random_samples!(sampling_rate)
200
+ end
201
+
202
+ def test_enable_random_samples_with_no_sampling_rate
203
+ # testing that we set a sane default for sampling rate
204
+ sampling_rate = 0
205
+ ts = @transaction_sampler = mock('ts')
206
+ ts.expects(:random_sampling=).with(true)
207
+ ts.expects(:sampling_rate=).with(10)
208
+ ts.expects(:sampling_rate).returns(10)
209
+ log.expects(:info).with("Transaction sampling enabled, rate = 10")
210
+ enable_random_samples!(sampling_rate)
211
+ end
212
+
213
+ def test_config_transaction_tracer
214
+ NewRelic::Control.instance.settings['transaction_tracer'] = {
215
+ 'enabled' => true,
216
+ 'random_sample' => false,
217
+ 'explain_threshold' => 0.75,
218
+ 'explain_enabled' => true
219
+ }
220
+
221
+ config_transaction_tracer
222
+
223
+ assert @transaction_sampler.enabled?
224
+ assert_equal 0.75, @transaction_sampler.explain_threshold
225
+ assert @transaction_sampler.explain_enabled
226
+ # assert_equal 1.5, @transaction_sampler.transaction_threshold
227
+ end
228
+
229
+ def test_configure_transaction_tracer_with_random_sampling
230
+ @config_should_send_samples = true
231
+ @should_send_random_samples = true
232
+ @slowest_transaction_threshold = 5
233
+ log.expects(:debug).with('Transaction tracing threshold is 5 seconds.')
234
+ self.expects(:enable_random_samples!).with(10)
235
+ configure_transaction_tracer!(true, 10)
236
+ assert @should_send_samples
237
+ end
238
+
239
+ def test_configure_transaction_tracer_positive
240
+ @config_should_send_samples = true
241
+ @slowest_transaction_threshold = 5
242
+ log.expects(:debug).with('Transaction tracing threshold is 5 seconds.')
243
+ configure_transaction_tracer!(true, 10)
244
+ assert @should_send_samples
245
+ end
246
+
247
+ def test_configure_transaction_tracer_negative
248
+ @config_should_send_samples = false
249
+ log.expects(:debug).with('Transaction traces will not be sent to the New Relic service.')
250
+ configure_transaction_tracer!(true, 10)
251
+ assert !@should_send_samples
252
+ end
253
+
254
+ def test_configure_transaction_tracer_server_disabled
255
+ @config_should_send_samples = true
256
+ log.expects(:debug).with('Transaction traces will not be sent to the New Relic service.')
257
+ configure_transaction_tracer!(false, 10)
258
+ assert !@should_send_samples
259
+ end
260
+
261
+ def test_apdex_f
262
+ NewRelic::Control.instance.expects(:apdex_t).returns(10)
263
+ assert_equal 40, apdex_f
264
+ end
265
+
266
+ def test_apdex_f_threshold_positive
267
+ NewRelic::Control.instance.settings['transaction_tracer'] = { 'transaction_threshold' => 'apdex_f' }
268
+ assert apdex_f_threshold?
269
+ end
270
+
271
+ def test_apdex_f_threshold_negative
272
+ NewRelic::Control.instance.settings['transaction_tracer'] = { 'transaction_threshold' => 'WHEE' }
273
+ assert !apdex_f_threshold?
274
+ end
275
+
276
+ def test_set_sql_recording_default
277
+ NewRelic::Control.instance.settings['transaction_tracer'] = { }
278
+ self.expects(:log_sql_transmission_warning?)
279
+ set_sql_recording!
280
+ assert_equal :obfuscated, @record_sql, " should default to :obfuscated, was #{@record_sql}"
281
+ end
282
+
283
+ def test_set_sql_recording_off
284
+ NewRelic::Control.instance.settings['transaction_tracer'] = {'record_sql' => 'off'}
285
+ self.expects(:log_sql_transmission_warning?)
286
+ set_sql_recording!
287
+ assert_equal :off, @record_sql, "should be set to :off, was #{@record_sql}"
288
+ end
289
+
290
+ def test_set_sql_recording_none
291
+ NewRelic::Control.instance.settings['transaction_tracer'] = {'record_sql' => 'none'}
292
+ self.expects(:log_sql_transmission_warning?)
293
+ set_sql_recording!
294
+ assert_equal :off, @record_sql, "should be set to :off, was #{@record_sql}"
295
+ end
296
+
297
+ def test_set_sql_recording_raw
298
+ NewRelic::Control.instance.settings['transaction_tracer'] = {'record_sql' => 'raw'}
299
+ self.expects(:log_sql_transmission_warning?)
300
+ set_sql_recording!
301
+ assert_equal :raw, @record_sql, "should be set to :raw, was #{@record_sql}"
302
+ end
303
+
304
+ def test_set_sql_recording_falsy
305
+ NewRelic::Control.instance.settings['transaction_tracer'] = {'record_sql' => false}
306
+ self.expects(:log_sql_transmission_warning?)
307
+ set_sql_recording!
308
+ assert_equal :off, @record_sql, "should be set to :off, was #{@record_sql}"
309
+ end
310
+
311
+ def test_log_sql_transmission_warning_negative
312
+ log = mocked_log
313
+ @record_sql = :obfuscated
314
+ log.expects(:warn).never
315
+ log_sql_transmission_warning?
316
+ end
317
+
318
+ def test_log_sql_transmission_warning_positive
319
+ log = mocked_log
320
+ @record_sql = :raw
321
+ log.expects(:warn).with('Agent is configured to send raw SQL to the service')
322
+ log_sql_transmission_warning?
323
+ end
324
+
325
+ def test_set_collector_host_positive
326
+ control = mocked_control
327
+ self.expects(:invoke_remote).with(:get_redirect_host).returns('collector-deux.newrelic.com')
328
+ control.expects(:server_from_host).with('collector-deux.newrelic.com').returns('correct')
329
+ set_collector_host!
330
+ assert_equal 'correct', @collector
331
+ end
332
+
333
+ def test_set_collector_host_negative
334
+ @collector = 'initial value'
335
+ control = mocked_control
336
+ self.expects(:invoke_remote).with(:get_redirect_host).returns(nil)
337
+ set_collector_host!
338
+ assert_equal 'initial value', @collector, "should not modify collector value"
339
+ end
340
+
341
+ def test_configure_transaction_tracer_random_samples
342
+ @config_should_send_samples = true
343
+ @should_send_random_samples = true
344
+ self.expects(:enable_random_samples!).with(10)
345
+ log.expects(:debug)
346
+ configure_transaction_tracer!(true, 10)
347
+ assert @should_send_samples
348
+ end
349
+
350
+ def test_query_server_for_configuration
351
+ self.expects(:set_collector_host!)
352
+ self.expects(:connect_to_server).returns("so happy")
353
+ self.expects(:finish_setup).with("so happy")
354
+ query_server_for_configuration
355
+ end
356
+
357
+ def test_finish_setup
358
+ config = {
359
+ 'agent_run_id' => 'fishsticks',
360
+ 'data_report_period' => 'pasta sauce',
361
+ 'url_rules' => 'tamales',
362
+ 'collect_traces' => true,
363
+ 'collect_errors' => true,
364
+ 'sample_rate' => 10
365
+ }
366
+ NewRelic::Control.instance.settings['transaction_tracer'] = {'enabled' => true}
367
+ self.expects(:log_connection!).with(config)
368
+ self.expects(:configure_transaction_tracer!).with(true, 10)
369
+ self.expects(:configure_error_collector!).with(true)
370
+ @transaction_sampler = stub('transaction sampler', :configure! => true,
371
+ :config => {})
372
+ @sql_sampler = stub('sql sampler', :configure! => true)
373
+ finish_setup(config)
374
+ assert_equal 'fishsticks', @agent_id
375
+ assert_equal 'pasta sauce', @report_period
376
+ assert_equal 'tamales', @url_rules
377
+ end
378
+
379
+ private
380
+
381
+ def mocked_control
382
+ fake_control = mock('control')
383
+ self.stubs(:control).returns(fake_control)
384
+ fake_control
385
+ end
386
+
387
+ def mocked_log
388
+ fake_log = mock('log')
389
+ self.stubs(:log).returns(fake_log)
390
+ fake_log
391
+ end
392
+
393
+ def mocked_error_collector
394
+ fake_collector = mock('error collector')
395
+ self.stubs(:error_collector).returns(fake_collector)
396
+ fake_collector
397
+ end
398
+
399
+ def log
400
+ @logger ||= Object.new
401
+ end
402
+
403
+ def assert_accessor(sym)
404
+ var_name = "@#{sym}"
405
+ instance_variable_set(var_name, 1)
406
+ assert (self.send(sym) == 1)
407
+ self.send(sym.to_s + '=', 10)
408
+ assert (instance_variable_get(var_name) == 10)
409
+ end
410
+ end
@@ -0,0 +1,255 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','..','..','test_helper'))
2
+ class NewRelic::Agent::Agent::StartTest < Test::Unit::TestCase
3
+ require 'new_relic/agent/agent'
4
+ include NewRelic::Agent::Agent::Start
5
+
6
+ def test_already_started_positive
7
+ control = mocked_control
8
+ control.expects(:log!).with("Agent Started Already!", :error)
9
+ self.expects(:started?).returns(true)
10
+ assert already_started?, "should have already started"
11
+ end
12
+
13
+ def test_already_started_negative
14
+ self.expects(:started?).returns(false)
15
+ assert !already_started?
16
+ end
17
+
18
+ def test_disabled_positive
19
+ control = mocked_control
20
+ control.expects(:agent_enabled?).returns(false)
21
+ assert disabled?
22
+ end
23
+
24
+ def test_disabled_negative
25
+ control = mocked_control
26
+ control.expects(:agent_enabled?).returns(true)
27
+ assert !disabled?
28
+ end
29
+
30
+ def test_log_dispatcher_positive
31
+ control = mocked_control
32
+ log = mocked_log
33
+ control.expects(:dispatcher).returns('Y U NO SERVE WEBPAGE')
34
+ log.expects(:info).with("Dispatcher: Y U NO SERVE WEBPAGE")
35
+ log_dispatcher
36
+ end
37
+
38
+ def test_log_dispatcher_negative
39
+ control = mocked_control
40
+ log = mocked_log
41
+ control.expects(:dispatcher).returns('')
42
+ log.expects(:info).with("No dispatcher detected.")
43
+ log_dispatcher
44
+ end
45
+
46
+ def test_log_app_names
47
+ control = mocked_control
48
+ log = mocked_log
49
+ control.expects(:app_names).returns(%w(zam zam zabam))
50
+ log.expects(:info).with("Application: zam, zam, zabam")
51
+ log_app_names
52
+ end
53
+
54
+ def test_check_config_and_start_agent_disabled
55
+ self.expects(:monitoring?).returns(false)
56
+ check_config_and_start_agent
57
+ end
58
+
59
+ def test_check_config_and_start_agent_incorrect_key
60
+ self.expects(:monitoring?).returns(true)
61
+ self.expects(:has_correct_license_key?).returns(false)
62
+ check_config_and_start_agent
63
+ end
64
+
65
+ def test_check_config_and_start_agent_forking
66
+ self.expects(:monitoring?).returns(true)
67
+ self.expects(:has_correct_license_key?).returns(true)
68
+ self.expects(:using_forking_dispatcher?).returns(true)
69
+ check_config_and_start_agent
70
+ end
71
+
72
+ def test_check_config_and_start_agent_normal
73
+ self.expects(:monitoring?).returns(true)
74
+ self.expects(:has_correct_license_key?).returns(true)
75
+ self.expects(:using_forking_dispatcher?).returns(false)
76
+ control = mocked_control
77
+ control.expects(:sync_startup).returns(false)
78
+ self.expects(:start_worker_thread)
79
+ self.expects(:install_exit_handler)
80
+ check_config_and_start_agent
81
+ end
82
+
83
+ def test_check_config_and_start_agent_sync
84
+ self.expects(:monitoring?).returns(true)
85
+ self.expects(:has_correct_license_key?).returns(true)
86
+ self.expects(:using_forking_dispatcher?).returns(false)
87
+ control = mocked_control
88
+ control.expects(:sync_startup).returns(true)
89
+ self.expects(:connect_in_foreground)
90
+ self.expects(:start_worker_thread)
91
+ self.expects(:install_exit_handler)
92
+ check_config_and_start_agent
93
+ end
94
+
95
+ def test_connect_in_foreground
96
+ self.expects(:connect).with({:keep_retrying => false })
97
+ connect_in_foreground
98
+ end
99
+
100
+ def at_exit
101
+ yield
102
+ end
103
+ private :at_exit
104
+
105
+ def test_install_exit_handler_positive
106
+ control = mocked_control
107
+ control.expects(:send_data_on_exit).returns(true)
108
+ NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(false)
109
+ NewRelic::LanguageSupport.expects(:using_engine?).with('jruby').returns(false)
110
+ self.expects(:using_sinatra?).returns(false)
111
+ # we are overriding at_exit above, to immediately return, so we can
112
+ # test the shutdown logic. It's somewhat unfortunate, but we can't
113
+ # kill the interpreter during a test.
114
+ self.expects(:shutdown)
115
+ install_exit_handler
116
+ end
117
+
118
+ def test_install_exit_handler_negative
119
+ control = mocked_control
120
+ control.expects(:send_data_on_exit).returns(false)
121
+ install_exit_handler
122
+ end
123
+
124
+ def test_install_exit_handler_weird_ruby
125
+ control = mocked_control
126
+ control.expects(:send_data_on_exit).times(3).returns(true)
127
+ NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(false)
128
+ NewRelic::LanguageSupport.expects(:using_engine?).with('jruby').returns(false)
129
+ self.expects(:using_sinatra?).returns(true)
130
+ install_exit_handler
131
+ NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(false)
132
+ NewRelic::LanguageSupport.expects(:using_engine?).with('jruby').returns(true)
133
+ install_exit_handler
134
+ NewRelic::LanguageSupport.expects(:using_engine?).with('rbx').returns(true)
135
+ install_exit_handler
136
+ end
137
+
138
+ def test_notify_log_file_location_positive
139
+ log = mocked_log
140
+ NewRelic::Control.instance.expects(:log_file).returns('./')
141
+ log.expects(:send).with(:info, "Agent Log at ./")
142
+ notify_log_file_location
143
+ end
144
+
145
+ def test_notify_log_file_location_negative
146
+ log = mocked_log
147
+ NewRelic::Control.instance.expects(:log_file).returns(nil)
148
+ notify_log_file_location
149
+ end
150
+
151
+ def test_monitoring_positive
152
+ control = mocked_control
153
+ control.expects(:monitor_mode?).returns(true)
154
+ log = mocked_log
155
+ assert monitoring?
156
+ end
157
+
158
+ def test_monitoring_negative
159
+ control = mocked_control
160
+ log = mocked_log
161
+ control.expects(:monitor_mode?).returns(false)
162
+ log.expects(:send).with(:warn, "Agent configured not to send data in this environment - edit newrelic.yml to change this")
163
+ assert !monitoring?
164
+ end
165
+
166
+ def test_has_license_key_positive
167
+ control = mocked_control
168
+ control.expects(:license_key).returns("a" * 40)
169
+ assert has_license_key?
170
+ end
171
+
172
+ def test_has_license_key_negative
173
+ control = mocked_control
174
+ control.expects(:license_key).returns(nil)
175
+ log = mocked_log
176
+ log.expects(:send).with(:error, 'No license key found. Please edit your newrelic.yml file and insert your license key.')
177
+ assert !has_license_key?
178
+ end
179
+
180
+ def test_has_correct_license_key_positive
181
+ self.expects(:has_license_key?).returns(true)
182
+ self.expects(:correct_license_length).returns(true)
183
+ assert has_correct_license_key?
184
+ end
185
+
186
+ def test_has_correct_license_key_negative
187
+ self.expects(:has_license_key?).returns(false)
188
+ assert !has_correct_license_key?
189
+ end
190
+
191
+ def test_correct_license_length_positive
192
+ control = mocked_control
193
+ control.expects(:license_key).returns("a" * 40)
194
+ assert correct_license_length
195
+ end
196
+
197
+ def test_correct_license_length_negative
198
+ control = mocked_control
199
+ log = mocked_log
200
+ control.expects(:license_key).returns("a"*30)
201
+ log.expects(:send).with(:error, "Invalid license key: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
202
+ assert !correct_license_length
203
+ end
204
+
205
+ def test_using_forking_dispatcher_positive
206
+ control = mocked_control
207
+ control.expects(:dispatcher).returns(:passenger)
208
+ log = mocked_log
209
+ log.expects(:send).with(:info, "Connecting workers after forking.")
210
+ assert using_forking_dispatcher?
211
+ end
212
+
213
+ def test_using_forking_dispatcher_negative
214
+ control = mocked_control
215
+ control.expects(:dispatcher).returns(:frobnitz)
216
+ assert !using_forking_dispatcher?
217
+ end
218
+
219
+ def test_log_unless_positive
220
+ # should not log
221
+ assert log_unless(true, :warn, "DURRR")
222
+ end
223
+ def test_log_unless_negative
224
+ # should log
225
+ log = mocked_log
226
+ log.expects(:send).with(:warn, "DURRR")
227
+ assert !log_unless(false, :warn, "DURRR")
228
+ end
229
+
230
+ def test_log_if_positive
231
+ log = mocked_log
232
+ log.expects(:send).with(:warn, "WHEE")
233
+ assert log_if(true, :warn, "WHEE")
234
+ end
235
+
236
+ def test_log_if_negative
237
+ assert !log_if(false, :warn, "WHEE")
238
+ end
239
+
240
+ private
241
+
242
+ def mocked_log
243
+ fake_log = mock('log')
244
+ self.stubs(:log).returns(fake_log)
245
+ fake_log
246
+ end
247
+
248
+
249
+ def mocked_control
250
+ fake_control = mock('control')
251
+ self.stubs(:control).returns(fake_control)
252
+ fake_control
253
+ end
254
+ end
255
+