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,6 +1,7 @@
|
|
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
|
require 'new_relic/agent/datastores/mongo/event_formatter'
|
5
6
|
|
6
7
|
module NewRelic
|
@@ -13,17 +14,43 @@ module NewRelic
|
|
13
14
|
def started(event)
|
14
15
|
begin
|
15
16
|
return unless NewRelic::Agent::Tracer.tracing_enabled?
|
16
|
-
|
17
|
+
|
18
|
+
segments[event.operation_id] = start_segment(event)
|
17
19
|
rescue Exception => e
|
18
20
|
log_notification_error('started', e)
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
24
|
+
ERROR_KEYS = %w[ writeErrors writeConcernError writeConcernErrors ].freeze
|
25
|
+
|
26
|
+
def error_key_present?(event)
|
27
|
+
if reply = event.reply
|
28
|
+
ERROR_KEYS.detect { |key| reply[key] }
|
29
|
+
end
|
30
|
+
rescue
|
31
|
+
false
|
32
|
+
end
|
33
|
+
|
22
34
|
def completed(event)
|
23
35
|
begin
|
24
36
|
return unless NewRelic::Agent::Tracer.tracing_enabled?
|
37
|
+
|
25
38
|
segment = segments.delete(event.operation_id)
|
26
|
-
|
39
|
+
return unless segment
|
40
|
+
|
41
|
+
# operations that succeed but have errors return CommandSucceeded
|
42
|
+
# with an error_key that is populated with error specifics
|
43
|
+
if error_key = error_key_present?(event)
|
44
|
+
# taking the last error as there can potentially be many
|
45
|
+
attributes = event.reply[error_key][-1]
|
46
|
+
segment.notice_error(Mongo::Error.new("%s (%s)" % [attributes["errmsg"], attributes["code"]]))
|
47
|
+
|
48
|
+
# failing commands return a CommandFailed event with an error message
|
49
|
+
# in the form of "% (%s)" for the message and code
|
50
|
+
elsif event.is_a?(Mongo::Monitoring::Event::CommandFailed)
|
51
|
+
segment.notice_error(Mongo::Error.new(event.message))
|
52
|
+
end
|
53
|
+
segment.finish
|
27
54
|
rescue Exception => e
|
28
55
|
log_notification_error('completed', e)
|
29
56
|
end
|
@@ -34,12 +61,12 @@ module NewRelic
|
|
34
61
|
|
35
62
|
private
|
36
63
|
|
37
|
-
def start_segment
|
38
|
-
host = host_from_address
|
39
|
-
port_path_or_id = port_path_or_id_from_address
|
64
|
+
def start_segment(event)
|
65
|
+
host = host_from_address(event.address)
|
66
|
+
port_path_or_id = port_path_or_id_from_address(event.address)
|
40
67
|
segment = NewRelic::Agent::Tracer.start_datastore_segment(
|
41
68
|
product: MONGODB,
|
42
|
-
operation: event.command_name,
|
69
|
+
operation: operation(event.command_name),
|
43
70
|
collection: collection(event),
|
44
71
|
host: host,
|
45
72
|
port_path_or_id: port_path_or_id,
|
@@ -49,6 +76,15 @@ module NewRelic
|
|
49
76
|
segment
|
50
77
|
end
|
51
78
|
|
79
|
+
def operation(command_name)
|
80
|
+
# from 2.0 to 2.5, :findandmodify was the command_name
|
81
|
+
if command_name == :findandmodify
|
82
|
+
:findAndModify
|
83
|
+
else
|
84
|
+
command_name
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
52
88
|
def collection(event)
|
53
89
|
event.command[COLLECTION] || event.command[:collection] || event.command.values.first
|
54
90
|
end
|
@@ -74,31 +110,31 @@ module NewRelic
|
|
74
110
|
LOCALHOST = "localhost".freeze
|
75
111
|
|
76
112
|
def host_from_address(address)
|
77
|
-
if unix_domain_socket?
|
113
|
+
if unix_domain_socket?(address.host)
|
78
114
|
LOCALHOST
|
79
115
|
else
|
80
116
|
address.host
|
81
117
|
end
|
82
118
|
rescue => e
|
83
|
-
NewRelic::Agent.logger.debug
|
119
|
+
NewRelic::Agent.logger.debug("Failed to retrieve Mongo host: #{e}")
|
84
120
|
UNKNOWN
|
85
121
|
end
|
86
122
|
|
87
123
|
def port_path_or_id_from_address(address)
|
88
|
-
if unix_domain_socket?
|
124
|
+
if unix_domain_socket?(address.host)
|
89
125
|
address.host
|
90
126
|
else
|
91
127
|
address.port
|
92
128
|
end
|
93
129
|
rescue => e
|
94
|
-
NewRelic::Agent.logger.debug
|
130
|
+
NewRelic::Agent.logger.debug("Failed to retrieve Mongo port_path_or_id: #{e}")
|
95
131
|
UNKNOWN
|
96
132
|
end
|
97
133
|
|
98
134
|
SLASH = "/".freeze
|
99
135
|
|
100
136
|
def unix_domain_socket?(host)
|
101
|
-
host.start_with?
|
137
|
+
host.start_with?(SLASH)
|
102
138
|
end
|
103
139
|
end
|
104
140
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative 'instrumentation'
|
6
|
+
|
7
|
+
module NewRelic::Agent::Instrumentation
|
8
|
+
module NetHTTP
|
9
|
+
module Chain
|
10
|
+
def self.instrument!
|
11
|
+
Net::HTTP.class_eval do
|
12
|
+
include NewRelic::Agent::Instrumentation::NetHTTP
|
13
|
+
|
14
|
+
def request_with_newrelic_trace(request, *args, &block)
|
15
|
+
request_with_tracing(request) { request_without_newrelic_trace(request, *args, &block) }
|
16
|
+
end
|
17
|
+
|
18
|
+
alias request_without_newrelic_trace request
|
19
|
+
alias request request_with_newrelic_trace
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
module NewRelic
|
6
|
+
module Agent
|
7
|
+
module Instrumentation
|
8
|
+
module NetHTTP
|
9
|
+
def request_with_tracing(request)
|
10
|
+
wrapped_request = NewRelic::Agent::HTTPClients::NetHTTPRequest.new(self, request)
|
11
|
+
|
12
|
+
segment = NewRelic::Agent::Tracer.start_external_request_segment(
|
13
|
+
library: wrapped_request.type,
|
14
|
+
uri: wrapped_request.uri,
|
15
|
+
procedure: wrapped_request.method
|
16
|
+
)
|
17
|
+
|
18
|
+
begin
|
19
|
+
response = nil
|
20
|
+
segment.add_request_headers(wrapped_request)
|
21
|
+
|
22
|
+
# RUBY-1244 Disable further tracing in request to avoid double
|
23
|
+
# counting if connection wasn't started (which calls request again).
|
24
|
+
NewRelic::Agent.disable_all_tracing do
|
25
|
+
response = NewRelic::Agent::Tracer.capture_segment_error(segment) do
|
26
|
+
yield
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
wrapped_response = NewRelic::Agent::HTTPClients::NetHTTPResponse.new(response)
|
31
|
+
segment.process_response_headers(wrapped_response)
|
32
|
+
response
|
33
|
+
ensure
|
34
|
+
segment.finish
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative 'instrumentation'
|
6
|
+
|
7
|
+
module NewRelic
|
8
|
+
module Agent
|
9
|
+
module Instrumentation
|
10
|
+
module NetHTTP
|
11
|
+
module Prepend
|
12
|
+
include NewRelic::Agent::Instrumentation::NetHTTP
|
13
|
+
|
14
|
+
def request(request, *args, &block)
|
15
|
+
request_with_tracing(request) { super }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative 'net_http/chain'
|
6
|
+
require_relative 'net_http/prepend'
|
7
|
+
|
8
|
+
DependencyDetection.defer do
|
9
|
+
named :net_http
|
10
|
+
|
11
|
+
depends_on do
|
12
|
+
defined?(Net) && defined?(Net::HTTP)
|
13
|
+
end
|
14
|
+
|
15
|
+
executes do
|
16
|
+
NewRelic::Agent.logger.info('Installing Net:HTTP Wrappers')
|
17
|
+
require 'new_relic/agent/http_clients/net_http_wrappers'
|
18
|
+
end
|
19
|
+
|
20
|
+
# Airbrake uses method chaining on Net::HTTP in versions < 10.0.2 (10.0.2 updated to prepend for Net:HTTP)
|
21
|
+
conflicts_with_prepend do
|
22
|
+
defined?(Airbrake) && defined?(Airbrake::AIRBRAKE_VERSION) && Gem::Version.create(Airbrake::AIRBRAKE_VERSION) < Gem::Version.create('10.0.2')
|
23
|
+
end
|
24
|
+
|
25
|
+
conflicts_with_prepend do
|
26
|
+
defined?(ScoutApm)
|
27
|
+
end
|
28
|
+
|
29
|
+
conflicts_with_prepend do
|
30
|
+
defined?(Rack::MiniProfiler) && !defined?(Rack::MINI_PROFILER_PREPEND_NET_HTTP_PATCH)
|
31
|
+
end
|
32
|
+
|
33
|
+
conflicts_with_prepend do
|
34
|
+
source_location_for(Net::HTTP, "request") =~ /airbrake|profiler/i
|
35
|
+
end
|
36
|
+
|
37
|
+
executes do
|
38
|
+
if use_prepend?
|
39
|
+
prepend_instrument Net::HTTP, NewRelic::Agent::Instrumentation::NetHTTP::Prepend
|
40
|
+
else
|
41
|
+
chain_instrument NewRelic::Agent::Instrumentation::NetHTTP::Chain
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
module NewRelic
|
6
|
+
module Agent
|
7
|
+
module Instrumentation
|
8
|
+
class NotificationsSubscriber
|
9
|
+
def initialize
|
10
|
+
@queue_key = ['NewRelic', self.class.name, object_id].join('-')
|
11
|
+
define_exception_method
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.subscribed?
|
15
|
+
find_all_subscribers.find { |s| s.instance_variable_get(:@delegate).class == self }
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.find_all_subscribers
|
19
|
+
# TODO: need to talk to Rails core about an API for this,
|
20
|
+
# rather than digging through Listener ivars
|
21
|
+
instance_variable_names = [:@subscribers, :@string_subscribers, :@other_subscribers]
|
22
|
+
all_subscribers = []
|
23
|
+
|
24
|
+
notifier = ActiveSupport::Notifications.notifier
|
25
|
+
|
26
|
+
instance_variable_names.each do |name|
|
27
|
+
if notifier.instance_variable_defined?(name)
|
28
|
+
subscribers = notifier.instance_variable_get(name)
|
29
|
+
if subscribers.is_a?(Array)
|
30
|
+
# Rails 5 @subscribers, and Rails 6 @other_subscribers is a
|
31
|
+
# plain array of subscriber objects
|
32
|
+
all_subscribers += subscribers
|
33
|
+
elsif subscribers.is_a?(Hash)
|
34
|
+
# Rails 6 @string_subscribers is a Hash mapping the pattern
|
35
|
+
# string of a subscriber to an array of subscriber objects
|
36
|
+
subscribers.values.each { |array| all_subscribers += array }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
all_subscribers
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.subscribe(pattern)
|
45
|
+
if !subscribed?
|
46
|
+
ActiveSupport::Notifications.subscribe(pattern, new)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def start(name, id, payload)
|
51
|
+
return unless state.is_execution_traced?
|
52
|
+
|
53
|
+
start_segment(name, id, payload)
|
54
|
+
rescue => e
|
55
|
+
log_notification_error(e, name, 'start')
|
56
|
+
end
|
57
|
+
|
58
|
+
def finish(name, id, payload)
|
59
|
+
return unless state.is_execution_traced?
|
60
|
+
|
61
|
+
finish_segment(id, payload)
|
62
|
+
rescue => e
|
63
|
+
log_notification_error(e, name, 'finish')
|
64
|
+
end
|
65
|
+
|
66
|
+
def start_segment(name, id, payload)
|
67
|
+
segment = Tracer.start_segment(name: metric_name(name, payload))
|
68
|
+
add_segment_params(segment, payload)
|
69
|
+
push_segment(id, segment)
|
70
|
+
end
|
71
|
+
|
72
|
+
def finish_segment(id, payload)
|
73
|
+
if segment = pop_segment(id)
|
74
|
+
if exception = exception_object(payload)
|
75
|
+
segment.notice_error(exception)
|
76
|
+
end
|
77
|
+
segment.finish
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# for subclasses
|
82
|
+
def add_segment_params(segment, payload)
|
83
|
+
# no op
|
84
|
+
end
|
85
|
+
|
86
|
+
# for subclasses
|
87
|
+
def metric_name(name, payload)
|
88
|
+
"Ruby/#{name}"
|
89
|
+
end
|
90
|
+
|
91
|
+
def log_notification_error(error, name, event_type)
|
92
|
+
# These are important enough failures that we want the backtraces
|
93
|
+
# logged at error level, hence the explicit log_exception call.
|
94
|
+
NewRelic::Agent.logger.error("Error during #{event_type} callback for event '#{name}':")
|
95
|
+
NewRelic::Agent.logger.log_exception(:error, error)
|
96
|
+
end
|
97
|
+
|
98
|
+
def push_segment(id, segment)
|
99
|
+
segment_stack[id].push(segment)
|
100
|
+
end
|
101
|
+
|
102
|
+
def pop_segment(id)
|
103
|
+
segment = segment_stack[id].pop
|
104
|
+
segment
|
105
|
+
end
|
106
|
+
|
107
|
+
def segment_stack
|
108
|
+
Thread.current[@queue_key] ||= Hash.new { |h, id| h[id] = [] }
|
109
|
+
end
|
110
|
+
|
111
|
+
def state
|
112
|
+
NewRelic::Agent::Tracer.state
|
113
|
+
end
|
114
|
+
|
115
|
+
def define_exception_method
|
116
|
+
# we don't expect this to be called more than once, but we're being
|
117
|
+
# defensive.
|
118
|
+
return if defined?(exception_object)
|
119
|
+
return unless defined?(::ActiveSupport::VERSION)
|
120
|
+
|
121
|
+
if ::ActiveSupport::VERSION::STRING < "5.0.0"
|
122
|
+
# Earlier versions of Rails did not add the exception itself to the
|
123
|
+
# payload accessible via :exception_object, so we create a stand-in
|
124
|
+
# error object from the given class name and message.
|
125
|
+
# NOTE: no backtrace available this way, but we can notice the error
|
126
|
+
# well enough to send the necessary info the UI requires to present it.
|
127
|
+
def exception_object(payload)
|
128
|
+
exception_class, message = payload[:exception]
|
129
|
+
return nil unless exception_class
|
130
|
+
|
131
|
+
NewRelic::Agent::NoticeableError.new(exception_class, message)
|
132
|
+
end
|
133
|
+
else
|
134
|
+
def exception_object(payload)
|
135
|
+
payload[:exception_object]
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
module NewRelic
|
6
|
+
module Agent
|
7
|
+
module Instrumentation
|
8
|
+
module PadrinoTracer
|
9
|
+
module Chain
|
10
|
+
def self.instrument!
|
11
|
+
::Padrino::Routing::InstanceMethods.module_eval do
|
12
|
+
include NewRelic::Agent::Instrumentation::Sinatra
|
13
|
+
|
14
|
+
def dispatch_with_newrelic
|
15
|
+
dispatch_with_tracing { dispatch_without_newrelic }
|
16
|
+
end
|
17
|
+
|
18
|
+
alias dispatch_without_newrelic dispatch!
|
19
|
+
alias dispatch! dispatch_with_newrelic
|
20
|
+
|
21
|
+
# Padrino 0.13 mustermann routing
|
22
|
+
if private_method_defined?(:invoke_route)
|
23
|
+
include NewRelic::Agent::Instrumentation::Padrino
|
24
|
+
|
25
|
+
def invoke_route_with_newrelic(*args, &block)
|
26
|
+
invoke_route_with_tracing(*args) { invoke_route_without_newrelic(*args, &block) }
|
27
|
+
end
|
28
|
+
|
29
|
+
alias invoke_route_without_newrelic invoke_route
|
30
|
+
alias invoke_route invoke_route_with_newrelic
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module Padrino
|
7
|
+
def invoke_route_with_tracing(*args)
|
8
|
+
begin
|
9
|
+
env["newrelic.last_route"] = args[0].original_path
|
10
|
+
rescue => e
|
11
|
+
::NewRelic::Agent.logger.debug("Failed determining last route in Padrino", e)
|
12
|
+
end
|
13
|
+
|
14
|
+
begin
|
15
|
+
txn_name = ::NewRelic::Agent::Instrumentation::Sinatra::TransactionNamer.transaction_name_for_route(env, request)
|
16
|
+
unless txn_name.nil?
|
17
|
+
::NewRelic::Agent::Transaction.set_default_transaction_name(
|
18
|
+
"#{self.class.name}/#{txn_name}", :sinatra
|
19
|
+
)
|
20
|
+
end
|
21
|
+
rescue => e
|
22
|
+
::NewRelic::Agent.logger.debug("Failed during invoke_route to set transaction name", e)
|
23
|
+
end
|
24
|
+
|
25
|
+
yield
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module PadrinoTracer
|
7
|
+
module Prepend
|
8
|
+
include NewRelic::Agent::Instrumentation::Sinatra
|
9
|
+
include NewRelic::Agent::Instrumentation::Padrino
|
10
|
+
|
11
|
+
def dispatch
|
12
|
+
dispatch_with_tracing { super }
|
13
|
+
end
|
14
|
+
|
15
|
+
def invoke_route(*args, &block)
|
16
|
+
invoke_route_with_tracing(*args) { super }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -1,68 +1,32 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
4
|
-
|
5
|
-
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
# Our Padrino instrumentation relies heavily on the fact that Padrino is
|
6
|
+
# built on Sinatra. Although it wires up a lot of its own routing logic,
|
7
|
+
# we only need to patch into Padrino's dispatch to get things started.
|
8
|
+
#
|
9
|
+
# Parts of the Sinatra instrumentation (such as the TransactionNamer) are
|
10
|
+
# aware of Padrino as a potential target in areas where both Sinatra and
|
11
|
+
# Padrino run through the same code.
|
12
|
+
|
13
|
+
require_relative 'sinatra'
|
14
|
+
require_relative 'padrino/chain'
|
15
|
+
require_relative 'padrino/instrumentation'
|
16
|
+
require_relative 'padrino/prepend'
|
6
17
|
|
7
18
|
DependencyDetection.defer do
|
8
19
|
@name = :padrino
|
20
|
+
configure_with :sinatra
|
9
21
|
|
10
|
-
depends_on
|
11
|
-
!NewRelic::Agent.config[:disable_sinatra] &&
|
12
|
-
defined?(::Padrino) && defined?(::Padrino::Routing::InstanceMethods)
|
13
|
-
end
|
22
|
+
depends_on { defined?(Padrino) && defined?(Padrino::Routing::InstanceMethods) }
|
14
23
|
|
15
24
|
executes do
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
#
|
22
|
-
# Parts of the Sinatra instrumentation (such as the TransactionNamer) are
|
23
|
-
# aware of Padrino as a potential target in areas where both Sinatra and
|
24
|
-
# Padrino run through the same code.
|
25
|
-
module ::Padrino::Routing::InstanceMethods
|
26
|
-
include NewRelic::Agent::Instrumentation::Sinatra
|
27
|
-
|
28
|
-
alias dispatch_without_newrelic dispatch!
|
29
|
-
alias dispatch! dispatch_with_newrelic
|
30
|
-
|
31
|
-
# Padrino 0.13 mustermann routing
|
32
|
-
if private_method_defined?(:invoke_route)
|
33
|
-
include NewRelic::Agent::Instrumentation::Padrino
|
34
|
-
|
35
|
-
alias invoke_route_without_newrelic invoke_route
|
36
|
-
alias invoke_route invoke_route_with_newrelic
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
module NewRelic
|
43
|
-
module Agent
|
44
|
-
module Instrumentation
|
45
|
-
module Padrino
|
46
|
-
def invoke_route_with_newrelic(*args, &block)
|
47
|
-
begin
|
48
|
-
env["newrelic.last_route"] = args[0].original_path
|
49
|
-
rescue => e
|
50
|
-
::NewRelic::Agent.logger.debug("Failed determining last route in Padrino", e)
|
51
|
-
end
|
52
|
-
|
53
|
-
begin
|
54
|
-
txn_name = ::NewRelic::Agent::Instrumentation::Sinatra::TransactionNamer.transaction_name_for_route(env, request)
|
55
|
-
unless txn_name.nil?
|
56
|
-
::NewRelic::Agent::Transaction.set_default_transaction_name(
|
57
|
-
"#{self.class.name}/#{txn_name}", :sinatra)
|
58
|
-
end
|
59
|
-
rescue => e
|
60
|
-
::NewRelic::Agent.logger.debug("Failed during invoke_route to set transaction name", e)
|
61
|
-
end
|
62
|
-
|
63
|
-
invoke_route_without_newrelic(*args, &block)
|
64
|
-
end
|
65
|
-
end
|
25
|
+
NewRelic::Agent.logger.info('Installing Padrino instrumentation')
|
26
|
+
if use_prepend?
|
27
|
+
prepend_instrument Padrino::Application, NewRelic::Agent::Instrumentation::PadrinoTracer::Prepend
|
28
|
+
else
|
29
|
+
chain_instrument NewRelic::Agent::Instrumentation::PadrinoTracer::Chain
|
66
30
|
end
|
67
31
|
end
|
68
32
|
end
|
@@ -1,23 +1,23 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
DependencyDetection.defer do
|
6
6
|
@name = :passenger
|
7
7
|
|
8
8
|
depends_on do
|
9
|
-
defined?(
|
9
|
+
defined?(PhusionPassenger)
|
10
10
|
end
|
11
11
|
|
12
12
|
executes do
|
13
|
-
|
13
|
+
NewRelic::Agent.logger.debug("Installing Passenger event hooks.")
|
14
14
|
|
15
|
-
|
16
|
-
|
15
|
+
PhusionPassenger.on_event(:stopping_worker_process) do
|
16
|
+
NewRelic::Agent.logger.debug("Passenger stopping this process, shutdown the agent.")
|
17
17
|
NewRelic::Agent.instance.shutdown
|
18
18
|
end
|
19
19
|
|
20
|
-
|
20
|
+
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
21
21
|
# We want to reset the stats from the stats engine in case any carried
|
22
22
|
# over into the spawned process. Don't clear them in case any were
|
23
23
|
# cached. We do this even in conservative spawning.
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
module NewRelic
|
6
6
|
module Agent
|
@@ -9,13 +9,12 @@ module NewRelic
|
|
9
9
|
# Record queue time metrics based on any of three headers
|
10
10
|
# which can be set on the request.
|
11
11
|
module QueueTime
|
12
|
-
REQUEST_START_HEADER
|
13
|
-
QUEUE_START_HEADER
|
12
|
+
REQUEST_START_HEADER = 'HTTP_X_REQUEST_START'.freeze
|
13
|
+
QUEUE_START_HEADER = 'HTTP_X_QUEUE_START'.freeze
|
14
14
|
MIDDLEWARE_START_HEADER = 'HTTP_X_MIDDLEWARE_START'.freeze
|
15
|
-
ALL_QUEUE_METRIC = 'WebFrontend/QueueTime'.freeze
|
16
15
|
# any timestamps before this are thrown out and the parser
|
17
16
|
# will try again with a larger unit (2000/1/1 UTC)
|
18
|
-
EARLIEST_ACCEPTABLE_TIME = Time.at(946684800)
|
17
|
+
EARLIEST_ACCEPTABLE_TIME = Time.at(946684800).to_f
|
19
18
|
|
20
19
|
CANDIDATE_HEADERS = [
|
21
20
|
REQUEST_START_HEADER,
|
@@ -27,7 +26,7 @@ module NewRelic
|
|
27
26
|
|
28
27
|
module_function
|
29
28
|
|
30
|
-
def parse_frontend_timestamp(headers, now=
|
29
|
+
def parse_frontend_timestamp(headers, now = Process.clock_gettime(Process::CLOCK_REALTIME))
|
31
30
|
earliest = nil
|
32
31
|
|
33
32
|
CANDIDATE_HEADERS.each do |header|
|
@@ -40,7 +39,7 @@ module NewRelic
|
|
40
39
|
end
|
41
40
|
|
42
41
|
if earliest && earliest > now
|
43
|
-
NewRelic::Agent.logger.debug("Negative queue time detected, treating as zero: start=#{earliest.to_f} > now=#{now
|
42
|
+
NewRelic::Agent.logger.debug("Negative queue time detected, treating as zero: start=#{earliest.to_f} > now=#{now}")
|
44
43
|
earliest = now
|
45
44
|
end
|
46
45
|
|
@@ -52,14 +51,14 @@ module NewRelic
|
|
52
51
|
when /^\s*([\d+\.]+)\s*$/ then $1
|
53
52
|
# following regexp intentionally unanchored to handle
|
54
53
|
# (ie ignore) leading server names
|
55
|
-
when /t=([\d+\.]+)/
|
54
|
+
when /t=([\d+\.]+)/ then $1
|
56
55
|
end
|
57
56
|
end
|
58
57
|
|
59
58
|
def parse_timestamp(string)
|
60
59
|
DIVISORS.each do |divisor|
|
61
60
|
begin
|
62
|
-
t =
|
61
|
+
t = (string.to_f / divisor)
|
63
62
|
return t if t > EARLIEST_ACCEPTABLE_TIME
|
64
63
|
rescue RangeError
|
65
64
|
# On Ruby versions built with a 32-bit time_t, attempting to
|