newrelic_rpm 8.0.0 → 8.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.rubocop.yml +1936 -0
- data/Brewfile +10 -0
- data/CHANGELOG.md +96 -0
- data/CONTRIBUTING.md +15 -3
- data/Guardfile +8 -8
- data/README.md +3 -1
- data/Rakefile +7 -9
- data/bin/mongrel_rpm +8 -9
- data/bin/newrelic +1 -1
- data/bin/nrdebug +14 -14
- data/init.rb +0 -2
- data/lefthook.yml +9 -0
- data/lib/new_relic/agent/adaptive_sampler.rb +7 -3
- data/lib/new_relic/agent/agent.rb +38 -40
- data/lib/new_relic/agent/agent_logger.rb +8 -9
- data/lib/new_relic/agent/attribute_filter.rb +31 -31
- data/lib/new_relic/agent/attributes.rb +2 -2
- data/lib/new_relic/agent/autostart.rb +6 -7
- data/lib/new_relic/agent/commands/agent_command.rb +2 -2
- data/lib/new_relic/agent/commands/agent_command_router.rb +6 -5
- data/lib/new_relic/agent/commands/thread_profiler_session.rb +0 -3
- data/lib/new_relic/agent/configuration/default_source.rb +343 -337
- data/lib/new_relic/agent/configuration/dotted_hash.rb +3 -3
- data/lib/new_relic/agent/configuration/environment_source.rb +3 -4
- data/lib/new_relic/agent/configuration/event_harvest_config.rb +2 -4
- data/lib/new_relic/agent/configuration/high_security_source.rb +7 -7
- data/lib/new_relic/agent/configuration/manager.rb +57 -57
- data/lib/new_relic/agent/configuration/mask_defaults.rb +1 -1
- data/lib/new_relic/agent/configuration/security_policy_source.rb +73 -73
- data/lib/new_relic/agent/configuration/server_source.rb +10 -10
- data/lib/new_relic/agent/configuration/yaml_source.rb +9 -9
- data/lib/new_relic/agent/connect/request_builder.rb +13 -16
- data/lib/new_relic/agent/connect/response_handler.rb +0 -3
- data/lib/new_relic/agent/custom_event_aggregator.rb +9 -10
- data/lib/new_relic/agent/database/explain_plan_helpers.rb +3 -4
- data/lib/new_relic/agent/database/obfuscation_helpers.rb +12 -12
- data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +2 -2
- data/lib/new_relic/agent/database.rb +20 -24
- data/lib/new_relic/agent/datastores/metric_helper.rb +10 -10
- data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +2 -3
- data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +3 -5
- data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +1 -2
- data/lib/new_relic/agent/datastores/redis.rb +2 -4
- data/lib/new_relic/agent/datastores.rb +1 -3
- data/lib/new_relic/agent/distributed_tracing/cross_app_payload.rb +5 -5
- data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +11 -10
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +10 -11
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +41 -42
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +3 -3
- data/lib/new_relic/agent/distributed_tracing/trace_context.rb +41 -43
- data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +24 -24
- data/lib/new_relic/agent/distributed_tracing.rb +17 -18
- data/lib/new_relic/agent/encoding_normalizer.rb +1 -1
- data/lib/new_relic/agent/error_collector.rb +17 -17
- data/lib/new_relic/agent/error_event_aggregator.rb +1 -1
- data/lib/new_relic/agent/error_filter.rb +16 -10
- data/lib/new_relic/agent/error_trace_aggregator.rb +1 -1
- data/lib/new_relic/agent/event_aggregator.rb +1 -1
- data/lib/new_relic/agent/event_buffer.rb +6 -7
- data/lib/new_relic/agent/event_listener.rb +0 -1
- data/lib/new_relic/agent/event_loop.rb +10 -10
- data/lib/new_relic/agent/external.rb +1 -2
- data/lib/new_relic/agent/guid_generator.rb +2 -9
- data/lib/new_relic/agent/harvester.rb +3 -4
- data/lib/new_relic/agent/heap.rb +1 -3
- data/lib/new_relic/agent/hostname.rb +3 -3
- data/lib/new_relic/agent/http_clients/abstract.rb +5 -7
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +1 -5
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +4 -4
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +3 -3
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +1 -2
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +8 -3
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +2 -3
- data/lib/new_relic/agent/http_clients/uri_util.rb +0 -1
- data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +2 -3
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +9 -10
- data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +5 -7
- data/lib/new_relic/agent/instrumentation/active_job.rb +4 -3
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +2 -2
- data/lib/new_relic/agent/instrumentation/active_record.rb +20 -18
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +36 -42
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +28 -25
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +3 -3
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +5 -6
- data/lib/new_relic/agent/instrumentation/active_storage.rb +1 -1
- data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +8 -9
- data/lib/new_relic/agent/instrumentation/bunny/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +7 -8
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +41 -41
- data/lib/new_relic/agent/instrumentation/curb/chain.rb +19 -20
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +34 -38
- data/lib/new_relic/agent/instrumentation/curb/prepend.rb +9 -10
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +10 -10
- data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +5 -7
- data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +5 -9
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +4 -4
- data/lib/new_relic/agent/instrumentation/excon/middleware.rb +2 -2
- data/lib/new_relic/agent/instrumentation/excon.rb +0 -1
- data/lib/new_relic/agent/instrumentation/grape/chain.rb +1 -2
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +6 -7
- data/lib/new_relic/agent/instrumentation/grape.rb +2 -3
- data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +2 -3
- data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +0 -1
- data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +0 -2
- data/lib/new_relic/agent/instrumentation/httprb/chain.rb +2 -2
- data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +6 -6
- data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +1 -1
- data/lib/new_relic/agent/instrumentation/ignore_actions.rb +2 -3
- data/lib/new_relic/agent/instrumentation/logger/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +58 -0
- data/lib/new_relic/agent/instrumentation/logger/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/logger.rb +25 -0
- data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +7 -2
- data/lib/new_relic/agent/instrumentation/memcache/helper.rb +5 -1
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +9 -2
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +9 -10
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +4 -5
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +4 -4
- data/lib/new_relic/agent/instrumentation/net_http/chain.rb +3 -4
- data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +5 -5
- data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +4 -4
- data/lib/new_relic/agent/instrumentation/net_http.rb +1 -1
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +2 -3
- data/lib/new_relic/agent/instrumentation/padrino/chain.rb +23 -19
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +3 -2
- data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +2 -2
- data/lib/new_relic/agent/instrumentation/padrino.rb +2 -5
- data/lib/new_relic/agent/instrumentation/queue_time.rb +5 -5
- data/lib/new_relic/agent/instrumentation/rack/chain.rb +5 -5
- data/lib/new_relic/agent/instrumentation/rack/helpers.rb +0 -1
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +4 -5
- data/lib/new_relic/agent/instrumentation/rack/prepend.rb +0 -1
- data/lib/new_relic/agent/instrumentation/rack.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +6 -6
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +2 -2
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +0 -1
- data/lib/new_relic/agent/instrumentation/rake/chain.rb +0 -5
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +6 -6
- data/lib/new_relic/agent/instrumentation/rake.rb +1 -1
- data/lib/new_relic/agent/instrumentation/redis/chain.rb +6 -6
- data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +2 -2
- data/lib/new_relic/agent/instrumentation/redis/prepend.rb +1 -1
- data/lib/new_relic/agent/instrumentation/redis.rb +1 -1
- data/lib/new_relic/agent/instrumentation/resque/chain.rb +2 -3
- data/lib/new_relic/agent/instrumentation/resque/helper.rb +1 -1
- data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +4 -4
- data/lib/new_relic/agent/instrumentation/resque/prepend.rb +1 -2
- data/lib/new_relic/agent/instrumentation/resque.rb +7 -7
- data/lib/new_relic/agent/instrumentation/sequel.rb +7 -9
- data/lib/new_relic/agent/instrumentation/sequel_helper.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sidekiq.rb +5 -4
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +0 -1
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +4 -3
- data/lib/new_relic/agent/instrumentation/sunspot.rb +1 -1
- data/lib/new_relic/agent/instrumentation/tilt/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +40 -0
- data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/tilt.rb +25 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +4 -4
- data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +3 -5
- data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +1 -1
- data/lib/new_relic/agent/internal_agent_error.rb +1 -1
- data/lib/new_relic/agent/javascript_instrumentor.rb +28 -28
- data/lib/new_relic/agent/logging.rb +11 -8
- data/lib/new_relic/agent/memory_logger.rb +1 -1
- data/lib/new_relic/agent/messaging.rb +42 -43
- data/lib/new_relic/agent/method_tracer.rb +17 -15
- data/lib/new_relic/agent/method_tracer_helpers.rb +2 -2
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +19 -16
- data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +2 -2
- data/lib/new_relic/agent/monitors/inbound_request_monitor.rb +0 -1
- data/lib/new_relic/agent/monitors/synthetics_monitor.rb +4 -7
- data/lib/new_relic/agent/monitors.rb +1 -2
- data/lib/new_relic/agent/new_relic_service/encoders.rb +4 -4
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +1 -1
- data/lib/new_relic/agent/new_relic_service/marshaller.rb +1 -1
- data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +4 -3
- data/lib/new_relic/agent/new_relic_service.rb +26 -33
- data/lib/new_relic/agent/noticible_error.rb +0 -2
- data/lib/new_relic/agent/null_logger.rb +6 -2
- data/lib/new_relic/agent/obfuscator.rb +6 -8
- data/lib/new_relic/agent/parameter_filtering.rb +15 -7
- data/lib/new_relic/agent/payload_metric_mapping.rb +8 -9
- data/lib/new_relic/agent/pipe_channel_manager.rb +5 -6
- data/lib/new_relic/agent/pipe_service.rb +1 -1
- data/lib/new_relic/agent/priority_sampled_buffer.rb +4 -7
- data/lib/new_relic/agent/rules_engine/replacement_rule.rb +9 -9
- data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +12 -12
- data/lib/new_relic/agent/rules_engine.rb +2 -2
- data/lib/new_relic/agent/sampler.rb +2 -3
- data/lib/new_relic/agent/sampler_collection.rb +2 -3
- data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +10 -7
- data/lib/new_relic/agent/samplers/memory_sampler.rb +4 -3
- data/lib/new_relic/agent/samplers/vm_sampler.rb +18 -18
- data/lib/new_relic/agent/span_event_aggregator.rb +8 -8
- data/lib/new_relic/agent/span_event_primitive.rb +39 -39
- data/lib/new_relic/agent/sql_sampler.rb +9 -9
- data/lib/new_relic/agent/stats.rb +16 -16
- data/lib/new_relic/agent/stats_engine/gc_profiler.rb +7 -9
- data/lib/new_relic/agent/stats_engine/stats_hash.rb +8 -9
- data/lib/new_relic/agent/stats_engine.rb +6 -6
- data/lib/new_relic/agent/synthetics_event_aggregator.rb +0 -1
- data/lib/new_relic/agent/system_info.rb +22 -20
- data/lib/new_relic/agent/threading/agent_thread.rb +4 -5
- data/lib/new_relic/agent/threading/backtrace_node.rb +6 -9
- data/lib/new_relic/agent/threading/backtrace_service.rb +8 -8
- data/lib/new_relic/agent/threading/thread_profile.rb +15 -18
- data/lib/new_relic/agent/tracer.rb +37 -43
- data/lib/new_relic/agent/transaction/abstract_segment.rb +6 -6
- data/lib/new_relic/agent/transaction/datastore_segment.rb +7 -6
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +8 -9
- data/lib/new_relic/agent/transaction/distributed_tracing.rb +21 -22
- data/lib/new_relic/agent/transaction/external_request_segment.rb +6 -5
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +23 -23
- data/lib/new_relic/agent/transaction/request_attributes.rb +7 -7
- data/lib/new_relic/agent/transaction/segment.rb +6 -3
- data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +0 -2
- data/lib/new_relic/agent/transaction/trace.rb +8 -8
- data/lib/new_relic/agent/transaction/trace_context.rb +13 -15
- data/lib/new_relic/agent/transaction/trace_node.rb +16 -16
- data/lib/new_relic/agent/transaction/tracing.rb +1 -3
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +1 -2
- data/lib/new_relic/agent/transaction.rb +79 -81
- data/lib/new_relic/agent/transaction_error_primitive.rb +16 -16
- data/lib/new_relic/agent/transaction_event_aggregator.rb +5 -6
- data/lib/new_relic/agent/transaction_event_primitive.rb +29 -29
- data/lib/new_relic/agent/transaction_metrics.rb +3 -3
- data/lib/new_relic/agent/transaction_sampler.rb +0 -1
- data/lib/new_relic/agent/transaction_time_aggregator.rb +6 -6
- data/lib/new_relic/agent/utilization/azure.rb +1 -1
- data/lib/new_relic/agent/utilization_data.rb +3 -4
- data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +1 -1
- data/lib/new_relic/agent/vm/snapshot.rb +3 -3
- data/lib/new_relic/agent/worker_loop.rb +3 -5
- data/lib/new_relic/agent.rb +22 -22
- data/lib/new_relic/cli/command.rb +15 -17
- data/lib/new_relic/cli/commands/deployments.rb +20 -22
- data/lib/new_relic/cli/commands/install.rb +6 -10
- data/lib/new_relic/coerce.rb +5 -8
- data/lib/new_relic/collection_helper.rb +48 -47
- data/lib/new_relic/control/class_methods.rb +2 -2
- data/lib/new_relic/control/frameworks/external.rb +1 -1
- data/lib/new_relic/control/frameworks/rails.rb +5 -6
- data/lib/new_relic/control/frameworks/rails3.rb +2 -3
- data/lib/new_relic/control/frameworks/ruby.rb +2 -2
- data/lib/new_relic/control/frameworks/sinatra.rb +6 -0
- data/lib/new_relic/control/instance_methods.rb +4 -5
- data/lib/new_relic/control/instrumentation.rb +4 -5
- data/lib/new_relic/control/server_methods.rb +2 -3
- data/lib/new_relic/control.rb +0 -1
- data/lib/new_relic/dependency_detection.rb +6 -8
- data/lib/new_relic/environment_report.rb +16 -18
- data/lib/new_relic/helper.rb +5 -5
- data/lib/new_relic/language_support.rb +1 -1
- data/lib/new_relic/latest_changes.rb +2 -2
- data/lib/new_relic/local_environment.rb +7 -7
- data/lib/new_relic/metric_data.rb +6 -7
- data/lib/new_relic/metric_spec.rb +3 -3
- data/lib/new_relic/noticed_error.rb +14 -15
- data/lib/new_relic/rack/agent_middleware.rb +2 -2
- data/lib/new_relic/rack/browser_monitoring.rb +9 -9
- data/lib/new_relic/recipes/capistrano3.rb +11 -13
- data/lib/new_relic/recipes/capistrano_legacy.rb +11 -14
- data/lib/new_relic/supportability_helper.rb +1 -2
- data/lib/new_relic/version.rb +3 -4
- data/lib/sequel/extensions/newrelic_instrumentation.rb +4 -7
- data/lib/sequel/plugins/newrelic_instrumentation.rb +3 -9
- data/lib/tasks/all.rb +1 -1
- data/lib/tasks/config.rake +21 -21
- data/lib/tasks/multiverse.rb +4 -6
- data/lib/tasks/tests.rake +3 -7
- data/newrelic.yml +8 -21
- data/newrelic_rpm.gemspec +13 -12
- data/recipes/newrelic.rb +1 -1
- data/test/agent_helper.rb +55 -55
- metadata +43 -7
- data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +0 -125
- data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +0 -46
- data/lib/new_relic/agent/supported_versions.rb +0 -275
data/Brewfile
ADDED
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,101 @@
|
|
1
1
|
# New Relic Ruby Agent Release Notes #
|
2
2
|
|
3
|
+
## v8.4.0
|
4
|
+
|
5
|
+
* **Provide basic support for Rails 7.0**
|
6
|
+
|
7
|
+
This release includes Rails 7.0 as a tested Rails version. Updates build upon the agent's current Rails instrumentation and do not include additional instrumentation for new features.
|
8
|
+
|
9
|
+
* **Improve the performance of NewRelic::Agent::GuidGenerator#generate_guid**
|
10
|
+
|
11
|
+
This method is called by many basic operations within the agent including transactions, datastore segments, and external request segments. Thank you, @jdelstrother for contributing this performance improvement!
|
12
|
+
|
13
|
+
* **Documentation: Development environment prep instructions**
|
14
|
+
|
15
|
+
The multiverse collection of test suites requires a variety of data handling software (MySQL, Redis, memcached, etc.) to be available on the machine running the tests. The [project documentation](test/multiverse/README.md) has been updated to outline the relevant software packages, and a `Brewfile` file has been added to automate software installation with Homebrew.
|
16
|
+
|
17
|
+
* **Bugfix: Add ControllerInstrumentation::Shims to Sinatra framework**
|
18
|
+
|
19
|
+
When the agent is disabled by setting the configuration settings `enabled`, `agent_enabled`, and/or `monitor_mode` to false, the agent loads shims for public controller instrumentation methods. These shims were missing for the Sinatra framework, causing applications to crash if the agent was disabled. Thank you, @NC-piercej for bringing this to our attention!
|
20
|
+
|
21
|
+
|
22
|
+
## v8.3.0
|
23
|
+
|
24
|
+
* **Updated the agent to support Ruby 3.1.0**
|
25
|
+
|
26
|
+
Most of the changes involved updating the multiverse suite to exclude runs for older versions of instrumented gems that are not compatible with Ruby 3.1.0. In addition, Infinite Tracing testing was updated to accommodate `YAML::unsafe_load` for Psych 4 support.
|
27
|
+
|
28
|
+
* **Bugfix: Update AdaptiveSampler#sampled? algorithm**
|
29
|
+
|
30
|
+
One of the clauses in `AdaptiveSampler#sampled?` would always return false due to Integer division returning a result of zero. This method has been updated to use Float division instead, to exponentially back off the number of samples required. This may increase the number of traces collected for transactions. A huge thank you to @romul for bringing this to our attention and breaking down the problem!
|
31
|
+
|
32
|
+
* **Bugfix: Correctly encode ASCII-8BIT log messages**
|
33
|
+
|
34
|
+
The encoding update for the DecoratingLogger in v8.2.0 did not account for ASCII-8BIT encoded characters qualifying as `valid_encoding?`. Now, ASCII-8BIT characters will be encoded as UTF-8 and include replacement characters as needed. We're very grateful for @nikajukic's collaboration and submission of a test case to resolve this issue.
|
35
|
+
|
36
|
+
|
37
|
+
## v8.2.0
|
38
|
+
|
39
|
+
* **New Instrumentation for Tilt gem**
|
40
|
+
|
41
|
+
Template rendering using [Tilt](https://github.com/rtomayko/tilt) is now instrumented. See [PR #847](https://github.com/newrelic/newrelic-ruby-agent/pull/847) for details.
|
42
|
+
|
43
|
+
* **Configuration `error_collector.ignore_errors` is marked as deprecated**
|
44
|
+
|
45
|
+
This setting has been marked as deprecated in the documentation since version 7.2.0 and is now flagged as deprecated within the code.
|
46
|
+
|
47
|
+
* **Remove Rails 2 instrumentation**
|
48
|
+
|
49
|
+
Though any version of Rails 2 has not been supported by the Ruby Agent since v3.18.1.330, instrumentation for ActionController and ActionWebService specific to that version were still part of the agent. This instrumentation has been removed.
|
50
|
+
|
51
|
+
* **Remove duplicated settings from newrelic.yml**
|
52
|
+
|
53
|
+
Thank you @jakeonfire for bringing this to our attention and @kuroponzu for making the changes!
|
54
|
+
|
55
|
+
* **Bugfix: Span Events recorded when using newrelic_ignore**
|
56
|
+
|
57
|
+
Previously, the agent was incorrectly recording span events only on transactions that should be ignored. This fix will prevent any span events from being created for transactions using newrelic_ignore, or ignored through the `rules.ignore_url_regexes` configuration option.
|
58
|
+
|
59
|
+
* **Bugfix: Print deprecation warning for Cross-Application Tracing if enabled**
|
60
|
+
|
61
|
+
Prior to this change, the deprecation warning would log whenever the agent started up, regardless of configuration. Thank you @alpha-san for bringing this to our attention!
|
62
|
+
|
63
|
+
* **Bugfix: Scrub non-unicode characters from DecoratingLogger**
|
64
|
+
|
65
|
+
To prevent `JSON::GeneratorErrors`, the DecoratingLogger replaces non-unicode characters with the replacement character: �. Thank you @jdelStrother for bringing this to our attention!
|
66
|
+
|
67
|
+
* **Bugfix: Distributed tracing headers emitted errors when agent was not connected**
|
68
|
+
|
69
|
+
Previously, when the agent had not yet connected it would fail to create a trace context payload and emit an error, "TypeError: no implicit conversion of nil into String," to the agent logs. The correct behavior in this situation is to not create these headers due to the lack of required information. Now, the agent will not attempt to create trace context payloads until it has connected. Thank you @Izzette for bringing this to our attention!
|
70
|
+
|
71
|
+
|
72
|
+
## v8.1.0
|
73
|
+
|
74
|
+
* **Instrumentation for Ruby standard library Logger**
|
75
|
+
|
76
|
+
The agent will now automatically instrument Logger, recording number of lines and size of logging output, with breakdown by severity.
|
77
|
+
|
78
|
+
* **Bugfix for Padrino instrumentation**
|
79
|
+
|
80
|
+
A bug was introduced to the way the agent installs padrino instrumentation in 7.0.0. This release fixes the issues with the padrino instrumentation. Thanks to @sriedel for bringing this issue to our attention.
|
81
|
+
|
82
|
+
* **Bugfix: Stop deadlocks between New Relic thread and Delayed Job sampling thread**
|
83
|
+
|
84
|
+
Running the agent's polling queries for the DelayedJobSampler within the same ActiveRecord connection decreases the frequency of deadlocks in development environments. Thanks @jdelStrother for bringing this to our attention and providing excellent sample code to speed up development!
|
85
|
+
|
86
|
+
* **Bugfix: Allow Net::HTTP request to IPv6 addresses**
|
87
|
+
|
88
|
+
The agent will no longer raise an `URI::InvalidURIError` error if an IPv6 address is passed to Net::HTTP. Thank you @tristinbarnett and @tabathadelane for crafting a solution!
|
89
|
+
|
90
|
+
* **Bugfix: Allow integers to be passed to error_collector.ignore_status_codes configuration**
|
91
|
+
|
92
|
+
Integers not wrapped in quotation marks can be passed to `error_collector.ignore_status_codes` in the `newrelic.yml` file. Our thanks goes to @elaguerta and @brammerl for resolving this issue!
|
93
|
+
|
94
|
+
* **Bugfix: Allow add_method_tracer to be used on BasicObjects**
|
95
|
+
|
96
|
+
Previously, our `add_method_tracer` changes referenced `self.class` which is not available on `BasicObjects`. This has been fixed. Thanks to @toncid for bringing this issue to our attention.
|
97
|
+
|
98
|
+
|
3
99
|
## v8.0.0
|
4
100
|
|
5
101
|
* **`add_method_tracer` refactored to use prepend over alias_method chaining**
|
data/CONTRIBUTING.md
CHANGED
@@ -31,7 +31,7 @@ incorrect.
|
|
31
31
|
|
32
32
|
If you are planning on contributing a new feature or an otherwise complex
|
33
33
|
contribution, we kindly ask you to start a conversation with the maintainer team
|
34
|
-
by opening up
|
34
|
+
by opening up a GitHub issue first.
|
35
35
|
|
36
36
|
|
37
37
|
### General Guidelines
|
@@ -66,7 +66,8 @@ issues](../../issues?q=is%3Aissue+is%3Aclosed).
|
|
66
66
|
### Pull Requests
|
67
67
|
|
68
68
|
We can only accept PRs for version v6.12.0 or greater due to open source
|
69
|
-
licensing restrictions.
|
69
|
+
licensing restrictions. Please set the merge branch to `dev` unless the issue
|
70
|
+
states otherwise.
|
70
71
|
|
71
72
|
### Code of Conduct
|
72
73
|
|
@@ -84,18 +85,29 @@ release from this repo, use the appropriate tag. New Relic usually pushes beta
|
|
84
85
|
versions of a release to a working branch before tagging them for General
|
85
86
|
Availability.
|
86
87
|
|
88
|
+
The `main` branch houses the code from the latest release. The `dev` branch
|
89
|
+
includes unreleased work. Please create all new branches off of `dev`.
|
90
|
+
|
87
91
|
## Development Environment Setup
|
88
92
|
|
89
93
|
1. Fork and clone the repo locally
|
90
94
|
- Fork the repository inside GitHub
|
91
95
|
- `git clone git@github.com:<gh username>/newrelic-ruby-agent.git`
|
92
96
|
1. Pick a Ruby version
|
93
|
-
- Use rbenv
|
97
|
+
- Use rbenv, rvm, chruby, asdf, etc. to install any version of Ruby between 2.2 up to the latest stable version
|
94
98
|
1. Install development dependencies
|
95
99
|
- `bundle install`
|
96
100
|
1. Check that your env is setup correctly
|
97
101
|
- `bundle exec rake`
|
98
102
|
|
103
|
+
**Optional:** Install [lefthook](https://github.com/evilmartians/lefthook) to
|
104
|
+
integrate our team's git hooks, such as [rubocop](https://github.com/rubocop/rubocop)
|
105
|
+
linting into your workflow.
|
106
|
+
|
107
|
+
**Note:** These setup instructions will not allow you to run the entire test
|
108
|
+
suite. Some of our suites require services such as MySQL, Postgres, Redis, and
|
109
|
+
others to run.
|
110
|
+
|
99
111
|
## Testing
|
100
112
|
|
101
113
|
The agent includes a suite of unit and functional tests which should be used to
|
data/Guardfile
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
require './test/multiverse/lib/multiverse/bundler_patch'
|
2
2
|
|
3
|
-
test_folders = Dir.glob("test/new_relic/*").select{|f| File.directory?(f)}
|
4
|
-
test_folders += Dir.glob("test/new_relic/**/*").select{|f| File.directory?(f)}
|
3
|
+
test_folders = Dir.glob("test/new_relic/*").select { |f| File.directory?(f) }
|
4
|
+
test_folders += Dir.glob("test/new_relic/**/*").select { |f| File.directory?(f) }
|
5
5
|
|
6
|
-
rake_lib_path = Bundler.with_unbundled_env{ `bundle exec gem which rake`.chomp.gsub("lib/rake.rb", "lib") }
|
7
|
-
ruby_options = %
|
6
|
+
rake_lib_path = Bundler.with_unbundled_env { `bundle exec gem which rake`.chomp.gsub("lib/rake.rb", "lib") }
|
7
|
+
ruby_options = %(-w -I"#{rake_lib_path}" "#{rake_lib_path}/rake/rake_test_loader.rb")
|
8
8
|
|
9
9
|
guard_options = {
|
10
10
|
spring: "bundle exec ruby #{ruby_options} ",
|
11
|
-
test_folders: ['test/new_relic'] + test_folders,
|
11
|
+
test_folders: ['test/new_relic'] + test_folders,
|
12
12
|
all_after_pass: false,
|
13
13
|
all_on_start: false
|
14
14
|
}
|
15
15
|
|
16
16
|
guard :minitest, guard_options do
|
17
|
-
watch(%r{^lib/(.+)\.rb$})
|
17
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
|
18
18
|
watch(%r{^test/.+_test\.rb$})
|
19
|
-
watch(%r{^test/rum/.*})
|
19
|
+
watch(%r{^test/rum/.*}) { "test/new_relic/rack/browser_monitoring_test.rb" }
|
20
20
|
watch(%r{^test/fixtures/cross_agent_tests/distributed_tracing/(.+).json}) { |m| "test/new_relic/agent/distributed_tracing/#{m[1]}_cross_agent_test.rb" }
|
21
|
-
watch('test/test_helper.rb')
|
21
|
+
watch('test/test_helper.rb') { "test/new_relic" }
|
22
22
|
watch('test/agent_helper.rb') { "test/new_relic" }
|
23
23
|
watch('lib/new_relic/agent/configuration/default_source.rb') { "test/new_relic/agent/configuration/orphan_configuration_test.rb" }
|
24
24
|
watch(%r{^lib/new_relic/agent/transaction/(.+).rb}) { |m| "test/new_relic/agent/distributed_tracing/#{m[1]}_cross_agent_test.rb" }
|
data/README.md
CHANGED
@@ -23,6 +23,8 @@ Environments" section below.
|
|
23
23
|
|
24
24
|
## Installing and Using
|
25
25
|
|
26
|
+
The latest released gem for the Ruby Agent can be found at [Rubygems.org](https://rubygems.org/gems/newrelic_rpm)
|
27
|
+
|
26
28
|
### Quick Start
|
27
29
|
|
28
30
|
#### With Bundler
|
@@ -133,6 +135,6 @@ The New Relic Ruby agent also uses source code from third-party libraries. Full
|
|
133
135
|
|
134
136
|
Thank you, and may your application scale to infinity plus one.
|
135
137
|
|
136
|
-
Lew Cirne, Founder
|
138
|
+
Lew Cirne, Founder
|
137
139
|
|
138
140
|
New Relic, Inc.
|
data/Rakefile
CHANGED
@@ -10,7 +10,7 @@ task :test => ['test:newrelic']
|
|
10
10
|
|
11
11
|
namespace :test do
|
12
12
|
desc "Run all tests"
|
13
|
-
task :all => %w
|
13
|
+
task :all => %w[newrelic multiverse]
|
14
14
|
|
15
15
|
begin
|
16
16
|
require 'test_bisect'
|
@@ -27,14 +27,14 @@ namespace :test do
|
|
27
27
|
require File.expand_path(File.join(File.dirname(__FILE__), 'test', 'performance', 'lib', 'performance'))
|
28
28
|
options = {}
|
29
29
|
options[:suite] = args[:suite] if args[:suite]
|
30
|
-
options[:name]
|
30
|
+
options[:name] = args[:name] if args[:name]
|
31
31
|
Performance::Runner.new(options).run_and_report
|
32
32
|
end
|
33
33
|
|
34
|
-
desc "Run agent within existing mini
|
35
|
-
task :env
|
34
|
+
desc "Run agent within existing mini environment(s): env[name1,name2,name3,etc.]"
|
35
|
+
task :env do |t, args|
|
36
36
|
require File.expand_path(File.join(File.dirname(__FILE__), 'test', 'environments', 'lib', 'environments', 'runner'))
|
37
|
-
Environments::Runner.new(args.
|
37
|
+
Environments::Runner.new(args.to_a).run_and_report
|
38
38
|
end
|
39
39
|
|
40
40
|
Rake::TestTask.new(:intentional_fail) do |t|
|
@@ -51,11 +51,10 @@ namespace :test do
|
|
51
51
|
|
52
52
|
# Note unit testing task is defined in lib/tasks/tests.rake to facilitate
|
53
53
|
# running them in a rails application environment.
|
54
|
-
|
55
54
|
end
|
56
55
|
|
57
56
|
desc 'Record build number and stage'
|
58
|
-
task :record_build, [
|
57
|
+
task :record_build, [:build_number, :stage] do |t, args|
|
59
58
|
build_string = args.build_number
|
60
59
|
build_string << ".#{args.stage}" unless args.stage.nil? || args.stage.empty?
|
61
60
|
|
@@ -111,7 +110,7 @@ end
|
|
111
110
|
|
112
111
|
namespace :cross_agent_tests do
|
113
112
|
cross_agent_tests_upstream_path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'cross_agent_tests'))
|
114
|
-
cross_agent_tests_local_path
|
113
|
+
cross_agent_tests_local_path = File.expand_path(File.join(File.dirname(__FILE__), 'test', 'fixtures', 'cross_agent_tests'))
|
115
114
|
|
116
115
|
# Note: before you pull, make sure your local repo is on the correct, synced branch!
|
117
116
|
desc 'Pull latest changes from cross_agent_tests repo'
|
@@ -137,4 +136,3 @@ task :console do
|
|
137
136
|
ARGV.clear
|
138
137
|
Pry.start
|
139
138
|
end
|
140
|
-
|
data/bin/mongrel_rpm
CHANGED
@@ -5,14 +5,14 @@ require 'rack/handler/mongrel'
|
|
5
5
|
require 'optparse'
|
6
6
|
|
7
7
|
port = 3000
|
8
|
-
options = {
|
8
|
+
options = {}
|
9
9
|
appname = nil
|
10
10
|
OptionParser.new do |opts|
|
11
11
|
opts.banner = "Usage: #{File.basename($0)} [options] [app_name]"
|
12
|
-
opts.on("-p", "--port=port", Integer, "default: #{port}") { |
|
13
|
-
opts.on("--[no-]logging", "turn off request logging"
|
14
|
-
opts.on("--license=license_key", "override license key"
|
15
|
-
opts.on("--install", "install a newrelic.yml template"
|
12
|
+
opts.on("-p", "--port=port", Integer, "default: #{port}") { |port| }
|
13
|
+
opts.on("--[no-]logging", "turn off request logging") { |l| options[:logging] = l }
|
14
|
+
opts.on("--license=license_key", "override license key") { |l| options[:license_key] = l }
|
15
|
+
opts.on("--install", "install a newrelic.yml template") { |l| options[:install] = true }
|
16
16
|
opts.separator ""
|
17
17
|
opts.separator "app_name is the name of the application where the metrics will be stored"
|
18
18
|
opts.separator ""
|
@@ -26,8 +26,7 @@ ru_file = File.expand_path(File.join(File.dirname(__FILE__), "..", "lib", "new_r
|
|
26
26
|
rackup_code = File.read ru_file
|
27
27
|
builder = Rack::Builder.new { eval rackup_code, binding, ru_file }
|
28
28
|
|
29
|
-
options = {
|
30
|
-
Rack::Handler::Mongrel.run(builder.to_app, options) do |
|
31
|
-
NewRelic::Agent.logger.info "Started Mongrel listening for '#{NewRelic::Control.instance.app_names.join(" and ")}' data at #{server.host}:#{server.port}"
|
29
|
+
options = {:Host => '127.0.0.1', :Port => port}
|
30
|
+
Rack::Handler::Mongrel.run(builder.to_app, options) do |server|
|
31
|
+
NewRelic::Agent.logger.info "Started Mongrel listening for '#{NewRelic::Control.instance.app_names.join(" and ")}' data at #{server.host}:#{server.port}"
|
32
32
|
end
|
33
|
-
|
data/bin/newrelic
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
# executes one of the commands in the new_relic/commands directory
|
3
3
|
# pass the name of the command as an argument
|
4
4
|
|
5
|
-
$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..','lib'))
|
5
|
+
$LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
6
6
|
require 'new_relic/cli/command'
|
7
7
|
begin
|
8
8
|
NewRelic::Cli::Command.run
|
data/bin/nrdebug
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
require 'tempfile'
|
8
8
|
require 'rbconfig'
|
9
9
|
|
10
|
-
def fail(msg, opts={})
|
10
|
+
def fail(msg, opts = {})
|
11
11
|
$stderr.puts(msg)
|
12
12
|
usage() if opts[:usage]
|
13
13
|
exit(-1)
|
@@ -84,7 +84,7 @@ class ProcessDataProvider
|
|
84
84
|
|
85
85
|
def self.for_process(pid)
|
86
86
|
case RbConfig::CONFIG['target_os']
|
87
|
-
when /linux/
|
87
|
+
when /linux/ then LinuxProcessDataProvider.new(pid)
|
88
88
|
when /darwin/ then DarwinProcessDataProvider.new(pid)
|
89
89
|
end
|
90
90
|
end
|
@@ -170,7 +170,7 @@ end
|
|
170
170
|
class ProcessReport
|
171
171
|
attr_reader :target, :path
|
172
172
|
|
173
|
-
def initialize(target, path=nil)
|
173
|
+
def initialize(target, path = nil)
|
174
174
|
@target = target
|
175
175
|
@path = path
|
176
176
|
end
|
@@ -185,7 +185,7 @@ class ProcessReport
|
|
185
185
|
end
|
186
186
|
end
|
187
187
|
|
188
|
-
def section(f, name=nil)
|
188
|
+
def section(f, name = nil)
|
189
189
|
content = begin
|
190
190
|
yield
|
191
191
|
rescue StandardError => e
|
@@ -200,13 +200,13 @@ class ProcessReport
|
|
200
200
|
|
201
201
|
def generate
|
202
202
|
open do |f|
|
203
|
-
section(f, "Time")
|
204
|
-
section(f, "PID")
|
205
|
-
section(f, "Command")
|
206
|
-
section(f, "RSS")
|
207
|
-
section(f, "CPU")
|
208
|
-
section(f, "Parent PID")
|
209
|
-
section(f, "OS")
|
203
|
+
section(f, "Time") { Time.now }
|
204
|
+
section(f, "PID") { @target.pid }
|
205
|
+
section(f, "Command") { @target.procline }
|
206
|
+
section(f, "RSS") { @target.rss }
|
207
|
+
section(f, "CPU") { @target.cpu }
|
208
|
+
section(f, "Parent PID") { @target.ppid }
|
209
|
+
section(f, "OS") { ShellWrapper.execute('uname -a') }
|
210
210
|
section(f, "Environment") { @target.environment }
|
211
211
|
|
212
212
|
section(f) do
|
@@ -214,13 +214,13 @@ class ProcessReport
|
|
214
214
|
if c_backtraces.match(/could not attach/i)
|
215
215
|
fail("Failed to attach to target process. Please try again with sudo.")
|
216
216
|
end
|
217
|
-
section(f, "C Backtraces")
|
217
|
+
section(f, "C Backtraces") { c_backtraces }
|
218
218
|
section(f, "Ruby Backtrace(s)") { ruby_backtraces }
|
219
219
|
end
|
220
220
|
|
221
221
|
section(f, "Open files") { @target.open_files }
|
222
222
|
section(f, "Log") do
|
223
|
-
commands = Logger.messages.map { |(_,msg)| msg }
|
223
|
+
commands = Logger.messages.map { |(_, msg)| msg }
|
224
224
|
commands.join("\n")
|
225
225
|
end
|
226
226
|
end
|
@@ -243,7 +243,7 @@ def prompt_for_confirmation(target_pid, target_cmd)
|
|
243
243
|
puts ''
|
244
244
|
puts "To continue, type 'continue':"
|
245
245
|
|
246
|
-
until
|
246
|
+
until $stdin.gets.strip == 'continue'
|
247
247
|
puts "Please type 'continue' to continue, or ctrl-c to abort."
|
248
248
|
end
|
249
249
|
end
|
data/init.rb
CHANGED
@@ -18,7 +18,6 @@ require 'new_relic/control'
|
|
18
18
|
# We need it to add dev mode routes after initialization finished.
|
19
19
|
|
20
20
|
begin
|
21
|
-
|
22
21
|
current_config = if defined?(config)
|
23
22
|
config
|
24
23
|
elsif defined?(Rails.configuration)
|
@@ -26,7 +25,6 @@ begin
|
|
26
25
|
end
|
27
26
|
|
28
27
|
NewRelic::Control.instance.init_plugin :config => current_config
|
29
|
-
|
30
28
|
rescue => e
|
31
29
|
::NewRelic::Agent.logger.error "Error initializing New Relic plugin. Agent is disabled.", e
|
32
30
|
end
|
data/lefthook.yml
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
# Lefthook (https://github.com/evilmartians/lefthook) is a git hooks manager
|
2
|
+
# Install it on your machine by running `gem install lefthook`
|
3
|
+
pre-commit:
|
4
|
+
parallel: true
|
5
|
+
commands:
|
6
|
+
rubocop:
|
7
|
+
files: git diff --name-only --staged
|
8
|
+
glob: "*.rb"
|
9
|
+
run: rubocop --force-exclusion {files}
|
@@ -5,7 +5,6 @@
|
|
5
5
|
module NewRelic
|
6
6
|
module Agent
|
7
7
|
class AdaptiveSampler
|
8
|
-
|
9
8
|
def initialize target_samples = 10, period_duration = 60
|
10
9
|
@target = target_samples
|
11
10
|
@seen = 0
|
@@ -29,7 +28,8 @@ module NewRelic
|
|
29
28
|
elsif @sampled_count < @target
|
30
29
|
rand(@seen_last) < @target
|
31
30
|
else
|
32
|
-
|
31
|
+
# you've met the target and need to exponentially back off
|
32
|
+
rand(@seen) < exponential_backoff
|
33
33
|
end
|
34
34
|
|
35
35
|
@sampled_count += 1 if sampled
|
@@ -39,6 +39,10 @@ module NewRelic
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
+
def exponential_backoff
|
43
|
+
@target**(@target.to_f / @sampled_count) - @target**0.5
|
44
|
+
end
|
45
|
+
|
42
46
|
def stats
|
43
47
|
@lock.synchronize do
|
44
48
|
{
|
@@ -57,7 +61,7 @@ module NewRelic
|
|
57
61
|
return unless @period_start + @period_duration <= now
|
58
62
|
|
59
63
|
elapsed_periods = Integer((now - @period_start) / @period_duration)
|
60
|
-
@period_start
|
64
|
+
@period_start += elapsed_periods * @period_duration
|
61
65
|
|
62
66
|
@first_period = false
|
63
67
|
@seen_last = elapsed_periods > 1 ? 0 : @seen
|
@@ -37,7 +37,6 @@ require 'new_relic/agent/connect/response_handler'
|
|
37
37
|
|
38
38
|
module NewRelic
|
39
39
|
module Agent
|
40
|
-
|
41
40
|
# The Agent is a singleton that is instantiated when the plugin is
|
42
41
|
# activated. It collects performance data from ruby applications
|
43
42
|
# in realtime as the application runs, and periodically sends that
|
@@ -54,31 +53,31 @@ module NewRelic
|
|
54
53
|
|
55
54
|
@service = NewRelicService.new
|
56
55
|
|
57
|
-
@events
|
58
|
-
@stats_engine
|
59
|
-
@transaction_sampler
|
60
|
-
@sql_sampler
|
61
|
-
@agent_command_router
|
62
|
-
@monitors
|
63
|
-
@error_collector
|
64
|
-
@transaction_rules
|
65
|
-
@harvest_samplers
|
66
|
-
@monotonic_gc_profiler
|
67
|
-
@javascript_instrumentor
|
68
|
-
@adaptive_sampler
|
69
|
-
|
70
|
-
|
71
|
-
@harvester
|
56
|
+
@events = EventListener.new
|
57
|
+
@stats_engine = StatsEngine.new
|
58
|
+
@transaction_sampler = TransactionSampler.new
|
59
|
+
@sql_sampler = SqlSampler.new
|
60
|
+
@agent_command_router = Commands::AgentCommandRouter.new @events
|
61
|
+
@monitors = Monitors.new @events
|
62
|
+
@error_collector = ErrorCollector.new @events
|
63
|
+
@transaction_rules = RulesEngine.new
|
64
|
+
@harvest_samplers = SamplerCollection.new @events
|
65
|
+
@monotonic_gc_profiler = VM::MonotonicGCProfiler.new
|
66
|
+
@javascript_instrumentor = JavascriptInstrumentor.new @events
|
67
|
+
@adaptive_sampler = AdaptiveSampler.new(Agent.config[:sampling_target],
|
68
|
+
Agent.config[:sampling_target_period_in_seconds])
|
69
|
+
|
70
|
+
@harvester = Harvester.new @events
|
72
71
|
@after_fork_lock = Mutex.new
|
73
72
|
|
74
73
|
@transaction_event_recorder = TransactionEventRecorder.new @events
|
75
|
-
@custom_event_aggregator
|
76
|
-
@span_event_aggregator
|
74
|
+
@custom_event_aggregator = CustomEventAggregator.new @events
|
75
|
+
@span_event_aggregator = SpanEventAggregator.new @events
|
77
76
|
|
78
|
-
@connect_state
|
79
|
-
@connect_attempts
|
80
|
-
@waited_on_connect
|
81
|
-
@connected_pid
|
77
|
+
@connect_state = :pending
|
78
|
+
@connect_attempts = 0
|
79
|
+
@waited_on_connect = nil
|
80
|
+
@connected_pid = nil
|
82
81
|
|
83
82
|
@wait_on_connect_mutex = Mutex.new
|
84
83
|
@wait_on_connect_condition = ConditionVariable.new
|
@@ -110,7 +109,6 @@ module NewRelic
|
|
110
109
|
# Holds all the methods defined on NewRelic::Agent::Agent
|
111
110
|
# instances
|
112
111
|
module InstanceMethods
|
113
|
-
|
114
112
|
# the statistics engine that holds all the timeslice data
|
115
113
|
attr_reader :stats_engine
|
116
114
|
# the transaction sampler that handles recording transactions
|
@@ -184,7 +182,7 @@ module NewRelic
|
|
184
182
|
# * <tt>:keep_retrying => false</tt> if we try to initiate a new
|
185
183
|
# connection, this tells me to only try it once so this method returns
|
186
184
|
# quickly if there is some kind of latency with the server.
|
187
|
-
def after_fork(options={})
|
185
|
+
def after_fork(options = {})
|
188
186
|
needs_restart = false
|
189
187
|
@after_fork_lock.synchronize do
|
190
188
|
needs_restart = @harvester.needs_restart?
|
@@ -284,7 +282,7 @@ module NewRelic
|
|
284
282
|
# Sets a thread local variable as to whether we should or
|
285
283
|
# should not record sql in the current thread. Returns the
|
286
284
|
# previous value, if there is one
|
287
|
-
def set_record_sql(should_record) #THREAD_LOCAL_ACCESS
|
285
|
+
def set_record_sql(should_record) # THREAD_LOCAL_ACCESS
|
288
286
|
state = Tracer.state
|
289
287
|
prev = state.record_sql
|
290
288
|
state.record_sql = should_record
|
@@ -295,13 +293,13 @@ module NewRelic
|
|
295
293
|
# thread. This uses a stack which allows us to disable tracing
|
296
294
|
# children of a transaction without affecting the tracing of
|
297
295
|
# the whole transaction
|
298
|
-
def push_trace_execution_flag(should_trace=false) #THREAD_LOCAL_ACCESS
|
296
|
+
def push_trace_execution_flag(should_trace = false) # THREAD_LOCAL_ACCESS
|
299
297
|
Tracer.state.push_traced(should_trace)
|
300
298
|
end
|
301
299
|
|
302
300
|
# Pop the current trace execution status. Restore trace execution status
|
303
301
|
# to what it was before we pushed the current flag.
|
304
|
-
def pop_trace_execution_flag #THREAD_LOCAL_ACCESS
|
302
|
+
def pop_trace_execution_flag # THREAD_LOCAL_ACCESS
|
305
303
|
Tracer.state.pop_traced
|
306
304
|
end
|
307
305
|
|
@@ -492,7 +490,7 @@ module NewRelic
|
|
492
490
|
# after_fork call restarting the thread in deferred dispatchers.
|
493
491
|
#
|
494
492
|
# Treatment of @started and env report is important to get right.
|
495
|
-
def setup_and_start_agent(options={})
|
493
|
+
def setup_and_start_agent(options = {})
|
496
494
|
@started = true
|
497
495
|
@harvester.mark_started
|
498
496
|
|
@@ -755,7 +753,7 @@ module NewRelic
|
|
755
753
|
# Don't connect if we're already connected, or if we tried to connect
|
756
754
|
# and were rejected with prejudice because of a license issue, unless
|
757
755
|
# we're forced to by force_reconnect.
|
758
|
-
def should_connect?(force=false)
|
756
|
+
def should_connect?(force = false)
|
759
757
|
force || (!connected? && !disconnected?)
|
760
758
|
end
|
761
759
|
|
@@ -788,7 +786,8 @@ module NewRelic
|
|
788
786
|
def handle_license_error(error)
|
789
787
|
::NewRelic::Agent.logger.error( \
|
790
788
|
error.message, \
|
791
|
-
"Visit NewRelic.com to obtain a valid license key, or to upgrade your account."
|
789
|
+
"Visit NewRelic.com to obtain a valid license key, or to upgrade your account."
|
790
|
+
)
|
792
791
|
disconnect
|
793
792
|
end
|
794
793
|
|
@@ -881,20 +880,19 @@ module NewRelic
|
|
881
880
|
raise WaitOnConnectTimeout, "Agent was unable to connect in #{timeout} seconds."
|
882
881
|
end
|
883
882
|
end
|
884
|
-
|
885
883
|
end
|
886
884
|
include Connect
|
887
885
|
|
888
886
|
def container_for_endpoint(endpoint)
|
889
887
|
case endpoint
|
890
|
-
when :metric_data
|
888
|
+
when :metric_data then @stats_engine
|
891
889
|
when :transaction_sample_data then @transaction_sampler
|
892
|
-
when :error_data
|
893
|
-
when :error_event_data
|
894
|
-
when :analytic_event_data
|
895
|
-
when :custom_event_data
|
896
|
-
when :span_event_data
|
897
|
-
when :sql_trace_data
|
890
|
+
when :error_data then @error_collector.error_trace_aggregator
|
891
|
+
when :error_event_data then @error_collector.error_event_aggregator
|
892
|
+
when :analytic_event_data then transaction_event_aggregator
|
893
|
+
when :custom_event_data then @custom_event_aggregator
|
894
|
+
when :span_event_data then span_event_aggregator
|
895
|
+
when :sql_trace_data then @sql_sampler
|
898
896
|
end
|
899
897
|
end
|
900
898
|
|
@@ -931,7 +929,7 @@ module NewRelic
|
|
931
929
|
# This is useful primarily when re-establishing a new connection after
|
932
930
|
# forking off from a parent process.
|
933
931
|
#
|
934
|
-
def connect(options={})
|
932
|
+
def connect(options = {})
|
935
933
|
defaults = {
|
936
934
|
:keep_retrying => Agent.config[:keep_retrying],
|
937
935
|
:force_reconnect => Agent.config[:force_reconnect]
|
@@ -1067,7 +1065,7 @@ module NewRelic
|
|
1067
1065
|
|
1068
1066
|
def harvest_and_send_analytic_event_data
|
1069
1067
|
harvest_and_send_from_container(transaction_event_aggregator, :analytic_event_data)
|
1070
|
-
harvest_and_send_from_container(synthetics_event_aggregator,
|
1068
|
+
harvest_and_send_from_container(synthetics_event_aggregator, :analytic_event_data)
|
1071
1069
|
end
|
1072
1070
|
|
1073
1071
|
def harvest_and_send_custom_event_data
|