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,513 @@
|
|
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 'fiber'
|
6
|
+
require 'new_relic/agent/transaction'
|
7
|
+
require 'new_relic/agent/transaction/segment'
|
8
|
+
require 'new_relic/agent/transaction/datastore_segment'
|
9
|
+
require 'new_relic/agent/transaction/external_request_segment'
|
10
|
+
require 'new_relic/agent/transaction/message_broker_segment'
|
11
|
+
|
12
|
+
module NewRelic
|
13
|
+
module Agent
|
14
|
+
#
|
15
|
+
# This class helps you interact with the current transaction (if
|
16
|
+
# it exists), start new transactions/segments, etc.
|
17
|
+
#
|
18
|
+
# @api public
|
19
|
+
class Tracer
|
20
|
+
class << self
|
21
|
+
def state
|
22
|
+
state_for(Thread.current)
|
23
|
+
end
|
24
|
+
|
25
|
+
alias_method :tl_get, :state
|
26
|
+
|
27
|
+
# Returns +true+ unless called from within an
|
28
|
+
# +NewRelic::Agent.disable_all_tracing+ block.
|
29
|
+
#
|
30
|
+
# @api public
|
31
|
+
def tracing_enabled?
|
32
|
+
state.tracing_enabled?
|
33
|
+
end
|
34
|
+
|
35
|
+
# Returns the transaction in progress for this thread, or
|
36
|
+
# +nil+ if none exists.
|
37
|
+
#
|
38
|
+
# @api public
|
39
|
+
def current_transaction
|
40
|
+
state.current_transaction
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns the trace_id of the current_transaction, or +nil+ if
|
44
|
+
# none exists.
|
45
|
+
#
|
46
|
+
# @api public
|
47
|
+
def current_trace_id
|
48
|
+
if txn = current_transaction
|
49
|
+
txn.trace_id
|
50
|
+
end
|
51
|
+
end
|
52
|
+
alias_method :trace_id, :current_trace_id
|
53
|
+
|
54
|
+
# Returns the id of the current span, or +nil+ if none exists.
|
55
|
+
#
|
56
|
+
# @api public
|
57
|
+
def current_span_id
|
58
|
+
if span = current_segment
|
59
|
+
span.guid
|
60
|
+
end
|
61
|
+
end
|
62
|
+
alias_method :span_id, :current_span_id
|
63
|
+
|
64
|
+
# Returns a boolean indicating whether the current_transaction
|
65
|
+
# is sampled, or +nil+ if there is no current transaction.
|
66
|
+
#
|
67
|
+
# @api public
|
68
|
+
def transaction_sampled?
|
69
|
+
if txn = current_transaction
|
70
|
+
txn.sampled?
|
71
|
+
end
|
72
|
+
end
|
73
|
+
alias_method :sampled?, :transaction_sampled?
|
74
|
+
|
75
|
+
# Runs the given block of code in a transaction.
|
76
|
+
#
|
77
|
+
# @param [String] name reserved for New Relic internal use
|
78
|
+
#
|
79
|
+
# @param [String] partial_name a meaningful name for this
|
80
|
+
# transaction (e.g., +blogs/index+); the Ruby agent will add a
|
81
|
+
# New-Relic-specific prefix
|
82
|
+
#
|
83
|
+
# @param [Symbol] category +:web+ for web transactions or
|
84
|
+
# +:background+ for background transactions
|
85
|
+
#
|
86
|
+
# @param [Hash] options reserved for New Relic internal use
|
87
|
+
#
|
88
|
+
# @api public
|
89
|
+
def in_transaction(name: nil,
|
90
|
+
partial_name: nil,
|
91
|
+
category:,
|
92
|
+
options: {})
|
93
|
+
|
94
|
+
finishable = start_transaction_or_segment(
|
95
|
+
name: name,
|
96
|
+
partial_name: partial_name,
|
97
|
+
category: category,
|
98
|
+
options: options
|
99
|
+
)
|
100
|
+
|
101
|
+
begin
|
102
|
+
# We shouldn't raise from Tracer.start_transaction_or_segment, but
|
103
|
+
# only wrap the yield to be absolutely sure we don't report agent
|
104
|
+
# problems as app errors
|
105
|
+
yield
|
106
|
+
rescue => exception
|
107
|
+
current_transaction.notice_error(exception)
|
108
|
+
raise
|
109
|
+
ensure
|
110
|
+
finishable.finish if finishable
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
# Starts a segment on the current transaction (if one exists)
|
115
|
+
# or starts a new transaction otherwise.
|
116
|
+
#
|
117
|
+
# @param [String] name reserved for New Relic internal use
|
118
|
+
#
|
119
|
+
# @param [String] partial_name a meaningful name for this
|
120
|
+
# transaction (e.g., +blogs/index+); the Ruby agent will add a
|
121
|
+
# New-Relic-specific prefix
|
122
|
+
#
|
123
|
+
# @param [Symbol] category +:web+ for web transactions or
|
124
|
+
# +:task+ for background transactions
|
125
|
+
#
|
126
|
+
# @param [Hash] options reserved for New Relic internal use
|
127
|
+
#
|
128
|
+
# @return [Object, #finish] an object that responds to
|
129
|
+
# +finish+; you _must_ call +finish+ on it at the end of the
|
130
|
+
# code you're tracing
|
131
|
+
#
|
132
|
+
# @api public
|
133
|
+
def start_transaction_or_segment(name: nil,
|
134
|
+
partial_name: nil,
|
135
|
+
category:,
|
136
|
+
options: {})
|
137
|
+
|
138
|
+
raise ArgumentError, 'missing required argument: name or partial_name' if name.nil? && partial_name.nil?
|
139
|
+
|
140
|
+
if name
|
141
|
+
options[:transaction_name] = name
|
142
|
+
else
|
143
|
+
options[:transaction_name] = Transaction.name_from_partial(
|
144
|
+
partial_name,
|
145
|
+
category
|
146
|
+
)
|
147
|
+
end
|
148
|
+
|
149
|
+
if (txn = current_transaction)
|
150
|
+
txn.create_nested_segment(category, options)
|
151
|
+
else
|
152
|
+
Transaction.start_new_transaction(state, category, options)
|
153
|
+
end
|
154
|
+
rescue ArgumentError
|
155
|
+
raise
|
156
|
+
rescue => exception
|
157
|
+
log_error('start_transaction_or_segment', exception)
|
158
|
+
end
|
159
|
+
|
160
|
+
# Takes name or partial_name and a category.
|
161
|
+
# Returns a transaction instance or nil
|
162
|
+
def start_transaction(category:,
|
163
|
+
name: nil,
|
164
|
+
partial_name: nil,
|
165
|
+
**options)
|
166
|
+
|
167
|
+
raise ArgumentError, 'missing required argument: name or partial_name' if name.nil? && partial_name.nil?
|
168
|
+
|
169
|
+
return current_transaction if current_transaction
|
170
|
+
|
171
|
+
if name
|
172
|
+
options[:transaction_name] = name
|
173
|
+
else
|
174
|
+
options[:transaction_name] = Transaction.name_from_partial(
|
175
|
+
partial_name,
|
176
|
+
category
|
177
|
+
)
|
178
|
+
end
|
179
|
+
|
180
|
+
Transaction.start_new_transaction(state,
|
181
|
+
category,
|
182
|
+
options)
|
183
|
+
rescue ArgumentError
|
184
|
+
raise
|
185
|
+
rescue => exception
|
186
|
+
log_error('start_transaction', exception)
|
187
|
+
end
|
188
|
+
|
189
|
+
def create_distributed_trace_payload
|
190
|
+
return unless txn = current_transaction
|
191
|
+
|
192
|
+
txn.distributed_tracer.create_distributed_trace_payload
|
193
|
+
end
|
194
|
+
|
195
|
+
def accept_distributed_trace_payload(payload)
|
196
|
+
return unless txn = current_transaction
|
197
|
+
|
198
|
+
txn.distributed_tracer.accept_distributed_trace_payload(payload)
|
199
|
+
end
|
200
|
+
|
201
|
+
# Returns the currently active segment in the transaction in
|
202
|
+
# progress for this thread, or +nil+ if no segment or
|
203
|
+
# transaction exists.
|
204
|
+
#
|
205
|
+
# @api public
|
206
|
+
def current_segment
|
207
|
+
return unless txn = current_transaction
|
208
|
+
|
209
|
+
txn.current_segment
|
210
|
+
end
|
211
|
+
|
212
|
+
# Creates and starts a general-purpose segment used to time
|
213
|
+
# arbitrary code.
|
214
|
+
#
|
215
|
+
# @param [String] name full name of the segment; the agent
|
216
|
+
# will not add a prefix. Third-party users should begin the
|
217
|
+
# name with +Custom/+; e.g.,
|
218
|
+
# +Custom/UserMailer/send_welcome_email+
|
219
|
+
#
|
220
|
+
# @param [optional, String, Array] unscoped_metrics additional
|
221
|
+
# unscoped metrics to record using this segment's timing
|
222
|
+
# information
|
223
|
+
#
|
224
|
+
# @param start_time [optional, Time] a +Time+ instance
|
225
|
+
# denoting the start time of the segment. Value is set by
|
226
|
+
# AbstractSegment#start if not given.
|
227
|
+
#
|
228
|
+
# @param parent [optional, Segment] Use for the rare cases
|
229
|
+
# (such as async) where the parent segment should be something
|
230
|
+
# other than the current segment
|
231
|
+
#
|
232
|
+
# @return [Segment] the newly created segment; you _must_ call
|
233
|
+
# +finish+ on it at the end of the code you're tracing
|
234
|
+
#
|
235
|
+
# @api public
|
236
|
+
def start_segment(name:,
|
237
|
+
unscoped_metrics: nil,
|
238
|
+
start_time: nil,
|
239
|
+
parent: nil)
|
240
|
+
|
241
|
+
segment = Transaction::Segment.new(name, unscoped_metrics, start_time)
|
242
|
+
start_and_add_segment(segment, parent)
|
243
|
+
rescue ArgumentError
|
244
|
+
raise
|
245
|
+
rescue => exception
|
246
|
+
log_error('start_segment', exception)
|
247
|
+
end
|
248
|
+
|
249
|
+
UNKNOWN = "Unknown".freeze
|
250
|
+
OTHER = "other".freeze
|
251
|
+
|
252
|
+
# Creates and starts a datastore segment used to time
|
253
|
+
# datastore operations.
|
254
|
+
#
|
255
|
+
# @param [String] product the datastore name for use in metric
|
256
|
+
# naming, e.g. "FauxDB"
|
257
|
+
#
|
258
|
+
# @param [String] operation the name of the operation
|
259
|
+
# (e.g. "select"), often named after the method that's being
|
260
|
+
# instrumented.
|
261
|
+
#
|
262
|
+
# @param [optional, String] collection the collection name for use in
|
263
|
+
# statement-level metrics (i.e. table or model name)
|
264
|
+
#
|
265
|
+
# @param [optional, String] host the host this database
|
266
|
+
# instance is running on
|
267
|
+
#
|
268
|
+
# @param [optional, String] port_path_or_id TCP port, file
|
269
|
+
# path, UNIX domain socket, or other connection-related info
|
270
|
+
#
|
271
|
+
# @param [optional, String] database_name the name of this
|
272
|
+
# database
|
273
|
+
#
|
274
|
+
# @param start_time [optional, Time] a +Time+ instance
|
275
|
+
# denoting the start time of the segment. Value is set by
|
276
|
+
# AbstractSegment#start if not given.
|
277
|
+
#
|
278
|
+
# @param parent [optional, Segment] Use for the rare cases
|
279
|
+
# (such as async) where the parent segment should be something
|
280
|
+
# other than the current segment
|
281
|
+
#
|
282
|
+
# @return [DatastoreSegment] the newly created segment; you
|
283
|
+
# _must_ call +finish+ on it at the end of the code you're
|
284
|
+
# tracing
|
285
|
+
#
|
286
|
+
# @api public
|
287
|
+
def start_datastore_segment(product: nil,
|
288
|
+
operation: nil,
|
289
|
+
collection: nil,
|
290
|
+
host: nil,
|
291
|
+
port_path_or_id: nil,
|
292
|
+
database_name: nil,
|
293
|
+
start_time: nil,
|
294
|
+
parent: nil)
|
295
|
+
|
296
|
+
product ||= UNKNOWN
|
297
|
+
operation ||= OTHER
|
298
|
+
|
299
|
+
segment = Transaction::DatastoreSegment.new(product, operation, collection, host, port_path_or_id, database_name)
|
300
|
+
start_and_add_segment(segment, parent)
|
301
|
+
rescue ArgumentError
|
302
|
+
raise
|
303
|
+
rescue => exception
|
304
|
+
log_error('start_datastore_segment', exception)
|
305
|
+
end
|
306
|
+
|
307
|
+
# Creates and starts an external request segment using the
|
308
|
+
# given library, URI, and procedure. This is used to time
|
309
|
+
# external calls made over HTTP.
|
310
|
+
#
|
311
|
+
# @param [String] library a string of the class name of the library used to
|
312
|
+
# make the external call, for example, 'Net::HTTP'.
|
313
|
+
#
|
314
|
+
# @param [String, URI] uri indicates the URI to which the
|
315
|
+
# external request is being made. The URI should begin with the protocol,
|
316
|
+
# for example, 'https://github.com'.
|
317
|
+
#
|
318
|
+
# @param [String] procedure the HTTP method being used for the external
|
319
|
+
# request as a string, for example, 'GET'.
|
320
|
+
#
|
321
|
+
# @param start_time [optional, Time] a +Time+ instance
|
322
|
+
# denoting the start time of the segment. Value is set by
|
323
|
+
# AbstractSegment#start if not given.
|
324
|
+
#
|
325
|
+
# @param parent [optional, Segment] Use for the rare cases
|
326
|
+
# (such as async) where the parent segment should be something
|
327
|
+
# other than the current segment
|
328
|
+
#
|
329
|
+
# @return [ExternalRequestSegment] the newly created segment;
|
330
|
+
# you _must_ call +finish+ on it at the end of the code
|
331
|
+
# you're tracing
|
332
|
+
#
|
333
|
+
# @api public
|
334
|
+
def start_external_request_segment(library:,
|
335
|
+
uri:,
|
336
|
+
procedure:,
|
337
|
+
start_time: nil,
|
338
|
+
parent: nil)
|
339
|
+
|
340
|
+
segment = Transaction::ExternalRequestSegment.new(library, uri, procedure, start_time)
|
341
|
+
start_and_add_segment(segment, parent)
|
342
|
+
rescue ArgumentError
|
343
|
+
raise
|
344
|
+
rescue => exception
|
345
|
+
log_error('start_external_request_segment', exception)
|
346
|
+
end
|
347
|
+
|
348
|
+
# Will potentially capture and notice an error at the
|
349
|
+
# segment that was executing when error occurred.
|
350
|
+
# if passed +segment+ is something that doesn't
|
351
|
+
# respond to +notice_segment_error+ then this method
|
352
|
+
# is effectively just a yield to the given &block
|
353
|
+
def capture_segment_error(segment)
|
354
|
+
return unless block_given?
|
355
|
+
|
356
|
+
yield
|
357
|
+
rescue => exception
|
358
|
+
if segment && segment.is_a?(Transaction::AbstractSegment)
|
359
|
+
segment.notice_error(exception)
|
360
|
+
end
|
361
|
+
raise
|
362
|
+
end
|
363
|
+
|
364
|
+
# For New Relic internal use only.
|
365
|
+
def start_message_broker_segment(action:,
|
366
|
+
library:,
|
367
|
+
destination_type:,
|
368
|
+
destination_name:,
|
369
|
+
headers: nil,
|
370
|
+
parameters: nil,
|
371
|
+
start_time: nil,
|
372
|
+
parent: nil)
|
373
|
+
|
374
|
+
segment = Transaction::MessageBrokerSegment.new(
|
375
|
+
action: action,
|
376
|
+
library: library,
|
377
|
+
destination_type: destination_type,
|
378
|
+
destination_name: destination_name,
|
379
|
+
headers: headers,
|
380
|
+
parameters: parameters,
|
381
|
+
start_time: start_time
|
382
|
+
)
|
383
|
+
start_and_add_segment(segment, parent)
|
384
|
+
rescue ArgumentError
|
385
|
+
raise
|
386
|
+
rescue => exception
|
387
|
+
log_error('start_datastore_segment', exception)
|
388
|
+
end
|
389
|
+
|
390
|
+
# This method should only be used by Tracer for access to the
|
391
|
+
# current thread's state or to provide read-only accessors for other threads
|
392
|
+
#
|
393
|
+
# If ever exposed, this requires additional synchronization
|
394
|
+
def state_for(thread)
|
395
|
+
state = thread[:newrelic_tracer_state]
|
396
|
+
|
397
|
+
if state.nil?
|
398
|
+
state = Tracer::State.new
|
399
|
+
thread[:newrelic_tracer_state] = state
|
400
|
+
end
|
401
|
+
|
402
|
+
state
|
403
|
+
end
|
404
|
+
|
405
|
+
alias_method :tl_state_for, :state_for
|
406
|
+
|
407
|
+
def clear_state
|
408
|
+
Thread.current[:newrelic_tracer_state] = nil
|
409
|
+
end
|
410
|
+
|
411
|
+
alias_method :tl_clear, :clear_state
|
412
|
+
|
413
|
+
def current_segment_key
|
414
|
+
::Fiber.current.object_id
|
415
|
+
end
|
416
|
+
|
417
|
+
def thread_tracing_enabled?
|
418
|
+
NewRelic::Agent.config[:'instrumentation.thread.tracing']
|
419
|
+
end
|
420
|
+
|
421
|
+
def thread_block_with_current_transaction(*args, segment_name:, parent: nil, &block)
|
422
|
+
parent ||= current_segment
|
423
|
+
current_txn = ::Thread.current[:newrelic_tracer_state]&.current_transaction if ::Thread.current[:newrelic_tracer_state]&.is_execution_traced?
|
424
|
+
proc do
|
425
|
+
begin
|
426
|
+
if current_txn
|
427
|
+
NewRelic::Agent::Tracer.state.current_transaction = current_txn
|
428
|
+
segment_name += "/Thread#{::Thread.current.object_id}/Fiber#{::Fiber.current.object_id}" if NewRelic::Agent.config[:'thread_ids_enabled']
|
429
|
+
segment = NewRelic::Agent::Tracer.start_segment(name: segment_name, parent: parent)
|
430
|
+
end
|
431
|
+
NewRelic::Agent::Tracer.capture_segment_error(segment) do
|
432
|
+
yield(*args)
|
433
|
+
end
|
434
|
+
ensure
|
435
|
+
::NewRelic::Agent::Transaction::Segment.finish(segment)
|
436
|
+
end
|
437
|
+
end
|
438
|
+
end
|
439
|
+
|
440
|
+
private
|
441
|
+
|
442
|
+
def start_and_add_segment(segment, parent = nil)
|
443
|
+
tracer_state = state
|
444
|
+
if (txn = tracer_state.current_transaction) &&
|
445
|
+
tracer_state.tracing_enabled?
|
446
|
+
txn.add_segment(segment, parent)
|
447
|
+
else
|
448
|
+
segment.record_metrics = false
|
449
|
+
end
|
450
|
+
segment.start
|
451
|
+
segment
|
452
|
+
end
|
453
|
+
|
454
|
+
def log_error(method_name, exception)
|
455
|
+
NewRelic::Agent.logger.error("Exception during Tracer.#{method_name}", exception)
|
456
|
+
nil
|
457
|
+
end
|
458
|
+
end
|
459
|
+
|
460
|
+
# This is THE location to store thread local information during a transaction
|
461
|
+
# Need a new piece of data? Add a method here, NOT a new thread local variable.
|
462
|
+
class State
|
463
|
+
def initialize
|
464
|
+
@untraced = []
|
465
|
+
@current_transaction = nil
|
466
|
+
@record_sql = nil
|
467
|
+
end
|
468
|
+
|
469
|
+
# This starts the timer for the transaction.
|
470
|
+
def reset(transaction = nil)
|
471
|
+
# We purposefully don't reset @untraced or @record_sql
|
472
|
+
# since those are managed by NewRelic::Agent.disable_* calls explicitly
|
473
|
+
# and (more importantly) outside the scope of a transaction
|
474
|
+
|
475
|
+
@current_transaction = transaction
|
476
|
+
@sql_sampler_transaction_data = nil
|
477
|
+
end
|
478
|
+
|
479
|
+
# Current transaction stack
|
480
|
+
attr_accessor :current_transaction
|
481
|
+
|
482
|
+
# Execution tracing on current thread
|
483
|
+
attr_accessor :untraced
|
484
|
+
|
485
|
+
def push_traced(should_trace)
|
486
|
+
@untraced << should_trace
|
487
|
+
end
|
488
|
+
|
489
|
+
def pop_traced
|
490
|
+
@untraced.pop if @untraced
|
491
|
+
end
|
492
|
+
|
493
|
+
def is_execution_traced?
|
494
|
+
@untraced.nil? || @untraced.last != false
|
495
|
+
end
|
496
|
+
|
497
|
+
alias_method :tracing_enabled?, :is_execution_traced?
|
498
|
+
|
499
|
+
# TT's and SQL
|
500
|
+
attr_accessor :record_sql
|
501
|
+
|
502
|
+
def is_sql_recorded?
|
503
|
+
@record_sql != false
|
504
|
+
end
|
505
|
+
|
506
|
+
# Sql Sampler Transaction Data
|
507
|
+
attr_accessor :sql_sampler_transaction_data
|
508
|
+
end
|
509
|
+
end
|
510
|
+
|
511
|
+
TransactionState = Tracer
|
512
|
+
end
|
513
|
+
end
|