newrelic_rpm 8.15.0 → 9.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.build_ignore +26 -0
- data/CHANGELOG.md +538 -44
- data/CONTRIBUTING.md +1 -1
- data/Gemfile +1 -1
- data/README.md +11 -6
- data/Rakefile +9 -9
- data/Thorfile +1 -1
- data/bin/newrelic +1 -0
- data/bin/newrelic_cmd +1 -0
- data/bin/nrdebug +36 -36
- data/init.rb +1 -1
- data/lib/new_relic/agent/agent.rb +3 -16
- data/lib/new_relic/agent/agent_helpers/connect.rb +5 -10
- data/lib/new_relic/agent/agent_helpers/harvest.rb +4 -4
- data/lib/new_relic/agent/agent_helpers/shutdown.rb +5 -5
- data/lib/new_relic/agent/agent_helpers/special_startup.rb +3 -4
- data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +47 -39
- data/lib/new_relic/agent/agent_helpers/startup.rb +13 -13
- data/lib/new_relic/agent/agent_helpers/transmit.rb +6 -6
- data/lib/new_relic/agent/agent_logger.rb +9 -9
- data/lib/new_relic/agent/attribute_filter.rb +2 -4
- data/lib/new_relic/agent/attribute_pre_filtering.rb +109 -0
- data/lib/new_relic/agent/attribute_processing.rb +2 -2
- data/lib/new_relic/agent/audit_logger.rb +5 -5
- data/lib/new_relic/agent/autostart.rb +1 -1
- data/lib/new_relic/agent/commands/agent_command.rb +2 -2
- data/lib/new_relic/agent/commands/agent_command_router.rb +5 -4
- data/lib/new_relic/agent/commands/thread_profiler_session.rb +8 -8
- data/lib/new_relic/agent/configuration/default_source.rb +428 -586
- data/lib/new_relic/agent/configuration/environment_source.rb +2 -2
- data/lib/new_relic/agent/configuration/high_security_source.rb +3 -5
- data/lib/new_relic/agent/configuration/manager.rb +16 -2
- data/lib/new_relic/agent/configuration/security_policy_source.rb +10 -26
- data/lib/new_relic/agent/configuration/server_source.rb +24 -24
- data/lib/new_relic/agent/configuration/yaml_source.rb +17 -4
- data/lib/new_relic/agent/connect/request_builder.rb +1 -1
- data/lib/new_relic/agent/connect/response_handler.rb +1 -1
- data/lib/new_relic/agent/custom_event_aggregator.rb +4 -4
- data/lib/new_relic/agent/database/explain_plan_helpers.rb +1 -1
- data/lib/new_relic/agent/database/obfuscation_helpers.rb +2 -2
- data/lib/new_relic/agent/database/obfuscator.rb +2 -2
- data/lib/new_relic/agent/database.rb +4 -18
- data/lib/new_relic/agent/datastores/metric_helper.rb +5 -5
- data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +11 -11
- data/lib/new_relic/agent/datastores/redis.rb +6 -6
- data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +8 -10
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +10 -10
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +7 -7
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +1 -1
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +6 -6
- data/lib/new_relic/agent/distributed_tracing/trace_context.rb +7 -7
- data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +4 -4
- data/lib/new_relic/agent/distributed_tracing.rb +6 -6
- data/lib/new_relic/agent/error_collector.rb +36 -8
- data/lib/new_relic/agent/error_filter.rb +5 -5
- data/lib/new_relic/agent/error_trace_aggregator.rb +5 -4
- data/lib/new_relic/agent/event_loop.rb +3 -3
- data/lib/new_relic/agent/external.rb +1 -1
- data/lib/new_relic/agent/harvester.rb +1 -3
- data/lib/new_relic/agent/heap.rb +2 -1
- data/lib/new_relic/agent/hostname.rb +1 -1
- data/lib/new_relic/agent/http_clients/abstract.rb +9 -21
- data/lib/new_relic/agent/http_clients/async_http_wrappers.rb +83 -0
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +7 -3
- data/lib/new_relic/agent/http_clients/ethon_wrappers.rb +111 -0
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +7 -5
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +4 -0
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +6 -2
- data/lib/new_relic/agent/http_clients/httpx_wrappers.rb +93 -0
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +5 -1
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +8 -5
- data/lib/new_relic/agent/http_clients/uri_util.rb +2 -2
- data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +6 -19
- data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +42 -0
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +3 -2
- 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 +10 -10
- data/lib/new_relic/agent/instrumentation/active_job.rb +16 -3
- data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +3 -3
- data/lib/new_relic/agent/instrumentation/active_record.rb +4 -3
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +38 -36
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +5 -4
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +2 -2
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +3 -2
- data/lib/new_relic/agent/instrumentation/active_storage.rb +4 -0
- data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +2 -30
- data/lib/new_relic/agent/instrumentation/active_support.rb +21 -6
- data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger/chain.rb +69 -0
- data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger/instrumentation.rb +13 -0
- data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger/prepend.rb +37 -0
- data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger.rb +23 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +4 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger.rb +3 -1
- data/lib/new_relic/agent/instrumentation/active_support_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/async_http/chain.rb +23 -0
- data/lib/new_relic/agent/instrumentation/async_http/instrumentation.rb +37 -0
- data/lib/new_relic/agent/instrumentation/async_http/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/async_http.rb +26 -0
- data/lib/new_relic/agent/instrumentation/bunny/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +12 -3
- data/lib/new_relic/agent/instrumentation/bunny.rb +1 -1
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/instrumentation.rb +3 -4
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/prepend.rb +1 -1
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +7 -6
- data/lib/new_relic/agent/instrumentation/curb/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +9 -5
- data/lib/new_relic/agent/instrumentation/curb.rb +1 -1
- data/lib/new_relic/agent/instrumentation/custom_events.rb +12 -0
- data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +2 -1
- data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +1 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +4 -1
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +2 -1
- data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +2 -2
- data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +8 -4
- data/lib/new_relic/agent/instrumentation/elasticsearch.rb +2 -2
- data/lib/new_relic/agent/instrumentation/ethon/chain.rb +39 -0
- data/lib/new_relic/agent/instrumentation/ethon/instrumentation.rb +105 -0
- data/lib/new_relic/agent/instrumentation/ethon/prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/ethon.rb +39 -0
- data/lib/new_relic/agent/instrumentation/excon/middleware.rb +5 -1
- data/lib/new_relic/agent/instrumentation/excon.rb +3 -3
- data/lib/new_relic/agent/instrumentation/fiber/chain.rb +27 -0
- data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +23 -0
- data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +25 -0
- data/lib/new_relic/agent/instrumentation/fiber.rb +25 -0
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +8 -4
- data/lib/new_relic/agent/instrumentation/grape.rb +4 -4
- data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +7 -2
- data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +1 -1
- data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +1 -1
- data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +8 -4
- data/lib/new_relic/agent/instrumentation/grpc_client.rb +2 -2
- data/lib/new_relic/agent/instrumentation/grpc_server.rb +2 -2
- data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +4 -0
- data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +4 -0
- data/lib/new_relic/agent/instrumentation/httprb.rb +1 -1
- data/lib/new_relic/agent/instrumentation/httpx/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/httpx/instrumentation.rb +51 -0
- data/lib/new_relic/agent/instrumentation/httpx/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httpx.rb +27 -0
- data/lib/new_relic/agent/instrumentation/ignore_actions.rb +1 -1
- data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +3 -0
- data/lib/new_relic/agent/instrumentation/logger.rb +1 -1
- data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +3 -1
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +14 -5
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +3 -1
- data/lib/new_relic/agent/instrumentation/memcache.rb +12 -12
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +3 -3
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +1 -1
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +6 -8
- data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +5 -1
- data/lib/new_relic/agent/instrumentation/net_http.rb +2 -2
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +46 -1
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +7 -3
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +2 -2
- data/lib/new_relic/agent/instrumentation/queue_time.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +7 -1
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +7 -2
- data/lib/new_relic/agent/instrumentation/rails_middleware.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +4 -4
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +14 -1
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +12 -15
- data/lib/new_relic/agent/instrumentation/rake.rb +3 -3
- data/lib/new_relic/agent/instrumentation/redis/constants.rb +1 -1
- data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +6 -1
- data/lib/new_relic/agent/instrumentation/redis.rb +1 -1
- data/lib/new_relic/agent/instrumentation/resque/helper.rb +1 -1
- data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +4 -0
- data/lib/new_relic/agent/instrumentation/resque.rb +1 -1
- data/lib/new_relic/agent/instrumentation/roda/chain.rb +43 -0
- data/lib/new_relic/agent/instrumentation/roda/ignorer.rb +45 -0
- data/lib/new_relic/agent/instrumentation/roda/instrumentation.rb +68 -0
- data/lib/new_relic/agent/instrumentation/roda/prepend.rb +24 -0
- data/lib/new_relic/agent/instrumentation/roda/roda_transaction_namer.rb +29 -0
- data/lib/new_relic/agent/instrumentation/roda.rb +36 -0
- data/lib/new_relic/agent/instrumentation/sequel.rb +8 -9
- data/lib/new_relic/agent/instrumentation/sequel_helper.rb +10 -10
- data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +4 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +26 -3
- data/lib/new_relic/agent/instrumentation/sidekiq.rb +6 -3
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +10 -5
- data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +2 -4
- data/lib/new_relic/agent/instrumentation/stripe.rb +28 -0
- data/lib/new_relic/agent/instrumentation/stripe_subscriber.rb +77 -0
- data/lib/new_relic/agent/instrumentation/thread/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +3 -8
- data/lib/new_relic/agent/instrumentation/thread/prepend.rb +1 -1
- data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +6 -1
- data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +10 -6
- data/lib/new_relic/agent/javascript_instrumentor.rb +29 -24
- data/lib/new_relic/agent/linking_metadata.rb +2 -2
- data/lib/new_relic/agent/log_event_aggregator.rb +64 -17
- data/lib/new_relic/agent/log_event_attributes.rb +115 -0
- data/lib/new_relic/agent/logging.rb +77 -37
- data/lib/new_relic/agent/messaging.rb +9 -7
- data/lib/new_relic/agent/method_tracer.rb +7 -7
- data/lib/new_relic/agent/method_tracer_helpers.rb +27 -6
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +4 -5
- data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +1 -1
- data/lib/new_relic/agent/monitors/synthetics_monitor.rb +12 -1
- data/lib/new_relic/agent/new_relic_service/encoders.rb +1 -1
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +2 -2
- data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +0 -1
- data/lib/new_relic/agent/new_relic_service.rb +47 -32
- data/lib/new_relic/agent/obfuscator.rb +1 -1
- data/lib/new_relic/agent/parameter_filtering.rb +6 -6
- data/lib/new_relic/agent/pipe_channel_manager.rb +7 -6
- data/lib/new_relic/agent/pipe_service.rb +5 -3
- data/lib/new_relic/agent/priority_sampled_buffer.rb +1 -1
- data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +0 -1
- data/lib/new_relic/agent/rules_engine.rb +1 -1
- data/lib/new_relic/agent/sampler.rb +2 -1
- data/lib/new_relic/agent/sampler_collection.rb +1 -1
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +5 -5
- data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +9 -9
- data/lib/new_relic/agent/samplers/memory_sampler.rb +9 -9
- data/lib/new_relic/agent/samplers/object_sampler.rb +1 -1
- data/lib/new_relic/agent/span_event_aggregator.rb +4 -4
- data/lib/new_relic/agent/span_event_primitive.rb +18 -6
- data/lib/new_relic/agent/sql_sampler.rb +2 -2
- data/lib/new_relic/agent/stats.rb +1 -1
- data/lib/new_relic/agent/synthetics_event_aggregator.rb +1 -1
- data/lib/new_relic/agent/system_info.rb +36 -10
- data/lib/new_relic/agent/threading/agent_thread.rb +1 -1
- data/lib/new_relic/agent/threading/backtrace_node.rb +3 -3
- data/lib/new_relic/agent/threading/backtrace_service.rb +3 -7
- data/lib/new_relic/agent/threading/thread_profile.rb +5 -5
- data/lib/new_relic/agent/timestamp_sampled_buffer.rb +1 -1
- data/lib/new_relic/agent/tracer.rb +25 -16
- data/lib/new_relic/agent/transaction/abstract_segment.rb +109 -48
- data/lib/new_relic/agent/transaction/datastore_segment.rb +1 -1
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +7 -6
- data/lib/new_relic/agent/transaction/distributed_tracing.rb +13 -14
- data/lib/new_relic/agent/transaction/external_request_segment.rb +16 -13
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +2 -3
- data/lib/new_relic/agent/transaction/request_attributes.rb +47 -11
- data/lib/new_relic/agent/transaction/segment.rb +1 -1
- data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +1 -1
- data/lib/new_relic/agent/transaction/trace.rb +1 -1
- data/lib/new_relic/agent/transaction/trace_context.rb +4 -4
- data/lib/new_relic/agent/transaction/trace_node.rb +8 -7
- data/lib/new_relic/agent/transaction/tracing.rb +10 -4
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +1 -1
- data/lib/new_relic/agent/transaction.rb +90 -58
- data/lib/new_relic/agent/transaction_error_primitive.rb +21 -5
- data/lib/new_relic/agent/transaction_event_aggregator.rb +4 -4
- data/lib/new_relic/agent/transaction_event_primitive.rb +22 -3
- data/lib/new_relic/agent/transaction_sampler.rb +3 -3
- data/lib/new_relic/agent/transaction_time_aggregator.rb +7 -3
- data/lib/new_relic/agent/utilization/aws.rb +1 -1
- data/lib/new_relic/agent/utilization/azure.rb +3 -3
- data/lib/new_relic/agent/utilization/gcp.rb +4 -6
- data/lib/new_relic/agent/utilization/pcf.rb +1 -1
- data/lib/new_relic/agent/utilization/vendor.rb +6 -8
- data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +1 -1
- data/lib/new_relic/agent/vm/mri_vm.rb +9 -8
- data/lib/new_relic/agent/worker_loop.rb +1 -1
- data/lib/new_relic/agent.rb +133 -36
- data/lib/new_relic/cli/command.rb +4 -3
- data/lib/new_relic/cli/commands/deployments.rb +26 -25
- data/lib/new_relic/cli/commands/install.rb +23 -23
- data/lib/new_relic/collection_helper.rb +2 -2
- data/lib/new_relic/constants.rb +10 -8
- data/lib/new_relic/control/class_methods.rb +4 -10
- data/lib/new_relic/control/frameworks/rails.rb +44 -20
- data/lib/new_relic/control/frameworks/roda.rb +20 -0
- data/lib/new_relic/control/instance_methods.rb +6 -6
- data/lib/new_relic/control/instrumentation.rb +1 -15
- data/lib/new_relic/control/private_instance_methods.rb +1 -1
- data/lib/new_relic/dependency_detection.rb +20 -18
- data/lib/new_relic/environment_report.rb +4 -4
- data/lib/new_relic/helper.rb +2 -1
- data/lib/new_relic/language_support.rb +10 -1
- data/lib/new_relic/latest_changes.rb +6 -6
- data/lib/new_relic/local_environment.rb +0 -10
- data/lib/new_relic/noticed_error.rb +25 -20
- data/lib/new_relic/rack/agent_hooks.rb +1 -1
- data/lib/new_relic/rack/agent_middleware.rb +0 -16
- data/lib/new_relic/rack/browser_monitoring.rb +21 -17
- data/lib/new_relic/recipes/capistrano3.rb +1 -1
- data/lib/new_relic/recipes/capistrano_legacy.rb +6 -6
- data/lib/new_relic/recipes/helpers/send_deployment.rb +5 -5
- data/lib/new_relic/supportability_helper.rb +4 -1
- data/lib/new_relic/traced_thread.rb +2 -3
- data/lib/new_relic/version.rb +2 -2
- data/lib/newrelic_rpm.rb +4 -4
- data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +6 -6
- data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +4 -4
- data/lib/tasks/bump_version.rake +21 -0
- data/lib/tasks/config.rake +13 -12
- data/lib/tasks/coverage_report.rake +4 -4
- data/lib/tasks/helpers/config.html.erb +93 -0
- data/lib/tasks/helpers/format.rb +19 -15
- data/lib/tasks/helpers/newrelicyml.rb +144 -0
- data/lib/tasks/helpers/version_bump.rb +62 -0
- data/lib/tasks/install.rake +4 -4
- data/lib/tasks/instrumentation_generator/instrumentation.thor +16 -19
- data/lib/tasks/instrumentation_generator/templates/Envfile.tt +1 -1
- data/lib/tasks/instrumentation_generator/templates/chain.tt +1 -1
- data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +1 -1
- data/lib/tasks/newrelic.rb +1 -0
- data/lib/tasks/newrelicyml.rake +13 -0
- data/lib/tasks/tests.rake +77 -6
- data/newrelic.yml +393 -274
- data/newrelic_rpm.gemspec +41 -30
- data/test/agent_helper.rb +25 -24
- metadata +172 -35
- data/.gitignore +0 -42
- data/.project +0 -23
- data/.rubocop.yml +0 -1946
- data/.rubocop_todo.yml +0 -62
- data/.simplecov +0 -15
- data/.snyk +0 -11
- data/.yardopts +0 -27
- data/Brewfile +0 -12
- data/DOCKER.md +0 -167
- data/Dockerfile +0 -10
- data/Guardfile +0 -26
- data/config/database.yml +0 -5
- data/config.dot +0 -278
- data/docker-compose.yml +0 -107
- data/lefthook.yml +0 -9
- data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -83
- data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -33
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -215
- data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +0 -36
- data/lib/new_relic/agent/instrumentation/sunspot.rb +0 -41
- data/lib/new_relic/agent/range_extensions.rb +0 -27
- data/lib/tasks/helpers/removers.rb +0 -33
- data/lib/tasks/multiverse.rake +0 -6
- data/lib/tasks/multiverse.rb +0 -77
data/CONTRIBUTING.md
CHANGED
@@ -94,7 +94,7 @@ includes unreleased work. Please create all new branches off of `dev`.
|
|
94
94
|
- Fork the repository inside GitHub
|
95
95
|
- `git clone git@github.com:<gh username>/newrelic-ruby-agent.git`
|
96
96
|
1. Pick a Ruby version
|
97
|
-
- Use rbenv, rvm, chruby, asdf, etc. to install any version of Ruby between 2.
|
97
|
+
- Use rbenv, rvm, chruby, asdf, etc. to install any version of Ruby between 2.4 up to the latest stable version
|
98
98
|
1. Install development dependencies
|
99
99
|
- `bundle install`
|
100
100
|
1. Check that your env is setup correctly
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,4 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
<a href="https://opensource.newrelic.com/oss-category/#community-plus"><picture><source media="(prefers-color-scheme: dark)" srcset="https://github.com/newrelic/opensource-website/raw/main/src/images/categories/dark/Community_Plus.png"><source media="(prefers-color-scheme: light)" srcset="https://github.com/newrelic/opensource-website/raw/main/src/images/categories/Community_Plus.png"><img alt="New Relic Open Source community plus project banner." src="https://github.com/newrelic/opensource-website/raw/main/src/images/categories/Community_Plus.png"></picture></a>
|
3
2
|
|
4
3
|
# New Relic Ruby Agent
|
5
4
|
|
@@ -10,7 +9,9 @@ You can also extend the agent's performance monitoring to
|
|
10
9
|
to help you improve the customer experience and make data-driven business decisions.
|
11
10
|
|
12
11
|
The New Relic Ruby agent is dual-purposed as either a Gem or a Rails plugin,
|
13
|
-
hosted on [
|
12
|
+
hosted on [GitHub](https://github.com/newrelic/newrelic-ruby-agent).
|
13
|
+
|
14
|
+
This code is actively maintained by New Relic engineering teams and delivered here in GitHub. See below for troubleshooting and defect reporting instructions.
|
14
15
|
|
15
16
|
[![Gem Version](https://badge.fury.io/rb/newrelic_rpm.svg)](https://badge.fury.io/rb/newrelic_rpm)
|
16
17
|
|
@@ -24,7 +25,7 @@ Environments" section below.
|
|
24
25
|
|
25
26
|
## Installing and Using
|
26
27
|
|
27
|
-
The latest released gem for the Ruby agent can be found at [
|
28
|
+
The latest released gem for the Ruby agent can be found at [RubyGems.org](https://rubygems.org/gems/newrelic_rpm)
|
28
29
|
|
29
30
|
### Quick Start
|
30
31
|
|
@@ -87,7 +88,7 @@ for more information.
|
|
87
88
|
|
88
89
|
Should you need assistance with New Relic products, you are in good hands with several support diagnostic tools and support channels.
|
89
90
|
|
90
|
-
This [troubleshooting framework](https://
|
91
|
+
This [troubleshooting framework](https://forum.newrelic.com/s/hubtopic/aAX8W0000008bSgWAI/ruby-troubleshooting-framework-install) steps you through common troubleshooting questions.
|
91
92
|
|
92
93
|
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.
|
93
94
|
|
@@ -96,7 +97,7 @@ If the issue has been confirmed as a bug or is a Feature request, please file a
|
|
96
97
|
**Support Channels**
|
97
98
|
|
98
99
|
* [New Relic Documentation](https://docs.newrelic.com/docs/agents/ruby-agent): Comprehensive guidance for using our platform
|
99
|
-
* [New Relic Community](https://
|
100
|
+
* [New Relic Community](https://forum.newrelic.com): The best place to engage in troubleshooting questions
|
100
101
|
* [New Relic Developer](https://developer.newrelic.com/): Resources for building a custom observability applications
|
101
102
|
* [New Relic University](https://learn.newrelic.com/): A range of online training for New Relic users of every level
|
102
103
|
* [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).
|
@@ -133,6 +134,10 @@ The New Relic Ruby agent may use source code from third-party libraries. When us
|
|
133
134
|
|
134
135
|
## Thank You
|
135
136
|
|
137
|
+
We always look forward to connecting with the community. We welcome [contributions](https://github.com/newrelic/newrelic-ruby-agent#contributing) to our source code and suggestions for improvements, and would love to hear about what you like and want to see in the future.
|
138
|
+
|
139
|
+
Visit our [project board](https://github.com/orgs/newrelic/projects/84/) to see what's upcoming in a future release, what we're currently working on, and what we're planning next.
|
140
|
+
|
136
141
|
Thank you,
|
137
142
|
|
138
143
|
New Relic Ruby agent team
|
data/Rakefile
CHANGED
@@ -15,11 +15,11 @@ task :default => :test
|
|
15
15
|
task :test => ['test:newrelic']
|
16
16
|
|
17
17
|
namespace :test do
|
18
|
-
desc
|
18
|
+
desc 'Run all tests'
|
19
19
|
task :all => %w[newrelic multiverse all_compatible_envs]
|
20
20
|
agent_home = File.expand_path(File.dirname(__FILE__))
|
21
21
|
|
22
|
-
desc
|
22
|
+
desc 'Run agent performance tests'
|
23
23
|
task :performance, [:suite, :name] => [] do |t, args|
|
24
24
|
require File.expand_path(File.join(File.dirname(__FILE__), 'test', 'performance', 'lib', 'performance'))
|
25
25
|
options = {}
|
@@ -28,13 +28,13 @@ namespace :test do
|
|
28
28
|
Performance::Runner.new(options).run_and_report
|
29
29
|
end
|
30
30
|
|
31
|
-
desc
|
31
|
+
desc 'Run agent within existing mini environment(s): env[name1,name2,name3,etc.]'
|
32
32
|
task :env do |t, args|
|
33
33
|
require File.expand_path(File.join(File.dirname(__FILE__), 'test', 'environments', 'lib', 'environments', 'runner'))
|
34
34
|
Environments::Runner.new(args.to_a).run_and_report
|
35
35
|
end
|
36
36
|
|
37
|
-
desc
|
37
|
+
desc 'Run all mini environment tests known to work with the current Ruby version'
|
38
38
|
task :all_compatible_envs do |t, args|
|
39
39
|
require File.expand_path(File.join(File.dirname(__FILE__), 'test', 'helpers', 'ruby_rails_mappings'))
|
40
40
|
rails_versions = rails_versions_for_ruby_version(RUBY_VERSION)
|
@@ -62,10 +62,10 @@ task :record_build, [:build_number, :stage] do |t, args|
|
|
62
62
|
build_string = args.build_number
|
63
63
|
build_string << ".#{args.stage}" unless args.stage.nil? || args.stage.empty?
|
64
64
|
|
65
|
-
gitsha = File.exist?(
|
65
|
+
gitsha = File.exist?('.git') ? `git rev-parse HEAD` : 'Unknown'
|
66
66
|
gitsha.chomp!
|
67
67
|
|
68
|
-
File.open(
|
68
|
+
File.open('lib/new_relic/build.rb', 'w') do |f|
|
69
69
|
f.write("# GITSHA: #{gitsha}\n")
|
70
70
|
f.write("module NewRelic; module VERSION; BUILD='#{build_string}'; end; end\n")
|
71
71
|
end
|
@@ -93,14 +93,14 @@ task :update_ca_bundle do |t|
|
|
93
93
|
bundle_last_update = `cd #{ca_bundle_path} && git show -s --format=%ci HEAD`
|
94
94
|
puts "Source CA bundle last updated #{bundle_last_update}"
|
95
95
|
|
96
|
-
bundle_path =
|
96
|
+
bundle_path = 'cert/cacert.pem'
|
97
97
|
cert_paths = []
|
98
98
|
Dir.glob("#{ca_bundle_path}/*.pem").each { |p| cert_paths << p }
|
99
99
|
cert_paths.sort!
|
100
100
|
|
101
101
|
puts "Writing #{cert_paths.size} certs to bundle at #{bundle_path}..."
|
102
102
|
|
103
|
-
File.open(bundle_path,
|
103
|
+
File.open(bundle_path, 'w') do |f|
|
104
104
|
cert_paths.each do |cert_path|
|
105
105
|
cert_name = File.basename(cert_path, '.pem')
|
106
106
|
puts "Adding #{cert_name}"
|
@@ -131,7 +131,7 @@ end
|
|
131
131
|
|
132
132
|
desc 'Start an interactive console session'
|
133
133
|
task :console do
|
134
|
-
require 'pry'
|
134
|
+
require 'pry' if ENV['ENABLE_PRY']
|
135
135
|
require 'newrelic_rpm'
|
136
136
|
ARGV.clear
|
137
137
|
Pry.start
|
data/Thorfile
CHANGED
data/bin/newrelic
CHANGED
data/bin/newrelic_cmd
CHANGED
data/bin/nrdebug
CHANGED
@@ -96,7 +96,7 @@ class LinuxProcessDataProvider < ProcessDataProvider
|
|
96
96
|
end
|
97
97
|
|
98
98
|
def procline
|
99
|
-
File.read(proc_path('cmdline')).tr("\000",
|
99
|
+
File.read(proc_path('cmdline')).tr("\000", ' ')
|
100
100
|
end
|
101
101
|
|
102
102
|
def environment
|
@@ -155,7 +155,7 @@ class RubyProcess
|
|
155
155
|
def gdb_script_body(backtrace_file)
|
156
156
|
backtrace_gathering_code = 'Thread.list.each { |t| bt = t.backtrace rescue nil; ' \
|
157
157
|
'puts \"#{t.inspect}\n#{bt && bt.join(\"\n\")}\n\n\" }'
|
158
|
-
|
158
|
+
<<~END
|
159
159
|
attach #{pid}
|
160
160
|
t a a bt
|
161
161
|
call (void)close(1)
|
@@ -189,7 +189,7 @@ class ProcessReport
|
|
189
189
|
|
190
190
|
def open
|
191
191
|
if @path
|
192
|
-
File.open(@path,
|
192
|
+
File.open(@path, 'w') do |f|
|
193
193
|
yield(f)
|
194
194
|
end
|
195
195
|
else
|
@@ -216,16 +216,16 @@ class ProcessReport
|
|
216
216
|
|
217
217
|
section(f) do
|
218
218
|
c_backtraces, ruby_backtraces = @target.gather_backtraces
|
219
|
-
if
|
220
|
-
fail(
|
219
|
+
if /could not attach/i.match?(c_backtraces)
|
220
|
+
fail('Failed to attach to target process. Please try again with sudo.')
|
221
221
|
end
|
222
222
|
|
223
|
-
section(f,
|
224
|
-
section(f,
|
223
|
+
section(f, 'C Backtraces') { c_backtraces }
|
224
|
+
section(f, 'Ruby Backtrace(s)') { ruby_backtraces }
|
225
225
|
end
|
226
226
|
|
227
|
-
section(f,
|
228
|
-
section(f,
|
227
|
+
section(f, 'Open files') { @target.open_files }
|
228
|
+
section(f, 'Log') do
|
229
229
|
commands = Logger.messages.map { |(_, msg)| msg }
|
230
230
|
commands.join("\n")
|
231
231
|
end
|
@@ -235,33 +235,33 @@ class ProcessReport
|
|
235
235
|
private
|
236
236
|
|
237
237
|
def add_environment_sections(handle)
|
238
|
-
section(handle,
|
239
|
-
section(handle,
|
240
|
-
section(handle,
|
241
|
-
section(handle,
|
242
|
-
section(handle,
|
243
|
-
section(handle,
|
244
|
-
section(handle,
|
245
|
-
section(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
246
|
end
|
247
247
|
end
|
248
248
|
|
249
249
|
def prompt_for_confirmation(target_pid, target_cmd)
|
250
|
-
puts
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
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
265
|
PROMPT
|
266
266
|
|
267
267
|
until $stdin.gets.strip == 'continue'
|
@@ -270,10 +270,10 @@ def prompt_for_confirmation(target_pid, target_cmd)
|
|
270
270
|
end
|
271
271
|
|
272
272
|
target_pid = ARGV[0]
|
273
|
-
fail(
|
273
|
+
fail('Please provide a PID for the target process', :usage => true) unless target_pid
|
274
274
|
|
275
275
|
gdb_path = `which gdb`
|
276
|
-
fail(
|
276
|
+
fail('Could not find gdb, please ensure it is installed and in your PATH') if gdb_path.empty?
|
277
277
|
|
278
278
|
target = RubyProcess.new(target_pid)
|
279
279
|
if !target.attachable?
|
@@ -298,5 +298,5 @@ report.generate
|
|
298
298
|
|
299
299
|
puts "Generated '#{report_filename}'"
|
300
300
|
puts ''
|
301
|
-
puts
|
302
|
-
puts
|
301
|
+
puts 'Please examine the output file for potentially sensitive information and'
|
302
|
+
puts 'remove it before sharing this file with anyone.'
|
data/init.rb
CHANGED
@@ -26,5 +26,5 @@ begin
|
|
26
26
|
|
27
27
|
NewRelic::Control.instance.init_plugin(:config => current_config)
|
28
28
|
rescue => e
|
29
|
-
NewRelic::Agent.logger.error(
|
29
|
+
NewRelic::Agent.logger.error('Error initializing New Relic plugin. Agent is disabled.', e)
|
30
30
|
end
|
@@ -142,20 +142,16 @@ module NewRelic
|
|
142
142
|
# the transaction sampler that handles recording transactions
|
143
143
|
attr_reader :transaction_sampler
|
144
144
|
attr_reader :sql_sampler
|
145
|
-
# manages agent commands we receive from the collector, and the handlers
|
146
|
-
attr_reader :agent_command_router
|
147
145
|
# error collector is a simple collection of recorded errors
|
148
146
|
attr_reader :error_collector
|
149
|
-
attr_reader :harvest_samplers
|
150
147
|
# whether we should record raw, obfuscated, or no sql
|
151
148
|
attr_reader :record_sql
|
152
149
|
# builder for JS agent scripts to inject
|
153
150
|
attr_reader :javascript_instrumentor
|
154
151
|
# cross application tracing ids and encoding
|
155
152
|
attr_reader :cross_process_id
|
156
|
-
attr_reader :cross_app_encoding_bytes
|
157
153
|
# service for communicating with collector
|
158
|
-
|
154
|
+
attr_reader :service
|
159
155
|
# Global events dispatcher. This will provides our primary mechanism
|
160
156
|
# for agent-wide events, such as finishing configuration, error notification
|
161
157
|
# and request before/after from Rack.
|
@@ -168,8 +164,6 @@ module NewRelic
|
|
168
164
|
# collector on connect. The former are applied during txns,
|
169
165
|
# the latter during harvest.
|
170
166
|
attr_accessor :transaction_rules
|
171
|
-
# Responsible for restarting the harvest thread
|
172
|
-
attr_reader :harvester
|
173
167
|
# GC::Profiler.total_time is not monotonic so we wrap it.
|
174
168
|
attr_reader :monotonic_gc_profiler
|
175
169
|
attr_reader :custom_event_aggregator
|
@@ -178,7 +172,6 @@ module NewRelic
|
|
178
172
|
attr_reader :transaction_event_recorder
|
179
173
|
attr_reader :attribute_filter
|
180
174
|
attr_reader :adaptive_sampler
|
181
|
-
attr_reader :environment_report
|
182
175
|
|
183
176
|
def transaction_event_aggregator
|
184
177
|
@transaction_event_recorder.transaction_event_aggregator
|
@@ -262,8 +255,8 @@ module NewRelic
|
|
262
255
|
# if litespeed, then ignore all future SIGUSR1 - it's
|
263
256
|
# litespeed trying to shut us down
|
264
257
|
if Agent.config[:dispatcher] == :litespeed
|
265
|
-
Signal.trap(
|
266
|
-
Signal.trap(
|
258
|
+
Signal.trap('SIGUSR1', 'IGNORE')
|
259
|
+
Signal.trap('SIGTERM', 'IGNORE')
|
267
260
|
end
|
268
261
|
end
|
269
262
|
|
@@ -355,12 +348,6 @@ module NewRelic
|
|
355
348
|
end
|
356
349
|
|
357
350
|
public :merge_data_for_endpoint
|
358
|
-
|
359
|
-
# Delegates to the control class to determine the root
|
360
|
-
# directory of this project
|
361
|
-
def determine_home_directory
|
362
|
-
control.root
|
363
|
-
end
|
364
351
|
end
|
365
352
|
|
366
353
|
extend ClassMethods
|
@@ -64,7 +64,7 @@ module NewRelic
|
|
64
64
|
def handle_license_error(error)
|
65
65
|
::NewRelic::Agent.logger.error( \
|
66
66
|
error.message, \
|
67
|
-
|
67
|
+
'Visit NewRelic.com to obtain a valid license key, or to upgrade your account.'
|
68
68
|
)
|
69
69
|
disconnect
|
70
70
|
end
|
@@ -115,7 +115,7 @@ module NewRelic
|
|
115
115
|
::NewRelic::Agent.logger.debug("Connected to NewRelic Service at #{@service.collector.name}")
|
116
116
|
::NewRelic::Agent.logger.debug("Agent Run = #{@service.agent_id}.")
|
117
117
|
::NewRelic::Agent.logger.debug("Connection data = #{config_data.inspect}")
|
118
|
-
if config_data['messages']
|
118
|
+
if config_data['messages']&.any?
|
119
119
|
log_collector_messages(config_data['messages'])
|
120
120
|
end
|
121
121
|
end
|
@@ -126,11 +126,6 @@ module NewRelic
|
|
126
126
|
end
|
127
127
|
end
|
128
128
|
|
129
|
-
# apdex_f is always 4 times the apdex_t
|
130
|
-
def apdex_f
|
131
|
-
(Agent.config[:apdex_t] * 4).to_f
|
132
|
-
end
|
133
|
-
|
134
129
|
class WaitOnConnectTimeout < StandardError
|
135
130
|
end
|
136
131
|
|
@@ -149,7 +144,7 @@ module NewRelic
|
|
149
144
|
return if connected?
|
150
145
|
|
151
146
|
@waited_on_connect = true
|
152
|
-
NewRelic::Agent.logger.debug(
|
147
|
+
NewRelic::Agent.logger.debug('Waiting on connect to complete.')
|
153
148
|
|
154
149
|
@wait_on_connect_mutex.synchronize do
|
155
150
|
@wait_on_connect_condition.wait(@wait_on_connect_mutex, timeout)
|
@@ -162,7 +157,7 @@ module NewRelic
|
|
162
157
|
|
163
158
|
def connect_options(options)
|
164
159
|
{
|
165
|
-
keep_retrying:
|
160
|
+
keep_retrying: true,
|
166
161
|
force_reconnect: Agent.config[:force_reconnect]
|
167
162
|
}.merge(options)
|
168
163
|
end
|
@@ -203,7 +198,7 @@ module NewRelic
|
|
203
198
|
rescue StandardError, Timeout::Error, NewRelic::Agent::ServerConnectionException => e
|
204
199
|
retry if retry_from_error?(e, opts)
|
205
200
|
rescue Exception => e
|
206
|
-
::NewRelic::Agent.logger.error(
|
201
|
+
::NewRelic::Agent.logger.error('Exception of unexpected type during Agent#connect():', e)
|
207
202
|
|
208
203
|
raise
|
209
204
|
end
|
@@ -133,18 +133,18 @@ module NewRelic
|
|
133
133
|
rescue ForceRestartException, ForceDisconnectException
|
134
134
|
raise
|
135
135
|
rescue UnrecoverableServerException => e
|
136
|
-
NewRelic::Agent.logger.warn(
|
137
|
-
|
136
|
+
NewRelic::Agent.logger.warn('get_agent_commands message was rejected by remote service, discarding. ' \
|
137
|
+
'Error: ', e)
|
138
138
|
rescue ServerConnectionException => e
|
139
139
|
log_remote_unavailable(:get_agent_commands, e)
|
140
140
|
rescue => e
|
141
|
-
NewRelic::Agent.logger.info(
|
141
|
+
NewRelic::Agent.logger.info('Error during check_for_and_handle_agent_commands, will retry later: ', e)
|
142
142
|
end
|
143
143
|
end
|
144
144
|
|
145
145
|
def log_remote_unavailable(endpoint, e)
|
146
146
|
NewRelic::Agent.logger.debug("Unable to send #{endpoint} data, will try again later. Error: ", e)
|
147
|
-
NewRelic::Agent.record_metric(
|
147
|
+
NewRelic::Agent.record_metric('Supportability/remote_unavailable', 0.0)
|
148
148
|
NewRelic::Agent.record_metric("Supportability/remote_unavailable/#{endpoint.to_s}", 0.0)
|
149
149
|
end
|
150
150
|
end
|
@@ -11,7 +11,7 @@ module NewRelic
|
|
11
11
|
def shutdown
|
12
12
|
return unless started?
|
13
13
|
|
14
|
-
::NewRelic::Agent.logger.info(
|
14
|
+
::NewRelic::Agent.logger.info('Starting Agent shutdown')
|
15
15
|
|
16
16
|
stop_event_loop
|
17
17
|
trap_signals_for_litespeed
|
@@ -48,22 +48,22 @@ module NewRelic
|
|
48
48
|
transmit_data_types
|
49
49
|
shutdown_service
|
50
50
|
|
51
|
-
::NewRelic::Agent.logger.debug(
|
51
|
+
::NewRelic::Agent.logger.debug('Graceful disconnect complete')
|
52
52
|
rescue Timeout::Error, StandardError => e
|
53
53
|
::NewRelic::Agent.logger.debug("Error when disconnecting #{e.class.name}: #{e.message}")
|
54
54
|
end
|
55
55
|
else
|
56
|
-
::NewRelic::Agent.logger.debug(
|
56
|
+
::NewRelic::Agent.logger.debug('Bypassing graceful disconnect - agent not connected')
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
60
60
|
def shutdown_service
|
61
61
|
if @connected_pid == $$ && !@service.kind_of?(NewRelic::Agent::NewRelicService)
|
62
|
-
::NewRelic::Agent.logger.debug(
|
62
|
+
::NewRelic::Agent.logger.debug('Sending New Relic service agent run shutdown message')
|
63
63
|
@service.shutdown
|
64
64
|
else
|
65
65
|
::NewRelic::Agent.logger.debug("This agent connected from parent process #{@connected_pid}--not sending " \
|
66
|
-
|
66
|
+
'shutdown')
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
@@ -10,9 +10,8 @@ module NewRelic
|
|
10
10
|
# requests, we need to wait until the children are forked
|
11
11
|
# before connecting, otherwise the parent process sends useless data
|
12
12
|
def using_forking_dispatcher?
|
13
|
-
|
14
|
-
|
15
|
-
::NewRelic::Agent.logger.info("Deferring startup of agent reporting thread because " \
|
13
|
+
if [:puma, :passenger, :unicorn].include?(Agent.config[:dispatcher])
|
14
|
+
::NewRelic::Agent.logger.info('Deferring startup of agent reporting thread because ' \
|
16
15
|
"#{Agent.config[:dispatcher]} may fork.")
|
17
16
|
true
|
18
17
|
else
|
@@ -66,7 +65,7 @@ module NewRelic
|
|
66
65
|
def install_exit_handler
|
67
66
|
return unless should_install_exit_handler?
|
68
67
|
|
69
|
-
NewRelic::Agent.logger.debug(
|
68
|
+
NewRelic::Agent.logger.debug('Installing at_exit handler')
|
70
69
|
at_exit { shutdown }
|
71
70
|
end
|
72
71
|
end
|
@@ -8,23 +8,23 @@ module NewRelic
|
|
8
8
|
module StartWorkerThread
|
9
9
|
LOG_ONCE_KEYS_RESET_PERIOD = 60.0
|
10
10
|
|
11
|
-
TRANSACTION_EVENT_DATA =
|
12
|
-
CUSTOM_EVENT_DATA =
|
13
|
-
ERROR_EVENT_DATA =
|
14
|
-
SPAN_EVENT_DATA =
|
15
|
-
LOG_EVENT_DATA =
|
11
|
+
TRANSACTION_EVENT_DATA = 'transaction_event_data'.freeze
|
12
|
+
CUSTOM_EVENT_DATA = 'custom_event_data'.freeze
|
13
|
+
ERROR_EVENT_DATA = 'error_event_data'.freeze
|
14
|
+
SPAN_EVENT_DATA = 'span_event_data'.freeze
|
15
|
+
LOG_EVENT_DATA = 'log_event_data'.freeze
|
16
16
|
|
17
17
|
# Try to launch the worker thread and connect to the server.
|
18
18
|
#
|
19
19
|
# See #connect for a description of connection_options.
|
20
20
|
def start_worker_thread(connection_options = {})
|
21
21
|
if disable = NewRelic::Agent.config[:disable_harvest_thread]
|
22
|
-
NewRelic::Agent.logger.info(
|
22
|
+
NewRelic::Agent.logger.info('Not starting Ruby Agent worker thread because :disable_harvest_thread is ' \
|
23
23
|
"#{disable}")
|
24
24
|
return
|
25
25
|
end
|
26
26
|
|
27
|
-
::NewRelic::Agent.logger.debug(
|
27
|
+
::NewRelic::Agent.logger.debug('Creating Ruby Agent worker thread.')
|
28
28
|
@worker_thread = Threading::AgentThread.create('Worker Loop') do
|
29
29
|
deferred_work!(connection_options)
|
30
30
|
end
|
@@ -42,11 +42,11 @@ module NewRelic
|
|
42
42
|
# The use-case where this typically arises is in cronjob scheduled rake tasks where there's
|
43
43
|
# also some network stability/latency issues happening.
|
44
44
|
def stop_event_loop
|
45
|
-
@event_loop
|
45
|
+
@event_loop&.stop
|
46
46
|
# Wait the end of the event loop thread.
|
47
47
|
if @worker_thread
|
48
48
|
unless @worker_thread.join(3)
|
49
|
-
::NewRelic::Agent.logger.debug(
|
49
|
+
::NewRelic::Agent.logger.debug('Event loop thread did not stop within 3 seconds')
|
50
50
|
end
|
51
51
|
end
|
52
52
|
end
|
@@ -60,36 +60,13 @@ module NewRelic
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def create_and_run_event_loop
|
63
|
-
data_harvest = :"#{Agent.config[:data_report_period]}_second_harvest"
|
64
|
-
event_harvest = :"#{Agent.config[:event_report_period]}_second_harvest"
|
65
|
-
|
66
63
|
@event_loop = create_event_loop
|
64
|
+
data_harvest = :"#{Agent.config[:data_report_period]}_second_harvest"
|
67
65
|
@event_loop.on(data_harvest) do
|
68
66
|
transmit_data
|
69
67
|
end
|
70
|
-
|
71
|
-
|
72
|
-
transmit_analytic_event_data
|
73
|
-
end
|
74
|
-
@event_loop.on(interval_for(CUSTOM_EVENT_DATA)) do
|
75
|
-
transmit_custom_event_data
|
76
|
-
end
|
77
|
-
@event_loop.on(interval_for(ERROR_EVENT_DATA)) do
|
78
|
-
transmit_error_event_data
|
79
|
-
end
|
80
|
-
@event_loop.on(interval_for(SPAN_EVENT_DATA)) do
|
81
|
-
transmit_span_event_data
|
82
|
-
end
|
83
|
-
@event_loop.on(interval_for(LOG_EVENT_DATA)) do
|
84
|
-
transmit_log_event_data
|
85
|
-
end
|
86
|
-
|
87
|
-
@event_loop.on(:reset_log_once_keys) do
|
88
|
-
::NewRelic::Agent.logger.clear_already_logged
|
89
|
-
end
|
90
|
-
@event_loop.fire_every(Agent.config[:data_report_period], data_harvest)
|
91
|
-
@event_loop.fire_every(Agent.config[:event_report_period], event_harvest)
|
92
|
-
@event_loop.fire_every(LOG_ONCE_KEYS_RESET_PERIOD, :reset_log_once_keys)
|
68
|
+
establish_interval_transmissions
|
69
|
+
establish_fire_everies(data_harvest)
|
93
70
|
|
94
71
|
@event_loop.run
|
95
72
|
end
|
@@ -100,7 +77,7 @@ module NewRelic
|
|
100
77
|
def handle_force_restart(error)
|
101
78
|
::NewRelic::Agent.logger.debug(error.message)
|
102
79
|
drop_buffered_data
|
103
|
-
@service
|
80
|
+
@service&.force_restart
|
104
81
|
@connect_state = :pending
|
105
82
|
sleep(30)
|
106
83
|
end
|
@@ -109,7 +86,7 @@ module NewRelic
|
|
109
86
|
# is the worker thread that gathers data and talks to the
|
110
87
|
# server.
|
111
88
|
def handle_force_disconnect(error)
|
112
|
-
::NewRelic::Agent.logger.warn(
|
89
|
+
::NewRelic::Agent.logger.warn('Agent received a ForceDisconnectException from the server, disconnecting. ' \
|
113
90
|
"(#{error.message})")
|
114
91
|
disconnect
|
115
92
|
end
|
@@ -118,7 +95,7 @@ module NewRelic
|
|
118
95
|
# it and disconnecting the agent, since we are now in an
|
119
96
|
# unknown state.
|
120
97
|
def handle_other_error(error)
|
121
|
-
::NewRelic::Agent.logger.error(
|
98
|
+
::NewRelic::Agent.logger.error('Unhandled error in worker thread, disconnecting.')
|
122
99
|
# These errors are fatal (that is, they will prevent the agent from
|
123
100
|
# reporting entirely), so we really want backtraces when they happen
|
124
101
|
::NewRelic::Agent.logger.log_exception(:error, error)
|
@@ -156,11 +133,42 @@ module NewRelic
|
|
156
133
|
# never reaches here unless there is a problem or
|
157
134
|
# the agent is exiting
|
158
135
|
else
|
159
|
-
::NewRelic::Agent.logger.debug(
|
136
|
+
::NewRelic::Agent.logger.debug('No connection. Worker thread ending.')
|
160
137
|
end
|
161
138
|
end
|
162
139
|
end
|
163
140
|
end
|
141
|
+
|
142
|
+
private
|
143
|
+
|
144
|
+
def establish_interval_transmissions
|
145
|
+
@event_loop.on(interval_for(TRANSACTION_EVENT_DATA)) do
|
146
|
+
transmit_analytic_event_data
|
147
|
+
end
|
148
|
+
@event_loop.on(interval_for(CUSTOM_EVENT_DATA)) do
|
149
|
+
transmit_custom_event_data
|
150
|
+
end
|
151
|
+
@event_loop.on(interval_for(ERROR_EVENT_DATA)) do
|
152
|
+
transmit_error_event_data
|
153
|
+
end
|
154
|
+
@event_loop.on(interval_for(SPAN_EVENT_DATA)) do
|
155
|
+
transmit_span_event_data
|
156
|
+
end
|
157
|
+
@event_loop.on(interval_for(LOG_EVENT_DATA)) do
|
158
|
+
transmit_log_event_data
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def establish_fire_everies(data_harvest)
|
163
|
+
@event_loop.on(:reset_log_once_keys) do
|
164
|
+
::NewRelic::Agent.logger.clear_already_logged
|
165
|
+
end
|
166
|
+
|
167
|
+
event_harvest = :"#{Agent.config[:event_report_period]}_second_harvest"
|
168
|
+
@event_loop.fire_every(Agent.config[:data_report_period], data_harvest)
|
169
|
+
@event_loop.fire_every(Agent.config[:event_report_period], event_harvest)
|
170
|
+
@event_loop.fire_every(LOG_ONCE_KEYS_RESET_PERIOD, :reset_log_once_keys)
|
171
|
+
end
|
164
172
|
end
|
165
173
|
end
|
166
174
|
end
|