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,98 @@
1
+ require 'new_relic/agent/instrumentation/controller_instrumentation'
2
+
3
+ module NewRelic
4
+ module Agent
5
+ module Instrumentation
6
+ # == Instrumentation for Rack
7
+ #
8
+ # New Relic will instrument a #call method as if it were a controller
9
+ # action, collecting transaction traces and errors. The middleware will
10
+ # be identified only by it's class, so if you want to instrument multiple
11
+ # actions in a middleware, you need to use
12
+ # NewRelic::Agent::Instrumentation::ControllerInstrumentation::ClassMethods#add_transaction_tracer
13
+ #
14
+ # Example:
15
+ # require 'newrelic_rpm'
16
+ # require 'new_relic/agent/instrumentation/rack'
17
+ # class Middleware
18
+ # def call(env)
19
+ # ...
20
+ # end
21
+ # # Do the include after the call method is defined:
22
+ # include NewRelic::Agent::Instrumentation::Rack
23
+ # end
24
+ #
25
+ # == Instrumenting Metal and Cascading Middlewares
26
+ #
27
+ # Metal apps and apps belonging to Rack::Cascade middleware
28
+ # follow a convention of returning a 404 for all requests except
29
+ # the ones they are set up to handle. This means that New Relic
30
+ # needs to ignore these calls when they return a 404.
31
+ #
32
+ # In these cases, you should not include or extend the Rack
33
+ # module but instead include
34
+ # NewRelic::Agent::Instrumentation::ControllerInstrumentation.
35
+ # Here's how that might look for a Metal app:
36
+ #
37
+ # require 'new_relic/agent/instrumentation/controller_instrumentation'
38
+ # class MetalApp
39
+ # extend NewRelic::Agent::Instrumentation::ControllerInstrumentation
40
+ # def self.call(env)
41
+ # if should_do_my_thing?
42
+ # perform_action_with_newrelic_trace(:category => :rack) do
43
+ # return my_response(env)
44
+ # end
45
+ # else
46
+ # return [404, {"Content-Type" => "text/html"}, ["Not Found"]]
47
+ # end
48
+ # end
49
+ # end
50
+ #
51
+ # == Overriding the metric name
52
+ #
53
+ # By default the middleware is identified only by its class, but if you want to
54
+ # be more specific and pass in name, then omit including the Rack instrumentation
55
+ # and instead follow this example:
56
+ #
57
+ # require 'newrelic_rpm'
58
+ # require 'new_relic/agent/instrumentation/controller_instrumentation'
59
+ # class Middleware
60
+ # include NewRelic::Agent::Instrumentation::ControllerInstrumentation
61
+ # def call(env)
62
+ # ...
63
+ # end
64
+ # add_transaction_tracer :call, :category => :rack, :name => 'my app'
65
+ # end
66
+ #
67
+ module Rack
68
+ def newrelic_request_headers
69
+ @newrelic_request.env
70
+ end
71
+ def call_with_newrelic(*args)
72
+ @newrelic_request = ::Rack::Request.new(args.first)
73
+ perform_action_with_newrelic_trace(:category => :rack, :request => @newrelic_request) do
74
+ result = call_without_newrelic(*args)
75
+ # Ignore cascaded calls
76
+ MetricFrame.abort_transaction! if result.first == 404
77
+ result
78
+ end
79
+ end
80
+ def self.included middleware #:nodoc:
81
+ middleware.class_eval do
82
+ alias call_without_newrelic call
83
+ alias call call_with_newrelic
84
+ end
85
+ end
86
+ include ControllerInstrumentation
87
+ def self.extended middleware #:nodoc:
88
+ middleware.class_eval do
89
+ class << self
90
+ alias call_without_newrelic call
91
+ alias call call_with_newrelic
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,114 @@
1
+ DependencyDetection.defer do
2
+ @name = :rails21_view
3
+
4
+ depends_on do
5
+ !NewRelic::Control.instance['disable_view_instrumentation'] &&
6
+ defined?(ActionController) && defined?(ActionController::Base) && defined?(ActionView::PartialTemplate) && defined?(ActionView::Template) &&
7
+ defined?(Rails::VERSION::STRING) && Rails::VERSION::STRING =~ /^2\.1\./ # Rails 2.1 &&
8
+ end
9
+
10
+ executes do
11
+ NewRelic::Agent.logger.debug 'Installing Rails 2.1 View instrumentation'
12
+ end
13
+
14
+ executes do
15
+ ActionView::PartialTemplate.class_eval do
16
+ add_method_tracer :render, 'View/#{path_without_extension[%r{^(/.*/)?(.*)$},2]}.#{@view.template_format}.#{extension}/Partial'
17
+ end
18
+ # this is for template rendering, as opposed to partial rendering.
19
+ ActionView::Template.class_eval do
20
+ add_method_tracer :render, 'View/#{(path_without_extension || @view.controller.newrelic_metric_path)[%r{^(/.*/)?(.*)$},2]}.#{@view.template_format}.#{extension}/Rendering'
21
+ end
22
+ end
23
+ end
24
+
25
+ DependencyDetection.defer do
26
+ @name = :old_rails_view
27
+
28
+ depends_on do
29
+ !NewRelic::Control.instance['disable_view_instrumentation'] &&
30
+ defined?(ActionController) && defined?(ActionController::Base) &&
31
+ defined?(Rails::VERSION::STRING) && Rails::VERSION::STRING =~ /^(1\.|2\.0)/ # Rails 1.* - 2.0
32
+ end
33
+
34
+ executes do
35
+ NewRelic::Agent.logger.debug 'Installing Rails 1.* - 2.0 View instrumentation'
36
+ end
37
+
38
+ executes do
39
+ ActionController::Base.class_eval do
40
+ add_method_tracer :render, 'View/#{newrelic_metric_path}/Rendering'
41
+ end
42
+
43
+ end
44
+ end
45
+
46
+ DependencyDetection.defer do
47
+ @name = :rails23_view
48
+
49
+ depends_on do
50
+ !NewRelic::Control.instance['disable_view_instrumentation'] &&
51
+ defined?(ActionView) && defined?(ActionView::Template) && defined?(ActionView::RenderablePartial) &&
52
+ defined?(Rails::VERSION::STRING) && Rails::VERSION::STRING =~ /^2\.[23]/
53
+ end
54
+
55
+ executes do
56
+ NewRelic::Agent.logger.debug 'Installing Rails 2.2 - 2.3 View instrumentation'
57
+ end
58
+
59
+ executes do
60
+ ActionView::RenderablePartial.module_eval do
61
+ add_method_tracer :render_partial, 'View/#{path[%r{^(/.*/)?(.*)$},2]}/Partial'
62
+ end
63
+ ActionView::Template.class_eval do
64
+ add_method_tracer :render, 'View/#{path[%r{^(/.*/)?(.*)$},2]}/Rendering'
65
+ end
66
+ end
67
+ end
68
+
69
+ DependencyDetection.defer do
70
+ @name = :rails2_controller
71
+
72
+ depends_on do
73
+ defined?(ActionController) && defined?(ActionController::Base)
74
+ end
75
+
76
+ depends_on do
77
+ defined?(Rails) && Rails::VERSION::MAJOR.to_i == 2
78
+ end
79
+
80
+ executes do
81
+ NewRelic::Agent.logger.debug 'Installing Rails 2 Controller instrumentation'
82
+ end
83
+
84
+ executes do
85
+ ActionController::Base.class_eval do
86
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
87
+
88
+ # Compare with #alias_method_chain, which is not available in
89
+ # Rails 1.1:
90
+ alias_method :perform_action_without_newrelic_trace, :perform_action
91
+ alias_method :perform_action, :perform_action_with_newrelic_trace
92
+ private :perform_action
93
+
94
+ def self.newrelic_write_attr(attr_name, value) # :nodoc:
95
+ write_inheritable_attribute(attr_name, value)
96
+ end
97
+
98
+ def self.newrelic_read_attr(attr_name) # :nodoc:
99
+ read_inheritable_attribute(attr_name)
100
+ end
101
+
102
+ # determine the path that is used in the metric name for
103
+ # the called controller action
104
+ def newrelic_metric_path(action_name_override = nil)
105
+ action_part = action_name_override || action_name
106
+ if action_name_override || self.class.action_methods.include?(action_part)
107
+ "#{self.class.controller_path}/#{action_part}"
108
+ else
109
+ "#{self.class.controller_path}/(other)"
110
+ end
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,42 @@
1
+ DependencyDetection.defer do
2
+ @name = :rails_action_web_service
3
+
4
+ depends_on do
5
+ defined?(ActionWebService)
6
+ end
7
+
8
+ executes do
9
+ NewRelic::Agent.logger.debug 'Installing Rails ActionWebService instrumentation'
10
+ end
11
+
12
+ executes do
13
+ # NewRelic Agent instrumentation for WebServices
14
+
15
+ # Note Action Web Service is removed from default package in rails
16
+ # 2.0, this is purely here as a service to our legacy customers.
17
+
18
+ # instrumentation for Web Service martialing - XML RPC
19
+ ActionWebService::Protocol::XmlRpc::XmlRpcProtocol.class_eval do
20
+ add_method_tracer :decode_request, "WebService/Xml Rpc/XML Decode"
21
+ add_method_tracer :encode_request, "WebService/Xml Rpc/XML Encode"
22
+ add_method_tracer :decode_response, "WebService/Xml Rpc/XML Decode"
23
+ add_method_tracer :encode_response, "WebService/Xml Rpc/XML Encode"
24
+ end
25
+
26
+ # instrumentation for Web Service martialing - Soap
27
+ ActionWebService::Protocol::Soap::SoapProtocol.class_eval do
28
+ add_method_tracer :decode_request, "WebService/Soap/XML Decode"
29
+ add_method_tracer :encode_request, "WebService/Soap/XML Encode"
30
+ add_method_tracer :decode_response, "WebService/Soap/XML Decode"
31
+ add_method_tracer :encode_response, "WebService/Soap/XML Encode"
32
+ end
33
+
34
+ if defined?(ActionController) && defined?(ActionController::Base)
35
+ ActionController::Base.class_eval do
36
+ if method_defined? :perform_invocation
37
+ add_method_tracer :perform_invocation, 'WebService/#{controller_name}/#{args.first}'
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,115 @@
1
+ module NewRelic
2
+ module Agent
3
+ module Instrumentation
4
+ module ActiveRecordInstrumentation
5
+
6
+ def self.included(instrumented_class)
7
+ instrumented_class.class_eval do
8
+ alias_method :log_without_newrelic_instrumentation, :log
9
+ alias_method :log, :log_with_newrelic_instrumentation
10
+ protected :log
11
+ end
12
+ end
13
+
14
+ def log_with_newrelic_instrumentation(sql, name, &block)
15
+
16
+ return log_without_newrelic_instrumentation(sql, name, &block) unless NewRelic::Agent.is_execution_traced?
17
+
18
+ # Capture db config if we are going to try to get the explain plans
19
+ if (defined?(ActiveRecord::ConnectionAdapters::MysqlAdapter) && self.is_a?(ActiveRecord::ConnectionAdapters::MysqlAdapter)) ||
20
+ (defined?(ActiveRecord::ConnectionAdapters::Mysql2Adapter) && self.is_a?(ActiveRecord::ConnectionAdapters::Mysql2Adapter)) ||
21
+ (defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) && self.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter))
22
+ supported_config = @config
23
+ end
24
+ if name && (parts = name.split " ") && parts.size == 2
25
+ model = parts.first
26
+ operation = parts.last.downcase
27
+ metric_name = case operation
28
+ when 'load' then 'find'
29
+ when 'indexes', 'columns' then nil # fall back to DirectSQL
30
+ when 'destroy', 'find', 'save', 'create' then operation
31
+ when 'update' then 'save'
32
+ else
33
+ if model == 'Join'
34
+ operation
35
+ end
36
+ end
37
+ metric = "ActiveRecord/#{model}/#{metric_name}" if metric_name
38
+ end
39
+
40
+ if metric.nil?
41
+ metric = NewRelic::Agent::Instrumentation::MetricFrame.database_metric_name
42
+ if metric.nil?
43
+ if sql =~ /^(select|update|insert|delete|show)/i
44
+ # Could not determine the model/operation so let's find a better
45
+ # metric. If it doesn't match the regex, it's probably a show
46
+ # command or some DDL which we'll ignore.
47
+ metric = "Database/SQL/#{$1.downcase}"
48
+ else
49
+ metric = "Database/SQL/other"
50
+ end
51
+ end
52
+ end
53
+
54
+ if !metric
55
+ log_without_newrelic_instrumentation(sql, name, &block)
56
+ else
57
+ metrics = [metric, "ActiveRecord/all"]
58
+ metrics << "ActiveRecord/#{metric_name}" if metric_name
59
+ self.class.trace_execution_scoped(metrics) do
60
+ t0 = Time.now
61
+ begin
62
+ log_without_newrelic_instrumentation(sql, name, &block)
63
+ ensure
64
+ NewRelic::Agent.instance.transaction_sampler.notice_sql(sql, supported_config, (Time.now - t0).to_f)
65
+ NewRelic::Agent.instance.sql_sampler.notice_sql(sql, metric, supported_config, (Time.now - t0).to_f)
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ DependencyDetection.defer do
77
+ @name = :rails2_active_record
78
+
79
+ depends_on do
80
+ defined?(ActiveRecord) && defined?(ActiveRecord::Base)
81
+ end
82
+
83
+ depends_on do
84
+ defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i == 2
85
+ end
86
+
87
+ depends_on do
88
+ !NewRelic::Control.instance['skip_ar_instrumentation']
89
+ end
90
+
91
+ depends_on do
92
+ !NewRelic::Control.instance['disable_activerecord_instrumentation']
93
+ end
94
+
95
+ executes do
96
+ NewRelic::Agent.logger.debug 'Installing Rails 2 ActiveRecord instrumentation'
97
+ end
98
+
99
+ executes do
100
+ ActiveRecord::ConnectionAdapters::AbstractAdapter.module_eval do
101
+ include ::NewRelic::Agent::Instrumentation::ActiveRecordInstrumentation
102
+ end
103
+ end
104
+
105
+ executes do
106
+ ActiveRecord::Base.class_eval do
107
+ class << self
108
+ add_method_tracer :find_by_sql, 'ActiveRecord/#{self.name}/find_by_sql', :metric => false
109
+ add_method_tracer :transaction, 'ActiveRecord/#{self.name}/transaction', :metric => false
110
+ end
111
+ end
112
+ end
113
+ end
114
+
115
+ DependencyDetection.detect!
@@ -0,0 +1,42 @@
1
+ DependencyDetection.defer do
2
+ @name = :rails2_error
3
+
4
+ depends_on do
5
+ defined?(ActionController) && defined?(ActionController::Base)
6
+ end
7
+
8
+ depends_on do
9
+ defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i == 2
10
+ end
11
+
12
+ executes do
13
+ NewRelic::Agent.logger.debug 'Installing Rails 2 Error instrumentation'
14
+ end
15
+
16
+ executes do
17
+
18
+ ActionController::Base.class_eval do
19
+
20
+ # Make a note of an exception associated with the currently executing
21
+ # controller action. Note that this used to be available on Object
22
+ # but we replaced that global method with NewRelic::Agent#notice_error.
23
+ # Use that one outside of controller actions.
24
+ def newrelic_notice_error(exception, custom_params = {})
25
+ NewRelic::Agent::Instrumentation::MetricFrame.notice_error exception, :custom_params => custom_params, :request => request
26
+ end
27
+
28
+ def rescue_action_with_newrelic_trace(exception)
29
+ rescue_action_without_newrelic_trace exception
30
+ NewRelic::Agent::Instrumentation::MetricFrame.notice_error exception, :request => request
31
+ end
32
+
33
+ # Compare with #alias_method_chain, which is not available in
34
+ # Rails 1.1:
35
+ alias_method :rescue_action_without_newrelic_trace, :rescue_action
36
+ alias_method :rescue_action, :rescue_action_with_newrelic_trace
37
+ protected :rescue_action
38
+
39
+ end
40
+ end
41
+ end
42
+
@@ -0,0 +1,118 @@
1
+ module NewRelic
2
+ module Agent
3
+ module Instrumentation
4
+ module Rails3
5
+ module ActionController
6
+ def self.newrelic_write_attr(attr_name, value) # :nodoc:
7
+ write_inheritable_attribute(attr_name, value)
8
+ end
9
+
10
+ def self.newrelic_read_attr(attr_name) # :nodoc:
11
+ read_inheritable_attribute(attr_name)
12
+ end
13
+
14
+ # determine the path that is used in the metric name for
15
+ # the called controller action
16
+ def newrelic_metric_path(action_name_override = nil)
17
+ action_part = action_name_override || action_name
18
+ if action_name_override || self.class.action_methods.include?(action_part)
19
+ "#{self.class.controller_path}/#{action_part}"
20
+ else
21
+ "#{self.class.controller_path}/(other)"
22
+ end
23
+ end
24
+
25
+ def process_action(*args)
26
+ # skip instrumentation if we are in an ignored action
27
+ if _is_filtered?('do_not_trace')
28
+ NewRelic::Agent.disable_all_tracing do
29
+ return super
30
+ end
31
+ end
32
+
33
+ perform_action_with_newrelic_trace(:category => :controller, :name => self.action_name, :path => newrelic_metric_path, :params => request.filtered_parameters, :class_name => self.class.name) do
34
+ super
35
+ end
36
+ end
37
+
38
+ end
39
+
40
+ module ActionView
41
+ def _render_template(template, layout = nil, options = {}) #:nodoc:
42
+ NewRelic::Agent.trace_execution_scoped "View/#{template.virtual_path}/Rendering" do
43
+ super
44
+ end
45
+ end
46
+
47
+ module PartialRenderer
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ DependencyDetection.defer do
56
+ @name = :rails3_controller
57
+
58
+ depends_on do
59
+ defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i == 3
60
+ end
61
+
62
+ depends_on do
63
+ defined?(ActionController) && defined?(ActionController::Base)
64
+ end
65
+
66
+ executes do
67
+ NewRelic::Agent.logger.debug 'Installing Rails 3 Controller instrumentation'
68
+ end
69
+
70
+ executes do
71
+ class ActionController::Base
72
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
73
+ include NewRelic::Agent::Instrumentation::Rails3::ActionController
74
+ end
75
+ end
76
+ end
77
+
78
+ DependencyDetection.defer do
79
+ @name = :rails3_view
80
+
81
+ depends_on do
82
+ defined?(ActionView) && defined?(ActionView::Base) && defined?(ActionView::Partials)
83
+ end
84
+
85
+ depends_on do
86
+ defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i == 3 && ::Rails::VERSION::MINOR.to_i >= 1
87
+ end
88
+
89
+ depends_on do
90
+ !NewRelic::Control.instance['disable_view_instrumentation']
91
+ end
92
+
93
+ executes do
94
+ NewRelic::Agent.logger.debug 'Installing Rails 3 view instrumentation'
95
+ end
96
+
97
+ executes do
98
+ class ActionView::Base
99
+ include NewRelic::Agent::Instrumentation::Rails3::ActionView
100
+ end
101
+ old_klass = ActionView::Partials::PartialRenderer
102
+ ActionView::Partials::PartialRenderer = Class.new(old_klass)
103
+ class ActionView::Partials::PartialRenderer
104
+ def render_partial(*args)
105
+ NewRelic::Agent.trace_execution_scoped "View/#{@template.virtual_path}/Partial" do
106
+ super
107
+ end
108
+ end
109
+
110
+ def render_collection(*args)
111
+ name = @template ? @template.virtual_path : "Mixed"
112
+ NewRelic::Agent.trace_execution_scoped "View/#{name}/Collection" do
113
+ super
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
@@ -0,0 +1,122 @@
1
+ module NewRelic
2
+ module Agent
3
+ module Instrumentation
4
+ module ActiveRecordInstrumentation
5
+
6
+ def self.included(instrumented_class)
7
+ instrumented_class.class_eval do
8
+ unless instrumented_class.method_defined?(:log_without_newrelic_instrumentation)
9
+ alias_method :log_without_newrelic_instrumentation, :log
10
+ alias_method :log, :log_with_newrelic_instrumentation
11
+ protected :log
12
+ end
13
+ end
14
+ end
15
+
16
+ def log_with_newrelic_instrumentation(*args, &block)
17
+
18
+ return log_without_newrelic_instrumentation(*args, &block) unless NewRelic::Agent.is_execution_traced?
19
+
20
+ sql, name, binds = args
21
+
22
+ # Capture db config if we are going to try to get the explain plans
23
+ if (defined?(ActiveRecord::ConnectionAdapters::MysqlAdapter) && self.is_a?(ActiveRecord::ConnectionAdapters::MysqlAdapter)) ||
24
+ (defined?(ActiveRecord::ConnectionAdapters::Mysql2Adapter) && self.is_a?(ActiveRecord::ConnectionAdapters::Mysql2Adapter)) ||
25
+ (defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) && self.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter))
26
+ supported_config = @config
27
+ end
28
+ if name && (parts = name.split " ") && parts.size == 2
29
+ model = parts.first
30
+ operation = parts.last.downcase
31
+ metric_name = case operation
32
+ when 'load', 'count', 'exists' then 'find'
33
+ when 'indexes', 'columns' then nil # fall back to DirectSQL
34
+ when 'destroy', 'find', 'save', 'create' then operation
35
+ when 'update' then 'save'
36
+ else
37
+ if model == 'Join'
38
+ operation
39
+ end
40
+ end
41
+ metric = "ActiveRecord/#{model}/#{metric_name}" if metric_name
42
+ end
43
+
44
+ if metric.nil?
45
+ metric = NewRelic::Agent::Instrumentation::MetricFrame.database_metric_name
46
+ if metric.nil?
47
+ if sql =~ /^(select|update|insert|delete|show)/i
48
+ # Could not determine the model/operation so let's find a better
49
+ # metric. If it doesn't match the regex, it's probably a show
50
+ # command or some DDL which we'll ignore.
51
+ metric = "Database/SQL/#{$1.downcase}"
52
+ else
53
+ metric = "Database/SQL/other"
54
+ end
55
+ end
56
+ end
57
+
58
+ if !metric
59
+ log_without_newrelic_instrumentation(*args, &block)
60
+ else
61
+ metrics = [metric, "ActiveRecord/all"]
62
+ metrics << "ActiveRecord/#{metric_name}" if metric_name
63
+ self.class.trace_execution_scoped(metrics) do
64
+ sql, name, binds = args
65
+ t0 = Time.now
66
+ begin
67
+ log_without_newrelic_instrumentation(*args, &block)
68
+ ensure
69
+ NewRelic::Agent.instance.transaction_sampler.notice_sql(sql, supported_config, (Time.now - t0).to_f)
70
+ NewRelic::Agent.instance.sql_sampler.notice_sql(sql, metric, supported_config, (Time.now - t0).to_f)
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ DependencyDetection.defer do
82
+ @name = :rails3_active_record
83
+
84
+ depends_on do
85
+ defined?(ActiveRecord) && defined?(ActiveRecord::Base)
86
+ end
87
+
88
+ depends_on do
89
+ defined?(::Rails) && ::Rails::VERSION::MAJOR.to_i == 3
90
+ end
91
+
92
+ depends_on do
93
+ !NewRelic::Control.instance['skip_ar_instrumentation']
94
+ end
95
+
96
+ depends_on do
97
+ !NewRelic::Control.instance['disable_activerecord_instrumentation']
98
+ end
99
+
100
+ executes do
101
+ NewRelic::Agent.logger.debug 'Installing Rails 3 ActiveRecord instrumentation'
102
+ end
103
+
104
+ executes do
105
+ Rails.configuration.after_initialize do
106
+ ActiveRecord::ConnectionAdapters::AbstractAdapter.module_eval do
107
+ include ::NewRelic::Agent::Instrumentation::ActiveRecordInstrumentation
108
+ end
109
+ end
110
+ end
111
+
112
+ executes do
113
+ Rails.configuration.after_initialize do
114
+ ActiveRecord::Base.class_eval do
115
+ class << self
116
+ add_method_tracer :find_by_sql, 'ActiveRecord/#{self.name}/find_by_sql', :metric => false
117
+ add_method_tracer :transaction, 'ActiveRecord/#{self.name}/transaction', :metric => false
118
+ end
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,37 @@
1
+ module NewRelic
2
+ module Agent
3
+ module Instrumentation
4
+ module Rails3
5
+ module Errors
6
+ def newrelic_notice_error(exception, custom_params = {})
7
+ filtered_params = (respond_to? :filter_parameters) ? filter_parameters(params) : params
8
+ filtered_params.merge!(custom_params)
9
+ NewRelic::Agent.agent.error_collector.notice_error(exception, request, newrelic_metric_path, filtered_params)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
16
+
17
+ DependencyDetection.defer do
18
+ @name = :rails3_error
19
+
20
+ depends_on do
21
+ defined?(::Rails) && ::Rails.respond_to?(:version) && ::Rails.version.to_i == 3
22
+ end
23
+
24
+ depends_on do
25
+ defined?(ActionController) && defined?(ActionController::Base)
26
+ end
27
+
28
+ executes do
29
+ NewRelic::Agent.logger.debug 'Installing Rails3 Error instrumentation'
30
+ end
31
+
32
+ executes do
33
+ class ActionController::Base
34
+ include NewRelic::Agent::Instrumentation::Rails3::Errors
35
+ end
36
+ end
37
+ end