newrelic_rpm 5.7.0.350 → 9.0.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/.gitignore +15 -1
- data/.rubocop.yml +1919 -0
- data/.rubocop_todo.yml +100 -0
- data/.simplecov +15 -0
- data/.snyk +11 -0
- data/.yardopts +2 -0
- data/Brewfile +12 -0
- data/CHANGELOG.md +4056 -2339
- data/CONTRIBUTING.md +132 -19
- data/DOCKER.md +167 -0
- data/Dockerfile +10 -0
- data/Gemfile +5 -2
- data/Guardfile +22 -4
- data/LICENSE +202 -38
- data/README.md +87 -87
- data/Rakefile +27 -27
- data/THIRD_PARTY_NOTICES.md +28 -0
- data/Thorfile +5 -0
- data/bin/newrelic +3 -2
- data/bin/newrelic_cmd +1 -0
- data/bin/nrdebug +77 -54
- data/config.dot +5 -5
- data/docker-compose.yml +107 -0
- data/init.rb +5 -7
- data/install.rb +3 -3
- data/lefthook.yml +9 -0
- data/lib/new_relic/agent/adaptive_sampler.rb +14 -10
- data/lib/new_relic/agent/agent.rb +125 -969
- data/lib/new_relic/agent/agent_helpers/connect.rb +227 -0
- data/lib/new_relic/agent/agent_helpers/harvest.rb +153 -0
- data/lib/new_relic/agent/agent_helpers/shutdown.rb +72 -0
- data/lib/new_relic/agent/agent_helpers/special_startup.rb +74 -0
- data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +167 -0
- data/lib/new_relic/agent/agent_helpers/startup.rb +202 -0
- data/lib/new_relic/agent/agent_helpers/transmit.rb +76 -0
- data/lib/new_relic/agent/agent_logger.rb +26 -18
- data/lib/new_relic/agent/attribute_filter.rb +69 -52
- data/lib/new_relic/agent/attribute_processing.rb +8 -8
- data/lib/new_relic/agent/attributes.rb +153 -0
- data/lib/new_relic/agent/audit_logger.rb +19 -4
- data/lib/new_relic/agent/autostart.rb +34 -28
- data/lib/new_relic/agent/chained_call.rb +2 -2
- data/lib/new_relic/agent/commands/agent_command.rb +4 -4
- data/lib/new_relic/agent/commands/agent_command_router.rb +15 -33
- data/lib/new_relic/agent/commands/thread_profiler_session.rb +13 -11
- data/lib/new_relic/agent/configuration/default_source.rb +1480 -1053
- data/lib/new_relic/agent/configuration/dotted_hash.rb +7 -6
- data/lib/new_relic/agent/configuration/environment_source.rb +15 -11
- data/lib/new_relic/agent/configuration/event_harvest_config.rb +68 -0
- data/lib/new_relic/agent/configuration/high_security_source.rb +9 -9
- data/lib/new_relic/agent/configuration/manager.rb +96 -79
- data/lib/new_relic/agent/configuration/manual_source.rb +2 -2
- data/lib/new_relic/agent/configuration/mask_defaults.rb +4 -4
- data/lib/new_relic/agent/configuration/security_policy_source.rb +83 -86
- data/lib/new_relic/agent/configuration/server_source.rb +49 -12
- data/lib/new_relic/agent/configuration/yaml_source.rb +42 -13
- data/lib/new_relic/agent/configuration.rb +2 -2
- data/lib/new_relic/agent/connect/request_builder.rb +61 -0
- data/lib/new_relic/agent/connect/response_handler.rb +58 -0
- data/lib/new_relic/agent/custom_event_aggregator.rb +15 -15
- data/lib/new_relic/agent/database/explain_plan_helpers.rb +5 -6
- data/lib/new_relic/agent/database/obfuscation_helpers.rb +16 -15
- data/lib/new_relic/agent/database/obfuscator.rb +3 -3
- data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +4 -4
- data/lib/new_relic/agent/database.rb +44 -53
- data/lib/new_relic/agent/database_adapter.rb +35 -0
- data/lib/new_relic/agent/datastores/metric_helper.rb +18 -20
- data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +9 -8
- data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +7 -11
- data/lib/new_relic/agent/datastores/mongo.rb +7 -12
- data/lib/new_relic/agent/datastores/nosql_obfuscator.rb +41 -0
- data/lib/new_relic/agent/datastores/redis.rb +6 -12
- data/lib/new_relic/agent/datastores.rb +19 -23
- data/lib/new_relic/agent/deprecator.rb +2 -2
- data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +13 -12
- data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +87 -66
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +84 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +163 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +38 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context.rb +245 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +127 -0
- data/lib/new_relic/agent/distributed_tracing.rb +113 -32
- data/lib/new_relic/agent/encoding_normalizer.rb +5 -3
- data/lib/new_relic/agent/error_collector.rb +99 -63
- data/lib/new_relic/agent/error_event_aggregator.rb +10 -8
- data/lib/new_relic/agent/error_filter.rb +174 -0
- data/lib/new_relic/agent/error_trace_aggregator.rb +6 -4
- data/lib/new_relic/agent/event_aggregator.rb +43 -48
- data/lib/new_relic/agent/event_buffer.rb +8 -9
- data/lib/new_relic/agent/event_listener.rb +2 -3
- data/lib/new_relic/agent/event_loop.rb +27 -25
- data/lib/new_relic/agent/external.rb +20 -51
- data/lib/new_relic/agent/guid_generator.rb +30 -0
- data/lib/new_relic/agent/harvester.rb +5 -6
- data/lib/new_relic/agent/heap.rb +8 -10
- data/lib/new_relic/agent/hostname.rb +26 -5
- data/lib/new_relic/agent/http_clients/abstract.rb +81 -0
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +26 -26
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +31 -17
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +18 -23
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +12 -15
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +24 -8
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +9 -12
- data/lib/new_relic/agent/http_clients/uri_util.rb +12 -13
- data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +22 -52
- data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +39 -0
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +59 -72
- data/lib/new_relic/agent/instrumentation/action_dispatch.rb +31 -0
- data/lib/new_relic/agent/instrumentation/action_dispatch_subscriber.rb +64 -0
- data/lib/new_relic/agent/instrumentation/action_mailbox.rb +30 -0
- data/lib/new_relic/agent/instrumentation/action_mailbox_subscriber.rb +33 -0
- data/lib/new_relic/agent/instrumentation/action_mailer.rb +30 -0
- data/lib/new_relic/agent/instrumentation/action_mailer_subscriber.rb +85 -0
- data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +86 -62
- data/lib/new_relic/agent/instrumentation/active_job.rb +38 -19
- data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +21 -7
- data/lib/new_relic/agent/instrumentation/active_record.rb +95 -46
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +82 -61
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +155 -0
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +36 -12
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +69 -64
- data/lib/new_relic/agent/instrumentation/active_storage.rb +8 -4
- data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +11 -32
- data/lib/new_relic/agent/instrumentation/active_support.rb +27 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/chain.rb +23 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +20 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +12 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger.rb +24 -0
- data/lib/new_relic/agent/instrumentation/active_support_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +150 -0
- data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/bunny.rb +14 -134
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/chain.rb +36 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/instrumentation.rb +21 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/prepend.rb +27 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby.rb +31 -0
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +77 -61
- data/lib/new_relic/agent/instrumentation/curb/chain.rb +91 -0
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +221 -0
- data/lib/new_relic/agent/instrumentation/curb/prepend.rb +61 -0
- data/lib/new_relic/agent/instrumentation/curb.rb +15 -187
- data/lib/new_relic/agent/instrumentation/custom_events.rb +12 -0
- data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +37 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +35 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +48 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +30 -52
- data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +29 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +66 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch.rb +31 -0
- data/lib/new_relic/agent/instrumentation/excon/middleware.rb +8 -7
- data/lib/new_relic/agent/instrumentation/excon.rb +29 -31
- data/lib/new_relic/agent/instrumentation/fiber/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +24 -0
- data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +18 -0
- data/lib/new_relic/agent/instrumentation/fiber.rb +25 -0
- data/lib/new_relic/agent/instrumentation/grape/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
- data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
- data/lib/new_relic/agent/instrumentation/grape.rb +16 -121
- data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +97 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +89 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +111 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +30 -0
- data/lib/new_relic/agent/instrumentation/grpc/helper.rb +32 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/chain.rb +69 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +134 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/rpc_desc_prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/rpc_server_prepend.rb +26 -0
- data/lib/new_relic/agent/instrumentation/grpc_client.rb +23 -0
- data/lib/new_relic/agent/instrumentation/grpc_server.rb +25 -0
- data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +37 -0
- data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httpclient.rb +12 -32
- data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
- data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
- data/lib/new_relic/agent/instrumentation/ignore_actions.rb +5 -6
- data/lib/new_relic/agent/instrumentation/logger/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +66 -0
- data/lib/new_relic/agent/instrumentation/logger/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/logger.rb +26 -0
- data/lib/new_relic/agent/instrumentation/memcache/chain.rb +15 -0
- data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +58 -125
- data/lib/new_relic/agent/instrumentation/memcache/helper.rb +59 -0
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +90 -0
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +101 -0
- data/lib/new_relic/agent/instrumentation/memcache.rb +57 -71
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +15 -14
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +21 -14
- data/lib/new_relic/agent/instrumentation/mongo.rb +7 -132
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +49 -13
- data/lib/new_relic/agent/instrumentation/net_http/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +40 -0
- data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
- data/lib/new_relic/agent/instrumentation/net_http.rb +44 -0
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +142 -0
- data/lib/new_relic/agent/instrumentation/padrino/chain.rb +38 -0
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +28 -0
- data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
- data/lib/new_relic/agent/instrumentation/padrino.rb +22 -58
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +7 -7
- data/lib/new_relic/agent/instrumentation/queue_time.rb +9 -10
- data/lib/new_relic/agent/instrumentation/rack/chain.rb +66 -0
- data/lib/new_relic/agent/instrumentation/rack/helpers.rb +33 -0
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +75 -0
- data/lib/new_relic/agent/instrumentation/rack/prepend.rb +43 -0
- data/lib/new_relic/agent/instrumentation/rack.rb +33 -141
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +19 -55
- data/lib/new_relic/agent/instrumentation/rails_middleware.rb +5 -5
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +36 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +45 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +30 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/custom_events.rb +30 -0
- data/lib/new_relic/agent/instrumentation/rake/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +142 -0
- data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/rake.rb +18 -159
- data/lib/new_relic/agent/instrumentation/redis/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/redis/constants.rb +17 -0
- data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +93 -0
- data/lib/new_relic/agent/instrumentation/redis/middleware.rb +16 -0
- data/lib/new_relic/agent/instrumentation/redis/prepend.rb +29 -0
- data/lib/new_relic/agent/instrumentation/redis.rb +20 -103
- data/lib/new_relic/agent/instrumentation/resque/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/resque/helper.rb +19 -0
- data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +34 -0
- data/lib/new_relic/agent/instrumentation/resque/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/resque.rb +33 -41
- data/lib/new_relic/agent/instrumentation/sequel.rb +17 -20
- data/lib/new_relic/agent/instrumentation/sequel_helper.rb +3 -3
- data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +20 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +30 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +37 -0
- data/lib/new_relic/agent/instrumentation/sidekiq.rb +29 -46
- data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +31 -37
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +125 -0
- data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +3 -3
- data/lib/new_relic/agent/instrumentation/sinatra.rb +35 -165
- data/lib/new_relic/agent/instrumentation/thread/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +28 -0
- data/lib/new_relic/agent/instrumentation/thread/prepend.rb +22 -0
- data/lib/new_relic/agent/instrumentation/thread.rb +20 -0
- data/lib/new_relic/agent/instrumentation/tilt/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +41 -0
- data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/tilt.rb +25 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +80 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +14 -76
- data/lib/new_relic/agent/instrumentation.rb +2 -2
- data/lib/new_relic/agent/internal_agent_error.rb +3 -3
- data/lib/new_relic/agent/javascript_instrumentor.rb +51 -45
- data/lib/new_relic/agent/linking_metadata.rb +44 -0
- data/lib/new_relic/agent/local_log_decorator.rb +37 -0
- data/lib/new_relic/agent/log_event_aggregator.rb +235 -0
- data/lib/new_relic/agent/log_once.rb +2 -2
- data/lib/new_relic/agent/log_priority.rb +20 -0
- data/lib/new_relic/agent/logging.rb +142 -0
- data/lib/new_relic/agent/memory_logger.rb +3 -3
- data/lib/new_relic/agent/messaging.rb +81 -164
- data/lib/new_relic/agent/method_tracer.rb +152 -145
- data/lib/new_relic/agent/method_tracer_helpers.rb +90 -13
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +117 -0
- data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +28 -0
- data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +5 -6
- data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +9 -15
- data/lib/new_relic/agent/monitors.rb +26 -0
- data/lib/new_relic/agent/new_relic_service/encoders.rb +7 -7
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +6 -7
- data/lib/new_relic/agent/new_relic_service/marshaller.rb +8 -29
- data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +5 -5
- data/lib/new_relic/agent/new_relic_service.rb +282 -166
- data/lib/new_relic/agent/noticeable_error.rb +19 -0
- data/lib/new_relic/agent/null_logger.rb +8 -4
- data/lib/new_relic/agent/obfuscator.rb +9 -11
- data/lib/new_relic/agent/parameter_filtering.rb +35 -8
- data/lib/new_relic/agent/payload_metric_mapping.rb +10 -11
- data/lib/new_relic/agent/pipe_channel_manager.rb +28 -18
- data/lib/new_relic/agent/pipe_service.rb +9 -6
- data/lib/new_relic/agent/prepend_supportability.rb +3 -3
- data/lib/new_relic/agent/priority_sampled_buffer.rb +16 -14
- data/lib/new_relic/agent/range_extensions.rb +9 -29
- data/lib/new_relic/agent/rules_engine/replacement_rule.rb +12 -12
- data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +13 -14
- data/lib/new_relic/agent/rules_engine.rb +6 -5
- data/lib/new_relic/agent/sampler.rb +4 -5
- data/lib/new_relic/agent/sampler_collection.rb +4 -5
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +4 -3
- data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +14 -11
- data/lib/new_relic/agent/samplers/memory_sampler.rb +26 -15
- data/lib/new_relic/agent/samplers/object_sampler.rb +2 -2
- data/lib/new_relic/agent/samplers/vm_sampler.rb +22 -20
- data/lib/new_relic/agent/span_event_aggregator.rb +14 -16
- data/lib/new_relic/agent/span_event_primitive.rb +118 -58
- data/lib/new_relic/agent/sql_sampler.rb +25 -25
- data/lib/new_relic/agent/stats.rb +79 -42
- data/lib/new_relic/agent/stats_engine/gc_profiler.rb +11 -13
- data/lib/new_relic/agent/stats_engine/stats_hash.rb +13 -14
- data/lib/new_relic/agent/stats_engine.rb +11 -11
- data/lib/new_relic/agent/synthetics_event_aggregator.rb +8 -9
- data/lib/new_relic/agent/system_info.rb +100 -66
- data/lib/new_relic/agent/threading/agent_thread.rb +20 -16
- data/lib/new_relic/agent/threading/backtrace_node.rb +13 -14
- data/lib/new_relic/agent/threading/backtrace_service.rb +18 -18
- data/lib/new_relic/agent/threading/thread_profile.rb +31 -45
- data/lib/new_relic/agent/timestamp_sampled_buffer.rb +2 -2
- data/lib/new_relic/agent/tracer.rb +513 -0
- data/lib/new_relic/agent/transaction/abstract_segment.rb +131 -41
- data/lib/new_relic/agent/transaction/datastore_segment.rb +22 -18
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +184 -0
- data/lib/new_relic/agent/transaction/distributed_tracing.rb +72 -163
- data/lib/new_relic/agent/transaction/external_request_segment.rb +66 -63
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +34 -46
- data/lib/new_relic/agent/transaction/request_attributes.rb +36 -36
- data/lib/new_relic/agent/transaction/segment.rb +46 -10
- data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +2 -4
- data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +2 -2
- data/lib/new_relic/agent/transaction/trace.rb +21 -24
- data/lib/new_relic/agent/transaction/trace_builder.rb +11 -12
- data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
- data/lib/new_relic/agent/transaction/trace_node.rb +31 -28
- data/lib/new_relic/agent/transaction/tracing.rb +15 -111
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +6 -6
- data/lib/new_relic/agent/transaction.rb +252 -259
- data/lib/new_relic/agent/transaction_error_primitive.rb +34 -37
- data/lib/new_relic/agent/transaction_event_aggregator.rb +13 -13
- data/lib/new_relic/agent/transaction_event_primitive.rb +44 -56
- data/lib/new_relic/agent/transaction_event_recorder.rb +17 -16
- data/lib/new_relic/agent/transaction_metrics.rb +11 -10
- data/lib/new_relic/agent/transaction_sampler.rb +7 -12
- data/lib/new_relic/agent/transaction_time_aggregator.rb +41 -26
- data/lib/new_relic/agent/utilization/aws.rb +34 -4
- data/lib/new_relic/agent/utilization/azure.rb +4 -4
- data/lib/new_relic/agent/utilization/gcp.rb +8 -8
- data/lib/new_relic/agent/utilization/pcf.rb +6 -5
- data/lib/new_relic/agent/utilization/vendor.rb +44 -29
- data/lib/new_relic/agent/utilization_data.rb +43 -6
- data/lib/new_relic/agent/vm/jruby_vm.rb +2 -2
- data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +3 -3
- data/lib/new_relic/agent/vm/mri_vm.rb +46 -19
- data/lib/new_relic/agent/vm/snapshot.rb +6 -6
- data/lib/new_relic/agent/vm.rb +2 -2
- data/lib/new_relic/agent/worker_loop.rb +11 -13
- data/lib/new_relic/agent.rb +151 -79
- data/lib/new_relic/cli/command.rb +21 -23
- data/lib/new_relic/cli/commands/deployments.rb +94 -45
- data/lib/new_relic/cli/commands/install.rb +24 -26
- data/lib/new_relic/coerce.rb +42 -15
- data/lib/new_relic/collection_helper.rb +51 -49
- data/lib/new_relic/constants.rb +39 -0
- data/lib/new_relic/control/class_methods.rb +11 -5
- data/lib/new_relic/control/frameworks/external.rb +3 -3
- data/lib/new_relic/control/frameworks/rails.rb +24 -18
- data/lib/new_relic/control/frameworks/rails3.rb +4 -5
- data/lib/new_relic/control/frameworks/rails4.rb +2 -2
- data/lib/new_relic/control/frameworks/rails_notifications.rb +14 -0
- data/lib/new_relic/control/frameworks/ruby.rb +4 -4
- data/lib/new_relic/control/frameworks/sinatra.rb +8 -2
- data/lib/new_relic/control/frameworks.rb +2 -2
- data/lib/new_relic/control/instance_methods.rb +33 -42
- data/lib/new_relic/control/instrumentation.rb +40 -12
- data/lib/new_relic/control/private_instance_methods.rb +48 -0
- data/lib/new_relic/control/server_methods.rb +4 -5
- data/lib/new_relic/control.rb +2 -3
- data/lib/new_relic/delayed_job_injection.rb +2 -2
- data/lib/new_relic/dependency_detection.rb +129 -18
- data/lib/new_relic/environment_report.rb +41 -35
- data/lib/new_relic/helper.rb +49 -8
- data/lib/new_relic/language_support.rb +30 -6
- data/lib/new_relic/latest_changes.rb +9 -8
- data/lib/new_relic/local_environment.rb +23 -27
- data/lib/new_relic/metric_data.rb +32 -27
- data/lib/new_relic/metric_spec.rb +9 -7
- data/lib/new_relic/noticed_error.rb +46 -33
- data/lib/new_relic/rack/agent_hooks.rb +2 -2
- data/lib/new_relic/rack/agent_middleware.rb +7 -5
- data/lib/new_relic/rack/browser_monitoring.rb +134 -117
- data/lib/new_relic/rack.rb +2 -2
- data/lib/new_relic/recipes/capistrano3.rb +4 -62
- data/lib/new_relic/recipes/capistrano_legacy.rb +24 -27
- data/lib/new_relic/recipes/helpers/send_deployment.rb +70 -0
- data/lib/new_relic/recipes.rb +2 -2
- data/lib/new_relic/supportability_helper.rb +21 -7
- data/lib/new_relic/traced_thread.rb +39 -0
- data/lib/new_relic/version.rb +7 -18
- data/lib/newrelic_rpm.rb +20 -33
- data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +16 -19
- data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +9 -15
- data/lib/tasks/all.rb +4 -4
- data/lib/tasks/config.rake +22 -118
- data/lib/tasks/coverage_report.rake +28 -0
- data/lib/tasks/helpers/config.html.erb +21 -0
- data/lib/tasks/helpers/format.rb +123 -0
- data/lib/tasks/helpers/matches.rb +12 -0
- data/lib/tasks/helpers/prompt.rb +24 -0
- data/lib/tasks/helpers/removers.rb +33 -0
- data/lib/tasks/install.rake +4 -0
- data/lib/tasks/instrumentation_generator/README.md +63 -0
- data/lib/tasks/instrumentation_generator/TODO.md +33 -0
- data/lib/tasks/instrumentation_generator/instrumentation.thor +121 -0
- data/lib/tasks/instrumentation_generator/templates/Envfile.tt +9 -0
- data/lib/tasks/instrumentation_generator/templates/chain.tt +22 -0
- data/lib/tasks/instrumentation_generator/templates/chain_method.tt +8 -0
- data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +29 -0
- data/lib/tasks/instrumentation_generator/templates/instrumentation.tt +13 -0
- data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +3 -0
- data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +19 -0
- data/lib/tasks/instrumentation_generator/templates/prepend.tt +13 -0
- data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +3 -0
- data/lib/tasks/instrumentation_generator/templates/test.tt +15 -0
- data/lib/tasks/multiverse.rake +4 -0
- data/lib/tasks/multiverse.rb +12 -5
- data/lib/tasks/newrelic.rb +2 -2
- data/lib/tasks/tests.rake +14 -14
- data/newrelic.yml +672 -3
- data/newrelic_rpm.gemspec +40 -31
- data/recipes/newrelic.rb +3 -3
- data/test/agent_helper.rb +419 -98
- metadata +238 -127
- data/.travis.yml +0 -228
- data/bin/mongrel_rpm +0 -33
- data/cert/cacert.pem +0 -1177
- data/lib/new_relic/agent/commands/xray_session.rb +0 -55
- data/lib/new_relic/agent/commands/xray_session_collection.rb +0 -161
- data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
- data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +0 -44
- data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +0 -53
- data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -41
- data/lib/new_relic/agent/distributed_trace_payload.rb +0 -246
- data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
- data/lib/new_relic/agent/instrumentation/active_record_4.rb +0 -42
- data/lib/new_relic/agent/instrumentation/active_record_5.rb +0 -41
- data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -74
- data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -25
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -202
- data/lib/new_relic/agent/instrumentation/evented_subscriber.rb +0 -104
- data/lib/new_relic/agent/instrumentation/excon/connection.rb +0 -46
- data/lib/new_relic/agent/instrumentation/http.rb +0 -46
- data/lib/new_relic/agent/instrumentation/merb/controller.rb +0 -44
- data/lib/new_relic/agent/instrumentation/merb/errors.rb +0 -33
- data/lib/new_relic/agent/instrumentation/net.rb +0 -50
- data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +0 -125
- data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +0 -46
- data/lib/new_relic/agent/instrumentation/rails4/action_controller.rb +0 -32
- data/lib/new_relic/agent/instrumentation/rails4/action_view.rb +0 -27
- data/lib/new_relic/agent/instrumentation/rails5/action_cable.rb +0 -36
- data/lib/new_relic/agent/instrumentation/rails5/action_controller.rb +0 -33
- data/lib/new_relic/agent/instrumentation/rails5/action_view.rb +0 -27
- data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +0 -26
- data/lib/new_relic/agent/instrumentation/sunspot.rb +0 -33
- data/lib/new_relic/agent/supported_versions.rb +0 -275
- data/lib/new_relic/agent/transaction/attributes.rb +0 -154
- data/lib/new_relic/agent/transaction/xray_sample_buffer.rb +0 -64
- data/lib/new_relic/agent/transaction_state.rb +0 -186
- data/lib/new_relic/build.rb +0 -2
- data/lib/new_relic/control/frameworks/merb.rb +0 -29
- data/lib/new_relic/control/frameworks/rails5.rb +0 -14
- data/lib/new_relic/metrics.rb +0 -13
- data/lib/tasks/config.html.erb +0 -32
- data/lib/tasks/versions.html.erb +0 -28
- data/lib/tasks/versions.postface.html +0 -8
- data/lib/tasks/versions.preface.html +0 -9
- data/lib/tasks/versions.rake +0 -65
- data/lib/tasks/versions.txt.erb +0 -14
- /data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
@@ -0,0 +1,31 @@
|
|
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 'elasticsearch/instrumentation'
|
6
|
+
require_relative 'elasticsearch/chain'
|
7
|
+
require_relative 'elasticsearch/prepend'
|
8
|
+
|
9
|
+
DependencyDetection.defer do
|
10
|
+
named :elasticsearch
|
11
|
+
|
12
|
+
depends_on do
|
13
|
+
defined?(Elasticsearch)
|
14
|
+
end
|
15
|
+
|
16
|
+
executes do
|
17
|
+
NewRelic::Agent.logger.info('Installing Elasticsearch instrumentation')
|
18
|
+
|
19
|
+
to_instrument = if Gem::Version.create(Elasticsearch::VERSION) < Gem::Version.create("8.0.0")
|
20
|
+
Elasticsearch::Transport::Client
|
21
|
+
else
|
22
|
+
Elastic::Transport::Client
|
23
|
+
end
|
24
|
+
|
25
|
+
if use_prepend?
|
26
|
+
prepend_instrument to_instrument, NewRelic::Agent::Instrumentation::Elasticsearch::Prepend
|
27
|
+
else
|
28
|
+
chain_instrument NewRelic::Agent::Instrumentation::Elasticsearch
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
module ::Excon
|
6
6
|
module Middleware
|
@@ -11,7 +11,7 @@ module ::Excon
|
|
11
11
|
@stack = stack
|
12
12
|
end
|
13
13
|
|
14
|
-
def request_call(datum) #THREAD_LOCAL_ACCESS
|
14
|
+
def request_call(datum) # THREAD_LOCAL_ACCESS
|
15
15
|
begin
|
16
16
|
# Only instrument this request if we haven't already done so, because
|
17
17
|
# we can get request_call multiple times for requests marked as
|
@@ -25,7 +25,7 @@ module ::Excon
|
|
25
25
|
procedure: wrapped_request.method
|
26
26
|
)
|
27
27
|
|
28
|
-
segment.add_request_headers
|
28
|
+
segment.add_request_headers(wrapped_request)
|
29
29
|
|
30
30
|
datum[:connection].instance_variable_set(TRACE_DATA_IVAR, segment)
|
31
31
|
end
|
@@ -45,18 +45,19 @@ module ::Excon
|
|
45
45
|
@stack.error_call(datum)
|
46
46
|
end
|
47
47
|
|
48
|
-
def finish_trace(datum) #THREAD_LOCAL_ACCESS
|
48
|
+
def finish_trace(datum) # THREAD_LOCAL_ACCESS
|
49
49
|
segment = datum[:connection] && datum[:connection].instance_variable_get(TRACE_DATA_IVAR)
|
50
50
|
if segment
|
51
51
|
begin
|
52
|
+
segment.notice_error(datum[:error]) if datum[:error]
|
52
53
|
datum[:connection].instance_variable_set(TRACE_DATA_IVAR, nil)
|
53
54
|
|
54
55
|
if datum[:response]
|
55
56
|
wrapped_response = ::NewRelic::Agent::HTTPClients::ExconHTTPResponse.new(datum[:response])
|
56
|
-
segment.
|
57
|
+
segment.process_response_headers(wrapped_response)
|
57
58
|
end
|
58
59
|
ensure
|
59
|
-
|
60
|
+
::NewRelic::Agent::Transaction::Segment.finish(segment)
|
60
61
|
end
|
61
62
|
end
|
62
63
|
end
|
@@ -1,21 +1,13 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
DependencyDetection.defer do
|
6
6
|
named :excon
|
7
7
|
|
8
|
-
# We
|
9
|
-
# - For newer versions, use the middleware mechanism Excon exposes
|
10
|
-
# - For older versions, monkey-patch Excon::Connection#request
|
8
|
+
# We instrument Excon 0.19.0 and above using the middleware mechanism
|
11
9
|
#
|
12
10
|
# EXCON_MIN_VERSION is the minimum version we attempt to instrument at all.
|
13
|
-
# EXCON_MIDDLEWARE_MIN_VERSION is the min version we use the newer
|
14
|
-
# instrumentation for.
|
15
|
-
#
|
16
|
-
# Note that middlewares were added to Excon prior to 0.19, but we don't
|
17
|
-
# use middleware-based instrumentation prior to that version because it didn't
|
18
|
-
# expose a way for middlewares to know about request failures.
|
19
11
|
#
|
20
12
|
# Why don't we use Excon.defaults[:instrumentor]?
|
21
13
|
# While this might seem a perfect fit, it unfortunately isn't suitable in
|
@@ -25,48 +17,54 @@ DependencyDetection.defer do
|
|
25
17
|
# so we could safely subscribe and not be clobbered by future subscribers,
|
26
18
|
# but alas, it does not yet.
|
27
19
|
|
28
|
-
|
29
|
-
|
20
|
+
# TODO: MAJOR VERSION - update min version to 0.56.0
|
21
|
+
EXCON_MIN_VERSION = Gem::Version.new("0.19.0")
|
30
22
|
|
31
23
|
depends_on do
|
32
|
-
defined?(
|
24
|
+
defined?(Excon) && defined?(Excon::VERSION)
|
33
25
|
end
|
34
26
|
|
35
27
|
executes do
|
36
|
-
excon_version = Gem::Version.new(
|
28
|
+
excon_version = Gem::Version.new(Excon::VERSION)
|
37
29
|
if excon_version >= EXCON_MIN_VERSION
|
38
30
|
install_excon_instrumentation(excon_version)
|
39
31
|
else
|
40
|
-
|
32
|
+
NewRelic::Agent.logger.warn("Excon instrumentation requires at least version #{EXCON_MIN_VERSION}")
|
41
33
|
end
|
42
34
|
end
|
43
35
|
|
36
|
+
executes do
|
37
|
+
next unless Gem::Version.new(Excon::VERSION) < Gem::Version.new('0.56.0')
|
38
|
+
|
39
|
+
deprecation_msg = 'Instrumentation for Excon versions below 0.56.0 is deprecated.' \
|
40
|
+
'They will stop being monitored in version 9.0.0. ' \
|
41
|
+
'Please upgrade your Excon version to continue receiving full support. '
|
42
|
+
|
43
|
+
NewRelic::Agent.logger.log_once(
|
44
|
+
:warn,
|
45
|
+
:deprecated_excon_version,
|
46
|
+
deprecation_msg
|
47
|
+
)
|
48
|
+
|
49
|
+
NewRelic::Agent.record_metric("Supportability/Deprecated/Excon", 1)
|
50
|
+
end
|
51
|
+
|
44
52
|
def install_excon_instrumentation(excon_version)
|
45
|
-
require 'new_relic/agent/cross_app_tracing'
|
53
|
+
require 'new_relic/agent/distributed_tracing/cross_app_tracing'
|
46
54
|
require 'new_relic/agent/http_clients/excon_wrappers'
|
47
55
|
|
48
|
-
|
49
|
-
install_middleware_excon_instrumentation
|
50
|
-
else
|
51
|
-
install_legacy_excon_instrumentation
|
52
|
-
end
|
56
|
+
install_middleware_excon_instrumentation
|
53
57
|
end
|
54
58
|
|
55
59
|
def install_middleware_excon_instrumentation
|
56
|
-
|
60
|
+
NewRelic::Agent.logger.info('Installing middleware-based Excon instrumentation')
|
57
61
|
require 'new_relic/agent/instrumentation/excon/middleware'
|
58
62
|
defaults = Excon.defaults
|
59
63
|
|
60
64
|
if defaults[:middlewares]
|
61
|
-
defaults[:middlewares] <<
|
65
|
+
defaults[:middlewares] << Excon::Middleware::NewRelicCrossAppTracing
|
62
66
|
else
|
63
|
-
|
67
|
+
NewRelic::Agent.logger.warn("Did not find :middlewares key in Excon.defaults, skipping Excon instrumentation")
|
64
68
|
end
|
65
69
|
end
|
66
|
-
|
67
|
-
def install_legacy_excon_instrumentation
|
68
|
-
::NewRelic::Agent.logger.info 'Installing legacy Excon instrumentation'
|
69
|
-
require 'new_relic/agent/instrumentation/excon/connection'
|
70
|
-
::Excon::Connection.install_newrelic_instrumentation
|
71
|
-
end
|
72
70
|
end
|
@@ -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 MonitoredFiber
|
7
|
+
def self.instrument!
|
8
|
+
::Fiber.class_eval do
|
9
|
+
include NewRelic::Agent::Instrumentation::MonitoredFiber
|
10
|
+
|
11
|
+
alias_method(:initialize_without_new_relic, :initialize)
|
12
|
+
|
13
|
+
def initialize(*args, &block)
|
14
|
+
traced_block = add_thread_tracing(*args, &block)
|
15
|
+
initialize_with_newrelic_tracing { initialize_without_new_relic(*args, &traced_block) }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
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 MonitoredFiber
|
7
|
+
attr_reader :nr_parent_key
|
8
|
+
|
9
|
+
def initialize_with_newrelic_tracing
|
10
|
+
@nr_parent_key = NewRelic::Agent::Tracer.current_segment_key
|
11
|
+
yield
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_thread_tracing(*args, &block)
|
15
|
+
return block if !NewRelic::Agent::Tracer.thread_tracing_enabled?
|
16
|
+
|
17
|
+
NewRelic::Agent::Tracer.thread_block_with_current_transaction(
|
18
|
+
*args,
|
19
|
+
segment_name: 'Ruby/Fiber',
|
20
|
+
&block
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,18 @@
|
|
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 MonitoredFiber
|
9
|
+
module Prepend
|
10
|
+
include NewRelic::Agent::Instrumentation::MonitoredFiber
|
11
|
+
|
12
|
+
def initialize(*args, &block)
|
13
|
+
traced_block = add_thread_tracing(*args, &block)
|
14
|
+
initialize_with_newrelic_tracing { super(*args, &traced_block) }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
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 'fiber/instrumentation'
|
6
|
+
require_relative 'fiber/chain'
|
7
|
+
require_relative 'fiber/prepend'
|
8
|
+
|
9
|
+
DependencyDetection.defer do
|
10
|
+
named :fiber
|
11
|
+
|
12
|
+
depends_on do
|
13
|
+
defined?(Fiber)
|
14
|
+
end
|
15
|
+
|
16
|
+
executes do
|
17
|
+
NewRelic::Agent.logger.info('Installing Fiber instrumentation')
|
18
|
+
|
19
|
+
if use_prepend?
|
20
|
+
prepend_instrument Fiber, NewRelic::Agent::Instrumentation::MonitoredFiber::Prepend
|
21
|
+
else
|
22
|
+
chain_instrument NewRelic::Agent::Instrumentation::MonitoredFiber
|
23
|
+
end
|
24
|
+
end
|
25
|
+
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 Grape
|
7
|
+
module Chain
|
8
|
+
def self.instrument!
|
9
|
+
Grape::Instrumentation.instrumented_class.class_eval do
|
10
|
+
def call_with_new_relic(env)
|
11
|
+
begin
|
12
|
+
call_without_new_relic(env)
|
13
|
+
ensure
|
14
|
+
Grape::Instrumentation.capture_transaction(env, self)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
alias_method(:call_without_new_relic, :call)
|
19
|
+
alias_method(:call, :call_with_new_relic)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,100 @@
|
|
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/parameter_filtering'
|
6
|
+
|
7
|
+
module NewRelic::Agent::Instrumentation
|
8
|
+
module Grape
|
9
|
+
module Instrumentation
|
10
|
+
extend self
|
11
|
+
|
12
|
+
# 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
|
+
# https://github.com/ruby-grape/grape/blob/c20a73ac1e3f3ba1082005ed61bf69452373ba87/UPGRADING.md#upgrading-to--120
|
14
|
+
def instrumented_class
|
15
|
+
defined?(::Grape::API::Instance) ? ::Grape::API::Instance : ::Grape::API
|
16
|
+
end
|
17
|
+
|
18
|
+
def capture_transaction(env, context)
|
19
|
+
begin
|
20
|
+
endpoint = env[API_ENDPOINT]
|
21
|
+
version = env[API_VERSION]
|
22
|
+
|
23
|
+
api_class = (context.class.respond_to?(:base) && context.class.base) || context.class
|
24
|
+
handle_transaction(endpoint, api_class.name, version)
|
25
|
+
rescue => e
|
26
|
+
::NewRelic::Agent.logger.warn("Error in Grape instrumentation", e)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def prepare!
|
31
|
+
if defined?(::Grape::VERSION) && Gem::Version.new(::Grape::VERSION) >= Gem::Version.new("0.16.0")
|
32
|
+
send(:remove_method, :name_for_transaction_deprecated)
|
33
|
+
else
|
34
|
+
send(:remove_method, :name_for_transaction)
|
35
|
+
send(:alias_method, :name_for_transaction, :name_for_transaction_deprecated)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
API_ENDPOINT = 'api.endpoint'.freeze
|
40
|
+
API_VERSION = 'api.version'.freeze
|
41
|
+
FORMAT_REGEX = /\(\/?\.[\:\w]*\)/.freeze # either :format (< 0.12.0) or .ext (>= 0.12.0)
|
42
|
+
VERSION_REGEX = /:version(\/|$)/.freeze
|
43
|
+
MIN_VERSION = Gem::Version.new("0.2.0")
|
44
|
+
PIPE_STRING = '|'.freeze
|
45
|
+
|
46
|
+
def handle_transaction(endpoint, class_name, version)
|
47
|
+
return unless endpoint && route = endpoint.route
|
48
|
+
|
49
|
+
name_transaction(route, class_name, version)
|
50
|
+
capture_params(endpoint)
|
51
|
+
end
|
52
|
+
|
53
|
+
def name_transaction(route, class_name, version)
|
54
|
+
txn_name = name_for_transaction(route, class_name, version)
|
55
|
+
segment_name = "Middleware/Grape/#{class_name}/call"
|
56
|
+
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
|
+
end
|
60
|
+
|
61
|
+
def name_for_transaction(route, class_name, version)
|
62
|
+
action_name = route.path.sub(FORMAT_REGEX, NewRelic::EMPTY_STR)
|
63
|
+
method_name = route.request_method
|
64
|
+
version ||= route.version
|
65
|
+
|
66
|
+
# defaulting does not set rack.env['api.version'] and route.version may return Array
|
67
|
+
#
|
68
|
+
version = version.join(PIPE_STRING) if Array === version
|
69
|
+
|
70
|
+
if version
|
71
|
+
action_name = action_name.sub(VERSION_REGEX, NewRelic::EMPTY_STR)
|
72
|
+
"#{class_name}-#{version}#{action_name} (#{method_name})"
|
73
|
+
else
|
74
|
+
"#{class_name}#{action_name} (#{method_name})"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def name_for_transaction_deprecated(route, class_name, version)
|
79
|
+
action_name = route.route_path.sub(FORMAT_REGEX, NewRelic::EMPTY_STR)
|
80
|
+
method_name = route.route_method
|
81
|
+
version ||= route.route_version
|
82
|
+
if version
|
83
|
+
action_name = action_name.sub(VERSION_REGEX, NewRelic::EMPTY_STR)
|
84
|
+
"#{class_name}-#{version}#{action_name} (#{method_name})"
|
85
|
+
else
|
86
|
+
"#{class_name}#{action_name} (#{method_name})"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def capture_params(endpoint)
|
91
|
+
txn = ::NewRelic::Agent::Transaction.tl_current
|
92
|
+
env = endpoint.request.env
|
93
|
+
params = ::NewRelic::Agent::ParameterFiltering::apply_filters(env, endpoint.params)
|
94
|
+
params.delete("route_info")
|
95
|
+
txn.filtered_params = params
|
96
|
+
txn.merge_request_parameters(params)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,17 @@
|
|
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 Grape
|
7
|
+
module Prepend
|
8
|
+
def call(env)
|
9
|
+
begin
|
10
|
+
super(env)
|
11
|
+
ensure
|
12
|
+
Grape::Instrumentation.capture_transaction(env, self)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,149 +1,44 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
module Agent
|
9
|
-
module Instrumentation
|
10
|
-
module GrapeInstrumentation
|
11
|
-
extend self
|
12
|
-
|
13
|
-
API_ENDPOINT = 'api.endpoint'.freeze
|
14
|
-
API_VERSION = 'api.version'.freeze
|
15
|
-
FORMAT_REGEX = /\(\/?\.[\:\w]*\)/.freeze # either :format (< 0.12.0) or .ext (>= 0.12.0)
|
16
|
-
VERSION_REGEX = /:version(\/|$)/.freeze
|
17
|
-
EMPTY_STRING = ''.freeze
|
18
|
-
MIN_VERSION = Gem::Version.new("0.2.0")
|
19
|
-
PIPE_STRING = '|'.freeze
|
20
|
-
|
21
|
-
def handle_transaction(endpoint, class_name, version)
|
22
|
-
return unless endpoint && route = endpoint.route
|
23
|
-
name_transaction(route, class_name, version)
|
24
|
-
capture_params(endpoint)
|
25
|
-
end
|
26
|
-
|
27
|
-
def name_transaction(route, class_name, version)
|
28
|
-
txn_name = name_for_transaction(route, class_name, version)
|
29
|
-
node_name = "Middleware/Grape/#{class_name}/call"
|
30
|
-
Transaction.set_default_transaction_name(txn_name, :grape, node_name)
|
31
|
-
end
|
32
|
-
|
33
|
-
def name_for_transaction(route, class_name, version)
|
34
|
-
action_name = route.path.sub(FORMAT_REGEX, EMPTY_STRING)
|
35
|
-
method_name = route.request_method
|
36
|
-
version ||= route.version
|
37
|
-
|
38
|
-
# defaulting does not set rack.env['api.version'] and route.version may return Array
|
39
|
-
#
|
40
|
-
version = version.join(PIPE_STRING) if Array === version
|
41
|
-
|
42
|
-
if version
|
43
|
-
action_name = action_name.sub(VERSION_REGEX, EMPTY_STRING)
|
44
|
-
"#{class_name}-#{version}#{action_name} (#{method_name})"
|
45
|
-
else
|
46
|
-
"#{class_name}#{action_name} (#{method_name})"
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def name_for_transaction_deprecated(route, class_name, version)
|
51
|
-
action_name = route.route_path.sub(FORMAT_REGEX, EMPTY_STRING)
|
52
|
-
method_name = route.route_method
|
53
|
-
version ||= route.route_version
|
54
|
-
|
55
|
-
if version
|
56
|
-
action_name = action_name.sub(VERSION_REGEX, EMPTY_STRING)
|
57
|
-
"#{class_name}-#{version}#{action_name} (#{method_name})"
|
58
|
-
else
|
59
|
-
"#{class_name}#{action_name} (#{method_name})"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def capture_params(endpoint)
|
64
|
-
txn = Transaction.tl_current
|
65
|
-
env = endpoint.request.env
|
66
|
-
params = ParameterFiltering::apply_filters(env, endpoint.params)
|
67
|
-
params.delete("route_info")
|
68
|
-
txn.filtered_params = params
|
69
|
-
txn.merge_request_parameters(params)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
5
|
+
require_relative 'grape/instrumentation'
|
6
|
+
require_relative 'grape/chain'
|
7
|
+
require_relative 'grape/prepend'
|
75
8
|
|
76
9
|
DependencyDetection.defer do
|
77
10
|
# Why not just :grape? newrelic-grape used that name already, and while we're
|
78
11
|
# not shipping yet, overloading the name interferes with the plugin.
|
79
|
-
|
80
|
-
|
81
|
-
depends_on do
|
82
|
-
::NewRelic::Agent.config[:disable_grape] == false
|
83
|
-
end
|
12
|
+
@name = :grape_instrumentation
|
13
|
+
configure_with :grape
|
84
14
|
|
85
15
|
depends_on do
|
86
|
-
defined?(
|
87
|
-
Gem::Version.new(
|
16
|
+
defined?(Grape::VERSION) &&
|
17
|
+
Gem::Version.new(Grape::VERSION) >= NewRelic::Agent::Instrumentation::Grape::Instrumentation::MIN_VERSION
|
88
18
|
end
|
89
19
|
|
90
20
|
depends_on do
|
91
21
|
begin
|
92
22
|
if defined?(Bundler) && Bundler.rubygems.all_specs.map(&:name).include?("newrelic-grape")
|
93
|
-
|
23
|
+
NewRelic::Agent.logger.info("Not installing New Relic supported Grape instrumentation because the third party newrelic-grape gem is present")
|
94
24
|
false
|
95
25
|
else
|
96
26
|
true
|
97
27
|
end
|
98
28
|
rescue => e
|
99
|
-
|
29
|
+
NewRelic::Agent.logger.info("Could not determine if third party newrelic-grape gem is installed", e)
|
100
30
|
true
|
101
31
|
end
|
102
32
|
end
|
103
33
|
|
104
34
|
executes do
|
105
|
-
NewRelic::Agent.
|
106
|
-
instrument_call
|
107
|
-
end
|
35
|
+
NewRelic::Agent::Instrumentation::Grape::Instrumentation.prepare!
|
108
36
|
|
109
|
-
|
110
|
-
|
111
|
-
|
37
|
+
if use_prepend?
|
38
|
+
instrumented_class = NewRelic::Agent::Instrumentation::Grape::Instrumentation.instrumented_class
|
39
|
+
prepend_instrument instrumented_class, NewRelic::Agent::Instrumentation::Grape::Prepend
|
112
40
|
else
|
113
|
-
|
114
|
-
::NewRelic::Agent::Instrumentation::GrapeInstrumentation.send :alias_method, :name_for_transaction, :name_for_transaction_deprecated
|
115
|
-
end
|
116
|
-
|
117
|
-
# 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`
|
118
|
-
# https://github.com/ruby-grape/grape/blob/c20a73ac1e3f3ba1082005ed61bf69452373ba87/UPGRADING.md#upgrading-to--120
|
119
|
-
grape_api_class = if defined?(Grape::API::Instance)
|
120
|
-
::Grape::API::Instance
|
121
|
-
else
|
122
|
-
::Grape::API
|
123
|
-
end
|
124
|
-
|
125
|
-
grape_api_class.class_eval do
|
126
|
-
def call_with_new_relic(env)
|
127
|
-
begin
|
128
|
-
response = call_without_new_relic(env)
|
129
|
-
ensure
|
130
|
-
begin
|
131
|
-
endpoint = env[::NewRelic::Agent::Instrumentation::GrapeInstrumentation::API_ENDPOINT]
|
132
|
-
version = env[::NewRelic::Agent::Instrumentation::GrapeInstrumentation::API_VERSION]
|
133
|
-
|
134
|
-
# Since 1.2.0, how to obtain the class name is changed.
|
135
|
-
class_name = self.class.respond_to?(:base) ? self.class.base.name : self.class.name
|
136
|
-
::NewRelic::Agent::Instrumentation::GrapeInstrumentation.handle_transaction(endpoint, class_name, version)
|
137
|
-
rescue => e
|
138
|
-
::NewRelic::Agent.logger.warn("Error in Grape instrumentation", e)
|
139
|
-
end
|
140
|
-
end
|
141
|
-
|
142
|
-
response
|
143
|
-
end
|
144
|
-
|
145
|
-
alias_method :call_without_new_relic, :call
|
146
|
-
alias_method :call, :call_with_new_relic
|
41
|
+
chain_instrument NewRelic::Agent::Instrumentation::Grape::Chain
|
147
42
|
end
|
148
43
|
end
|
149
44
|
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
require_relative 'instrumentation'
|
6
|
+
|
7
|
+
module NewRelic::Agent::Instrumentation
|
8
|
+
module GRPC
|
9
|
+
module Client
|
10
|
+
module Chain
|
11
|
+
def self.instrument!
|
12
|
+
::GRPC::ClientStub.class_eval do
|
13
|
+
include NewRelic::Agent::Instrumentation::GRPC::Client
|
14
|
+
|
15
|
+
def bidi_streamer_with_new_relic_trace(method, requests, marshal, unmarshal,
|
16
|
+
deadline: nil,
|
17
|
+
return_op: false,
|
18
|
+
parent: nil,
|
19
|
+
credentials: nil,
|
20
|
+
metadata: {},
|
21
|
+
&blk)
|
22
|
+
|
23
|
+
issue_request_with_tracing(:bidi_streamer, method, requests, marshal, unmarshal,
|
24
|
+
deadline: deadline,
|
25
|
+
return_op: return_op,
|
26
|
+
parent: parent,
|
27
|
+
credentials: credentials,
|
28
|
+
metadata: metadata)
|
29
|
+
|
30
|
+
# TODO: gRPC - confirm that &blk is being invoked correctly
|
31
|
+
end
|
32
|
+
|
33
|
+
alias bidi_streamer_without_newrelic_trace bidi_streamer
|
34
|
+
alias bidi_streamer bidi_streamer_with_newrelic_trace
|
35
|
+
|
36
|
+
def client_streamer_with_newrelic_trace(method, requests, marshal, unmarshal,
|
37
|
+
deadline: nil,
|
38
|
+
return_op: false,
|
39
|
+
parent: nil,
|
40
|
+
credentials: nil,
|
41
|
+
metadata: {})
|
42
|
+
|
43
|
+
issue_request_with_tracing(:client_streamer, method, requests, marshal, unmarshal,
|
44
|
+
deadline: deadline,
|
45
|
+
return_op: return_op,
|
46
|
+
parent: parent,
|
47
|
+
credentials: credentials,
|
48
|
+
metadata: metadata)
|
49
|
+
end
|
50
|
+
|
51
|
+
alias client_streamer_without_newrelic_trace client_streamer
|
52
|
+
alias client_streamer client_streamer_with_newrelic_trace
|
53
|
+
|
54
|
+
def request_response_with_newrelic_trace(method, req, marshal, unmarshal,
|
55
|
+
deadline: nil,
|
56
|
+
return_op: false,
|
57
|
+
parent: nil,
|
58
|
+
credentials: nil,
|
59
|
+
metadata: {})
|
60
|
+
|
61
|
+
issue_request_with_tracing(:request_response, method, req, marshal, unmarshal,
|
62
|
+
deadline: deadline,
|
63
|
+
return_op: return_op,
|
64
|
+
parent: parent,
|
65
|
+
credentials: credentials,
|
66
|
+
metadata: metadata)
|
67
|
+
end
|
68
|
+
|
69
|
+
alias request_response_without_newrelic_trace request_response
|
70
|
+
alias request_response request_response_with_newrelic_trace
|
71
|
+
|
72
|
+
def server_streamer_with_newrelic_trace(method, req, marshal, unmarshal,
|
73
|
+
deadline: nil,
|
74
|
+
return_op: false,
|
75
|
+
parent: nil,
|
76
|
+
credentials: nil,
|
77
|
+
metadata: {},
|
78
|
+
&blk)
|
79
|
+
|
80
|
+
issue_request_with_tracing(:server_streamer, method, req, marshal, unmarshal,
|
81
|
+
deadline: deadline,
|
82
|
+
return_op: return_op,
|
83
|
+
parent: parent,
|
84
|
+
credentials: credentials,
|
85
|
+
metadata: metadata)
|
86
|
+
|
87
|
+
# TODO: gRPC - confirm that &blk is being invoked correctly
|
88
|
+
end
|
89
|
+
|
90
|
+
alias server_streamer_without_newrelic_trace server_streamer
|
91
|
+
alias server_streamer server_streamer_with_newrelic_trace
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|