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,268 @@
1
+ require 'rack'
2
+ require 'rack/request'
3
+ require 'rack/response'
4
+ require 'rack/file'
5
+ require 'new_relic/metric_parser/metric_parser'
6
+ require 'new_relic/collection_helper'
7
+
8
+ module NewRelic
9
+ module Rack
10
+ class DeveloperMode
11
+
12
+ VIEW_PATH = File.expand_path('../../../../ui/views/', __FILE__)
13
+ HELPER_PATH = File.expand_path('../../../../ui/helpers/', __FILE__)
14
+ require File.join(HELPER_PATH, 'developer_mode_helper.rb')
15
+
16
+
17
+ include NewRelic::DeveloperModeHelper
18
+
19
+ def initialize(app)
20
+ @app = app
21
+ end
22
+
23
+ def call(env)
24
+ return @app.call(env) unless /^\/newrelic/ =~ ::Rack::Request.new(env).path_info
25
+ dup._call(env)
26
+ end
27
+
28
+ protected
29
+
30
+ def _call(env)
31
+ @req = ::Rack::Request.new(env)
32
+ @rendered = false
33
+ case @req.path_info
34
+ when /profile/
35
+ profile
36
+ when /file/
37
+ ::Rack::File.new(VIEW_PATH).call(env)
38
+ when /index/
39
+ index
40
+ when /threads/
41
+ threads
42
+ when /reset/
43
+ reset
44
+ when /show_sample_detail/
45
+ show_sample_data
46
+ when /show_sample_summary/
47
+ show_sample_data
48
+ when /show_sample_sql/
49
+ show_sample_data
50
+ when /explain_sql/
51
+ explain_sql
52
+ when /show_source/
53
+ show_source
54
+ when /^\/newrelic\/?$/
55
+ index
56
+ else
57
+ @app.call(env)
58
+ end
59
+ end
60
+
61
+ private
62
+
63
+ def index
64
+ get_samples
65
+ render(:index)
66
+ end
67
+
68
+ def reset
69
+ NewRelic::Agent.instance.transaction_sampler.reset!
70
+ NewRelic::Agent.instance.sql_sampler.reset!
71
+ ::Rack::Response.new{|r| r.redirect('/newrelic/')}.finish
72
+ end
73
+
74
+ def explain_sql
75
+ get_segment
76
+
77
+ return render(:sample_not_found) unless @sample
78
+
79
+ @sql = @segment[:sql]
80
+ @trace = @segment[:backtrace]
81
+
82
+ if NewRelic::Agent.agent.record_sql == :obfuscated
83
+ @obfuscated_sql = @segment.obfuscated_sql
84
+ end
85
+
86
+ explanations = @segment.explain_sql
87
+ if explanations
88
+ @explanation = explanations.first
89
+ if !@explanation.blank?
90
+ first_row = @explanation.first
91
+ # Show the standard headers if it looks like a mysql explain plan
92
+ # Otherwise show blank headers
93
+ if first_row.length < NewRelic::MYSQL_EXPLAIN_COLUMNS.length
94
+ @row_headers = nil
95
+ else
96
+ @row_headers = NewRelic::MYSQL_EXPLAIN_COLUMNS
97
+ end
98
+ end
99
+ end
100
+ render(:explain_sql)
101
+ end
102
+
103
+ def profile
104
+ NewRelic::Control.instance.profiling = params['start'] == 'true'
105
+ index
106
+ end
107
+
108
+ def threads
109
+ render(:threads)
110
+ end
111
+
112
+ def render(view, layout=true)
113
+ add_rack_array = true
114
+ if view.is_a? Hash
115
+ layout = false
116
+ if view[:object]
117
+ object = view[:object]
118
+ end
119
+
120
+ if view[:collection]
121
+ return view[:collection].map do |object|
122
+ render({:partial => view[:partial], :object => object})
123
+ end.join(' ')
124
+ end
125
+
126
+ if view[:partial]
127
+ add_rack_array = false
128
+ view = "_#{view[:partial]}"
129
+ end
130
+ end
131
+ binding = Proc.new {}.binding
132
+ if layout
133
+ body = render_with_layout(view) do
134
+ render_without_layout(view, binding)
135
+ end
136
+ else
137
+ body = render_without_layout(view, binding)
138
+ end
139
+ if add_rack_array
140
+ ::Rack::Response.new(body).finish
141
+ else
142
+ body
143
+ end
144
+ end
145
+
146
+ # You have to call this with a block - the contents returned from
147
+ # that block are interpolated into the layout
148
+ def render_with_layout(view)
149
+ body = ERB.new(File.read(File.join(VIEW_PATH, 'layouts/newrelic_default.rhtml')))
150
+ body.result(Proc.new {}.binding)
151
+ end
152
+
153
+ # you have to pass a binding to this (a proc) so that ERB can have
154
+ # access to helper functions and local variables
155
+ def render_without_layout(view, binding)
156
+ ERB.new(File.read(File.join(VIEW_PATH, 'newrelic', view.to_s + '.rhtml')), nil, nil, 'frobnitz').result(binding)
157
+ end
158
+
159
+ def content_tag(tag, contents, opts={})
160
+ opt_values = opts.map {|k, v| "#{k}=\"#{v}\"" }.join(' ')
161
+ "<#{tag} #{opt_values}>#{contents}</#{tag}>"
162
+ end
163
+
164
+ def sample
165
+ @sample || @samples[0]
166
+ end
167
+
168
+ def params
169
+ @req.params
170
+ end
171
+
172
+ def segment
173
+ @segment
174
+ end
175
+
176
+
177
+ # show the selected source file with the highlighted selected line
178
+ def show_source
179
+ @filename = params['file']
180
+ line_number = params['line'].to_i
181
+
182
+ if !File.readable?(@filename)
183
+ @source="<p>Unable to read #{@filename}.</p>"
184
+ return
185
+ end
186
+ begin
187
+ file = File.new(@filename, 'r')
188
+ rescue => e
189
+ @source="<p>Unable to access the source file #{@filename} (#{e.message}).</p>"
190
+ return
191
+ end
192
+ @source = ""
193
+
194
+ @source << "<pre>"
195
+ file.each_line do |line|
196
+ # place an anchor 6 lines above the selected line (if the line # < 6)
197
+ if file.lineno == line_number - 6
198
+ @source << "</pre><pre id = 'selected_line'>"
199
+ @source << line.rstrip
200
+ @source << "</pre><pre>"
201
+
202
+ # highlight the selected line
203
+ elsif file.lineno == line_number
204
+ @source << "</pre><pre class = 'selected_source_line'>"
205
+ @source << line.rstrip
206
+ @source << "</pre><pre>"
207
+ else
208
+ @source << line
209
+ end
210
+ end
211
+ render(:show_source)
212
+ end
213
+
214
+ def show_sample_data
215
+ get_sample
216
+
217
+ return render(:sample_not_found) unless @sample
218
+
219
+ @request_params = @sample.params['request_params'] || {}
220
+ @custom_params = @sample.params['custom_params'] || {}
221
+
222
+ controller_metric = @sample.root_segment.called_segments.first.metric_name
223
+
224
+ metric_parser = NewRelic::MetricParser::MetricParser.for_metric_named controller_metric
225
+ @sample_controller_name = metric_parser.controller_name
226
+ @sample_action_name = metric_parser.action_name
227
+
228
+ @sql_segments = @sample.sql_segments
229
+ if params['d']
230
+ @sql_segments.sort!{|a,b| b.duration <=> a.duration }
231
+ end
232
+
233
+ render(:show_sample)
234
+ end
235
+
236
+ def get_samples
237
+ @samples = NewRelic::Agent.instance.transaction_sampler.samples.select do |sample|
238
+ sample.params[:path] != nil
239
+ end
240
+
241
+ return @samples = @samples.sort{|x,y| y.omit_segments_with('(Rails/Application Code Loading)|(Database/.*/.+ Columns)').duration <=>
242
+ x.omit_segments_with('(Rails/Application Code Loading)|(Database/.*/.+ Columns)').duration} if params['h']
243
+ return @samples = @samples.sort{|x,y| x.params[:uri] <=> y.params[:uri]} if params['u']
244
+ @samples = @samples.reverse
245
+ end
246
+
247
+ def get_sample
248
+ get_samples
249
+ id = params['id']
250
+ sample_id = id.to_i
251
+ @samples.each do |s|
252
+ if s.sample_id == sample_id
253
+ @sample = stripped_sample(s)
254
+ return
255
+ end
256
+ end
257
+ end
258
+
259
+ def get_segment
260
+ get_sample
261
+ return unless @sample
262
+
263
+ segment_id = params['segment'].to_i
264
+ @segment = @sample.find_segment(segment_id)
265
+ end
266
+ end
267
+ end
268
+ end
@@ -0,0 +1,73 @@
1
+ # When installed as a plugin this is loaded automatically.
2
+ #
3
+ # When installed as a gem, you need to add
4
+ # require 'new_relic/recipes'
5
+ # to your deploy.rb
6
+ #
7
+ # Defined deploy:notify_rpm which will send information about the deploy to New Relic.
8
+ # The task will run on app servers except where no_release is true.
9
+ # If it fails, it will not affect the task execution or do a rollback.
10
+ #
11
+ make_notify_task = Proc.new do
12
+
13
+ namespace :newrelic do
14
+
15
+ # on all deployments, notify New Relic
16
+ desc "Record a deployment in New Relic (newrelic.com)"
17
+ task :notice_deployment, :roles => :app, :except => {:no_release => true } do
18
+ rails_env = fetch(:newrelic_rails_env, fetch(:rails_env, "production"))
19
+ require File.join(File.dirname(__FILE__), 'command.rb')
20
+ begin
21
+ # allow overrides to be defined for revision, description, changelog and appname
22
+ rev = fetch(:newrelic_revision) if exists?(:newrelic_revision)
23
+ description = fetch(:newrelic_desc) if exists?(:newrelic_desc)
24
+ changelog = fetch(:newrelic_changelog) if exists?(:newrelic_changelog)
25
+ appname = fetch(:newrelic_appname) if exists?(:newrelic_appname)
26
+ if !changelog
27
+ logger.debug "Getting log of changes for New Relic Deployment details"
28
+ from_revision = source.next_revision(current_revision)
29
+ if scm == :git
30
+ log_command = "git log --no-color --pretty=format:' * %an: %s' --abbrev-commit --no-merges #{previous_revision}..#{real_revision}"
31
+ else
32
+ log_command = "#{source.log(from_revision)}"
33
+ end
34
+ changelog = `#{log_command}`
35
+ end
36
+ new_revision = rev || source.query_revision(source.head()) do |cmd|
37
+ logger.debug "executing locally: '#{cmd}'"
38
+ `#{cmd}`
39
+ end
40
+ deploy_options = { :environment => rails_env,
41
+ :revision => new_revision,
42
+ :changelog => changelog,
43
+ :description => description,
44
+ :appname => appname }
45
+ logger.debug "Uploading deployment to New Relic"
46
+ deployment = NewRelic::Command::Deployments.new deploy_options
47
+ deployment.run
48
+ logger.info "Uploaded deployment information to New Relic"
49
+ rescue NewRelic::Command::CommandFailure => e
50
+ logger.info e.message
51
+ rescue Capistrano::CommandError
52
+ logger.info "Unable to notify New Relic of the deployment... skipping"
53
+ rescue Exception => e
54
+ logger.info "Error creating New Relic deployment (#{e})\n#{e.backtrace.join("\n")}"
55
+ end
56
+ # WIP: For rollbacks, let's update the deployment we created with an indication of the failure:
57
+ # on_rollback do
58
+ # run(...)
59
+ # end
60
+ end
61
+ end
62
+ end
63
+ require 'capistrano/version'
64
+ if defined?(Capistrano::Version::MAJOR) && Capistrano::Version::MAJOR < 2
65
+ STDERR.puts "Unable to load #{__FILE__}\nNew Relic Capistrano hooks require at least version 2.0.0"
66
+ else
67
+ instance = Capistrano::Configuration.instance
68
+ if instance
69
+ instance.load &make_notify_task
70
+ else
71
+ make_notify_task.call
72
+ end
73
+ end