newrelic_rpm 4.8.0.341 → 6.13.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.github/ISSUE_TEMPLATE/bug_report.md +31 -0
- data/.github/ISSUE_TEMPLATE/config.yml +5 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +24 -0
- data/.github/actions/annotate/README.md +79 -0
- data/.github/actions/annotate/action.yml +6 -0
- data/.github/actions/annotate/dist/index.js +433 -0
- data/.github/actions/annotate/index.js +25 -0
- data/.github/actions/annotate/package-lock.json +172 -0
- data/.github/actions/annotate/package.json +30 -0
- data/.github/actions/annotate/pre-commit +5 -0
- data/.github/actions/build-ruby/README.md +79 -0
- data/.github/actions/build-ruby/action.yml +15 -0
- data/.github/actions/build-ruby/dist/index.js +52683 -0
- data/.github/actions/build-ruby/index.js +514 -0
- data/.github/actions/build-ruby/package-lock.json +581 -0
- data/.github/actions/build-ruby/package.json +32 -0
- data/.github/actions/build-ruby/pre-commit +5 -0
- data/.github/pull_request_template.md +16 -0
- data/.github/workflows/ci.yml +212 -0
- data/.github/workflows/pr_review_checklist.yml +22 -0
- data/.github/workflows/release.yml +78 -0
- data/.github/workflows/scripts/rubygems-authenticate.py +13 -0
- data/.github/workflows/scripts/rubygems-publish.rb +32 -0
- data/.github/workflows/snyk.yml +27 -0
- data/.github/workflows/stale.yml +21 -0
- data/.gitignore +9 -0
- data/.yardopts +4 -1
- data/CHANGELOG.md +868 -3
- data/CONTRIBUTING.md +106 -19
- data/Gemfile +6 -2
- data/Guardfile +18 -1
- data/LICENSE +208 -38
- data/README.md +81 -88
- data/ROADMAP.md +24 -0
- data/Rakefile +2 -0
- data/THIRD_PARTY_NOTICES.md +213 -0
- data/bin/nrdebug +1 -1
- data/config.dot +3 -12
- data/init.rb +1 -1
- data/install.rb +1 -1
- data/lib/new_relic/agent.rb +145 -31
- data/lib/new_relic/agent/adaptive_sampler.rb +104 -0
- data/lib/new_relic/agent/agent.rb +192 -190
- data/lib/new_relic/agent/agent_logger.rb +5 -1
- data/lib/new_relic/agent/attribute_filter.rb +85 -25
- data/lib/new_relic/agent/attribute_processing.rb +1 -1
- data/lib/new_relic/agent/attributes.rb +152 -0
- data/lib/new_relic/agent/audit_logger.rb +1 -1
- data/lib/new_relic/agent/autostart.rb +20 -15
- data/lib/new_relic/agent/chained_call.rb +1 -1
- data/lib/new_relic/agent/commands/agent_command.rb +1 -1
- data/lib/new_relic/agent/commands/agent_command_router.rb +3 -22
- data/lib/new_relic/agent/commands/thread_profiler_session.rb +1 -1
- data/lib/new_relic/agent/configuration.rb +1 -1
- data/lib/new_relic/agent/configuration/default_source.rb +375 -67
- data/lib/new_relic/agent/configuration/dotted_hash.rb +1 -1
- data/lib/new_relic/agent/configuration/environment_source.rb +5 -3
- data/lib/new_relic/agent/configuration/event_harvest_config.rb +45 -0
- data/lib/new_relic/agent/configuration/high_security_source.rb +2 -3
- data/lib/new_relic/agent/configuration/manager.rb +54 -43
- data/lib/new_relic/agent/configuration/manual_source.rb +1 -1
- data/lib/new_relic/agent/configuration/mask_defaults.rb +1 -1
- data/lib/new_relic/agent/configuration/security_policy_source.rb +238 -0
- data/lib/new_relic/agent/configuration/server_source.rb +46 -5
- data/lib/new_relic/agent/configuration/yaml_source.rb +12 -7
- data/lib/new_relic/agent/connect/request_builder.rb +61 -0
- data/lib/new_relic/agent/connect/response_handler.rb +61 -0
- data/lib/new_relic/agent/custom_event_aggregator.rb +17 -6
- data/lib/new_relic/agent/database.rb +21 -3
- data/lib/new_relic/agent/database/explain_plan_helpers.rb +12 -1
- data/lib/new_relic/agent/database/obfuscation_helpers.rb +2 -2
- data/lib/new_relic/agent/database/obfuscator.rb +1 -1
- data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +1 -1
- data/lib/new_relic/agent/datastores.rb +12 -11
- data/lib/new_relic/agent/datastores/metric_helper.rb +2 -3
- data/lib/new_relic/agent/datastores/mongo.rb +2 -2
- data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +3 -3
- data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +1 -1
- data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +9 -9
- data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +1 -1
- data/lib/new_relic/agent/datastores/redis.rb +1 -1
- data/lib/new_relic/agent/deprecator.rb +1 -1
- data/lib/new_relic/agent/distributed_tracing.rb +216 -0
- data/lib/new_relic/agent/distributed_tracing/cross_app_payload.rb +44 -0
- data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +248 -0
- 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 +165 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +39 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context.rb +246 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +126 -0
- data/lib/new_relic/agent/encoding_normalizer.rb +1 -1
- data/lib/new_relic/agent/error_collector.rb +51 -20
- data/lib/new_relic/agent/error_event_aggregator.rb +14 -7
- data/lib/new_relic/agent/error_trace_aggregator.rb +2 -1
- data/lib/new_relic/agent/event_aggregator.rb +34 -15
- data/lib/new_relic/agent/event_buffer.rb +1 -1
- data/lib/new_relic/agent/event_listener.rb +1 -1
- data/lib/new_relic/agent/event_loop.rb +1 -1
- data/lib/new_relic/agent/external.rb +31 -29
- data/lib/new_relic/agent/guid_generator.rb +28 -0
- data/lib/new_relic/agent/harvester.rb +1 -1
- data/lib/new_relic/agent/heap.rb +140 -0
- data/lib/new_relic/agent/hostname.rb +16 -2
- data/lib/new_relic/agent/http_clients/abstract.rb +82 -0
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +25 -20
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +29 -14
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +18 -22
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +11 -12
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +17 -5
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +5 -7
- data/lib/new_relic/agent/http_clients/uri_util.rb +12 -11
- data/lib/new_relic/agent/instrumentation.rb +1 -1
- data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +26 -43
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +56 -74
- data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +82 -56
- data/lib/new_relic/agent/instrumentation/active_job.rb +19 -17
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +1 -1
- data/lib/new_relic/agent/instrumentation/active_record.rb +85 -38
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +82 -24
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +168 -0
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +102 -31
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +47 -57
- data/lib/new_relic/agent/instrumentation/active_storage.rb +23 -0
- data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +63 -0
- data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +24 -8
- data/lib/new_relic/agent/instrumentation/authlogic.rb +1 -1
- data/lib/new_relic/agent/instrumentation/bunny.rb +115 -44
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +18 -12
- data/lib/new_relic/agent/instrumentation/curb.rb +121 -35
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +6 -4
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +61 -25
- data/lib/new_relic/agent/instrumentation/excon.rb +2 -2
- data/lib/new_relic/agent/instrumentation/excon/connection.rb +8 -5
- data/lib/new_relic/agent/instrumentation/excon/middleware.rb +4 -3
- data/lib/new_relic/agent/instrumentation/grape.rb +46 -35
- data/lib/new_relic/agent/instrumentation/http.rb +8 -5
- data/lib/new_relic/agent/instrumentation/httpclient.rb +7 -5
- data/lib/new_relic/agent/instrumentation/ignore_actions.rb +1 -1
- data/lib/new_relic/agent/instrumentation/memcache.rb +5 -3
- data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +10 -6
- data/lib/new_relic/agent/instrumentation/merb/controller.rb +1 -1
- data/lib/new_relic/agent/instrumentation/merb/errors.rb +1 -1
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +13 -5
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +20 -11
- data/lib/new_relic/agent/instrumentation/mongo.rb +11 -5
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +39 -7
- data/lib/new_relic/agent/instrumentation/net.rb +60 -23
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +100 -0
- data/lib/new_relic/agent/instrumentation/padrino.rb +40 -16
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +1 -1
- data/lib/new_relic/agent/instrumentation/queue_time.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rack.rb +36 -13
- data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rails_middleware.rb +1 -1
- data/lib/new_relic/agent/instrumentation/{rails5 → rails_notifications}/action_cable.rb +8 -5
- data/lib/new_relic/agent/instrumentation/{rails5 → rails_notifications}/action_controller.rb +4 -4
- data/lib/new_relic/agent/instrumentation/{rails4 → rails_notifications}/action_view.rb +4 -4
- data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rake.rb +56 -22
- data/lib/new_relic/agent/instrumentation/redis.rb +141 -56
- data/lib/new_relic/agent/instrumentation/resque.rb +21 -37
- data/lib/new_relic/agent/instrumentation/sequel.rb +2 -3
- data/lib/new_relic/agent/instrumentation/sequel_helper.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sidekiq.rb +48 -24
- data/lib/new_relic/agent/instrumentation/sinatra.rb +62 -23
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sunspot.rb +1 -1
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +27 -10
- data/lib/new_relic/agent/internal_agent_error.rb +1 -1
- data/lib/new_relic/agent/javascript_instrumentor.rb +19 -16
- data/lib/new_relic/agent/log_once.rb +1 -1
- data/lib/new_relic/agent/logging.rb +139 -0
- data/lib/new_relic/agent/memory_logger.rb +1 -1
- data/lib/new_relic/agent/messaging.rb +15 -59
- data/lib/new_relic/agent/method_tracer.rb +42 -25
- data/lib/new_relic/agent/method_tracer_helpers.rb +5 -5
- data/lib/new_relic/agent/monitors.rb +27 -0
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +110 -0
- data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +27 -0
- data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +4 -4
- data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +4 -7
- data/lib/new_relic/agent/new_relic_service.rb +174 -63
- data/lib/new_relic/agent/new_relic_service/encoders.rb +1 -1
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +1 -2
- data/lib/new_relic/agent/new_relic_service/marshaller.rb +6 -27
- data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +61 -0
- data/lib/new_relic/agent/noticible_error.rb +22 -0
- data/lib/new_relic/agent/null_logger.rb +1 -1
- data/lib/new_relic/agent/obfuscator.rb +1 -1
- data/lib/new_relic/agent/parameter_filtering.rb +19 -6
- data/lib/new_relic/agent/payload_metric_mapping.rb +1 -1
- data/lib/new_relic/agent/pipe_channel_manager.rb +1 -1
- data/lib/new_relic/agent/pipe_service.rb +5 -1
- data/lib/new_relic/agent/prepend_supportability.rb +1 -1
- data/lib/new_relic/agent/priority_sampled_buffer.rb +95 -0
- data/lib/new_relic/agent/range_extensions.rb +1 -1
- data/lib/new_relic/agent/rules_engine.rb +1 -1
- data/lib/new_relic/agent/rules_engine/replacement_rule.rb +1 -1
- data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +1 -1
- data/lib/new_relic/agent/sampler.rb +1 -1
- data/lib/new_relic/agent/sampler_collection.rb +1 -1
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +1 -1
- data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +1 -1
- data/lib/new_relic/agent/samplers/memory_sampler.rb +1 -1
- data/lib/new_relic/agent/samplers/object_sampler.rb +1 -1
- data/lib/new_relic/agent/samplers/vm_sampler.rb +1 -1
- data/lib/new_relic/agent/span_event_aggregator.rb +49 -0
- data/lib/new_relic/agent/span_event_primitive.rb +206 -0
- data/lib/new_relic/agent/sql_sampler.rb +23 -7
- data/lib/new_relic/agent/stats.rb +1 -1
- data/lib/new_relic/agent/stats_engine.rb +4 -4
- data/lib/new_relic/agent/stats_engine/gc_profiler.rb +1 -1
- data/lib/new_relic/agent/stats_engine/stats_hash.rb +1 -1
- data/lib/new_relic/agent/supported_versions.rb +3 -3
- data/lib/new_relic/agent/synthetics_event_aggregator.rb +6 -13
- data/lib/new_relic/agent/system_info.rb +18 -8
- data/lib/new_relic/agent/threading/agent_thread.rb +6 -4
- data/lib/new_relic/agent/threading/backtrace_node.rb +1 -1
- data/lib/new_relic/agent/threading/backtrace_service.rb +4 -4
- data/lib/new_relic/agent/threading/thread_profile.rb +10 -24
- data/lib/new_relic/agent/timestamp_sampled_buffer.rb +19 -0
- data/lib/new_relic/agent/tracer.rb +509 -0
- data/lib/new_relic/agent/transaction.rb +191 -278
- data/lib/new_relic/agent/transaction/abstract_segment.rb +38 -5
- data/lib/new_relic/agent/transaction/datastore_segment.rb +30 -5
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +171 -0
- data/lib/new_relic/agent/transaction/distributed_tracing.rb +123 -71
- data/lib/new_relic/agent/transaction/external_request_segment.rb +41 -89
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +7 -8
- data/lib/new_relic/agent/transaction/request_attributes.rb +1 -1
- data/lib/new_relic/agent/transaction/segment.rb +42 -2
- data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +1 -1
- data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +1 -1
- data/lib/new_relic/agent/transaction/trace.rb +7 -23
- data/lib/new_relic/agent/transaction/trace_builder.rb +1 -2
- data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
- data/lib/new_relic/agent/transaction/trace_node.rb +12 -8
- data/lib/new_relic/agent/transaction/tracing.rb +2 -100
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +1 -1
- data/lib/new_relic/agent/transaction_error_primitive.rb +13 -22
- data/lib/new_relic/agent/transaction_event_aggregator.rb +7 -16
- data/lib/new_relic/agent/transaction_event_primitive.rb +31 -42
- data/lib/new_relic/agent/transaction_event_recorder.rb +8 -16
- data/lib/new_relic/agent/transaction_metrics.rb +1 -1
- data/lib/new_relic/agent/transaction_sampler.rb +3 -14
- data/lib/new_relic/agent/transaction_time_aggregator.rb +155 -0
- data/lib/new_relic/agent/utilization/aws.rb +1 -1
- data/lib/new_relic/agent/utilization/azure.rb +1 -1
- data/lib/new_relic/agent/utilization/gcp.rb +1 -1
- data/lib/new_relic/agent/utilization/pcf.rb +1 -1
- data/lib/new_relic/agent/utilization/vendor.rb +1 -1
- data/lib/new_relic/agent/utilization_data.rb +37 -2
- data/lib/new_relic/agent/vm.rb +1 -1
- data/lib/new_relic/agent/vm/jruby_vm.rb +1 -1
- data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +1 -1
- data/lib/new_relic/agent/vm/mri_vm.rb +1 -1
- data/lib/new_relic/agent/vm/snapshot.rb +1 -1
- data/lib/new_relic/agent/worker_loop.rb +1 -1
- data/lib/new_relic/cli/command.rb +1 -1
- data/lib/new_relic/cli/commands/deployments.rb +2 -2
- data/lib/new_relic/cli/commands/install.rb +4 -3
- data/lib/new_relic/coerce.rb +32 -7
- data/lib/new_relic/collection_helper.rb +1 -1
- data/lib/new_relic/constants.rb +38 -0
- data/lib/new_relic/control.rb +1 -1
- data/lib/new_relic/control/class_methods.rb +8 -2
- data/lib/new_relic/control/frameworks.rb +1 -1
- data/lib/new_relic/control/frameworks/external.rb +1 -1
- data/lib/new_relic/control/frameworks/merb.rb +1 -1
- data/lib/new_relic/control/frameworks/rails.rb +1 -1
- data/lib/new_relic/control/frameworks/rails3.rb +1 -1
- data/lib/new_relic/control/frameworks/rails4.rb +1 -1
- data/lib/new_relic/control/frameworks/{rails5.rb → rails_notifications.rb} +2 -2
- data/lib/new_relic/control/frameworks/ruby.rb +1 -1
- data/lib/new_relic/control/frameworks/sinatra.rb +1 -1
- data/lib/new_relic/control/instance_methods.rb +30 -4
- data/lib/new_relic/control/instrumentation.rb +1 -1
- data/lib/new_relic/control/server_methods.rb +1 -1
- data/lib/new_relic/delayed_job_injection.rb +1 -1
- data/lib/new_relic/dependency_detection.rb +5 -5
- data/lib/new_relic/environment_report.rb +6 -2
- data/lib/new_relic/helper.rb +1 -1
- data/lib/new_relic/language_support.rb +1 -1
- data/lib/new_relic/latest_changes.rb +4 -4
- data/lib/new_relic/local_environment.rb +1 -1
- data/lib/new_relic/metric_data.rb +1 -1
- data/lib/new_relic/metric_spec.rb +1 -1
- data/lib/new_relic/noticed_error.rb +39 -18
- data/lib/new_relic/rack.rb +1 -1
- data/lib/new_relic/rack/agent_hooks.rb +1 -1
- data/lib/new_relic/rack/agent_middleware.rb +2 -2
- data/lib/new_relic/rack/browser_monitoring.rb +16 -9
- data/lib/new_relic/recipes.rb +1 -1
- data/lib/new_relic/recipes/capistrano3.rb +6 -3
- data/lib/new_relic/recipes/capistrano_legacy.rb +1 -1
- data/lib/new_relic/supportability_helper.rb +15 -1
- data/lib/new_relic/version.rb +4 -4
- data/lib/newrelic_rpm.rb +1 -1
- data/lib/sequel/extensions/newrelic_instrumentation.rb +3 -3
- data/lib/sequel/plugins/newrelic_instrumentation.rb +2 -2
- data/lib/tasks/all.rb +1 -1
- data/lib/tasks/config.rake +1 -2
- data/lib/tasks/multiverse.rb +35 -1
- data/lib/tasks/newrelic.rb +1 -1
- data/lib/tasks/tests.rake +6 -1
- data/newrelic_rpm.gemspec +23 -17
- data/recipes/newrelic.rb +1 -1
- data/test/agent_helper.rb +357 -78
- metadata +154 -60
- data/.travis.yml +0 -173
- data/lib/new_relic/agent/busy_calculator.rb +0 -117
- 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 -140
- data/lib/new_relic/agent/cross_app_tracing.rb +0 -143
- data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -29
- data/lib/new_relic/agent/distributed_trace_payload.rb +0 -223
- data/lib/new_relic/agent/distributed_trace_priority_sampled_buffer.rb +0 -72
- 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 -36
- data/lib/new_relic/agent/instrumentation/evented_subscriber.rb +0 -104
- data/lib/new_relic/agent/instrumentation/rails4/action_controller.rb +0 -32
- data/lib/new_relic/agent/instrumentation/rails5/action_view.rb +0 -27
- data/lib/new_relic/agent/sampled_buffer.rb +0 -68
- data/lib/new_relic/agent/sized_buffer.rb +0 -23
- data/lib/new_relic/agent/synthetics_event_buffer.rb +0 -40
- data/lib/new_relic/agent/throughput_monitor.rb +0 -59
- data/lib/new_relic/agent/transaction/attributes.rb +0 -153
- data/lib/new_relic/agent/transaction/xray_sample_buffer.rb +0 -64
- data/lib/new_relic/agent/transaction_state.rb +0 -145
- data/lib/new_relic/agent/transaction_timings.rb +0 -57
- data/lib/new_relic/metrics.rb +0 -13
- 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
@@ -1,25 +1,32 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
# encoding: utf-8
|
3
3
|
# This file is distributed under New Relic's license terms.
|
4
|
-
# See https://github.com/newrelic/
|
4
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
5
|
+
# frozen_string_literal: true
|
5
6
|
|
6
7
|
require 'new_relic/agent/event_aggregator'
|
7
8
|
require 'new_relic/agent/transaction_error_primitive'
|
9
|
+
require 'new_relic/agent/priority_sampled_buffer'
|
8
10
|
|
9
11
|
module NewRelic
|
10
12
|
module Agent
|
11
13
|
class ErrorEventAggregator < EventAggregator
|
14
|
+
include NewRelic::Coerce
|
12
15
|
|
13
16
|
named :ErrorEventAggregator
|
14
17
|
capacity_key :'error_collector.max_event_samples_stored'
|
15
|
-
|
18
|
+
enabled_keys :'error_collector.enabled',
|
19
|
+
:'error_collector.capture_events'
|
20
|
+
buffer_class PrioritySampledBuffer
|
16
21
|
|
17
|
-
def
|
22
|
+
def record noticed_error, transaction_payload = nil, span_id = nil
|
18
23
|
return unless enabled?
|
19
24
|
|
25
|
+
priority = float!((transaction_payload && transaction_payload[:priority]) || rand)
|
26
|
+
|
20
27
|
@lock.synchronize do
|
21
|
-
@buffer.append do
|
22
|
-
create_event(noticed_error, transaction_payload)
|
28
|
+
@buffer.append(priority: priority) do
|
29
|
+
create_event(noticed_error, transaction_payload, span_id)
|
23
30
|
end
|
24
31
|
notify_if_full
|
25
32
|
end
|
@@ -27,8 +34,8 @@ module NewRelic
|
|
27
34
|
|
28
35
|
private
|
29
36
|
|
30
|
-
def create_event noticed_error, transaction_payload
|
31
|
-
TransactionErrorPrimitive.create noticed_error, transaction_payload
|
37
|
+
def create_event noticed_error, transaction_payload, span_id
|
38
|
+
TransactionErrorPrimitive.create noticed_error, transaction_payload, span_id
|
32
39
|
end
|
33
40
|
end
|
34
41
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
# encoding: utf-8
|
3
3
|
# This file is distributed under New Relic's license terms.
|
4
|
-
# See https://github.com/newrelic/
|
4
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
5
5
|
|
6
6
|
module NewRelic
|
7
7
|
module Agent
|
@@ -91,6 +91,7 @@ module NewRelic
|
|
91
91
|
|
92
92
|
def register_config_callbacks
|
93
93
|
Agent.config.register_callback(:'error_collector.enabled') do |enabled|
|
94
|
+
reset! if enabled == false
|
94
95
|
::NewRelic::Agent.logger.debug "Error traces will #{enabled ? '' : 'not '}be sent to the New Relic service."
|
95
96
|
end
|
96
97
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
4
|
|
5
|
-
require 'new_relic/agent/
|
5
|
+
require 'new_relic/agent/priority_sampled_buffer'
|
6
6
|
|
7
7
|
module NewRelic
|
8
8
|
module Agent
|
@@ -16,26 +16,45 @@ module NewRelic
|
|
16
16
|
key ? @capacity_key = key : @capacity_key
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
# An aggregator can specify one or more keys to check to see if it is
|
20
|
+
# enabled. Multiple keys will be &&'d and the enabled status of the
|
21
|
+
# aggregator will be reset when agent configuration changes.
|
22
|
+
|
23
|
+
def enabled_keys *keys
|
24
|
+
if keys.empty?
|
25
|
+
@enabled_keys ||= []
|
26
|
+
else
|
27
|
+
@enabled_keys = Array(keys)
|
28
|
+
@enabled_fn = ->(){ @enabled_keys.all? { |k| Agent.config[k] } }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
alias_method :enabled_key, :enabled_keys
|
33
|
+
|
34
|
+
# This can be used instead of `enabled_key(s)` for more fine grained
|
35
|
+
# control over whether an aggregator should be enabled. The enabled fn
|
36
|
+
# will be reevaluated after configuration changes
|
37
|
+
|
38
|
+
def enabled_fn fn = nil
|
39
|
+
fn ? @enabled_fn = fn : @enabled_fn
|
21
40
|
end
|
22
41
|
|
23
42
|
def buffer_class klass = nil
|
24
43
|
if klass
|
25
44
|
@buffer_class = klass
|
26
45
|
else
|
27
|
-
@buffer_class ||=
|
46
|
+
@buffer_class ||= PrioritySampledBuffer
|
28
47
|
end
|
29
48
|
end
|
30
49
|
end
|
31
50
|
|
32
|
-
def initialize
|
51
|
+
def initialize events
|
33
52
|
@lock = Mutex.new
|
34
53
|
@buffer = self.class.buffer_class.new NewRelic::Agent.config[self.class.capacity_key]
|
35
|
-
@enabled = false
|
54
|
+
@enabled = self.class.enabled_fn ? self.class.enabled_fn.call : false
|
36
55
|
@notified_full = false
|
37
56
|
register_capacity_callback
|
38
|
-
register_enabled_callback
|
57
|
+
register_enabled_callback events
|
39
58
|
after_initialize
|
40
59
|
end
|
41
60
|
|
@@ -79,7 +98,7 @@ module NewRelic
|
|
79
98
|
@buffer.decrement_lifetime_counts_by samples.count
|
80
99
|
end
|
81
100
|
|
82
|
-
samples.each { |s| @buffer.append s }
|
101
|
+
samples.each { |s| @buffer.append event: s }
|
83
102
|
end
|
84
103
|
end
|
85
104
|
|
@@ -107,12 +126,12 @@ module NewRelic
|
|
107
126
|
end
|
108
127
|
end
|
109
128
|
|
110
|
-
def register_enabled_callback
|
111
|
-
|
112
|
-
|
113
|
-
@enabled
|
114
|
-
::NewRelic::Agent.logger.debug "#{self.class.named} will #{enabled ? '' : 'not '}be sent to the New Relic service."
|
115
|
-
|
129
|
+
def register_enabled_callback events
|
130
|
+
events.subscribe(:server_source_configuration_added) {
|
131
|
+
@enabled = self.class.enabled_fn.call
|
132
|
+
reset! if @enabled == false
|
133
|
+
::NewRelic::Agent.logger.debug "#{self.class.named} will #{@enabled ? '' : 'not '}be sent to the New Relic service."
|
134
|
+
}
|
116
135
|
end
|
117
136
|
|
118
137
|
def notify_if_full
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
4
|
|
5
5
|
# EventBuffer is intended to be an abstract base class. It should not be
|
6
6
|
# instantiated directly. Subclasses should define an `append_event` method
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
4
|
|
5
5
|
module NewRelic::Agent
|
6
6
|
# Basic mechanism for the agent instance to provide agent-wide eventing.
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
4
|
|
5
5
|
require 'thread'
|
6
6
|
|
@@ -1,12 +1,20 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
4
|
|
5
5
|
require 'new_relic/agent/transaction/tracing'
|
6
|
-
require 'new_relic/agent/cross_app_tracing'
|
6
|
+
require 'new_relic/agent/distributed_tracing/cross_app_tracing'
|
7
|
+
require 'new_relic/agent/distributed_tracing/cross_app_payload'
|
7
8
|
|
8
9
|
module NewRelic
|
9
10
|
module Agent
|
11
|
+
#
|
12
|
+
# This module contains helper methods to facilitate
|
13
|
+
# instrumentation of external requests not directly supported by
|
14
|
+
# the Ruby agent. It is intended to be primarily used by authors
|
15
|
+
# of 3rd-party instrumentation.
|
16
|
+
#
|
17
|
+
# @api public
|
10
18
|
module External
|
11
19
|
extend self
|
12
20
|
|
@@ -26,13 +34,16 @@ module NewRelic
|
|
26
34
|
#
|
27
35
|
# @api public
|
28
36
|
def start_segment(library: nil, uri: nil, procedure: nil)
|
37
|
+
Deprecator.deprecate 'External.start_segment',
|
38
|
+
'Tracer#start_external_request_segment'
|
39
|
+
|
29
40
|
raise ArgumentError, 'Argument `library` is required' if library.nil?
|
30
41
|
raise ArgumentError, 'Argument `uri` is required' if uri.nil?
|
31
42
|
raise ArgumentError, 'Argument `procedure` is required' if procedure.nil?
|
32
43
|
|
33
44
|
::NewRelic::Agent.record_api_supportability_metric(:start_segment)
|
34
45
|
|
35
|
-
::NewRelic::Agent::
|
46
|
+
::NewRelic::Agent::Tracer.start_external_request_segment(
|
36
47
|
library: library,
|
37
48
|
uri: uri,
|
38
49
|
procedure: procedure
|
@@ -42,6 +53,7 @@ module NewRelic
|
|
42
53
|
NON_HTTP_CAT_ID_HEADER = 'NewRelicID'.freeze
|
43
54
|
NON_HTTP_CAT_TXN_HEADER = 'NewRelicTransaction'.freeze
|
44
55
|
NON_HTTP_CAT_SYNTHETICS_HEADER = 'NewRelicSynthetics'.freeze
|
56
|
+
NON_HTTP_CAT_CONTENT_LENGTH = -1
|
45
57
|
|
46
58
|
# Process obfuscated +String+ indentifying a calling application and transaction that is also running a
|
47
59
|
# New Relic agent and save information in current transaction for inclusion in a trace. The +String+ is
|
@@ -55,19 +67,19 @@ module NewRelic
|
|
55
67
|
NewRelic::Agent.record_api_supportability_metric(:process_request_metadata)
|
56
68
|
return unless CrossAppTracing.cross_app_enabled?
|
57
69
|
|
58
|
-
state = NewRelic::Agent::
|
70
|
+
state = NewRelic::Agent::Tracer.state
|
59
71
|
if transaction = state.current_transaction
|
60
72
|
rmd = ::JSON.parse obfuscator.deobfuscate(request_metadata)
|
61
73
|
|
62
74
|
# handle/check ID
|
63
75
|
#
|
64
76
|
if id = rmd[NON_HTTP_CAT_ID_HEADER] and CrossAppTracing.trusted_valid_cross_app_id?(id)
|
65
|
-
state.client_cross_app_id = id
|
66
|
-
|
67
77
|
# handle transaction info
|
68
78
|
#
|
69
79
|
if txn_info = rmd[NON_HTTP_CAT_TXN_HEADER]
|
70
|
-
|
80
|
+
payload = CrossAppPayload.new(id, transaction, txn_info)
|
81
|
+
transaction.distributed_tracer.cross_app_payload = payload
|
82
|
+
|
71
83
|
CrossAppTracing.assign_intrinsic_transaction_attributes state
|
72
84
|
end
|
73
85
|
|
@@ -100,31 +112,21 @@ module NewRelic
|
|
100
112
|
NewRelic::Agent.record_api_supportability_metric(:get_response_metadata)
|
101
113
|
return unless CrossAppTracing.cross_app_enabled?
|
102
114
|
|
103
|
-
|
104
|
-
|
115
|
+
return unless (txn = Tracer.current_transaction)
|
116
|
+
return unless (payload = txn.distributed_tracer.cross_app_payload)
|
105
117
|
|
106
|
-
|
118
|
+
# must freeze the name since we're responding with it
|
119
|
+
#
|
120
|
+
txn.freeze_name_and_execute_if_not_ignored do
|
121
|
+
# build response payload
|
107
122
|
#
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
#
|
112
|
-
rmd = {
|
113
|
-
NewRelicAppData: [
|
114
|
-
NewRelic::Agent.config[:cross_process_id],
|
115
|
-
state.timings.transaction_name,
|
116
|
-
state.timings.queue_time_in_seconds.to_f,
|
117
|
-
state.timings.app_time_in_seconds.to_f,
|
118
|
-
-1, # per non-HTTP CAT spec
|
119
|
-
state.request_guid
|
120
|
-
]
|
121
|
-
}
|
122
|
-
|
123
|
-
# obfuscate the generated response metadata JSON
|
124
|
-
#
|
125
|
-
obfuscator.obfuscate ::JSON.dump(rmd)
|
123
|
+
rmd = {
|
124
|
+
NewRelicAppData: payload.as_json_array(NON_HTTP_CAT_CONTENT_LENGTH)
|
125
|
+
}
|
126
126
|
|
127
|
-
|
127
|
+
# obfuscate the generated response metadata JSON
|
128
|
+
#
|
129
|
+
obfuscator.obfuscate ::JSON.dump(rmd)
|
128
130
|
end
|
129
131
|
rescue => e
|
130
132
|
NewRelic::Agent.logger.error "error during get_response_metadata", e
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
module NewRelic
|
6
|
+
module Agent
|
7
|
+
module GuidGenerator
|
8
|
+
|
9
|
+
HEX_DIGITS = (0..15).map{|i| i.to_s(16)}
|
10
|
+
|
11
|
+
module_function
|
12
|
+
|
13
|
+
# This method intentionally does not use SecureRandom, because it relies
|
14
|
+
# on urandom, which raises an exception in MRI when the interpreter runs
|
15
|
+
# out of allocated file descriptors.
|
16
|
+
# The guids generated by this method may not be _secure_, but they are
|
17
|
+
# random enough for our purposes.
|
18
|
+
def generate_guid length = 16
|
19
|
+
guid = ''
|
20
|
+
length.times do |a|
|
21
|
+
guid << HEX_DIGITS[rand(16)]
|
22
|
+
end
|
23
|
+
guid
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
4
|
|
5
5
|
module NewRelic
|
6
6
|
module Agent
|
@@ -0,0 +1,140 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
module NewRelic
|
6
|
+
module Agent
|
7
|
+
# This class implements a min Heap. The first element is always the one with the
|
8
|
+
# lowest priority. It is a tree structure that is represented as an array. The
|
9
|
+
# relationship between between nodes in the tree and indices in the array are as
|
10
|
+
# follows:
|
11
|
+
#
|
12
|
+
# parent_index = (child_index - 1) / 2
|
13
|
+
# left_child_index = parent_index * 2 + 1
|
14
|
+
# right_child_index = parent_index * 2 + 2
|
15
|
+
#
|
16
|
+
# the root node is at index 0
|
17
|
+
# a node is a leaf node when its index >= length / 2
|
18
|
+
#
|
19
|
+
|
20
|
+
class Heap
|
21
|
+
|
22
|
+
# @param [Array] items an optional array of items to intialize the heap
|
23
|
+
#
|
24
|
+
# @param [Callable] priority_fn an optional priority function used to
|
25
|
+
# to compute the priority for an item. If it's not supplied priority
|
26
|
+
# will be computed using Comparable.
|
27
|
+
def initialize(items = nil, &priority_fn)
|
28
|
+
@items = []
|
29
|
+
@priority_fn = priority_fn || ->(x) { x }
|
30
|
+
items.each{ |item| push(item) } if items
|
31
|
+
end
|
32
|
+
|
33
|
+
def [](index)
|
34
|
+
@items[index]
|
35
|
+
end
|
36
|
+
|
37
|
+
def []=(index, value)
|
38
|
+
@items[index] = value
|
39
|
+
end
|
40
|
+
|
41
|
+
def fix(index)
|
42
|
+
parent_index = parent_index_for(index)
|
43
|
+
|
44
|
+
if in_range?(parent_index) && priority(parent_index) > priority(index)
|
45
|
+
heapify_up(index)
|
46
|
+
else
|
47
|
+
child_index = left_child_index_for(index)
|
48
|
+
|
49
|
+
return unless in_range?(child_index)
|
50
|
+
|
51
|
+
if right_sibling_smaller?(child_index)
|
52
|
+
child_index += 1
|
53
|
+
end
|
54
|
+
|
55
|
+
if priority(child_index) < priority(index)
|
56
|
+
heapify_down(index)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def push(item)
|
62
|
+
@items << item
|
63
|
+
heapify_up(size - 1)
|
64
|
+
end
|
65
|
+
|
66
|
+
alias_method :<<, :push
|
67
|
+
|
68
|
+
def pop
|
69
|
+
swap(0, size - 1)
|
70
|
+
item = @items.pop
|
71
|
+
heapify_down(0)
|
72
|
+
item
|
73
|
+
end
|
74
|
+
|
75
|
+
def size
|
76
|
+
@items.size
|
77
|
+
end
|
78
|
+
|
79
|
+
def empty?
|
80
|
+
@items.empty?
|
81
|
+
end
|
82
|
+
|
83
|
+
def to_a
|
84
|
+
@items
|
85
|
+
end
|
86
|
+
|
87
|
+
private
|
88
|
+
|
89
|
+
def priority(index)
|
90
|
+
@priority_fn.call(@items[index])
|
91
|
+
end
|
92
|
+
|
93
|
+
def parent_index_for child_index
|
94
|
+
(child_index - 1) / 2
|
95
|
+
end
|
96
|
+
|
97
|
+
def left_child_index_for parent_index
|
98
|
+
2 * parent_index + 1
|
99
|
+
end
|
100
|
+
|
101
|
+
def right_sibling_smaller?(lchild_index)
|
102
|
+
in_range?(lchild_index + 1) && priority(lchild_index) > priority(lchild_index + 1)
|
103
|
+
end
|
104
|
+
|
105
|
+
def in_range?(index)
|
106
|
+
index >= 0 && index < size
|
107
|
+
end
|
108
|
+
|
109
|
+
def heapify_up(child_index)
|
110
|
+
return if child_index == 0
|
111
|
+
|
112
|
+
parent_index = parent_index_for(child_index)
|
113
|
+
|
114
|
+
if priority(child_index) < priority(parent_index)
|
115
|
+
swap(child_index, parent_index)
|
116
|
+
heapify_up(parent_index)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def heapify_down(parent_index)
|
121
|
+
child_index = left_child_index_for(parent_index)
|
122
|
+
return unless in_range?(child_index)
|
123
|
+
|
124
|
+
if right_sibling_smaller?(child_index)
|
125
|
+
child_index += 1
|
126
|
+
end
|
127
|
+
|
128
|
+
if priority(child_index) < priority(parent_index)
|
129
|
+
swap(parent_index, child_index)
|
130
|
+
heapify_down(child_index)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def swap(i, j)
|
135
|
+
@items[i], @items[j] = @items[j], @items[i]
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
end
|
140
|
+
end
|