newrelic_rpm 9.9.0 → 9.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.build_ignore +1 -0
- data/CHANGELOG.md +463 -1
- data/CONTRIBUTING.md +2 -2
- data/README.md +16 -17
- data/Rakefile +1 -1
- data/lib/boot/strap.rb +102 -0
- data/lib/new_relic/agent/agent.rb +6 -0
- data/lib/new_relic/agent/agent_helpers/connect.rb +3 -0
- data/lib/new_relic/agent/agent_helpers/harvest.rb +3 -0
- data/lib/new_relic/agent/agent_helpers/shutdown.rb +3 -0
- data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +1 -0
- data/lib/new_relic/agent/agent_helpers/startup.rb +7 -0
- data/lib/new_relic/agent/agent_logger.rb +1 -0
- data/lib/new_relic/agent/aws.rb +68 -0
- data/lib/new_relic/agent/configuration/default_source.rb +603 -105
- data/lib/new_relic/agent/configuration/environment_source.rb +5 -1
- data/lib/new_relic/agent/configuration/manager.rb +28 -2
- data/lib/new_relic/agent/configuration/yaml_source.rb +7 -2
- data/lib/new_relic/agent/database/obfuscation_helpers.rb +11 -11
- data/lib/new_relic/agent/database/obfuscator.rb +1 -0
- data/lib/new_relic/agent/database.rb +41 -1
- data/lib/new_relic/agent/database_adapter.rb +1 -1
- data/lib/new_relic/agent/datastores/redis.rb +1 -1
- data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +1 -1
- data/lib/new_relic/agent/distributed_tracing.rb +4 -2
- data/lib/new_relic/agent/error_collector.rb +37 -10
- data/lib/new_relic/agent/external.rb +2 -0
- data/lib/new_relic/agent/health_check.rb +136 -0
- data/lib/new_relic/agent/http_clients/uri_util.rb +1 -1
- data/lib/new_relic/agent/instrumentation/action_dispatch.rb +1 -1
- data/lib/new_relic/agent/instrumentation/action_dispatch_subscriber.rb +1 -1
- data/lib/new_relic/agent/instrumentation/action_mailbox.rb +1 -1
- data/lib/new_relic/agent/instrumentation/action_mailer.rb +1 -1
- data/lib/new_relic/agent/instrumentation/active_job.rb +1 -1
- data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +6 -2
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +0 -13
- data/lib/new_relic/agent/instrumentation/active_record.rb +7 -12
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +7 -3
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +11 -9
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +2 -2
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +9 -16
- 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 +2 -3
- data/lib/new_relic/agent/instrumentation/aws_sdk_firehose/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/aws_sdk_firehose/instrumentation.rb +66 -0
- data/lib/new_relic/agent/instrumentation/aws_sdk_firehose/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/aws_sdk_firehose.rb +22 -0
- data/lib/new_relic/agent/instrumentation/aws_sdk_kinesis/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/aws_sdk_kinesis/instrumentation.rb +91 -0
- data/lib/new_relic/agent/instrumentation/aws_sdk_kinesis/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/aws_sdk_kinesis.rb +22 -0
- data/lib/new_relic/agent/instrumentation/aws_sdk_lambda/chain.rb +33 -0
- data/lib/new_relic/agent/instrumentation/aws_sdk_lambda/instrumentation.rb +93 -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/chain.rb +37 -0
- data/lib/new_relic/agent/instrumentation/aws_sqs/instrumentation.rb +67 -0
- data/lib/new_relic/agent/instrumentation/aws_sqs/prepend.rb +21 -0
- data/lib/new_relic/agent/instrumentation/aws_sqs.rb +23 -0
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +14 -0
- data/lib/new_relic/agent/instrumentation/bunny.rb +3 -4
- data/lib/new_relic/agent/instrumentation/concurrent_ruby.rb +1 -3
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +4 -0
- data/lib/new_relic/agent/instrumentation/curb.rb +4 -5
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +0 -23
- data/lib/new_relic/agent/instrumentation/dynamodb/chain.rb +27 -0
- data/lib/new_relic/agent/instrumentation/dynamodb/instrumentation.rb +64 -0
- data/lib/new_relic/agent/instrumentation/dynamodb/prepend.rb +19 -0
- data/lib/new_relic/agent/instrumentation/dynamodb.rb +23 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +1 -2
- data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +53 -7
- data/lib/new_relic/agent/instrumentation/elasticsearch.rb +1 -3
- data/lib/new_relic/agent/instrumentation/ethon.rb +1 -5
- data/lib/new_relic/agent/instrumentation/excon.rb +1 -17
- data/lib/new_relic/agent/instrumentation/fiber/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +1 -1
- data/lib/new_relic/agent/instrumentation/fiber.rb +0 -2
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +0 -3
- data/lib/new_relic/agent/instrumentation/grape.rb +1 -1
- data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +0 -1
- data/lib/new_relic/agent/instrumentation/httpclient.rb +1 -5
- data/lib/new_relic/agent/instrumentation/httprb.rb +0 -1
- data/lib/new_relic/agent/instrumentation/httpx/instrumentation.rb +1 -1
- data/lib/new_relic/agent/instrumentation/httpx.rb +1 -5
- data/lib/new_relic/agent/instrumentation/logger.rb +1 -3
- data/lib/new_relic/agent/instrumentation/logstasher/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/logstasher/instrumentation.rb +24 -0
- data/lib/new_relic/agent/instrumentation/logstasher/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/logstasher.rb +25 -0
- data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +1 -1
- data/lib/new_relic/agent/instrumentation/memcache/helper.rb +2 -2
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +1 -1
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +1 -1
- data/lib/new_relic/agent/instrumentation/memcache.rb +0 -1
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +1 -1
- data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +3 -3
- data/lib/new_relic/agent/instrumentation/net_http.rb +2 -1
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +0 -2
- data/lib/new_relic/agent/instrumentation/opensearch/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/opensearch/instrumentation.rb +66 -0
- data/lib/{tasks/instrumentation_generator/templates/instrumentation.tt → new_relic/agent/instrumentation/opensearch/prepend.rb} +4 -4
- data/lib/new_relic/agent/instrumentation/opensearch.rb +23 -0
- data/lib/new_relic/agent/instrumentation/padrino.rb +3 -3
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +3 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +9 -5
- data/lib/new_relic/agent/instrumentation/rake.rb +1 -2
- data/lib/new_relic/agent/instrumentation/rdkafka/chain.rb +72 -0
- data/lib/new_relic/agent/instrumentation/rdkafka/instrumentation.rb +70 -0
- data/lib/new_relic/agent/instrumentation/rdkafka/prepend.rb +67 -0
- data/lib/new_relic/agent/instrumentation/rdkafka.rb +25 -0
- data/lib/new_relic/agent/instrumentation/redis/cluster_middleware.rb +26 -0
- data/lib/new_relic/agent/instrumentation/redis/constants.rb +2 -2
- data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +14 -11
- data/lib/new_relic/agent/instrumentation/redis/middleware.rb +3 -0
- data/lib/new_relic/agent/instrumentation/redis.rb +11 -5
- data/lib/new_relic/agent/instrumentation/resque.rb +8 -6
- data/lib/new_relic/agent/instrumentation/roda.rb +5 -5
- data/lib/new_relic/agent/instrumentation/ruby_kafka/chain.rb +55 -0
- data/lib/new_relic/agent/instrumentation/ruby_kafka/instrumentation.rb +67 -0
- data/lib/new_relic/agent/instrumentation/ruby_kafka/prepend.rb +60 -0
- data/lib/new_relic/agent/instrumentation/ruby_kafka.rb +25 -0
- data/lib/new_relic/agent/instrumentation/ruby_openai.rb +2 -2
- data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delay_extensions.rb +24 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +2 -2
- data/lib/new_relic/agent/instrumentation/sidekiq.rb +9 -15
- data/lib/new_relic/agent/instrumentation/sinatra.rb +3 -19
- data/lib/new_relic/agent/instrumentation/stripe.rb +1 -1
- data/lib/new_relic/agent/instrumentation/stripe_subscriber.rb +22 -1
- 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/instrumentation.rb +2 -2
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +0 -1
- data/lib/new_relic/agent/instrumentation/view_component/instrumentation.rb +11 -5
- data/lib/new_relic/agent/instrumentation/view_component.rb +0 -2
- data/lib/new_relic/agent/javascript_instrumentor.rb +2 -3
- data/lib/new_relic/agent/llm/chat_completion_summary.rb +1 -1
- data/lib/new_relic/agent/llm/embedding.rb +1 -1
- data/lib/new_relic/agent/local_log_decorator.rb +20 -3
- data/lib/new_relic/agent/log_event_aggregator.rb +119 -28
- data/lib/new_relic/agent/logging.rb +1 -1
- data/lib/new_relic/agent/messaging.rb +16 -5
- data/lib/new_relic/agent/method_tracer.rb +3 -0
- data/lib/new_relic/agent/monitors/inbound_request_monitor.rb +1 -1
- data/lib/new_relic/agent/monitors/synthetics_monitor.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 +8 -2
- data/lib/new_relic/agent/opentelemetry/context/propagation/trace_propagator.rb +66 -0
- data/lib/new_relic/agent/opentelemetry/context/propagation.rb +15 -0
- data/lib/{tasks/instrumentation_generator/templates/Envfile.tt → new_relic/agent/opentelemetry/context.rb} +9 -5
- data/lib/new_relic/agent/opentelemetry/trace/span.rb +31 -0
- data/lib/new_relic/agent/opentelemetry/trace/tracer.rb +129 -0
- data/lib/new_relic/agent/opentelemetry/trace/tracer_provider.rb +18 -0
- data/lib/new_relic/agent/opentelemetry/trace.rb +15 -0
- data/lib/new_relic/agent/opentelemetry/transaction_patch.rb +69 -0
- data/lib/new_relic/agent/opentelemetry_bridge.rb +32 -0
- data/lib/new_relic/agent/parameter_filtering.rb +1 -1
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +1 -1
- data/lib/new_relic/agent/samplers/memory_sampler.rb +1 -1
- data/lib/new_relic/agent/serverless_handler.rb +247 -12
- data/lib/new_relic/agent/serverless_handler_event_sources.json +155 -0
- data/lib/new_relic/agent/serverless_handler_event_sources.rb +49 -0
- data/lib/new_relic/agent/span_event_primitive.rb +16 -11
- data/lib/new_relic/agent/system_info.rb +14 -0
- data/lib/new_relic/agent/threading/backtrace_node.rb +10 -1
- data/lib/new_relic/agent/tracer.rb +1 -1
- data/lib/new_relic/agent/transaction/abstract_segment.rb +2 -1
- data/lib/new_relic/agent/transaction/datastore_segment.rb +1 -1
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +3 -3
- data/lib/new_relic/agent/transaction/external_request_segment.rb +0 -10
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +4 -1
- data/lib/new_relic/agent/transaction/request_attributes.rb +14 -7
- data/lib/new_relic/agent/transaction/trace_context.rb +34 -5
- data/lib/new_relic/agent/transaction/tracing.rb +3 -3
- data/lib/new_relic/agent/transaction.rb +4 -7
- data/lib/new_relic/agent/transaction_time_aggregator.rb +1 -1
- data/lib/new_relic/agent/utilization/ecs.rb +22 -0
- data/lib/new_relic/agent/utilization/ecs_v4.rb +22 -0
- data/lib/new_relic/agent/utilization_data.rb +40 -5
- data/lib/new_relic/agent/vm/c_ruby_vm.rb +3 -3
- data/lib/new_relic/agent.rb +124 -2
- data/lib/new_relic/constants.rb +1 -0
- data/lib/new_relic/control/frameworks/grape.rb +14 -0
- data/lib/new_relic/control/frameworks/padrino.rb +14 -0
- data/lib/new_relic/control/frameworks/rails4.rb +1 -3
- data/lib/new_relic/control/instance_methods.rb +6 -0
- data/lib/new_relic/control/instrumentation.rb +1 -1
- data/lib/new_relic/control/private_instance_methods.rb +4 -0
- data/lib/new_relic/control/security_interface.rb +57 -0
- data/lib/new_relic/control.rb +1 -1
- data/lib/new_relic/dependency_detection.rb +11 -14
- data/lib/new_relic/environment_report.rb +2 -2
- data/lib/new_relic/helper.rb +22 -0
- data/lib/new_relic/language_support.rb +3 -1
- data/lib/new_relic/local_environment.rb +1 -4
- data/lib/new_relic/rack/browser_monitoring.rb +20 -8
- data/lib/new_relic/version.rb +1 -1
- data/lib/sequel/extensions/new_relic_instrumentation.rb +3 -2
- data/lib/tasks/config.rake +7 -3
- data/lib/tasks/gha.rake +31 -0
- data/lib/tasks/helpers/config.html.erb +3 -2
- data/lib/tasks/helpers/format.rb +1 -1
- data/lib/tasks/helpers/newrelicyml.rb +80 -13
- data/newrelic.yml +425 -162
- data/newrelic_rpm.gemspec +3 -1
- data/test/agent_helper.rb +24 -2
- metadata +91 -22
- data/lib/tasks/instrumentation_generator/README.md +0 -63
- data/lib/tasks/instrumentation_generator/TODO.md +0 -33
- data/lib/tasks/instrumentation_generator/instrumentation.thor +0 -121
- data/lib/tasks/instrumentation_generator/templates/chain.tt +0 -21
- data/lib/tasks/instrumentation_generator/templates/chain_method.tt +0 -7
- data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +0 -29
- data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +0 -3
- data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +0 -19
- data/lib/tasks/instrumentation_generator/templates/prepend.tt +0 -13
- data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +0 -3
- data/lib/tasks/instrumentation_generator/templates/test.tt +0 -15
@@ -0,0 +1,67 @@
|
|
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 RdkafkaProducer
|
9
|
+
module Prepend
|
10
|
+
include NewRelic::Agent::Instrumentation::Rdkafka
|
11
|
+
|
12
|
+
def produce(**kwargs)
|
13
|
+
produce_with_new_relic(kwargs) do |headers|
|
14
|
+
kwargs[:headers] = headers
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
module RdkafkaConsumer
|
22
|
+
module Prepend
|
23
|
+
include NewRelic::Agent::Instrumentation::Rdkafka
|
24
|
+
|
25
|
+
def each
|
26
|
+
super do |message|
|
27
|
+
each_with_new_relic(message) do
|
28
|
+
yield(message)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
module RdkafkaConfig
|
36
|
+
module Prepend
|
37
|
+
include NewRelic::Agent::Instrumentation::RdkafkaConfig
|
38
|
+
|
39
|
+
if (defined?(::Rdkafka) && NewRelic::Helper.version_satisfied?(::Rdkafka::VERSION, '>=', '0.16.0')) ||
|
40
|
+
NewRelic::Helper.version_satisfied?(RUBY_VERSION, '>=', '2.7.0')
|
41
|
+
def producer(**kwargs)
|
42
|
+
super.tap do |producer|
|
43
|
+
set_nr_config(producer)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def consumer(**kwargs)
|
48
|
+
super.tap do |consumer|
|
49
|
+
set_nr_config(consumer)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
else # older versions
|
53
|
+
def producer
|
54
|
+
super.tap do |producer|
|
55
|
+
set_nr_config(producer)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def consumer
|
60
|
+
super.tap do |consumer|
|
61
|
+
set_nr_config(consumer)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,25 @@
|
|
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 :rdkafka
|
7
|
+
|
8
|
+
depends_on do
|
9
|
+
defined?(Rdkafka)
|
10
|
+
end
|
11
|
+
|
12
|
+
executes do
|
13
|
+
require_relative 'rdkafka/instrumentation'
|
14
|
+
require_relative 'rdkafka/chain'
|
15
|
+
require_relative 'rdkafka/prepend'
|
16
|
+
|
17
|
+
if use_prepend?
|
18
|
+
prepend_instrument Rdkafka::Config, NewRelic::Agent::Instrumentation::RdkafkaConfig::Prepend
|
19
|
+
prepend_instrument Rdkafka::Producer, NewRelic::Agent::Instrumentation::RdkafkaProducer::Prepend
|
20
|
+
prepend_instrument Rdkafka::Consumer, NewRelic::Agent::Instrumentation::RdkafkaConsumer::Prepend
|
21
|
+
else
|
22
|
+
chain_instrument NewRelic::Agent::Instrumentation::Rdkafka::Chain
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
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
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module RedisClient
|
7
|
+
module ClusterMiddleware
|
8
|
+
include NewRelic::Agent::Instrumentation::Redis
|
9
|
+
|
10
|
+
# Until we decide to move our Redis instrumentation entirely off patches
|
11
|
+
# keep the middleware instrumentation for the call and connect methods
|
12
|
+
# limited to the redis-clustering instrumentation.
|
13
|
+
#
|
14
|
+
# Redis's middleware option does not capture errors as high in the stack
|
15
|
+
# as our patches. Leaving the patches for call and connect on the main
|
16
|
+
# Redis gem limits the feature disparity our customers experience.
|
17
|
+
def call(*args, &block)
|
18
|
+
call_with_tracing(args[0]) { super }
|
19
|
+
end
|
20
|
+
|
21
|
+
def connect(*args, &block)
|
22
|
+
connect_with_tracing { super }
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -6,12 +6,12 @@ module NewRelic::Agent::Instrumentation::Redis
|
|
6
6
|
class Constants
|
7
7
|
PRODUCT_NAME = 'Redis'
|
8
8
|
CONNECT = 'connect'
|
9
|
-
UNKNOWN =
|
9
|
+
UNKNOWN = NewRelic::UNKNOWN_LOWER
|
10
10
|
LOCALHOST = 'localhost'
|
11
11
|
MULTI_OPERATION = 'multi'
|
12
12
|
PIPELINE_OPERATION = 'pipeline'
|
13
13
|
HAS_REDIS_CLIENT = defined?(::Redis) &&
|
14
|
-
|
14
|
+
NewRelic::Helper.version_satisfied?(::Redis::VERSION, '>=', '5.0.0') &&
|
15
15
|
!defined?(::RedisClient).nil?
|
16
16
|
end
|
17
17
|
end
|
@@ -9,14 +9,14 @@ module NewRelic::Agent::Instrumentation
|
|
9
9
|
INSTRUMENTATION_NAME = NewRelic::Agent.base_name(name)
|
10
10
|
|
11
11
|
def connect_with_tracing
|
12
|
-
with_tracing(Constants::CONNECT, database:
|
12
|
+
with_tracing(Constants::CONNECT, database: _nr_db) { yield }
|
13
13
|
end
|
14
14
|
|
15
15
|
def call_with_tracing(command, &block)
|
16
16
|
operation = command[0]
|
17
17
|
statement = ::NewRelic::Agent::Datastores::Redis.format_command(command)
|
18
18
|
|
19
|
-
with_tracing(operation, statement: statement, database:
|
19
|
+
with_tracing(operation, statement: statement, database: _nr_db) { yield }
|
20
20
|
end
|
21
21
|
|
22
22
|
# Used for Redis 4.x and 3.x
|
@@ -24,22 +24,15 @@ module NewRelic::Agent::Instrumentation
|
|
24
24
|
operation = pipeline.is_a?(::Redis::Pipeline::Multi) ? Constants::MULTI_OPERATION : Constants::PIPELINE_OPERATION
|
25
25
|
statement = ::NewRelic::Agent::Datastores::Redis.format_pipeline_commands(pipeline.commands)
|
26
26
|
|
27
|
-
with_tracing(operation, statement: statement, database:
|
27
|
+
with_tracing(operation, statement: statement, database: _nr_db) { yield }
|
28
28
|
end
|
29
29
|
|
30
30
|
# Used for Redis 5.x+
|
31
31
|
def call_pipelined_with_tracing(pipeline)
|
32
|
-
db = begin
|
33
|
-
_nr_redis_client_config.db
|
34
|
-
rescue StandardError => e
|
35
|
-
NewRelic::Agent.logger.error("Failed to determine configured Redis db value: #{e.class} - #{e.message}")
|
36
|
-
nil
|
37
|
-
end
|
38
|
-
|
39
32
|
operation = pipeline.flatten.include?('MULTI') ? Constants::MULTI_OPERATION : Constants::PIPELINE_OPERATION
|
40
33
|
statement = ::NewRelic::Agent::Datastores::Redis.format_pipeline_commands(pipeline)
|
41
34
|
|
42
|
-
with_tracing(operation, statement: statement, database:
|
35
|
+
with_tracing(operation, statement: statement, database: _nr_db) { yield }
|
43
36
|
end
|
44
37
|
|
45
38
|
private
|
@@ -94,5 +87,15 @@ module NewRelic::Agent::Instrumentation
|
|
94
87
|
config
|
95
88
|
end
|
96
89
|
end
|
90
|
+
|
91
|
+
def _nr_db
|
92
|
+
# db is a method on the Redis client in versions < 5.x
|
93
|
+
return db if respond_to?(:db)
|
94
|
+
# db is accessible through the RedisClient::Config object in versions > 5.x
|
95
|
+
return _nr_redis_client_config.db if _nr_redis_client_config.respond_to?(:db)
|
96
|
+
rescue StandardError => e
|
97
|
+
NewRelic::Agent.logger.debug("Failed to determine configured Redis db value: #{e.class} - #{e.message}")
|
98
|
+
nil
|
99
|
+
end
|
97
100
|
end
|
98
101
|
end
|
@@ -6,6 +6,9 @@ module NewRelic::Agent::Instrumentation
|
|
6
6
|
module RedisClient
|
7
7
|
module Middleware
|
8
8
|
# This module is used to instrument Redis 5.x+
|
9
|
+
#
|
10
|
+
# It only instruments call_pipelined because connect and call are accessed
|
11
|
+
# too late in the stack to capture all errors
|
9
12
|
include NewRelic::Agent::Instrumentation::Redis
|
10
13
|
|
11
14
|
def call_pipelined(*args, &block)
|
@@ -10,6 +10,7 @@ require_relative 'redis/chain'
|
|
10
10
|
require_relative 'redis/constants'
|
11
11
|
require_relative 'redis/prepend'
|
12
12
|
require_relative 'redis/middleware'
|
13
|
+
require_relative 'redis/cluster_middleware'
|
13
14
|
|
14
15
|
DependencyDetection.defer do
|
15
16
|
# Why not :redis? newrelic-redis used that name, so avoid conflicting
|
@@ -30,15 +31,20 @@ DependencyDetection.defer do
|
|
30
31
|
end
|
31
32
|
|
32
33
|
executes do
|
33
|
-
NewRelic::Agent.logger.info('Installing Redis Instrumentation')
|
34
34
|
if NewRelic::Agent::Instrumentation::Redis::Constants::HAS_REDIS_CLIENT
|
35
35
|
RedisClient.register(NewRelic::Agent::Instrumentation::RedisClient::Middleware)
|
36
|
+
|
37
|
+
if defined?(Redis::Cluster::Client)
|
38
|
+
RedisClient.register(NewRelic::Agent::Instrumentation::RedisClient::ClusterMiddleware)
|
39
|
+
end
|
36
40
|
end
|
37
41
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
+
unless defined?(Redis::Cluster::Client)
|
43
|
+
if use_prepend?
|
44
|
+
prepend_instrument Redis::Client, NewRelic::Agent::Instrumentation::Redis::Prepend
|
45
|
+
else
|
46
|
+
chain_instrument NewRelic::Agent::Instrumentation::Redis::Chain
|
47
|
+
end
|
42
48
|
end
|
43
49
|
end
|
44
50
|
end
|
@@ -15,15 +15,17 @@ DependencyDetection.defer do
|
|
15
15
|
|
16
16
|
# Airbrake uses method chaining on Resque::Job on versions < 11.0.3
|
17
17
|
conflicts_with_prepend do
|
18
|
-
defined?(Airbrake) && defined?(Airbrake::AIRBRAKE_VERSION) &&
|
18
|
+
defined?(Airbrake) && defined?(Airbrake::AIRBRAKE_VERSION) && NewRelic::Helper.version_satisfied?(Airbrake::AIRBRAKE_VERSION, '<', '11.0.3')
|
19
19
|
end
|
20
20
|
|
21
21
|
executes do
|
22
|
-
NewRelic::Agent.
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
if NewRelic::Agent.config[:'resque.use_ruby_dns'] &&
|
23
|
+
NewRelic::Agent.config[:dispatcher] == :resque &&
|
24
|
+
# resolv-replace is no longer part of the language in Ruby 3.4.
|
25
|
+
# we don't believe this lib is still necessary for Ruby 3.4 users.
|
26
|
+
# however, if we receive customer feedback to the contrary, we can find
|
27
|
+
# an alternate approach.
|
28
|
+
NewRelic::Helper.version_satisfied?(RUBY_VERSION, '<', '3.4')
|
27
29
|
NewRelic::Agent.logger.info('Requiring resolv-replace')
|
28
30
|
require 'resolv'
|
29
31
|
require 'resolv-replace'
|
@@ -11,7 +11,7 @@ DependencyDetection.defer do
|
|
11
11
|
|
12
12
|
depends_on do
|
13
13
|
defined?(Roda) &&
|
14
|
-
|
14
|
+
NewRelic::Helper.version_satisfied?(Roda::RodaVersion, '>=', '3.19.0') &&
|
15
15
|
Roda::RodaPlugins::Base::ClassMethods.private_method_defined?(:build_rack_app) &&
|
16
16
|
Roda::RodaPlugins::Base::InstanceMethods.method_defined?(:_roda_handle_main_route)
|
17
17
|
end
|
@@ -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 }
|
@@ -0,0 +1,55 @@
|
|
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
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module RubyKafka::Chain
|
7
|
+
def self.instrument!
|
8
|
+
::Kafka::Producer.class_eval do
|
9
|
+
include NewRelic::Agent::Instrumentation::RubyKafka
|
10
|
+
|
11
|
+
alias_method(:produce_without_new_relic, :produce)
|
12
|
+
|
13
|
+
def produce(value, **kwargs)
|
14
|
+
produce_with_new_relic(value, **kwargs) do |headers|
|
15
|
+
kwargs[:headers] = headers
|
16
|
+
produce_without_new_relic(value, **kwargs)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
::Kafka::Consumer.class_eval do
|
22
|
+
include NewRelic::Agent::Instrumentation::RubyKafka
|
23
|
+
|
24
|
+
alias_method(:each_message_without_new_relic, :each_message)
|
25
|
+
|
26
|
+
def each_message(*args)
|
27
|
+
each_message_without_new_relic(*args) do |message|
|
28
|
+
each_message_with_new_relic(message) do
|
29
|
+
yield(message)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
::Kafka::Client.class_eval do
|
36
|
+
include NewRelic::Agent::Instrumentation::RubyKafkaConfig
|
37
|
+
|
38
|
+
alias_method(:producer_without_new_relic, :producer)
|
39
|
+
alias_method(:consumer_without_new_relic, :consumer)
|
40
|
+
|
41
|
+
def producer(**kwargs)
|
42
|
+
producer_without_new_relic(**kwargs).tap do |producer|
|
43
|
+
set_nr_config(producer)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def consumer(**kwargs)
|
48
|
+
consumer_without_new_relic(**kwargs).tap do |consumer|
|
49
|
+
set_nr_config(consumer)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,67 @@
|
|
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 'new_relic/agent/messaging'
|
6
|
+
|
7
|
+
module NewRelic::Agent::Instrumentation
|
8
|
+
module RubyKafka
|
9
|
+
MESSAGING_LIBRARY = 'Kafka'
|
10
|
+
PRODUCE = 'Produce'
|
11
|
+
CONSUME = 'Consume'
|
12
|
+
|
13
|
+
INSTRUMENTATION_NAME = 'ruby-kafka'
|
14
|
+
|
15
|
+
def produce_with_new_relic(value, **kwargs)
|
16
|
+
NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
17
|
+
|
18
|
+
topic_name = kwargs[:topic]
|
19
|
+
segment = NewRelic::Agent::Tracer.start_message_broker_segment(
|
20
|
+
action: :produce,
|
21
|
+
library: MESSAGING_LIBRARY,
|
22
|
+
destination_type: :topic,
|
23
|
+
destination_name: topic_name
|
24
|
+
)
|
25
|
+
create_kafka_metrics(action: PRODUCE, topic: topic_name)
|
26
|
+
|
27
|
+
headers = kwargs[:headers] || {}
|
28
|
+
::NewRelic::Agent::DistributedTracing.insert_distributed_trace_headers(headers)
|
29
|
+
|
30
|
+
NewRelic::Agent::Tracer.capture_segment_error(segment) { yield(headers) }
|
31
|
+
ensure
|
32
|
+
segment&.finish
|
33
|
+
end
|
34
|
+
|
35
|
+
def each_message_with_new_relic(message)
|
36
|
+
NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
37
|
+
|
38
|
+
headers = message&.headers || {}
|
39
|
+
topic_name = message&.topic
|
40
|
+
|
41
|
+
NewRelic::Agent::Messaging.wrap_message_broker_consume_transaction(
|
42
|
+
library: MESSAGING_LIBRARY,
|
43
|
+
destination_type: :topic,
|
44
|
+
destination_name: topic_name,
|
45
|
+
headers: headers,
|
46
|
+
action: :consume
|
47
|
+
) do
|
48
|
+
create_kafka_metrics(action: CONSUME, topic: topic_name)
|
49
|
+
yield
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def create_kafka_metrics(action:, topic:)
|
54
|
+
@nr_config.each do |seed_broker|
|
55
|
+
host = "#{seed_broker&.host}:#{seed_broker&.port}"
|
56
|
+
NewRelic::Agent.record_metric("MessageBroker/Kafka/Nodes/#{host}/#{action}/#{topic}", 1)
|
57
|
+
NewRelic::Agent.record_metric("MessageBroker/Kafka/Nodes/#{host}", 1)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
module RubyKafkaConfig
|
63
|
+
def set_nr_config(producer_or_consumer)
|
64
|
+
producer_or_consumer.instance_variable_set(:@nr_config, @seed_brokers)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,60 @@
|
|
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
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module RubyKafkaProducer
|
7
|
+
module Prepend
|
8
|
+
include NewRelic::Agent::Instrumentation::RubyKafka
|
9
|
+
|
10
|
+
def produce(value, **kwargs)
|
11
|
+
produce_with_new_relic(value, **kwargs) do |headers|
|
12
|
+
kwargs[:headers] = headers
|
13
|
+
super
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module RubyKafkaConsumer
|
20
|
+
module Prepend
|
21
|
+
include NewRelic::Agent::Instrumentation::RubyKafka
|
22
|
+
|
23
|
+
if NewRelic::Helper.version_satisfied?(RUBY_VERSION, '>=', '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
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
module RubyKafkaClient
|
44
|
+
module Prepend
|
45
|
+
include NewRelic::Agent::Instrumentation::RubyKafkaConfig
|
46
|
+
|
47
|
+
def producer(**kwargs)
|
48
|
+
super.tap do |producer|
|
49
|
+
set_nr_config(producer)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def consumer(**kwargs)
|
54
|
+
super.tap do |consumer|
|
55
|
+
set_nr_config(consumer)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,25 @@
|
|
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 'ruby_kafka/instrumentation'
|
6
|
+
require_relative 'ruby_kafka/chain'
|
7
|
+
require_relative 'ruby_kafka/prepend'
|
8
|
+
|
9
|
+
DependencyDetection.defer do
|
10
|
+
named :'ruby_kafka'
|
11
|
+
|
12
|
+
depends_on do
|
13
|
+
defined?(Kafka)
|
14
|
+
end
|
15
|
+
|
16
|
+
executes do
|
17
|
+
if use_prepend?
|
18
|
+
prepend_instrument Kafka::Producer, NewRelic::Agent::Instrumentation::RubyKafkaProducer::Prepend
|
19
|
+
prepend_instrument Kafka::Consumer, NewRelic::Agent::Instrumentation::RubyKafkaConsumer::Prepend
|
20
|
+
prepend_instrument Kafka::Client, NewRelic::Agent::Instrumentation::RubyKafkaClient::Prepend
|
21
|
+
else
|
22
|
+
chain_instrument NewRelic::Agent::Instrumentation::RubyKafka::Chain
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -12,13 +12,13 @@ DependencyDetection.defer do
|
|
12
12
|
depends_on do
|
13
13
|
NewRelic::Agent.config[:'ai_monitoring.enabled'] &&
|
14
14
|
defined?(OpenAI) && defined?(OpenAI::Client) &&
|
15
|
-
|
15
|
+
NewRelic::Helper.version_satisfied?(OpenAI::VERSION, '>=', '3.4.0')
|
16
16
|
end
|
17
17
|
|
18
18
|
executes do
|
19
19
|
if use_prepend?
|
20
20
|
# TODO: Remove condition when we drop support for versions below 5.0.0
|
21
|
-
if
|
21
|
+
if NewRelic::Helper.version_satisfied?(OpenAI::VERSION, '>=', '5.0.0')
|
22
22
|
prepend_instrument OpenAI::Client,
|
23
23
|
NewRelic::Agent::Instrumentation::OpenAI::Prepend,
|
24
24
|
NewRelic::Agent::Instrumentation::OpenAI::VENDOR
|
@@ -0,0 +1,24 @@
|
|
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
|
+
if defined?(Sidekiq::DelayExtensions)
|
6
|
+
class Sidekiq::DelayExtensions::GenericJob
|
7
|
+
def newrelic_trace_args(msg, queue)
|
8
|
+
(target, method_name, *) = ::Sidekiq::DelayExtensions::YAML.unsafe_load(msg['args'][0])
|
9
|
+
|
10
|
+
if target.is_a?(String)
|
11
|
+
target = target.constantize
|
12
|
+
end
|
13
|
+
|
14
|
+
{
|
15
|
+
:name => method_name,
|
16
|
+
:class_name => target.class.name,
|
17
|
+
:category => 'OtherTransaction/SidekiqJob'
|
18
|
+
}
|
19
|
+
rescue => e
|
20
|
+
NewRelic::Agent.logger.error('Failure during deserializing YAML for Sidekiq::DelayExtensions::GenericJob', e)
|
21
|
+
NewRelic::Agent::Instrumentation::Sidekiq::Server.default_trace_args(msg)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -6,9 +6,9 @@
|
|
6
6
|
# Delayed extensions are disabled by default in Sidekiq 5 and 6 and
|
7
7
|
# were removed entirely in Sidekiq 7.
|
8
8
|
#
|
9
|
-
# see https://github.com/
|
9
|
+
# see https://github.com/sidekiq/sidekiq/issues/5076 for the discussion
|
10
10
|
# of the removal, which includes mentions of alternatives
|
11
|
-
if defined?(Sidekiq::VERSION) && Sidekiq::VERSION < '7.0.0'
|
11
|
+
if defined?(Sidekiq::VERSION) && NewRelic::Helper.version_satisfied?(Sidekiq::VERSION, '<', '7.0.0')
|
12
12
|
class Sidekiq::Extensions::DelayedClass
|
13
13
|
def newrelic_trace_args(msg, queue)
|
14
14
|
(target, method_name, _args) = if YAML.respond_to?(:unsafe_load)
|
@@ -5,6 +5,7 @@
|
|
5
5
|
require_relative 'sidekiq/client'
|
6
6
|
require_relative 'sidekiq/server'
|
7
7
|
require_relative 'sidekiq/extensions/delayed_class'
|
8
|
+
require_relative 'sidekiq/extensions/delay_extensions'
|
8
9
|
|
9
10
|
DependencyDetection.defer do
|
10
11
|
@name = :sidekiq
|
@@ -29,7 +30,14 @@ DependencyDetection.defer do
|
|
29
30
|
chain.add(NewRelic::Agent::Instrumentation::Sidekiq::Client)
|
30
31
|
end
|
31
32
|
config.server_middleware do |chain|
|
32
|
-
|
33
|
+
# We started prepending v chaining NR middleware in 9.18.0 in response to:
|
34
|
+
# https://github.com/newrelic/newrelic-ruby-agent/issues/3037
|
35
|
+
# This way, exceptions resolved by Sidekiq's own middleware are not reported in the agent
|
36
|
+
if chain.respond_to?(:prepend)
|
37
|
+
chain.prepend(NewRelic::Agent::Instrumentation::Sidekiq::Server)
|
38
|
+
else
|
39
|
+
chain.add(NewRelic::Agent::Instrumentation::Sidekiq::Server)
|
40
|
+
end
|
33
41
|
end
|
34
42
|
|
35
43
|
if config.respond_to?(:error_handlers)
|
@@ -41,18 +49,4 @@ DependencyDetection.defer do
|
|
41
49
|
end
|
42
50
|
end
|
43
51
|
end
|
44
|
-
|
45
|
-
executes do
|
46
|
-
next unless Gem::Version.new(Sidekiq::VERSION) < Gem::Version.new('5.0.0')
|
47
|
-
|
48
|
-
deprecation_msg = 'Instrumentation for Sidekiq versions below 5.0.0 is deprecated ' \
|
49
|
-
'and will be dropped entirely in a future major New Relic Ruby agent release.' \
|
50
|
-
'Please upgrade your Sidekiq version to continue receiving full support. '
|
51
|
-
|
52
|
-
NewRelic::Agent.logger.log_once(
|
53
|
-
:warn,
|
54
|
-
:deprecated_sidekiq_version,
|
55
|
-
deprecation_msg
|
56
|
-
)
|
57
|
-
end
|
58
52
|
end
|
@@ -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,27 +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
|
-
|
46
|
-
executes do
|
47
|
-
next unless Gem::Version.new(Sinatra::VERSION) < Gem::Version.new('2.0.0')
|
48
|
-
|
49
|
-
deprecation_msg = 'The Ruby agent is dropping support for Sinatra versions below 2.0.0 ' \
|
50
|
-
'in version 9.0.0. Please upgrade your Sinatra version to continue receiving full compatibility. ' \
|
51
|
-
|
52
|
-
NewRelic::Agent.logger.log_once(
|
53
|
-
:warn,
|
54
|
-
:deprecated_sinatra_version,
|
55
|
-
deprecation_msg
|
56
|
-
)
|
57
|
-
end
|
58
42
|
end
|