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.
- data/CHANGELOG +559 -0
- data/LICENSE +64 -0
- data/README.rdoc +179 -0
- data/bin/mongrel_rpm +33 -0
- data/bin/newrelic +13 -0
- data/bin/newrelic_cmd +5 -0
- data/cert/cacert.pem +118 -0
- data/cert/oldsite.pem +28 -0
- data/cert/site.pem +27 -0
- data/dolores_rpm-3.3.4.fork.gem +0 -0
- data/install.rb +9 -0
- data/lib/conditional_vendored_dependency_detection.rb +3 -0
- data/lib/conditional_vendored_metric_parser.rb +5 -0
- data/lib/new_relic/agent/agent.rb +1311 -0
- data/lib/new_relic/agent/beacon_configuration.rb +110 -0
- data/lib/new_relic/agent/browser_monitoring.rb +102 -0
- data/lib/new_relic/agent/busy_calculator.rb +99 -0
- data/lib/new_relic/agent/chained_call.rb +13 -0
- data/lib/new_relic/agent/database.rb +203 -0
- data/lib/new_relic/agent/error_collector.rb +251 -0
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +27 -0
- data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +68 -0
- data/lib/new_relic/agent/instrumentation/authlogic.rb +19 -0
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +424 -0
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +57 -0
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +52 -0
- data/lib/new_relic/agent/instrumentation/memcache.rb +80 -0
- data/lib/new_relic/agent/instrumentation/merb/controller.rb +41 -0
- data/lib/new_relic/agent/instrumentation/merb/errors.rb +29 -0
- data/lib/new_relic/agent/instrumentation/metric_frame/pop.rb +80 -0
- data/lib/new_relic/agent/instrumentation/metric_frame.rb +332 -0
- data/lib/new_relic/agent/instrumentation/net.rb +29 -0
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +36 -0
- data/lib/new_relic/agent/instrumentation/queue_time.rb +210 -0
- data/lib/new_relic/agent/instrumentation/rack.rb +98 -0
- data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +114 -0
- data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +42 -0
- data/lib/new_relic/agent/instrumentation/rails/active_record_instrumentation.rb +115 -0
- data/lib/new_relic/agent/instrumentation/rails/errors.rb +42 -0
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +118 -0
- data/lib/new_relic/agent/instrumentation/rails3/active_record_instrumentation.rb +122 -0
- data/lib/new_relic/agent/instrumentation/rails3/errors.rb +37 -0
- data/lib/new_relic/agent/instrumentation/sinatra.rb +58 -0
- data/lib/new_relic/agent/instrumentation/sunspot.rb +29 -0
- data/lib/new_relic/agent/instrumentation/unicorn_instrumentation.rb +21 -0
- data/lib/new_relic/agent/instrumentation.rb +9 -0
- data/lib/new_relic/agent/method_tracer.rb +528 -0
- data/lib/new_relic/agent/sampler.rb +50 -0
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +58 -0
- data/lib/new_relic/agent/samplers/delayed_job_lock_sampler.rb +40 -0
- data/lib/new_relic/agent/samplers/memory_sampler.rb +144 -0
- data/lib/new_relic/agent/samplers/object_sampler.rb +26 -0
- data/lib/new_relic/agent/shim_agent.rb +29 -0
- data/lib/new_relic/agent/sql_sampler.rb +267 -0
- data/lib/new_relic/agent/stats_engine/metric_stats.rb +187 -0
- data/lib/new_relic/agent/stats_engine/samplers.rb +95 -0
- data/lib/new_relic/agent/stats_engine/transactions.rb +208 -0
- data/lib/new_relic/agent/stats_engine.rb +25 -0
- data/lib/new_relic/agent/transaction_sample_builder.rb +101 -0
- data/lib/new_relic/agent/transaction_sampler.rb +397 -0
- data/lib/new_relic/agent/worker_loop.rb +89 -0
- data/lib/new_relic/agent.rb +454 -0
- data/lib/new_relic/collection_helper.rb +75 -0
- data/lib/new_relic/command.rb +85 -0
- data/lib/new_relic/commands/deployments.rb +105 -0
- data/lib/new_relic/commands/install.rb +80 -0
- data/lib/new_relic/control/class_methods.rb +53 -0
- data/lib/new_relic/control/configuration.rb +202 -0
- data/lib/new_relic/control/frameworks/external.rb +16 -0
- data/lib/new_relic/control/frameworks/merb.rb +31 -0
- data/lib/new_relic/control/frameworks/rails.rb +164 -0
- data/lib/new_relic/control/frameworks/rails3.rb +75 -0
- data/lib/new_relic/control/frameworks/ruby.rb +42 -0
- data/lib/new_relic/control/frameworks/sinatra.rb +20 -0
- data/lib/new_relic/control/frameworks.rb +10 -0
- data/lib/new_relic/control/instance_methods.rb +179 -0
- data/lib/new_relic/control/instrumentation.rb +100 -0
- data/lib/new_relic/control/logging_methods.rb +143 -0
- data/lib/new_relic/control/profiling.rb +25 -0
- data/lib/new_relic/control/server_methods.rb +114 -0
- data/lib/new_relic/control.rb +46 -0
- data/lib/new_relic/data_serialization.rb +157 -0
- data/lib/new_relic/delayed_job_injection.rb +46 -0
- data/lib/new_relic/language_support.rb +69 -0
- data/lib/new_relic/local_environment.rb +414 -0
- data/lib/new_relic/merbtasks.rb +6 -0
- data/lib/new_relic/metric_data.rb +51 -0
- data/lib/new_relic/metric_spec.rb +75 -0
- data/lib/new_relic/metrics.rb +9 -0
- data/lib/new_relic/noticed_error.rb +24 -0
- data/lib/new_relic/rack/browser_monitoring.rb +68 -0
- data/lib/new_relic/rack/developer_mode.rb +268 -0
- data/lib/new_relic/recipes.rb +73 -0
- data/lib/new_relic/stats.rb +388 -0
- data/lib/new_relic/timer_lib.rb +27 -0
- data/lib/new_relic/transaction_analysis/segment_summary.rb +49 -0
- data/lib/new_relic/transaction_analysis.rb +77 -0
- data/lib/new_relic/transaction_sample/composite_segment.rb +27 -0
- data/lib/new_relic/transaction_sample/fake_segment.rb +9 -0
- data/lib/new_relic/transaction_sample/segment.rb +201 -0
- data/lib/new_relic/transaction_sample/summary_segment.rb +21 -0
- data/lib/new_relic/transaction_sample.rb +245 -0
- data/lib/new_relic/url_rule.rb +14 -0
- data/lib/new_relic/version.rb +55 -0
- data/lib/newrelic_rpm.rb +49 -0
- data/lib/tasks/all.rb +4 -0
- data/lib/tasks/install.rake +7 -0
- data/lib/tasks/tests.rake +19 -0
- data/newrelic.yml +265 -0
- data/recipes/newrelic.rb +6 -0
- data/test/active_record_fixtures.rb +77 -0
- data/test/config/newrelic.yml +48 -0
- data/test/config/test_control.rb +48 -0
- data/test/new_relic/agent/agent/connect_test.rb +410 -0
- data/test/new_relic/agent/agent/start_test.rb +255 -0
- data/test/new_relic/agent/agent/start_worker_thread_test.rb +153 -0
- data/test/new_relic/agent/agent_test.rb +139 -0
- data/test/new_relic/agent/agent_test_controller.rb +77 -0
- data/test/new_relic/agent/agent_test_controller_test.rb +363 -0
- data/test/new_relic/agent/apdex_from_server_test.rb +9 -0
- data/test/new_relic/agent/beacon_configuration_test.rb +108 -0
- data/test/new_relic/agent/browser_monitoring_test.rb +278 -0
- data/test/new_relic/agent/busy_calculator_test.rb +81 -0
- data/test/new_relic/agent/database_test.rb +162 -0
- data/test/new_relic/agent/error_collector/notice_error_test.rb +257 -0
- data/test/new_relic/agent/error_collector_test.rb +175 -0
- data/test/new_relic/agent/instrumentation/active_record_instrumentation_test.rb +538 -0
- data/test/new_relic/agent/instrumentation/controller_instrumentation_test.rb +36 -0
- data/test/new_relic/agent/instrumentation/instrumentation_test.rb +11 -0
- data/test/new_relic/agent/instrumentation/metric_frame/pop_test.rb +172 -0
- data/test/new_relic/agent/instrumentation/metric_frame_test.rb +50 -0
- data/test/new_relic/agent/instrumentation/net_instrumentation_test.rb +84 -0
- data/test/new_relic/agent/instrumentation/queue_time_test.rb +387 -0
- data/test/new_relic/agent/instrumentation/rack_test.rb +35 -0
- data/test/new_relic/agent/instrumentation/task_instrumentation_test.rb +184 -0
- data/test/new_relic/agent/memcache_instrumentation_test.rb +143 -0
- data/test/new_relic/agent/method_tracer/class_methods/add_method_tracer_test.rb +164 -0
- data/test/new_relic/agent/method_tracer/instance_methods/trace_execution_scoped_test.rb +234 -0
- data/test/new_relic/agent/method_tracer_test.rb +386 -0
- data/test/new_relic/agent/mock_scope_listener.rb +23 -0
- data/test/new_relic/agent/rpm_agent_test.rb +149 -0
- data/test/new_relic/agent/sampler_test.rb +19 -0
- data/test/new_relic/agent/shim_agent_test.rb +20 -0
- data/test/new_relic/agent/sql_sampler_test.rb +160 -0
- data/test/new_relic/agent/stats_engine/metric_stats/harvest_test.rb +150 -0
- data/test/new_relic/agent/stats_engine/metric_stats_test.rb +82 -0
- data/test/new_relic/agent/stats_engine/samplers_test.rb +99 -0
- data/test/new_relic/agent/stats_engine_test.rb +185 -0
- data/test/new_relic/agent/transaction_sample_builder_test.rb +195 -0
- data/test/new_relic/agent/transaction_sampler_test.rb +955 -0
- data/test/new_relic/agent/worker_loop_test.rb +66 -0
- data/test/new_relic/agent_test.rb +175 -0
- data/test/new_relic/collection_helper_test.rb +149 -0
- data/test/new_relic/command/deployments_test.rb +68 -0
- data/test/new_relic/control/class_methods_test.rb +62 -0
- data/test/new_relic/control/configuration_test.rb +72 -0
- data/test/new_relic/control/logging_methods_test.rb +185 -0
- data/test/new_relic/control_test.rb +254 -0
- data/test/new_relic/data_serialization_test.rb +208 -0
- data/test/new_relic/delayed_job_injection_test.rb +16 -0
- data/test/new_relic/local_environment_test.rb +72 -0
- data/test/new_relic/metric_data_test.rb +125 -0
- data/test/new_relic/metric_spec_test.rb +95 -0
- data/test/new_relic/rack/all_test.rb +11 -0
- data/test/new_relic/rack/browser_monitoring_test.rb +84 -0
- data/test/new_relic/rack/developer_mode_helper_test.rb +141 -0
- data/test/new_relic/rack/developer_mode_test.rb +43 -0
- data/test/new_relic/stats_test.rb +426 -0
- data/test/new_relic/transaction_analysis/segment_summary_test.rb +91 -0
- data/test/new_relic/transaction_analysis_test.rb +121 -0
- data/test/new_relic/transaction_sample/composite_segment_test.rb +35 -0
- data/test/new_relic/transaction_sample/fake_segment_test.rb +17 -0
- data/test/new_relic/transaction_sample/segment_test.rb +389 -0
- data/test/new_relic/transaction_sample/summary_segment_test.rb +31 -0
- data/test/new_relic/transaction_sample_subtest_test.rb +56 -0
- data/test/new_relic/transaction_sample_test.rb +164 -0
- data/test/new_relic/version_number_test.rb +89 -0
- data/test/test_contexts.rb +29 -0
- data/test/test_helper.rb +154 -0
- data/ui/helpers/developer_mode_helper.rb +357 -0
- data/ui/helpers/google_pie_chart.rb +48 -0
- data/ui/views/layouts/newrelic_default.rhtml +47 -0
- data/ui/views/newrelic/_explain_plans.rhtml +27 -0
- data/ui/views/newrelic/_sample.rhtml +20 -0
- data/ui/views/newrelic/_segment.rhtml +28 -0
- data/ui/views/newrelic/_segment_limit_message.rhtml +1 -0
- data/ui/views/newrelic/_segment_row.rhtml +12 -0
- data/ui/views/newrelic/_show_sample_detail.rhtml +24 -0
- data/ui/views/newrelic/_show_sample_sql.rhtml +24 -0
- data/ui/views/newrelic/_show_sample_summary.rhtml +3 -0
- data/ui/views/newrelic/_sql_row.rhtml +16 -0
- data/ui/views/newrelic/_stack_trace.rhtml +15 -0
- data/ui/views/newrelic/_table.rhtml +12 -0
- data/ui/views/newrelic/explain_sql.rhtml +43 -0
- data/ui/views/newrelic/file/images/arrow-close.png +0 -0
- data/ui/views/newrelic/file/images/arrow-open.png +0 -0
- data/ui/views/newrelic/file/images/blue_bar.gif +0 -0
- data/ui/views/newrelic/file/images/file_icon.png +0 -0
- data/ui/views/newrelic/file/images/gray_bar.gif +0 -0
- data/ui/views/newrelic/file/images/new-relic-rpm-desktop.gif +0 -0
- data/ui/views/newrelic/file/images/new_relic_rpm_desktop.gif +0 -0
- data/ui/views/newrelic/file/images/textmate.png +0 -0
- data/ui/views/newrelic/file/javascript/jquery-1.4.2.js +6240 -0
- data/ui/views/newrelic/file/javascript/transaction_sample.js +120 -0
- data/ui/views/newrelic/file/stylesheets/style.css +490 -0
- data/ui/views/newrelic/index.rhtml +71 -0
- data/ui/views/newrelic/sample_not_found.rhtml +2 -0
- data/ui/views/newrelic/show_sample.rhtml +80 -0
- data/ui/views/newrelic/show_source.rhtml +3 -0
- data/ui/views/newrelic/threads.rhtml +53 -0
- data/vendor/gems/dependency_detection-0.0.1.build/LICENSE +5 -0
- data/vendor/gems/dependency_detection-0.0.1.build/lib/dependency_detection/version.rb +3 -0
- data/vendor/gems/dependency_detection-0.0.1.build/lib/dependency_detection.rb +62 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/metric_parser.rb +1 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/action_mailer.rb +14 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/active_merchant.rb +31 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/active_record.rb +33 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/apdex.rb +89 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/background_transaction.rb +7 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/client.rb +46 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller.rb +67 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller_cpu.rb +43 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/controller_ext.rb +17 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/database.rb +48 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/database_pool.rb +24 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/dot_net.rb +28 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/dot_net_parser.rb +17 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/errors.rb +11 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/external.rb +55 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/frontend.rb +40 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/gc.rb +20 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/hibernate_session.rb +7 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/java.rb +31 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/java_parser.rb +17 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/jsp.rb +34 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/jsp_tag.rb +7 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/mem_cache.rb +55 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/metric_parser.rb +122 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/orm.rb +27 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/other_transaction.rb +40 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet.rb +7 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet_context_listener.rb +7 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/servlet_filter.rb +7 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/solr.rb +27 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/solr_request_handler.rb +15 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/spring.rb +54 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/spring_controller.rb +6 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/spring_view.rb +6 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/struts_action.rb +20 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/struts_result.rb +20 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/version.rb +5 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/view.rb +70 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/web_frontend.rb +18 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/web_service.rb +14 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/web_transaction.rb +133 -0
- data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser.rb +64 -0
- 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
|