newrelic_rpm 5.7.0.350 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +15 -1
- data/.rubocop.yml +1919 -0
- data/.rubocop_todo.yml +100 -0
- data/.simplecov +15 -0
- data/.snyk +11 -0
- data/.yardopts +2 -0
- data/Brewfile +12 -0
- data/CHANGELOG.md +4056 -2339
- data/CONTRIBUTING.md +132 -19
- data/DOCKER.md +167 -0
- data/Dockerfile +10 -0
- data/Gemfile +5 -2
- data/Guardfile +22 -4
- data/LICENSE +202 -38
- data/README.md +87 -87
- data/Rakefile +27 -27
- data/THIRD_PARTY_NOTICES.md +28 -0
- data/Thorfile +5 -0
- data/bin/newrelic +3 -2
- data/bin/newrelic_cmd +1 -0
- data/bin/nrdebug +77 -54
- data/config.dot +5 -5
- data/docker-compose.yml +107 -0
- data/init.rb +5 -7
- data/install.rb +3 -3
- data/lefthook.yml +9 -0
- data/lib/new_relic/agent/adaptive_sampler.rb +14 -10
- data/lib/new_relic/agent/agent.rb +125 -969
- data/lib/new_relic/agent/agent_helpers/connect.rb +227 -0
- data/lib/new_relic/agent/agent_helpers/harvest.rb +153 -0
- data/lib/new_relic/agent/agent_helpers/shutdown.rb +72 -0
- data/lib/new_relic/agent/agent_helpers/special_startup.rb +74 -0
- data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +167 -0
- data/lib/new_relic/agent/agent_helpers/startup.rb +202 -0
- data/lib/new_relic/agent/agent_helpers/transmit.rb +76 -0
- data/lib/new_relic/agent/agent_logger.rb +26 -18
- data/lib/new_relic/agent/attribute_filter.rb +69 -52
- data/lib/new_relic/agent/attribute_processing.rb +8 -8
- data/lib/new_relic/agent/attributes.rb +153 -0
- data/lib/new_relic/agent/audit_logger.rb +19 -4
- data/lib/new_relic/agent/autostart.rb +34 -28
- data/lib/new_relic/agent/chained_call.rb +2 -2
- data/lib/new_relic/agent/commands/agent_command.rb +4 -4
- data/lib/new_relic/agent/commands/agent_command_router.rb +15 -33
- data/lib/new_relic/agent/commands/thread_profiler_session.rb +13 -11
- data/lib/new_relic/agent/configuration/default_source.rb +1480 -1053
- data/lib/new_relic/agent/configuration/dotted_hash.rb +7 -6
- data/lib/new_relic/agent/configuration/environment_source.rb +15 -11
- data/lib/new_relic/agent/configuration/event_harvest_config.rb +68 -0
- data/lib/new_relic/agent/configuration/high_security_source.rb +9 -9
- data/lib/new_relic/agent/configuration/manager.rb +96 -79
- data/lib/new_relic/agent/configuration/manual_source.rb +2 -2
- data/lib/new_relic/agent/configuration/mask_defaults.rb +4 -4
- data/lib/new_relic/agent/configuration/security_policy_source.rb +83 -86
- data/lib/new_relic/agent/configuration/server_source.rb +49 -12
- data/lib/new_relic/agent/configuration/yaml_source.rb +42 -13
- data/lib/new_relic/agent/configuration.rb +2 -2
- data/lib/new_relic/agent/connect/request_builder.rb +61 -0
- data/lib/new_relic/agent/connect/response_handler.rb +58 -0
- data/lib/new_relic/agent/custom_event_aggregator.rb +15 -15
- data/lib/new_relic/agent/database/explain_plan_helpers.rb +5 -6
- data/lib/new_relic/agent/database/obfuscation_helpers.rb +16 -15
- data/lib/new_relic/agent/database/obfuscator.rb +3 -3
- data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +4 -4
- data/lib/new_relic/agent/database.rb +44 -53
- data/lib/new_relic/agent/database_adapter.rb +35 -0
- data/lib/new_relic/agent/datastores/metric_helper.rb +18 -20
- data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +9 -8
- data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +7 -11
- data/lib/new_relic/agent/datastores/mongo.rb +7 -12
- data/lib/new_relic/agent/datastores/nosql_obfuscator.rb +41 -0
- data/lib/new_relic/agent/datastores/redis.rb +6 -12
- data/lib/new_relic/agent/datastores.rb +19 -23
- data/lib/new_relic/agent/deprecator.rb +2 -2
- data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +13 -12
- data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +87 -66
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +84 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +163 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +38 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context.rb +245 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +127 -0
- data/lib/new_relic/agent/distributed_tracing.rb +113 -32
- data/lib/new_relic/agent/encoding_normalizer.rb +5 -3
- data/lib/new_relic/agent/error_collector.rb +99 -63
- data/lib/new_relic/agent/error_event_aggregator.rb +10 -8
- data/lib/new_relic/agent/error_filter.rb +174 -0
- data/lib/new_relic/agent/error_trace_aggregator.rb +6 -4
- data/lib/new_relic/agent/event_aggregator.rb +43 -48
- data/lib/new_relic/agent/event_buffer.rb +8 -9
- data/lib/new_relic/agent/event_listener.rb +2 -3
- data/lib/new_relic/agent/event_loop.rb +27 -25
- data/lib/new_relic/agent/external.rb +20 -51
- data/lib/new_relic/agent/guid_generator.rb +30 -0
- data/lib/new_relic/agent/harvester.rb +5 -6
- data/lib/new_relic/agent/heap.rb +8 -10
- data/lib/new_relic/agent/hostname.rb +26 -5
- data/lib/new_relic/agent/http_clients/abstract.rb +81 -0
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +26 -26
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +31 -17
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +18 -23
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +12 -15
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +24 -8
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +9 -12
- data/lib/new_relic/agent/http_clients/uri_util.rb +12 -13
- data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +22 -52
- data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +39 -0
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +59 -72
- data/lib/new_relic/agent/instrumentation/action_dispatch.rb +31 -0
- data/lib/new_relic/agent/instrumentation/action_dispatch_subscriber.rb +64 -0
- data/lib/new_relic/agent/instrumentation/action_mailbox.rb +30 -0
- data/lib/new_relic/agent/instrumentation/action_mailbox_subscriber.rb +33 -0
- data/lib/new_relic/agent/instrumentation/action_mailer.rb +30 -0
- data/lib/new_relic/agent/instrumentation/action_mailer_subscriber.rb +85 -0
- data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +86 -62
- data/lib/new_relic/agent/instrumentation/active_job.rb +38 -19
- data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +21 -7
- data/lib/new_relic/agent/instrumentation/active_record.rb +95 -46
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +82 -61
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +155 -0
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +36 -12
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +69 -64
- data/lib/new_relic/agent/instrumentation/active_storage.rb +8 -4
- data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +11 -32
- data/lib/new_relic/agent/instrumentation/active_support.rb +27 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/chain.rb +23 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +20 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +12 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger.rb +24 -0
- data/lib/new_relic/agent/instrumentation/active_support_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +150 -0
- data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/bunny.rb +14 -134
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/chain.rb +36 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/instrumentation.rb +21 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/prepend.rb +27 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby.rb +31 -0
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +77 -61
- data/lib/new_relic/agent/instrumentation/curb/chain.rb +91 -0
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +221 -0
- data/lib/new_relic/agent/instrumentation/curb/prepend.rb +61 -0
- data/lib/new_relic/agent/instrumentation/curb.rb +15 -187
- data/lib/new_relic/agent/instrumentation/custom_events.rb +12 -0
- data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +37 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +35 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +48 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +30 -52
- data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +29 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +66 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch.rb +31 -0
- data/lib/new_relic/agent/instrumentation/excon/middleware.rb +8 -7
- data/lib/new_relic/agent/instrumentation/excon.rb +29 -31
- data/lib/new_relic/agent/instrumentation/fiber/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +24 -0
- data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +18 -0
- data/lib/new_relic/agent/instrumentation/fiber.rb +25 -0
- data/lib/new_relic/agent/instrumentation/grape/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
- data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
- data/lib/new_relic/agent/instrumentation/grape.rb +16 -121
- data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +97 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +89 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +111 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +30 -0
- data/lib/new_relic/agent/instrumentation/grpc/helper.rb +32 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/chain.rb +69 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +134 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/rpc_desc_prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/rpc_server_prepend.rb +26 -0
- data/lib/new_relic/agent/instrumentation/grpc_client.rb +23 -0
- data/lib/new_relic/agent/instrumentation/grpc_server.rb +25 -0
- data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +37 -0
- data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httpclient.rb +12 -32
- data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
- data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
- data/lib/new_relic/agent/instrumentation/ignore_actions.rb +5 -6
- data/lib/new_relic/agent/instrumentation/logger/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +66 -0
- data/lib/new_relic/agent/instrumentation/logger/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/logger.rb +26 -0
- data/lib/new_relic/agent/instrumentation/memcache/chain.rb +15 -0
- data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +58 -125
- data/lib/new_relic/agent/instrumentation/memcache/helper.rb +59 -0
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +90 -0
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +101 -0
- data/lib/new_relic/agent/instrumentation/memcache.rb +57 -71
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +15 -14
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +21 -14
- data/lib/new_relic/agent/instrumentation/mongo.rb +7 -132
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +49 -13
- data/lib/new_relic/agent/instrumentation/net_http/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +40 -0
- data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
- data/lib/new_relic/agent/instrumentation/net_http.rb +44 -0
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +142 -0
- data/lib/new_relic/agent/instrumentation/padrino/chain.rb +38 -0
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +28 -0
- data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
- data/lib/new_relic/agent/instrumentation/padrino.rb +22 -58
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +7 -7
- data/lib/new_relic/agent/instrumentation/queue_time.rb +9 -10
- data/lib/new_relic/agent/instrumentation/rack/chain.rb +66 -0
- data/lib/new_relic/agent/instrumentation/rack/helpers.rb +33 -0
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +75 -0
- data/lib/new_relic/agent/instrumentation/rack/prepend.rb +43 -0
- data/lib/new_relic/agent/instrumentation/rack.rb +33 -141
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +19 -55
- data/lib/new_relic/agent/instrumentation/rails_middleware.rb +5 -5
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +36 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +45 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +30 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/custom_events.rb +30 -0
- data/lib/new_relic/agent/instrumentation/rake/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +142 -0
- data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/rake.rb +18 -159
- data/lib/new_relic/agent/instrumentation/redis/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/redis/constants.rb +17 -0
- data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +93 -0
- data/lib/new_relic/agent/instrumentation/redis/middleware.rb +16 -0
- data/lib/new_relic/agent/instrumentation/redis/prepend.rb +29 -0
- data/lib/new_relic/agent/instrumentation/redis.rb +20 -103
- data/lib/new_relic/agent/instrumentation/resque/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/resque/helper.rb +19 -0
- data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +34 -0
- data/lib/new_relic/agent/instrumentation/resque/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/resque.rb +33 -41
- data/lib/new_relic/agent/instrumentation/sequel.rb +17 -20
- data/lib/new_relic/agent/instrumentation/sequel_helper.rb +3 -3
- data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +20 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +30 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +37 -0
- data/lib/new_relic/agent/instrumentation/sidekiq.rb +29 -46
- data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +31 -37
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +125 -0
- data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +3 -3
- data/lib/new_relic/agent/instrumentation/sinatra.rb +35 -165
- data/lib/new_relic/agent/instrumentation/thread/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +28 -0
- data/lib/new_relic/agent/instrumentation/thread/prepend.rb +22 -0
- data/lib/new_relic/agent/instrumentation/thread.rb +20 -0
- data/lib/new_relic/agent/instrumentation/tilt/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +41 -0
- data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/tilt.rb +25 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +80 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +14 -76
- data/lib/new_relic/agent/instrumentation.rb +2 -2
- data/lib/new_relic/agent/internal_agent_error.rb +3 -3
- data/lib/new_relic/agent/javascript_instrumentor.rb +51 -45
- data/lib/new_relic/agent/linking_metadata.rb +44 -0
- data/lib/new_relic/agent/local_log_decorator.rb +37 -0
- data/lib/new_relic/agent/log_event_aggregator.rb +235 -0
- data/lib/new_relic/agent/log_once.rb +2 -2
- data/lib/new_relic/agent/log_priority.rb +20 -0
- data/lib/new_relic/agent/logging.rb +142 -0
- data/lib/new_relic/agent/memory_logger.rb +3 -3
- data/lib/new_relic/agent/messaging.rb +81 -164
- data/lib/new_relic/agent/method_tracer.rb +152 -145
- data/lib/new_relic/agent/method_tracer_helpers.rb +90 -13
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +117 -0
- data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +28 -0
- data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +5 -6
- data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +9 -15
- data/lib/new_relic/agent/monitors.rb +26 -0
- data/lib/new_relic/agent/new_relic_service/encoders.rb +7 -7
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +6 -7
- data/lib/new_relic/agent/new_relic_service/marshaller.rb +8 -29
- data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +5 -5
- data/lib/new_relic/agent/new_relic_service.rb +282 -166
- data/lib/new_relic/agent/noticeable_error.rb +19 -0
- data/lib/new_relic/agent/null_logger.rb +8 -4
- data/lib/new_relic/agent/obfuscator.rb +9 -11
- data/lib/new_relic/agent/parameter_filtering.rb +35 -8
- data/lib/new_relic/agent/payload_metric_mapping.rb +10 -11
- data/lib/new_relic/agent/pipe_channel_manager.rb +28 -18
- data/lib/new_relic/agent/pipe_service.rb +9 -6
- data/lib/new_relic/agent/prepend_supportability.rb +3 -3
- data/lib/new_relic/agent/priority_sampled_buffer.rb +16 -14
- data/lib/new_relic/agent/range_extensions.rb +9 -29
- data/lib/new_relic/agent/rules_engine/replacement_rule.rb +12 -12
- data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +13 -14
- data/lib/new_relic/agent/rules_engine.rb +6 -5
- data/lib/new_relic/agent/sampler.rb +4 -5
- data/lib/new_relic/agent/sampler_collection.rb +4 -5
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +4 -3
- data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +14 -11
- data/lib/new_relic/agent/samplers/memory_sampler.rb +26 -15
- data/lib/new_relic/agent/samplers/object_sampler.rb +2 -2
- data/lib/new_relic/agent/samplers/vm_sampler.rb +22 -20
- data/lib/new_relic/agent/span_event_aggregator.rb +14 -16
- data/lib/new_relic/agent/span_event_primitive.rb +118 -58
- data/lib/new_relic/agent/sql_sampler.rb +25 -25
- data/lib/new_relic/agent/stats.rb +79 -42
- data/lib/new_relic/agent/stats_engine/gc_profiler.rb +11 -13
- data/lib/new_relic/agent/stats_engine/stats_hash.rb +13 -14
- data/lib/new_relic/agent/stats_engine.rb +11 -11
- data/lib/new_relic/agent/synthetics_event_aggregator.rb +8 -9
- data/lib/new_relic/agent/system_info.rb +100 -66
- data/lib/new_relic/agent/threading/agent_thread.rb +20 -16
- data/lib/new_relic/agent/threading/backtrace_node.rb +13 -14
- data/lib/new_relic/agent/threading/backtrace_service.rb +18 -18
- data/lib/new_relic/agent/threading/thread_profile.rb +31 -45
- data/lib/new_relic/agent/timestamp_sampled_buffer.rb +2 -2
- data/lib/new_relic/agent/tracer.rb +513 -0
- data/lib/new_relic/agent/transaction/abstract_segment.rb +131 -41
- data/lib/new_relic/agent/transaction/datastore_segment.rb +22 -18
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +184 -0
- data/lib/new_relic/agent/transaction/distributed_tracing.rb +72 -163
- data/lib/new_relic/agent/transaction/external_request_segment.rb +66 -63
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +34 -46
- data/lib/new_relic/agent/transaction/request_attributes.rb +36 -36
- data/lib/new_relic/agent/transaction/segment.rb +46 -10
- data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +2 -4
- data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +2 -2
- data/lib/new_relic/agent/transaction/trace.rb +21 -24
- data/lib/new_relic/agent/transaction/trace_builder.rb +11 -12
- data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
- data/lib/new_relic/agent/transaction/trace_node.rb +31 -28
- data/lib/new_relic/agent/transaction/tracing.rb +15 -111
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +6 -6
- data/lib/new_relic/agent/transaction.rb +252 -259
- data/lib/new_relic/agent/transaction_error_primitive.rb +34 -37
- data/lib/new_relic/agent/transaction_event_aggregator.rb +13 -13
- data/lib/new_relic/agent/transaction_event_primitive.rb +44 -56
- data/lib/new_relic/agent/transaction_event_recorder.rb +17 -16
- data/lib/new_relic/agent/transaction_metrics.rb +11 -10
- data/lib/new_relic/agent/transaction_sampler.rb +7 -12
- data/lib/new_relic/agent/transaction_time_aggregator.rb +41 -26
- data/lib/new_relic/agent/utilization/aws.rb +34 -4
- data/lib/new_relic/agent/utilization/azure.rb +4 -4
- data/lib/new_relic/agent/utilization/gcp.rb +8 -8
- data/lib/new_relic/agent/utilization/pcf.rb +6 -5
- data/lib/new_relic/agent/utilization/vendor.rb +44 -29
- data/lib/new_relic/agent/utilization_data.rb +43 -6
- data/lib/new_relic/agent/vm/jruby_vm.rb +2 -2
- data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +3 -3
- data/lib/new_relic/agent/vm/mri_vm.rb +46 -19
- data/lib/new_relic/agent/vm/snapshot.rb +6 -6
- data/lib/new_relic/agent/vm.rb +2 -2
- data/lib/new_relic/agent/worker_loop.rb +11 -13
- data/lib/new_relic/agent.rb +151 -79
- data/lib/new_relic/cli/command.rb +21 -23
- data/lib/new_relic/cli/commands/deployments.rb +94 -45
- data/lib/new_relic/cli/commands/install.rb +24 -26
- data/lib/new_relic/coerce.rb +42 -15
- data/lib/new_relic/collection_helper.rb +51 -49
- data/lib/new_relic/constants.rb +39 -0
- data/lib/new_relic/control/class_methods.rb +11 -5
- data/lib/new_relic/control/frameworks/external.rb +3 -3
- data/lib/new_relic/control/frameworks/rails.rb +24 -18
- data/lib/new_relic/control/frameworks/rails3.rb +4 -5
- data/lib/new_relic/control/frameworks/rails4.rb +2 -2
- data/lib/new_relic/control/frameworks/rails_notifications.rb +14 -0
- data/lib/new_relic/control/frameworks/ruby.rb +4 -4
- data/lib/new_relic/control/frameworks/sinatra.rb +8 -2
- data/lib/new_relic/control/frameworks.rb +2 -2
- data/lib/new_relic/control/instance_methods.rb +33 -42
- data/lib/new_relic/control/instrumentation.rb +40 -12
- data/lib/new_relic/control/private_instance_methods.rb +48 -0
- data/lib/new_relic/control/server_methods.rb +4 -5
- data/lib/new_relic/control.rb +2 -3
- data/lib/new_relic/delayed_job_injection.rb +2 -2
- data/lib/new_relic/dependency_detection.rb +129 -18
- data/lib/new_relic/environment_report.rb +41 -35
- data/lib/new_relic/helper.rb +49 -8
- data/lib/new_relic/language_support.rb +30 -6
- data/lib/new_relic/latest_changes.rb +9 -8
- data/lib/new_relic/local_environment.rb +23 -27
- data/lib/new_relic/metric_data.rb +32 -27
- data/lib/new_relic/metric_spec.rb +9 -7
- data/lib/new_relic/noticed_error.rb +46 -33
- data/lib/new_relic/rack/agent_hooks.rb +2 -2
- data/lib/new_relic/rack/agent_middleware.rb +7 -5
- data/lib/new_relic/rack/browser_monitoring.rb +134 -117
- data/lib/new_relic/rack.rb +2 -2
- data/lib/new_relic/recipes/capistrano3.rb +4 -62
- data/lib/new_relic/recipes/capistrano_legacy.rb +24 -27
- data/lib/new_relic/recipes/helpers/send_deployment.rb +70 -0
- data/lib/new_relic/recipes.rb +2 -2
- data/lib/new_relic/supportability_helper.rb +21 -7
- data/lib/new_relic/traced_thread.rb +39 -0
- data/lib/new_relic/version.rb +7 -18
- data/lib/newrelic_rpm.rb +20 -33
- data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +16 -19
- data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +9 -15
- data/lib/tasks/all.rb +4 -4
- data/lib/tasks/config.rake +22 -118
- data/lib/tasks/coverage_report.rake +28 -0
- data/lib/tasks/helpers/config.html.erb +21 -0
- data/lib/tasks/helpers/format.rb +123 -0
- data/lib/tasks/helpers/matches.rb +12 -0
- data/lib/tasks/helpers/prompt.rb +24 -0
- data/lib/tasks/helpers/removers.rb +33 -0
- data/lib/tasks/install.rake +4 -0
- data/lib/tasks/instrumentation_generator/README.md +63 -0
- data/lib/tasks/instrumentation_generator/TODO.md +33 -0
- data/lib/tasks/instrumentation_generator/instrumentation.thor +121 -0
- data/lib/tasks/instrumentation_generator/templates/Envfile.tt +9 -0
- data/lib/tasks/instrumentation_generator/templates/chain.tt +22 -0
- data/lib/tasks/instrumentation_generator/templates/chain_method.tt +8 -0
- data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +29 -0
- data/lib/tasks/instrumentation_generator/templates/instrumentation.tt +13 -0
- data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +3 -0
- data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +19 -0
- data/lib/tasks/instrumentation_generator/templates/prepend.tt +13 -0
- data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +3 -0
- data/lib/tasks/instrumentation_generator/templates/test.tt +15 -0
- data/lib/tasks/multiverse.rake +4 -0
- data/lib/tasks/multiverse.rb +12 -5
- data/lib/tasks/newrelic.rb +2 -2
- data/lib/tasks/tests.rake +14 -14
- data/newrelic.yml +672 -3
- data/newrelic_rpm.gemspec +40 -31
- data/recipes/newrelic.rb +3 -3
- data/test/agent_helper.rb +419 -98
- metadata +238 -127
- data/.travis.yml +0 -228
- data/bin/mongrel_rpm +0 -33
- data/cert/cacert.pem +0 -1177
- data/lib/new_relic/agent/commands/xray_session.rb +0 -55
- data/lib/new_relic/agent/commands/xray_session_collection.rb +0 -161
- data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
- data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +0 -44
- data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +0 -53
- data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -41
- data/lib/new_relic/agent/distributed_trace_payload.rb +0 -246
- data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
- data/lib/new_relic/agent/instrumentation/active_record_4.rb +0 -42
- data/lib/new_relic/agent/instrumentation/active_record_5.rb +0 -41
- data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -74
- data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -25
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -202
- data/lib/new_relic/agent/instrumentation/evented_subscriber.rb +0 -104
- data/lib/new_relic/agent/instrumentation/excon/connection.rb +0 -46
- data/lib/new_relic/agent/instrumentation/http.rb +0 -46
- data/lib/new_relic/agent/instrumentation/merb/controller.rb +0 -44
- data/lib/new_relic/agent/instrumentation/merb/errors.rb +0 -33
- data/lib/new_relic/agent/instrumentation/net.rb +0 -50
- data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +0 -125
- data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +0 -46
- data/lib/new_relic/agent/instrumentation/rails4/action_controller.rb +0 -32
- data/lib/new_relic/agent/instrumentation/rails4/action_view.rb +0 -27
- data/lib/new_relic/agent/instrumentation/rails5/action_cable.rb +0 -36
- data/lib/new_relic/agent/instrumentation/rails5/action_controller.rb +0 -33
- data/lib/new_relic/agent/instrumentation/rails5/action_view.rb +0 -27
- data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +0 -26
- data/lib/new_relic/agent/instrumentation/sunspot.rb +0 -33
- data/lib/new_relic/agent/supported_versions.rb +0 -275
- data/lib/new_relic/agent/transaction/attributes.rb +0 -154
- data/lib/new_relic/agent/transaction/xray_sample_buffer.rb +0 -64
- data/lib/new_relic/agent/transaction_state.rb +0 -186
- data/lib/new_relic/build.rb +0 -2
- data/lib/new_relic/control/frameworks/merb.rb +0 -29
- data/lib/new_relic/control/frameworks/rails5.rb +0 -14
- data/lib/new_relic/metrics.rb +0 -13
- data/lib/tasks/config.html.erb +0 -32
- data/lib/tasks/versions.html.erb +0 -28
- data/lib/tasks/versions.postface.html +0 -8
- data/lib/tasks/versions.preface.html +0 -9
- data/lib/tasks/versions.rake +0 -65
- data/lib/tasks/versions.txt.erb +0 -14
- /data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
@@ -0,0 +1,19 @@
|
|
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
|
+
# This class is used for instrumentations that have exceptions or error classes
|
8
|
+
# not derived from Ruby's usual Exception or StandardError or in situations
|
9
|
+
# where we do not have such Exception object to work with.
|
10
|
+
class NoticeableError
|
11
|
+
attr_reader :class_name, :message
|
12
|
+
|
13
|
+
def initialize(class_name, message)
|
14
|
+
@class_name = class_name
|
15
|
+
@message = message
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
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
|
# A stub object that we can use in place of a real Logger instance when
|
6
6
|
# the agent is disabled.
|
@@ -8,9 +8,13 @@ module NewRelic
|
|
8
8
|
module Agent
|
9
9
|
class NullLogger
|
10
10
|
def fatal(*args); end
|
11
|
+
|
11
12
|
def error(*args); end
|
12
|
-
|
13
|
-
def
|
13
|
+
|
14
|
+
def warn(*args); end
|
15
|
+
|
16
|
+
def info(*args); end
|
17
|
+
|
14
18
|
def debug(*args); end
|
15
19
|
|
16
20
|
def method_missing(method, *args, &blk)
|
@@ -1,20 +1,19 @@
|
|
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 'base64'
|
5
|
+
# require 'base64'
|
6
6
|
|
7
7
|
module NewRelic
|
8
8
|
module Agent
|
9
9
|
class Obfuscator
|
10
|
-
|
11
10
|
attr_reader :key_bytes
|
12
11
|
|
13
12
|
EMPTY_KEY_BYTES = [0]
|
14
13
|
PACK_FORMAT = 'm'
|
15
14
|
|
16
15
|
# RUM uses a shortened key, so just trim it up front
|
17
|
-
def initialize(key, length=nil)
|
16
|
+
def initialize(key, length = nil)
|
18
17
|
if key.nil? || key.empty?
|
19
18
|
@key_bytes = EMPTY_KEY_BYTES
|
20
19
|
else
|
@@ -24,26 +23,25 @@ module NewRelic
|
|
24
23
|
end
|
25
24
|
|
26
25
|
def obfuscate(text)
|
27
|
-
[
|
26
|
+
[encode(text)].pack(PACK_FORMAT).delete("\n")
|
28
27
|
end
|
29
28
|
|
30
29
|
def deobfuscate(text)
|
31
|
-
encode(text.unpack(PACK_FORMAT).first
|
30
|
+
encode(text.unpack(PACK_FORMAT).first)
|
32
31
|
end
|
33
32
|
|
34
33
|
def encode(text)
|
35
34
|
return text unless key_bytes
|
36
35
|
|
37
|
-
encoded =
|
38
|
-
encoded.force_encoding('binary') if encoded.respond_to?(
|
36
|
+
encoded = String.new('')
|
37
|
+
encoded.force_encoding('binary') if encoded.respond_to?(:force_encoding)
|
39
38
|
index = 0
|
40
39
|
text.each_byte do |byte|
|
41
40
|
encoded.concat((byte ^ key_bytes[index % key_bytes.length]))
|
42
|
-
index+=1
|
41
|
+
index += 1
|
43
42
|
end
|
44
43
|
encoded
|
45
44
|
end
|
46
|
-
|
47
45
|
end
|
48
46
|
end
|
49
47
|
end
|
@@ -1,29 +1,50 @@
|
|
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
|
7
7
|
module ParameterFiltering
|
8
8
|
extend self
|
9
9
|
|
10
|
+
ACTION_DISPATCH_PARAMETER_FILTER ||= "action_dispatch.parameter_filter".freeze
|
11
|
+
|
12
|
+
if defined?(Rails) && Gem::Version.new(::Rails::VERSION::STRING) >= Gem::Version.new('5.0.0')
|
13
|
+
Rails.application.config.to_prepare do
|
14
|
+
RAILS_FILTER_CLASS ||= if defined?(ActiveSupport::ParameterFilter)
|
15
|
+
ActiveSupport::ParameterFilter
|
16
|
+
elsif defined?(ActionDispatch::Http::ParameterFilter)
|
17
|
+
ActionDispatch::Http::ParameterFilter
|
18
|
+
end
|
19
|
+
end
|
20
|
+
else
|
21
|
+
RAILS_FILTER_CLASS ||= if defined?(ActiveSupport::ParameterFilter)
|
22
|
+
ActiveSupport::ParameterFilter
|
23
|
+
elsif defined?(ActionDispatch::Http::ParameterFilter)
|
24
|
+
ActionDispatch::Http::ParameterFilter
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
10
28
|
def apply_filters(env, params)
|
11
|
-
|
29
|
+
if filters = env[ACTION_DISPATCH_PARAMETER_FILTER]
|
30
|
+
params = filter_using_rails(params, filters)
|
31
|
+
end
|
12
32
|
params = filter_rack_file_data(env, params)
|
13
33
|
params
|
14
34
|
end
|
15
35
|
|
16
|
-
def filter_using_rails(
|
17
|
-
return params unless
|
18
|
-
|
19
|
-
|
36
|
+
def filter_using_rails(params, filters)
|
37
|
+
return params unless rails_filter_class?
|
38
|
+
|
39
|
+
pre_filtered_params = filter_rails_request_parameters(params)
|
40
|
+
RAILS_FILTER_CLASS.new(filters).filter(pre_filtered_params)
|
20
41
|
end
|
21
42
|
|
22
43
|
def filter_rack_file_data(env, params)
|
23
44
|
content_type = env["CONTENT_TYPE"]
|
24
45
|
multipart = content_type && content_type.start_with?("multipart")
|
25
46
|
|
26
|
-
params.inject({}) do |memo, (k,v)|
|
47
|
+
params.inject({}) do |memo, (k, v)|
|
27
48
|
if multipart && v.is_a?(Hash) && v[:tempfile]
|
28
49
|
memo[k] = "[FILE]"
|
29
50
|
else
|
@@ -39,6 +60,12 @@ module NewRelic
|
|
39
60
|
result.delete("action")
|
40
61
|
result
|
41
62
|
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def rails_filter_class?
|
67
|
+
defined?(RAILS_FILTER_CLASS) && !RAILS_FILTER_CLASS.nil?
|
68
|
+
end
|
42
69
|
end
|
43
70
|
end
|
44
71
|
end
|
@@ -1,12 +1,11 @@
|
|
1
1
|
# -*- ruby -*-
|
2
|
-
# encoding: utf-8
|
3
2
|
# This file is distributed under New Relic's license terms.
|
4
|
-
# See https://github.com/newrelic/
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
# frozen_string_literal: true
|
5
5
|
|
6
6
|
module NewRelic
|
7
7
|
module Agent
|
8
8
|
module PayloadMetricMapping
|
9
|
-
|
10
9
|
# this logic was extracted from TransactionEventAggregator for reuse by
|
11
10
|
# the ErrorEventAggregator
|
12
11
|
|
@@ -28,7 +27,7 @@ module NewRelic
|
|
28
27
|
|
29
28
|
private
|
30
29
|
|
31
|
-
def map_metric(metric_name, to_add={})
|
30
|
+
def map_metric(metric_name, to_add = {})
|
32
31
|
to_add.values.each(&:freeze)
|
33
32
|
|
34
33
|
mappings = SPEC_MAPPINGS.fetch(metric_name, {})
|
@@ -41,18 +40,18 @@ module NewRelic
|
|
41
40
|
# All Transactions
|
42
41
|
# Don't need to use the transaction-type specific metrics since this is
|
43
42
|
# scoped to just one transaction, so Datastore/all has what we want.
|
44
|
-
map_metric('Datastore/all',
|
45
|
-
map_metric('Datastore/all',
|
46
|
-
map_metric('GC/Transaction/all',
|
43
|
+
map_metric('Datastore/all', :total_call_time => 'databaseDuration')
|
44
|
+
map_metric('Datastore/all', :call_count => 'databaseCallCount')
|
45
|
+
map_metric('GC/Transaction/all', :total_call_time => 'gcCumulative')
|
47
46
|
|
48
47
|
# Web Metrics
|
49
48
|
map_metric('WebFrontend/QueueTime', :total_call_time => 'queueDuration')
|
50
|
-
map_metric('External/allWeb',
|
51
|
-
map_metric('External/allWeb',
|
49
|
+
map_metric('External/allWeb', :total_call_time => 'externalDuration')
|
50
|
+
map_metric('External/allWeb', :call_count => 'externalCallCount')
|
52
51
|
|
53
52
|
# Background Metrics
|
54
|
-
map_metric('External/allOther',
|
55
|
-
map_metric('External/allOther',
|
53
|
+
map_metric('External/allOther', :total_call_time => 'externalDuration')
|
54
|
+
map_metric('External/allOther', :call_count => 'externalCallCount')
|
56
55
|
end
|
57
56
|
end
|
58
57
|
end
|
@@ -1,12 +1,11 @@
|
|
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 'base64'
|
6
6
|
|
7
7
|
module NewRelic
|
8
8
|
module Agent
|
9
|
-
|
10
9
|
#--
|
11
10
|
# Manages the registering and servicing of pipes used by child
|
12
11
|
# processes to report data to their parent, rather than directly
|
@@ -67,7 +66,7 @@ module NewRelic
|
|
67
66
|
if defined?(::Encoding::ASCII_8BIT)
|
68
67
|
@in.set_encoding(::Encoding::ASCII_8BIT)
|
69
68
|
end
|
70
|
-
@last_read =
|
69
|
+
@last_read = Process.clock_gettime(Process::CLOCK_REALTIME)
|
71
70
|
@parent_pid = $$
|
72
71
|
end
|
73
72
|
|
@@ -92,7 +91,7 @@ module NewRelic
|
|
92
91
|
|
93
92
|
def read
|
94
93
|
@in.close unless @in.closed?
|
95
|
-
@last_read =
|
94
|
+
@last_read = Process.clock_gettime(Process::CLOCK_REALTIME)
|
96
95
|
length_bytes = @out.read(NUM_LENGTH_BYTES)
|
97
96
|
if length_bytes
|
98
97
|
message_length = deserialize_message_length(length_bytes)
|
@@ -128,7 +127,7 @@ module NewRelic
|
|
128
127
|
end
|
129
128
|
|
130
129
|
class Listener
|
131
|
-
attr_reader
|
130
|
+
attr_reader :thread
|
132
131
|
|
133
132
|
# This attr_accessor intentionally provides unsynchronized access to the
|
134
133
|
# @pipes hash. It is used to look up the write end of the pipe from
|
@@ -161,6 +160,7 @@ module NewRelic
|
|
161
160
|
|
162
161
|
def start
|
163
162
|
return if @started == true
|
163
|
+
|
164
164
|
@started = true
|
165
165
|
@thread = NewRelic::Agent::Threading::AgentThread.create('Pipe Channel Manager') do
|
166
166
|
now = nil
|
@@ -168,27 +168,36 @@ module NewRelic
|
|
168
168
|
clean_up_pipes
|
169
169
|
|
170
170
|
pipes_to_listen_to = @pipes_lock.synchronize do
|
171
|
-
@pipes.values.map{|pipe| pipe.out} + [wake.out]
|
171
|
+
@pipes.values.map { |pipe| pipe.out } + [wake.out]
|
172
172
|
end
|
173
173
|
|
174
|
-
|
175
|
-
(
|
174
|
+
if now
|
175
|
+
NewRelic::Agent.record_metric(
|
176
|
+
'Supportability/Listeners',
|
177
|
+
Process.clock_gettime(Process::CLOCK_REALTIME) - now
|
178
|
+
)
|
179
|
+
end
|
176
180
|
|
177
181
|
if ready = IO.select(pipes_to_listen_to, [], [], @select_timeout)
|
178
|
-
now =
|
182
|
+
now = Process.clock_gettime(Process::CLOCK_REALTIME)
|
179
183
|
|
180
184
|
ready_pipes = ready[0]
|
181
185
|
ready_pipes.each do |pipe|
|
182
186
|
merge_data_from_pipe(pipe) unless pipe == wake.out
|
183
187
|
end
|
184
188
|
|
185
|
-
|
189
|
+
begin
|
190
|
+
wake.out.read_nonblock(1) if ready_pipes.include?(wake.out)
|
191
|
+
rescue IO::WaitReadable
|
192
|
+
NewRelic::Agent.logger.error('Issue while reading from the ready pipe')
|
193
|
+
NewRelic::Agent.logger.error("Ready pipes: #{ready_pipes.map(&:to_s)}, wake.out pipe: #{wake.out}")
|
194
|
+
end
|
186
195
|
end
|
187
196
|
|
188
197
|
break unless should_keep_listening?
|
189
198
|
end
|
190
199
|
end
|
191
|
-
sleep
|
200
|
+
sleep(0.001) # give time for the thread to spawn
|
192
201
|
end
|
193
202
|
|
194
203
|
def stop_listener_thread
|
@@ -199,6 +208,7 @@ module NewRelic
|
|
199
208
|
|
200
209
|
def stop
|
201
210
|
return unless @started == true
|
211
|
+
|
202
212
|
stop_listener_thread
|
203
213
|
close_all_pipes
|
204
214
|
@wake.close
|
@@ -245,29 +255,29 @@ module NewRelic
|
|
245
255
|
def unmarshal(data)
|
246
256
|
Marshal.load(data)
|
247
257
|
rescue StandardError => e
|
248
|
-
::NewRelic::Agent.logger.error
|
249
|
-
::NewRelic::Agent.logger.debug
|
258
|
+
::NewRelic::Agent.logger.error("Failure unmarshalling message from Resque child process", e)
|
259
|
+
::NewRelic::Agent.logger.debug(Base64.encode64(data))
|
250
260
|
nil
|
251
261
|
end
|
252
262
|
|
253
263
|
def should_keep_listening?
|
254
|
-
@started || @pipes_lock.synchronize { @pipes.values.find{|pipe| !pipe.in.closed?} }
|
264
|
+
@started || @pipes_lock.synchronize { @pipes.values.find { |pipe| !pipe.in.closed? } }
|
255
265
|
end
|
256
266
|
|
257
267
|
def clean_up_pipes
|
258
268
|
@pipes_lock.synchronize do
|
259
269
|
@pipes.values.each do |pipe|
|
260
|
-
if pipe.last_read
|
270
|
+
if pipe.last_read + @timeout < Process.clock_gettime(Process::CLOCK_REALTIME)
|
261
271
|
pipe.close unless pipe.closed?
|
262
272
|
end
|
263
273
|
end
|
264
|
-
@pipes.reject! {|id, pipe| pipe.out.closed? }
|
274
|
+
@pipes.reject! { |id, pipe| pipe.out.closed? }
|
265
275
|
end
|
266
276
|
end
|
267
277
|
|
268
278
|
def find_pipe_for_handle(out_handle)
|
269
279
|
@pipes_lock.synchronize do
|
270
|
-
@pipes.values.find{|pipe| pipe.out == out_handle }
|
280
|
+
@pipes.values.find { |pipe| pipe.out == out_handle }
|
271
281
|
end
|
272
282
|
end
|
273
283
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
module NewRelic
|
6
6
|
module Agent
|
@@ -10,8 +10,7 @@ module NewRelic
|
|
10
10
|
|
11
11
|
def initialize(channel_id)
|
12
12
|
@channel_id = channel_id
|
13
|
-
@collector = NewRelic::Control::Server.new(:
|
14
|
-
:port => 0)
|
13
|
+
@collector = NewRelic::Control::Server.new({name: 'parent', port: 0})
|
15
14
|
@pipe = NewRelic::Agent::PipeChannelManager.channels[@channel_id]
|
16
15
|
if @pipe && @pipe.parent_pid != $$
|
17
16
|
@pipe.after_fork_in_child
|
@@ -25,7 +24,7 @@ module NewRelic
|
|
25
24
|
end
|
26
25
|
|
27
26
|
def get_agent_commands
|
28
|
-
|
27
|
+
NewRelic::EMPTY_ARRAY
|
29
28
|
end
|
30
29
|
|
31
30
|
def analytic_event_data(events)
|
@@ -61,7 +60,11 @@ module NewRelic
|
|
61
60
|
write_to_pipe(:sql_trace_data, sql) if sql
|
62
61
|
end
|
63
62
|
|
64
|
-
def
|
63
|
+
def log_event_data(logs)
|
64
|
+
write_to_pipe(:log_event_data, logs) if logs
|
65
|
+
end
|
66
|
+
|
67
|
+
def shutdown
|
65
68
|
@pipe.close if @pipe
|
66
69
|
end
|
67
70
|
|
@@ -1,11 +1,11 @@
|
|
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
|
7
7
|
module PrependSupportability
|
8
|
-
def self.record_metrics_for
|
8
|
+
def self.record_metrics_for(*classes)
|
9
9
|
classes.each do |klass|
|
10
10
|
count = klass.send(:ancestors).index(klass)
|
11
11
|
::NewRelic::Agent.record_metric("Supportability/PrependedModules/#{klass}", count) if count > 0
|
@@ -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/heap'
|
6
6
|
require 'new_relic/agent/event_buffer'
|
@@ -15,29 +15,32 @@ module NewRelic
|
|
15
15
|
def initialize(capacity)
|
16
16
|
super
|
17
17
|
@captured_lifetime = 0
|
18
|
-
@seen_lifetime
|
18
|
+
@seen_lifetime = 0
|
19
|
+
end
|
20
|
+
|
21
|
+
def heapify_items_array
|
22
|
+
if @items.is_a?(Array)
|
23
|
+
@items = Heap.new(@items) { |x| priority_for(x) }
|
24
|
+
end
|
19
25
|
end
|
20
26
|
|
21
27
|
# expects priority and a block, or an event as a hash with a `priority` key.
|
22
28
|
def append(priority: nil, event: nil, &blk)
|
23
29
|
increment_seen
|
24
30
|
|
25
|
-
if @
|
26
|
-
@items = Heap.new(@items) { |x| priority_for(x) }
|
27
|
-
end
|
31
|
+
return if @capacity == 0
|
28
32
|
|
29
33
|
if full?
|
30
34
|
priority ||= priority_for(event)
|
31
35
|
if priority_for(@items[0]) < priority
|
32
|
-
|
36
|
+
heapify_items_array
|
37
|
+
incoming = event || yield
|
33
38
|
@items[0] = incoming
|
34
39
|
@items.fix(0)
|
35
40
|
incoming
|
36
|
-
else
|
37
|
-
nil
|
38
41
|
end
|
39
42
|
else
|
40
|
-
@items << (event ||
|
43
|
+
@items << (event || yield)
|
41
44
|
@captured_lifetime += 1
|
42
45
|
@items[-1]
|
43
46
|
end
|
@@ -48,17 +51,17 @@ module NewRelic
|
|
48
51
|
def capacity=(new_capacity)
|
49
52
|
@capacity = new_capacity
|
50
53
|
old_items = @items.to_a
|
51
|
-
old_seen
|
54
|
+
old_seen = @seen
|
52
55
|
reset!
|
53
56
|
old_items.each { |i| append(event: i) }
|
54
|
-
@seen
|
57
|
+
@seen = old_seen
|
55
58
|
end
|
56
59
|
|
57
60
|
def to_a
|
58
61
|
@items.to_a.dup
|
59
62
|
end
|
60
63
|
|
61
|
-
def decrement_lifetime_counts_by
|
64
|
+
def decrement_lifetime_counts_by(n)
|
62
65
|
@captured_lifetime -= n
|
63
66
|
@seen_lifetime -= n
|
64
67
|
end
|
@@ -87,4 +90,3 @@ module NewRelic
|
|
87
90
|
end
|
88
91
|
end
|
89
92
|
end
|
90
|
-
|
@@ -1,45 +1,25 @@
|
|
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
|
7
7
|
module RangeExtensions
|
8
8
|
module_function
|
9
9
|
|
10
|
-
def intersects?
|
11
|
-
r1.
|
12
|
-
end
|
13
|
-
|
14
|
-
def merge r1, r2
|
15
|
-
return unless intersects? r1, r2
|
16
|
-
range_min = r1.begin < r2.begin ? r1.begin : r2.begin
|
17
|
-
range_max = r1.end > r2.end ? r1.end : r2.end
|
18
|
-
range_min..range_max
|
19
|
-
end
|
20
|
-
|
21
|
-
# Takes an array of ranges and a range which it will
|
22
|
-
# merge into an existing range if they intersect, otherwise
|
23
|
-
# it will append this range to the end the array.
|
24
|
-
def merge_or_append range, ranges
|
25
|
-
ranges.each_with_index do |r, i|
|
26
|
-
if merged = merge(r, range)
|
27
|
-
ranges[i] = merged
|
28
|
-
return ranges
|
29
|
-
end
|
30
|
-
end
|
31
|
-
ranges.push range
|
10
|
+
def intersects?(r1, r2)
|
11
|
+
r1.begin > r2.begin ? r2.cover?(r1.begin) : r1.cover?(r2.begin)
|
32
12
|
end
|
33
13
|
|
34
14
|
# Computes the amount of overlap between range and an array of ranges.
|
35
15
|
# For efficiency, it assumes that range intersects with each of the
|
36
16
|
# ranges in the ranges array.
|
37
|
-
def compute_overlap
|
17
|
+
def compute_overlap(range, ranges)
|
38
18
|
ranges.inject(0) do |memo, other|
|
39
|
-
next memo unless intersects?
|
40
|
-
|
41
|
-
|
42
|
-
|
19
|
+
next memo unless intersects?(range, other)
|
20
|
+
|
21
|
+
memo += ([range.end, other.end].min) -
|
22
|
+
([range.begin, other.begin].max)
|
43
23
|
end
|
44
24
|
end
|
45
25
|
end
|
@@ -1,13 +1,13 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
module NewRelic
|
6
6
|
module Agent
|
7
7
|
class RulesEngine
|
8
8
|
class ReplacementRule
|
9
9
|
attr_reader(:terminate_chain, :each_segment, :ignore, :replace_all, :eval_order,
|
10
|
-
|
10
|
+
:match_expression, :replacement)
|
11
11
|
|
12
12
|
def initialize(options)
|
13
13
|
if !options['match_expression']
|
@@ -18,12 +18,12 @@ module NewRelic
|
|
18
18
|
end
|
19
19
|
|
20
20
|
@match_expression = Regexp.new(options['match_expression'], Regexp::IGNORECASE)
|
21
|
-
@replacement
|
22
|
-
@ignore
|
23
|
-
@eval_order
|
24
|
-
@replace_all
|
25
|
-
@each_segment
|
26
|
-
@terminate_chain
|
21
|
+
@replacement = options['replacement']
|
22
|
+
@ignore = options['ignore'] || false
|
23
|
+
@eval_order = options['eval_order'] || 0
|
24
|
+
@replace_all = options['replace_all'] || false
|
25
|
+
@each_segment = options['each_segment'] || false
|
26
|
+
@terminate_chain = options['terminate_chain'] || false
|
27
27
|
end
|
28
28
|
|
29
29
|
def terminal?
|
@@ -36,7 +36,7 @@ module NewRelic
|
|
36
36
|
segment.match(@match_expression)
|
37
37
|
end
|
38
38
|
else
|
39
|
-
string.match
|
39
|
+
string.match(@match_expression)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
@@ -56,9 +56,9 @@ module NewRelic
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def apply_to_each_segment(string)
|
59
|
-
string
|
59
|
+
string = string.dup
|
60
60
|
leading_slash = string.slice!(LEADING_SLASH_REGEX)
|
61
|
-
segments
|
61
|
+
segments = string.split(SEGMENT_SEPARATOR)
|
62
62
|
|
63
63
|
segments.map! do |segment|
|
64
64
|
apply_replacement(segment)
|
@@ -1,24 +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
|
module NewRelic
|
6
6
|
module Agent
|
7
7
|
class RulesEngine
|
8
8
|
class SegmentTermsRule
|
9
|
-
PREFIX_KEY
|
10
|
-
TERMS_KEY
|
11
|
-
SEGMENT_PLACEHOLDER
|
12
|
-
ADJACENT_PLACEHOLDERS_REGEX
|
9
|
+
PREFIX_KEY = 'prefix'.freeze
|
10
|
+
TERMS_KEY = 'terms'.freeze
|
11
|
+
SEGMENT_PLACEHOLDER = '*'.freeze
|
12
|
+
ADJACENT_PLACEHOLDERS_REGEX = %r{((?:^|/)\*)(?:/\*)*}.freeze
|
13
13
|
ADJACENT_PLACEHOLDERS_REPLACEMENT = '\1'.freeze
|
14
|
-
VALID_PREFIX_SEGMENT_COUNT = 2
|
15
14
|
|
16
15
|
attr_reader :prefix, :terms
|
17
16
|
|
18
17
|
def self.valid?(rule_spec)
|
19
18
|
rule_spec[PREFIX_KEY].kind_of?(String) &&
|
20
|
-
|
21
|
-
|
19
|
+
rule_spec[TERMS_KEY].kind_of?(Array) &&
|
20
|
+
valid_prefix_segment_count?(rule_spec[PREFIX_KEY])
|
22
21
|
end
|
23
22
|
|
24
23
|
def self.valid_prefix_segment_count?(prefix)
|
@@ -26,13 +25,13 @@ module NewRelic
|
|
26
25
|
rindex = prefix.rindex(SEGMENT_SEPARATOR)
|
27
26
|
|
28
27
|
(count == 2 && prefix[rindex + 1].nil?) ||
|
29
|
-
|
28
|
+
(count == 1 && !prefix[rindex + 1].nil?)
|
30
29
|
end
|
31
30
|
|
32
31
|
def initialize(options)
|
33
|
-
@prefix
|
34
|
-
@terms
|
35
|
-
@trim_range
|
32
|
+
@prefix = options[PREFIX_KEY]
|
33
|
+
@terms = options[TERMS_KEY]
|
34
|
+
@trim_range = (@prefix.size..-1)
|
36
35
|
end
|
37
36
|
|
38
37
|
def terminal?
|
@@ -50,7 +49,7 @@ module NewRelic
|
|
50
49
|
end
|
51
50
|
|
52
51
|
def apply(string)
|
53
|
-
rest
|
52
|
+
rest = string[@trim_range]
|
54
53
|
leading_slash = rest.slice!(LEADING_SLASH_REGEX)
|
55
54
|
segments = rest.split(SEGMENT_SEPARATOR, -1)
|
56
55
|
segments.map! { |s| @terms.include?(s) ? s : SEGMENT_PLACEHOLDER }
|