newrelic_rpm 9.0.0 → 9.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +6 -16
- data/.rubocop_todo.yml +4 -43
- data/.simplecov +1 -1
- data/CHANGELOG.md +60 -2
- data/Gemfile +1 -1
- data/Guardfile +7 -7
- data/README.md +1 -2
- data/Rakefile +8 -8
- data/Thorfile +1 -1
- data/bin/nrdebug +20 -20
- data/init.rb +1 -1
- data/lib/new_relic/agent/agent.rb +3 -16
- data/lib/new_relic/agent/agent_helpers/connect.rb +4 -9
- data/lib/new_relic/agent/agent_helpers/harvest.rb +4 -4
- data/lib/new_relic/agent/agent_helpers/shutdown.rb +5 -5
- data/lib/new_relic/agent/agent_helpers/special_startup.rb +2 -2
- data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +47 -39
- data/lib/new_relic/agent/agent_helpers/startup.rb +13 -13
- data/lib/new_relic/agent/agent_helpers/transmit.rb +6 -6
- data/lib/new_relic/agent/agent_logger.rb +9 -9
- data/lib/new_relic/agent/attribute_filter.rb +2 -2
- data/lib/new_relic/agent/attribute_processing.rb +2 -2
- data/lib/new_relic/agent/audit_logger.rb +5 -5
- data/lib/new_relic/agent/autostart.rb +1 -1
- data/lib/new_relic/agent/commands/agent_command.rb +2 -2
- data/lib/new_relic/agent/commands/agent_command_router.rb +5 -4
- data/lib/new_relic/agent/commands/thread_profiler_session.rb +5 -5
- data/lib/new_relic/agent/configuration/default_source.rb +57 -56
- data/lib/new_relic/agent/configuration/environment_source.rb +2 -2
- data/lib/new_relic/agent/configuration/high_security_source.rb +3 -3
- data/lib/new_relic/agent/configuration/manager.rb +2 -2
- data/lib/new_relic/agent/configuration/security_policy_source.rb +10 -10
- data/lib/new_relic/agent/configuration/server_source.rb +24 -24
- data/lib/new_relic/agent/configuration/yaml_source.rb +4 -4
- data/lib/new_relic/agent/connect/request_builder.rb +1 -1
- data/lib/new_relic/agent/connect/response_handler.rb +1 -1
- data/lib/new_relic/agent/custom_event_aggregator.rb +4 -4
- data/lib/new_relic/agent/database/explain_plan_helpers.rb +1 -1
- data/lib/new_relic/agent/database/obfuscation_helpers.rb +2 -2
- data/lib/new_relic/agent/database/obfuscator.rb +2 -2
- data/lib/new_relic/agent/database.rb +4 -4
- data/lib/new_relic/agent/datastores/metric_helper.rb +5 -5
- data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +11 -11
- data/lib/new_relic/agent/datastores/redis.rb +6 -6
- data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +7 -8
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +10 -10
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +7 -7
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +1 -1
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +6 -6
- data/lib/new_relic/agent/distributed_tracing/trace_context.rb +7 -7
- data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +4 -4
- data/lib/new_relic/agent/distributed_tracing.rb +5 -5
- data/lib/new_relic/agent/error_collector.rb +35 -7
- data/lib/new_relic/agent/error_filter.rb +2 -2
- data/lib/new_relic/agent/error_trace_aggregator.rb +5 -4
- data/lib/new_relic/agent/event_loop.rb +3 -3
- data/lib/new_relic/agent/external.rb +1 -1
- data/lib/new_relic/agent/harvester.rb +1 -3
- data/lib/new_relic/agent/heap.rb +2 -1
- data/lib/new_relic/agent/hostname.rb +1 -1
- data/lib/new_relic/agent/http_clients/abstract.rb +9 -21
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +7 -3
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +7 -5
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +4 -0
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +6 -2
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +5 -1
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +8 -5
- data/lib/new_relic/agent/http_clients/uri_util.rb +2 -2
- data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +5 -2
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +3 -2
- data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +3 -3
- data/lib/new_relic/agent/instrumentation/active_job.rb +1 -1
- data/lib/new_relic/agent/instrumentation/active_record.rb +3 -2
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +38 -35
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +3 -3
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +2 -2
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +3 -2
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +3 -3
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +5 -3
- data/lib/new_relic/agent/instrumentation/curb/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +5 -5
- data/lib/new_relic/agent/instrumentation/curb.rb +1 -1
- data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +2 -1
- data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +1 -1
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +2 -1
- data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +3 -3
- data/lib/new_relic/agent/instrumentation/elasticsearch.rb +1 -1
- data/lib/new_relic/agent/instrumentation/excon/middleware.rb +2 -1
- data/lib/new_relic/agent/instrumentation/excon.rb +3 -3
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +4 -4
- data/lib/new_relic/agent/instrumentation/grape.rb +3 -3
- data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +2 -1
- data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +3 -3
- data/lib/new_relic/agent/instrumentation/httprb.rb +1 -1
- data/lib/new_relic/agent/instrumentation/ignore_actions.rb +1 -1
- data/lib/new_relic/agent/instrumentation/logger.rb +1 -1
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +2 -2
- data/lib/new_relic/agent/instrumentation/memcache.rb +6 -6
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +3 -3
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +1 -1
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +5 -5
- data/lib/new_relic/agent/instrumentation/net_http.rb +1 -1
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +1 -1
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +3 -3
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +2 -2
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +3 -2
- data/lib/new_relic/agent/instrumentation/rails_middleware.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +7 -7
- data/lib/new_relic/agent/instrumentation/rake.rb +2 -2
- data/lib/new_relic/agent/instrumentation/redis/constants.rb +1 -1
- data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +2 -1
- data/lib/new_relic/agent/instrumentation/resque/helper.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sequel.rb +4 -4
- data/lib/new_relic/agent/instrumentation/sequel_helper.rb +10 -10
- data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +6 -5
- data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +1 -1
- data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +2 -1
- data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +5 -5
- data/lib/new_relic/agent/javascript_instrumentor.rb +29 -24
- data/lib/new_relic/agent/linking_metadata.rb +2 -2
- data/lib/new_relic/agent/log_event_aggregator.rb +15 -15
- data/lib/new_relic/agent/logging.rb +73 -33
- data/lib/new_relic/agent/messaging.rb +7 -5
- data/lib/new_relic/agent/method_tracer.rb +6 -6
- data/lib/new_relic/agent/method_tracer_helpers.rb +1 -1
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +4 -4
- data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +1 -1
- data/lib/new_relic/agent/new_relic_service/encoders.rb +1 -1
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +2 -2
- data/lib/new_relic/agent/new_relic_service.rb +14 -14
- data/lib/new_relic/agent/obfuscator.rb +1 -1
- data/lib/new_relic/agent/parameter_filtering.rb +6 -6
- data/lib/new_relic/agent/pipe_channel_manager.rb +7 -6
- data/lib/new_relic/agent/pipe_service.rb +5 -3
- data/lib/new_relic/agent/priority_sampled_buffer.rb +1 -1
- data/lib/new_relic/agent/sampler.rb +1 -1
- data/lib/new_relic/agent/sampler_collection.rb +1 -1
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +5 -5
- data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +9 -9
- data/lib/new_relic/agent/samplers/memory_sampler.rb +9 -9
- data/lib/new_relic/agent/samplers/object_sampler.rb +1 -1
- data/lib/new_relic/agent/span_event_aggregator.rb +4 -4
- data/lib/new_relic/agent/span_event_primitive.rb +2 -2
- data/lib/new_relic/agent/sql_sampler.rb +2 -2
- data/lib/new_relic/agent/stats.rb +1 -1
- data/lib/new_relic/agent/synthetics_event_aggregator.rb +1 -1
- data/lib/new_relic/agent/system_info.rb +10 -10
- data/lib/new_relic/agent/threading/agent_thread.rb +1 -1
- data/lib/new_relic/agent/threading/backtrace_node.rb +3 -3
- data/lib/new_relic/agent/threading/backtrace_service.rb +3 -7
- data/lib/new_relic/agent/threading/thread_profile.rb +5 -5
- data/lib/new_relic/agent/timestamp_sampled_buffer.rb +1 -1
- data/lib/new_relic/agent/tracer.rb +8 -7
- data/lib/new_relic/agent/transaction/abstract_segment.rb +7 -7
- data/lib/new_relic/agent/transaction/datastore_segment.rb +1 -1
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +7 -6
- data/lib/new_relic/agent/transaction/distributed_tracing.rb +6 -6
- data/lib/new_relic/agent/transaction/external_request_segment.rb +11 -11
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +1 -1
- data/lib/new_relic/agent/transaction/request_attributes.rb +2 -2
- data/lib/new_relic/agent/transaction/segment.rb +1 -1
- data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +1 -1
- data/lib/new_relic/agent/transaction/trace.rb +1 -1
- data/lib/new_relic/agent/transaction/trace_context.rb +4 -4
- data/lib/new_relic/agent/transaction/trace_node.rb +8 -7
- data/lib/new_relic/agent/transaction/tracing.rb +2 -2
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +1 -1
- data/lib/new_relic/agent/transaction.rb +39 -36
- data/lib/new_relic/agent/transaction_error_primitive.rb +5 -5
- data/lib/new_relic/agent/transaction_event_aggregator.rb +4 -4
- data/lib/new_relic/agent/transaction_event_primitive.rb +3 -3
- data/lib/new_relic/agent/transaction_sampler.rb +3 -3
- data/lib/new_relic/agent/transaction_time_aggregator.rb +7 -3
- data/lib/new_relic/agent/utilization/aws.rb +1 -1
- data/lib/new_relic/agent/utilization/azure.rb +3 -3
- data/lib/new_relic/agent/utilization/gcp.rb +3 -3
- data/lib/new_relic/agent/utilization/pcf.rb +1 -1
- data/lib/new_relic/agent/utilization/vendor.rb +1 -1
- data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +1 -1
- data/lib/new_relic/agent/vm/mri_vm.rb +9 -8
- data/lib/new_relic/agent/worker_loop.rb +1 -1
- data/lib/new_relic/agent.rb +78 -16
- data/lib/new_relic/cli/command.rb +3 -3
- data/lib/new_relic/cli/commands/deployments.rb +26 -25
- data/lib/new_relic/cli/commands/install.rb +14 -14
- data/lib/new_relic/collection_helper.rb +2 -2
- data/lib/new_relic/constants.rb +7 -8
- data/lib/new_relic/control/class_methods.rb +3 -3
- data/lib/new_relic/control/frameworks/rails.rb +30 -18
- data/lib/new_relic/control/instance_methods.rb +5 -5
- data/lib/new_relic/control/instrumentation.rb +1 -1
- data/lib/new_relic/control/private_instance_methods.rb +1 -1
- data/lib/new_relic/dependency_detection.rb +4 -17
- data/lib/new_relic/environment_report.rb +4 -4
- data/lib/new_relic/helper.rb +2 -1
- data/lib/new_relic/language_support.rb +1 -1
- data/lib/new_relic/latest_changes.rb +5 -5
- data/lib/new_relic/noticed_error.rb +20 -18
- data/lib/new_relic/rack/browser_monitoring.rb +20 -16
- data/lib/new_relic/recipes/capistrano3.rb +1 -1
- data/lib/new_relic/recipes/capistrano_legacy.rb +6 -6
- data/lib/new_relic/recipes/helpers/send_deployment.rb +5 -5
- data/lib/new_relic/supportability_helper.rb +2 -0
- data/lib/new_relic/version.rb +1 -1
- data/lib/newrelic_rpm.rb +3 -3
- data/lib/sequel/extensions/new_relic_instrumentation.rb +3 -3
- data/lib/sequel/plugins/new_relic_instrumentation.rb +1 -1
- data/lib/tasks/config.rake +12 -12
- data/lib/tasks/coverage_report.rake +3 -3
- data/lib/tasks/helpers/format.rb +9 -9
- data/lib/tasks/helpers/removers.rb +5 -5
- data/lib/tasks/install.rake +4 -4
- data/lib/tasks/multiverse.rb +12 -6
- data/lib/tasks/tests.rake +6 -6
- data/newrelic_rpm.gemspec +13 -13
- data/test/agent_helper.rb +25 -24
- metadata +2 -2
@@ -44,26 +44,38 @@ module NewRelic
|
|
44
44
|
# find a config and use that.
|
45
45
|
def init_config(options = {})
|
46
46
|
@config = options[:config]
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
47
|
+
install_dependency_detection
|
48
|
+
install_browser_monitoring_and_agent_hooks
|
49
|
+
rescue => e
|
50
|
+
::NewRelic::Agent.logger.error('Failure during init_config for Rails. Is Rails required in a non-Rails ' \
|
51
|
+
'app? Set NEW_RELIC_FRAMEWORK=ruby to avoid this message. The Ruby agent ' \
|
52
|
+
'will continue running, but Rails-specific features may be missing. ' \
|
53
|
+
"#{e.class} - #{e.message}")
|
54
|
+
end
|
55
|
+
|
56
|
+
def install_dependency_detection
|
57
|
+
return unless rails_config && ::Rails.configuration.respond_to?(:after_initialize)
|
58
|
+
|
59
|
+
rails_config.after_initialize do
|
60
|
+
# This will insure we load all the instrumentation as late as
|
61
|
+
# possible. If the agent is not enabled, it will load a limited
|
62
|
+
# amount of instrumentation.
|
63
|
+
DependencyDetection.detect!
|
54
64
|
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def install_browser_monitoring_and_agent_hooks
|
68
|
+
return unless rails_config
|
69
|
+
|
55
70
|
if !Agent.config[:agent_enabled]
|
56
|
-
# Might not be running if it does not think mongrel, thin,
|
57
|
-
# is running, if it thinks it's a rake task, or
|
58
|
-
|
71
|
+
# Might not be running if it does not think mongrel, thin,
|
72
|
+
# passenger, etc. is running, if it thinks it's a rake task, or
|
73
|
+
# if the agent_enabled is false.
|
74
|
+
::NewRelic::Agent.logger.info('New Relic Agent not running. Skipping browser monitoring and agent hooks.')
|
59
75
|
else
|
60
76
|
install_browser_monitoring(rails_config)
|
61
77
|
install_agent_hooks(rails_config)
|
62
78
|
end
|
63
|
-
rescue => e
|
64
|
-
::NewRelic::Agent.logger.error("Failure during init_config for Rails. Is Rails required in a non-Rails app? Set NEW_RELIC_FRAMEWORK=ruby to avoid this message.",
|
65
|
-
"The Ruby agent will continue running, but Rails-specific features may be missing.",
|
66
|
-
e)
|
67
79
|
end
|
68
80
|
|
69
81
|
def install_agent_hooks(config)
|
@@ -77,9 +89,9 @@ module NewRelic
|
|
77
89
|
return unless NewRelic::Rack::AgentHooks.needed?
|
78
90
|
|
79
91
|
config.middleware.use(NewRelic::Rack::AgentHooks)
|
80
|
-
::NewRelic::Agent.logger.debug(
|
92
|
+
::NewRelic::Agent.logger.debug('Installed New Relic Agent Hooks middleware')
|
81
93
|
rescue => e
|
82
|
-
::NewRelic::Agent.logger.warn(
|
94
|
+
::NewRelic::Agent.logger.warn('Error installing New Relic Agent Hooks middleware', e)
|
83
95
|
end
|
84
96
|
end
|
85
97
|
|
@@ -93,9 +105,9 @@ module NewRelic
|
|
93
105
|
begin
|
94
106
|
require 'new_relic/rack/browser_monitoring'
|
95
107
|
config.middleware.use(NewRelic::Rack::BrowserMonitoring)
|
96
|
-
::NewRelic::Agent.logger.debug(
|
108
|
+
::NewRelic::Agent.logger.debug('Installed New Relic Browser Monitoring middleware')
|
97
109
|
rescue => e
|
98
|
-
::NewRelic::Agent.logger.warn(
|
110
|
+
::NewRelic::Agent.logger.warn('Error installing New Relic Browser Monitoring middleware', e)
|
99
111
|
end
|
100
112
|
end
|
101
113
|
end
|
@@ -82,10 +82,10 @@ module NewRelic
|
|
82
82
|
if @started_in_env && @started_in_env != env
|
83
83
|
Agent.logger.error("Attempted to start agent in #{env.inspect} environment, but agent was already running " \
|
84
84
|
"in #{@started_in_env.inspect}", "The agent will continue running in #{@started_in_env.inspect}. To " \
|
85
|
-
|
85
|
+
'alter this, ensure the desired environment is set before the agent starts.')
|
86
86
|
else
|
87
87
|
Agent.logger.info("Starting the New Relic agent version #{NewRelic::VERSION::STRING} in #{env.inspect} " \
|
88
|
-
|
88
|
+
'environment.', 'To prevent agent startup add a NEW_RELIC_AGENT_ENABLED=false environment variable or ' \
|
89
89
|
"modify the #{env.inspect} section of your newrelic.yml.")
|
90
90
|
end
|
91
91
|
|
@@ -106,9 +106,9 @@ module NewRelic
|
|
106
106
|
end
|
107
107
|
|
108
108
|
def handle_invalid_security_settings
|
109
|
-
NewRelic::Agent.logger.error(
|
110
|
-
|
111
|
-
|
109
|
+
NewRelic::Agent.logger.error('Security Policies and High Security Mode cannot both be present in the agent ' \
|
110
|
+
'configuration. If Security Policies have been set for your account, please ensure the ' \
|
111
|
+
'security_policies_token is set but high_security is disabled (default).')
|
112
112
|
install_shim
|
113
113
|
end
|
114
114
|
|
@@ -12,7 +12,7 @@ module NewRelic
|
|
12
12
|
|
13
13
|
def configure_high_security
|
14
14
|
if security_settings_valid? && Agent.config[:high_security]
|
15
|
-
Agent.logger.info(
|
15
|
+
Agent.logger.info('Installing high security configuration based on local configuration')
|
16
16
|
Agent.config.replace_or_add_config(Agent::Configuration::HighSecuritySource.new(Agent.config))
|
17
17
|
end
|
18
18
|
end
|
@@ -35,19 +35,6 @@ module DependencyDetection
|
|
35
35
|
@items.find { |i| i.name == name }
|
36
36
|
end
|
37
37
|
|
38
|
-
def installed?(name)
|
39
|
-
item = dependency_by_name(name)
|
40
|
-
item && item.executed
|
41
|
-
end
|
42
|
-
|
43
|
-
def items
|
44
|
-
@items
|
45
|
-
end
|
46
|
-
|
47
|
-
def items=(new_items)
|
48
|
-
@items = new_items
|
49
|
-
end
|
50
|
-
|
51
38
|
class Dependent
|
52
39
|
attr_reader :executed
|
53
40
|
attr_accessor :name
|
@@ -83,7 +70,7 @@ module DependencyDetection
|
|
83
70
|
# Given "NewRelic::Agent::Instrumentation::NetHTTP::Prepend"
|
84
71
|
# Will extract "NetHTTP" which is in the 2nd to last spot
|
85
72
|
def extract_supportability_name(instrumenting_module)
|
86
|
-
instrumenting_module.to_s.split(
|
73
|
+
instrumenting_module.to_s.split('::')[-2]
|
87
74
|
end
|
88
75
|
|
89
76
|
def log_and_instrument(method, instrumenting_module, supportability_name)
|
@@ -94,20 +81,20 @@ module DependencyDetection
|
|
94
81
|
end
|
95
82
|
|
96
83
|
def prepend_instrument(target_class, instrumenting_module, supportability_name = nil)
|
97
|
-
log_and_instrument(
|
84
|
+
log_and_instrument('Prepend', instrumenting_module, supportability_name) do
|
98
85
|
target_class.send(:prepend, instrumenting_module)
|
99
86
|
end
|
100
87
|
end
|
101
88
|
|
102
89
|
def chain_instrument(instrumenting_module, supportability_name = nil)
|
103
|
-
log_and_instrument(
|
90
|
+
log_and_instrument('MethodChaining', instrumenting_module, supportability_name) do
|
104
91
|
instrumenting_module.instrument!
|
105
92
|
end
|
106
93
|
end
|
107
94
|
|
108
95
|
def chain_instrument_target(target, instrumenting_module, supportability_name = nil)
|
109
96
|
NewRelic::Agent.logger.info("Installing deferred #{target} instrumentation")
|
110
|
-
log_and_instrument(
|
97
|
+
log_and_instrument('MethodChaining', instrumenting_module, supportability_name) do
|
111
98
|
instrumenting_module.instrument!(target)
|
112
99
|
end
|
113
100
|
end
|
@@ -52,7 +52,7 @@ module NewRelic
|
|
52
52
|
# though so try it if the above fails.
|
53
53
|
Bundler.load.specs.map do |spec|
|
54
54
|
version = (spec.respond_to?(:version) && spec.version)
|
55
|
-
spec.name + (version ? "(#{version})" :
|
55
|
+
spec.name + (version ? "(#{version})" : '')
|
56
56
|
end
|
57
57
|
end
|
58
58
|
end
|
@@ -118,19 +118,19 @@ module NewRelic
|
|
118
118
|
def record_value(data, key, value)
|
119
119
|
data[key] = value
|
120
120
|
|
121
|
-
Agent.record_metric(
|
121
|
+
Agent.record_metric('Supportability/EnvironmentReport/success', 0.0)
|
122
122
|
Agent.record_metric("Supportability/EnvironmentReport/success/#{key}", 0.0)
|
123
123
|
end
|
124
124
|
|
125
125
|
def record_empty_value(key, value)
|
126
126
|
Agent.logger.debug("EnvironmentReport ignoring value for #{key.inspect} which came back falsey: #{value.inspect}")
|
127
|
-
Agent.record_metric(
|
127
|
+
Agent.record_metric('Supportability/EnvironmentReport/empty', 0.0)
|
128
128
|
Agent.record_metric("Supportability/EnvironmentReport/empty/#{key}", 0.0)
|
129
129
|
end
|
130
130
|
|
131
131
|
def rescue_initialize(key, exception)
|
132
132
|
Agent.logger.debug("EnvironmentReport failed to retrieve value for #{key.inspect}: #{exception}")
|
133
|
-
Agent.record_metric(
|
133
|
+
Agent.record_metric('Supportability/EnvironmentReport/error', 0.0)
|
134
134
|
Agent.record_metric("Supportability/EnvironmentReport/error/#{key}", 0.0)
|
135
135
|
end
|
136
136
|
end
|
data/lib/new_relic/helper.rb
CHANGED
@@ -63,7 +63,8 @@ module NewRelic
|
|
63
63
|
raise NewRelic::CommandRunFailedError.new("Failed to run command '#{command}': #{message}")
|
64
64
|
end
|
65
65
|
|
66
|
-
|
66
|
+
# needs else branch coverage
|
67
|
+
output.chomp if output # rubocop:disable Style/SafeNavigation
|
67
68
|
end
|
68
69
|
|
69
70
|
# TODO: Open3 defers the actual execution of a binary to Process.spawn,
|
@@ -62,7 +62,7 @@ module NewRelic
|
|
62
62
|
#
|
63
63
|
# Can't help if the constant isn't a class...
|
64
64
|
if result.is_a?(Module)
|
65
|
-
expected_name = "#{namespace}::#{name}".gsub(/^Object::/,
|
65
|
+
expected_name = "#{namespace}::#{name}".gsub(/^Object::/, '')
|
66
66
|
return unless expected_name == result.to_s
|
67
67
|
end
|
68
68
|
|
@@ -26,12 +26,12 @@ EOS
|
|
26
26
|
# * This is a patch item (3.7.1.188)
|
27
27
|
def self.read_patch(patch_level, changelog = default_changelog)
|
28
28
|
latest = extract_latest_changes(File.read(changelog))
|
29
|
-
changes = ["## v#{patch_level}",
|
29
|
+
changes = ["## v#{patch_level}", '']
|
30
30
|
|
31
31
|
current_item = nil
|
32
32
|
latest.each do |line|
|
33
|
-
if
|
34
|
-
if
|
33
|
+
if /^\s*\*.*/.match?(line)
|
34
|
+
if /\(#{patch_level}\)/.match?(line)
|
35
35
|
# Found a patch level item, so start tracking the lines!
|
36
36
|
current_item = line
|
37
37
|
else
|
@@ -52,12 +52,12 @@ EOS
|
|
52
52
|
changes = []
|
53
53
|
version_count = 0
|
54
54
|
contents.each_line do |line|
|
55
|
-
if
|
55
|
+
if /##\s+v[\d.]+/.match?(line)
|
56
56
|
version_count += 1
|
57
57
|
end
|
58
58
|
break if version_count >= 2
|
59
59
|
|
60
|
-
changes << line.sub(/^ \* /,
|
60
|
+
changes << line.sub(/^ \* /, '* ').chomp
|
61
61
|
end
|
62
62
|
changes
|
63
63
|
end
|
@@ -15,18 +15,20 @@ class NewRelic::NoticedError
|
|
15
15
|
:stack_trace, :attributes_from_notice_error, :attributes,
|
16
16
|
:expected
|
17
17
|
|
18
|
-
attr_reader :exception_id, :is_internal
|
18
|
+
attr_reader :error_group, :exception_id, :is_internal
|
19
19
|
|
20
20
|
STRIPPED_EXCEPTION_REPLACEMENT_MESSAGE = "Message removed by New Relic 'strip_exception_messages' setting"
|
21
21
|
UNKNOWN_ERROR_CLASS_NAME = 'Error'
|
22
22
|
NIL_ERROR_MESSAGE = '<no message>'
|
23
23
|
|
24
|
-
USER_ATTRIBUTES =
|
25
|
-
AGENT_ATTRIBUTES =
|
26
|
-
INTRINSIC_ATTRIBUTES =
|
24
|
+
USER_ATTRIBUTES = 'userAttributes'
|
25
|
+
AGENT_ATTRIBUTES = 'agentAttributes'
|
26
|
+
INTRINSIC_ATTRIBUTES = 'intrinsics'
|
27
27
|
|
28
28
|
DESTINATION = NewRelic::Agent::AttributeFilter::DST_ERROR_COLLECTOR
|
29
29
|
|
30
|
+
AGENT_ATTRIBUTE_ERROR_GROUP = :'error.group.name'
|
31
|
+
|
30
32
|
ERROR_PREFIX_KEY = 'error'
|
31
33
|
ERROR_MESSAGE_KEY = "#{ERROR_PREFIX_KEY}.message"
|
32
34
|
ERROR_CLASS_KEY = "#{ERROR_PREFIX_KEY}.class"
|
@@ -141,21 +143,9 @@ class NewRelic::NoticedError
|
|
141
143
|
end
|
142
144
|
|
143
145
|
def build_agent_attributes(merged_attributes)
|
144
|
-
|
145
|
-
@attributes.agent_attributes_for(DESTINATION)
|
146
|
-
else
|
147
|
-
NewRelic::EMPTY_HASH
|
148
|
-
end
|
149
|
-
|
150
|
-
# It's possible to override the request_uri from the transaction attributes
|
151
|
-
# with a uri passed to notice_error. Add it to merged_attributes filter and
|
152
|
-
# merge with the transaction attributes, possibly overriding the request_uri
|
153
|
-
if request_uri
|
154
|
-
merged_attributes.add_agent_attribute(:'request.uri', request_uri, DESTINATION)
|
155
|
-
agent_attributes.merge(merged_attributes.agent_attributes_for(DESTINATION))
|
156
|
-
end
|
146
|
+
return NewRelic::EMPTY_HASH unless @attributes
|
157
147
|
|
158
|
-
|
148
|
+
@attributes.agent_attributes_for(DESTINATION)
|
159
149
|
end
|
160
150
|
|
161
151
|
def build_intrinsic_attributes
|
@@ -197,4 +187,16 @@ class NewRelic::NoticedError
|
|
197
187
|
@message = exception.to_s
|
198
188
|
end
|
199
189
|
end
|
190
|
+
|
191
|
+
def error_group=(name)
|
192
|
+
return if name.nil? || name.empty?
|
193
|
+
|
194
|
+
if agent_attributes.frozen?
|
195
|
+
processed_attributes[AGENT_ATTRIBUTES] = agent_attributes.merge(AGENT_ATTRIBUTE_ERROR_GROUP => name)
|
196
|
+
else
|
197
|
+
agent_attributes[AGENT_ATTRIBUTE_ERROR_GROUP] = name
|
198
|
+
end
|
199
|
+
|
200
|
+
@error_group = name
|
201
|
+
end
|
200
202
|
end
|
@@ -26,11 +26,11 @@ module NewRelic
|
|
26
26
|
ATTACHMENT = 'attachment'.freeze
|
27
27
|
TEXT_HTML = 'text/html'.freeze
|
28
28
|
|
29
|
-
BODY_START =
|
30
|
-
HEAD_START =
|
31
|
-
GT =
|
29
|
+
BODY_START = '<body'.freeze
|
30
|
+
HEAD_START = '<head'.freeze
|
31
|
+
GT = '>'.freeze
|
32
32
|
|
33
|
-
ALREADY_INSTRUMENTED_KEY =
|
33
|
+
ALREADY_INSTRUMENTED_KEY = 'newrelic.browser_monitoring_already_instrumented'
|
34
34
|
CHARSET_RE = /<\s*meta[^>]+charset\s*=[^>]*>/im.freeze
|
35
35
|
X_UA_COMPATIBLE_RE = /<\s*meta[^>]+http-equiv\s*=\s*['"]x-ua-compatible['"][^>]*>/im.freeze
|
36
36
|
|
@@ -40,7 +40,7 @@ module NewRelic
|
|
40
40
|
|
41
41
|
js_to_inject = NewRelic::Agent.browser_timing_header
|
42
42
|
if (js_to_inject != NewRelic::EMPTY_STR) && should_instrument?(env, status, headers)
|
43
|
-
response_string = autoinstrument_source(response,
|
43
|
+
response_string = autoinstrument_source(response, js_to_inject)
|
44
44
|
if headers.key?(CONTENT_LENGTH)
|
45
45
|
content_length = response_string ? response_string.bytesize : 0
|
46
46
|
headers[CONTENT_LENGTH] = content_length.to_s
|
@@ -69,11 +69,17 @@ module NewRelic
|
|
69
69
|
|
70
70
|
private
|
71
71
|
|
72
|
-
def autoinstrument_source(response,
|
72
|
+
def autoinstrument_source(response, js_to_inject)
|
73
73
|
source = gather_source(response)
|
74
74
|
close_old_response(response)
|
75
|
-
return
|
75
|
+
return unless source
|
76
76
|
|
77
|
+
modify_source(source, js_to_inject)
|
78
|
+
rescue => e
|
79
|
+
NewRelic::Agent.logger.debug("Skipping RUM instrumentation on exception: #{e.class} - #{e.message}")
|
80
|
+
end
|
81
|
+
|
82
|
+
def modify_source(source, js_to_inject)
|
77
83
|
# Only scan the first 50k (roughly) then give up.
|
78
84
|
beginning_of_source = source[0..SCAN_LIMIT]
|
79
85
|
meta_tag_positions = find_meta_tag_positions(beginning_of_source)
|
@@ -81,26 +87,24 @@ module NewRelic
|
|
81
87
|
if insertion_index = find_insertion_index(meta_tag_positions, beginning_of_source, body_start)
|
82
88
|
source = source_injection(source, insertion_index, js_to_inject)
|
83
89
|
else
|
84
|
-
NewRelic::Agent.logger.debug(
|
90
|
+
NewRelic::Agent.logger.debug('Skipping RUM instrumentation. Could not properly determine location to ' \
|
91
|
+
'inject script.')
|
85
92
|
end
|
86
93
|
else
|
87
94
|
msg = "Skipping RUM instrumentation. Unable to find <body> tag in first #{SCAN_LIMIT} bytes of document."
|
88
95
|
NewRelic::Agent.logger.log_once(:warn, :rum_insertion_failure, msg)
|
89
96
|
NewRelic::Agent.logger.debug(msg)
|
90
97
|
end
|
91
|
-
|
92
98
|
source
|
93
|
-
rescue => e
|
94
|
-
NewRelic::Agent.logger.debug("Skipping RUM instrumentation on exception.", e)
|
95
|
-
nil
|
96
99
|
end
|
97
100
|
|
98
101
|
def html?(headers)
|
99
|
-
|
102
|
+
# needs else branch coverage
|
103
|
+
headers[CONTENT_TYPE] && headers[CONTENT_TYPE].include?(TEXT_HTML) # rubocop:disable Style/SafeNavigation
|
100
104
|
end
|
101
105
|
|
102
106
|
def attachment?(headers)
|
103
|
-
headers[CONTENT_DISPOSITION]
|
107
|
+
headers[CONTENT_DISPOSITION]&.include?(ATTACHMENT)
|
104
108
|
end
|
105
109
|
|
106
110
|
def streaming?(env, headers)
|
@@ -150,12 +154,12 @@ module NewRelic
|
|
150
154
|
|
151
155
|
def find_x_ua_compatible_position(beginning_of_source)
|
152
156
|
match = X_UA_COMPATIBLE_RE.match(beginning_of_source)
|
153
|
-
match
|
157
|
+
match&.end(0)
|
154
158
|
end
|
155
159
|
|
156
160
|
def find_charset_position(beginning_of_source)
|
157
161
|
match = CHARSET_RE.match(beginning_of_source)
|
158
|
-
match
|
162
|
+
match&.end(0)
|
159
163
|
end
|
160
164
|
|
161
165
|
def find_end_of_head_open(beginning_of_source)
|
@@ -8,7 +8,7 @@ require_relative 'helpers/send_deployment'
|
|
8
8
|
namespace :newrelic do
|
9
9
|
include SendDeployment
|
10
10
|
# notifies New Relic of a deployment
|
11
|
-
desc
|
11
|
+
desc 'Record a deployment in New Relic (newrelic.com)'
|
12
12
|
task :notice_deployment do
|
13
13
|
if fetch(:newrelic_role)
|
14
14
|
on roles(fetch(:newrelic_role)) do
|
@@ -5,9 +5,9 @@
|
|
5
5
|
make_notify_task = proc do
|
6
6
|
namespace(:newrelic) do
|
7
7
|
# on all deployments, notify New Relic
|
8
|
-
desc(
|
8
|
+
desc('Record a deployment in New Relic (newrelic.com)')
|
9
9
|
task(:notice_deployment, :roles => :app, :except => {:no_release => true}) do
|
10
|
-
rails_env = fetch(:newrelic_rails_env, fetch(:rails_env,
|
10
|
+
rails_env = fetch(:newrelic_rails_env, fetch(:rails_env, 'production'))
|
11
11
|
|
12
12
|
require 'new_relic/cli/command'
|
13
13
|
|
@@ -36,14 +36,14 @@ make_notify_task = proc do
|
|
36
36
|
:license_key => license_key
|
37
37
|
}
|
38
38
|
|
39
|
-
logger.debug(
|
39
|
+
logger.debug('Uploading deployment to New Relic')
|
40
40
|
deployment = NewRelic::Cli::Deployments.new(deploy_options)
|
41
41
|
deployment.run
|
42
|
-
logger.info(
|
42
|
+
logger.info('Uploaded deployment information to New Relic')
|
43
43
|
rescue NewRelic::Cli::Command::CommandFailure => e
|
44
44
|
logger.info(e.message)
|
45
45
|
rescue Capistrano::CommandError
|
46
|
-
logger.info(
|
46
|
+
logger.info('Unable to notify New Relic of the deployment... skipping')
|
47
47
|
rescue => e
|
48
48
|
logger.info("Error creating New Relic deployment (#{e})\n#{e.backtrace.join("\n")}")
|
49
49
|
end
|
@@ -51,7 +51,7 @@ make_notify_task = proc do
|
|
51
51
|
|
52
52
|
def lookup_changelog(changelog)
|
53
53
|
if !changelog
|
54
|
-
logger.debug(
|
54
|
+
logger.debug('Getting log of changes for New Relic Deployment details')
|
55
55
|
from_revision = source.next_revision(current_revision)
|
56
56
|
|
57
57
|
if scm == :git
|
@@ -5,9 +5,9 @@
|
|
5
5
|
module SendDeployment
|
6
6
|
def send_deployment_notification_to_newrelic
|
7
7
|
require 'new_relic/cli/command'
|
8
|
-
debug(
|
8
|
+
debug('Uploading deployment to New Relic')
|
9
9
|
NewRelic::Cli::Deployments.new(deploy_options).run
|
10
|
-
info(
|
10
|
+
info('Uploaded deployment information to New Relic')
|
11
11
|
rescue NewRelic::Cli::Command::CommandFailure => e
|
12
12
|
info(e.message)
|
13
13
|
rescue => e
|
@@ -34,7 +34,7 @@ module SendDeployment
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def fetch_environment
|
37
|
-
fetch(:newrelic_rails_env, fetch(:rack_env, fetch(:rails_env, fetch(:stage,
|
37
|
+
fetch(:newrelic_rails_env, fetch(:rack_env, fetch(:rails_env, fetch(:stage, 'production'))))
|
38
38
|
end
|
39
39
|
|
40
40
|
def fetch_rev
|
@@ -59,9 +59,9 @@ module SendDeployment
|
|
59
59
|
current_revision = fetch(:current_revision)
|
60
60
|
return unless current_revision && previous_revision
|
61
61
|
|
62
|
-
debug(
|
62
|
+
debug('Retrieving changelog for New Relic Deployment details')
|
63
63
|
|
64
|
-
if Rake::Task.task_defined?(
|
64
|
+
if Rake::Task.task_defined?('git:check')
|
65
65
|
log_command = "git --no-pager log --no-color --pretty=format:' * %an: %s' " +
|
66
66
|
"--abbrev-commit --no-merges #{previous_revision}..#{current_revision}"
|
67
67
|
`#{log_command}`
|
data/lib/new_relic/version.rb
CHANGED
data/lib/newrelic_rpm.rb
CHANGED
@@ -21,16 +21,16 @@ if defined?(Rails::VERSION)
|
|
21
21
|
module NewRelic
|
22
22
|
class Railtie < Rails::Railtie
|
23
23
|
if ENV['NEW_RELIC_DEFER_RAILS_INITIALIZATION']
|
24
|
-
initializer
|
24
|
+
initializer 'newrelic_rpm.include_method_tracers', before: :load_config_initializers do |app|
|
25
25
|
Module.send(:include, NewRelic::Agent::MethodTracer::ClassMethods)
|
26
26
|
Module.send(:include, NewRelic::Agent::MethodTracer)
|
27
27
|
end
|
28
28
|
|
29
|
-
initializer
|
29
|
+
initializer 'newrelic_rpm.start_plugin', after: :load_config_initializers do |app|
|
30
30
|
NewRelic::Control.instance.init_plugin(config: app.config)
|
31
31
|
end
|
32
32
|
else
|
33
|
-
initializer
|
33
|
+
initializer 'newrelic_rpm.start_plugin', before: :load_config_initializers do |app|
|
34
34
|
NewRelic::Control.instance.init_plugin(config: app.config)
|
35
35
|
end
|
36
36
|
end
|
@@ -32,7 +32,7 @@ module Sequel
|
|
32
32
|
module NewRelicInstrumentation
|
33
33
|
module Naming
|
34
34
|
def self.query_method_name
|
35
|
-
if Sequel::VERSION >=
|
35
|
+
if Sequel::VERSION >= '4.35.0'
|
36
36
|
:log_connection_yield
|
37
37
|
else
|
38
38
|
:log_yield
|
@@ -86,13 +86,13 @@ module Sequel
|
|
86
86
|
if THREAD_SAFE_CONNECTION_POOL_CLASSES.include?(self.pool.class)
|
87
87
|
self[sql].explain
|
88
88
|
else
|
89
|
-
NewRelic::Agent.logger.log_once(:info, :sequel_explain_skipped,
|
89
|
+
NewRelic::Agent.logger.log_once(:info, :sequel_explain_skipped, 'Not running SQL explains because Sequel is not in recognized multi-threaded mode')
|
90
90
|
nil
|
91
91
|
end
|
92
92
|
end
|
93
93
|
end
|
94
94
|
end # module NewRelicInstrumentation
|
95
95
|
|
96
|
-
NewRelic::Agent.logger.debug(
|
96
|
+
NewRelic::Agent.logger.debug('Registering the :new_relic_instrumentation extension.')
|
97
97
|
Database.register_extension(:new_relic_instrumentation, NewRelicInstrumentation)
|
98
98
|
end # module Sequel
|
data/lib/tasks/config.rake
CHANGED
@@ -7,9 +7,9 @@ include Format
|
|
7
7
|
|
8
8
|
namespace :newrelic do
|
9
9
|
namespace :config do
|
10
|
-
GENERAL =
|
11
|
-
DISABLING =
|
12
|
-
ATTRIBUTES =
|
10
|
+
GENERAL = 'general'
|
11
|
+
DISABLING = 'disabling'
|
12
|
+
ATTRIBUTES = 'attributes'
|
13
13
|
|
14
14
|
# these configuration options are not able to be set using environment variables
|
15
15
|
NON_ENV_CONFIGS = ['error_collector.ignore_classes', 'error_collector.ignore_messages', 'error_collector.expected_classes', 'error_collector.expected_messages']
|
@@ -18,21 +18,21 @@ namespace :newrelic do
|
|
18
18
|
GENERAL => 'These settings are available for agent configuration. Some settings depend on your New Relic subscription level.',
|
19
19
|
DISABLING => 'Use these settings to toggle instrumentation types during agent startup.',
|
20
20
|
ATTRIBUTES => '[Attributes](/docs/features/agent-attributes) are key-value pairs containing information that determines the properties of an event or transaction. These key-value pairs can be viewed within transaction traces in APM, traced errors in APM, transaction events in dashboards, and page views in dashboards. You can customize exactly which attributes will be sent to each of these destinations',
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
'transaction_tracer' => 'The [transaction traces](/docs/apm/traces/transaction-traces/transaction-traces) feature collects detailed information from a selection of transactions, including a summary of the calling sequence, a breakdown of time spent, and a list of SQL queries and their query plans (on mysql and postgresql). Available features depend on your New Relic subscription level.',
|
22
|
+
'error_collector' => "The agent collects and reports all uncaught exceptions by default. These configuration options allow you to customize the error collection.\n\nFor information on ignored and expected errors, [see this page on Error Analytics in APM](/docs/agents/manage-apm-agents/agent-data/manage-errors-apm-collect-ignore-or-mark-expected/). To set expected errors via the `NewRelic::Agent.notice_error` Ruby method, [consult the Ruby Agent API](/docs/agents/ruby-agent/api-guides/sending-handled-errors-new-relic/).",
|
23
|
+
'browser_monitoring' => "The browser monitoring [page load timing](/docs/browser/new-relic-browser/page-load-timing/page-load-timing-process) feature (sometimes referred to as real user monitoring or RUM) gives you insight into the performance real users are experiencing with your website. This is accomplished by measuring the time it takes for your users' browsers to download and render your web pages by injecting a small amount of JavaScript code into the header and footer of each page.",
|
24
|
+
'analytics_events' => '[New Relic dashboards](/docs/query-your-data/explore-query-data/dashboards/introduction-new-relic-one-dashboards) is a resource to gather and visualize data about your software and what it says about your business. With it you can quickly and easily create real-time dashboards to get immediate answers about end-user experiences, clickstreams, mobile activities, and server transactions.'
|
25
25
|
}
|
26
26
|
|
27
27
|
NAME_OVERRIDES = {
|
28
|
-
|
29
|
-
|
28
|
+
'slow_sql' => 'Slow SQL',
|
29
|
+
'custom_insights_events' => 'Custom Events'
|
30
30
|
}
|
31
31
|
|
32
|
-
desc
|
32
|
+
desc 'Describe available New Relic configuration settings'
|
33
33
|
task :docs, [:format] => [] do |t, args|
|
34
|
-
require File.expand_path(File.join(File.dirname(__FILE__),
|
35
|
-
format = args[:format] ||
|
34
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'new_relic', 'agent', 'configuration', 'default_source.rb'))
|
35
|
+
format = args[:format] || 'text'
|
36
36
|
output(format)
|
37
37
|
end
|
38
38
|
end
|