newrelic_rpm 5.7.0.350 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +15 -1
- data/.rubocop.yml +1919 -0
- data/.rubocop_todo.yml +100 -0
- data/.simplecov +15 -0
- data/.snyk +11 -0
- data/.yardopts +2 -0
- data/Brewfile +12 -0
- data/CHANGELOG.md +4056 -2339
- data/CONTRIBUTING.md +132 -19
- data/DOCKER.md +167 -0
- data/Dockerfile +10 -0
- data/Gemfile +5 -2
- data/Guardfile +22 -4
- data/LICENSE +202 -38
- data/README.md +87 -87
- data/Rakefile +27 -27
- data/THIRD_PARTY_NOTICES.md +28 -0
- data/Thorfile +5 -0
- data/bin/newrelic +3 -2
- data/bin/newrelic_cmd +1 -0
- data/bin/nrdebug +77 -54
- data/config.dot +5 -5
- data/docker-compose.yml +107 -0
- data/init.rb +5 -7
- data/install.rb +3 -3
- data/lefthook.yml +9 -0
- data/lib/new_relic/agent/adaptive_sampler.rb +14 -10
- data/lib/new_relic/agent/agent.rb +125 -969
- data/lib/new_relic/agent/agent_helpers/connect.rb +227 -0
- data/lib/new_relic/agent/agent_helpers/harvest.rb +153 -0
- data/lib/new_relic/agent/agent_helpers/shutdown.rb +72 -0
- data/lib/new_relic/agent/agent_helpers/special_startup.rb +74 -0
- data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +167 -0
- data/lib/new_relic/agent/agent_helpers/startup.rb +202 -0
- data/lib/new_relic/agent/agent_helpers/transmit.rb +76 -0
- data/lib/new_relic/agent/agent_logger.rb +26 -18
- data/lib/new_relic/agent/attribute_filter.rb +69 -52
- data/lib/new_relic/agent/attribute_processing.rb +8 -8
- data/lib/new_relic/agent/attributes.rb +153 -0
- data/lib/new_relic/agent/audit_logger.rb +19 -4
- data/lib/new_relic/agent/autostart.rb +34 -28
- data/lib/new_relic/agent/chained_call.rb +2 -2
- data/lib/new_relic/agent/commands/agent_command.rb +4 -4
- data/lib/new_relic/agent/commands/agent_command_router.rb +15 -33
- data/lib/new_relic/agent/commands/thread_profiler_session.rb +13 -11
- data/lib/new_relic/agent/configuration/default_source.rb +1480 -1053
- data/lib/new_relic/agent/configuration/dotted_hash.rb +7 -6
- data/lib/new_relic/agent/configuration/environment_source.rb +15 -11
- data/lib/new_relic/agent/configuration/event_harvest_config.rb +68 -0
- data/lib/new_relic/agent/configuration/high_security_source.rb +9 -9
- data/lib/new_relic/agent/configuration/manager.rb +96 -79
- data/lib/new_relic/agent/configuration/manual_source.rb +2 -2
- data/lib/new_relic/agent/configuration/mask_defaults.rb +4 -4
- data/lib/new_relic/agent/configuration/security_policy_source.rb +83 -86
- data/lib/new_relic/agent/configuration/server_source.rb +49 -12
- data/lib/new_relic/agent/configuration/yaml_source.rb +42 -13
- data/lib/new_relic/agent/configuration.rb +2 -2
- data/lib/new_relic/agent/connect/request_builder.rb +61 -0
- data/lib/new_relic/agent/connect/response_handler.rb +58 -0
- data/lib/new_relic/agent/custom_event_aggregator.rb +15 -15
- data/lib/new_relic/agent/database/explain_plan_helpers.rb +5 -6
- data/lib/new_relic/agent/database/obfuscation_helpers.rb +16 -15
- data/lib/new_relic/agent/database/obfuscator.rb +3 -3
- data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +4 -4
- data/lib/new_relic/agent/database.rb +44 -53
- data/lib/new_relic/agent/database_adapter.rb +35 -0
- data/lib/new_relic/agent/datastores/metric_helper.rb +18 -20
- data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +9 -8
- data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +7 -11
- data/lib/new_relic/agent/datastores/mongo.rb +7 -12
- data/lib/new_relic/agent/datastores/nosql_obfuscator.rb +41 -0
- data/lib/new_relic/agent/datastores/redis.rb +6 -12
- data/lib/new_relic/agent/datastores.rb +19 -23
- data/lib/new_relic/agent/deprecator.rb +2 -2
- data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +13 -12
- data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +87 -66
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +84 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +163 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +38 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context.rb +245 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +127 -0
- data/lib/new_relic/agent/distributed_tracing.rb +113 -32
- data/lib/new_relic/agent/encoding_normalizer.rb +5 -3
- data/lib/new_relic/agent/error_collector.rb +99 -63
- data/lib/new_relic/agent/error_event_aggregator.rb +10 -8
- data/lib/new_relic/agent/error_filter.rb +174 -0
- data/lib/new_relic/agent/error_trace_aggregator.rb +6 -4
- data/lib/new_relic/agent/event_aggregator.rb +43 -48
- data/lib/new_relic/agent/event_buffer.rb +8 -9
- data/lib/new_relic/agent/event_listener.rb +2 -3
- data/lib/new_relic/agent/event_loop.rb +27 -25
- data/lib/new_relic/agent/external.rb +20 -51
- data/lib/new_relic/agent/guid_generator.rb +30 -0
- data/lib/new_relic/agent/harvester.rb +5 -6
- data/lib/new_relic/agent/heap.rb +8 -10
- data/lib/new_relic/agent/hostname.rb +26 -5
- data/lib/new_relic/agent/http_clients/abstract.rb +81 -0
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +26 -26
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +31 -17
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +18 -23
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +12 -15
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +24 -8
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +9 -12
- data/lib/new_relic/agent/http_clients/uri_util.rb +12 -13
- data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +22 -52
- data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +39 -0
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +59 -72
- data/lib/new_relic/agent/instrumentation/action_dispatch.rb +31 -0
- data/lib/new_relic/agent/instrumentation/action_dispatch_subscriber.rb +64 -0
- data/lib/new_relic/agent/instrumentation/action_mailbox.rb +30 -0
- data/lib/new_relic/agent/instrumentation/action_mailbox_subscriber.rb +33 -0
- data/lib/new_relic/agent/instrumentation/action_mailer.rb +30 -0
- data/lib/new_relic/agent/instrumentation/action_mailer_subscriber.rb +85 -0
- data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +86 -62
- data/lib/new_relic/agent/instrumentation/active_job.rb +38 -19
- data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +21 -7
- data/lib/new_relic/agent/instrumentation/active_record.rb +95 -46
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +82 -61
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +155 -0
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +36 -12
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +69 -64
- data/lib/new_relic/agent/instrumentation/active_storage.rb +8 -4
- data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +11 -32
- data/lib/new_relic/agent/instrumentation/active_support.rb +27 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/chain.rb +23 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +20 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +12 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger.rb +24 -0
- data/lib/new_relic/agent/instrumentation/active_support_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +150 -0
- data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/bunny.rb +14 -134
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/chain.rb +36 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/instrumentation.rb +21 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/prepend.rb +27 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby.rb +31 -0
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +77 -61
- data/lib/new_relic/agent/instrumentation/curb/chain.rb +91 -0
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +221 -0
- data/lib/new_relic/agent/instrumentation/curb/prepend.rb +61 -0
- data/lib/new_relic/agent/instrumentation/curb.rb +15 -187
- data/lib/new_relic/agent/instrumentation/custom_events.rb +12 -0
- data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +37 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +35 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +48 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +30 -52
- data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +29 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +66 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch.rb +31 -0
- data/lib/new_relic/agent/instrumentation/excon/middleware.rb +8 -7
- data/lib/new_relic/agent/instrumentation/excon.rb +29 -31
- data/lib/new_relic/agent/instrumentation/fiber/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +24 -0
- data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +18 -0
- data/lib/new_relic/agent/instrumentation/fiber.rb +25 -0
- data/lib/new_relic/agent/instrumentation/grape/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
- data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
- data/lib/new_relic/agent/instrumentation/grape.rb +16 -121
- data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +97 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +89 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +111 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +30 -0
- data/lib/new_relic/agent/instrumentation/grpc/helper.rb +32 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/chain.rb +69 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +134 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/rpc_desc_prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/rpc_server_prepend.rb +26 -0
- data/lib/new_relic/agent/instrumentation/grpc_client.rb +23 -0
- data/lib/new_relic/agent/instrumentation/grpc_server.rb +25 -0
- data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +37 -0
- data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httpclient.rb +12 -32
- data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
- data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
- data/lib/new_relic/agent/instrumentation/ignore_actions.rb +5 -6
- data/lib/new_relic/agent/instrumentation/logger/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +66 -0
- data/lib/new_relic/agent/instrumentation/logger/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/logger.rb +26 -0
- data/lib/new_relic/agent/instrumentation/memcache/chain.rb +15 -0
- data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +58 -125
- data/lib/new_relic/agent/instrumentation/memcache/helper.rb +59 -0
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +90 -0
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +101 -0
- data/lib/new_relic/agent/instrumentation/memcache.rb +57 -71
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +15 -14
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +21 -14
- data/lib/new_relic/agent/instrumentation/mongo.rb +7 -132
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +49 -13
- data/lib/new_relic/agent/instrumentation/net_http/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +40 -0
- data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
- data/lib/new_relic/agent/instrumentation/net_http.rb +44 -0
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +142 -0
- data/lib/new_relic/agent/instrumentation/padrino/chain.rb +38 -0
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +28 -0
- data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
- data/lib/new_relic/agent/instrumentation/padrino.rb +22 -58
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +7 -7
- data/lib/new_relic/agent/instrumentation/queue_time.rb +9 -10
- data/lib/new_relic/agent/instrumentation/rack/chain.rb +66 -0
- data/lib/new_relic/agent/instrumentation/rack/helpers.rb +33 -0
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +75 -0
- data/lib/new_relic/agent/instrumentation/rack/prepend.rb +43 -0
- data/lib/new_relic/agent/instrumentation/rack.rb +33 -141
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +19 -55
- data/lib/new_relic/agent/instrumentation/rails_middleware.rb +5 -5
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +36 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +45 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +30 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/custom_events.rb +30 -0
- data/lib/new_relic/agent/instrumentation/rake/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +142 -0
- data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/rake.rb +18 -159
- data/lib/new_relic/agent/instrumentation/redis/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/redis/constants.rb +17 -0
- data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +93 -0
- data/lib/new_relic/agent/instrumentation/redis/middleware.rb +16 -0
- data/lib/new_relic/agent/instrumentation/redis/prepend.rb +29 -0
- data/lib/new_relic/agent/instrumentation/redis.rb +20 -103
- data/lib/new_relic/agent/instrumentation/resque/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/resque/helper.rb +19 -0
- data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +34 -0
- data/lib/new_relic/agent/instrumentation/resque/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/resque.rb +33 -41
- data/lib/new_relic/agent/instrumentation/sequel.rb +17 -20
- data/lib/new_relic/agent/instrumentation/sequel_helper.rb +3 -3
- data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +20 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +30 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +37 -0
- data/lib/new_relic/agent/instrumentation/sidekiq.rb +29 -46
- data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +31 -37
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +125 -0
- data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +3 -3
- data/lib/new_relic/agent/instrumentation/sinatra.rb +35 -165
- data/lib/new_relic/agent/instrumentation/thread/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +28 -0
- data/lib/new_relic/agent/instrumentation/thread/prepend.rb +22 -0
- data/lib/new_relic/agent/instrumentation/thread.rb +20 -0
- data/lib/new_relic/agent/instrumentation/tilt/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +41 -0
- data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/tilt.rb +25 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +80 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +14 -76
- data/lib/new_relic/agent/instrumentation.rb +2 -2
- data/lib/new_relic/agent/internal_agent_error.rb +3 -3
- data/lib/new_relic/agent/javascript_instrumentor.rb +51 -45
- data/lib/new_relic/agent/linking_metadata.rb +44 -0
- data/lib/new_relic/agent/local_log_decorator.rb +37 -0
- data/lib/new_relic/agent/log_event_aggregator.rb +235 -0
- data/lib/new_relic/agent/log_once.rb +2 -2
- data/lib/new_relic/agent/log_priority.rb +20 -0
- data/lib/new_relic/agent/logging.rb +142 -0
- data/lib/new_relic/agent/memory_logger.rb +3 -3
- data/lib/new_relic/agent/messaging.rb +81 -164
- data/lib/new_relic/agent/method_tracer.rb +152 -145
- data/lib/new_relic/agent/method_tracer_helpers.rb +90 -13
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +117 -0
- data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +28 -0
- data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +5 -6
- data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +9 -15
- data/lib/new_relic/agent/monitors.rb +26 -0
- data/lib/new_relic/agent/new_relic_service/encoders.rb +7 -7
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +6 -7
- data/lib/new_relic/agent/new_relic_service/marshaller.rb +8 -29
- data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +5 -5
- data/lib/new_relic/agent/new_relic_service.rb +282 -166
- data/lib/new_relic/agent/noticeable_error.rb +19 -0
- data/lib/new_relic/agent/null_logger.rb +8 -4
- data/lib/new_relic/agent/obfuscator.rb +9 -11
- data/lib/new_relic/agent/parameter_filtering.rb +35 -8
- data/lib/new_relic/agent/payload_metric_mapping.rb +10 -11
- data/lib/new_relic/agent/pipe_channel_manager.rb +28 -18
- data/lib/new_relic/agent/pipe_service.rb +9 -6
- data/lib/new_relic/agent/prepend_supportability.rb +3 -3
- data/lib/new_relic/agent/priority_sampled_buffer.rb +16 -14
- data/lib/new_relic/agent/range_extensions.rb +9 -29
- data/lib/new_relic/agent/rules_engine/replacement_rule.rb +12 -12
- data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +13 -14
- data/lib/new_relic/agent/rules_engine.rb +6 -5
- data/lib/new_relic/agent/sampler.rb +4 -5
- data/lib/new_relic/agent/sampler_collection.rb +4 -5
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +4 -3
- data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +14 -11
- data/lib/new_relic/agent/samplers/memory_sampler.rb +26 -15
- data/lib/new_relic/agent/samplers/object_sampler.rb +2 -2
- data/lib/new_relic/agent/samplers/vm_sampler.rb +22 -20
- data/lib/new_relic/agent/span_event_aggregator.rb +14 -16
- data/lib/new_relic/agent/span_event_primitive.rb +118 -58
- data/lib/new_relic/agent/sql_sampler.rb +25 -25
- data/lib/new_relic/agent/stats.rb +79 -42
- data/lib/new_relic/agent/stats_engine/gc_profiler.rb +11 -13
- data/lib/new_relic/agent/stats_engine/stats_hash.rb +13 -14
- data/lib/new_relic/agent/stats_engine.rb +11 -11
- data/lib/new_relic/agent/synthetics_event_aggregator.rb +8 -9
- data/lib/new_relic/agent/system_info.rb +100 -66
- data/lib/new_relic/agent/threading/agent_thread.rb +20 -16
- data/lib/new_relic/agent/threading/backtrace_node.rb +13 -14
- data/lib/new_relic/agent/threading/backtrace_service.rb +18 -18
- data/lib/new_relic/agent/threading/thread_profile.rb +31 -45
- data/lib/new_relic/agent/timestamp_sampled_buffer.rb +2 -2
- data/lib/new_relic/agent/tracer.rb +513 -0
- data/lib/new_relic/agent/transaction/abstract_segment.rb +131 -41
- data/lib/new_relic/agent/transaction/datastore_segment.rb +22 -18
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +184 -0
- data/lib/new_relic/agent/transaction/distributed_tracing.rb +72 -163
- data/lib/new_relic/agent/transaction/external_request_segment.rb +66 -63
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +34 -46
- data/lib/new_relic/agent/transaction/request_attributes.rb +36 -36
- data/lib/new_relic/agent/transaction/segment.rb +46 -10
- data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +2 -4
- data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +2 -2
- data/lib/new_relic/agent/transaction/trace.rb +21 -24
- data/lib/new_relic/agent/transaction/trace_builder.rb +11 -12
- data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
- data/lib/new_relic/agent/transaction/trace_node.rb +31 -28
- data/lib/new_relic/agent/transaction/tracing.rb +15 -111
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +6 -6
- data/lib/new_relic/agent/transaction.rb +252 -259
- data/lib/new_relic/agent/transaction_error_primitive.rb +34 -37
- data/lib/new_relic/agent/transaction_event_aggregator.rb +13 -13
- data/lib/new_relic/agent/transaction_event_primitive.rb +44 -56
- data/lib/new_relic/agent/transaction_event_recorder.rb +17 -16
- data/lib/new_relic/agent/transaction_metrics.rb +11 -10
- data/lib/new_relic/agent/transaction_sampler.rb +7 -12
- data/lib/new_relic/agent/transaction_time_aggregator.rb +41 -26
- data/lib/new_relic/agent/utilization/aws.rb +34 -4
- data/lib/new_relic/agent/utilization/azure.rb +4 -4
- data/lib/new_relic/agent/utilization/gcp.rb +8 -8
- data/lib/new_relic/agent/utilization/pcf.rb +6 -5
- data/lib/new_relic/agent/utilization/vendor.rb +44 -29
- data/lib/new_relic/agent/utilization_data.rb +43 -6
- data/lib/new_relic/agent/vm/jruby_vm.rb +2 -2
- data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +3 -3
- data/lib/new_relic/agent/vm/mri_vm.rb +46 -19
- data/lib/new_relic/agent/vm/snapshot.rb +6 -6
- data/lib/new_relic/agent/vm.rb +2 -2
- data/lib/new_relic/agent/worker_loop.rb +11 -13
- data/lib/new_relic/agent.rb +151 -79
- data/lib/new_relic/cli/command.rb +21 -23
- data/lib/new_relic/cli/commands/deployments.rb +94 -45
- data/lib/new_relic/cli/commands/install.rb +24 -26
- data/lib/new_relic/coerce.rb +42 -15
- data/lib/new_relic/collection_helper.rb +51 -49
- data/lib/new_relic/constants.rb +39 -0
- data/lib/new_relic/control/class_methods.rb +11 -5
- data/lib/new_relic/control/frameworks/external.rb +3 -3
- data/lib/new_relic/control/frameworks/rails.rb +24 -18
- data/lib/new_relic/control/frameworks/rails3.rb +4 -5
- data/lib/new_relic/control/frameworks/rails4.rb +2 -2
- data/lib/new_relic/control/frameworks/rails_notifications.rb +14 -0
- data/lib/new_relic/control/frameworks/ruby.rb +4 -4
- data/lib/new_relic/control/frameworks/sinatra.rb +8 -2
- data/lib/new_relic/control/frameworks.rb +2 -2
- data/lib/new_relic/control/instance_methods.rb +33 -42
- data/lib/new_relic/control/instrumentation.rb +40 -12
- data/lib/new_relic/control/private_instance_methods.rb +48 -0
- data/lib/new_relic/control/server_methods.rb +4 -5
- data/lib/new_relic/control.rb +2 -3
- data/lib/new_relic/delayed_job_injection.rb +2 -2
- data/lib/new_relic/dependency_detection.rb +129 -18
- data/lib/new_relic/environment_report.rb +41 -35
- data/lib/new_relic/helper.rb +49 -8
- data/lib/new_relic/language_support.rb +30 -6
- data/lib/new_relic/latest_changes.rb +9 -8
- data/lib/new_relic/local_environment.rb +23 -27
- data/lib/new_relic/metric_data.rb +32 -27
- data/lib/new_relic/metric_spec.rb +9 -7
- data/lib/new_relic/noticed_error.rb +46 -33
- data/lib/new_relic/rack/agent_hooks.rb +2 -2
- data/lib/new_relic/rack/agent_middleware.rb +7 -5
- data/lib/new_relic/rack/browser_monitoring.rb +134 -117
- data/lib/new_relic/rack.rb +2 -2
- data/lib/new_relic/recipes/capistrano3.rb +4 -62
- data/lib/new_relic/recipes/capistrano_legacy.rb +24 -27
- data/lib/new_relic/recipes/helpers/send_deployment.rb +70 -0
- data/lib/new_relic/recipes.rb +2 -2
- data/lib/new_relic/supportability_helper.rb +21 -7
- data/lib/new_relic/traced_thread.rb +39 -0
- data/lib/new_relic/version.rb +7 -18
- data/lib/newrelic_rpm.rb +20 -33
- data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +16 -19
- data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +9 -15
- data/lib/tasks/all.rb +4 -4
- data/lib/tasks/config.rake +22 -118
- data/lib/tasks/coverage_report.rake +28 -0
- data/lib/tasks/helpers/config.html.erb +21 -0
- data/lib/tasks/helpers/format.rb +123 -0
- data/lib/tasks/helpers/matches.rb +12 -0
- data/lib/tasks/helpers/prompt.rb +24 -0
- data/lib/tasks/helpers/removers.rb +33 -0
- data/lib/tasks/install.rake +4 -0
- data/lib/tasks/instrumentation_generator/README.md +63 -0
- data/lib/tasks/instrumentation_generator/TODO.md +33 -0
- data/lib/tasks/instrumentation_generator/instrumentation.thor +121 -0
- data/lib/tasks/instrumentation_generator/templates/Envfile.tt +9 -0
- data/lib/tasks/instrumentation_generator/templates/chain.tt +22 -0
- data/lib/tasks/instrumentation_generator/templates/chain_method.tt +8 -0
- data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +29 -0
- data/lib/tasks/instrumentation_generator/templates/instrumentation.tt +13 -0
- data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +3 -0
- data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +19 -0
- data/lib/tasks/instrumentation_generator/templates/prepend.tt +13 -0
- data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +3 -0
- data/lib/tasks/instrumentation_generator/templates/test.tt +15 -0
- data/lib/tasks/multiverse.rake +4 -0
- data/lib/tasks/multiverse.rb +12 -5
- data/lib/tasks/newrelic.rb +2 -2
- data/lib/tasks/tests.rake +14 -14
- data/newrelic.yml +672 -3
- data/newrelic_rpm.gemspec +40 -31
- data/recipes/newrelic.rb +3 -3
- data/test/agent_helper.rb +419 -98
- metadata +238 -127
- data/.travis.yml +0 -228
- data/bin/mongrel_rpm +0 -33
- data/cert/cacert.pem +0 -1177
- data/lib/new_relic/agent/commands/xray_session.rb +0 -55
- data/lib/new_relic/agent/commands/xray_session_collection.rb +0 -161
- data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
- data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +0 -44
- data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +0 -53
- data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -41
- data/lib/new_relic/agent/distributed_trace_payload.rb +0 -246
- data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
- data/lib/new_relic/agent/instrumentation/active_record_4.rb +0 -42
- data/lib/new_relic/agent/instrumentation/active_record_5.rb +0 -41
- data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -74
- data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -25
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -202
- data/lib/new_relic/agent/instrumentation/evented_subscriber.rb +0 -104
- data/lib/new_relic/agent/instrumentation/excon/connection.rb +0 -46
- data/lib/new_relic/agent/instrumentation/http.rb +0 -46
- data/lib/new_relic/agent/instrumentation/merb/controller.rb +0 -44
- data/lib/new_relic/agent/instrumentation/merb/errors.rb +0 -33
- data/lib/new_relic/agent/instrumentation/net.rb +0 -50
- data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +0 -125
- data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +0 -46
- data/lib/new_relic/agent/instrumentation/rails4/action_controller.rb +0 -32
- data/lib/new_relic/agent/instrumentation/rails4/action_view.rb +0 -27
- data/lib/new_relic/agent/instrumentation/rails5/action_cable.rb +0 -36
- data/lib/new_relic/agent/instrumentation/rails5/action_controller.rb +0 -33
- data/lib/new_relic/agent/instrumentation/rails5/action_view.rb +0 -27
- data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +0 -26
- data/lib/new_relic/agent/instrumentation/sunspot.rb +0 -33
- data/lib/new_relic/agent/supported_versions.rb +0 -275
- data/lib/new_relic/agent/transaction/attributes.rb +0 -154
- data/lib/new_relic/agent/transaction/xray_sample_buffer.rb +0 -64
- data/lib/new_relic/agent/transaction_state.rb +0 -186
- data/lib/new_relic/build.rb +0 -2
- data/lib/new_relic/control/frameworks/merb.rb +0 -29
- data/lib/new_relic/control/frameworks/rails5.rb +0 -14
- data/lib/new_relic/metrics.rb +0 -13
- data/lib/tasks/config.html.erb +0 -32
- data/lib/tasks/versions.html.erb +0 -28
- data/lib/tasks/versions.postface.html +0 -8
- data/lib/tasks/versions.preface.html +0 -9
- data/lib/tasks/versions.rake +0 -65
- data/lib/tasks/versions.txt.erb +0 -14
- /data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
@@ -0,0 +1,174 @@
|
|
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 NewRelic
|
6
|
+
module Agent
|
7
|
+
# Handles loading of ignored and expected errors from the agent configuration, and
|
8
|
+
# determining at runtime whether an exception is ignored or expected.
|
9
|
+
class ErrorFilter
|
10
|
+
def initialize
|
11
|
+
reset
|
12
|
+
end
|
13
|
+
|
14
|
+
def reset
|
15
|
+
@ignore_classes, @expected_classes = [], []
|
16
|
+
@ignore_messages, @expected_messages = {}, {}
|
17
|
+
@ignore_status_codes, @expected_status_codes = [], []
|
18
|
+
end
|
19
|
+
|
20
|
+
def load_all
|
21
|
+
%i[
|
22
|
+
ignore_classes ignore_messages ignore_status_codes
|
23
|
+
expected_classes expected_messages expected_status_codes
|
24
|
+
].each { |setting| load_from_config(setting) }
|
25
|
+
end
|
26
|
+
|
27
|
+
def load_from_config(setting, value = nil)
|
28
|
+
errors = nil
|
29
|
+
new_value = value || fetch_agent_config(setting.to_sym)
|
30
|
+
|
31
|
+
return if new_value.nil? || (new_value.respond_to?(:empty?) && new_value.empty?)
|
32
|
+
|
33
|
+
case setting.to_sym
|
34
|
+
when :ignore_classes
|
35
|
+
new_value = new_value.split(',').map!(&:strip) if new_value.is_a?(String)
|
36
|
+
errors = @ignore_classes = new_value
|
37
|
+
when :ignore_messages
|
38
|
+
errors = @ignore_messages = new_value || {}
|
39
|
+
when :ignore_status_codes
|
40
|
+
errors = @ignore_status_codes = parse_status_codes(new_value) || []
|
41
|
+
when :expected_classes
|
42
|
+
errors = @expected_classes = new_value || []
|
43
|
+
when :expected_messages
|
44
|
+
errors = @expected_messages = new_value || {}
|
45
|
+
when :expected_status_codes
|
46
|
+
errors = @expected_status_codes = parse_status_codes(new_value) || []
|
47
|
+
end
|
48
|
+
log_filter(setting, errors) if errors
|
49
|
+
end
|
50
|
+
|
51
|
+
def ignore?(ex, status_code = nil)
|
52
|
+
@ignore_classes.include?(ex.class.name) ||
|
53
|
+
(@ignore_messages.key?(ex.class.name) &&
|
54
|
+
@ignore_messages[ex.class.name].any? { |m| ex.message.include?(m) }) ||
|
55
|
+
@ignore_status_codes.include?(status_code.to_i)
|
56
|
+
end
|
57
|
+
|
58
|
+
def expected?(ex, status_code = nil)
|
59
|
+
@expected_classes.include?(ex.class.name) ||
|
60
|
+
(@expected_messages.key?(ex.class.name) &&
|
61
|
+
@expected_messages[ex.class.name].any? { |m| ex.message.include?(m) }) ||
|
62
|
+
@expected_status_codes.include?(status_code.to_i)
|
63
|
+
end
|
64
|
+
|
65
|
+
def fetch_agent_config(cfg)
|
66
|
+
NewRelic::Agent.config[:"error_collector.#{cfg}"]
|
67
|
+
end
|
68
|
+
|
69
|
+
# A generic method for adding ignore filters manually. This is kept for compatibility
|
70
|
+
# with the previous ErrorCollector#ignore method, and adds some flexibility for adding
|
71
|
+
# different ignore/expected error types by examining each argument.
|
72
|
+
def ignore(*args)
|
73
|
+
args.each do |errors|
|
74
|
+
case errors
|
75
|
+
when Array
|
76
|
+
errors.each { |e| ignore(e) }
|
77
|
+
when Integer
|
78
|
+
@ignore_status_codes << errors
|
79
|
+
when Hash
|
80
|
+
@ignore_messages.update(errors)
|
81
|
+
log_filter(:ignore_messages, errors)
|
82
|
+
when String
|
83
|
+
if errors =~ /^[\d\,\-]+$/
|
84
|
+
@ignore_status_codes |= parse_status_codes(errors)
|
85
|
+
log_filter(:ignore_status_codes, errors)
|
86
|
+
else
|
87
|
+
new_ignore_classes = errors.split(',').map!(&:strip)
|
88
|
+
@ignore_classes |= new_ignore_classes
|
89
|
+
log_filter(:ignore_classes, new_ignore_classes)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# See #ignore above.
|
96
|
+
def expect(*args)
|
97
|
+
args.each do |errors|
|
98
|
+
case errors
|
99
|
+
when Array
|
100
|
+
errors.each { |e| expect(e) }
|
101
|
+
when Integer
|
102
|
+
@expected_status_codes << errors
|
103
|
+
when Hash
|
104
|
+
@expected_messages.update(errors)
|
105
|
+
log_filter(:expected_messages, errors)
|
106
|
+
when String
|
107
|
+
if errors =~ /^[\d\,\-]+$/
|
108
|
+
@expected_status_codes |= parse_status_codes(errors)
|
109
|
+
log_filter(:expected_status_codes, errors)
|
110
|
+
else
|
111
|
+
new_expected_classes = errors.split(',').map!(&:strip)
|
112
|
+
@expected_classes |= new_expected_classes
|
113
|
+
log_filter(:expected_classes, new_expected_classes)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
private
|
120
|
+
|
121
|
+
def log_filter(setting, errors)
|
122
|
+
case setting
|
123
|
+
when :ignore_classes
|
124
|
+
errors.each do |error|
|
125
|
+
::NewRelic::Agent.logger.debug("Ignoring errors of type '#{error}'")
|
126
|
+
end
|
127
|
+
when :ignore_messages
|
128
|
+
errors.each do |error, messages|
|
129
|
+
::NewRelic::Agent.logger.debug("Ignoring errors of type '#{error}' with messages: #{messages.join(',')}")
|
130
|
+
end
|
131
|
+
when :ignore_status_codes
|
132
|
+
::NewRelic::Agent.logger.debug("Ignoring errors associated with status codes: #{errors}")
|
133
|
+
when :expected_classes
|
134
|
+
errors.each do |error|
|
135
|
+
::NewRelic::Agent.logger.debug("Expecting errors of type '#{error}'")
|
136
|
+
end
|
137
|
+
when :expected_messages
|
138
|
+
errors.each do |error, messages|
|
139
|
+
::NewRelic::Agent.logger.debug("Expecting errors of type '#{error}' with messages: #{messages.join(',')}")
|
140
|
+
end
|
141
|
+
when :expected_status_codes
|
142
|
+
::NewRelic::Agent.logger.debug("Expecting errors associated with status codes: #{errors}")
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def parse_status_codes(codes)
|
147
|
+
code_list = case codes
|
148
|
+
when String
|
149
|
+
codes.split(',')
|
150
|
+
when Integer
|
151
|
+
[codes]
|
152
|
+
else
|
153
|
+
codes
|
154
|
+
end
|
155
|
+
result = []
|
156
|
+
code_list.each do |code|
|
157
|
+
result << code && next if code.is_a?(Integer)
|
158
|
+
|
159
|
+
m = code.match(/(\d{3})(-\d{3})?/)
|
160
|
+
if m.nil? || m[1].nil?
|
161
|
+
::NewRelic::Agent.logger.warn("Invalid HTTP status code: '#{code}'; ignoring config")
|
162
|
+
next
|
163
|
+
end
|
164
|
+
if m[2]
|
165
|
+
result += (m[1]..m[2].tr('-', '')).to_a.map(&:to_i)
|
166
|
+
else
|
167
|
+
result << m[1].to_i
|
168
|
+
end
|
169
|
+
end
|
170
|
+
result.uniq
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# -*- ruby -*-
|
2
|
-
# encoding: utf-8
|
3
2
|
# This file is distributed under New Relic's license terms.
|
4
|
-
# See https://github.com/newrelic/
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
# frozen_string_literal: true
|
5
5
|
|
6
6
|
module NewRelic
|
7
7
|
module Agent
|
@@ -44,6 +44,7 @@ module NewRelic
|
|
44
44
|
# floor after logging a warning.
|
45
45
|
def add_to_error_queue(noticed_error)
|
46
46
|
return unless enabled?
|
47
|
+
|
47
48
|
@lock.synchronize do
|
48
49
|
if !over_queue_limit?(noticed_error.message) && !@errors.include?(noticed_error)
|
49
50
|
@errors << noticed_error
|
@@ -54,7 +55,7 @@ module NewRelic
|
|
54
55
|
# checks the size of the error queue to make sure we are under
|
55
56
|
# the maximum limit, and logs a warning if we are over the limit.
|
56
57
|
def over_queue_limit?(message)
|
57
|
-
over_limit = (@errors.
|
58
|
+
over_limit = (@errors.count { |err| !err.is_internal } >= @capacity)
|
58
59
|
if over_limit
|
59
60
|
::NewRelic::Agent.logger.warn("The error reporting queue has reached #{@capacity}. The error detail for this and subsequent errors will not be transmitted to New Relic until the queued errors have been sent: #{message}")
|
60
61
|
end
|
@@ -91,7 +92,8 @@ module NewRelic
|
|
91
92
|
|
92
93
|
def register_config_callbacks
|
93
94
|
Agent.config.register_callback(:'error_collector.enabled') do |enabled|
|
94
|
-
|
95
|
+
reset! if enabled == false
|
96
|
+
::NewRelic::Agent.logger.debug("Error traces will #{enabled ? '' : 'not '}be sent to the New Relic service.")
|
95
97
|
end
|
96
98
|
end
|
97
99
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
require 'new_relic/agent/priority_sampled_buffer'
|
6
6
|
|
@@ -8,37 +8,38 @@ module NewRelic
|
|
8
8
|
module Agent
|
9
9
|
class EventAggregator
|
10
10
|
class << self
|
11
|
-
|
12
|
-
# implementation provide its own `named`, `capacity_key`, and
|
13
|
-
# `enabled_...` settings. In particular, we do not allow
|
14
|
-
# subclasses to share these values from an intermediate
|
15
|
-
# superclass.
|
16
|
-
|
17
|
-
def inherited(subclass)
|
18
|
-
# Prevent uninitialized variable warnings; we have to do
|
19
|
-
# this as soon as the subclass is defined, before its
|
20
|
-
# implementor calls enabled_key() or enabled_fn().
|
21
|
-
subclass.instance_variable_set(:@enabled_key, nil)
|
22
|
-
subclass.instance_variable_set(:@enabled_fn, nil)
|
23
|
-
end
|
24
|
-
|
25
|
-
def named named = nil
|
11
|
+
def named(named = nil)
|
26
12
|
named ? @named = named.to_s.freeze : @named
|
27
13
|
end
|
28
14
|
|
29
|
-
def capacity_key
|
15
|
+
def capacity_key(key = nil)
|
30
16
|
key ? @capacity_key = key : @capacity_key
|
31
17
|
end
|
32
18
|
|
33
|
-
|
34
|
-
|
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
|
35
30
|
end
|
36
31
|
|
37
|
-
|
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)
|
38
39
|
fn ? @enabled_fn = fn : @enabled_fn
|
39
40
|
end
|
40
41
|
|
41
|
-
def buffer_class
|
42
|
+
def buffer_class(klass = nil)
|
42
43
|
if klass
|
43
44
|
@buffer_class = klass
|
44
45
|
else
|
@@ -47,13 +48,13 @@ module NewRelic
|
|
47
48
|
end
|
48
49
|
end
|
49
50
|
|
50
|
-
def initialize
|
51
|
+
def initialize(events)
|
51
52
|
@lock = Mutex.new
|
52
|
-
@buffer = self.class.buffer_class.new
|
53
|
-
@enabled = false
|
53
|
+
@buffer = self.class.buffer_class.new(NewRelic::Agent.config[self.class.capacity_key])
|
54
|
+
@enabled = self.class.enabled_fn ? self.class.enabled_fn.call : false
|
54
55
|
@notified_full = false
|
55
56
|
register_capacity_callback
|
56
|
-
register_enabled_callback
|
57
|
+
register_enabled_callback(events)
|
57
58
|
after_initialize
|
58
59
|
end
|
59
60
|
|
@@ -62,11 +63,10 @@ module NewRelic
|
|
62
63
|
end
|
63
64
|
|
64
65
|
# interface method for subclasses to override to provide post harvest functionality
|
65
|
-
def after_harvest
|
66
|
+
def after_harvest(metadata)
|
66
67
|
end
|
67
68
|
|
68
69
|
def enabled?
|
69
|
-
return self.class.enabled_fn.call if self.class.enabled_fn
|
70
70
|
@enabled
|
71
71
|
end
|
72
72
|
|
@@ -78,11 +78,11 @@ module NewRelic
|
|
78
78
|
metadata = nil
|
79
79
|
samples = []
|
80
80
|
@lock.synchronize do
|
81
|
-
samples.concat
|
81
|
+
samples.concat(@buffer.to_a)
|
82
82
|
metadata = @buffer.metadata
|
83
83
|
reset_buffer!
|
84
84
|
end
|
85
|
-
after_harvest
|
85
|
+
after_harvest(metadata)
|
86
86
|
[reservoir_metadata(metadata), samples]
|
87
87
|
end
|
88
88
|
|
@@ -90,15 +90,15 @@ module NewRelic
|
|
90
90
|
# the buffer to ensure accuracy of buffer of metadata. We want to make sure not to
|
91
91
|
# double count samples being merged back in from a failed harvest, yet we do not
|
92
92
|
# want to under-count samples being merged from the PipeService.
|
93
|
-
def merge!
|
93
|
+
def merge!(payload, adjust_count = true)
|
94
94
|
@lock.synchronize do
|
95
95
|
_, samples = payload
|
96
96
|
|
97
97
|
if adjust_count
|
98
|
-
@buffer.decrement_lifetime_counts_by
|
98
|
+
@buffer.decrement_lifetime_counts_by(samples.count)
|
99
99
|
end
|
100
100
|
|
101
|
-
samples.each { |s| @buffer.append
|
101
|
+
samples.each { |s| @buffer.append(event: s) }
|
102
102
|
end
|
103
103
|
end
|
104
104
|
|
@@ -110,7 +110,7 @@ module NewRelic
|
|
110
110
|
|
111
111
|
private
|
112
112
|
|
113
|
-
def reservoir_metadata
|
113
|
+
def reservoir_metadata(metadata)
|
114
114
|
{
|
115
115
|
:reservoir_size => metadata[:capacity],
|
116
116
|
:events_seen => metadata[:seen]
|
@@ -119,30 +119,25 @@ module NewRelic
|
|
119
119
|
|
120
120
|
def register_capacity_callback
|
121
121
|
NewRelic::Agent.config.register_callback(self.class.capacity_key) do |max_samples|
|
122
|
-
NewRelic::Agent.logger.debug
|
122
|
+
NewRelic::Agent.logger.debug("#{self.class.named} max_samples set to #{max_samples}")
|
123
123
|
@lock.synchronize do
|
124
124
|
@buffer.capacity = max_samples
|
125
125
|
end
|
126
126
|
end
|
127
127
|
end
|
128
128
|
|
129
|
-
def register_enabled_callback
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
NewRelic::Agent.config.register_callback(self.class.enabled_key) do |enabled|
|
137
|
-
# intentionally unsynchronized for liveness
|
138
|
-
@enabled = enabled
|
139
|
-
::NewRelic::Agent.logger.debug "#{self.class.named} will #{enabled ? '' : 'not '}be sent to the New Relic service."
|
140
|
-
end
|
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
|
+
}
|
141
135
|
end
|
142
136
|
|
143
137
|
def notify_if_full
|
144
138
|
return unless !@notified_full && @buffer.full?
|
145
|
-
|
139
|
+
|
140
|
+
NewRelic::Agent.logger.debug("#{self.class.named} capacity of #{@buffer.capacity} reached, beginning sampling")
|
146
141
|
@notified_full = true
|
147
142
|
end
|
148
143
|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
# EventBuffer is intended to be an abstract base class. It should not be
|
6
6
|
# instantiated directly. Subclasses should define an `append_event` method
|
@@ -22,22 +22,22 @@ module NewRelic
|
|
22
22
|
|
23
23
|
def initialize(capacity)
|
24
24
|
@capacity = capacity
|
25
|
-
@items
|
26
|
-
@seen
|
25
|
+
@items = []
|
26
|
+
@seen = 0
|
27
27
|
end
|
28
28
|
|
29
29
|
def reset!
|
30
30
|
@items = []
|
31
|
-
@seen
|
31
|
+
@seen = 0
|
32
32
|
end
|
33
33
|
|
34
34
|
def capacity=(new_capacity)
|
35
35
|
@capacity = new_capacity
|
36
36
|
old_items = @items
|
37
|
-
@items
|
38
|
-
old_seen
|
37
|
+
@items = []
|
38
|
+
old_seen = @seen
|
39
39
|
old_items.each { |i| append(i) }
|
40
|
-
@seen
|
40
|
+
@seen = old_seen
|
41
41
|
end
|
42
42
|
|
43
43
|
def append(x)
|
@@ -88,4 +88,3 @@ module NewRelic
|
|
88
88
|
end
|
89
89
|
end
|
90
90
|
end
|
91
|
-
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
module NewRelic::Agent
|
6
6
|
# Basic mechanism for the agent instance to provide agent-wide eventing.
|
@@ -9,7 +9,6 @@ module NewRelic::Agent
|
|
9
9
|
# While an EventListener could be used elsewhere, it's strongly expected
|
10
10
|
# your eventing needs should be met by the agent's instance.
|
11
11
|
class EventListener
|
12
|
-
|
13
12
|
attr_accessor :runaway_threshold
|
14
13
|
|
15
14
|
def initialize
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
require 'thread'
|
6
6
|
|
@@ -10,11 +10,11 @@ module NewRelic
|
|
10
10
|
class Timer
|
11
11
|
attr_reader :next_fire_time, :event, :interval, :last_fired_at
|
12
12
|
|
13
|
-
def initialize(interval, event, repeat=false)
|
14
|
-
@interval
|
15
|
-
@event
|
16
|
-
@repeat
|
17
|
-
@started_at
|
13
|
+
def initialize(interval, event, repeat = false)
|
14
|
+
@interval = interval
|
15
|
+
@event = event
|
16
|
+
@repeat = repeat
|
17
|
+
@started_at = Process.clock_gettime(Process::CLOCK_REALTIME)
|
18
18
|
@last_fired_at = nil
|
19
19
|
reschedule
|
20
20
|
end
|
@@ -32,8 +32,9 @@ module NewRelic
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def calculate_next_fire_time
|
35
|
-
now =
|
35
|
+
now = Process.clock_gettime(Process::CLOCK_REALTIME)
|
36
36
|
return now if @interval == 0
|
37
|
+
|
37
38
|
fire_time = @last_fired_at || now
|
38
39
|
while fire_time <= now
|
39
40
|
fire_time += @interval
|
@@ -42,10 +43,10 @@ module NewRelic
|
|
42
43
|
end
|
43
44
|
|
44
45
|
def set_fired_time
|
45
|
-
@last_fired_at =
|
46
|
+
@last_fired_at = Process.clock_gettime(Process::CLOCK_REALTIME)
|
46
47
|
end
|
47
48
|
|
48
|
-
def due?(now=
|
49
|
+
def due?(now = Process.clock_gettime(Process::CLOCK_REALTIME))
|
49
50
|
now >= @next_fire_time
|
50
51
|
end
|
51
52
|
|
@@ -57,19 +58,19 @@ module NewRelic
|
|
57
58
|
def initialize
|
58
59
|
@self_pipe_rd, @self_pipe_wr = IO.pipe
|
59
60
|
@event_queue = Queue.new
|
60
|
-
@stopped
|
61
|
-
@timers
|
61
|
+
@stopped = false
|
62
|
+
@timers = {}
|
62
63
|
|
63
|
-
@subscriptions = Hash.new { |h,k| h[k] = [] }
|
64
|
-
@subscriptions[:__add_timer] <<
|
65
|
-
@subscriptions[:__add_event] <<
|
64
|
+
@subscriptions = Hash.new { |h, k| h[k] = [] }
|
65
|
+
@subscriptions[:__add_timer] << proc { |t| set_timer(t) }
|
66
|
+
@subscriptions[:__add_event] << proc { |e, blk| @subscriptions[e] << blk }
|
66
67
|
end
|
67
68
|
|
68
69
|
def set_timer(timer)
|
69
70
|
existing_timer = @timers[timer.event]
|
70
71
|
|
71
72
|
if existing_timer
|
72
|
-
elapsed_interval =
|
73
|
+
elapsed_interval = Process.clock_gettime(Process::CLOCK_REALTIME) - existing_timer.last_interval_start
|
73
74
|
timer.advance(elapsed_interval)
|
74
75
|
end
|
75
76
|
|
@@ -80,8 +81,9 @@ module NewRelic
|
|
80
81
|
|
81
82
|
def next_timeout
|
82
83
|
return nil if @timers.empty?
|
83
|
-
|
84
|
-
timeout
|
84
|
+
|
85
|
+
timeout = @timers.values.map(&:next_fire_time).min - Process.clock_gettime(Process::CLOCK_REALTIME)
|
86
|
+
[timeout, 0].max
|
85
87
|
end
|
86
88
|
|
87
89
|
def stopped?
|
@@ -94,13 +96,13 @@ module NewRelic
|
|
94
96
|
end
|
95
97
|
|
96
98
|
def run
|
97
|
-
::NewRelic::Agent.logger.debug
|
99
|
+
::NewRelic::Agent.logger.debug("Running event loop")
|
98
100
|
while !stopped?
|
99
101
|
run_once
|
100
102
|
end
|
101
103
|
end
|
102
104
|
|
103
|
-
def run_once(nonblock=false)
|
105
|
+
def run_once(nonblock = false)
|
104
106
|
wait_to_run(nonblock)
|
105
107
|
|
106
108
|
prune_timers
|
@@ -154,7 +156,7 @@ module NewRelic
|
|
154
156
|
end
|
155
157
|
|
156
158
|
if !errors.empty?
|
157
|
-
::NewRelic::Agent.logger.error
|
159
|
+
::NewRelic::Agent.logger.error("#{errors.size} error(s) running task for event '#{event}' in Agent Event Loop:", *errors)
|
158
160
|
end
|
159
161
|
end
|
160
162
|
|
@@ -172,20 +174,20 @@ module NewRelic
|
|
172
174
|
end
|
173
175
|
|
174
176
|
def fire_every(interval, event)
|
175
|
-
::NewRelic::Agent.logger.debug
|
177
|
+
::NewRelic::Agent.logger.debug("Firing event #{event} every #{interval} seconds.")
|
176
178
|
fire(:__add_timer, Timer.new(interval, event, true))
|
177
179
|
end
|
178
180
|
|
179
181
|
def fire_after(interval, event)
|
180
|
-
::NewRelic::Agent.logger.debug
|
182
|
+
::NewRelic::Agent.logger.debug("Firing event #{event} after #{interval} seconds.")
|
181
183
|
fire(:__add_timer, Timer.new(interval, event, false))
|
182
184
|
end
|
183
185
|
|
184
186
|
def wakeup
|
185
187
|
begin
|
186
|
-
@self_pipe_wr.write_nonblock
|
188
|
+
@self_pipe_wr.write_nonblock('.')
|
187
189
|
rescue Errno::EAGAIN
|
188
|
-
::NewRelic::Agent.logger.debug
|
190
|
+
::NewRelic::Agent.logger.debug("Failed to wakeup event loop")
|
189
191
|
end
|
190
192
|
end
|
191
193
|
end
|