dolores_rpm 3.2.0.2

Sign up to get free protection for your applications and to get access to all the features.
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,454 @@
1
+ require 'new_relic/control'
2
+ require 'new_relic/data_serialization'
3
+ # = New Relic Ruby Agent
4
+ #
5
+ # New Relic is a performance monitoring application for applications
6
+ # running in production. For more information on New Relic please visit
7
+ # http://www.newrelic.com.
8
+ #
9
+ # The New Relic Ruby Agent can be installed in Rails applications to
10
+ # gather runtime performance metrics, traces, and errors for display
11
+ # in a Developer Mode middleware (mapped to /newrelic in your application
12
+ # server) or for monitoring and analysis at http://rpm.newrelic.com
13
+ # with just about any Ruby application.
14
+ #
15
+ # == Getting Started
16
+ # For instructions on installation and setup, see
17
+ # the README[link:./files/README_rdoc.html] file.
18
+ #
19
+ # == Using with Rack/Metal
20
+ #
21
+ # To instrument Rack middlwares or Metal apps, refer to the docs in
22
+ # NewRelic::Agent::Instrumentation::Rack.
23
+ #
24
+ # == Ruby Agent API
25
+ #
26
+ # For details on the Ruby Agent API, refer to NewRelic::Agent.
27
+ #
28
+ # == Customizing the Ruby Agent
29
+ #
30
+ # For detailed information on customizing the Ruby Agent
31
+ # please visit our {support and documentation site}[http://support.newrelic.com].
32
+ #
33
+ module NewRelic
34
+ # == Ruby Agent APIs
35
+ # This module contains the public API methods for the Ruby Agent.
36
+ #
37
+ # For adding custom instrumentation to method invocations, refer to
38
+ # the docs in the class NewRelic::Agent::MethodTracer.
39
+ #
40
+ # For information on how to customize the controller
41
+ # instrumentation, or to instrument something other than Rails so
42
+ # that high level dispatcher actions or background tasks show up as
43
+ # first class operations in New Relic, refer to
44
+ # NewRelic::Agent::Instrumentation::ControllerInstrumentation and
45
+ # NewRelic::Agent::Instrumentation::ControllerInstrumentation::ClassMethods.
46
+ #
47
+ # Methods in this module as well as documented methods in
48
+ # NewRelic::Agent::MethodTracer and
49
+ # NewRelic::Agent::Instrumentation::ControllerInstrumentation are
50
+ # available to applications. When the agent is not enabled the
51
+ # method implementations are stubbed into no-ops to reduce overhead.
52
+ #
53
+ # Methods and classes in other parts of the agent are not guaranteed
54
+ # to be available between releases.
55
+ #
56
+ # Refer to the online docs at support.newrelic.com to see how to
57
+ # access the data collected by custom instrumentation, or e-mail
58
+ # support at New Relic for help.
59
+ module Agent
60
+ extend self
61
+
62
+ require 'new_relic/version'
63
+ require 'new_relic/local_environment'
64
+ require 'new_relic/stats'
65
+ require 'new_relic/metrics'
66
+ require 'new_relic/metric_spec'
67
+ require 'new_relic/metric_data'
68
+ require 'new_relic/collection_helper'
69
+ require 'new_relic/transaction_analysis'
70
+ require 'new_relic/transaction_sample'
71
+ require 'new_relic/url_rule'
72
+ require 'new_relic/noticed_error'
73
+ require 'new_relic/timer_lib'
74
+
75
+ require 'new_relic/agent'
76
+ require 'new_relic/agent/chained_call'
77
+ require 'new_relic/agent/browser_monitoring'
78
+ require 'new_relic/agent/agent'
79
+ require 'new_relic/agent/shim_agent'
80
+ require 'new_relic/agent/method_tracer'
81
+ require 'new_relic/agent/worker_loop'
82
+ require 'new_relic/agent/stats_engine'
83
+ require 'new_relic/agent/transaction_sampler'
84
+ require 'new_relic/agent/sql_sampler'
85
+ require 'new_relic/agent/error_collector'
86
+ require 'new_relic/agent/busy_calculator'
87
+ require 'new_relic/agent/sampler'
88
+ require 'new_relic/agent/database'
89
+
90
+ require 'new_relic/agent/instrumentation/controller_instrumentation'
91
+
92
+ require 'new_relic/agent/samplers/cpu_sampler'
93
+ require 'new_relic/agent/samplers/memory_sampler'
94
+ require 'new_relic/agent/samplers/object_sampler'
95
+ require 'new_relic/agent/samplers/delayed_job_lock_sampler'
96
+ require 'set'
97
+ require 'thread'
98
+ require 'resolv'
99
+
100
+ # An exception that is thrown by the server if the agent license is invalid.
101
+ class LicenseException < StandardError; end
102
+
103
+ # An exception that forces an agent to stop reporting until its mongrel is restarted.
104
+ class ForceDisconnectException < StandardError; end
105
+
106
+ # An exception that forces an agent to restart.
107
+ class ForceRestartException < StandardError; end
108
+
109
+ # Used to blow out of a periodic task without logging a an error, such as for routine
110
+ # failures.
111
+ class ServerConnectionException < StandardError; end
112
+
113
+ # Used for when a transaction trace or error report has too much
114
+ # data, so we reset the queue to clear the extra-large item
115
+ class PostTooBigException < ServerConnectionException; end
116
+
117
+ # Reserved for future use. Meant to represent a problem on the server side.
118
+ class ServerError < StandardError; end
119
+
120
+ class BackgroundLoadingError < StandardError; end
121
+
122
+ @agent = nil
123
+
124
+ # The singleton Agent instance. Used internally.
125
+ def agent #:nodoc:
126
+ raise "Plugin not initialized!" if @agent.nil?
127
+ @agent
128
+ end
129
+
130
+ def agent=(new_instance)#:nodoc:
131
+ @agent = new_instance
132
+ end
133
+
134
+ alias instance agent #:nodoc:
135
+
136
+ # Get or create a statistics gatherer that will aggregate numerical data
137
+ # under a metric name.
138
+ #
139
+ # +metric_name+ should follow a slash separated path convention. Application
140
+ # specific metrics should begin with "Custom/".
141
+ #
142
+ # Return a NewRelic::Stats that accepts data
143
+ # via calls to add_data_point(value).
144
+ def get_stats(metric_name, use_scope=false)
145
+ agent.stats_engine.get_stats(metric_name, use_scope)
146
+ end
147
+
148
+ alias get_stats_no_scope get_stats
149
+
150
+ # Get the logger for the agent. Available after the agent has initialized.
151
+ # This sends output to the agent log file. If the agent has not initialized
152
+ # a standard output logger is returned.
153
+ def logger
154
+ control = NewRelic::Control.instance(false)
155
+ if control
156
+ control.log
157
+ else
158
+ require 'logger'
159
+ @stdoutlog ||= Logger.new $stdout
160
+ end
161
+ end
162
+
163
+ # Call this to manually start the Agent in situations where the Agent does
164
+ # not auto-start.
165
+ #
166
+ # When the app environment loads, so does the Agent. However, the
167
+ # Agent will only connect to the service if a web front-end is found. If
168
+ # you want to selectively monitor ruby processes that don't use
169
+ # web plugins, then call this method in your code and the Agent
170
+ # will fire up and start reporting to the service.
171
+ #
172
+ # Options are passed in as overrides for values in the
173
+ # newrelic.yml, such as app_name. In addition, the option +log+
174
+ # will take a logger that will be used instead of the standard
175
+ # file logger. The setting for the newrelic.yml section to use
176
+ # (ie, RAILS_ENV) can be overridden with an :env argument.
177
+ #
178
+ def manual_start(options={})
179
+ raise "Options must be a hash" unless Hash === options
180
+ NewRelic::Control.instance.init_plugin({ :agent_enabled => true, :sync_startup => true }.merge(options))
181
+ end
182
+
183
+ # Register this method as a callback for processes that fork
184
+ # jobs.
185
+ #
186
+ # If the master/parent connects to the agent prior to forking the
187
+ # agent in the forked process will use that agent_run. Otherwise
188
+ # the forked process will establish a new connection with the
189
+ # server.
190
+ #
191
+ # Use this especially when you fork the process to run background
192
+ # jobs or other work. If you are doing this with a web dispatcher
193
+ # that forks worker processes then you will need to force the
194
+ # agent to reconnect, which it won't do by default. Passenger and
195
+ # Unicorn are already handled, nothing special needed for them.
196
+ #
197
+ # Options:
198
+ # * <tt>:force_reconnect => true</tt> to force the spawned process to
199
+ # establish a new connection, such as when forking a long running process.
200
+ # The default is false--it will only connect to the server if the parent
201
+ # had not connected.
202
+ # * <tt>:keep_retrying => false</tt> if we try to initiate a new
203
+ # connection, this tells me to only try it once so this method returns
204
+ # quickly if there is some kind of latency with the server.
205
+ def after_fork(options={})
206
+ agent.after_fork(options)
207
+ end
208
+
209
+ # Clear out any unsent metric data. See NewRelic::Agent::Agent#reset_stats
210
+ def reset_stats
211
+ agent.reset_stats
212
+ end
213
+
214
+ # Shutdown the agent. Call this before exiting. Sends any queued data
215
+ # and kills the background thread.
216
+ def shutdown(options={})
217
+ agent.shutdown(options)
218
+ end
219
+
220
+ # a method used to serialize short-running processes to disk, so
221
+ # we don't incur the overhead of reporting to the server for every
222
+ # fork/invocation of a small job.
223
+ #
224
+ # Functionally, this loads the data from the file into the agent
225
+ # (to avoid losing data by overwriting) and then serializes the
226
+ # agent data to the file again. See also #load_data
227
+ def save_data
228
+ NewRelic::DataSerialization.read_and_write_to_file do |old_data|
229
+ agent.merge_data_from(old_data)
230
+ agent.serialize
231
+ end
232
+ end
233
+
234
+ # used to load data from the disk during the harvest cycle to send
235
+ # it. This method also clears the file so data should never be
236
+ # sent more than once.
237
+
238
+ # Note that only one transaction trace will be sent even if many
239
+ # are serialized, since the slowest is sent.
240
+ #
241
+ # See also the complement to this method, #save_data - used when a
242
+ # process is shutting down
243
+ def load_data
244
+ if !NewRelic::Control.instance['disable_serialization']
245
+ NewRelic::DataSerialization.read_and_write_to_file do |old_data|
246
+ agent.merge_data_from(old_data)
247
+ nil # return nil so nothing is written to the file
248
+ end
249
+ NewRelic::DataSerialization.update_last_sent!
250
+ end
251
+
252
+ {
253
+ :metrics => agent.stats_engine.metrics.length,
254
+ :traces => agent.unsent_traces_size,
255
+ :errors => agent.unsent_errors_size
256
+ }
257
+ end
258
+
259
+ # Add instrumentation files to the agent. The argument should be
260
+ # a glob matching ruby scripts which will be executed at the time
261
+ # instrumentation is loaded. Since instrumentation is not loaded
262
+ # when the agent is not running it's better to use this method to
263
+ # register instrumentation than just loading the files directly,
264
+ # although that probably also works.
265
+ def add_instrumentation(file_pattern)
266
+ NewRelic::Control.instance.add_instrumentation file_pattern
267
+ end
268
+
269
+ # This method sets the block sent to this method as a sql
270
+ # obfuscator. The block will be called with a single String SQL
271
+ # statement to obfuscate. The method must return the obfuscated
272
+ # String SQL. If chaining of obfuscators is required, use type =
273
+ # :before or :after
274
+ #
275
+ # type = :before, :replace, :after
276
+ #
277
+ # Example:
278
+ #
279
+ # NewRelic::Agent.set_sql_obfuscator(:replace) do |sql|
280
+ # my_obfuscator(sql)
281
+ # end
282
+ #
283
+ def set_sql_obfuscator(type = :replace, &block)
284
+ NewRelic::Agent::Database.set_sql_obfuscator(type, &block)
285
+ end
286
+
287
+
288
+ # This method sets the state of sql recording in the transaction
289
+ # sampler feature. Within the given block, no sql will be recorded
290
+ #
291
+ # usage:
292
+ #
293
+ # NewRelic::Agent.disable_sql_recording do
294
+ # ...
295
+ # end
296
+ #
297
+ def disable_sql_recording
298
+ state = agent.set_record_sql(false)
299
+ begin
300
+ yield
301
+ ensure
302
+ agent.set_record_sql(state)
303
+ end
304
+ end
305
+
306
+ # This method disables the recording of transaction traces in the given
307
+ # block. See also #disable_all_tracing
308
+ def disable_transaction_tracing
309
+ state = agent.set_record_tt(false)
310
+ begin
311
+ yield
312
+ ensure
313
+ agent.set_record_tt(state)
314
+ end
315
+ end
316
+
317
+ # Cancel the collection of the current transaction in progress, if
318
+ # any. Only affects the transaction started on this thread once
319
+ # it has started and before it has completed.
320
+ def abort_transaction!
321
+ NewRelic::Agent::Instrumentation::MetricFrame.abort_transaction!
322
+ end
323
+
324
+ # Yield to the block without collecting any metrics or traces in
325
+ # any of the subsequent calls. If executed recursively, will keep
326
+ # track of the first entry point and turn on tracing again after
327
+ # leaving that block. This uses the thread local
328
+ # +newrelic_untrace+
329
+ def disable_all_tracing
330
+ agent.push_trace_execution_flag(false)
331
+ yield
332
+ ensure
333
+ agent.pop_trace_execution_flag
334
+ end
335
+
336
+ # Check to see if we are capturing metrics currently on this thread.
337
+ def is_execution_traced?
338
+ Thread.current[:newrelic_untraced].nil? || Thread.current[:newrelic_untraced].last != false
339
+ end
340
+
341
+ # helper method to check the thread local to determine whether the
342
+ # transaction in progress is traced or not
343
+ def is_transaction_traced?
344
+ Thread::current[:record_tt] != false
345
+ end
346
+
347
+ # helper method to check the thread local to determine whether sql
348
+ # is being recorded or not
349
+ def is_sql_recorded?
350
+ Thread::current[:record_sql] != false
351
+ end
352
+
353
+ # Set a filter to be applied to errors that the Ruby Agent will
354
+ # track. The block should evalute to the exception to track
355
+ # (which could be different from the original exception) or nil to
356
+ # ignore this exception.
357
+ #
358
+ # The block is yielded to with the exception to filter.
359
+ #
360
+ # Return the new block or the existing filter Proc if no block is passed.
361
+ #
362
+ def ignore_error_filter(&block)
363
+ agent.error_collector.ignore_error_filter(&block)
364
+ end
365
+
366
+ # Record the given error. It will be passed through the
367
+ # #ignore_error_filter if there is one.
368
+ #
369
+ # * <tt>exception</tt> is the exception which will be recorded. May also be
370
+ # an error message.
371
+ # Options:
372
+ # * <tt>:uri</tt> => The request path, minus any request params or query string.
373
+ # * <tt>:referer</tt> => The URI of the referer
374
+ # * <tt>:metric</tt> => The metric name associated with the transaction
375
+ # * <tt>:request_params</tt> => Request parameters, already filtered if necessary
376
+ # * <tt>:custom_params</tt> => Custom parameters
377
+ #
378
+ # Anything left over is treated as custom params.
379
+ #
380
+ def notice_error(exception, options={})
381
+ NewRelic::Agent::Instrumentation::MetricFrame.notice_error(exception, options)
382
+ end
383
+
384
+ # Add parameters to the current transaction trace (and traced error if any)
385
+ # on the call stack.
386
+ #
387
+ def add_custom_parameters(params)
388
+ NewRelic::Agent::Instrumentation::MetricFrame.add_custom_parameters(params)
389
+ end
390
+
391
+ # The #add_request_parameters method is aliased to #add_custom_parameters
392
+ # and is now deprecated.
393
+ alias add_request_parameters add_custom_parameters #:nodoc:
394
+
395
+ # Yield to a block that is run with a database metric name
396
+ # context. This means the Database instrumentation will use this
397
+ # for the metric name if it does not otherwise know about a model.
398
+ # This is re-entrant.
399
+ #
400
+ # * <tt>model</tt> is the DB model class
401
+ # * <tt>method</tt> is the name of the finder method or other
402
+ # method to identify the operation with.
403
+ def with_database_metric_name(model, method, &block)
404
+ if frame = NewRelic::Agent::Instrumentation::MetricFrame.current
405
+ frame.with_database_metric_name(model, method, &block)
406
+ else
407
+ yield
408
+ end
409
+ end
410
+
411
+ # Record a web transaction from an external source. This will
412
+ # process the response time, error, and score an apdex value.
413
+ #
414
+ # First argument is a float value, time in seconds. Option
415
+ # keys are strings.
416
+ #
417
+ # == Identifying the transaction
418
+ # * <tt>'uri' => uri</tt> to record the value for a given web request.
419
+ # If not provided, just record the aggregate dispatcher and apdex scores.
420
+ # * <tt>'metric' => metric_name</tt> to record with a general metric name
421
+ # like +OtherTransaction/Background/Class/method+. Ignored if +uri+ is
422
+ # provided.
423
+ #
424
+ # == Error options
425
+ # Provide one of the following:
426
+ # * <tt>'is_error' => true</tt> if an unknown error occurred
427
+ # * <tt>'error_message' => msg</tt> if an error message is available
428
+ # * <tt>'exception' => exception</tt> if a ruby exception is recorded
429
+ #
430
+ # == Misc options
431
+ # Additional information captured in errors
432
+ # * <tt>'referer' => referer_url</tt>
433
+ # * <tt>'request_params' => hash</tt> to record a set of name/value pairs as the
434
+ # request parameters.
435
+ # * <tt>'custom_params' => hash</tt> to record extra information in traced errors
436
+ #
437
+ def record_transaction(response_sec, options = {})
438
+ agent.record_transaction(response_sec, options)
439
+ end
440
+
441
+ # Returns a Javascript string which should be injected into the very top of the response body
442
+ #
443
+ def browser_timing_header
444
+ agent.browser_timing_header
445
+ end
446
+
447
+ # Returns a Javascript string which should be injected into the very bottom of the response body
448
+ #
449
+ def browser_timing_footer
450
+ agent.browser_timing_footer
451
+ end
452
+
453
+ end
454
+ end
@@ -0,0 +1,75 @@
1
+ require 'new_relic/control'
2
+
3
+ module NewRelic
4
+ module CollectionHelper
5
+ DEFAULT_TRUNCATION_SIZE=16 * 1024
6
+ DEFAULT_ARRAY_TRUNCATION_SIZE=128
7
+ # Transform parameter hash into a hash whose values are strictly
8
+ # strings
9
+ def normalize_params(params)
10
+ case params
11
+ when Symbol, FalseClass, TrueClass, nil
12
+ params
13
+ when Numeric
14
+ truncate(params.to_s)
15
+ when String
16
+ truncate(params)
17
+ when Hash
18
+ new_params = {}
19
+ params.each do | key, value |
20
+ new_params[truncate(normalize_params(key),64)] = normalize_params(value)
21
+ end
22
+ new_params
23
+ when Array
24
+ params.first(DEFAULT_ARRAY_TRUNCATION_SIZE).map{|item| normalize_params(item)}
25
+ else
26
+ truncate(flatten(params))
27
+ end
28
+ end
29
+
30
+ # Return an array of strings (backtrace), cleaned up for readability
31
+ # Return nil if there is no backtrace
32
+
33
+ def strip_nr_from_backtrace(backtrace)
34
+ if backtrace && !NewRelic::Control.instance.disable_backtrace_cleanup?
35
+ # this is for 1.9.1, where strings no longer have Enumerable
36
+ backtrace = backtrace.split("\n") if String === backtrace
37
+ backtrace = backtrace.map &:to_s
38
+ backtrace = backtrace.reject do |line|
39
+ line.include?(NewRelic::Control.newrelic_root) or
40
+ line =~ /^newrelic_rpm\s/
41
+ end
42
+ # rename methods back to their original state
43
+ backtrace = backtrace.collect {|line| line.gsub(/_without_(newrelic|trace)/, "")}
44
+ end
45
+ backtrace
46
+ end
47
+
48
+ private
49
+
50
+ # Convert any kind of object to a short string.
51
+ def flatten(object)
52
+ s = case object
53
+ when nil then ''
54
+ when object.instance_of?(String) then object
55
+ when String then String.new(object) # convert string subclasses to strings
56
+ else "#<#{object.class.to_s}>"
57
+ end
58
+ end
59
+ def truncate(string, len=DEFAULT_TRUNCATION_SIZE)
60
+ case string
61
+ when Symbol then string
62
+ when nil then ""
63
+ when String
64
+ real_string = flatten(string)
65
+ if real_string.size > len
66
+ real_string = real_string.slice(0...len)
67
+ real_string << "..."
68
+ end
69
+ real_string
70
+ else
71
+ truncate(flatten(string), len)
72
+ end
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,85 @@
1
+ require 'optparse'
2
+
3
+ # Run the command given by the first argument. Right
4
+ # now all we have is deployments. We hope to have other
5
+ # kinds of events here later.
6
+ $LOAD_PATH << "#{File.dirname(__FILE__)}/.."
7
+ module NewRelic
8
+ class Command
9
+ attr_accessor :leftover
10
+ # Capture a failure to execute the command.
11
+ class CommandFailure < StandardError
12
+ attr_reader :options
13
+ def initialize message, opt_parser=nil
14
+ super message
15
+ @options = opt_parser
16
+ end
17
+ end
18
+
19
+ def info(message)
20
+ STDOUT.puts message
21
+ end
22
+
23
+ def err(message)
24
+ STDERR.puts message
25
+ end
26
+
27
+ def initialize(command_line_args)
28
+ if Hash === command_line_args
29
+ # command line args is an options hash
30
+ command_line_args.each do | key, value |
31
+ instance_variable_set "@#{key}", value.to_s if value
32
+ end
33
+ else
34
+ # parse command line args. Throw an exception on a bad arg.
35
+ @options = options do | opts |
36
+ opts.on("-h", "Show this help") { raise CommandFailure, opts.to_s }
37
+ end
38
+ @leftover = @options.parse(command_line_args)
39
+ end
40
+ rescue OptionParser::ParseError => e
41
+ raise CommandFailure.new e.message, @options
42
+ end
43
+
44
+ @commands = []
45
+ def self.inherited(subclass)
46
+ @commands << subclass
47
+ end
48
+
49
+ cmds = File.expand_path(File.join(File.dirname(__FILE__), 'commands', '*.rb'))
50
+ Dir[cmds].each{|command| require command }
51
+
52
+ def self.run
53
+
54
+ @command_names = @commands.map{ |c| c.command }
55
+
56
+ extra = []
57
+ options = ARGV.options do |opts|
58
+ script_name = File.basename($0)
59
+ if script_name =~ /newrelic_cmd$/
60
+ $stdout.puts "warning: the 'newrelic_cmd' script has been renamed 'newrelic'"
61
+ script_name = 'newrelic'
62
+ end
63
+ opts.banner = "Usage: #{script_name} [ #{ @command_names.join(" | ")} ] [options]"
64
+ opts.separator "use '#{script_name} <command> -h' to see detailed command options"
65
+ opts
66
+ end
67
+ extra = options.order!
68
+ command = extra.shift
69
+ # just make it a little easier on them
70
+ command = 'deployments' if command =~ /deploy/
71
+ if command.nil?
72
+ STDERR.puts options
73
+ elsif !@command_names.include?(command)
74
+ STDERR.puts "Unrecognized command: #{command}"
75
+ STDERR.puts options
76
+ else
77
+ command_class = @commands.find{ |c| c.command == command}
78
+ command_class.new(extra).run
79
+ end
80
+ rescue OptionParser::InvalidOption => e
81
+ raise NewRelic::Command::CommandFailure, e.message
82
+ end
83
+ end
84
+
85
+ end