newrelic_rpm 5.7.0.350 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +15 -1
- data/.rubocop.yml +1919 -0
- data/.rubocop_todo.yml +100 -0
- data/.simplecov +15 -0
- data/.snyk +11 -0
- data/.yardopts +2 -0
- data/Brewfile +12 -0
- data/CHANGELOG.md +4056 -2339
- data/CONTRIBUTING.md +132 -19
- data/DOCKER.md +167 -0
- data/Dockerfile +10 -0
- data/Gemfile +5 -2
- data/Guardfile +22 -4
- data/LICENSE +202 -38
- data/README.md +87 -87
- data/Rakefile +27 -27
- data/THIRD_PARTY_NOTICES.md +28 -0
- data/Thorfile +5 -0
- data/bin/newrelic +3 -2
- data/bin/newrelic_cmd +1 -0
- data/bin/nrdebug +77 -54
- data/config.dot +5 -5
- data/docker-compose.yml +107 -0
- data/init.rb +5 -7
- data/install.rb +3 -3
- data/lefthook.yml +9 -0
- data/lib/new_relic/agent/adaptive_sampler.rb +14 -10
- data/lib/new_relic/agent/agent.rb +125 -969
- data/lib/new_relic/agent/agent_helpers/connect.rb +227 -0
- data/lib/new_relic/agent/agent_helpers/harvest.rb +153 -0
- data/lib/new_relic/agent/agent_helpers/shutdown.rb +72 -0
- data/lib/new_relic/agent/agent_helpers/special_startup.rb +74 -0
- data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +167 -0
- data/lib/new_relic/agent/agent_helpers/startup.rb +202 -0
- data/lib/new_relic/agent/agent_helpers/transmit.rb +76 -0
- data/lib/new_relic/agent/agent_logger.rb +26 -18
- data/lib/new_relic/agent/attribute_filter.rb +69 -52
- data/lib/new_relic/agent/attribute_processing.rb +8 -8
- data/lib/new_relic/agent/attributes.rb +153 -0
- data/lib/new_relic/agent/audit_logger.rb +19 -4
- data/lib/new_relic/agent/autostart.rb +34 -28
- data/lib/new_relic/agent/chained_call.rb +2 -2
- data/lib/new_relic/agent/commands/agent_command.rb +4 -4
- data/lib/new_relic/agent/commands/agent_command_router.rb +15 -33
- data/lib/new_relic/agent/commands/thread_profiler_session.rb +13 -11
- data/lib/new_relic/agent/configuration/default_source.rb +1480 -1053
- data/lib/new_relic/agent/configuration/dotted_hash.rb +7 -6
- data/lib/new_relic/agent/configuration/environment_source.rb +15 -11
- data/lib/new_relic/agent/configuration/event_harvest_config.rb +68 -0
- data/lib/new_relic/agent/configuration/high_security_source.rb +9 -9
- data/lib/new_relic/agent/configuration/manager.rb +96 -79
- data/lib/new_relic/agent/configuration/manual_source.rb +2 -2
- data/lib/new_relic/agent/configuration/mask_defaults.rb +4 -4
- data/lib/new_relic/agent/configuration/security_policy_source.rb +83 -86
- data/lib/new_relic/agent/configuration/server_source.rb +49 -12
- data/lib/new_relic/agent/configuration/yaml_source.rb +42 -13
- data/lib/new_relic/agent/configuration.rb +2 -2
- data/lib/new_relic/agent/connect/request_builder.rb +61 -0
- data/lib/new_relic/agent/connect/response_handler.rb +58 -0
- data/lib/new_relic/agent/custom_event_aggregator.rb +15 -15
- data/lib/new_relic/agent/database/explain_plan_helpers.rb +5 -6
- data/lib/new_relic/agent/database/obfuscation_helpers.rb +16 -15
- data/lib/new_relic/agent/database/obfuscator.rb +3 -3
- data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +4 -4
- data/lib/new_relic/agent/database.rb +44 -53
- data/lib/new_relic/agent/database_adapter.rb +35 -0
- data/lib/new_relic/agent/datastores/metric_helper.rb +18 -20
- data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +9 -8
- data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +7 -11
- data/lib/new_relic/agent/datastores/mongo.rb +7 -12
- data/lib/new_relic/agent/datastores/nosql_obfuscator.rb +41 -0
- data/lib/new_relic/agent/datastores/redis.rb +6 -12
- data/lib/new_relic/agent/datastores.rb +19 -23
- data/lib/new_relic/agent/deprecator.rb +2 -2
- data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +13 -12
- data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +87 -66
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +84 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +163 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +38 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context.rb +245 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +127 -0
- data/lib/new_relic/agent/distributed_tracing.rb +113 -32
- data/lib/new_relic/agent/encoding_normalizer.rb +5 -3
- data/lib/new_relic/agent/error_collector.rb +99 -63
- data/lib/new_relic/agent/error_event_aggregator.rb +10 -8
- data/lib/new_relic/agent/error_filter.rb +174 -0
- data/lib/new_relic/agent/error_trace_aggregator.rb +6 -4
- data/lib/new_relic/agent/event_aggregator.rb +43 -48
- data/lib/new_relic/agent/event_buffer.rb +8 -9
- data/lib/new_relic/agent/event_listener.rb +2 -3
- data/lib/new_relic/agent/event_loop.rb +27 -25
- data/lib/new_relic/agent/external.rb +20 -51
- data/lib/new_relic/agent/guid_generator.rb +30 -0
- data/lib/new_relic/agent/harvester.rb +5 -6
- data/lib/new_relic/agent/heap.rb +8 -10
- data/lib/new_relic/agent/hostname.rb +26 -5
- data/lib/new_relic/agent/http_clients/abstract.rb +81 -0
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +26 -26
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +31 -17
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +18 -23
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +12 -15
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +24 -8
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +9 -12
- data/lib/new_relic/agent/http_clients/uri_util.rb +12 -13
- data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +22 -52
- data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +39 -0
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +59 -72
- data/lib/new_relic/agent/instrumentation/action_dispatch.rb +31 -0
- data/lib/new_relic/agent/instrumentation/action_dispatch_subscriber.rb +64 -0
- data/lib/new_relic/agent/instrumentation/action_mailbox.rb +30 -0
- data/lib/new_relic/agent/instrumentation/action_mailbox_subscriber.rb +33 -0
- data/lib/new_relic/agent/instrumentation/action_mailer.rb +30 -0
- data/lib/new_relic/agent/instrumentation/action_mailer_subscriber.rb +85 -0
- data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +86 -62
- data/lib/new_relic/agent/instrumentation/active_job.rb +38 -19
- data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +21 -7
- data/lib/new_relic/agent/instrumentation/active_record.rb +95 -46
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +82 -61
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +155 -0
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +36 -12
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +69 -64
- data/lib/new_relic/agent/instrumentation/active_storage.rb +8 -4
- data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +11 -32
- data/lib/new_relic/agent/instrumentation/active_support.rb +27 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/chain.rb +23 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +20 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +12 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger.rb +24 -0
- data/lib/new_relic/agent/instrumentation/active_support_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +150 -0
- data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/bunny.rb +14 -134
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/chain.rb +36 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/instrumentation.rb +21 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/prepend.rb +27 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby.rb +31 -0
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +77 -61
- data/lib/new_relic/agent/instrumentation/curb/chain.rb +91 -0
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +221 -0
- data/lib/new_relic/agent/instrumentation/curb/prepend.rb +61 -0
- data/lib/new_relic/agent/instrumentation/curb.rb +15 -187
- data/lib/new_relic/agent/instrumentation/custom_events.rb +12 -0
- data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +37 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +35 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +48 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +30 -52
- data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +29 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +66 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch.rb +31 -0
- data/lib/new_relic/agent/instrumentation/excon/middleware.rb +8 -7
- data/lib/new_relic/agent/instrumentation/excon.rb +29 -31
- data/lib/new_relic/agent/instrumentation/fiber/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +24 -0
- data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +18 -0
- data/lib/new_relic/agent/instrumentation/fiber.rb +25 -0
- data/lib/new_relic/agent/instrumentation/grape/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
- data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
- data/lib/new_relic/agent/instrumentation/grape.rb +16 -121
- data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +97 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +89 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +111 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +30 -0
- data/lib/new_relic/agent/instrumentation/grpc/helper.rb +32 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/chain.rb +69 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +134 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/rpc_desc_prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/rpc_server_prepend.rb +26 -0
- data/lib/new_relic/agent/instrumentation/grpc_client.rb +23 -0
- data/lib/new_relic/agent/instrumentation/grpc_server.rb +25 -0
- data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +37 -0
- data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httpclient.rb +12 -32
- data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
- data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
- data/lib/new_relic/agent/instrumentation/ignore_actions.rb +5 -6
- data/lib/new_relic/agent/instrumentation/logger/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +66 -0
- data/lib/new_relic/agent/instrumentation/logger/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/logger.rb +26 -0
- data/lib/new_relic/agent/instrumentation/memcache/chain.rb +15 -0
- data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +58 -125
- data/lib/new_relic/agent/instrumentation/memcache/helper.rb +59 -0
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +90 -0
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +101 -0
- data/lib/new_relic/agent/instrumentation/memcache.rb +57 -71
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +15 -14
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +21 -14
- data/lib/new_relic/agent/instrumentation/mongo.rb +7 -132
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +49 -13
- data/lib/new_relic/agent/instrumentation/net_http/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +40 -0
- data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
- data/lib/new_relic/agent/instrumentation/net_http.rb +44 -0
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +142 -0
- data/lib/new_relic/agent/instrumentation/padrino/chain.rb +38 -0
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +28 -0
- data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
- data/lib/new_relic/agent/instrumentation/padrino.rb +22 -58
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +7 -7
- data/lib/new_relic/agent/instrumentation/queue_time.rb +9 -10
- data/lib/new_relic/agent/instrumentation/rack/chain.rb +66 -0
- data/lib/new_relic/agent/instrumentation/rack/helpers.rb +33 -0
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +75 -0
- data/lib/new_relic/agent/instrumentation/rack/prepend.rb +43 -0
- data/lib/new_relic/agent/instrumentation/rack.rb +33 -141
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +19 -55
- data/lib/new_relic/agent/instrumentation/rails_middleware.rb +5 -5
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +36 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +45 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +30 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/custom_events.rb +30 -0
- data/lib/new_relic/agent/instrumentation/rake/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +142 -0
- data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/rake.rb +18 -159
- data/lib/new_relic/agent/instrumentation/redis/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/redis/constants.rb +17 -0
- data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +93 -0
- data/lib/new_relic/agent/instrumentation/redis/middleware.rb +16 -0
- data/lib/new_relic/agent/instrumentation/redis/prepend.rb +29 -0
- data/lib/new_relic/agent/instrumentation/redis.rb +20 -103
- data/lib/new_relic/agent/instrumentation/resque/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/resque/helper.rb +19 -0
- data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +34 -0
- data/lib/new_relic/agent/instrumentation/resque/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/resque.rb +33 -41
- data/lib/new_relic/agent/instrumentation/sequel.rb +17 -20
- data/lib/new_relic/agent/instrumentation/sequel_helper.rb +3 -3
- data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +20 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +30 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +37 -0
- data/lib/new_relic/agent/instrumentation/sidekiq.rb +29 -46
- data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +31 -37
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +125 -0
- data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +3 -3
- data/lib/new_relic/agent/instrumentation/sinatra.rb +35 -165
- data/lib/new_relic/agent/instrumentation/thread/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +28 -0
- data/lib/new_relic/agent/instrumentation/thread/prepend.rb +22 -0
- data/lib/new_relic/agent/instrumentation/thread.rb +20 -0
- data/lib/new_relic/agent/instrumentation/tilt/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +41 -0
- data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/tilt.rb +25 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +80 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +14 -76
- data/lib/new_relic/agent/instrumentation.rb +2 -2
- data/lib/new_relic/agent/internal_agent_error.rb +3 -3
- data/lib/new_relic/agent/javascript_instrumentor.rb +51 -45
- data/lib/new_relic/agent/linking_metadata.rb +44 -0
- data/lib/new_relic/agent/local_log_decorator.rb +37 -0
- data/lib/new_relic/agent/log_event_aggregator.rb +235 -0
- data/lib/new_relic/agent/log_once.rb +2 -2
- data/lib/new_relic/agent/log_priority.rb +20 -0
- data/lib/new_relic/agent/logging.rb +142 -0
- data/lib/new_relic/agent/memory_logger.rb +3 -3
- data/lib/new_relic/agent/messaging.rb +81 -164
- data/lib/new_relic/agent/method_tracer.rb +152 -145
- data/lib/new_relic/agent/method_tracer_helpers.rb +90 -13
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +117 -0
- data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +28 -0
- data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +5 -6
- data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +9 -15
- data/lib/new_relic/agent/monitors.rb +26 -0
- data/lib/new_relic/agent/new_relic_service/encoders.rb +7 -7
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +6 -7
- data/lib/new_relic/agent/new_relic_service/marshaller.rb +8 -29
- data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +5 -5
- data/lib/new_relic/agent/new_relic_service.rb +282 -166
- data/lib/new_relic/agent/noticeable_error.rb +19 -0
- data/lib/new_relic/agent/null_logger.rb +8 -4
- data/lib/new_relic/agent/obfuscator.rb +9 -11
- data/lib/new_relic/agent/parameter_filtering.rb +35 -8
- data/lib/new_relic/agent/payload_metric_mapping.rb +10 -11
- data/lib/new_relic/agent/pipe_channel_manager.rb +28 -18
- data/lib/new_relic/agent/pipe_service.rb +9 -6
- data/lib/new_relic/agent/prepend_supportability.rb +3 -3
- data/lib/new_relic/agent/priority_sampled_buffer.rb +16 -14
- data/lib/new_relic/agent/range_extensions.rb +9 -29
- data/lib/new_relic/agent/rules_engine/replacement_rule.rb +12 -12
- data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +13 -14
- data/lib/new_relic/agent/rules_engine.rb +6 -5
- data/lib/new_relic/agent/sampler.rb +4 -5
- data/lib/new_relic/agent/sampler_collection.rb +4 -5
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +4 -3
- data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +14 -11
- data/lib/new_relic/agent/samplers/memory_sampler.rb +26 -15
- data/lib/new_relic/agent/samplers/object_sampler.rb +2 -2
- data/lib/new_relic/agent/samplers/vm_sampler.rb +22 -20
- data/lib/new_relic/agent/span_event_aggregator.rb +14 -16
- data/lib/new_relic/agent/span_event_primitive.rb +118 -58
- data/lib/new_relic/agent/sql_sampler.rb +25 -25
- data/lib/new_relic/agent/stats.rb +79 -42
- data/lib/new_relic/agent/stats_engine/gc_profiler.rb +11 -13
- data/lib/new_relic/agent/stats_engine/stats_hash.rb +13 -14
- data/lib/new_relic/agent/stats_engine.rb +11 -11
- data/lib/new_relic/agent/synthetics_event_aggregator.rb +8 -9
- data/lib/new_relic/agent/system_info.rb +100 -66
- data/lib/new_relic/agent/threading/agent_thread.rb +20 -16
- data/lib/new_relic/agent/threading/backtrace_node.rb +13 -14
- data/lib/new_relic/agent/threading/backtrace_service.rb +18 -18
- data/lib/new_relic/agent/threading/thread_profile.rb +31 -45
- data/lib/new_relic/agent/timestamp_sampled_buffer.rb +2 -2
- data/lib/new_relic/agent/tracer.rb +513 -0
- data/lib/new_relic/agent/transaction/abstract_segment.rb +131 -41
- data/lib/new_relic/agent/transaction/datastore_segment.rb +22 -18
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +184 -0
- data/lib/new_relic/agent/transaction/distributed_tracing.rb +72 -163
- data/lib/new_relic/agent/transaction/external_request_segment.rb +66 -63
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +34 -46
- data/lib/new_relic/agent/transaction/request_attributes.rb +36 -36
- data/lib/new_relic/agent/transaction/segment.rb +46 -10
- data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +2 -4
- data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +2 -2
- data/lib/new_relic/agent/transaction/trace.rb +21 -24
- data/lib/new_relic/agent/transaction/trace_builder.rb +11 -12
- data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
- data/lib/new_relic/agent/transaction/trace_node.rb +31 -28
- data/lib/new_relic/agent/transaction/tracing.rb +15 -111
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +6 -6
- data/lib/new_relic/agent/transaction.rb +252 -259
- data/lib/new_relic/agent/transaction_error_primitive.rb +34 -37
- data/lib/new_relic/agent/transaction_event_aggregator.rb +13 -13
- data/lib/new_relic/agent/transaction_event_primitive.rb +44 -56
- data/lib/new_relic/agent/transaction_event_recorder.rb +17 -16
- data/lib/new_relic/agent/transaction_metrics.rb +11 -10
- data/lib/new_relic/agent/transaction_sampler.rb +7 -12
- data/lib/new_relic/agent/transaction_time_aggregator.rb +41 -26
- data/lib/new_relic/agent/utilization/aws.rb +34 -4
- data/lib/new_relic/agent/utilization/azure.rb +4 -4
- data/lib/new_relic/agent/utilization/gcp.rb +8 -8
- data/lib/new_relic/agent/utilization/pcf.rb +6 -5
- data/lib/new_relic/agent/utilization/vendor.rb +44 -29
- data/lib/new_relic/agent/utilization_data.rb +43 -6
- data/lib/new_relic/agent/vm/jruby_vm.rb +2 -2
- data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +3 -3
- data/lib/new_relic/agent/vm/mri_vm.rb +46 -19
- data/lib/new_relic/agent/vm/snapshot.rb +6 -6
- data/lib/new_relic/agent/vm.rb +2 -2
- data/lib/new_relic/agent/worker_loop.rb +11 -13
- data/lib/new_relic/agent.rb +151 -79
- data/lib/new_relic/cli/command.rb +21 -23
- data/lib/new_relic/cli/commands/deployments.rb +94 -45
- data/lib/new_relic/cli/commands/install.rb +24 -26
- data/lib/new_relic/coerce.rb +42 -15
- data/lib/new_relic/collection_helper.rb +51 -49
- data/lib/new_relic/constants.rb +39 -0
- data/lib/new_relic/control/class_methods.rb +11 -5
- data/lib/new_relic/control/frameworks/external.rb +3 -3
- data/lib/new_relic/control/frameworks/rails.rb +24 -18
- data/lib/new_relic/control/frameworks/rails3.rb +4 -5
- data/lib/new_relic/control/frameworks/rails4.rb +2 -2
- data/lib/new_relic/control/frameworks/rails_notifications.rb +14 -0
- data/lib/new_relic/control/frameworks/ruby.rb +4 -4
- data/lib/new_relic/control/frameworks/sinatra.rb +8 -2
- data/lib/new_relic/control/frameworks.rb +2 -2
- data/lib/new_relic/control/instance_methods.rb +33 -42
- data/lib/new_relic/control/instrumentation.rb +40 -12
- data/lib/new_relic/control/private_instance_methods.rb +48 -0
- data/lib/new_relic/control/server_methods.rb +4 -5
- data/lib/new_relic/control.rb +2 -3
- data/lib/new_relic/delayed_job_injection.rb +2 -2
- data/lib/new_relic/dependency_detection.rb +129 -18
- data/lib/new_relic/environment_report.rb +41 -35
- data/lib/new_relic/helper.rb +49 -8
- data/lib/new_relic/language_support.rb +30 -6
- data/lib/new_relic/latest_changes.rb +9 -8
- data/lib/new_relic/local_environment.rb +23 -27
- data/lib/new_relic/metric_data.rb +32 -27
- data/lib/new_relic/metric_spec.rb +9 -7
- data/lib/new_relic/noticed_error.rb +46 -33
- data/lib/new_relic/rack/agent_hooks.rb +2 -2
- data/lib/new_relic/rack/agent_middleware.rb +7 -5
- data/lib/new_relic/rack/browser_monitoring.rb +134 -117
- data/lib/new_relic/rack.rb +2 -2
- data/lib/new_relic/recipes/capistrano3.rb +4 -62
- data/lib/new_relic/recipes/capistrano_legacy.rb +24 -27
- data/lib/new_relic/recipes/helpers/send_deployment.rb +70 -0
- data/lib/new_relic/recipes.rb +2 -2
- data/lib/new_relic/supportability_helper.rb +21 -7
- data/lib/new_relic/traced_thread.rb +39 -0
- data/lib/new_relic/version.rb +7 -18
- data/lib/newrelic_rpm.rb +20 -33
- data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +16 -19
- data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +9 -15
- data/lib/tasks/all.rb +4 -4
- data/lib/tasks/config.rake +22 -118
- data/lib/tasks/coverage_report.rake +28 -0
- data/lib/tasks/helpers/config.html.erb +21 -0
- data/lib/tasks/helpers/format.rb +123 -0
- data/lib/tasks/helpers/matches.rb +12 -0
- data/lib/tasks/helpers/prompt.rb +24 -0
- data/lib/tasks/helpers/removers.rb +33 -0
- data/lib/tasks/install.rake +4 -0
- data/lib/tasks/instrumentation_generator/README.md +63 -0
- data/lib/tasks/instrumentation_generator/TODO.md +33 -0
- data/lib/tasks/instrumentation_generator/instrumentation.thor +121 -0
- data/lib/tasks/instrumentation_generator/templates/Envfile.tt +9 -0
- data/lib/tasks/instrumentation_generator/templates/chain.tt +22 -0
- data/lib/tasks/instrumentation_generator/templates/chain_method.tt +8 -0
- data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +29 -0
- data/lib/tasks/instrumentation_generator/templates/instrumentation.tt +13 -0
- data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +3 -0
- data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +19 -0
- data/lib/tasks/instrumentation_generator/templates/prepend.tt +13 -0
- data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +3 -0
- data/lib/tasks/instrumentation_generator/templates/test.tt +15 -0
- data/lib/tasks/multiverse.rake +4 -0
- data/lib/tasks/multiverse.rb +12 -5
- data/lib/tasks/newrelic.rb +2 -2
- data/lib/tasks/tests.rake +14 -14
- data/newrelic.yml +672 -3
- data/newrelic_rpm.gemspec +40 -31
- data/recipes/newrelic.rb +3 -3
- data/test/agent_helper.rb +419 -98
- metadata +238 -127
- data/.travis.yml +0 -228
- data/bin/mongrel_rpm +0 -33
- data/cert/cacert.pem +0 -1177
- data/lib/new_relic/agent/commands/xray_session.rb +0 -55
- data/lib/new_relic/agent/commands/xray_session_collection.rb +0 -161
- data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
- data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +0 -44
- data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +0 -53
- data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -41
- data/lib/new_relic/agent/distributed_trace_payload.rb +0 -246
- data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
- data/lib/new_relic/agent/instrumentation/active_record_4.rb +0 -42
- data/lib/new_relic/agent/instrumentation/active_record_5.rb +0 -41
- data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -74
- data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -25
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -202
- data/lib/new_relic/agent/instrumentation/evented_subscriber.rb +0 -104
- data/lib/new_relic/agent/instrumentation/excon/connection.rb +0 -46
- data/lib/new_relic/agent/instrumentation/http.rb +0 -46
- data/lib/new_relic/agent/instrumentation/merb/controller.rb +0 -44
- data/lib/new_relic/agent/instrumentation/merb/errors.rb +0 -33
- data/lib/new_relic/agent/instrumentation/net.rb +0 -50
- data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +0 -125
- data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +0 -46
- data/lib/new_relic/agent/instrumentation/rails4/action_controller.rb +0 -32
- data/lib/new_relic/agent/instrumentation/rails4/action_view.rb +0 -27
- data/lib/new_relic/agent/instrumentation/rails5/action_cable.rb +0 -36
- data/lib/new_relic/agent/instrumentation/rails5/action_controller.rb +0 -33
- data/lib/new_relic/agent/instrumentation/rails5/action_view.rb +0 -27
- data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +0 -26
- data/lib/new_relic/agent/instrumentation/sunspot.rb +0 -33
- data/lib/new_relic/agent/supported_versions.rb +0 -275
- data/lib/new_relic/agent/transaction/attributes.rb +0 -154
- data/lib/new_relic/agent/transaction/xray_sample_buffer.rb +0 -64
- data/lib/new_relic/agent/transaction_state.rb +0 -186
- data/lib/new_relic/build.rb +0 -2
- data/lib/new_relic/control/frameworks/merb.rb +0 -29
- data/lib/new_relic/control/frameworks/rails5.rb +0 -14
- data/lib/new_relic/metrics.rb +0 -13
- data/lib/tasks/config.html.erb +0 -32
- data/lib/tasks/versions.html.erb +0 -28
- data/lib/tasks/versions.postface.html +0 -8
- data/lib/tasks/versions.preface.html +0 -9
- data/lib/tasks/versions.rake +0 -65
- data/lib/tasks/versions.txt.erb +0 -14
- /data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
@@ -1,6 +1,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
|
class Control
|
@@ -9,7 +9,7 @@ module NewRelic
|
|
9
9
|
module ClassMethods
|
10
10
|
# Access the Control singleton, lazy initialized. Default will instantiate a new
|
11
11
|
# instance or pass false to defer
|
12
|
-
def instance(create=true)
|
12
|
+
def instance(create = true)
|
13
13
|
@instance ||= create && new_instance
|
14
14
|
end
|
15
15
|
|
@@ -35,7 +35,7 @@ module NewRelic
|
|
35
35
|
|
36
36
|
# nb this does not 'load test' the framework, it loads the 'test framework'
|
37
37
|
def load_test_framework
|
38
|
-
config = File.expand_path(File.join('..','..','..','..', "test","config","newrelic.yml"), __FILE__)
|
38
|
+
config = File.expand_path(File.join('..', '..', '..', '..', "test", "config", "newrelic.yml"), __FILE__)
|
39
39
|
require "config/test_control"
|
40
40
|
NewRelic::Control::Frameworks::Test.new(local_env, config)
|
41
41
|
end
|
@@ -49,13 +49,19 @@ module NewRelic
|
|
49
49
|
# maybe it is already loaded by some external system
|
50
50
|
# i.e. rpm_contrib or user extensions?
|
51
51
|
end
|
52
|
-
NewRelic::Control::Frameworks.const_get(framework.to_s
|
52
|
+
NewRelic::Control::Frameworks.const_get(camelize(framework.to_s))
|
53
53
|
end
|
54
54
|
|
55
55
|
# The root directory for the plugin or gem
|
56
56
|
def newrelic_root
|
57
57
|
File.expand_path(File.join("..", "..", "..", ".."), __FILE__)
|
58
58
|
end
|
59
|
+
|
60
|
+
def camelize(snake_case_name)
|
61
|
+
snake_case_name.gsub(/(\_|^)[a-z]/) do |substring|
|
62
|
+
substring[-1].capitalize!
|
63
|
+
end
|
64
|
+
end
|
59
65
|
end
|
60
66
|
extend ClassMethods
|
61
67
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
require 'new_relic/control/frameworks/ruby'
|
6
6
|
module NewRelic
|
@@ -11,7 +11,7 @@ module NewRelic
|
|
11
11
|
# out specifically because in this context we are not monitoring
|
12
12
|
# the running process, but actually external things.
|
13
13
|
class External < NewRelic::Control::Frameworks::Ruby
|
14
|
-
def init_config(options={})
|
14
|
+
def init_config(options = {})
|
15
15
|
super
|
16
16
|
end
|
17
17
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
require 'new_relic/control/frameworks/ruby'
|
6
6
|
module NewRelic
|
@@ -10,9 +10,8 @@ module NewRelic
|
|
10
10
|
# Rails specific configuration, instrumentation, environment values,
|
11
11
|
# etc.
|
12
12
|
class Rails < NewRelic::Control::Frameworks::Ruby
|
13
|
-
|
14
13
|
def env
|
15
|
-
@env ||= (
|
14
|
+
@env ||= (ENV['NEW_RELIC_ENV'] || RAILS_ENV.dup)
|
16
15
|
end
|
17
16
|
|
18
17
|
# Rails can return an empty string from this method, causing
|
@@ -43,7 +42,7 @@ module NewRelic
|
|
43
42
|
# In versions of Rails prior to 2.0, the rails config was only available to
|
44
43
|
# the init.rb, so it had to be passed on from there. This is a best effort to
|
45
44
|
# find a config and use that.
|
46
|
-
def init_config(options={})
|
45
|
+
def init_config(options = {})
|
47
46
|
@config = options[:config]
|
48
47
|
# Install the dependency detection,
|
49
48
|
if rails_config && ::Rails.configuration.respond_to?(:after_initialize)
|
@@ -63,18 +62,21 @@ module NewRelic
|
|
63
62
|
end
|
64
63
|
rescue => e
|
65
64
|
::NewRelic::Agent.logger.error("Failure during init_config for Rails. Is Rails required in a non-Rails app? Set NEW_RELIC_FRAMEWORK=ruby to avoid this message.",
|
66
|
-
|
67
|
-
|
65
|
+
"The Ruby agent will continue running, but Rails-specific features may be missing.",
|
66
|
+
e)
|
68
67
|
end
|
69
68
|
|
70
69
|
def install_agent_hooks(config)
|
71
70
|
return if defined?(@agent_hooks_installed) && @agent_hooks_installed
|
71
|
+
|
72
72
|
@agent_hooks_installed = true
|
73
73
|
return if config.nil? || !config.respond_to?(:middleware)
|
74
|
+
|
74
75
|
begin
|
75
76
|
require 'new_relic/rack/agent_hooks'
|
76
77
|
return unless NewRelic::Rack::AgentHooks.needed?
|
77
|
-
|
78
|
+
|
79
|
+
config.middleware.use(NewRelic::Rack::AgentHooks)
|
78
80
|
::NewRelic::Agent.logger.debug("Installed New Relic Agent Hooks middleware")
|
79
81
|
rescue => e
|
80
82
|
::NewRelic::Agent.logger.warn("Error installing New Relic Agent Hooks middleware", e)
|
@@ -82,15 +84,19 @@ module NewRelic
|
|
82
84
|
end
|
83
85
|
|
84
86
|
def install_browser_monitoring(config)
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
87
|
+
@install_lock.synchronize do
|
88
|
+
return if defined?(@browser_monitoring_installed) && @browser_monitoring_installed
|
89
|
+
|
90
|
+
@browser_monitoring_installed = true
|
91
|
+
return if config.nil? || !config.respond_to?(:middleware) || !Agent.config[:'browser_monitoring.auto_instrument']
|
92
|
+
|
93
|
+
begin
|
94
|
+
require 'new_relic/rack/browser_monitoring'
|
95
|
+
config.middleware.use(NewRelic::Rack::BrowserMonitoring)
|
96
|
+
::NewRelic::Agent.logger.debug("Installed New Relic Browser Monitoring middleware")
|
97
|
+
rescue => e
|
98
|
+
::NewRelic::Agent.logger.warn("Error installing New Relic Browser Monitoring middleware", e)
|
99
|
+
end
|
94
100
|
end
|
95
101
|
end
|
96
102
|
|
@@ -101,7 +107,7 @@ module NewRelic
|
|
101
107
|
protected
|
102
108
|
|
103
109
|
def rails_vendor_root
|
104
|
-
File.join(root,'vendor','rails')
|
110
|
+
File.join(root, 'vendor', 'rails')
|
105
111
|
end
|
106
112
|
|
107
113
|
def install_shim
|
@@ -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/control/frameworks/rails'
|
6
6
|
|
@@ -13,9 +13,8 @@ module NewRelic
|
|
13
13
|
# NewRelic::Control::Frameworks::Rails class, where the two do
|
14
14
|
# not differ
|
15
15
|
class Rails3 < NewRelic::Control::Frameworks::Rails
|
16
|
-
|
17
16
|
def env
|
18
|
-
@env ||= (
|
17
|
+
@env ||= (ENV['NEW_RELIC_ENV'] || ::Rails.env.to_s)
|
19
18
|
end
|
20
19
|
|
21
20
|
def rails_root
|
@@ -23,7 +22,7 @@ module NewRelic
|
|
23
22
|
end
|
24
23
|
|
25
24
|
def vendor_root
|
26
|
-
@vendor_root ||= File.join(root,'vendor','rails')
|
25
|
+
@vendor_root ||= File.join(root, 'vendor', 'rails')
|
27
26
|
end
|
28
27
|
|
29
28
|
def version
|
@@ -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/control/frameworks/rails3'
|
6
6
|
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require 'new_relic/control/frameworks/rails4'
|
6
|
+
|
7
|
+
module NewRelic
|
8
|
+
class Control
|
9
|
+
module Frameworks
|
10
|
+
class RailsNotifications < NewRelic::Control::Frameworks::Rails4
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
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
|
class Control
|
@@ -9,14 +9,14 @@ module NewRelic
|
|
9
9
|
class Ruby < NewRelic::Control
|
10
10
|
def env
|
11
11
|
@env ||= ENV['NEW_RELIC_ENV'] || ENV['RUBY_ENV'] || ENV['RAILS_ENV'] ||
|
12
|
-
|
12
|
+
ENV['APP_ENV'] || ENV['RACK_ENV'] || 'development'
|
13
13
|
end
|
14
14
|
|
15
15
|
def root
|
16
16
|
@root ||= ENV['APP_ROOT'] || '.'
|
17
17
|
end
|
18
18
|
|
19
|
-
def init_config(options={})
|
19
|
+
def init_config(options = {})
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
require 'new_relic/control/frameworks/ruby'
|
6
6
|
module NewRelic
|
@@ -8,6 +8,12 @@ module NewRelic
|
|
8
8
|
module Frameworks
|
9
9
|
# Contains basic control logic for Sinatra
|
10
10
|
class Sinatra < NewRelic::Control::Frameworks::Ruby
|
11
|
+
protected
|
12
|
+
|
13
|
+
def install_shim
|
14
|
+
super
|
15
|
+
::Sinatra::Base.class_eval { include NewRelic::Agent::Instrumentation::ControllerInstrumentation::Shim }
|
16
|
+
end
|
11
17
|
end
|
12
18
|
end
|
13
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
|
module NewRelic
|
6
6
|
class Control
|
@@ -1,18 +1,20 @@
|
|
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/null_logger'
|
6
6
|
require 'new_relic/agent/memory_logger'
|
7
7
|
require 'new_relic/agent/agent_logger'
|
8
8
|
|
9
|
+
require_relative 'private_instance_methods'
|
10
|
+
|
9
11
|
module NewRelic
|
10
12
|
class Control
|
11
|
-
|
12
13
|
# Contains methods that relate to the runtime usage of the control
|
13
14
|
# object. Note that these are subject to override in the
|
14
15
|
# NewRelic::Control::Framework classes that are actually instantiated
|
15
16
|
module InstanceMethods
|
17
|
+
include PrivateInstanceMethods
|
16
18
|
# The env is the setting used to identify which section of the newrelic.yml
|
17
19
|
# to load. This defaults to a framework specific value, such as ENV['RAILS_ENV']
|
18
20
|
# but can be overridden as long as you set it before calling #init_plugin
|
@@ -47,15 +49,13 @@ module NewRelic
|
|
47
49
|
# Subclasses are not allowed to override, but must implement
|
48
50
|
# init_config({}) which is called one or more times.
|
49
51
|
#
|
50
|
-
def init_plugin(options={})
|
52
|
+
def init_plugin(options = {})
|
51
53
|
env = determine_env(options)
|
52
54
|
|
53
55
|
configure_agent(env, options)
|
54
56
|
|
55
57
|
# Be sure to only create once! RUBY-1020
|
56
|
-
|
57
|
-
::NewRelic::Agent.logger = NewRelic::Agent::AgentLogger.new(root, options.delete(:log))
|
58
|
-
end
|
58
|
+
create_logger(options)
|
59
59
|
|
60
60
|
# Merge the stringified options into the config as overrides:
|
61
61
|
environment_name = options.delete(:env) and self.env = environment_name
|
@@ -64,21 +64,15 @@ module NewRelic
|
|
64
64
|
|
65
65
|
# An artifact of earlier implementation, we put both #add_method_tracer and #trace_execution
|
66
66
|
# methods in the module methods.
|
67
|
-
|
68
|
-
|
67
|
+
# Rails applications load the next two lines before any other initializers are run
|
68
|
+
unless defined?(Rails::VERSION) && ENV['NEW_RELIC_DEFER_RAILS_INITIALIZATION']
|
69
|
+
Module.send(:include, NewRelic::Agent::MethodTracer::ClassMethods)
|
70
|
+
Module.send(:include, NewRelic::Agent::MethodTracer)
|
71
|
+
end
|
72
|
+
|
69
73
|
init_config(options)
|
70
74
|
NewRelic::Agent.agent = NewRelic::Agent::Agent.instance
|
71
|
-
|
72
|
-
if !security_settings_valid?
|
73
|
-
handle_invalid_security_settings
|
74
|
-
elsif Agent.config[:agent_enabled] && !NewRelic::Agent.instance.started?
|
75
|
-
start_agent
|
76
|
-
install_instrumentation
|
77
|
-
elsif !Agent.config[:agent_enabled]
|
78
|
-
install_shim
|
79
|
-
else
|
80
|
-
DependencyDetection.detect!
|
81
|
-
end
|
75
|
+
init_instrumentation
|
82
76
|
end
|
83
77
|
|
84
78
|
def determine_env(options)
|
@@ -86,11 +80,13 @@ module NewRelic
|
|
86
80
|
env = env.to_s
|
87
81
|
|
88
82
|
if @started_in_env && @started_in_env != env
|
89
|
-
Agent.logger.error("Attempted to start agent in #{env.inspect} environment, but agent was already running
|
90
|
-
|
83
|
+
Agent.logger.error("Attempted to start agent in #{env.inspect} environment, but agent was already running " \
|
84
|
+
"in #{@started_in_env.inspect}", "The agent will continue running in #{@started_in_env.inspect}. To " \
|
85
|
+
"alter this, ensure the desired environment is set before the agent starts.")
|
91
86
|
else
|
92
|
-
Agent.logger.info("Starting the New Relic agent version #{NewRelic::VERSION::STRING} in #{env.inspect}
|
93
|
-
|
87
|
+
Agent.logger.info("Starting the New Relic agent version #{NewRelic::VERSION::STRING} in #{env.inspect} " \
|
88
|
+
"environment.", "To prevent agent startup add a NEW_RELIC_AGENT_ENABLED=false environment variable or " \
|
89
|
+
"modify the #{env.inspect} section of your newrelic.yml.")
|
94
90
|
end
|
95
91
|
|
96
92
|
env
|
@@ -99,27 +95,20 @@ module NewRelic
|
|
99
95
|
def configure_agent(env, options)
|
100
96
|
manual = Agent::Configuration::ManualSource.new(options)
|
101
97
|
Agent.config.replace_or_add_config(manual)
|
102
|
-
|
103
|
-
|
104
|
-
Agent.config.replace_or_add_config(
|
105
|
-
|
106
|
-
if security_settings_valid? && Agent.config[:high_security]
|
107
|
-
Agent.logger.info("Installing high security configuration based on local configuration")
|
108
|
-
Agent.config.replace_or_add_config(Agent::Configuration::HighSecuritySource.new(Agent.config))
|
109
|
-
end
|
98
|
+
yaml_source = Agent::Configuration::YamlSource.new(config_file_path, env)
|
99
|
+
log_yaml_source_failures(yaml_source) if yaml_source.failed?
|
100
|
+
Agent.config.replace_or_add_config(yaml_source)
|
101
|
+
configure_high_security
|
110
102
|
end
|
111
103
|
|
112
104
|
def security_settings_valid?
|
113
|
-
!Agent.config[:high_security] ||
|
114
|
-
Agent.config[:security_policies_token].empty?
|
105
|
+
!Agent.config[:high_security] || Agent.config[:security_policies_token].empty?
|
115
106
|
end
|
116
107
|
|
117
108
|
def handle_invalid_security_settings
|
118
|
-
NewRelic::Agent.logger.error
|
119
|
-
"
|
120
|
-
"
|
121
|
-
"ensure the security_policies_token is set but high_security is " \
|
122
|
-
"disabled (default)."
|
109
|
+
NewRelic::Agent.logger.error("Security Policies and High Security Mode cannot both be present in the agent " \
|
110
|
+
"configuration. If Security Policies have been set for your account, please ensure the " \
|
111
|
+
"security_policies_token is set but high_security is disabled (default).")
|
123
112
|
install_shim
|
124
113
|
end
|
125
114
|
|
@@ -158,13 +147,12 @@ module NewRelic
|
|
158
147
|
|
159
148
|
protected
|
160
149
|
|
161
|
-
def initialize(local_env, config_file_override=nil)
|
150
|
+
def initialize(local_env, config_file_override = nil)
|
151
|
+
@install_lock = Mutex.new
|
162
152
|
@local_env = local_env
|
163
153
|
@started_in_env = nil
|
164
|
-
|
165
154
|
@instrumented = nil
|
166
155
|
@instrumentation_files = []
|
167
|
-
|
168
156
|
@config_file_override = config_file_override
|
169
157
|
end
|
170
158
|
|
@@ -172,6 +160,9 @@ module NewRelic
|
|
172
160
|
'.'
|
173
161
|
end
|
174
162
|
|
163
|
+
def stdout
|
164
|
+
STDOUT
|
165
|
+
end
|
175
166
|
end
|
176
167
|
include InstanceMethods
|
177
168
|
end
|
@@ -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
|
class Control
|
7
7
|
# Contains methods that relate to adding and executing files that
|
8
8
|
# contain instrumentation for the Ruby Agent
|
9
9
|
module Instrumentation
|
10
|
-
|
11
10
|
# Adds a list of files in Dir.glob format
|
12
11
|
# (e.g. '/app/foo/**/*_instrumentation.rb')
|
13
12
|
# This requires the files within a rescue block, so that any
|
14
13
|
# errors within instrumentation files do not affect the overall
|
15
14
|
# agent or application in which it runs.
|
16
|
-
def load_instrumentation_files
|
15
|
+
def load_instrumentation_files(pattern)
|
17
16
|
Dir.glob(pattern) do |file|
|
18
17
|
begin
|
19
18
|
require file.to_s
|
20
19
|
rescue => e
|
21
|
-
::NewRelic::Agent.logger.warn
|
20
|
+
::NewRelic::Agent.logger.warn("Error loading instrumentation file '#{file}':", e)
|
22
21
|
end
|
23
22
|
end
|
24
23
|
end
|
@@ -34,9 +33,9 @@ module NewRelic
|
|
34
33
|
#
|
35
34
|
# This happens after the agent has loaded and all dependencies
|
36
35
|
# are ready to be instrumented
|
37
|
-
def add_instrumentation
|
36
|
+
def add_instrumentation(pattern)
|
38
37
|
if @instrumented
|
39
|
-
load_instrumentation_files
|
38
|
+
load_instrumentation_files(pattern)
|
40
39
|
else
|
41
40
|
@instrumentation_files << pattern
|
42
41
|
end
|
@@ -57,15 +56,44 @@ module NewRelic
|
|
57
56
|
|
58
57
|
# Instrumentation for the key code points inside rails for monitoring by NewRelic.
|
59
58
|
# note this file is loaded only if the newrelic agent is enabled (through config/newrelic.yml)
|
60
|
-
instrumentation_path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'agent','instrumentation'))
|
59
|
+
instrumentation_path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'agent', 'instrumentation'))
|
61
60
|
@instrumentation_files <<
|
62
|
-
|
63
|
-
|
64
|
-
@instrumentation_files.each { |
|
61
|
+
File.join(instrumentation_path, '*.rb') <<
|
62
|
+
File.join(instrumentation_path, app.to_s, '*.rb')
|
63
|
+
@instrumentation_files.each { |pattern| load_instrumentation_files(pattern) }
|
65
64
|
DependencyDetection.detect!
|
66
|
-
|
65
|
+
ruby_deprecation
|
66
|
+
rails_32_deprecation
|
67
|
+
::NewRelic::Agent.logger.info("Finished instrumentation")
|
67
68
|
end
|
68
69
|
end
|
70
|
+
|
71
|
+
def rails_32_deprecation
|
72
|
+
return unless defined?(Rails::VERSION) && Gem::Version.new(Rails::VERSION::STRING) <= Gem::Version.new('3.2')
|
73
|
+
|
74
|
+
deprecation_msg = 'The Ruby Agent is dropping support for Rails 3.2 ' \
|
75
|
+
'in a future major release. Please upgrade your Rails version to continue receiving support. ' \
|
76
|
+
|
77
|
+
Agent.logger.log_once(
|
78
|
+
:warn,
|
79
|
+
:deprecated_rails_version,
|
80
|
+
deprecation_msg
|
81
|
+
)
|
82
|
+
end
|
83
|
+
|
84
|
+
def ruby_deprecation
|
85
|
+
return unless RUBY_VERSION < '2.4.0'
|
86
|
+
|
87
|
+
deprecation_msg = 'The Ruby Agent is dropping support for Rubies below 2.4 ' \
|
88
|
+
'in version 9.0.0. Please upgrade your Ruby version to continue receiving support. ' \
|
89
|
+
|
90
|
+
::NewRelic::Agent.logger.log_once(
|
91
|
+
:warn,
|
92
|
+
:deprecated_ruby_version,
|
93
|
+
deprecation_msg
|
94
|
+
)
|
95
|
+
end
|
96
|
+
|
69
97
|
include Instrumentation
|
70
98
|
end
|
71
99
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require 'new_relic/agent/memory_logger'
|
6
|
+
require 'new_relic/agent/agent_logger'
|
7
|
+
|
8
|
+
module NewRelic
|
9
|
+
class Control
|
10
|
+
module PrivateInstanceMethods
|
11
|
+
private
|
12
|
+
|
13
|
+
def configure_high_security
|
14
|
+
if security_settings_valid? && Agent.config[:high_security]
|
15
|
+
Agent.logger.info("Installing high security configuration based on local configuration")
|
16
|
+
Agent.config.replace_or_add_config(Agent::Configuration::HighSecuritySource.new(Agent.config))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def log_yaml_source_failures(yaml_source)
|
21
|
+
yaml_source.failures.each { |msg| stdout.puts Agent::AgentLogger.format_fatal_error(msg) }
|
22
|
+
end
|
23
|
+
|
24
|
+
def config_file_path
|
25
|
+
@config_file_override || Agent.config[:config_path]
|
26
|
+
end
|
27
|
+
|
28
|
+
def create_logger(options)
|
29
|
+
if ::NewRelic::Agent.logger.is_startup_logger?
|
30
|
+
::NewRelic::Agent.logger = NewRelic::Agent::AgentLogger.new(root, options.delete(:log))
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def init_instrumentation
|
35
|
+
if !security_settings_valid?
|
36
|
+
handle_invalid_security_settings
|
37
|
+
elsif Agent.config[:agent_enabled] && !NewRelic::Agent.instance.started?
|
38
|
+
start_agent
|
39
|
+
install_instrumentation
|
40
|
+
elsif !Agent.config[:agent_enabled]
|
41
|
+
install_shim
|
42
|
+
else
|
43
|
+
DependencyDetection.detect!
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
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
|
module NewRelic
|
6
6
|
class Control
|
7
|
-
|
8
7
|
# Structs holding info for the remote server and proxy server
|
9
|
-
class Server < Struct.new
|
8
|
+
class Server < Struct.new(:name, :port) # :nodoc:
|
10
9
|
def to_s; "#{name}:#{port}"; end
|
11
10
|
end
|
12
11
|
|
@@ -22,7 +21,7 @@ module NewRelic
|
|
22
21
|
@api_server ||= NewRelic::Control::Server.new(Agent.config[:api_host], Agent.config[:api_port])
|
23
22
|
end
|
24
23
|
|
25
|
-
def server_from_host(hostname=nil)
|
24
|
+
def server_from_host(hostname = nil)
|
26
25
|
NewRelic::Control::Server.new(hostname || Agent.config[:host], Agent.config[:port])
|
27
26
|
end
|
28
27
|
end
|
data/lib/new_relic/control.rb
CHANGED
@@ -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 'yaml'
|
6
6
|
require 'new_relic/dependency_detection'
|
@@ -23,7 +23,6 @@ require 'new_relic/agent'
|
|
23
23
|
require 'new_relic/delayed_job_injection'
|
24
24
|
|
25
25
|
module NewRelic
|
26
|
-
|
27
26
|
# The Control is a singleton responsible for the startup and
|
28
27
|
# initialization sequence. The initializer uses a LocalEnvironment to
|
29
28
|
# detect the framework and instantiates the framework specific
|
@@ -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 DelayedJobInjection
|