newrelic_rpm 9.1.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 +27 -0
- data/CHANGELOG.md +841 -7
- data/CONTRIBUTING.md +2 -9
- data/README.md +25 -22
- data/Rakefile +2 -2
- data/bin/newrelic +3 -9
- data/bin/newrelic_rpm +15 -0
- data/init.rb +2 -2
- data/lib/boot/strap.rb +102 -0
- data/lib/new_relic/agent/agent.rb +11 -2
- data/lib/new_relic/agent/agent_helpers/connect.rb +13 -8
- data/lib/new_relic/agent/agent_helpers/harvest.rb +3 -0
- data/lib/new_relic/agent/agent_helpers/shutdown.rb +4 -1
- data/lib/new_relic/agent/agent_helpers/special_startup.rb +1 -1
- data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +4 -3
- data/lib/new_relic/agent/agent_helpers/startup.rb +11 -3
- data/lib/new_relic/agent/agent_logger.rb +3 -1
- data/lib/new_relic/agent/attribute_filter.rb +3 -3
- data/lib/new_relic/agent/attribute_pre_filtering.rb +109 -0
- data/lib/new_relic/agent/aws.rb +68 -0
- data/lib/new_relic/agent/configuration/default_source.rb +918 -166
- data/lib/new_relic/agent/configuration/environment_source.rb +15 -3
- data/lib/new_relic/agent/configuration/high_security_source.rb +1 -0
- data/lib/new_relic/agent/configuration/manager.rb +72 -11
- data/lib/new_relic/agent/configuration/security_policy_source.rb +11 -0
- data/lib/new_relic/agent/configuration/yaml_source.rb +22 -2
- data/lib/new_relic/agent/connect/request_builder.rb +1 -1
- data/lib/new_relic/agent/custom_event_aggregator.rb +27 -1
- 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/mongo/metric_translator.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/distributed_trace_payload.rb +4 -8
- data/lib/new_relic/agent/distributed_tracing.rb +5 -3
- data/lib/new_relic/agent/error_collector.rb +40 -11
- data/lib/new_relic/agent/event_loop.rb +1 -1
- data/lib/new_relic/agent/external.rb +2 -0
- data/lib/new_relic/agent/harvester.rb +1 -1
- data/lib/new_relic/agent/health_check.rb +136 -0
- data/lib/new_relic/agent/http_clients/abstract.rb +4 -0
- data/lib/new_relic/agent/http_clients/async_http_wrappers.rb +80 -0
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +1 -3
- data/lib/new_relic/agent/http_clients/ethon_wrappers.rb +109 -0
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +0 -3
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +1 -3
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +0 -3
- data/lib/new_relic/agent/http_clients/httpx_wrappers.rb +91 -0
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +1 -4
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +0 -3
- data/lib/new_relic/agent/http_clients/uri_util.rb +1 -1
- data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.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 +3 -16
- data/lib/new_relic/agent/instrumentation/active_record.rb +8 -13
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +8 -5
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +13 -10
- 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/chain.rb +69 -0
- data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger/instrumentation.rb +17 -0
- data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger/prepend.rb +37 -0
- data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger.rb +21 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +4 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger.rb +3 -3
- data/lib/new_relic/agent/instrumentation/async_http/chain.rb +23 -0
- data/lib/new_relic/agent/instrumentation/async_http/instrumentation.rb +37 -0
- data/lib/new_relic/agent/instrumentation/async_http/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/async_http.rb +27 -0
- 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/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +23 -0
- data/lib/new_relic/agent/instrumentation/bunny.rb +4 -5
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/instrumentation.rb +3 -4
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/prepend.rb +1 -1
- data/lib/new_relic/agent/instrumentation/concurrent_ruby.rb +2 -3
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +5 -2
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +4 -0
- data/lib/new_relic/agent/instrumentation/curb.rb +4 -5
- data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +1 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +3 -0
- 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 +2 -3
- data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +65 -10
- data/lib/new_relic/agent/instrumentation/elasticsearch.rb +2 -4
- data/lib/new_relic/agent/instrumentation/ethon/chain.rb +39 -0
- data/lib/new_relic/agent/instrumentation/ethon/instrumentation.rb +105 -0
- data/lib/new_relic/agent/instrumentation/ethon/prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/ethon.rb +35 -0
- data/lib/new_relic/agent/instrumentation/excon/middleware.rb +3 -0
- data/lib/new_relic/agent/instrumentation/excon.rb +1 -17
- data/lib/new_relic/agent/instrumentation/fiber/chain.rb +11 -4
- data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +2 -6
- data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +10 -3
- data/lib/new_relic/agent/instrumentation/fiber.rb +1 -3
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +4 -3
- data/lib/new_relic/agent/instrumentation/grape.rb +1 -1
- data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +5 -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 +5 -1
- data/lib/new_relic/agent/instrumentation/grpc_client.rb +2 -2
- data/lib/new_relic/agent/instrumentation/grpc_server.rb +2 -2
- data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +4 -0
- data/lib/new_relic/agent/instrumentation/httpclient.rb +1 -5
- data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +4 -0
- data/lib/new_relic/agent/instrumentation/httprb.rb +0 -1
- data/lib/new_relic/agent/instrumentation/httpx/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/httpx/instrumentation.rb +51 -0
- data/lib/new_relic/agent/instrumentation/httpx/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httpx.rb +23 -0
- data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +3 -0
- 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 +4 -2
- data/lib/new_relic/agent/instrumentation/memcache/helper.rb +2 -2
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +13 -4
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +4 -2
- data/lib/new_relic/agent/instrumentation/memcache.rb +4 -5
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +3 -5
- data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +13 -3
- data/lib/new_relic/agent/instrumentation/net_http.rb +2 -1
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +4 -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/new_relic/agent/instrumentation/opensearch/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/opensearch.rb +23 -0
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +4 -0
- data/lib/new_relic/agent/instrumentation/padrino.rb +3 -3
- data/lib/new_relic/agent/instrumentation/queue_time.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +9 -0
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +4 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +10 -5
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +4 -0
- 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 +18 -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/instrumentation.rb +4 -0
- data/lib/new_relic/agent/instrumentation/resque.rb +8 -6
- data/lib/new_relic/agent/instrumentation/roda/chain.rb +43 -0
- data/lib/new_relic/agent/instrumentation/roda/ignorer.rb +45 -0
- data/lib/new_relic/agent/instrumentation/roda/instrumentation.rb +68 -0
- data/lib/new_relic/agent/instrumentation/roda/prepend.rb +24 -0
- data/lib/new_relic/agent/instrumentation/roda/roda_transaction_namer.rb +29 -0
- data/lib/new_relic/agent/instrumentation/roda.rb +36 -0
- 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/chain.rb +36 -0
- data/lib/new_relic/agent/instrumentation/ruby_openai/instrumentation.rb +196 -0
- data/lib/new_relic/agent/instrumentation/ruby_openai/prepend.rb +20 -0
- data/lib/new_relic/agent/instrumentation/ruby_openai.rb +35 -0
- data/lib/new_relic/agent/instrumentation/sequel.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +4 -0
- 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/server.rb +26 -3
- data/lib/new_relic/agent/instrumentation/sidekiq.rb +13 -16
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +4 -0
- data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +1 -3
- data/lib/new_relic/agent/instrumentation/sinatra.rb +3 -19
- data/lib/new_relic/agent/instrumentation/stripe.rb +28 -0
- data/lib/new_relic/agent/instrumentation/stripe_subscriber.rb +98 -0
- data/lib/new_relic/agent/instrumentation/thread/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +1 -5
- data/lib/new_relic/agent/instrumentation/thread/prepend.rb +1 -1
- data/lib/new_relic/agent/instrumentation/thread.rb +0 -2
- data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +4 -0
- data/lib/new_relic/agent/instrumentation/tilt.rb +0 -4
- data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +7 -3
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +0 -1
- data/lib/new_relic/agent/instrumentation/view_component/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/view_component/instrumentation.rb +45 -0
- data/lib/{tasks/instrumentation_generator/templates/instrumentation.tt → new_relic/agent/instrumentation/view_component/prepend.rb} +4 -4
- data/lib/new_relic/agent/instrumentation/view_component.rb +24 -0
- data/lib/new_relic/agent/javascript_instrumentor.rb +2 -4
- data/lib/new_relic/agent/llm/chat_completion_message.rb +25 -0
- data/lib/new_relic/agent/llm/chat_completion_summary.rb +66 -0
- data/lib/new_relic/agent/llm/embedding.rb +60 -0
- data/lib/new_relic/agent/llm/llm_event.rb +95 -0
- data/lib/new_relic/agent/llm/response_headers.rb +80 -0
- data/lib/new_relic/agent/llm.rb +49 -0
- data/lib/new_relic/agent/local_log_decorator.rb +20 -3
- data/lib/new_relic/agent/log_event_aggregator.rb +149 -26
- data/lib/new_relic/agent/log_event_attributes.rb +115 -0
- data/lib/new_relic/agent/logging.rb +5 -5
- data/lib/new_relic/agent/messaging.rb +18 -7
- data/lib/new_relic/agent/method_tracer.rb +4 -1
- data/lib/new_relic/agent/method_tracer_helpers.rb +26 -5
- data/lib/new_relic/agent/monitors/inbound_request_monitor.rb +1 -1
- data/lib/new_relic/agent/monitors/synthetics_monitor.rb +12 -1
- data/lib/new_relic/agent/new_relic_service/encoders.rb +2 -2
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +2 -2
- data/lib/new_relic/agent/new_relic_service.rb +61 -28
- data/lib/new_relic/agent/obfuscator.rb +0 -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/pipe_channel_manager.rb +2 -2
- data/lib/new_relic/agent/pipe_service.rb +1 -1
- data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +1 -2
- data/lib/new_relic/agent/rules_engine.rb +1 -1
- data/lib/new_relic/agent/sampler.rb +1 -0
- 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 +406 -0
- 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 +32 -15
- data/lib/new_relic/agent/sql_sampler.rb +0 -1
- data/lib/new_relic/agent/system_info.rb +40 -0
- data/lib/new_relic/agent/threading/agent_thread.rb +1 -2
- data/lib/new_relic/agent/threading/backtrace_node.rb +10 -1
- data/lib/new_relic/agent/tracer.rb +16 -16
- data/lib/new_relic/agent/transaction/abstract_segment.rb +103 -41
- 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/distributed_tracing.rb +7 -8
- data/lib/new_relic/agent/transaction/external_request_segment.rb +5 -12
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +5 -3
- data/lib/new_relic/agent/transaction/request_attributes.rb +54 -11
- data/lib/new_relic/agent/transaction/trace_context.rb +34 -5
- data/lib/new_relic/agent/transaction/tracing.rb +20 -4
- data/lib/new_relic/agent/transaction.rb +38 -13
- data/lib/new_relic/agent/transaction_error_primitive.rb +39 -19
- data/lib/new_relic/agent/transaction_event_primitive.rb +19 -0
- 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/gcp.rb +1 -3
- data/lib/new_relic/agent/utilization/vendor.rb +5 -7
- data/lib/new_relic/agent/utilization_data.rb +40 -5
- data/lib/new_relic/agent/vm/{mri_vm.rb → c_ruby_vm.rb} +10 -18
- data/lib/new_relic/agent/vm.rb +2 -2
- data/lib/new_relic/agent/worker_loop.rb +1 -1
- data/lib/new_relic/agent.rb +286 -17
- data/lib/new_relic/base64.rb +25 -0
- data/lib/new_relic/cli/command.rb +6 -3
- data/lib/new_relic/constants.rb +8 -0
- data/lib/new_relic/control/class_methods.rb +1 -7
- 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/rails.rb +17 -5
- data/lib/new_relic/control/frameworks/rails4.rb +1 -3
- data/lib/new_relic/control/frameworks/roda.rb +20 -0
- data/lib/new_relic/control/instance_methods.rb +13 -0
- data/lib/new_relic/control/instrumentation.rb +2 -16
- 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 +25 -13
- data/lib/new_relic/environment_report.rb +2 -2
- data/lib/new_relic/helper.rb +22 -0
- data/lib/new_relic/language_support.rb +12 -1
- data/lib/new_relic/latest_changes.rb +1 -1
- data/lib/new_relic/local_environment.rb +31 -18
- data/lib/new_relic/noticed_error.rb +5 -2
- data/lib/new_relic/rack/agent_hooks.rb +1 -1
- data/lib/new_relic/rack/agent_middleware.rb +0 -16
- data/lib/new_relic/rack/browser_monitoring.rb +29 -13
- data/lib/new_relic/supportability_helper.rb +5 -1
- data/lib/new_relic/thread_local_storage.rb +31 -0
- data/lib/new_relic/traced_thread.rb +2 -3
- data/lib/new_relic/version.rb +1 -1
- data/lib/sequel/extensions/new_relic_instrumentation.rb +4 -3
- data/lib/tasks/bump_version.rake +21 -0
- data/lib/tasks/config.rake +11 -5
- data/lib/tasks/coverage_report.rake +1 -1
- data/lib/tasks/gha.rake +31 -0
- data/lib/tasks/helpers/config.html.erb +94 -0
- data/lib/tasks/helpers/format.rb +11 -7
- data/lib/tasks/helpers/newrelicyml.rb +211 -0
- data/lib/tasks/helpers/version_bump.rb +62 -0
- data/lib/tasks/newrelic.rb +1 -0
- data/lib/tasks/newrelicyml.rake +13 -0
- data/lib/tasks/tests.rake +71 -0
- data/newrelic.yml +657 -251
- data/newrelic_rpm.gemspec +17 -10
- data/test/agent_helper.rb +38 -4
- metadata +230 -44
- data/.gitignore +0 -43
- data/.project +0 -23
- data/.rubocop.yml +0 -1909
- data/.rubocop_todo.yml +0 -61
- data/.simplecov +0 -15
- data/.snyk +0 -11
- data/.yardopts +0 -27
- data/Brewfile +0 -12
- data/DOCKER.md +0 -167
- data/Dockerfile +0 -10
- data/Guardfile +0 -26
- data/bin/newrelic_cmd +0 -6
- data/config/database.yml +0 -5
- data/config.dot +0 -278
- data/docker-compose.yml +0 -107
- data/lefthook.yml +0 -9
- data/lib/new_relic/agent/range_extensions.rb +0 -27
- data/lib/tasks/helpers/removers.rb +0 -33
- 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 -22
- data/lib/tasks/instrumentation_generator/templates/chain_method.tt +0 -8
- 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
- data/lib/tasks/multiverse.rake +0 -6
- data/lib/tasks/multiverse.rb +0 -83
|
@@ -3,16 +3,23 @@
|
|
|
3
3
|
# frozen_string_literal: true
|
|
4
4
|
|
|
5
5
|
module NewRelic::Agent::Instrumentation
|
|
6
|
-
module MonitoredFiber
|
|
6
|
+
module MonitoredFiber::Chain
|
|
7
7
|
def self.instrument!
|
|
8
8
|
::Fiber.class_eval do
|
|
9
9
|
include NewRelic::Agent::Instrumentation::MonitoredFiber
|
|
10
10
|
|
|
11
11
|
alias_method(:initialize_without_new_relic, :initialize)
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
if NewRelic::Helper.version_satisfied?(RUBY_VERSION, '<', '2.7.0')
|
|
14
|
+
def initialize(*_args, &block)
|
|
15
|
+
traced_block = add_thread_tracing(&block)
|
|
16
|
+
initialize_with_newrelic_tracing { initialize_without_new_relic(&traced_block) }
|
|
17
|
+
end
|
|
18
|
+
else
|
|
19
|
+
def initialize(**kwargs, &block)
|
|
20
|
+
traced_block = add_thread_tracing(&block)
|
|
21
|
+
initialize_with_newrelic_tracing { initialize_without_new_relic(**kwargs, &traced_block) }
|
|
22
|
+
end
|
|
16
23
|
end
|
|
17
24
|
end
|
|
18
25
|
end
|
|
@@ -11,14 +11,10 @@ module NewRelic::Agent::Instrumentation
|
|
|
11
11
|
yield
|
|
12
12
|
end
|
|
13
13
|
|
|
14
|
-
def add_thread_tracing(
|
|
14
|
+
def add_thread_tracing(&block)
|
|
15
15
|
return block if !NewRelic::Agent::Tracer.thread_tracing_enabled?
|
|
16
16
|
|
|
17
|
-
NewRelic::Agent::Tracer.thread_block_with_current_transaction(
|
|
18
|
-
*args,
|
|
19
|
-
segment_name: 'Ruby/Fiber',
|
|
20
|
-
&block
|
|
21
|
-
)
|
|
17
|
+
NewRelic::Agent::Tracer.thread_block_with_current_transaction(&block)
|
|
22
18
|
end
|
|
23
19
|
end
|
|
24
20
|
end
|
|
@@ -9,9 +9,16 @@ module NewRelic::Agent::Instrumentation
|
|
|
9
9
|
module Prepend
|
|
10
10
|
include NewRelic::Agent::Instrumentation::MonitoredFiber
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
if NewRelic::Helper.version_satisfied?(RUBY_VERSION, '<', '2.7.0')
|
|
13
|
+
def initialize(*_args, &block)
|
|
14
|
+
traced_block = add_thread_tracing(&block)
|
|
15
|
+
initialize_with_newrelic_tracing { super(&traced_block) }
|
|
16
|
+
end
|
|
17
|
+
else
|
|
18
|
+
def initialize(**kawrgs, &block)
|
|
19
|
+
traced_block = add_thread_tracing(&block)
|
|
20
|
+
initialize_with_newrelic_tracing { super(**kawrgs, &traced_block) }
|
|
21
|
+
end
|
|
15
22
|
end
|
|
16
23
|
end
|
|
17
24
|
end
|
|
@@ -14,12 +14,10 @@ DependencyDetection.defer do
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
executes do
|
|
17
|
-
NewRelic::Agent.logger.info('Installing Fiber instrumentation')
|
|
18
|
-
|
|
19
17
|
if use_prepend?
|
|
20
18
|
prepend_instrument Fiber, NewRelic::Agent::Instrumentation::MonitoredFiber::Prepend
|
|
21
19
|
else
|
|
22
|
-
chain_instrument NewRelic::Agent::Instrumentation::MonitoredFiber
|
|
20
|
+
chain_instrument NewRelic::Agent::Instrumentation::MonitoredFiber::Chain
|
|
23
21
|
end
|
|
24
22
|
end
|
|
25
23
|
end
|
|
@@ -9,6 +9,8 @@ module NewRelic::Agent::Instrumentation
|
|
|
9
9
|
module Instrumentation
|
|
10
10
|
extend self
|
|
11
11
|
|
|
12
|
+
INSTRUMENTATION_NAME = NewRelic::Agent.base_name(name)
|
|
13
|
+
|
|
12
14
|
# Since 1.2.0, the class `Grape::API` no longer refers to an API instance, rather, what used to be `Grape::API` is `Grape::API::Instance`
|
|
13
15
|
# https://github.com/ruby-grape/grape/blob/c20a73ac1e3f3ba1082005ed61bf69452373ba87/UPGRADING.md#upgrading-to--120
|
|
14
16
|
def instrumented_class
|
|
@@ -46,16 +48,15 @@ module NewRelic::Agent::Instrumentation
|
|
|
46
48
|
def handle_transaction(endpoint, class_name, version)
|
|
47
49
|
return unless endpoint && route = endpoint.route
|
|
48
50
|
|
|
51
|
+
NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
|
52
|
+
|
|
49
53
|
name_transaction(route, class_name, version)
|
|
50
54
|
capture_params(endpoint)
|
|
51
55
|
end
|
|
52
56
|
|
|
53
57
|
def name_transaction(route, class_name, version)
|
|
54
58
|
txn_name = name_for_transaction(route, class_name, version)
|
|
55
|
-
segment_name = "Middleware/Grape/#{class_name}/call"
|
|
56
59
|
NewRelic::Agent::Transaction.set_default_transaction_name(txn_name, :grape)
|
|
57
|
-
txn = NewRelic::Agent::Transaction.tl_current
|
|
58
|
-
txn.segments.last.name = segment_name
|
|
59
60
|
end
|
|
60
61
|
|
|
61
62
|
def name_for_transaction(route, class_name, version)
|
|
@@ -19,7 +19,7 @@ DependencyDetection.defer do
|
|
|
19
19
|
|
|
20
20
|
depends_on do
|
|
21
21
|
begin
|
|
22
|
-
if
|
|
22
|
+
if NewRelic::Helper.rubygems_specs.map(&:name).include?('newrelic-grape')
|
|
23
23
|
NewRelic::Agent.logger.info('Not installing New Relic supported Grape instrumentation because the third party newrelic-grape gem is present')
|
|
24
24
|
false
|
|
25
25
|
else
|
|
@@ -1,6 +1,6 @@
|
|
|
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
|
require_relative 'request_wrapper'
|
|
6
6
|
require_relative '../helper'
|
|
@@ -12,10 +12,14 @@ module NewRelic
|
|
|
12
12
|
module Client
|
|
13
13
|
include NewRelic::Agent::Instrumentation::GRPC::Helper
|
|
14
14
|
|
|
15
|
+
INSTRUMENTATION_NAME = 'gRPC_Client'
|
|
16
|
+
|
|
15
17
|
def issue_request_with_tracing(grpc_type, method, requests, marshal, unmarshal,
|
|
16
18
|
deadline:, return_op:, parent:, credentials:, metadata:)
|
|
17
19
|
return yield unless trace_with_newrelic?
|
|
18
20
|
|
|
21
|
+
NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
|
22
|
+
|
|
19
23
|
segment = request_segment(method)
|
|
20
24
|
request_wrapper = NewRelic::Agent::Instrumentation::GRPC::Client::RequestWrapper.new(@host)
|
|
21
25
|
# do not insert CAT headers for gRPC requests https://github.com/newrelic/newrelic-ruby-agent/issues/1730
|
|
@@ -46,7 +50,6 @@ module NewRelic
|
|
|
46
50
|
attributes_hash.each do |attr, value|
|
|
47
51
|
segment.add_agent_attribute(attr, value)
|
|
48
52
|
end
|
|
49
|
-
segment.record_agent_attributes = true
|
|
50
53
|
end
|
|
51
54
|
|
|
52
55
|
def grpc_status_and_message_from_exception(exception)
|
|
@@ -1,6 +1,6 @@
|
|
|
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
|
require_relative '../helper'
|
|
6
6
|
|
|
@@ -11,6 +11,8 @@ module NewRelic
|
|
|
11
11
|
module Server
|
|
12
12
|
include NewRelic::Agent::Instrumentation::GRPC::Helper
|
|
13
13
|
|
|
14
|
+
INSTRUMENTATION_NAME = 'gRPC_Server'
|
|
15
|
+
|
|
14
16
|
DT_KEYS = [NewRelic::NEWRELIC_KEY, NewRelic::TRACEPARENT_KEY, NewRelic::TRACESTATE_KEY].freeze
|
|
15
17
|
INSTANCE_VAR_HOST = :@host_nr
|
|
16
18
|
INSTANCE_VAR_PORT = :@port_nr
|
|
@@ -23,6 +25,8 @@ module NewRelic
|
|
|
23
25
|
def handle_with_tracing(streamer_type, active_call, mth, _inter_ctx)
|
|
24
26
|
return yield unless trace_with_newrelic?
|
|
25
27
|
|
|
28
|
+
NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
|
29
|
+
|
|
26
30
|
metadata = metadata_for_call(active_call)
|
|
27
31
|
txn = NewRelic::Agent::Transaction.start_new_transaction(NewRelic::Agent::Tracer.state,
|
|
28
32
|
CATEGORY,
|
|
@@ -1,6 +1,6 @@
|
|
|
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
|
require_relative 'grpc/client/chain'
|
|
6
6
|
require_relative 'grpc/client/prepend'
|
|
@@ -13,7 +13,7 @@ DependencyDetection.defer do
|
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
executes do
|
|
16
|
-
supportability_name =
|
|
16
|
+
supportability_name = NewRelic::Agent::Instrumentation::GRPC::Client::INSTRUMENTATION_NAME
|
|
17
17
|
if use_prepend?
|
|
18
18
|
prepend_instrument GRPC::ClientStub, NewRelic::Agent::Instrumentation::GRPC::Client::Prepend, supportability_name
|
|
19
19
|
else
|
|
@@ -1,6 +1,6 @@
|
|
|
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
|
require_relative 'grpc/server/chain'
|
|
6
6
|
require_relative 'grpc/server/rpc_server_prepend'
|
|
@@ -14,7 +14,7 @@ DependencyDetection.defer do
|
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
executes do
|
|
17
|
-
supportability_name =
|
|
17
|
+
supportability_name = NewRelic::Agent::Instrumentation::GRPC::Server::INSTRUMENTATION_NAME
|
|
18
18
|
if use_prepend?
|
|
19
19
|
prepend_instrument GRPC::RpcServer, NewRelic::Agent::Instrumentation::GRPC::Server::RpcServerPrepend, supportability_name
|
|
20
20
|
prepend_instrument GRPC::RpcDesc, NewRelic::Agent::Instrumentation::GRPC::Server::RpcDescPrepend, supportability_name
|
|
@@ -5,7 +5,11 @@
|
|
|
5
5
|
module NewRelic::Agent::Instrumentation
|
|
6
6
|
module HTTPClient
|
|
7
7
|
module Instrumentation
|
|
8
|
+
INSTRUMENTATION_NAME = 'HTTPClient'
|
|
9
|
+
|
|
8
10
|
def with_tracing(request, connection)
|
|
11
|
+
NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
|
12
|
+
|
|
9
13
|
wrapped_request = NewRelic::Agent::HTTPClients::HTTPClientRequest.new(request)
|
|
10
14
|
segment = NewRelic::Agent::Tracer.start_external_request_segment(
|
|
11
15
|
library: wrapped_request.type,
|
|
@@ -16,14 +16,10 @@ DependencyDetection.defer do
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
depends_on do
|
|
19
|
-
|
|
20
|
-
current_version = Gem::Version.new(HTTPClient::VERSION)
|
|
21
|
-
|
|
22
|
-
current_version >= minimum_supported_version
|
|
19
|
+
NewRelic::Helper.version_satisfied?(HTTPClient::VERSION, '>=', HTTPCLIENT_MIN_VERSION)
|
|
23
20
|
end
|
|
24
21
|
|
|
25
22
|
executes do
|
|
26
|
-
NewRelic::Agent.logger.info('Installing HTTPClient instrumentation')
|
|
27
23
|
require 'new_relic/agent/distributed_tracing/cross_app_tracing'
|
|
28
24
|
require 'new_relic/agent/http_clients/httpclient_wrappers'
|
|
29
25
|
end
|
|
@@ -4,7 +4,11 @@
|
|
|
4
4
|
|
|
5
5
|
module NewRelic::Agent::Instrumentation
|
|
6
6
|
module HTTPrb
|
|
7
|
+
INSTRUMENTATION_NAME = NewRelic::Agent.base_name(name)
|
|
8
|
+
|
|
7
9
|
def with_tracing(request)
|
|
10
|
+
NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
|
11
|
+
|
|
8
12
|
wrapped_request = ::NewRelic::Agent::HTTPClients::HTTPRequest.new(request)
|
|
9
13
|
|
|
10
14
|
begin
|
|
@@ -0,0 +1,20 @@
|
|
|
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 HTTPX
|
|
7
|
+
module Chain
|
|
8
|
+
def self.instrument!
|
|
9
|
+
::HTTPX::Session.class_eval do
|
|
10
|
+
include NewRelic::Agent::Instrumentation::HTTPX
|
|
11
|
+
|
|
12
|
+
alias_method(:send_requests_without_tracing, :send_requests)
|
|
13
|
+
def send_requests(*requests)
|
|
14
|
+
send_requests_with_tracing(*requests) { send_requests_without_tracing(*requests) }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
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/http_clients/httpx_wrappers'
|
|
6
|
+
|
|
7
|
+
module NewRelic::Agent::Instrumentation::HTTPX
|
|
8
|
+
INSTRUMENTATION_NAME = 'HTTPX'
|
|
9
|
+
NOTICEABLE_ERROR_CLASS = 'HTTPX::Error'
|
|
10
|
+
|
|
11
|
+
def send_requests_with_tracing(*requests)
|
|
12
|
+
NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
|
13
|
+
requests.each { |r| nr_start_segment(r) }
|
|
14
|
+
yield
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def nr_start_segment(request)
|
|
18
|
+
return unless NewRelic::Agent::Tracer.state.is_execution_traced?
|
|
19
|
+
|
|
20
|
+
wrapped_request = NewRelic::Agent::HTTPClients::HTTPXHTTPRequest.new(request)
|
|
21
|
+
segment = NewRelic::Agent::Tracer.start_external_request_segment(
|
|
22
|
+
library: wrapped_request.type,
|
|
23
|
+
uri: wrapped_request.uri,
|
|
24
|
+
procedure: wrapped_request.method
|
|
25
|
+
)
|
|
26
|
+
segment.add_request_headers(wrapped_request)
|
|
27
|
+
|
|
28
|
+
request.on(:response) { nr_finish_segment.call(request, segment) }
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def nr_finish_segment
|
|
32
|
+
proc do |request, segment|
|
|
33
|
+
response = request.response if request
|
|
34
|
+
|
|
35
|
+
unless response
|
|
36
|
+
NewRelic::Agent.logger.debug('Processed an on-response callback for HTTPX but could not find the response!')
|
|
37
|
+
next
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
wrapped_response = NewRelic::Agent::HTTPClients::HTTPXHTTPResponse.new(response)
|
|
41
|
+
segment.process_response_headers(wrapped_response)
|
|
42
|
+
|
|
43
|
+
if response.is_a?(::HTTPX::ErrorResponse)
|
|
44
|
+
e = NewRelic::Agent::NoticeableError.new(NOTICEABLE_ERROR_CLASS, "Couldn't connect: #{response}")
|
|
45
|
+
segment.notice_error(e)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
::NewRelic::Agent::Transaction::Segment.finish(segment)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
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 HTTPX
|
|
7
|
+
module Prepend
|
|
8
|
+
include NewRelic::Agent::Instrumentation::HTTPX
|
|
9
|
+
|
|
10
|
+
def send_requests(*requests)
|
|
11
|
+
send_requests_with_tracing(*requests) { super }
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
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 'httpx/chain'
|
|
6
|
+
require_relative 'httpx/instrumentation'
|
|
7
|
+
require_relative 'httpx/prepend'
|
|
8
|
+
|
|
9
|
+
DependencyDetection.defer do
|
|
10
|
+
named :httpx
|
|
11
|
+
|
|
12
|
+
depends_on do
|
|
13
|
+
defined?(HTTPX) && NewRelic::Helper.version_satisfied?(HTTPX::VERSION, '>=', '1.0.0')
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
executes do
|
|
17
|
+
if use_prepend?
|
|
18
|
+
prepend_instrument HTTPX::Session, NewRelic::Agent::Instrumentation::HTTPX::Prepend
|
|
19
|
+
else
|
|
20
|
+
chain_instrument NewRelic::Agent::Instrumentation::HTTPX::Chain
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -6,6 +6,8 @@ module NewRelic
|
|
|
6
6
|
module Agent
|
|
7
7
|
module Instrumentation
|
|
8
8
|
module Logger
|
|
9
|
+
INSTRUMENTATION_NAME = 'Logger'
|
|
10
|
+
|
|
9
11
|
def skip_instrumenting?
|
|
10
12
|
defined?(@skip_instrumenting) && @skip_instrumenting
|
|
11
13
|
end
|
|
@@ -51,6 +53,7 @@ module NewRelic
|
|
|
51
53
|
mark_skip_instrumenting
|
|
52
54
|
|
|
53
55
|
unless ::NewRelic::Agent.agent.nil?
|
|
56
|
+
::NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
|
54
57
|
::NewRelic::Agent.agent.log_event_aggregator.record(formatted_message, severity)
|
|
55
58
|
formatted_message = LocalLogDecorator.decorate(formatted_message)
|
|
56
59
|
end
|
|
@@ -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
|
|
@@ -0,0 +1,21 @@
|
|
|
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 LogStasher::Chain
|
|
7
|
+
def self.instrument!
|
|
8
|
+
::LogStasher.singleton_class.class_eval do
|
|
9
|
+
include NewRelic::Agent::Instrumentation::LogStasher
|
|
10
|
+
|
|
11
|
+
alias_method(:build_logstash_event_without_new_relic, :build_logstash_event)
|
|
12
|
+
|
|
13
|
+
def build_logstash_event(*args)
|
|
14
|
+
build_logstash_event_with_new_relic(*args) do
|
|
15
|
+
build_logstash_event_without_new_relic(*args)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -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
|
+
module NewRelic::Agent::Instrumentation
|
|
6
|
+
module LogStasher
|
|
7
|
+
INSTRUMENTATION_NAME = NewRelic::Agent.base_name(name)
|
|
8
|
+
|
|
9
|
+
def self.enabled?
|
|
10
|
+
NewRelic::Agent.config[:'instrumentation.logstasher'] != 'disabled'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def build_logstash_event_with_new_relic(*args)
|
|
14
|
+
logstasher_event = yield
|
|
15
|
+
log = logstasher_event.instance_variable_get(:@data)
|
|
16
|
+
|
|
17
|
+
::NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
|
18
|
+
::NewRelic::Agent.agent.log_event_aggregator.record_logstasher_event(log)
|
|
19
|
+
::NewRelic::Agent::LocalLogDecorator.decorate(log)
|
|
20
|
+
|
|
21
|
+
logstasher_event
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
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 LogStasher::Prepend
|
|
7
|
+
include NewRelic::Agent::Instrumentation::LogStasher
|
|
8
|
+
|
|
9
|
+
def build_logstash_event(*args)
|
|
10
|
+
build_logstash_event_with_new_relic(*args) { super }
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
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 'logstasher/instrumentation'
|
|
6
|
+
require_relative 'logstasher/chain'
|
|
7
|
+
require_relative 'logstasher/prepend'
|
|
8
|
+
|
|
9
|
+
DependencyDetection.defer do
|
|
10
|
+
named :logstasher
|
|
11
|
+
|
|
12
|
+
depends_on do
|
|
13
|
+
defined?(LogStasher) &&
|
|
14
|
+
NewRelic::Helper.version_satisfied?(LogStasher::VERSION, '>=', '1.0.0') &&
|
|
15
|
+
NewRelic::Agent.config[:'application_logging.enabled']
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
executes do
|
|
19
|
+
if use_prepend?
|
|
20
|
+
prepend_instrument LogStasher.singleton_class, NewRelic::Agent::Instrumentation::LogStasher::Prepend
|
|
21
|
+
else
|
|
22
|
+
chain_instrument NewRelic::Agent::Instrumentation::LogStasher::Chain
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -58,8 +58,10 @@ module NewRelic
|
|
|
58
58
|
end.class_eval do
|
|
59
59
|
include NewRelic::Agent::Instrumentation::Memcache::Tracer
|
|
60
60
|
|
|
61
|
-
# TODO:
|
|
62
|
-
|
|
61
|
+
# TODO: MAJOR VERSION
|
|
62
|
+
# Dalli - 3.1.0 renamed send_multiget to pipelined_get, but the method is otherwise the same
|
|
63
|
+
# Once we no longer support Dalli < 3.1.0, remove this conditional logic
|
|
64
|
+
if NewRelic::Helper.version_satisfied?(::Dalli::VERSION, '>=', '3.1.0')
|
|
63
65
|
alias_method(:pipelined_get_without_newrelic_trace, :pipelined_get)
|
|
64
66
|
def pipelined_get(keys)
|
|
65
67
|
send_multiget_with_newrelic_tracing(keys) { pipelined_get_without_newrelic_trace(keys) }
|
|
@@ -9,11 +9,11 @@ module NewRelic::Agent::Instrumentation
|
|
|
9
9
|
BINARY_PROTOCOL_SUPPORTED_VERSION = Gem::Version.new('3.0.2')
|
|
10
10
|
|
|
11
11
|
def supports_datastore_instances?
|
|
12
|
-
DATASTORE_INSTANCES_SUPPORTED_VERSION <=
|
|
12
|
+
NewRelic::Helper.version_satisfied?(DATASTORE_INSTANCES_SUPPORTED_VERSION, '<=', ::Dalli::VERSION)
|
|
13
13
|
end
|
|
14
14
|
|
|
15
15
|
def supports_binary_protocol?
|
|
16
|
-
BINARY_PROTOCOL_SUPPORTED_VERSION <=
|
|
16
|
+
NewRelic::Helper.version_satisfied?(BINARY_PROTOCOL_SUPPORTED_VERSION, '<=', ::Dalli::VERSION)
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
def client_methods
|
|
@@ -6,13 +6,16 @@ module NewRelic::Agent::Instrumentation
|
|
|
6
6
|
module Memcache
|
|
7
7
|
module Tracer
|
|
8
8
|
SLASH = '/'
|
|
9
|
-
UNKNOWN =
|
|
9
|
+
UNKNOWN = NewRelic::UNKNOWN_LOWER
|
|
10
10
|
LOCALHOST = 'localhost'
|
|
11
11
|
MULTIGET_METRIC_NAME = 'get_multi_request'
|
|
12
12
|
MEMCACHED = 'Memcached'
|
|
13
|
+
INSTRUMENTATION_NAME = 'Dalli'
|
|
13
14
|
|
|
14
15
|
def with_newrelic_tracing(operation, *args)
|
|
15
|
-
|
|
16
|
+
NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
|
17
|
+
|
|
18
|
+
segment = NewRelic::Agent::Tracer.start_datastore_segment(
|
|
16
19
|
product: MEMCACHED,
|
|
17
20
|
operation: operation
|
|
18
21
|
)
|
|
@@ -28,6 +31,8 @@ module NewRelic::Agent::Instrumentation
|
|
|
28
31
|
end
|
|
29
32
|
|
|
30
33
|
def server_for_key_with_newrelic_tracing
|
|
34
|
+
NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
|
35
|
+
|
|
31
36
|
yield.tap do |server|
|
|
32
37
|
begin
|
|
33
38
|
if txn = ::NewRelic::Agent::Tracer.current_transaction
|
|
@@ -43,7 +48,9 @@ module NewRelic::Agent::Instrumentation
|
|
|
43
48
|
end
|
|
44
49
|
|
|
45
50
|
def get_multi_with_newrelic_tracing(method_name)
|
|
46
|
-
|
|
51
|
+
NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
|
52
|
+
|
|
53
|
+
segment = NewRelic::Agent::Tracer.start_segment(
|
|
47
54
|
name: "Ruby/Memcached/Dalli/#{method_name}"
|
|
48
55
|
)
|
|
49
56
|
|
|
@@ -55,7 +62,9 @@ module NewRelic::Agent::Instrumentation
|
|
|
55
62
|
end
|
|
56
63
|
|
|
57
64
|
def send_multiget_with_newrelic_tracing(keys)
|
|
58
|
-
|
|
65
|
+
NewRelic::Agent.record_instrumentation_invocation(INSTRUMENTATION_NAME)
|
|
66
|
+
|
|
67
|
+
segment = ::NewRelic::Agent::Tracer.start_datastore_segment(
|
|
59
68
|
product: MEMCACHED,
|
|
60
69
|
operation: MULTIGET_METRIC_NAME
|
|
61
70
|
)
|
|
@@ -84,8 +84,10 @@ module NewRelic::Agent::Instrumentation
|
|
|
84
84
|
extend Helper
|
|
85
85
|
include NewRelic::Agent::Instrumentation::Memcache::Tracer
|
|
86
86
|
|
|
87
|
-
# TODO:
|
|
88
|
-
|
|
87
|
+
# TODO: MAJOR VERSION
|
|
88
|
+
# Dalli - 3.1.0 renamed send_multiget to pipelined_get, but the method is otherwise the same
|
|
89
|
+
# Once we no longer support Dalli < 3.1.0, remove this conditional logic
|
|
90
|
+
if NewRelic::Helper.version_satisfied?(::Dalli::VERSION, '>=', '3.1.0')
|
|
89
91
|
def pipelined_get(keys)
|
|
90
92
|
send_multiget_with_newrelic_tracing(keys) { super }
|
|
91
93
|
end
|