newrelic_rpm 9.14.0 → 9.16.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.build_ignore +1 -0
- data/CHANGELOG.md +52 -4
- data/lib/new_relic/agent/aws.rb +3 -48
- data/lib/new_relic/agent/configuration/default_source.rb +211 -29
- data/lib/new_relic/agent/configuration/manager.rb +1 -1
- data/lib/new_relic/agent/database.rb +36 -0
- data/lib/new_relic/agent/instrumentation/active_record.rb +1 -8
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +1 -12
- data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger.rb +0 -2
- data/lib/new_relic/agent/instrumentation/active_support_logger.rb +0 -2
- data/lib/new_relic/agent/instrumentation/async_http.rb +1 -2
- data/lib/new_relic/agent/instrumentation/aws_sdk_lambda/chain.rb +33 -0
- data/lib/new_relic/agent/instrumentation/aws_sdk_lambda/instrumentation.rb +94 -0
- data/lib/new_relic/agent/instrumentation/aws_sdk_lambda/prepend.rb +23 -0
- data/lib/new_relic/agent/instrumentation/aws_sdk_lambda.rb +23 -0
- data/lib/new_relic/agent/instrumentation/aws_sqs.rb +0 -2
- data/lib/new_relic/agent/instrumentation/bunny.rb +3 -4
- data/lib/new_relic/agent/instrumentation/concurrent_ruby.rb +0 -2
- data/lib/new_relic/agent/instrumentation/curb.rb +3 -4
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +0 -4
- data/lib/new_relic/agent/instrumentation/dynamodb/instrumentation.rb +4 -11
- data/lib/new_relic/agent/instrumentation/dynamodb.rb +0 -2
- data/lib/new_relic/agent/instrumentation/elasticsearch.rb +0 -2
- data/lib/new_relic/agent/instrumentation/ethon.rb +0 -4
- data/lib/new_relic/agent/instrumentation/fiber.rb +0 -2
- data/lib/new_relic/agent/instrumentation/grape.rb +1 -3
- data/lib/new_relic/agent/instrumentation/httpclient.rb +0 -1
- data/lib/new_relic/agent/instrumentation/httprb.rb +0 -1
- data/lib/new_relic/agent/instrumentation/httpx.rb +0 -4
- data/lib/new_relic/agent/instrumentation/logger.rb +1 -3
- data/lib/new_relic/agent/instrumentation/logstasher.rb +0 -2
- data/lib/new_relic/agent/instrumentation/memcache.rb +0 -1
- data/lib/new_relic/agent/instrumentation/opensearch.rb +0 -2
- data/lib/new_relic/agent/instrumentation/padrino.rb +3 -3
- data/lib/new_relic/agent/instrumentation/rake.rb +0 -1
- data/lib/new_relic/agent/instrumentation/rdkafka/chain.rb +2 -1
- data/lib/new_relic/agent/instrumentation/rdkafka/prepend.rb +2 -1
- data/lib/new_relic/agent/instrumentation/rdkafka.rb +0 -2
- data/lib/new_relic/agent/instrumentation/redis.rb +0 -1
- data/lib/new_relic/agent/instrumentation/resque.rb +0 -4
- data/lib/new_relic/agent/instrumentation/roda.rb +4 -4
- data/lib/new_relic/agent/instrumentation/ruby_kafka/prepend.rb +14 -4
- data/lib/new_relic/agent/instrumentation/ruby_kafka.rb +0 -2
- data/lib/new_relic/agent/instrumentation/sinatra.rb +3 -6
- data/lib/new_relic/agent/instrumentation/thread.rb +0 -2
- data/lib/new_relic/agent/instrumentation/tilt.rb +0 -4
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +0 -1
- data/lib/new_relic/agent/instrumentation/view_component/instrumentation.rb +11 -8
- data/lib/new_relic/agent/instrumentation/view_component.rb +0 -2
- data/lib/new_relic/agent/log_event_aggregator.rb +28 -2
- data/lib/new_relic/agent/span_event_primitive.rb +4 -2
- data/lib/new_relic/control/frameworks/rails4.rb +1 -5
- data/lib/new_relic/dependency_detection.rb +10 -5
- data/lib/new_relic/environment_report.rb +1 -5
- data/lib/new_relic/helper.rb +15 -0
- data/lib/new_relic/language_support.rb +1 -5
- data/lib/new_relic/version.rb +1 -1
- data/lib/sequel/extensions/new_relic_instrumentation.rb +1 -1
- data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +9 -6
- data/newrelic.yml +116 -41
- data/test/agent_helper.rb +1 -1
- metadata +7 -3
@@ -0,0 +1,33 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative 'instrumentation'
|
6
|
+
|
7
|
+
module NewRelic::Agent::Instrumentation
|
8
|
+
module AwsSdkLambda::Chain
|
9
|
+
def self.instrument!
|
10
|
+
::Aws::Lambda::Client.class_eval do
|
11
|
+
include NewRelic::Agent::Instrumentation::AwsSdkLambda
|
12
|
+
|
13
|
+
alias_method(:invoke_without_new_relic, :invoke)
|
14
|
+
|
15
|
+
def invoke(*args)
|
16
|
+
invoke_with_new_relic(*args) { invoke_without_new_relic(*args) }
|
17
|
+
end
|
18
|
+
|
19
|
+
alias_method(:invoke_async_without_new_relic, :invoke_async)
|
20
|
+
|
21
|
+
def invoke_async(*args)
|
22
|
+
invoke_async_with_new_relic(*args) { invoke_async_without_new_relic(*args) }
|
23
|
+
end
|
24
|
+
|
25
|
+
alias_method(:invoke_with_response_stream_without_new_relic, :invoke_with_response_stream)
|
26
|
+
|
27
|
+
def invoke_with_response_stream(*args)
|
28
|
+
invoke_with_response_stream_with_new_relic(*args) { invoke_with_response_stream_without_new_relic(*args) }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require 'json'
|
6
|
+
|
7
|
+
module NewRelic::Agent::Instrumentation
|
8
|
+
module AwsSdkLambda
|
9
|
+
INSTRUMENTATION_NAME = 'aws_sdk_lambda'
|
10
|
+
AWS_SERVICE = 'lambda'
|
11
|
+
CLOUD_PLATFORM = 'aws_lambda'
|
12
|
+
WRAPPED_RESPONSE = Struct.new(:status_code, :has_status_code?)
|
13
|
+
|
14
|
+
def invoke_with_new_relic(*args)
|
15
|
+
with_tracing(:invoke, *args) { yield }
|
16
|
+
end
|
17
|
+
|
18
|
+
def invoke_async_with_new_relic(*args)
|
19
|
+
with_tracing(:invoke_async, *args) { yield }
|
20
|
+
end
|
21
|
+
|
22
|
+
def invoke_with_response_stream_with_new_relic(*args)
|
23
|
+
with_tracing(:invoke_with_response_stream, *args) { yield }
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def with_tracing(action, *args)
|
29
|
+
segment = generate_segment(action, *args)
|
30
|
+
|
31
|
+
# prevent additional instrumentation for things like Net::HTTP from
|
32
|
+
# creating any segments that may appear as redundant / confusing
|
33
|
+
NewRelic::Agent.disable_all_tracing do
|
34
|
+
response = NewRelic::Agent::Tracer.capture_segment_error(segment) { yield }
|
35
|
+
process_response(response, segment)
|
36
|
+
response
|
37
|
+
end
|
38
|
+
ensure
|
39
|
+
segment&.finish
|
40
|
+
end
|
41
|
+
|
42
|
+
def process_response(response, segment)
|
43
|
+
process_function_error(response) if response.respond_to?(:function_error)
|
44
|
+
rescue => e
|
45
|
+
NewRelic::Agent.logger.error("Error processing aws-sdk-lambda invocation response: #{e}")
|
46
|
+
end
|
47
|
+
|
48
|
+
# notice error that was raised / unhandled by the function
|
49
|
+
def process_function_error(response)
|
50
|
+
function_error = response.function_error
|
51
|
+
return unless function_error
|
52
|
+
|
53
|
+
msg = "[#{function_error}]"
|
54
|
+
payload = response.payload&.string if response.respond_to?(:payload)
|
55
|
+
payload_hash = JSON.parse(payload) if payload
|
56
|
+
msg = "#{msg} #{payload_hash['errorType']} - #{payload_hash['errorMessage']}" if payload_hash
|
57
|
+
e = StandardError.new(msg)
|
58
|
+
e.set_backtrace(payload_hash['stackTrace']) if payload_hash
|
59
|
+
|
60
|
+
NewRelic::Agent.notice_error(e)
|
61
|
+
end
|
62
|
+
|
63
|
+
def generate_segment(action, options = {})
|
64
|
+
function = function_name(options)
|
65
|
+
region = aws_region
|
66
|
+
account_id = aws_account_id
|
67
|
+
arn = aws_arn(function, region)
|
68
|
+
segment = NewRelic::Agent::Tracer.start_segment(name: "Lambda/#{action}/#{function}")
|
69
|
+
segment.add_agent_attribute('cloud.account.id', account_id)
|
70
|
+
segment.add_agent_attribute('cloud.platform', CLOUD_PLATFORM)
|
71
|
+
segment.add_agent_attribute('cloud.region', region)
|
72
|
+
segment.add_agent_attribute('cloud.resource_id', arn) if arn
|
73
|
+
segment
|
74
|
+
end
|
75
|
+
|
76
|
+
def function_name(options = {})
|
77
|
+
(options.fetch(:function_name, nil) if options.respond_to?(:fetch)) || NewRelic::UNKNOWN
|
78
|
+
end
|
79
|
+
|
80
|
+
def aws_account_id
|
81
|
+
return unless self.respond_to?(:config)
|
82
|
+
|
83
|
+
config&.account_id || NewRelic::Agent.config[:'cloud.aws.account_id']
|
84
|
+
end
|
85
|
+
|
86
|
+
def aws_region
|
87
|
+
config&.region if self.respond_to?(:config)
|
88
|
+
end
|
89
|
+
|
90
|
+
def aws_arn(function, region)
|
91
|
+
NewRelic::Agent::Aws.create_arn(AWS_SERVICE, "function:#{function}", region)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative 'instrumentation'
|
6
|
+
|
7
|
+
module NewRelic::Agent::Instrumentation
|
8
|
+
module AwsSdkLambda::Prepend
|
9
|
+
include NewRelic::Agent::Instrumentation::AwsSdkLambda
|
10
|
+
|
11
|
+
def invoke(*args)
|
12
|
+
invoke_with_new_relic(*args) { super }
|
13
|
+
end
|
14
|
+
|
15
|
+
def invoke_async(*args)
|
16
|
+
invoke_async_with_new_relic(*args) { super }
|
17
|
+
end
|
18
|
+
|
19
|
+
def invoke_with_response_stream(*args)
|
20
|
+
invoke_with_response_stream_with_new_relic(*args) { super }
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
DependencyDetection.defer do
|
6
|
+
named :aws_sdk_lambda
|
7
|
+
|
8
|
+
depends_on do
|
9
|
+
defined?(Aws::Lambda::Client)
|
10
|
+
end
|
11
|
+
|
12
|
+
executes do
|
13
|
+
require_relative 'aws_sdk_lambda/instrumentation'
|
14
|
+
|
15
|
+
if use_prepend?
|
16
|
+
require_relative 'aws_sdk_lambda/prepend'
|
17
|
+
prepend_instrument Aws::Lambda::Client, NewRelic::Agent::Instrumentation::AwsSdkLambda::Prepend
|
18
|
+
else
|
19
|
+
require_relative 'aws_sdk_lambda/chain'
|
20
|
+
chain_instrument NewRelic::Agent::Instrumentation::AwsSdkLambda::Chain
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -14,7 +14,6 @@ DependencyDetection.defer do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
executes do
|
17
|
-
NewRelic::Agent.logger.info('Installing Bunny instrumentation')
|
18
17
|
require 'new_relic/agent/distributed_tracing/cross_app_tracing'
|
19
18
|
require 'new_relic/agent/messaging'
|
20
19
|
require 'new_relic/agent/transaction/message_broker_segment'
|
@@ -22,9 +21,9 @@ DependencyDetection.defer do
|
|
22
21
|
|
23
22
|
executes do
|
24
23
|
if use_prepend?
|
25
|
-
prepend_instrument Bunny::Exchange, NewRelic::Agent::Instrumentation::Bunny::Prepend::Exchange
|
26
|
-
prepend_instrument Bunny::Queue, NewRelic::Agent::Instrumentation::Bunny::Prepend::Queue
|
27
|
-
prepend_instrument Bunny::Consumer, NewRelic::Agent::Instrumentation::Bunny::Prepend::Consumer
|
24
|
+
prepend_instrument Bunny::Exchange, NewRelic::Agent::Instrumentation::Bunny::Prepend::Exchange, 'Bunny::Exchange'
|
25
|
+
prepend_instrument Bunny::Queue, NewRelic::Agent::Instrumentation::Bunny::Prepend::Queue, 'Bunny::Queue'
|
26
|
+
prepend_instrument Bunny::Consumer, NewRelic::Agent::Instrumentation::Bunny::Prepend::Consumer, 'Bunny::Consumer'
|
28
27
|
else
|
29
28
|
chain_instrument NewRelic::Agent::Instrumentation::Bunny::Chain
|
30
29
|
end
|
@@ -16,8 +16,6 @@ DependencyDetection.defer do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
executes do
|
19
|
-
NewRelic::Agent.logger.info('Installing concurrent-ruby instrumentation')
|
20
|
-
|
21
19
|
if use_prepend?
|
22
20
|
prepend_instrument(Concurrent::ThreadPoolExecutor, NewRelic::Agent::Instrumentation::ConcurrentRuby::Prepend)
|
23
21
|
|
@@ -16,17 +16,16 @@ DependencyDetection.defer do
|
|
16
16
|
end
|
17
17
|
|
18
18
|
executes do
|
19
|
-
NewRelic::Agent.logger.info('Installing Curb instrumentation')
|
20
19
|
require 'new_relic/agent/distributed_tracing/cross_app_tracing'
|
21
20
|
require 'new_relic/agent/http_clients/curb_wrappers'
|
22
21
|
end
|
23
22
|
|
24
23
|
executes do
|
25
24
|
if use_prepend?
|
26
|
-
prepend_instrument Curl::Easy, NewRelic::Agent::Instrumentation::Curb::Easy::Prepend
|
27
|
-
prepend_instrument Curl::Multi, NewRelic::Agent::Instrumentation::Curb::Multi::Prepend
|
25
|
+
prepend_instrument Curl::Easy, NewRelic::Agent::Instrumentation::Curb::Easy::Prepend, 'Curb::Easy'
|
26
|
+
prepend_instrument Curl::Multi, NewRelic::Agent::Instrumentation::Curb::Multi::Prepend, 'Curb::Multi'
|
28
27
|
else
|
29
|
-
chain_instrument NewRelic::Agent::Instrumentation::Curb::Chain
|
28
|
+
chain_instrument NewRelic::Agent::Instrumentation::Curb::Chain, NewRelic::Agent::Instrumentation::Curb::Multi::INSTRUMENTATION_NAME
|
30
29
|
end
|
31
30
|
end
|
32
31
|
end
|
@@ -82,10 +82,6 @@ DependencyDetection.defer do
|
|
82
82
|
defined?(Delayed) && defined?(Delayed::Worker)
|
83
83
|
end
|
84
84
|
|
85
|
-
executes do
|
86
|
-
NewRelic::Agent.logger.info('Installing DelayedJob instrumentation [part 1/2]')
|
87
|
-
end
|
88
|
-
|
89
85
|
executes do
|
90
86
|
if use_prepend?
|
91
87
|
prepend_instrument Delayed::Worker, NewRelic::Agent::Instrumentation::DelayedJob::Prepend
|
@@ -31,9 +31,8 @@ module NewRelic::Agent::Instrumentation
|
|
31
31
|
collection: args[0][:table_name]
|
32
32
|
)
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
# segment&.add_agent_attribute('cloud.resource_id', arn) if arn
|
34
|
+
arn = get_arn(args[0])
|
35
|
+
segment&.add_agent_attribute('cloud.resource_id', arn) if arn
|
37
36
|
|
38
37
|
@nr_captured_request = nil # clear request just in case
|
39
38
|
begin
|
@@ -50,16 +49,10 @@ module NewRelic::Agent::Instrumentation
|
|
50
49
|
@nr_captured_request = yield
|
51
50
|
end
|
52
51
|
|
53
|
-
def nr_account_id
|
54
|
-
return @nr_account_id if defined?(@nr_account_id)
|
55
|
-
|
56
|
-
@nr_account_id = NewRelic::Agent::Aws.get_account_id(config)
|
57
|
-
end
|
58
|
-
|
59
52
|
def get_arn(params)
|
60
|
-
return unless params[:table_name]
|
53
|
+
return unless params[:table_name]
|
61
54
|
|
62
|
-
NewRelic::Agent::Aws.create_arn(PRODUCT.downcase, "table/#{params[:table_name]}", config&.region
|
55
|
+
NewRelic::Agent::Aws.create_arn(PRODUCT.downcase, "table/#{params[:table_name]}", config&.region)
|
63
56
|
end
|
64
57
|
end
|
65
58
|
end
|
@@ -14,8 +14,6 @@ DependencyDetection.defer do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
executes do
|
17
|
-
NewRelic::Agent.logger.info('Installing Elasticsearch instrumentation')
|
18
|
-
|
19
17
|
to_instrument = if Gem::Version.create(Elasticsearch::VERSION) < Gem::Version.create('8.0.0')
|
20
18
|
Elasticsearch::Transport::Client
|
21
19
|
else
|
@@ -21,10 +21,6 @@ DependencyDetection.defer do
|
|
21
21
|
defined?(Ethon) && Gem::Version.new(Ethon::VERSION) >= Gem::Version.new('0.12.0')
|
22
22
|
end
|
23
23
|
|
24
|
-
executes do
|
25
|
-
NewRelic::Agent.logger.info('Installing ethon instrumentation')
|
26
|
-
end
|
27
|
-
|
28
24
|
executes do
|
29
25
|
if use_prepend?
|
30
26
|
# NOTE: by default prepend_instrument will go with the module name that
|
@@ -19,9 +19,7 @@ DependencyDetection.defer do
|
|
19
19
|
|
20
20
|
depends_on do
|
21
21
|
begin
|
22
|
-
if
|
23
|
-
((Bundler.rubygems.respond_to?(:installed_specs) && Bundler.rubygems.installed_specs.map(&:name).include?('newrelic-grape')) ||
|
24
|
-
Bundler.rubygems.all_specs.map(&:name).include?('newrelic-grape'))
|
22
|
+
if NewRelic::Helper.rubygems_specs.map(&:name).include?('newrelic-grape')
|
25
23
|
NewRelic::Agent.logger.info('Not installing New Relic supported Grape instrumentation because the third party newrelic-grape gem is present')
|
26
24
|
false
|
27
25
|
else
|
@@ -13,10 +13,6 @@ DependencyDetection.defer do
|
|
13
13
|
defined?(HTTPX) && Gem::Version.new(HTTPX::VERSION) >= Gem::Version.new('1.0.0')
|
14
14
|
end
|
15
15
|
|
16
|
-
executes do
|
17
|
-
NewRelic::Agent.logger.info('Installing httpx instrumentation')
|
18
|
-
end
|
19
|
-
|
20
16
|
executes do
|
21
17
|
if use_prepend?
|
22
18
|
prepend_instrument HTTPX::Session, NewRelic::Agent::Instrumentation::HTTPX::Prepend
|
@@ -15,12 +15,10 @@ DependencyDetection.defer do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
executes do
|
18
|
-
NewRelic::Agent.logger.info('Installing Logger instrumentation')
|
19
|
-
|
20
18
|
if use_prepend?
|
21
19
|
prepend_instrument Logger, NewRelic::Agent::Instrumentation::Logger::Prepend
|
22
20
|
else
|
23
|
-
chain_instrument NewRelic::Agent::Instrumentation::Logger
|
21
|
+
chain_instrument NewRelic::Agent::Instrumentation::Logger, NewRelic::Agent::Instrumentation::Logger::INSTRUMENTATION_NAME
|
24
22
|
end
|
25
23
|
end
|
26
24
|
end
|
@@ -74,7 +74,6 @@ DependencyDetection.defer do
|
|
74
74
|
depends_on { NewRelic::Agent::Instrumentation::Memcache::DalliCAS.should_instrument? }
|
75
75
|
|
76
76
|
executes do
|
77
|
-
NewRelic::Agent.logger.info('Installing Dalli CAS Client Memcache instrumentation')
|
78
77
|
if use_prepend?
|
79
78
|
prepend_module = NewRelic::Agent::Instrumentation::Memcache::Prepend
|
80
79
|
prepend_module.dalli_cas_prependers do |client_class, instrumenting_module|
|
@@ -14,8 +14,6 @@ DependencyDetection.defer do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
executes do
|
17
|
-
NewRelic::Agent.logger.info('Installing opensearch-ruby instrumentation')
|
18
|
-
|
19
17
|
if use_prepend?
|
20
18
|
prepend_instrument OpenSearch::Transport::Client, NewRelic::Agent::Instrumentation::OpenSearch::Prepend
|
21
19
|
else
|
@@ -22,11 +22,11 @@ DependencyDetection.defer do
|
|
22
22
|
depends_on { defined?(Padrino) && defined?(Padrino::Routing::InstanceMethods) }
|
23
23
|
|
24
24
|
executes do
|
25
|
-
NewRelic::Agent
|
25
|
+
supportability_name = NewRelic::Agent::Instrumentation::Padrino::INSTRUMENTATION_NAME
|
26
26
|
if use_prepend?
|
27
|
-
prepend_instrument Padrino::Application, NewRelic::Agent::Instrumentation::PadrinoTracer::Prepend
|
27
|
+
prepend_instrument Padrino::Application, NewRelic::Agent::Instrumentation::PadrinoTracer::Prepend, supportability_name
|
28
28
|
else
|
29
|
-
chain_instrument NewRelic::Agent::Instrumentation::PadrinoTracer::Chain
|
29
|
+
chain_instrument NewRelic::Agent::Instrumentation::PadrinoTracer::Chain, supportability_name
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -17,7 +17,6 @@ DependencyDetection.defer do
|
|
17
17
|
depends_on { NewRelic::Agent::Instrumentation::Rake.safe_from_third_party_gem? }
|
18
18
|
|
19
19
|
executes do
|
20
|
-
NewRelic::Agent.logger.info('Installing Rake instrumentation')
|
21
20
|
NewRelic::Agent.logger.debug("Instrumenting Rake tasks: #{NewRelic::Agent.config[:'rake.tasks']}")
|
22
21
|
end
|
23
22
|
|
@@ -40,7 +40,8 @@ module NewRelic::Agent::Instrumentation
|
|
40
40
|
alias_method(:producer_without_new_relic, :producer)
|
41
41
|
alias_method(:consumer_without_new_relic, :consumer)
|
42
42
|
|
43
|
-
if Gem::Version.new(::Rdkafka::VERSION) >= Gem::Version.new('0.16.0')
|
43
|
+
if Gem::Version.new(::Rdkafka::VERSION) >= Gem::Version.new('0.16.0') ||
|
44
|
+
(Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.7.0'))
|
44
45
|
def producer(**kwargs)
|
45
46
|
producer_without_new_relic(**kwargs).tap do |producer|
|
46
47
|
set_nr_config(producer)
|
@@ -36,7 +36,8 @@ module NewRelic::Agent::Instrumentation
|
|
36
36
|
module Prepend
|
37
37
|
include NewRelic::Agent::Instrumentation::RdkafkaConfig
|
38
38
|
|
39
|
-
if defined?(::Rdkafka) && Gem::Version.new(::Rdkafka::VERSION) >= Gem::Version.new('0.16.0')
|
39
|
+
if (defined?(::Rdkafka) && Gem::Version.new(::Rdkafka::VERSION) >= Gem::Version.new('0.16.0')) ||
|
40
|
+
(Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.7.0'))
|
40
41
|
def producer(**kwargs)
|
41
42
|
super.tap do |producer|
|
42
43
|
set_nr_config(producer)
|
@@ -31,7 +31,6 @@ DependencyDetection.defer do
|
|
31
31
|
end
|
32
32
|
|
33
33
|
executes do
|
34
|
-
NewRelic::Agent.logger.info('Installing Redis Instrumentation')
|
35
34
|
if NewRelic::Agent::Instrumentation::Redis::Constants::HAS_REDIS_CLIENT
|
36
35
|
RedisClient.register(NewRelic::Agent::Instrumentation::RedisClient::Middleware)
|
37
36
|
|
@@ -18,10 +18,6 @@ DependencyDetection.defer do
|
|
18
18
|
defined?(Airbrake) && defined?(Airbrake::AIRBRAKE_VERSION) && Gem::Version.create(Airbrake::AIRBRAKE_VERSION) < Gem::Version.create('11.0.3')
|
19
19
|
end
|
20
20
|
|
21
|
-
executes do
|
22
|
-
NewRelic::Agent.logger.info('Installing Resque instrumentation')
|
23
|
-
end
|
24
|
-
|
25
21
|
executes do
|
26
22
|
if NewRelic::Agent.config[:'resque.use_ruby_dns'] && NewRelic::Agent.config[:dispatcher] == :resque
|
27
23
|
NewRelic::Agent.logger.info('Requiring resolv-replace')
|
@@ -20,15 +20,15 @@ DependencyDetection.defer do
|
|
20
20
|
require_relative '../../rack/agent_hooks'
|
21
21
|
require_relative '../../rack/browser_monitoring'
|
22
22
|
|
23
|
-
NewRelic::Agent.logger.info('Installing Roda instrumentation')
|
24
|
-
|
25
23
|
if use_prepend?
|
26
24
|
require_relative 'roda/prepend'
|
27
|
-
|
25
|
+
|
26
|
+
supportability_name = NewRelic::Agent::Instrumentation::Roda::Tracer::INSTRUMENTATION_NAME
|
27
|
+
prepend_instrument Roda.singleton_class, NewRelic::Agent::Instrumentation::Roda::Build::Prepend, supportability_name
|
28
28
|
prepend_instrument Roda, NewRelic::Agent::Instrumentation::Roda::Prepend
|
29
29
|
else
|
30
30
|
require_relative 'roda/chain'
|
31
|
-
chain_instrument NewRelic::Agent::Instrumentation::Roda::Build::Chain
|
31
|
+
chain_instrument NewRelic::Agent::Instrumentation::Roda::Build::Chain, supportability_name
|
32
32
|
chain_instrument NewRelic::Agent::Instrumentation::Roda::Chain
|
33
33
|
end
|
34
34
|
Roda.class_eval { extend NewRelic::Agent::Instrumentation::Roda::Ignorer }
|
@@ -20,10 +20,20 @@ module NewRelic::Agent::Instrumentation
|
|
20
20
|
module Prepend
|
21
21
|
include NewRelic::Agent::Instrumentation::RubyKafka
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('3')
|
24
|
+
def each_message(**args)
|
25
|
+
super do |message|
|
26
|
+
each_message_with_new_relic(message) do
|
27
|
+
yield(message)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
else
|
32
|
+
def each_message(*args)
|
33
|
+
super do |message|
|
34
|
+
each_message_with_new_relic(message) do
|
35
|
+
yield(message)
|
36
|
+
end
|
27
37
|
end
|
28
38
|
end
|
29
39
|
end
|
@@ -14,8 +14,6 @@ DependencyDetection.defer do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
executes do
|
17
|
-
NewRelic::Agent.logger.info('Installing ruby-kafka instrumentation')
|
18
|
-
|
19
17
|
if use_prepend?
|
20
18
|
prepend_instrument Kafka::Producer, NewRelic::Agent::Instrumentation::RubyKafkaProducer::Prepend
|
21
19
|
prepend_instrument Kafka::Consumer, NewRelic::Agent::Instrumentation::RubyKafkaConsumer::Prepend
|
@@ -16,10 +16,6 @@ DependencyDetection.defer do
|
|
16
16
|
depends_on { Sinatra::Base.private_method_defined?(:process_route) }
|
17
17
|
depends_on { Sinatra::Base.private_method_defined?(:route_eval) }
|
18
18
|
|
19
|
-
executes do
|
20
|
-
NewRelic::Agent.logger.info('Installing Sinatra instrumentation')
|
21
|
-
end
|
22
|
-
|
23
19
|
executes do
|
24
20
|
if use_prepend?
|
25
21
|
prepend_instrument Sinatra::Base, NewRelic::Agent::Instrumentation::Sinatra::Prepend
|
@@ -32,14 +28,15 @@ DependencyDetection.defer do
|
|
32
28
|
end
|
33
29
|
|
34
30
|
executes do
|
31
|
+
supportability_name = NewRelic::Agent::Instrumentation::Sinatra::Tracer::INSTRUMENTATION_NAME
|
35
32
|
# These requires are inside an executes block because they require rack, and
|
36
33
|
# we can't be sure that rack is available when this file is first required.
|
37
34
|
require 'new_relic/rack/agent_hooks'
|
38
35
|
require 'new_relic/rack/browser_monitoring'
|
39
36
|
if use_prepend?
|
40
|
-
prepend_instrument Sinatra::Base.singleton_class, NewRelic::Agent::Instrumentation::Sinatra::Build::Prepend
|
37
|
+
prepend_instrument Sinatra::Base.singleton_class, NewRelic::Agent::Instrumentation::Sinatra::Build::Prepend, supportability_name
|
41
38
|
else
|
42
|
-
chain_instrument NewRelic::Agent::Instrumentation::Sinatra::Build::Chain
|
39
|
+
chain_instrument NewRelic::Agent::Instrumentation::Sinatra::Build::Chain, supportability_name
|
43
40
|
end
|
44
41
|
end
|
45
42
|
end
|
@@ -11,10 +11,6 @@ DependencyDetection.defer do
|
|
11
11
|
|
12
12
|
depends_on { defined?(Tilt) }
|
13
13
|
|
14
|
-
executes do
|
15
|
-
NewRelic::Agent.logger.info('Installing Tilt instrumentation')
|
16
|
-
end
|
17
|
-
|
18
14
|
executes do
|
19
15
|
if use_prepend?
|
20
16
|
prepend_instrument Tilt::Template, NewRelic::Agent::Instrumentation::Tilt::Prepend
|
@@ -10,12 +10,7 @@ module NewRelic::Agent::Instrumentation
|
|
10
10
|
NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
11
11
|
|
12
12
|
begin
|
13
|
-
segment = NewRelic::Agent::Tracer.start_segment(
|
14
|
-
name: metric_name(
|
15
|
-
self.class.respond_to?(:identifier) ? self.class.identifier : nil,
|
16
|
-
self.class.name
|
17
|
-
)
|
18
|
-
)
|
13
|
+
segment = NewRelic::Agent::Tracer.start_segment(name: metric_name)
|
19
14
|
yield
|
20
15
|
rescue => e
|
21
16
|
NewRelic::Agent.notice_error(e)
|
@@ -25,8 +20,16 @@ module NewRelic::Agent::Instrumentation
|
|
25
20
|
end
|
26
21
|
end
|
27
22
|
|
28
|
-
def metric_name
|
29
|
-
|
23
|
+
def metric_name
|
24
|
+
# ViewComponent determines a component's identifier differently depending on the version
|
25
|
+
# https://github.com/ViewComponent/view_component/pull/2153
|
26
|
+
component_identifier = defined?(self.class.source_location) ? self.class.source_location : self.class.identifier
|
27
|
+
|
28
|
+
"View/#{metric_path(component_identifier)}/#{self.class.name}"
|
29
|
+
rescue => e
|
30
|
+
NewRelic::Agent.logger.error('Error identifying View Component metric name', e)
|
31
|
+
|
32
|
+
'View/component'
|
30
33
|
end
|
31
34
|
|
32
35
|
def metric_path(identifier)
|