newrelic_rpm 9.0.0 → 9.2.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 +7 -81
- data/.rubocop_todo.yml +4 -43
- data/.simplecov +2 -1
- data/Brewfile +1 -0
- data/CHANGELOG.md +74 -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 +57 -80
- 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_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 +8 -7
- 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 +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 +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 +3 -3
- 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
@@ -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
|
@@ -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
|