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
@@ -0,0 +1,144 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative '../../new_relic/agent/configuration/default_source'
|
6
|
+
|
7
|
+
module NewRelicYML
|
8
|
+
CRITICAL = [:'agent_enabled', :'app_name', :'license_key', :'log_level']
|
9
|
+
DEFAULTS = NewRelic::Agent::Configuration::DEFAULTS
|
10
|
+
# Skip because not configurable via yml
|
11
|
+
SKIP = [:'defer_rails_initialization']
|
12
|
+
# Don't evaluate Procs, instead use set values
|
13
|
+
PROCS = {:'config_path' => 'newrelic.yml',
|
14
|
+
:'process_host.display_name' => 'default hostname',
|
15
|
+
:'transaction_tracer.transaction_threshold' => 1.0}
|
16
|
+
|
17
|
+
HEADER = <<~HEADER
|
18
|
+
#
|
19
|
+
# This file configures the New Relic Agent. New Relic monitors Ruby, Java,
|
20
|
+
# .NET, PHP, Python, Node, and Go applications with deep visibility and low
|
21
|
+
# overhead. For more information, visit www.newrelic.com.
|
22
|
+
|
23
|
+
# Generated <%= Time.now.strftime('%B %d, %Y') %><%= ", for version \#{@agent_version}" if @agent_version %>
|
24
|
+
#<%= "\\n# \#{generated_for_user}\\n#" if generated_for_user %>
|
25
|
+
# For full documentation of agent configuration options, please refer to
|
26
|
+
# https://docs.newrelic.com/docs/agents/ruby-agent/installation-configuration/ruby-agent-configuration
|
27
|
+
|
28
|
+
common: &default_settings
|
29
|
+
# Required license key associated with your New Relic account.
|
30
|
+
license_key: <%= license_key %>
|
31
|
+
|
32
|
+
# Your application name. Renaming here affects where data displays in New
|
33
|
+
# Relic. For more details, see https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/renaming-applications
|
34
|
+
app_name: <%= app_name %>
|
35
|
+
|
36
|
+
# To disable the agent regardless of other settings, uncomment the following:
|
37
|
+
# agent_enabled: false
|
38
|
+
|
39
|
+
# Logging level for log/newrelic_agent.log; options are error, warn, info, or
|
40
|
+
# debug.
|
41
|
+
log_level: info
|
42
|
+
|
43
|
+
# All of the following configuration options are optional. Review them, and
|
44
|
+
# uncomment or edit them if they appear relevant to your application needs.
|
45
|
+
|
46
|
+
HEADER
|
47
|
+
|
48
|
+
FOOTER = <<~FOOTER
|
49
|
+
# Environment-specific settings are in this section.
|
50
|
+
# RAILS_ENV or RACK_ENV (as appropriate) is used to determine the environment.
|
51
|
+
# If your application has other named environments, configure them here.
|
52
|
+
development:
|
53
|
+
<<: *default_settings
|
54
|
+
app_name: <%= app_name %> (Development)
|
55
|
+
|
56
|
+
test:
|
57
|
+
<<: *default_settings
|
58
|
+
# It doesn't make sense to report to New Relic from automated test runs.
|
59
|
+
monitor_mode: false
|
60
|
+
|
61
|
+
staging:
|
62
|
+
<<: *default_settings
|
63
|
+
app_name: <%= app_name %> (Staging)
|
64
|
+
|
65
|
+
production:
|
66
|
+
<<: *default_settings
|
67
|
+
FOOTER
|
68
|
+
|
69
|
+
def self.get_configs(defaults)
|
70
|
+
defaults.sort.each_with_object({}) do |(key, value), final_configs|
|
71
|
+
next if CRITICAL.include?(key) || SKIP.include?(key)
|
72
|
+
|
73
|
+
next unless public_config?(value) && !deprecated?(value)
|
74
|
+
|
75
|
+
sanitized_description = sanitize_description(value[:description])
|
76
|
+
description = format_description(sanitized_description)
|
77
|
+
default = default_value(key, value)
|
78
|
+
final_configs[key] = {description: description, default: default}
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.public_config?(value)
|
83
|
+
value[:public] == true
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.deprecated?(value)
|
87
|
+
value[:deprecated] == true
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.sanitize_description(description)
|
91
|
+
# remove callouts
|
92
|
+
description = description.split("\n").reject { |line| line.match?('</?Callout') }.join("\n")
|
93
|
+
# remove InlinePopover, keep the text inside type
|
94
|
+
description.gsub!(/<InlinePopover type="(.*)" \/>/, '\1')
|
95
|
+
# remove hyperlinks
|
96
|
+
description.gsub!(/\[([^\]]+)\]\([^\)]+\)/, '\1')
|
97
|
+
# remove single pairs of backticks
|
98
|
+
description.gsub!(/`([^`]+)`/, '\1')
|
99
|
+
# removed href links
|
100
|
+
description.gsub!(/<a href="(.*)">(.*)<\/a>/, '\2')
|
101
|
+
|
102
|
+
description
|
103
|
+
end
|
104
|
+
|
105
|
+
def self.format_description(description)
|
106
|
+
# remove leading and trailing whitespace
|
107
|
+
description.strip!
|
108
|
+
# wrap text after 80 characters
|
109
|
+
description.gsub!(/(.{1,80})(\s+|\Z)/, "\\1\n")
|
110
|
+
# add hashtags to lines
|
111
|
+
description = description.split("\n").map { |line| " # #{line}" }.join("\n")
|
112
|
+
|
113
|
+
description
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.default_value(key, config_hash)
|
117
|
+
if PROCS.include?(key)
|
118
|
+
PROCS[key]
|
119
|
+
else
|
120
|
+
default = config_hash[:documentation_default].nil? ? config_hash[:default] : config_hash[:documentation_default]
|
121
|
+
default = 'nil' if default.nil?
|
122
|
+
default = '""' if default == ''
|
123
|
+
|
124
|
+
default
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.build_string(defaults)
|
129
|
+
configs = get_configs(defaults)
|
130
|
+
yml_string = ''
|
131
|
+
|
132
|
+
configs.each do |key, value|
|
133
|
+
yml_string += "#{value[:description]}\n # #{key}: #{value[:default]}\n\n"
|
134
|
+
end
|
135
|
+
|
136
|
+
yml_string
|
137
|
+
end
|
138
|
+
|
139
|
+
# :nocov:
|
140
|
+
def self.write_file(defaults = DEFAULTS)
|
141
|
+
File.write('newrelic.yml', HEADER + build_string(defaults) + FOOTER)
|
142
|
+
end
|
143
|
+
# :nocov:
|
144
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
module VersionBump
|
6
|
+
MAJOR = 0
|
7
|
+
MINOR = 1
|
8
|
+
TINY = 2
|
9
|
+
VERSION = {major: MAJOR, minor: MINOR, tiny: TINY}
|
10
|
+
|
11
|
+
# Updates version.rb with new version number
|
12
|
+
def self.update_version
|
13
|
+
bump_type = determine_bump_type
|
14
|
+
file = read_file('lib/new_relic/version.rb')
|
15
|
+
new_version = {}
|
16
|
+
|
17
|
+
VERSION.each do |key, current|
|
18
|
+
file.gsub!(/(#{key.to_s.upcase} = )(\d+)/) do
|
19
|
+
match = Regexp.last_match
|
20
|
+
|
21
|
+
new_version[key] = if bump_type == current # bump type, increase by 1
|
22
|
+
match[2].to_i + 1
|
23
|
+
elsif bump_type < current # right of bump type, goes to 0
|
24
|
+
0
|
25
|
+
else # left of bump type, stays the same
|
26
|
+
match[2].to_i
|
27
|
+
end
|
28
|
+
|
29
|
+
match[1] + new_version[key].to_s
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
write_file('lib/new_relic/version.rb', file)
|
34
|
+
new_version.values.join('.')
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.read_file(path)
|
38
|
+
File.read(File.expand_path(path))
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.write_file(path, file)
|
42
|
+
File.write(File.expand_path(path), file)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Determined version based on if changelog has a feature or not for version
|
46
|
+
def self.determine_bump_type
|
47
|
+
file = read_file('CHANGELOG.md')
|
48
|
+
lines = file.split('## ')[1].split('- **')
|
49
|
+
return MAJOR if lines.first.include?('Major version')
|
50
|
+
return MINOR if lines.any? { |line| line.include?('Feature:') }
|
51
|
+
|
52
|
+
TINY
|
53
|
+
end
|
54
|
+
|
55
|
+
# Replace dev with version number in changelog
|
56
|
+
def self.update_changelog(version)
|
57
|
+
file = read_file('CHANGELOG.md')
|
58
|
+
file.gsub!('## dev', "## v#{version}")
|
59
|
+
file.gsub!('Version <dev>', "Version #{version}")
|
60
|
+
write_file('CHANGELOG.md', file)
|
61
|
+
end
|
62
|
+
end
|
data/lib/tasks/install.rake
CHANGED
@@ -3,13 +3,13 @@
|
|
3
3
|
# frozen_string_literal: true
|
4
4
|
|
5
5
|
namespace :newrelic do
|
6
|
-
desc
|
6
|
+
desc 'Install a default config/newrelic.yml file'
|
7
7
|
task :install do
|
8
|
-
load File.expand_path(File.join(File.dirname(__FILE__),
|
8
|
+
load File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'install.rb'))
|
9
9
|
end
|
10
10
|
|
11
|
-
desc
|
11
|
+
desc 'Gratefulness is always appreciated'
|
12
12
|
task :thanks do
|
13
|
-
puts
|
13
|
+
puts 'The Ruby agent team is grateful to Jim Weirich for his kindness and his code. He will be missed.'
|
14
14
|
end
|
15
15
|
end
|
@@ -14,7 +14,7 @@ class Instrumentation < Thor
|
|
14
14
|
NEWRELIC_YML_LOCATION = 'newrelic.yml'
|
15
15
|
|
16
16
|
desc('scaffold NAME', 'Scaffold the required files for adding new instrumentation')
|
17
|
-
long_desc
|
17
|
+
long_desc <<~LONGDESC
|
18
18
|
`instrumentation scaffold` requires one parameter by default: the name of the
|
19
19
|
library or class you are instrumenting. This task generates the basic
|
20
20
|
file structure needed to add new instrumentation to the Ruby agent.
|
@@ -82,7 +82,7 @@ class Instrumentation < Thor
|
|
82
82
|
insert_into_file(
|
83
83
|
DEFAULT_SOURCE_LOCATION,
|
84
84
|
config_block(name.downcase),
|
85
|
-
after: ":description => 'Controls auto-instrumentation of bunny at start
|
85
|
+
after: ":description => 'Controls auto-instrumentation of bunny at start-up. May be one of [auto|prepend|chain|disabled].'
|
86
86
|
},\n"
|
87
87
|
)
|
88
88
|
end
|
@@ -96,28 +96,25 @@ class Instrumentation < Thor
|
|
96
96
|
end
|
97
97
|
|
98
98
|
def config_block(name)
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
99
|
+
<<~CONFIG
|
100
|
+
:'instrumentation.#{name.downcase}' => {
|
101
|
+
:default => 'auto',
|
102
|
+
:public => true,
|
103
|
+
:type => String,
|
104
|
+
:dynamic_name => true,
|
105
|
+
:allowed_from_server => false,
|
106
|
+
:description => 'Controls auto-instrumentation of the #{name} library at start-up. May be one of [auto|prepend|chain|disabled].'
|
107
|
+
},
|
108
108
|
CONFIG
|
109
109
|
end
|
110
110
|
|
111
|
-
# TODO: OLD RUBIES - RUBY_VERSION 2.2
|
112
|
-
# When we only support 2.3+ this can be changed to a sqiggle heredoc (<<~)
|
113
|
-
# and use standard indentation
|
114
111
|
def yaml_block(name)
|
115
|
-
|
112
|
+
<<~HEREDOC
|
116
113
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
HEREDOC
|
114
|
+
# Controls auto-instrumentation of #{name} at start-up.
|
115
|
+
# May be one of [auto|prepend|chain|disabled]
|
116
|
+
# instrumentation.#{name.downcase}: auto
|
117
|
+
HEREDOC
|
121
118
|
end
|
122
119
|
end
|
123
120
|
|
@@ -23,7 +23,7 @@ DependencyDetection.defer do
|
|
23
23
|
if use_prepend?
|
24
24
|
prepend_instrument ::<%= @class_name %>, NewRelic::Agent::Instrumentation::<%= @class_name %>::Prepend
|
25
25
|
else
|
26
|
-
chain_instrument NewRelic::Agent::Instrumentation::<%= @class_name
|
26
|
+
chain_instrument NewRelic::Agent::Instrumentation::<%= @class_name %>::Chain
|
27
27
|
end
|
28
28
|
end
|
29
29
|
end
|
data/lib/tasks/newrelic.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
# This file is distributed under New Relic's license terms.
|
2
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
3
|
# frozen_string_literal: true
|
4
|
+
|
4
5
|
#
|
5
6
|
# If you are looking to instrument rake tasks in a Rails environment, but the
|
6
7
|
# task doesn't depend on :environment, this task may be included to ensure that
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative 'helpers/newrelicyml'
|
6
|
+
|
7
|
+
namespace :newrelic do
|
8
|
+
desc 'Update newrelic.yml with latest config options from default_source.rb'
|
9
|
+
task :update_newrelicyml do
|
10
|
+
NewRelicYML.write_file
|
11
|
+
puts 'newrelic.yml updated'
|
12
|
+
end
|
13
|
+
end
|
data/lib/tasks/tests.rake
CHANGED
@@ -11,21 +11,92 @@ rescue LoadError
|
|
11
11
|
end
|
12
12
|
|
13
13
|
if defined? Rake::TestTask
|
14
|
+
def name_for_number(content, number)
|
15
|
+
(number - 1).downto(0).each do |i|
|
16
|
+
return Regexp.last_match(1) if content[i] =~ /^\s*def (test_.+)\s*$/
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def info_from_test_var
|
21
|
+
return {} unless ENV['TEST'].to_s =~ /^(.+)((?::\d+)+)/
|
22
|
+
|
23
|
+
file = Regexp.last_match(1)
|
24
|
+
numbers = Regexp.last_match(2).split(':').reject(&:empty?).uniq.map(&:to_i)
|
25
|
+
abs = File.expand_path(File.join('../../..', file), __FILE__)
|
26
|
+
raise "File >>#{abs}<< does not exist!" unless File.exist?(abs)
|
27
|
+
|
28
|
+
content = File.read(abs).split("\n")
|
29
|
+
{file: file, numbers: numbers, content: content}
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_names_from_test_file(info)
|
33
|
+
info[:numbers].each_with_object([]) do |number, names|
|
34
|
+
name = name_for_number(info[:content], number)
|
35
|
+
unless name
|
36
|
+
warn "Unable to determine a test name given line >>#{number}<< for file >>#{info[:file]}<<"
|
37
|
+
next
|
38
|
+
end
|
39
|
+
names << name
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Allow ENV['TEST'] to be set to a test file path with one or more
|
44
|
+
# `:<line number>` patterns on the end of it.
|
45
|
+
#
|
46
|
+
# For example:
|
47
|
+
# TEST=test/new_relic/agent/autostart_test.rb:57 bundle exec rake test
|
48
|
+
#
|
49
|
+
# The `autostart_test.rb` file will be read, and starting from line 57 and
|
50
|
+
# working upwards in the file (downwards by line number), a test definition
|
51
|
+
# will be searched for that matches `def test_<rest of the test name>`.
|
52
|
+
#
|
53
|
+
# Multiple line numbers can be specified like so:
|
54
|
+
# TEST=test/new_relic/agent/autostart_test.rb:57:26 bundle exec rake test
|
55
|
+
#
|
56
|
+
# For this multiple line number based example, both lines 57 and 26 will
|
57
|
+
# serve as separate starting points for the search for a test name.
|
58
|
+
#
|
59
|
+
# All test names that are discovered will be "ORed" into a regex pattern with
|
60
|
+
# pipes ('|') that is passed to Minitest via
|
61
|
+
# `TESTOPTS="--name='test_name1|test_name2'"`
|
62
|
+
#
|
63
|
+
# Once a line with one or more `:<line number>` values on the end of it has
|
64
|
+
# been found, replace the value of ENV['TEST'] with the path leading up to
|
65
|
+
# the first colon before invoking Minitest.
|
66
|
+
#
|
67
|
+
# Why refer to a test by line number instead of just supplying the name
|
68
|
+
# directly? The primary use case is text editor integration. A text editor
|
69
|
+
# can be taught to "run the single unit test containing the line the cursor is
|
70
|
+
# on" by building a string containing the path to the file, a colon, (':'),
|
71
|
+
# and the line number.
|
72
|
+
def process_line_numbers
|
73
|
+
info = info_from_test_var
|
74
|
+
return unless info.key?(:file)
|
75
|
+
|
76
|
+
test_names = test_names_from_test_file(info)
|
77
|
+
raise "Could not determine any test names for file >>#{abs}<< given numbers >>#{numbers}" if test_names.empty?
|
78
|
+
|
79
|
+
ENV['TESTOPTS'] = "#{ENV['TESTOPTS']} --name='#{test_names.map { |n| Regexp.escape(n) }.join('|')}'"
|
80
|
+
ENV['TEST'] = info[:file]
|
81
|
+
end
|
82
|
+
|
14
83
|
namespace :test do
|
15
84
|
tasks = Rake.application.top_level_tasks
|
16
|
-
ENV[
|
17
|
-
if tasks.any? { |t| t.include?(
|
18
|
-
ENV[
|
85
|
+
ENV['TESTOPTS'] ||= ''
|
86
|
+
if tasks.any? { |t| t.include?('verbose') }
|
87
|
+
ENV['TESTOPTS'] += ' -v'
|
19
88
|
end
|
20
89
|
if seed = look_for_seed(tasks)
|
21
|
-
ENV[
|
90
|
+
ENV['TESTOPTS'] += ' --' + seed
|
22
91
|
end
|
23
92
|
|
93
|
+
process_line_numbers
|
94
|
+
|
24
95
|
agent_home = File.expand_path(File.join(File.dirname(__FILE__), '..', '..'))
|
25
96
|
|
26
97
|
Rake::TestTask.new(:newrelic) do |t|
|
27
|
-
file_pattern = ENV[
|
28
|
-
file_pattern = file_pattern.split(
|
98
|
+
file_pattern = ENV['file']
|
99
|
+
file_pattern = file_pattern.split(',').map { |f| "#{agent_home}/#{f}".gsub('//', '/') } if file_pattern
|
29
100
|
file_pattern ||= "#{agent_home}/test/new_relic/**/*_test.rb"
|
30
101
|
|
31
102
|
t.libs << "#{agent_home}/test"
|