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
@@ -1,17 +1,17 @@
|
|
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
|
require 'new_relic/agent/range_extensions'
|
6
|
-
require '
|
6
|
+
require 'new_relic/agent/guid_generator'
|
7
7
|
|
8
8
|
module NewRelic
|
9
9
|
module Agent
|
10
10
|
class Transaction
|
11
11
|
class AbstractSegment
|
12
|
-
# This class is the base class for all segments. It is
|
12
|
+
# This class is the base class for all segments. It is responsible for
|
13
13
|
# timing, naming, and defining lifecycle callbacks. One of the more
|
14
|
-
# complex
|
14
|
+
# complex responsibilities of this class is computing exclusive duration.
|
15
15
|
# One of the reasons for this complexity is that exclusive time will be
|
16
16
|
# computed using time ranges or by recording an aggregate value for
|
17
17
|
# a segments children time. The reason for this is that computing
|
@@ -20,44 +20,55 @@ module NewRelic
|
|
20
20
|
# after its parent. We will use the optimized exclusive duration
|
21
21
|
# calculation in all other cases.
|
22
22
|
#
|
23
|
-
attr_reader :start_time, :end_time, :duration, :exclusive_duration, :guid
|
24
|
-
attr_accessor :name, :parent, :children_time, :transaction
|
23
|
+
attr_reader :start_time, :end_time, :duration, :exclusive_duration, :guid, :starting_segment_key
|
24
|
+
attr_accessor :name, :parent, :children_time, :transaction, :transaction_name
|
25
25
|
attr_writer :record_metrics, :record_scoped_metric, :record_on_finish
|
26
|
+
attr_reader :noticed_error
|
26
27
|
|
27
|
-
def initialize
|
28
|
+
def initialize(name = nil, start_time = nil)
|
28
29
|
@name = name
|
30
|
+
@starting_segment_key = NewRelic::Agent::Tracer.current_segment_key
|
31
|
+
@transaction_name = nil
|
29
32
|
@transaction = nil
|
30
|
-
@guid =
|
33
|
+
@guid = NewRelic::Agent::GuidGenerator.generate_guid
|
31
34
|
@parent = nil
|
32
35
|
@params = nil
|
33
36
|
@start_time = start_time if start_time
|
34
37
|
@end_time = nil
|
35
38
|
@duration = 0.0
|
36
39
|
@exclusive_duration = 0.0
|
40
|
+
@children_timings = []
|
37
41
|
@children_time = 0.0
|
38
|
-
@children_time_ranges = nil
|
39
42
|
@active_children = 0
|
40
43
|
@range_recorded = false
|
41
44
|
@concurrent_children = false
|
42
45
|
@record_metrics = true
|
43
46
|
@record_scoped_metric = true
|
44
47
|
@record_on_finish = false
|
48
|
+
@noticed_error = nil
|
49
|
+
@code_filepath = nil
|
50
|
+
@code_function = nil
|
51
|
+
@code_lineno = nil
|
52
|
+
@code_namespace = nil
|
45
53
|
end
|
46
54
|
|
47
55
|
def start
|
48
|
-
@start_time ||=
|
56
|
+
@start_time ||= Process.clock_gettime(Process::CLOCK_REALTIME)
|
49
57
|
return unless transaction
|
50
|
-
|
58
|
+
|
59
|
+
parent.child_start(self) if parent
|
51
60
|
end
|
52
61
|
|
53
62
|
def finish
|
54
|
-
@end_time =
|
55
|
-
@duration = end_time
|
63
|
+
@end_time = Process.clock_gettime(Process::CLOCK_REALTIME)
|
64
|
+
@duration = end_time - start_time
|
65
|
+
|
56
66
|
return unless transaction
|
67
|
+
|
57
68
|
run_complete_callbacks
|
58
69
|
finalize if record_on_finish?
|
59
70
|
rescue => e
|
60
|
-
NewRelic::Agent.logger.error
|
71
|
+
NewRelic::Agent.logger.error("Exception finishing segment: #{name}", e)
|
61
72
|
end
|
62
73
|
|
63
74
|
def finished?
|
@@ -91,21 +102,71 @@ module NewRelic
|
|
91
102
|
end
|
92
103
|
|
93
104
|
def time_range
|
94
|
-
@start_time.to_f
|
105
|
+
@start_time.to_f..@end_time.to_f
|
106
|
+
end
|
107
|
+
|
108
|
+
def timings_overlap?(timing1, timing2)
|
109
|
+
(timing1.first >= timing2.first && timing1.first <= timing2.last) ||
|
110
|
+
(timing2.first >= timing1.first && timing2.first <= timing1.last)
|
111
|
+
end
|
112
|
+
|
113
|
+
def merge_timings(timing1, timing2)
|
114
|
+
[([timing1.first, timing2.first].min),
|
115
|
+
([timing1.last, timing2.last].max)]
|
95
116
|
end
|
96
117
|
|
118
|
+
# @children_timings is an array of array, with each inner array
|
119
|
+
# holding exactly 2 values, a child segment's start time and finish
|
120
|
+
# time (in that order). When it's time to record, these timings are
|
121
|
+
# converted into an array of range objects (using the same start and
|
122
|
+
# end values as the original array). Any two range objects that
|
123
|
+
# intersect and merged into a larger range. This checking for a
|
124
|
+
# intersections and merging of ranges is expensive, so the operation
|
125
|
+
# is only done at recording time.
|
97
126
|
def children_time_ranges
|
98
|
-
@children_time_ranges ||=
|
127
|
+
@children_time_ranges ||= begin
|
128
|
+
overlapped = @children_timings.each_with_object([]) do |timing, timings|
|
129
|
+
i = timings.index { |t| timings_overlap?(t, timing) }
|
130
|
+
if i
|
131
|
+
timings[i] = merge_timings(timing, timings[i])
|
132
|
+
else
|
133
|
+
timings << timing
|
134
|
+
end
|
135
|
+
end
|
136
|
+
overlapped.map { |t| Range.new(t.first, t.last) }
|
137
|
+
end
|
99
138
|
end
|
100
139
|
|
101
140
|
def children_time_ranges?
|
102
|
-
|
141
|
+
!@children_timings.empty?
|
103
142
|
end
|
104
143
|
|
105
144
|
def concurrent_children?
|
106
145
|
@concurrent_children
|
107
146
|
end
|
108
147
|
|
148
|
+
def code_information=(info = {})
|
149
|
+
return unless info[:filepath]
|
150
|
+
|
151
|
+
@code_filepath = info[:filepath]
|
152
|
+
@code_function = info[:function]
|
153
|
+
@code_lineno = info[:lineno]
|
154
|
+
@code_namespace = info[:namespace]
|
155
|
+
end
|
156
|
+
|
157
|
+
def all_code_information_present?
|
158
|
+
@code_filepath && @code_function && @code_lineno && @code_namespace
|
159
|
+
end
|
160
|
+
|
161
|
+
def code_attributes
|
162
|
+
return ::NewRelic::EMPTY_HASH unless all_code_information_present?
|
163
|
+
|
164
|
+
@code_attributes ||= {'code.filepath' => @code_filepath,
|
165
|
+
'code.function' => @code_function,
|
166
|
+
'code.lineno' => @code_lineno,
|
167
|
+
'code.namespace' => @code_namespace}
|
168
|
+
end
|
169
|
+
|
109
170
|
INSPECT_IGNORE = [:@transaction, :@transaction_state].freeze
|
110
171
|
|
111
172
|
def inspect
|
@@ -119,6 +180,33 @@ module NewRelic
|
|
119
180
|
def transaction_assigned
|
120
181
|
end
|
121
182
|
|
183
|
+
def set_noticed_error(noticed_error)
|
184
|
+
if @noticed_error
|
185
|
+
NewRelic::Agent.logger.debug( \
|
186
|
+
"Segment: #{name} overwriting previously noticed " \
|
187
|
+
"error: #{@noticed_error.inspect} with: #{noticed_error.inspect}"
|
188
|
+
)
|
189
|
+
end
|
190
|
+
@noticed_error = noticed_error
|
191
|
+
end
|
192
|
+
|
193
|
+
def notice_error(exception, options = {})
|
194
|
+
if Agent.config[:high_security]
|
195
|
+
NewRelic::Agent.logger.debug( \
|
196
|
+
"Segment: #{name} ignores notice_error for " \
|
197
|
+
"error: #{exception.inspect} because :high_security is enabled"
|
198
|
+
)
|
199
|
+
else
|
200
|
+
NewRelic::Agent.instance.error_collector.notice_segment_error(self, exception, options)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
def noticed_error_attributes
|
205
|
+
return unless @noticed_error
|
206
|
+
|
207
|
+
@noticed_error.attributes_from_notice_error
|
208
|
+
end
|
209
|
+
|
122
210
|
protected
|
123
211
|
|
124
212
|
attr_writer :range_recorded
|
@@ -127,20 +215,20 @@ module NewRelic
|
|
127
215
|
@range_recorded
|
128
216
|
end
|
129
217
|
|
130
|
-
def child_start
|
218
|
+
def child_start(segment)
|
131
219
|
@active_children += 1
|
132
|
-
@concurrent_children
|
220
|
+
@concurrent_children ||= @active_children > 1
|
133
221
|
|
134
222
|
transaction.async = true if @concurrent_children
|
135
223
|
end
|
136
224
|
|
137
|
-
def child_complete
|
225
|
+
def child_complete(segment)
|
138
226
|
@active_children -= 1
|
139
|
-
record_child_time
|
227
|
+
record_child_time(segment)
|
140
228
|
|
141
229
|
if finished?
|
142
230
|
transaction.async = true
|
143
|
-
parent.descendant_complete
|
231
|
+
parent.descendant_complete(self, segment) if parent
|
144
232
|
end
|
145
233
|
end
|
146
234
|
|
@@ -150,36 +238,39 @@ module NewRelic
|
|
150
238
|
# an ancestor whose end time is greater than or equal to the descendant's
|
151
239
|
# we can stop the propagation. We pass along the direct child so we can
|
152
240
|
# make any corrections needed for exclusive time calculation.
|
241
|
+
def descendant_complete(child, descendant)
|
242
|
+
add_child_timing(descendant)
|
153
243
|
|
154
|
-
def descendant_complete child, descendant
|
155
|
-
RangeExtensions.merge_or_append descendant.time_range,
|
156
|
-
children_time_ranges
|
157
244
|
# If this child's time was previously added to this segment's
|
158
245
|
# aggregate children time, we need to re-record it using a time range
|
159
246
|
# for proper exclusive time calculation
|
160
247
|
unless child.range_recorded?
|
161
248
|
self.children_time -= child.duration
|
162
|
-
record_child_time_as_range
|
249
|
+
record_child_time_as_range(child)
|
163
250
|
end
|
164
251
|
|
165
252
|
if parent && finished? && descendant.end_time >= end_time
|
166
|
-
parent.descendant_complete
|
253
|
+
parent.descendant_complete(self, descendant)
|
167
254
|
end
|
168
255
|
end
|
169
256
|
|
170
257
|
private
|
171
258
|
|
259
|
+
def add_child_timing(segment)
|
260
|
+
@children_timings << [segment.start_time, segment.end_time]
|
261
|
+
end
|
262
|
+
|
172
263
|
def force_finish
|
173
264
|
finish
|
174
|
-
NewRelic::Agent.logger.warn
|
265
|
+
NewRelic::Agent.logger.warn("Segment: #{name} was unfinished at " \
|
175
266
|
"the end of transaction. Timing information for this segment's" \
|
176
|
-
"parent #{parent.name} in #{transaction.best_name} may be inaccurate."
|
267
|
+
"parent #{parent.name} in #{transaction.best_name} may be inaccurate.")
|
177
268
|
end
|
178
269
|
|
179
270
|
def run_complete_callbacks
|
180
271
|
segment_complete
|
181
|
-
parent.child_complete
|
182
|
-
transaction.segment_complete
|
272
|
+
parent.child_complete(self) if parent
|
273
|
+
transaction.segment_complete(self)
|
183
274
|
end
|
184
275
|
|
185
276
|
def record_metrics
|
@@ -190,27 +281,26 @@ module NewRelic
|
|
190
281
|
def segment_complete
|
191
282
|
end
|
192
283
|
|
193
|
-
def record_child_time
|
284
|
+
def record_child_time(child)
|
194
285
|
if concurrent_children? || finished? && end_time < child.end_time
|
195
|
-
record_child_time_as_range
|
286
|
+
record_child_time_as_range(child)
|
196
287
|
else
|
197
|
-
record_child_time_as_number
|
288
|
+
record_child_time_as_number(child)
|
198
289
|
end
|
199
290
|
end
|
200
291
|
|
201
|
-
def record_child_time_as_range
|
202
|
-
|
203
|
-
children_time_ranges
|
292
|
+
def record_child_time_as_range(child)
|
293
|
+
add_child_timing(child)
|
204
294
|
child.range_recorded = true
|
205
295
|
end
|
206
296
|
|
207
|
-
def record_child_time_as_number
|
297
|
+
def record_child_time_as_number(child)
|
208
298
|
self.children_time += child.duration
|
209
299
|
end
|
210
300
|
|
211
301
|
def record_exclusive_duration
|
212
302
|
overlapping_duration = if children_time_ranges?
|
213
|
-
RangeExtensions.compute_overlap
|
303
|
+
RangeExtensions.compute_overlap(time_range, children_time_ranges)
|
214
304
|
else
|
215
305
|
0.0
|
216
306
|
end
|
@@ -228,7 +318,7 @@ module NewRelic
|
|
228
318
|
@transaction_state ||= if @transaction
|
229
319
|
transaction.state
|
230
320
|
else
|
231
|
-
|
321
|
+
Tracer.state
|
232
322
|
end
|
233
323
|
end
|
234
324
|
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
|
require 'new_relic/agent/transaction/segment'
|
6
6
|
require 'new_relic/agent/datastores/metric_helper'
|
@@ -11,33 +11,31 @@ module NewRelic
|
|
11
11
|
module Agent
|
12
12
|
class Transaction
|
13
13
|
class DatastoreSegment < Segment
|
14
|
-
|
15
14
|
UNKNOWN = 'unknown'.freeze
|
16
15
|
|
17
16
|
attr_reader :product, :operation, :collection, :sql_statement, :nosql_statement, :host, :port_path_or_id
|
18
17
|
attr_accessor :database_name, :record_sql
|
19
18
|
|
20
|
-
|
21
|
-
def initialize product, operation, collection = nil, host = nil, port_path_or_id = nil, database_name = nil, start_time = nil
|
19
|
+
def initialize(product, operation, collection = nil, host = nil, port_path_or_id = nil, database_name = nil, start_time = nil)
|
22
20
|
@product = product
|
23
21
|
@operation = operation
|
24
22
|
@collection = collection
|
25
23
|
@sql_statement = nil
|
26
24
|
@nosql_statement = nil
|
27
25
|
@record_sql = true
|
28
|
-
set_instance_info
|
26
|
+
set_instance_info(host, port_path_or_id)
|
29
27
|
@database_name = database_name ? database_name.to_s : nil
|
30
|
-
super
|
28
|
+
super(Datastores::MetricHelper.scoped_metric_for(product, operation, collection),
|
31
29
|
nil,
|
32
|
-
start_time
|
30
|
+
start_time)
|
33
31
|
end
|
34
32
|
|
35
|
-
def set_instance_info
|
33
|
+
def set_instance_info(host = nil, port_path_or_id = nil)
|
36
34
|
port_path_or_id = port_path_or_id.to_s if port_path_or_id
|
37
35
|
host_present = host && !host.empty?
|
38
36
|
ppi_present = port_path_or_id && !port_path_or_id.empty?
|
39
37
|
|
40
|
-
host = NewRelic::Agent::Hostname.get_external
|
38
|
+
host = NewRelic::Agent::Hostname.get_external(host) if host_present
|
41
39
|
|
42
40
|
case
|
43
41
|
when host_present && ppi_present
|
@@ -57,15 +55,16 @@ module NewRelic
|
|
57
55
|
end
|
58
56
|
end
|
59
57
|
|
60
|
-
def notice_sql
|
61
|
-
_notice_sql
|
58
|
+
def notice_sql(sql)
|
59
|
+
_notice_sql(sql)
|
62
60
|
nil
|
63
61
|
end
|
64
62
|
|
65
63
|
# @api private
|
66
|
-
def _notice_sql
|
64
|
+
def _notice_sql(sql, config = nil, explainer = nil, binds = nil, name = nil)
|
67
65
|
return unless record_sql?
|
68
|
-
|
66
|
+
|
67
|
+
@sql_statement = Database::Statement.new(sql, config, explainer, binds, name, host, port_path_or_id, database_name)
|
69
68
|
end
|
70
69
|
|
71
70
|
# Method for simplifying attaching non-SQL data statements to a
|
@@ -85,8 +84,9 @@ module NewRelic
|
|
85
84
|
# please ensure all data passed to this method is safe to transmit to
|
86
85
|
# New Relic.
|
87
86
|
|
88
|
-
def notice_nosql_statement
|
87
|
+
def notice_nosql_statement(nosql_statement)
|
89
88
|
return unless record_sql?
|
89
|
+
|
90
90
|
@nosql_statement = Database.truncate_query(nosql_statement)
|
91
91
|
nil
|
92
92
|
end
|
@@ -120,8 +120,9 @@ module NewRelic
|
|
120
120
|
NEWLINE = "\n".freeze
|
121
121
|
|
122
122
|
def add_backtrace_parameter
|
123
|
-
|
124
|
-
|
123
|
+
return unless duration >= Agent.config[:'transaction_tracer.stack_trace_threshold']
|
124
|
+
|
125
|
+
params[:backtrace] = caller.join(NEWLINE)
|
125
126
|
end
|
126
127
|
|
127
128
|
def notice_sql_statement
|
@@ -138,8 +139,11 @@ module NewRelic
|
|
138
139
|
end
|
139
140
|
|
140
141
|
def record_span_event
|
142
|
+
# don't record a span event if the transaction is ignored
|
143
|
+
return if transaction.ignore?
|
144
|
+
|
141
145
|
aggregator = ::NewRelic::Agent.agent.span_event_aggregator
|
142
|
-
priority
|
146
|
+
priority = transaction.priority
|
143
147
|
|
144
148
|
aggregator.record(priority: priority) do
|
145
149
|
SpanEventPrimitive.for_datastore_segment(self)
|
@@ -0,0 +1,184 @@
|
|
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/transaction/trace_context'
|
6
|
+
require 'new_relic/agent/transaction/distributed_tracing'
|
7
|
+
require 'new_relic/agent/distributed_tracing/cross_app_tracing'
|
8
|
+
|
9
|
+
module NewRelic
|
10
|
+
module Agent
|
11
|
+
class Transaction
|
12
|
+
class DistributedTracer
|
13
|
+
include NewRelic::Agent::CrossAppTracing
|
14
|
+
include DistributedTracing
|
15
|
+
include TraceContext
|
16
|
+
|
17
|
+
attr_reader :transaction
|
18
|
+
attr_accessor :parent_transaction_id
|
19
|
+
|
20
|
+
def parent_guid
|
21
|
+
if trace_context_header_data
|
22
|
+
trace_context_header_data.parent_id
|
23
|
+
elsif distributed_trace_payload
|
24
|
+
distributed_trace_payload.id
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def accept_incoming_request(request, transport_type = nil)
|
29
|
+
accept_incoming_transport_type(request, transport_type)
|
30
|
+
if trace_parent_header_present?(request)
|
31
|
+
accept_trace_context_incoming_request(request)
|
32
|
+
else
|
33
|
+
accept_distributed_tracing_incoming_request(request)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def caller_transport_type
|
38
|
+
@caller_transport_type ||= "Unknown"
|
39
|
+
end
|
40
|
+
|
41
|
+
def accept_transport_type_from_api(value)
|
42
|
+
@caller_transport_type = DistributedTraceTransportType.from(value)
|
43
|
+
end
|
44
|
+
|
45
|
+
def accept_incoming_transport_type(request, transport_type)
|
46
|
+
if transport_type.to_s == NewRelic::EMPTY_STR
|
47
|
+
@caller_transport_type = DistributedTraceTransportType.for_rack_request(request)
|
48
|
+
else
|
49
|
+
@caller_transport_type = DistributedTraceTransportType.from(transport_type)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def initialize(transaction)
|
54
|
+
@transaction = transaction
|
55
|
+
end
|
56
|
+
|
57
|
+
def record_metrics
|
58
|
+
record_cross_app_metrics
|
59
|
+
DistributedTraceMetrics.record_metrics_for_transaction(transaction)
|
60
|
+
end
|
61
|
+
|
62
|
+
def append_payload(payload)
|
63
|
+
append_cat_info(payload)
|
64
|
+
DistributedTraceAttributes.copy_from_transaction( \
|
65
|
+
transaction,
|
66
|
+
trace_state_payload || distributed_trace_payload,
|
67
|
+
payload
|
68
|
+
)
|
69
|
+
end
|
70
|
+
|
71
|
+
def log_request_headers(headers, direction = "OUTGOING")
|
72
|
+
NewRelic::Agent.logger.debug("#{direction} REQUEST HEADERS: #{headers}")
|
73
|
+
end
|
74
|
+
|
75
|
+
def insert_headers(headers)
|
76
|
+
return unless NewRelic::Agent.agent.connected?
|
77
|
+
|
78
|
+
insert_trace_context_header(headers)
|
79
|
+
insert_distributed_trace_header(headers)
|
80
|
+
insert_cross_app_header(headers)
|
81
|
+
log_request_headers(headers)
|
82
|
+
end
|
83
|
+
|
84
|
+
def consume_message_headers(headers, tracer_state, transport_type)
|
85
|
+
log_request_headers(headers, "INCOMING")
|
86
|
+
consume_message_distributed_tracing_headers(headers, transport_type)
|
87
|
+
consume_message_cross_app_tracing_headers(headers, tracer_state)
|
88
|
+
consume_message_synthetics_headers(headers)
|
89
|
+
rescue => e
|
90
|
+
NewRelic::Agent.logger.error("Error in consume_message_headers", e)
|
91
|
+
end
|
92
|
+
|
93
|
+
def assign_intrinsics
|
94
|
+
if dt_enabled?
|
95
|
+
DistributedTraceAttributes.copy_to_attributes(transaction.payload, transaction.attributes)
|
96
|
+
elsif is_cross_app?
|
97
|
+
assign_cross_app_intrinsics
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def insert_distributed_trace_header(headers)
|
102
|
+
return unless dt_enabled?
|
103
|
+
return if Agent.config[:'exclude_newrelic_header']
|
104
|
+
|
105
|
+
payload = create_distributed_trace_payload
|
106
|
+
headers[NewRelic::NEWRELIC_KEY] = payload.http_safe if payload
|
107
|
+
end
|
108
|
+
|
109
|
+
def insert_cat_headers(headers)
|
110
|
+
return unless CrossAppTracing.cross_app_enabled?
|
111
|
+
|
112
|
+
@is_cross_app_caller = true
|
113
|
+
insert_message_headers(headers,
|
114
|
+
transaction.guid,
|
115
|
+
cat_trip_id,
|
116
|
+
cat_path_hash,
|
117
|
+
transaction.raw_synthetics_header)
|
118
|
+
end
|
119
|
+
|
120
|
+
private
|
121
|
+
|
122
|
+
def dt_enabled?
|
123
|
+
Agent.config[:'distributed_tracing.enabled']
|
124
|
+
end
|
125
|
+
|
126
|
+
def consume_message_synthetics_headers(headers)
|
127
|
+
synthetics_header = headers[CrossAppTracing::NR_MESSAGE_BROKER_SYNTHETICS_HEADER]
|
128
|
+
if synthetics_header and
|
129
|
+
incoming_payload = ::JSON.load(deobfuscate(synthetics_header)) and
|
130
|
+
SyntheticsMonitor.is_valid_payload?(incoming_payload) and
|
131
|
+
SyntheticsMonitor.is_supported_version?(incoming_payload) and
|
132
|
+
SyntheticsMonitor.is_trusted?(incoming_payload)
|
133
|
+
|
134
|
+
transaction.raw_synthetics_header = synthetics_header
|
135
|
+
transaction.synthetics_payload = incoming_payload
|
136
|
+
end
|
137
|
+
rescue => e
|
138
|
+
NewRelic::Agent.logger.error("Error in consume_message_synthetics_header", e)
|
139
|
+
end
|
140
|
+
|
141
|
+
def consume_message_distributed_tracing_headers(headers, transport_type)
|
142
|
+
return unless dt_enabled?
|
143
|
+
|
144
|
+
accept_incoming_transport_type(headers, transport_type)
|
145
|
+
|
146
|
+
newrelic_trace_key = NewRelic::CANDIDATE_NEWRELIC_KEYS.detect do |key|
|
147
|
+
headers.has_key?(key)
|
148
|
+
end
|
149
|
+
return unless newrelic_trace_key && (payload = headers[newrelic_trace_key])
|
150
|
+
|
151
|
+
accept_distributed_trace_payload(payload)
|
152
|
+
end
|
153
|
+
|
154
|
+
def consume_message_cross_app_tracing_headers(headers, tracer_state)
|
155
|
+
return unless CrossAppTracing.cross_app_enabled?
|
156
|
+
return unless CrossAppTracing.message_has_crossapp_request_header?(headers)
|
157
|
+
|
158
|
+
accept_cross_app_payload(headers, tracer_state)
|
159
|
+
CrossAppTracing.assign_intrinsic_transaction_attributes(tracer_state)
|
160
|
+
end
|
161
|
+
|
162
|
+
def accept_cross_app_payload(headers, tracer_state)
|
163
|
+
encoded_id = headers[CrossAppTracing::NR_MESSAGE_BROKER_ID_HEADER]
|
164
|
+
decoded_id = encoded_id.nil? ? EMPTY_STRING : deobfuscate(encoded_id)
|
165
|
+
|
166
|
+
return unless CrossAppTracing.trusted_valid_cross_app_id?(decoded_id)
|
167
|
+
|
168
|
+
txn_header = headers[CrossAppTracing::NR_MESSAGE_BROKER_TXN_HEADER]
|
169
|
+
txn_info = ::JSON.load(deobfuscate(txn_header))
|
170
|
+
payload = CrossAppPayload.new(decoded_id, transaction, txn_info)
|
171
|
+
|
172
|
+
@cross_app_payload = payload
|
173
|
+
rescue => e
|
174
|
+
NewRelic::Agent.logger.debug("Failure deserializing encoded header in #{self.class}, #{e.class}, #{e.message}")
|
175
|
+
nil
|
176
|
+
end
|
177
|
+
|
178
|
+
def deobfuscate(message)
|
179
|
+
CrossAppTracing.obfuscator.deobfuscate(message)
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|