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,114 @@
1
+ module NewRelic
2
+ class Control
3
+
4
+ # Structs holding info for the remote server and proxy server
5
+ class Server < Struct.new :name, :port, :ip #:nodoc:
6
+ def to_s; "#{name}:#{port}"; end
7
+ end
8
+
9
+ ProxyServer = Struct.new :name, :port, :user, :password #:nodoc:
10
+
11
+ # Contains methods that deal with connecting to the server
12
+ module ServerMethods
13
+
14
+ def server
15
+ @remote_server ||= server_from_host(nil)
16
+ end
17
+
18
+ # the server we should contact for api requests, like uploading
19
+ # deployments and the like
20
+ def api_server
21
+ api_host = self['api_host'] || 'rpm.newrelic.com'
22
+ @api_server ||=
23
+ NewRelic::Control::Server.new \
24
+ api_host,
25
+ (self['api_port'] || self['port'] || (use_ssl? ? 443 : 80)).to_i,
26
+ nil
27
+ end
28
+
29
+ # a new instances of the proxy server - this passes through if
30
+ # there is no proxy, otherwise it has proxy configuration
31
+ # information pulled from the config file
32
+ def proxy_server
33
+ @proxy_server ||=
34
+ NewRelic::Control::ProxyServer.new self['proxy_host'], self['proxy_port'], self['proxy_user'], self['proxy_pass']
35
+ end
36
+
37
+ # turns a hostname into an ip address and returns a
38
+ # NewRelic::Control::Server that contains the configuration info
39
+ def server_from_host(hostname=nil)
40
+ host = hostname || self['host'] || 'collector.newrelic.com'
41
+
42
+ # if the host is not an IP address, turn it into one
43
+ NewRelic::Control::Server.new host, (self['port'] || (use_ssl? ? 443 : 80)).to_i, convert_to_ip_address(host)
44
+ end
45
+
46
+ # Check to see if we need to look up the IP address
47
+ # If it's an IP address already, we pass it through.
48
+ # If it's nil, or localhost, we don't bother.
49
+ # Otherwise, use `resolve_ip_address` to find one
50
+ def convert_to_ip_address(host)
51
+ # here we leave it as a host name since the cert verification
52
+ # needs it in host form
53
+ return host if verify_certificate?
54
+ return nil if host.nil? || host.downcase == "localhost"
55
+ ip = resolve_ip_address(host)
56
+ log.info "Resolved #{host} to #{ip}"
57
+ ip
58
+ end
59
+
60
+ # Look up the ip address of the host using the pure ruby lookup
61
+ # to prevent blocking. If that fails, fall back to the regular
62
+ # IPSocket library. Return nil if we can't find the host ip
63
+ # address and don't have a good default.
64
+ def resolve_ip_address(host)
65
+ Resolv.getaddress(host)
66
+ rescue Exception => e
67
+ log.warn("DNS Error caching IP address: #{e}")
68
+ log.debug(e.backtrace.join("\n "))
69
+ begin
70
+ log.info("Trying native DNS lookup since Resolv failed")
71
+ IPSocket.getaddress(host)
72
+ rescue Exception => e
73
+ log.error("Could not look up server address: #{e}")
74
+ nil
75
+ end
76
+ end
77
+
78
+ # The path to the certificate file used to verify the SSL
79
+ # connection if verify_peer is enabled
80
+ def cert_file_path
81
+ File.expand_path(File.join(newrelic_root, 'cert', 'cacert.pem'))
82
+ end
83
+
84
+ # Return the Net::HTTP with proxy configuration given the NewRelic::Control::Server object.
85
+ # Default is the collector but for api calls you need to pass api_server
86
+ #
87
+ # Experimental support for SSL verification:
88
+ # swap 'VERIFY_NONE' for 'VERIFY_PEER' line to try it out
89
+ # If verification fails, uncomment the 'http.ca_file' line
90
+ # and it will use the included certificate.
91
+ def http_connection(host = nil)
92
+ host ||= server
93
+ # Proxy returns regular HTTP if @proxy_host is nil (the default)
94
+ http_class = Net::HTTP::Proxy(proxy_server.name, proxy_server.port,
95
+ proxy_server.user, proxy_server.password)
96
+ http = http_class.new(host.ip || host.name, host.port)
97
+ log.debug("Http Connection opened to #{host.ip||host.name}:#{host.port}")
98
+ if use_ssl?
99
+ http.use_ssl = true
100
+ if verify_certificate?
101
+ http.verify_mode = OpenSSL::SSL::VERIFY_PEER
102
+ http.ca_file = cert_file_path
103
+ else
104
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
105
+ end
106
+ end
107
+ http
108
+ end
109
+ end
110
+
111
+ include ServerMethods
112
+ end
113
+ end
114
+
@@ -0,0 +1,46 @@
1
+ require 'yaml'
2
+ require 'conditional_vendored_metric_parser'
3
+ require 'conditional_vendored_dependency_detection'
4
+ require 'new_relic/local_environment'
5
+
6
+ require 'singleton'
7
+ require 'erb'
8
+ require 'socket'
9
+ require 'net/https'
10
+ require 'logger'
11
+ require 'new_relic/control/frameworks'
12
+ require 'new_relic/control/profiling'
13
+ require 'new_relic/control/logging_methods'
14
+ require 'new_relic/control/configuration'
15
+ require 'new_relic/control/server_methods'
16
+ require 'new_relic/control/instrumentation'
17
+ require 'new_relic/control/class_methods'
18
+ require 'new_relic/control/instance_methods'
19
+
20
+ require 'new_relic/agent'
21
+ require 'new_relic/delayed_job_injection'
22
+
23
+
24
+ module NewRelic
25
+
26
+ # The Control is a singleton responsible for the startup and
27
+ # initialization sequence. The initializer uses a LocalEnvironment to
28
+ # detect the framework and instantiates the framework specific
29
+ # subclass.
30
+ #
31
+ # The Control also implements some of the public API for the agent.
32
+ #
33
+ class Control
34
+ # done in a subfile for load order purposes
35
+ # extend ClassMethods
36
+ # include InstanceMethods
37
+ # include Profiling
38
+ # include LoggingMethods
39
+ # include Configuration
40
+ # include ServerMethods
41
+ # include Instrumentation
42
+
43
+
44
+
45
+ end
46
+ end
@@ -0,0 +1,157 @@
1
+ require 'fileutils'
2
+ require 'new_relic/language_support'
3
+
4
+ module NewRelic
5
+ # Handles serialization of data to disk, to save on contacting the
6
+ # server. Lowers both server and client overhead, if the disk is not overloaded
7
+ class DataSerialization
8
+ include NewRelic::LanguageSupport::DataSerialization
9
+
10
+ module ClassMethods
11
+ # Check whether the store is too large, too old, or the
12
+ # pid file is too old. If so, we should send the data
13
+ # right away. If not, we presumably store it for later sending
14
+ # (handled elsewhere)
15
+ def should_send_data?
16
+ NewRelic::Control.instance.disable_serialization? || store_too_large? ||
17
+ store_too_old? || pid_too_old?
18
+ rescue Exception => e
19
+ NewRelic::Control.instance.disable_serialization = true
20
+ NewRelic::Control.instance.log.warn("Disabling serialization: #{e.message}")
21
+ true
22
+ end
23
+
24
+ # A combined locked read/write from the store file - reduces
25
+ # contention by not acquiring the lock and file handle twice
26
+ def read_and_write_to_file
27
+ with_locked_store do |f|
28
+ result = (yield get_data_from_file(f))
29
+ f.rewind
30
+ f.truncate(0)
31
+ write_contents_nonblockingly(f, dump(result)) if result
32
+ end
33
+ rescue Errno::ENOENT => e
34
+ NewRelic::Control.instance.log.warn(e.message)
35
+ end
36
+
37
+ # touches the age file that determines whether we should send
38
+ # data now or not
39
+ def update_last_sent!
40
+ FileUtils.touch(pid_file_path)
41
+ end
42
+
43
+ def pid_too_old?
44
+ create_pid_file unless File.exists?(pid_file_path)
45
+ age = (Time.now.to_i - File.mtime(pid_file_path).to_i)
46
+ NewRelic::Control.instance.log.debug("Pid was #{age} seconds old, sending data") if age > 60
47
+ age > 60
48
+ end
49
+
50
+ def store_too_old?
51
+ FileUtils.touch(file_path) unless File.exists?(file_path)
52
+ age = (Time.now.to_i - File.mtime(file_path).to_i)
53
+ NewRelic::Control.instance.log.debug("Store was #{age} seconds old, sending data") if age > 60
54
+ age > 50
55
+ end
56
+
57
+ def store_too_large?
58
+ FileUtils.touch(file_path) unless File.exists?(file_path)
59
+ size = File.size(file_path) > max_size
60
+ NewRelic::Control.instance.log.debug("Store was oversize, sending data") if size
61
+ size
62
+ end
63
+
64
+ private
65
+
66
+ def open_arguments
67
+ if defined?(Encoding)
68
+ [file_path, File::RDWR | File::CREAT, {:internal_encoding => nil}]
69
+ else
70
+ [file_path, File::RDWR | File::CREAT]
71
+ end
72
+ end
73
+
74
+ def with_locked_store
75
+ File.open(*open_arguments) do |f|
76
+ f.flock(File::LOCK_EX)
77
+ begin
78
+ yield(f)
79
+ ensure
80
+ f.flock(File::LOCK_UN)
81
+ end
82
+ end
83
+ rescue Exception => e
84
+ NewRelic::Control.instance.log.error("Error serializing data to disk: #{e.inspect}")
85
+ NewRelic::Control.instance.log.debug(e.backtrace.split("\n"))
86
+ end
87
+
88
+ def get_data_from_file(f)
89
+ data = read_until_eof_error(f)
90
+ result = load(data)
91
+ f.truncate(0)
92
+ result
93
+ end
94
+
95
+ def write_contents_nonblockingly(f, string)
96
+ result = 0
97
+ while (result < string.length)
98
+ result += f.write_nonblock(string)
99
+ end
100
+ rescue Errno::EAGAIN, Errno::EINTR
101
+ IO.select(nil, [f])
102
+ retry
103
+ end
104
+
105
+ def read_until_eof_error(f)
106
+ accumulator = ""
107
+ while(true)
108
+ accumulator << f.read_nonblock(10_000)
109
+ end
110
+ rescue Errno::EAGAIN, Errno::EINTR
111
+ IO.select([f])
112
+ retry
113
+ rescue EOFError
114
+ accumulator
115
+ end
116
+
117
+ def max_size
118
+ 10_000
119
+ end
120
+
121
+ def dump(object)
122
+ Marshal.dump(object.clone)
123
+ end
124
+
125
+ def load(dump)
126
+ if dump.respond_to?(:size) && dump.size == 0
127
+ NewRelic::Control.instance.log.debug("Spool file empty.")
128
+ return nil
129
+ end
130
+ Marshal.load(dump)
131
+ rescue ArgumentError, TypeError => e
132
+ NewRelic::Control.instance.log.error("Error loading data from newrelic_agent_store.db: #{e.inspect}")
133
+ NewRelic::Control.instance.log.debug(e.backtrace.inspect)
134
+ nil
135
+ end
136
+
137
+ def truncate_file
138
+ FileUtils.touch(file_path)
139
+ File.truncate(file_path, 0)
140
+ end
141
+
142
+ def create_pid_file
143
+ File.open(pid_file_path, 'w') {|f| f.write $$ }
144
+ end
145
+
146
+ def file_path
147
+ "#{NewRelic::Control.instance.log_path}/newrelic_agent_store.db"
148
+ end
149
+
150
+ def pid_file_path
151
+ "#{NewRelic::Control.instance.log_path}/newrelic_agent_store.pid"
152
+ end
153
+ end
154
+ extend ClassMethods
155
+ end
156
+ end
157
+
@@ -0,0 +1,46 @@
1
+ require 'dependency_detection'
2
+ # This installs some code to manually start the agent when a delayed
3
+ # job worker starts. It's not really instrumentation. It's more like
4
+ # a hook from DJ to the Ruby Agent so it gets loaded at the time the
5
+ # Ruby Agent initializes, which must be before the DJ worker
6
+ # initializes. Loaded from control.rb
7
+ module NewRelic
8
+ module DelayedJobInjection
9
+ extend self
10
+ attr_accessor :worker_name
11
+ end
12
+ end
13
+
14
+ DependencyDetection.defer do
15
+ @name = :delayed_job_injection
16
+
17
+ depends_on do
18
+ defined?(::Delayed) && defined?(::Delayed::Worker) && !NewRelic::Control.instance['disable_dj']
19
+ end
20
+
21
+ executes do
22
+ if NewRelic::Agent.respond_to?(:logger)
23
+ NewRelic::Agent.logger.debug 'Installing DelayedJob instrumentation hooks'
24
+ end
25
+ end
26
+
27
+ executes do
28
+ Delayed::Worker.class_eval do
29
+ def initialize_with_new_relic(*args)
30
+ initialize_without_new_relic(*args)
31
+ worker_name = case
32
+ when self.respond_to?(:name) then self.name
33
+ when self.class.respond_to?(:default_name) then self.class.default_name
34
+ end
35
+ dispatcher_instance_id = worker_name || "host:#{Socket.gethostname} pid:#{Process.pid}" rescue "pid:#{Process.pid}"
36
+ say "New Relic Ruby Agent Monitoring DJ worker #{dispatcher_instance_id}"
37
+ NewRelic::DelayedJobInjection.worker_name = worker_name
38
+ NewRelic::Control.instance.init_plugin :dispatcher => :delayed_job, :dispatcher_instance_id => dispatcher_instance_id
39
+ end
40
+
41
+ alias initialize_without_new_relic initialize
42
+ alias initialize initialize_with_new_relic
43
+ end
44
+ end
45
+ end
46
+ DependencyDetection.detect!
@@ -0,0 +1,69 @@
1
+ module NewRelic::LanguageSupport
2
+ extend self
3
+
4
+ module DataSerialization
5
+ def self.included(base)
6
+ # need to disable GC during marshal load in 1.8.7
7
+ if NewRelic::LanguageSupport.using_version?('1.8.7') &&
8
+ !NewRelic::LanguageSupport.using_engine?('jruby') &&
9
+ !NewRelic::LanguageSupport.using_engine?('rbx')
10
+ base.class_eval do
11
+ def self.load(*args)
12
+ if defined?(::GC) && ::GC.respond_to?(:disable)
13
+ ::GC.disable
14
+ val = super
15
+ ::GC.enable
16
+ val
17
+ else
18
+ super
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ module Control
27
+ def self.included(base)
28
+ # need to use syck rather than psych when possible
29
+ if defined?(::YAML::ENGINE)
30
+ base.class_eval do
31
+ def load_newrelic_yml(*args)
32
+ yamler = ::YAML::ENGINE.yamler
33
+ ::YAML::ENGINE.yamler = 'syck'
34
+ val = super
35
+ ::YAML::ENGINE.yamler = yamler
36
+ val
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+
43
+ module SynchronizedHash
44
+ def self.included(base)
45
+ # need to lock iteration of stats hash in 1.9.x
46
+ if NewRelic::LanguageSupport.using_version?('1.9') ||
47
+ NewRelic::LanguageSupport.using_engine?('jruby')
48
+ base.class_eval do
49
+ def each(*args, &block)
50
+ @lock.synchronize { super }
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+
57
+ def using_engine?(engine)
58
+ if defined?(::RUBY_ENGINE)
59
+ ::RUBY_ENGINE == engine
60
+ else
61
+ engine == 'ruby'
62
+ end
63
+ end
64
+
65
+ def using_version?(version)
66
+ numbers = version.split('.')
67
+ numbers == ::RUBY_VERSION.split('.')[0, numbers.size]
68
+ end
69
+ end