newrelic_rpm 9.0.0 → 9.2.2
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 +7 -81
- data/.rubocop_todo.yml +4 -43
- data/.simplecov +2 -1
- data/Brewfile +1 -0
- data/CHANGELOG.md +101 -2
- data/Gemfile +1 -1
- data/Guardfile +8 -7
- data/README.md +1 -2
- data/Rakefile +8 -8
- data/Thorfile +1 -1
- data/bin/newrelic +1 -0
- data/bin/newrelic_cmd +1 -0
- 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 +106 -118
- 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 +15 -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_merchant.rb +3 -3
- 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/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +3 -3
- data/lib/new_relic/agent/instrumentation/bunny.rb +1 -1
- 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/chain.rb +1 -0
- 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 +2 -2
- data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +4 -3
- data/lib/new_relic/agent/instrumentation/elasticsearch.rb +2 -2
- 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/fiber/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/fiber.rb +1 -1
- 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/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +3 -2
- data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +1 -1
- data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +1 -1
- data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +4 -4
- data/lib/new_relic/agent/instrumentation/grpc_client.rb +1 -1
- data/lib/new_relic/agent/instrumentation/grpc_server.rb +1 -1
- 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/dalli.rb +3 -1
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +2 -2
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +3 -1
- data/lib/new_relic/agent/instrumentation/memcache.rb +8 -8
- 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 +6 -6
- 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/sidekiq.rb +1 -0
- 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 +7 -7
- 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 -15
- 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 +2 -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 +9 -8
- data/lib/new_relic/agent/transaction/abstract_segment.rb +52 -46
- 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 +13 -14
- 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 +8 -2
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +1 -1
- data/lib/new_relic/agent/transaction.rb +43 -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 -15
- data/lib/new_relic/control/private_instance_methods.rb +1 -1
- data/lib/new_relic/dependency_detection.rb +14 -18
- 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 +2 -2
- 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 +4 -4
- 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/instrumentation_generator/instrumentation.thor +8 -8
- data/lib/tasks/instrumentation_generator/templates/chain.tt +1 -1
- data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +1 -1
- data/lib/tasks/multiverse.rb +13 -6
- data/lib/tasks/newrelic.rb +1 -0
- data/lib/tasks/tests.rake +6 -6
- data/newrelic.yml +5 -5
- data/newrelic_rpm.gemspec +13 -13
- data/test/agent_helper.rb +25 -24
- metadata +73 -4
- data/lib/new_relic/agent/range_extensions.rb +0 -27
@@ -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
|
@@ -1,10 +1,10 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
if ENV['CI']
|
6
6
|
namespace :coverage do
|
7
|
-
desc
|
7
|
+
desc 'Collates all result sets generated by the different test runners'
|
8
8
|
task :report do
|
9
9
|
require 'simplecov'
|
10
10
|
require 'fileutils'
|
@@ -19,10 +19,10 @@ if ENV['CI']
|
|
19
19
|
Dir['lib/coverage_{[!r][!e][!s][!u][!l][!t][!s]}*'].each { |dir| FileUtils.rm_rf(dir) }
|
20
20
|
end
|
21
21
|
|
22
|
-
desc
|
22
|
+
desc 'Removes all coverage_* directories'
|
23
23
|
task :clear do
|
24
24
|
require 'fileutils'
|
25
|
-
Dir[
|
25
|
+
Dir['lib/coverage_*'].each { |dir| FileUtils.rm_rf(dir) }
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
data/lib/tasks/helpers/format.rb
CHANGED
@@ -66,24 +66,24 @@ module Format
|
|
66
66
|
|
67
67
|
def format_description(value)
|
68
68
|
description = ''
|
69
|
-
description +=
|
69
|
+
description += '<b>DEPRECATED</b> ' if value[:deprecated]
|
70
70
|
description += value[:description]
|
71
71
|
description
|
72
72
|
end
|
73
73
|
|
74
74
|
def format_env_var(key)
|
75
|
-
return
|
75
|
+
return 'None' if NON_ENV_CONFIGS.include?(key)
|
76
76
|
|
77
|
-
"NEW_RELIC_#{key.tr(
|
77
|
+
"NEW_RELIC_#{key.tr('.', '_').upcase}"
|
78
78
|
end
|
79
79
|
|
80
80
|
def format_name(key)
|
81
81
|
name = NAME_OVERRIDES[key]
|
82
82
|
return name if name
|
83
83
|
|
84
|
-
key.split(
|
84
|
+
key.split('_')
|
85
85
|
.each { |fragment| fragment[0] = fragment[0].upcase }
|
86
|
-
.join(
|
86
|
+
.join(' ')
|
87
87
|
end
|
88
88
|
|
89
89
|
def format_sections(key, value)
|
@@ -98,7 +98,7 @@ module Format
|
|
98
98
|
|
99
99
|
def format_type(type)
|
100
100
|
if type == NewRelic::Agent::Configuration::Boolean
|
101
|
-
|
101
|
+
'Boolean'
|
102
102
|
else
|
103
103
|
type
|
104
104
|
end
|
@@ -110,11 +110,11 @@ module Format
|
|
110
110
|
end
|
111
111
|
|
112
112
|
def section_key(key, components)
|
113
|
-
if
|
113
|
+
if /^disable_/.match?(key) # "disable_httpclient"
|
114
114
|
DISABLING
|
115
|
-
elsif components.length >= 2 && !(components[1] ==
|
115
|
+
elsif components.length >= 2 && !(components[1] == 'attributes') # "analytics_events.enabled"
|
116
116
|
components.first
|
117
|
-
elsif components[1] ==
|
117
|
+
elsif components[1] == 'attributes' # "transaction_tracer.attributes.enabled"
|
118
118
|
ATTRIBUTES
|
119
119
|
else
|
120
120
|
GENERAL
|
@@ -11,21 +11,21 @@ module Removers
|
|
11
11
|
`echo "drop database #{database}" | mysql -u root`
|
12
12
|
end
|
13
13
|
rescue => error
|
14
|
-
puts
|
14
|
+
puts 'ERROR: Cannot get MySQL databases...'
|
15
15
|
puts error.message
|
16
16
|
end
|
17
17
|
|
18
18
|
def remove_generated_gemfiles
|
19
|
-
file_path = File.expand_path(
|
20
|
-
Dir.glob(File.join(file_path,
|
19
|
+
file_path = File.expand_path('test/multiverse/suites')
|
20
|
+
Dir.glob(File.join(file_path, '**', 'Gemfile*')).each do |fn|
|
21
21
|
puts "Removing #{fn.gsub(file_path, '.../suites')}"
|
22
22
|
FileUtils.rm(fn)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
26
|
def remove_generated_gemfile_lockfiles
|
27
|
-
file_path = File.expand_path(
|
28
|
-
Dir.glob(File.join(file_path,
|
27
|
+
file_path = File.expand_path('test/environments')
|
28
|
+
Dir.glob(File.join(file_path, '**', 'Gemfile.lock')).each do |fn|
|
29
29
|
puts "Removing #{fn.gsub(file_path, '.../environments')}"
|
30
30
|
FileUtils.rm(fn)
|
31
31
|
end
|
data/lib/tasks/install.rake
CHANGED
@@ -3,13 +3,13 @@
|
|
3
3
|
# frozen_string_literal: true
|
4
4
|
|
5
5
|
namespace :newrelic do
|
6
|
-
desc
|
6
|
+
desc 'Install a default config/newrelic.yml file'
|
7
7
|
task :install do
|
8
|
-
load File.expand_path(File.join(File.dirname(__FILE__),
|
8
|
+
load File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'install.rb'))
|
9
9
|
end
|
10
10
|
|
11
|
-
desc
|
11
|
+
desc 'Gratefulness is always appreciated'
|
12
12
|
task :thanks do
|
13
|
-
puts
|
13
|
+
puts 'The Ruby agent team is grateful to Jim Weirich for his kindness and his code. He will be missed.'
|
14
14
|
end
|
15
15
|
end
|
@@ -97,14 +97,14 @@ class Instrumentation < Thor
|
|
97
97
|
|
98
98
|
def config_block(name)
|
99
99
|
<<~CONFIG
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
100
|
+
:'instrumentation.#{name.downcase}' => {
|
101
|
+
:default => 'auto',
|
102
|
+
:public => true,
|
103
|
+
:type => String,
|
104
|
+
:dynamic_name => true,
|
105
|
+
:allowed_from_server => false,
|
106
|
+
:description => 'Controls auto-instrumentation of the #{name} library at start up. May be one of [auto|prepend|chain|disabled].'
|
107
|
+
},
|
108
108
|
CONFIG
|
109
109
|
end
|
110
110
|
|
@@ -23,7 +23,7 @@ DependencyDetection.defer do
|
|
23
23
|
if use_prepend?
|
24
24
|
prepend_instrument ::<%= @class_name %>, NewRelic::Agent::Instrumentation::<%= @class_name %>::Prepend
|
25
25
|
else
|
26
|
-
chain_instrument NewRelic::Agent::Instrumentation::<%= @class_name
|
26
|
+
chain_instrument NewRelic::Agent::Instrumentation::<%= @class_name %>::Chain
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
data/lib/tasks/multiverse.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# This file is distributed under New Relic's license terms.
|
2
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
3
|
# frozen_string_literal: true
|
4
|
+
|
4
5
|
#
|
5
6
|
# Rake task for running Ruby agent multiverse tests. This file may be required
|
6
7
|
# from third party gems. It is also used by the agent itself to run multiverse.
|
@@ -39,12 +40,14 @@ require_relative 'helpers/removers'
|
|
39
40
|
include Removers
|
40
41
|
|
41
42
|
namespace :test do
|
42
|
-
desc
|
43
|
+
desc 'Run functional test suite for New Relic'
|
43
44
|
task :multiverse, [:suite, :param1, :param2, :param3, :param4] => ['multiverse:env'] do |_, args|
|
44
45
|
Multiverse::Runner.run(args.suite, Multiverse::Runner.parse_args(args))
|
45
46
|
end
|
46
47
|
|
47
48
|
namespace :multiverse do
|
49
|
+
# task :prerequisites
|
50
|
+
|
48
51
|
task :env do
|
49
52
|
# ENV['SUITES_DIRECTORY'] = File.expand_path('../../test/multiverse/suites', __FILE__)
|
50
53
|
require File.expand_path('../../../test/multiverse/lib/multiverse', __FILE__)
|
@@ -56,22 +59,26 @@ namespace :test do
|
|
56
59
|
remove_generated_gemfile_lockfiles
|
57
60
|
end
|
58
61
|
|
59
|
-
desc
|
62
|
+
desc 'Clean cached gemfiles from Bundler.bundle_path'
|
60
63
|
task :clean_gemfile_cache do
|
61
64
|
glob = File.expand_path('multiverse-cache/Gemfile.*.lock', Bundler.bundle_path)
|
62
65
|
File.delete(*Dir[glob])
|
63
66
|
end
|
64
67
|
|
65
|
-
desc
|
68
|
+
desc 'Test the multiverse testing framework by executing tests in test/multiverse/test. Get meta with it.'
|
66
69
|
task :self, [:suite, :mode] do |_, args|
|
67
|
-
args.with_defaults(:suite =>
|
68
|
-
puts (
|
70
|
+
args.with_defaults(:suite => '', :mode => '')
|
71
|
+
puts ('Testing the multiverse testing framework...')
|
69
72
|
test_files = FileList['test/multiverse/test/*_test.rb']
|
70
|
-
ruby test_files.join(
|
73
|
+
ruby test_files.join(' ')
|
71
74
|
end
|
72
75
|
|
73
76
|
task :prime, [:suite] => [:env] do |_, args|
|
74
77
|
Multiverse::Runner.prime(args.suite, Multiverse::Runner.parse_args(args))
|
75
78
|
end
|
79
|
+
|
80
|
+
task :gem_manifest => :env do
|
81
|
+
Multiverse::GemManifest.new.report
|
82
|
+
end
|
76
83
|
end
|
77
84
|
end
|
data/lib/tasks/newrelic.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# This file is distributed under New Relic's license terms.
|
2
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
3
|
# frozen_string_literal: true
|
4
|
+
|
4
5
|
#
|
5
6
|
# If you are looking to instrument rake tasks in a Rails environment, but the
|
6
7
|
# task doesn't depend on :environment, this task may be included to ensure that
|
data/lib/tasks/tests.rake
CHANGED
@@ -13,19 +13,19 @@ end
|
|
13
13
|
if defined? Rake::TestTask
|
14
14
|
namespace :test do
|
15
15
|
tasks = Rake.application.top_level_tasks
|
16
|
-
ENV[
|
17
|
-
if tasks.any? { |t| t.include?(
|
18
|
-
ENV[
|
16
|
+
ENV['TESTOPTS'] ||= ''
|
17
|
+
if tasks.any? { |t| t.include?('verbose') }
|
18
|
+
ENV['TESTOPTS'] += ' -v'
|
19
19
|
end
|
20
20
|
if seed = look_for_seed(tasks)
|
21
|
-
ENV[
|
21
|
+
ENV['TESTOPTS'] += ' --' + seed
|
22
22
|
end
|
23
23
|
|
24
24
|
agent_home = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
|
25
25
|
|
26
26
|
Rake::TestTask.new(:newrelic) do |t|
|
27
|
-
file_pattern = ENV[
|
28
|
-
file_pattern = file_pattern.split(
|
27
|
+
file_pattern = ENV['file']
|
28
|
+
file_pattern = file_pattern.split(',').map { |f| "#{agent_home}/#{f}".gsub('//', '/') } if file_pattern
|
29
29
|
file_pattern ||= "#{agent_home}/test/new_relic/**/*_test.rb"
|
30
30
|
|
31
31
|
t.libs << "#{agent_home}/test"
|
data/newrelic.yml
CHANGED
@@ -352,7 +352,7 @@ common: &default_settings
|
|
352
352
|
|
353
353
|
# Controls auto-instrumentation of Excon at start up.
|
354
354
|
# May be one of [enabled|disabled].
|
355
|
-
# instrumentation.excon:
|
355
|
+
# instrumentation.excon: enabled
|
356
356
|
|
357
357
|
# Controls auto-instrumentation of Grape at start up.
|
358
358
|
# May be one of [auto|prepend|chain|disabled].
|
@@ -388,7 +388,7 @@ common: &default_settings
|
|
388
388
|
|
389
389
|
# Controls auto-instrumentation of Mongo at start up.
|
390
390
|
# May be one of [enabled|disabled].
|
391
|
-
# instrumentation.mongo:
|
391
|
+
# instrumentation.mongo: enabled
|
392
392
|
|
393
393
|
# Controls auto-instrumentation of Net::HTTP at start up.
|
394
394
|
# May be one of [auto|prepend|chain|disabled].
|
@@ -545,7 +545,7 @@ common: &default_settings
|
|
545
545
|
# slow_sql.enabled: false
|
546
546
|
|
547
547
|
# If true, the agent collects explain plans in slow SQL queries. If this setting
|
548
|
-
# is omitted, the transaction_tracer.
|
548
|
+
# is omitted, the transaction_tracer.explain_enabled setting will be applied as
|
549
549
|
# the default setting for explain plans in slow SQL as well.
|
550
550
|
# slow_sql.explain_enabled: false
|
551
551
|
|
@@ -639,13 +639,13 @@ common: &default_settings
|
|
639
639
|
# transaction_tracer.enabled: true
|
640
640
|
|
641
641
|
# Threshold (in seconds) above which the agent will collect explain plans.
|
642
|
-
# Relevant only when
|
642
|
+
# Relevant only when explain_enabled is true.
|
643
643
|
# transaction_tracer.explain_threshold: 0.5
|
644
644
|
|
645
645
|
# If true, enables the collection of explain plans in transaction traces.
|
646
646
|
# This setting will also apply to explain plans in slow SQL traces if
|
647
647
|
# slow_sql.explain enabled is not set separately.
|
648
|
-
# transaction_tracer.
|
648
|
+
# transaction_tracer.explain_enabled: true
|
649
649
|
|
650
650
|
# Maximum number of transaction trace nodes to record in a single transaction
|
651
651
|
# trace.
|