newrelic_rpm 6.8.0.360 → 8.13.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +14 -1
- data/.rubocop.yml +1817 -0
- data/.rubocop_todo.yml +59 -0
- data/.simplecov +15 -0
- data/.snyk +11 -0
- data/.yardopts +1 -0
- data/Brewfile +12 -0
- data/CHANGELOG.md +1142 -15
- data/CONTRIBUTING.md +133 -19
- data/DOCKER.md +167 -0
- data/Dockerfile +10 -0
- data/Gemfile +5 -2
- data/Guardfile +18 -6
- data/LICENSE +202 -38
- data/README.md +84 -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/shutdown.rb +35 -0
- data/lib/new_relic/agent/agent/special_startup.rb +72 -0
- data/lib/new_relic/agent/agent/start_worker_thread.rb +163 -0
- data/lib/new_relic/agent/agent/startup.rb +197 -0
- data/lib/new_relic/agent/agent.rb +199 -562
- data/lib/new_relic/agent/agent_logger.rb +24 -20
- data/lib/new_relic/agent/attribute_filter.rb +67 -48
- data/lib/new_relic/agent/attribute_processing.rb +8 -8
- data/lib/new_relic/agent/attributes.rb +9 -8
- data/lib/new_relic/agent/audit_logger.rb +19 -4
- data/lib/new_relic/agent/autostart.rb +21 -20
- 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 +13 -12
- data/lib/new_relic/agent/commands/thread_profiler_session.rb +10 -8
- data/lib/new_relic/agent/configuration/default_source.rb +1731 -1143
- data/lib/new_relic/agent/configuration/dotted_hash.rb +7 -6
- data/lib/new_relic/agent/configuration/environment_source.rb +12 -10
- data/lib/new_relic/agent/configuration/event_harvest_config.rb +41 -18
- data/lib/new_relic/agent/configuration/high_security_source.rb +10 -9
- data/lib/new_relic/agent/configuration/manager.rb +83 -70
- 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 +91 -78
- data/lib/new_relic/agent/configuration/server_source.rb +23 -21
- data/lib/new_relic/agent/configuration/yaml_source.rb +33 -9
- data/lib/new_relic/agent/configuration.rb +2 -2
- data/lib/new_relic/agent/connect/request_builder.rb +19 -19
- data/lib/new_relic/agent/connect/response_handler.rb +6 -9
- 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 +55 -50
- data/lib/new_relic/agent/database_adapter.rb +35 -0
- data/lib/new_relic/agent/datastores/metric_helper.rb +18 -19
- data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +8 -7
- 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 +12 -14
- 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} +86 -64
- 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 +98 -62
- data/lib/new_relic/agent/error_event_aggregator.rb +9 -8
- data/lib/new_relic/agent/error_filter.rb +174 -0
- data/lib/new_relic/agent/error_trace_aggregator.rb +5 -4
- data/lib/new_relic/agent/event_aggregator.rb +23 -22
- 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 +26 -24
- data/lib/new_relic/agent/external.rb +19 -52
- data/lib/new_relic/agent/guid_generator.rb +5 -12
- data/lib/new_relic/agent/harvester.rb +5 -6
- data/lib/new_relic/agent/heap.rb +7 -9
- data/lib/new_relic/agent/hostname.rb +21 -8
- 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 +12 -14
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +43 -32
- data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +21 -14
- data/lib/new_relic/agent/instrumentation/active_job.rb +15 -8
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +21 -7
- data/lib/new_relic/agent/instrumentation/active_record.rb +89 -40
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +82 -61
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +32 -45
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +36 -12
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +34 -22
- data/lib/new_relic/agent/instrumentation/active_storage.rb +3 -3
- data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +25 -18
- 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/acts_as_solr.rb +12 -3
- data/lib/new_relic/agent/instrumentation/authlogic.rb +11 -3
- 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 -138
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +69 -59
- 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 +13 -198
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +68 -55
- 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 +7 -6
- data/lib/new_relic/agent/instrumentation/excon.rb +24 -26
- 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 +12 -118
- 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 +14 -13
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +10 -10
- data/lib/new_relic/agent/instrumentation/mongo.rb +6 -131
- 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 +34 -9
- 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 +4 -4
- 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 +31 -139
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +17 -53
- data/lib/new_relic/agent/instrumentation/rails_middleware.rb +2 -2
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +6 -5
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +4 -4
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +4 -3
- data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +14 -4
- data/lib/new_relic/agent/instrumentation/rake/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +149 -0
- data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/rake.rb +17 -157
- 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 +72 -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 +19 -102
- 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 +29 -37
- data/lib/new_relic/agent/instrumentation/sequel.rb +15 -17
- 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 +28 -45
- 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/sunspot.rb +12 -4
- 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 +48 -42
- 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 +39 -26
- data/lib/new_relic/agent/memory_logger.rb +3 -3
- data/lib/new_relic/agent/messaging.rb +70 -154
- data/lib/new_relic/agent/method_tracer.rb +152 -145
- data/lib/new_relic/agent/method_tracer_helpers.rb +87 -5
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +118 -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} +3 -4
- data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +8 -13
- 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 -6
- data/lib/new_relic/agent/new_relic_service/marshaller.rb +3 -3
- data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +6 -5
- data/lib/new_relic/agent/new_relic_service.rb +258 -184
- 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 +25 -11
- 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 +15 -15
- 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 +14 -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 +13 -10
- 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 +13 -13
- data/lib/new_relic/agent/span_event_primitive.rb +106 -68
- data/lib/new_relic/agent/sql_sampler.rb +22 -22
- 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 +9 -9
- data/lib/new_relic/agent/synthetics_event_aggregator.rb +8 -9
- data/lib/new_relic/agent/system_info.rb +95 -66
- data/lib/new_relic/agent/threading/agent_thread.rb +19 -15
- data/lib/new_relic/agent/threading/backtrace_node.rb +13 -14
- data/lib/new_relic/agent/threading/backtrace_service.rb +15 -15
- data/lib/new_relic/agent/threading/thread_profile.rb +24 -24
- data/lib/new_relic/agent/timestamp_sampled_buffer.rb +2 -2
- data/lib/new_relic/agent/tracer.rb +107 -101
- data/lib/new_relic/agent/transaction/abstract_segment.rb +128 -38
- 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 +75 -84
- data/lib/new_relic/agent/transaction/external_request_segment.rb +66 -76
- 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 +35 -11
- 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 +18 -16
- data/lib/new_relic/agent/transaction/trace_builder.rb +11 -11
- data/lib/new_relic/agent/transaction/trace_context.rb +102 -93
- data/lib/new_relic/agent/transaction/trace_node.rb +26 -28
- data/lib/new_relic/agent/transaction/tracing.rb +15 -12
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +5 -5
- data/lib/new_relic/agent/transaction.rb +210 -177
- data/lib/new_relic/agent/transaction_error_primitive.rb +32 -28
- data/lib/new_relic/agent/transaction_event_aggregator.rb +13 -13
- data/lib/new_relic/agent/transaction_event_primitive.rb +43 -47
- 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 +6 -7
- data/lib/new_relic/agent/transaction_time_aggregator.rb +27 -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 +8 -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 +78 -79
- data/lib/new_relic/cli/command.rb +21 -23
- data/lib/new_relic/cli/commands/deployments.rb +93 -44
- data/lib/new_relic/cli/commands/install.rb +15 -17
- data/lib/new_relic/coerce.rb +19 -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 +4 -4
- 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 +2 -2
- 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 +24 -46
- 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 +25 -19
- 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 +44 -35
- data/lib/new_relic/rack/agent_hooks.rb +2 -2
- data/lib/new_relic/rack/agent_middleware.rb +6 -4
- data/lib/new_relic/rack/browser_monitoring.rb +134 -119
- 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 +69 -0
- data/lib/new_relic/recipes.rb +2 -2
- data/lib/new_relic/supportability_helper.rb +21 -6
- data/lib/new_relic/traced_thread.rb +35 -0
- data/lib/new_relic/version.rb +7 -18
- data/lib/newrelic_rpm.rb +12 -36
- data/lib/sequel/extensions/newrelic_instrumentation.rb +13 -16
- data/lib/sequel/plugins/newrelic_instrumentation.rb +5 -11
- data/lib/tasks/all.rb +4 -4
- data/lib/tasks/config.rake +22 -117
- data/lib/tasks/coverage_report.rake +28 -0
- data/lib/tasks/helpers/config.html.erb +21 -0
- data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -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 +124 -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 +648 -3
- data/newrelic_rpm.gemspec +28 -25
- data/recipes/newrelic.rb +3 -3
- data/test/agent_helper.rb +332 -103
- metadata +192 -119
- data/.travis.yml +0 -210
- data/bin/mongrel_rpm +0 -33
- data/cert/cacert.pem +0 -1177
- 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_intrinsics.rb +0 -90
- data/lib/new_relic/agent/distributed_trace_metrics.rb +0 -74
- data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -30
- data/lib/new_relic/agent/distributed_trace_payload.rb +0 -175
- data/lib/new_relic/agent/distributed_trace_transport_type.rb +0 -43
- data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
- 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/supported_versions.rb +0 -275
- data/lib/new_relic/agent/trace_context.rb +0 -244
- data/lib/new_relic/agent/trace_context_payload.rb +0 -134
- data/lib/new_relic/agent/trace_context_request_monitor.rb +0 -42
- data/lib/new_relic/build.rb +0 -2
- data/lib/new_relic/control/frameworks/merb.rb +0 -29
- data/lib/new_relic/metrics.rb +0 -13
- data/lib/tasks/config.html.erb +0 -32
- data/true +0 -0
data/README.md
CHANGED
@@ -1,12 +1,17 @@
|
|
1
|
+
[![Blue banner - Community Plus: This code is currently maintained by New Relic engineering teams and delivered here in GitHub. See the README for troubleshooting and defect reporting instructions.](https://github.com/newrelic/opensource-website/raw/main/src/images/categories/Community_Plus.png)](https://opensource.newrelic.com/oss-category/#community-plus)
|
2
|
+
|
1
3
|
# New Relic Ruby Agent
|
2
4
|
|
3
|
-
New Relic
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
The New Relic Ruby agent monitors your applications to help you
|
6
|
+
[identify and solve performance issues](https://docs.newrelic.com/docs/agents/ruby-agent/getting-started/introduction-new-relic-ruby#monitor-performance).
|
7
|
+
You can also extend the agent's performance monitoring to
|
8
|
+
[collect and analyze business data](https://docs.newrelic.com/docs/agents/ruby-agent/getting-started/introduction-new-relic-ruby#business-data)
|
9
|
+
to help you improve the customer experience and make data-driven business decisions.
|
10
|
+
|
11
|
+
The New Relic Ruby agent is dual-purposed as either a Gem or a Rails plugin,
|
12
|
+
hosted on [github](https://github.com/newrelic/newrelic-ruby-agent).
|
13
|
+
|
14
|
+
[![Gem Version](https://badge.fury.io/rb/newrelic_rpm.svg)](https://badge.fury.io/rb/newrelic_rpm)
|
10
15
|
|
11
16
|
## Supported Environments
|
12
17
|
|
@@ -14,127 +19,119 @@ An up-to-date list of Ruby versions and frameworks for the latest agent
|
|
14
19
|
can be found on [our docs site](http://docs.newrelic.com/docs/ruby/supported-frameworks).
|
15
20
|
|
16
21
|
You can also monitor non-web applications. Refer to the "Other
|
17
|
-
Environments" section
|
22
|
+
Environments" section below.
|
18
23
|
|
19
|
-
##
|
24
|
+
## Installing and Using
|
20
25
|
|
21
|
-
|
22
|
-
community. Before submitting a pull request please review
|
23
|
-
[these guidelines](https://github.com/newrelic/rpm/blob/master/CONTRIBUTING.md).
|
26
|
+
The latest released gem for the Ruby agent can be found at [Rubygems.org](https://rubygems.org/gems/newrelic_rpm)
|
24
27
|
|
25
|
-
|
26
|
-
and avoid breaking your code with future changes to the agent.
|
28
|
+
### Quick Start
|
27
29
|
|
30
|
+
#### With Bundler
|
28
31
|
|
29
|
-
|
32
|
+
For using with Bundler, add the Ruby agent to your project's Gemfile.
|
30
33
|
|
31
|
-
|
34
|
+
```ruby
|
35
|
+
gem 'newrelic_rpm'
|
36
|
+
```
|
32
37
|
|
33
|
-
|
38
|
+
and run `bundle install` to activate the new gem.
|
34
39
|
|
35
|
-
|
36
|
-
http://newrelic.com/ . There you can
|
37
|
-
sign up for a free Lite account or one of our paid subscriptions.
|
40
|
+
#### Without Bundler
|
38
41
|
|
39
|
-
|
40
|
-
`newrelic.yml` file, you can copy the `newrelic.yml` file into your app config
|
41
|
-
directory OR can generate the file manually with command:
|
42
|
+
If you are not using Bundler, install the gem with:
|
42
43
|
|
43
|
-
|
44
|
+
```bash
|
45
|
+
gem install newrelic_rpm
|
46
|
+
```
|
44
47
|
|
45
|
-
|
46
|
-
is by default read from the `config` directory of the application root
|
47
|
-
and is subsequently searched for in the application root directory,
|
48
|
-
and then in a `~/.newrelic` directory. Once you're up and running you can
|
49
|
-
enable Server Side Config and manage your newrelic configuration from the web
|
50
|
-
UI.
|
48
|
+
and then require the New Relic Ruby agent in your Ruby start-up sequence:
|
51
49
|
|
52
|
-
|
50
|
+
```ruby
|
51
|
+
require 'newrelic_rpm'
|
52
|
+
```
|
53
53
|
|
54
|
-
|
54
|
+
#### Other Environments
|
55
55
|
|
56
|
-
|
56
|
+
Assuming you have installed the agent per above, you may also need to tell the Ruby agent to start for some frameworks and non-framework environments. To do so, add the following to your Ruby start-up sequence start the agent:
|
57
57
|
|
58
|
-
|
58
|
+
```ruby
|
59
|
+
NewRelic::Agent.manual_start
|
60
|
+
```
|
61
|
+
|
62
|
+
### Complete Install Instructions
|
59
63
|
|
60
|
-
|
64
|
+
For complete documentation on installing the New Relic Ruby agent, see the following links:
|
61
65
|
|
62
|
-
|
66
|
+
* [Introduction](https://docs.newrelic.com/docs/agents/ruby-agent/getting-started/introduction-new-relic-ruby)
|
67
|
+
* [Install the New Relic Ruby agent](https://docs.newrelic.com/docs/agents/ruby-agent/installation/install-new-relic-ruby-agent)
|
68
|
+
* [Configure the agent](https://docs.newrelic.com/docs/agents/ruby-agent/configuration/ruby-agent-configuration)
|
69
|
+
* [Update the agent](https://docs.newrelic.com/docs/agents/ruby-agent/installation/update-ruby-agent)
|
70
|
+
* [Rails plugin installation](https://docs.newrelic.com/docs/agents/ruby-agent/installation/ruby-agent-installation-rails-plugin)
|
71
|
+
* [GAE Flexible Environment](https://docs.newrelic.com/docs/agents/ruby-agent/installation/install-new-relic-ruby-agent-gae-flexible-environment)
|
72
|
+
* [Pure Rack Apps](http://docs.newrelic.com/docs/ruby/rack-middlewares)
|
73
|
+
* [Ruby agent and Heroku](https://docs.newrelic.com/docs/agents/ruby-agent/installation/ruby-agent-heroku)
|
74
|
+
* [Background Jobs](https://docs.newrelic.com/docs/agents/ruby-agent/background-jobs/monitor-ruby-background-processes)
|
75
|
+
* [Uninstall the Ruby agent](https://docs.newrelic.com/docs/agents/ruby-agent/installation/uninstall-ruby-agent)
|
63
76
|
|
64
|
-
|
77
|
+
### Recording Deploys
|
65
78
|
|
66
|
-
|
79
|
+
The Ruby agent supports recording deployments in New Relic via a command line
|
80
|
+
tool or Capistrano recipes. For more information on these features, see
|
81
|
+
[our deployment documentation](http://docs.newrelic.com/docs/ruby/recording-deployments-with-the-ruby-agent)
|
82
|
+
for more information.
|
67
83
|
|
68
|
-
#### Sinatra Installation
|
69
84
|
|
70
|
-
|
85
|
+
## Support
|
71
86
|
|
72
|
-
|
73
|
-
require 'newrelic_rpm'
|
74
|
-
```
|
87
|
+
Should you need assistance with New Relic products, you are in good hands with several support diagnostic tools and support channels.
|
75
88
|
|
76
|
-
|
89
|
+
This [troubleshooting framework](https://discuss.newrelic.com/t/ruby-troubleshooting-framework-install/108685) steps you through common troubleshooting questions.
|
77
90
|
|
78
|
-
|
79
|
-
configuration definitions in the newrelic.yml file; e.g., development,
|
80
|
-
staging, production, etc.
|
91
|
+
New Relic offers NRDiag, [a client-side diagnostic utility](https://docs.newrelic.com/docs/using-new-relic/cross-product-functions/troubleshooting/new-relic-diagnostics) that automatically detects common problems with New Relic agents. If NRDiag detects a problem, it suggests troubleshooting steps. NRDiag can also automatically attach troubleshooting data to a New Relic Support ticket.
|
81
92
|
|
82
|
-
|
93
|
+
If the issue has been confirmed as a bug or is a Feature request, please file a GitHub issue.
|
83
94
|
|
84
|
-
|
95
|
+
**Support Channels**
|
85
96
|
|
86
|
-
|
87
|
-
|
88
|
-
|
97
|
+
* [New Relic Documentation](https://docs.newrelic.com/docs/agents/ruby-agent): Comprehensive guidance for using our platform
|
98
|
+
* [New Relic Community](https://discuss.newrelic.com/tags/rubyagent): The best place to engage in troubleshooting questions
|
99
|
+
* [New Relic Developer](https://developer.newrelic.com/): Resources for building a custom observability applications
|
100
|
+
* [New Relic University](https://learn.newrelic.com/): A range of online training for New Relic users of every level
|
101
|
+
* [New Relic Technical Support](https://support.newrelic.com/) 24/7/365 ticketed support. Read more about our [Technical Support Offerings](https://docs.newrelic.com/docs/licenses/license-information/general-usage-licenses/support-plan).
|
89
102
|
|
90
|
-
|
103
|
+
## Privacy
|
91
104
|
|
92
|
-
|
93
|
-
NewRelic::Agent.manual_start
|
94
|
-
```
|
105
|
+
At New Relic we take your privacy and the security of your information seriously, and are committed to protecting your information. We must emphasize the importance of not sharing personal data in public forums, and ask all users to scrub logs and diagnostic information for sensitive information, whether personal, proprietary, or otherwise.
|
95
106
|
|
96
|
-
|
97
|
-
[Rack middlewares documentation](http://docs.newrelic.com/docs/ruby/rack-middlewares).
|
107
|
+
We define “Personal Data” as any information relating to an identified or identifiable individual, including, for example, your name, phone number, post code or zip code, Device ID, IP address, and email address.
|
98
108
|
|
99
|
-
|
100
|
-
monitor other web frameworks, background jobs, and daemons.
|
109
|
+
Please review [New Relic’s General Data Privacy Notice](https://newrelic.com/termsandconditions/privacy) for more information.
|
101
110
|
|
102
|
-
|
103
|
-
frameworks. You can find a list of community created intrumentation plugins
|
104
|
-
(e.g. [newrelic-redis](https://github.com/evanphx/newrelic-redis)) in the
|
105
|
-
[extends_newrelic_rpm project](https://github.com/newrelic/extends_newrelic_rpm).
|
111
|
+
## Contributing
|
106
112
|
|
107
|
-
|
113
|
+
We encourage contributions to improve the New Relic Ruby agent! Keep in mind when you submit your pull request, you'll need to sign the Contributor License Agreement (CLA) via the click-through using CLA-Assistant. You only have to sign the CLA one time per project.
|
114
|
+
If you have any questions, or to execute our corporate CLA (required if your contribution is on behalf of a company), please drop us an email at opensource@newrelic.com.
|
108
115
|
|
109
|
-
|
110
|
-
Relic agent runs in production mode. It connects to the New Relic
|
111
|
-
service and sends deep performance data to the UI for your
|
112
|
-
analysis. To view this data, log in to http://rpm.newrelic.com.
|
116
|
+
**A note about vulnerabilities**
|
113
117
|
|
114
|
-
|
115
|
-
online. Refer to instructions in *Getting Started*.
|
118
|
+
As noted in our [security policy](https://github.com/newrelic/newrelic-ruby-agent/security/policy), New Relic is committed to the privacy and security of our customers and their data. We believe that providing coordinated disclosure by security researchers and engaging with the security community are important means to achieve our security goals.
|
116
119
|
|
117
|
-
|
120
|
+
If you believe you have found a security vulnerability in this project or any of New Relic's products or websites, we welcome and greatly appreciate you reporting it to New Relic through [HackerOne](https://hackerone.com/newrelic).
|
118
121
|
|
119
|
-
|
120
|
-
tool or Capistrano recipes. For more information on these features see
|
121
|
-
[our deployment documentation](http://docs.newrelic.com/docs/ruby/recording-deployments-with-the-ruby-agent)
|
122
|
-
for more information.
|
122
|
+
If you would like to contribute to this project, please review [these guidelines](https://github.com/newrelic/newrelic-ruby-agent/blob/main/CONTRIBUTING.md).
|
123
123
|
|
124
|
-
|
124
|
+
To [all contributors](https://github.com/newrelic/newrelic-ruby-agent/graphs/contributors), we thank you! Without your contribution, this project would not be what it is today. We also host a community project page dedicated to
|
125
|
+
the [New Relic Ruby agent](https://opensource.newrelic.com/projects/newrelic/newrelic-ruby-agent).
|
125
126
|
|
126
|
-
|
127
|
-
and specifically in the [Ruby category](http://newrelic.com/docs/ruby).
|
127
|
+
## License
|
128
128
|
|
129
|
-
|
130
|
-
site](http://support.newrelic.com/) or our [community forum](https://discuss.newrelic.com/)
|
131
|
-
and we'll be happy to help you.
|
129
|
+
As of version 6.12 (released July 16, 2020), the New Relic Ruby agent is licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for a copy of the license. For older agent versions, check the LICENSE file included with the source code.
|
132
130
|
|
133
|
-
|
134
|
-
or email support@newrelic.com.
|
131
|
+
The New Relic Ruby agent may use source code from third-party libraries. When used, these libraries will be outlined in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
|
135
132
|
|
136
|
-
Thank
|
133
|
+
## Thank You
|
137
134
|
|
138
|
-
|
135
|
+
Thank you,
|
139
136
|
|
140
|
-
New Relic
|
137
|
+
New Relic Ruby agent team
|
data/Rakefile
CHANGED
@@ -1,7 +1,13 @@
|
|
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
|
+
|
1
5
|
require 'rubygems'
|
2
6
|
require 'rake/testtask'
|
3
7
|
require 'yard'
|
4
8
|
require "#{File.dirname(__FILE__)}/lib/tasks/all.rb"
|
9
|
+
require_relative 'lib/tasks/helpers/prompt'
|
10
|
+
include Prompt
|
5
11
|
|
6
12
|
YARD::Rake::YardocTask.new
|
7
13
|
|
@@ -10,16 +16,7 @@ task :test => ['test:newrelic']
|
|
10
16
|
|
11
17
|
namespace :test do
|
12
18
|
desc "Run all tests"
|
13
|
-
task :all => %w
|
14
|
-
|
15
|
-
begin
|
16
|
-
require 'test_bisect'
|
17
|
-
TestBisect::BisectTask.new do |t|
|
18
|
-
t.test_task_name = 'test:newrelic'
|
19
|
-
end
|
20
|
-
rescue LoadError
|
21
|
-
end
|
22
|
-
|
19
|
+
task :all => %w[newrelic multiverse all_compatible_envs]
|
23
20
|
agent_home = File.expand_path(File.dirname(__FILE__))
|
24
21
|
|
25
22
|
desc "Run agent performance tests"
|
@@ -27,14 +24,21 @@ namespace :test do
|
|
27
24
|
require File.expand_path(File.join(File.dirname(__FILE__), 'test', 'performance', 'lib', 'performance'))
|
28
25
|
options = {}
|
29
26
|
options[:suite] = args[:suite] if args[:suite]
|
30
|
-
options[:name]
|
27
|
+
options[:name] = args[:name] if args[:name]
|
31
28
|
Performance::Runner.new(options).run_and_report
|
32
29
|
end
|
33
30
|
|
34
|
-
desc "Run agent within existing mini
|
35
|
-
task :env
|
31
|
+
desc "Run agent within existing mini environment(s): env[name1,name2,name3,etc.]"
|
32
|
+
task :env do |t, args|
|
36
33
|
require File.expand_path(File.join(File.dirname(__FILE__), 'test', 'environments', 'lib', 'environments', 'runner'))
|
37
|
-
Environments::Runner.new(args.
|
34
|
+
Environments::Runner.new(args.to_a).run_and_report
|
35
|
+
end
|
36
|
+
|
37
|
+
desc "Run all mini environment tests known to work with the current Ruby version"
|
38
|
+
task :all_compatible_envs do |t, args|
|
39
|
+
require File.expand_path(File.join(File.dirname(__FILE__), 'test', 'helpers', 'ruby_rails_mappings'))
|
40
|
+
rails_versions = rails_versions_for_ruby_version(RUBY_VERSION)
|
41
|
+
Rake::Task['test:env'].invoke(*rails_versions)
|
38
42
|
end
|
39
43
|
|
40
44
|
Rake::TestTask.new(:intentional_fail) do |t|
|
@@ -51,15 +55,14 @@ namespace :test do
|
|
51
55
|
|
52
56
|
# Note unit testing task is defined in lib/tasks/tests.rake to facilitate
|
53
57
|
# running them in a rails application environment.
|
54
|
-
|
55
58
|
end
|
56
59
|
|
57
60
|
desc 'Record build number and stage'
|
58
|
-
task :record_build, [
|
61
|
+
task :record_build, [:build_number, :stage] do |t, args|
|
59
62
|
build_string = args.build_number
|
60
63
|
build_string << ".#{args.stage}" unless args.stage.nil? || args.stage.empty?
|
61
64
|
|
62
|
-
gitsha = File.
|
65
|
+
gitsha = File.exist?(".git") ? `git rev-parse HEAD` : "Unknown"
|
63
66
|
gitsha.chomp!
|
64
67
|
|
65
68
|
File.open("lib/new_relic/build.rb", "w") do |f|
|
@@ -110,26 +113,23 @@ task :update_ca_bundle do |t|
|
|
110
113
|
end
|
111
114
|
|
112
115
|
namespace :cross_agent_tests do
|
113
|
-
|
114
|
-
|
116
|
+
CROSS_AGENT_TESTS_UPSTREAM_PATH = File.expand_path(File.join('..', 'cross_agent_tests')).freeze
|
117
|
+
CROSS_AGENT_TESTS_LOCAL_PATH = File.expand_path(File.join('test', 'fixtures', 'cross_agent_tests')).freeze
|
115
118
|
|
116
119
|
desc 'Pull latest changes from cross_agent_tests repo'
|
117
120
|
task :pull do
|
118
|
-
|
119
|
-
|
120
|
-
puts cmd
|
121
|
-
system(cmd)
|
121
|
+
command = " rsync -av --exclude .git #{CROSS_AGENT_TESTS_UPSTREAM_PATH}/ #{CROSS_AGENT_TESTS_LOCAL_PATH}/"
|
122
|
+
prompt_to_continue(command)
|
122
123
|
end
|
123
124
|
|
124
125
|
desc 'Copy changes from embedded cross_agent_tests to official repo working copy'
|
125
126
|
task :push do
|
126
|
-
|
127
|
-
|
128
|
-
puts cmd
|
129
|
-
system(cmd)
|
127
|
+
command = "rsync -av #{CROSS_AGENT_TESTS_LOCAL_PATH}/ #{CROSS_AGENT_TESTS_UPSTREAM_PATH}/"
|
128
|
+
prompt_to_continue(command, 'remote (agent spec repo)')
|
130
129
|
end
|
131
130
|
end
|
132
131
|
|
132
|
+
desc 'Start an interactive console session'
|
133
133
|
task :console do
|
134
134
|
require 'pry'
|
135
135
|
require 'newrelic_rpm'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# Third Party Notices
|
2
|
+
|
3
|
+
The New Relic Ruby agent may make use of source code from third party libraries
|
4
|
+
which carry their own copyright notices and license terms. Any such content will
|
5
|
+
be provided below.
|
6
|
+
|
7
|
+
In the event that a required notice is missing or incorrect, please notify us
|
8
|
+
by e-mailing [open-source@newrelic.com](mailto:open-source@newrelic.com).
|
9
|
+
|
10
|
+
For any licenses that require the disclosure of source
|
11
|
+
code, the source code can be found at:
|
12
|
+
[https://github.com/newrelic/newrelic-ruby-agent](https://github.com/newrelic/newrelic-ruby-agent).
|
13
|
+
|
14
|
+
|
15
|
+
## Current Notices and Terms
|
16
|
+
|
17
|
+
As of version 7.0 (released April 23, 2021), the New Relic Ruby agent does not
|
18
|
+
include any third party software with its distribution.
|
19
|
+
|
20
|
+
The Ruby agent team leverages a variety of open source third party software for
|
21
|
+
the development of the agent but not distributed with the agent. Some of these
|
22
|
+
software packages are referenced as development dependencies in the agent's
|
23
|
+
[newrelic_rpm.gemspec](newrelic_rpm.gemspec) file. We are grateful
|
24
|
+
to the maintainers and contributors for all of these packages.
|
25
|
+
|
26
|
+
For versions older than 7.0, please consult the `THIRD_PARTY_NOTICES.md`
|
27
|
+
document distributed with the agent. Any version of the agent not containing
|
28
|
+
that document are not thought to include any third party software.
|
data/Thorfile
ADDED
data/bin/newrelic
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
# executes one of the commands in the new_relic/commands directory
|
3
4
|
# pass the name of the command as an argument
|
4
5
|
|
5
|
-
$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..','lib'))
|
6
|
+
$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
6
7
|
require 'new_relic/cli/command'
|
7
8
|
begin
|
8
9
|
NewRelic::Cli::Command.run
|
9
10
|
rescue NewRelic::Cli::Command::CommandFailure => failure
|
10
11
|
STDERR.puts failure.message
|
11
12
|
STDERR.puts failure.options if failure.options
|
12
|
-
exit
|
13
|
+
exit(1)
|
13
14
|
end
|
data/bin/newrelic_cmd
CHANGED
data/bin/nrdebug
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
# encoding: utf-8
|
4
3
|
# This file is distributed under New Relic's license terms.
|
5
|
-
# See https://github.com/newrelic/
|
4
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
5
|
+
# frozen_string_literal: true
|
6
6
|
|
7
7
|
require 'tempfile'
|
8
8
|
require 'rbconfig'
|
9
9
|
|
10
|
-
def fail(msg, opts={})
|
10
|
+
def fail(msg, opts = {})
|
11
11
|
$stderr.puts(msg)
|
12
12
|
usage() if opts[:usage]
|
13
13
|
exit(-1)
|
@@ -84,7 +84,7 @@ class ProcessDataProvider
|
|
84
84
|
|
85
85
|
def self.for_process(pid)
|
86
86
|
case RbConfig::CONFIG['target_os']
|
87
|
-
when /linux/
|
87
|
+
when /linux/ then LinuxProcessDataProvider.new(pid)
|
88
88
|
when /darwin/ then DarwinProcessDataProvider.new(pid)
|
89
89
|
end
|
90
90
|
end
|
@@ -96,11 +96,11 @@ class LinuxProcessDataProvider < ProcessDataProvider
|
|
96
96
|
end
|
97
97
|
|
98
98
|
def procline
|
99
|
-
File.read(proc_path('cmdline')).
|
99
|
+
File.read(proc_path('cmdline')).tr("\000", " ")
|
100
100
|
end
|
101
101
|
|
102
102
|
def environment
|
103
|
-
File.read(proc_path('environ')).
|
103
|
+
File.read(proc_path('environ')).tr("\000", "\n")
|
104
104
|
end
|
105
105
|
end
|
106
106
|
|
@@ -133,8 +133,29 @@ class RubyProcess
|
|
133
133
|
backtrace_file = Tempfile.new('nrdebug_ruby_bt')
|
134
134
|
File.chmod(0666, backtrace_file.path)
|
135
135
|
|
136
|
-
|
137
|
-
|
136
|
+
body = gdb_script_body(backtrace_file)
|
137
|
+
|
138
|
+
script_file = write_script_file(body)
|
139
|
+
|
140
|
+
gdb_stderr = Tempfile.new('nrdebug_gdb_stderr')
|
141
|
+
|
142
|
+
gdb_cmd = "gdb -batch -x #{script_file.path} 2>#{gdb_stderr.path}"
|
143
|
+
gdb_output = ShellWrapper.execute(gdb_cmd)
|
144
|
+
ruby_backtrace = File.read(backtrace_file.path)
|
145
|
+
|
146
|
+
script_file.close!
|
147
|
+
backtrace_file.close!
|
148
|
+
gdb_stderr.close!
|
149
|
+
|
150
|
+
[gdb_output, ruby_backtrace]
|
151
|
+
end
|
152
|
+
|
153
|
+
private
|
154
|
+
|
155
|
+
def gdb_script_body(backtrace_file)
|
156
|
+
backtrace_gathering_code = 'Thread.list.each { |t| bt = t.backtrace rescue nil; ' \
|
157
|
+
'puts \"#{t.inspect}\n#{bt && bt.join(\"\n\")}\n\n\" }'
|
158
|
+
<<-END
|
138
159
|
attach #{pid}
|
139
160
|
t a a bt
|
140
161
|
call (void)close(1)
|
@@ -147,30 +168,21 @@ class RubyProcess
|
|
147
168
|
call (void)fflush(0)
|
148
169
|
quit
|
149
170
|
END
|
150
|
-
|
171
|
+
end
|
151
172
|
|
173
|
+
def write_script_file(body)
|
174
|
+
Logger.log("Using gdb script:\n#{body}")
|
152
175
|
script_file = Tempfile.new('nrdebug_gdb_script')
|
153
|
-
script_file.write(
|
176
|
+
script_file.write(body)
|
154
177
|
script_file.close
|
155
|
-
|
156
|
-
gdb_stderr = Tempfile.new('nrdebug_gdb_stderr')
|
157
|
-
|
158
|
-
gdb_cmd = "gdb -batch -x #{script_file.path} 2>#{gdb_stderr.path}"
|
159
|
-
gdb_output = ShellWrapper.execute(gdb_cmd)
|
160
|
-
ruby_backtrace = File.read(backtrace_file.path)
|
161
|
-
|
162
|
-
script_file.close!
|
163
|
-
backtrace_file.close!
|
164
|
-
gdb_stderr.close!
|
165
|
-
|
166
|
-
[gdb_output, ruby_backtrace]
|
178
|
+
script_file
|
167
179
|
end
|
168
180
|
end
|
169
181
|
|
170
182
|
class ProcessReport
|
171
183
|
attr_reader :target, :path
|
172
184
|
|
173
|
-
def initialize(target, path=nil)
|
185
|
+
def initialize(target, path = nil)
|
174
186
|
@target = target
|
175
187
|
@path = path
|
176
188
|
end
|
@@ -178,14 +190,14 @@ class ProcessReport
|
|
178
190
|
def open
|
179
191
|
if @path
|
180
192
|
File.open(@path, "w") do |f|
|
181
|
-
yield
|
193
|
+
yield(f)
|
182
194
|
end
|
183
195
|
else
|
184
|
-
yield
|
196
|
+
yield($stdout)
|
185
197
|
end
|
186
198
|
end
|
187
199
|
|
188
|
-
def section(f, name=nil)
|
200
|
+
def section(f, name = nil)
|
189
201
|
content = begin
|
190
202
|
yield
|
191
203
|
rescue StandardError => e
|
@@ -200,50 +212,59 @@ class ProcessReport
|
|
200
212
|
|
201
213
|
def generate
|
202
214
|
open do |f|
|
203
|
-
|
204
|
-
section(f, "PID") { @target.pid }
|
205
|
-
section(f, "Command") { @target.procline }
|
206
|
-
section(f, "RSS") { @target.rss }
|
207
|
-
section(f, "CPU") { @target.cpu }
|
208
|
-
section(f, "Parent PID") { @target.ppid }
|
209
|
-
section(f, "OS") { ShellWrapper.execute('uname -a') }
|
210
|
-
section(f, "Environment") { @target.environment }
|
215
|
+
add_environment_sections(f)
|
211
216
|
|
212
217
|
section(f) do
|
213
218
|
c_backtraces, ruby_backtraces = @target.gather_backtraces
|
214
|
-
if c_backtraces
|
219
|
+
if c_backtraces =~ /could not attach/i
|
215
220
|
fail("Failed to attach to target process. Please try again with sudo.")
|
216
221
|
end
|
217
|
-
|
222
|
+
|
223
|
+
section(f, "C Backtraces") { c_backtraces }
|
218
224
|
section(f, "Ruby Backtrace(s)") { ruby_backtraces }
|
219
225
|
end
|
220
226
|
|
221
227
|
section(f, "Open files") { @target.open_files }
|
222
228
|
section(f, "Log") do
|
223
|
-
commands = Logger.messages.map { |(_,msg)| msg }
|
229
|
+
commands = Logger.messages.map { |(_, msg)| msg }
|
224
230
|
commands.join("\n")
|
225
231
|
end
|
226
232
|
end
|
227
233
|
end
|
234
|
+
|
235
|
+
private
|
236
|
+
|
237
|
+
def add_environment_sections(handle)
|
238
|
+
section(handle, "Time") { Time.now }
|
239
|
+
section(handle, "PID") { @target.pid }
|
240
|
+
section(handle, "Command") { @target.procline }
|
241
|
+
section(handle, "RSS") { @target.rss }
|
242
|
+
section(handle, "CPU") { @target.cpu }
|
243
|
+
section(handle, "Parent PID") { @target.ppid }
|
244
|
+
section(handle, "OS") { ShellWrapper.execute('uname -a') }
|
245
|
+
section(handle, "Environment") { @target.environment }
|
246
|
+
end
|
228
247
|
end
|
229
248
|
|
230
249
|
def prompt_for_confirmation(target_pid, target_cmd)
|
231
|
-
puts
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
250
|
+
puts <<-PROMPT
|
251
|
+
Are you sure you want to attach to PID #{target_pid} ('#{target_cmd}')}?
|
252
|
+
|
253
|
+
************************** !WARNING! **************************
|
254
|
+
Extracting debug information from this process may cause it to CRASH OR HANG.
|
255
|
+
|
256
|
+
It is highly recommended that you only run this script against processes that
|
257
|
+
are already unresponsive.
|
258
|
+
|
259
|
+
Additionally, the output may contain sensitive information from the program's
|
260
|
+
command line arguments, environment, or open file list. Please examine the
|
261
|
+
output before sharing it.
|
262
|
+
************************** !WARNING! **************************
|
263
|
+
|
264
|
+
To continue, type 'continue':
|
265
|
+
PROMPT
|
266
|
+
|
267
|
+
until $stdin.gets.strip == 'continue'
|
247
268
|
puts "Please type 'continue' to continue, or ctrl-c to abort."
|
248
269
|
end
|
249
270
|
end
|
@@ -256,11 +277,13 @@ fail("Could not find gdb, please ensure it is installed and in your PATH") if gd
|
|
256
277
|
|
257
278
|
target = RubyProcess.new(target_pid)
|
258
279
|
if !target.attachable?
|
259
|
-
fail("You do not appear to have permissions to attach to the target process.\nPlease check the process owner
|
280
|
+
fail("You do not appear to have permissions to attach to the target process.\nPlease check the process owner " \
|
281
|
+
'and try again with sudo if necessary')
|
260
282
|
end
|
261
283
|
if !target.alive?
|
262
284
|
fail("Could not find process with PID #{target_pid}")
|
263
285
|
end
|
286
|
+
|
264
287
|
target_cmd = target.procline
|
265
288
|
|
266
289
|
prompt_for_confirmation(target_pid, target_cmd)
|