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
@@ -1,9 +1,8 @@
|
|
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 DependencyDetection
|
6
|
-
|
7
6
|
module_function
|
8
7
|
|
9
8
|
@items = []
|
@@ -21,6 +20,7 @@ module DependencyDetection
|
|
21
20
|
end
|
22
21
|
|
23
22
|
@items << item
|
23
|
+
return item
|
24
24
|
end
|
25
25
|
|
26
26
|
def detect!
|
@@ -32,7 +32,7 @@ module DependencyDetection
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def dependency_by_name(name)
|
35
|
-
@items.find {|i| i.name == name }
|
35
|
+
@items.find { |i| i.name == name }
|
36
36
|
end
|
37
37
|
|
38
38
|
def installed?(name)
|
@@ -51,28 +51,73 @@ module DependencyDetection
|
|
51
51
|
class Dependent
|
52
52
|
attr_reader :executed
|
53
53
|
attr_accessor :name
|
54
|
+
attr_writer :config_name
|
55
|
+
attr_reader :dependencies
|
56
|
+
attr_reader :prepend_conflicts
|
57
|
+
|
54
58
|
def executed!
|
55
59
|
@executed = true
|
56
60
|
end
|
57
61
|
|
58
|
-
|
62
|
+
def config_name
|
63
|
+
@config_name || @name
|
64
|
+
end
|
59
65
|
|
60
66
|
def initialize
|
61
67
|
@dependencies = []
|
62
68
|
@executes = []
|
69
|
+
@prepend_conflicts = []
|
63
70
|
@name = nil
|
71
|
+
@config_name = nil
|
64
72
|
end
|
65
73
|
|
66
74
|
def dependencies_satisfied?
|
67
75
|
!executed and check_dependencies
|
68
76
|
end
|
69
77
|
|
78
|
+
def source_location_for(klass, method_name)
|
79
|
+
Object.instance_method(:method).bind(klass.allocate).call(method_name).source_location.to_s
|
80
|
+
end
|
81
|
+
|
82
|
+
# Extracts the instrumented library name from the instrumenting module's name
|
83
|
+
# Given "NewRelic::Agent::Instrumentation::NetHTTP::Prepend"
|
84
|
+
# Will extract "NetHTTP" which is in the 2nd to last spot
|
85
|
+
def extract_supportability_name(instrumenting_module)
|
86
|
+
instrumenting_module.to_s.split("::")[-2]
|
87
|
+
end
|
88
|
+
|
89
|
+
def log_and_instrument(method, instrumenting_module, supportability_name)
|
90
|
+
supportability_name ||= extract_supportability_name(instrumenting_module)
|
91
|
+
NewRelic::Agent.logger.info("Installing New Relic supported #{supportability_name} instrumentation using #{method}")
|
92
|
+
NewRelic::Agent.record_metric("Supportability/Instrumentation/#{supportability_name}/#{method}", 0.0)
|
93
|
+
yield
|
94
|
+
end
|
95
|
+
|
96
|
+
def prepend_instrument(target_class, instrumenting_module, supportability_name = nil)
|
97
|
+
log_and_instrument("Prepend", instrumenting_module, supportability_name) do
|
98
|
+
target_class.send(:prepend, instrumenting_module)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def chain_instrument(instrumenting_module, supportability_name = nil)
|
103
|
+
log_and_instrument("MethodChaining", instrumenting_module, supportability_name) do
|
104
|
+
instrumenting_module.instrument!
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def chain_instrument_target(target, instrumenting_module, supportability_name = nil)
|
109
|
+
NewRelic::Agent.logger.info("Installing deferred #{target} instrumentation")
|
110
|
+
log_and_instrument("MethodChaining", instrumenting_module, supportability_name) do
|
111
|
+
instrumenting_module.instrument!(target)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
70
115
|
def execute
|
71
116
|
@executes.each do |x|
|
72
117
|
begin
|
73
118
|
x.call
|
74
119
|
rescue => err
|
75
|
-
NewRelic::Agent.logger.error(
|
120
|
+
NewRelic::Agent.logger.error("Error while installing #{self.name} instrumentation:", err)
|
76
121
|
break
|
77
122
|
end
|
78
123
|
end
|
@@ -87,35 +132,101 @@ module DependencyDetection
|
|
87
132
|
begin
|
88
133
|
dep.call
|
89
134
|
rescue => err
|
90
|
-
NewRelic::Agent.logger.error(
|
135
|
+
NewRelic::Agent.logger.error("Error while detecting #{self.name}:", err)
|
91
136
|
false
|
92
137
|
end
|
93
138
|
end
|
94
139
|
end
|
95
140
|
|
96
|
-
def depends_on
|
97
|
-
@dependencies <<
|
141
|
+
def depends_on(&block)
|
142
|
+
@dependencies << block if block
|
98
143
|
end
|
99
144
|
|
100
145
|
def allowed_by_config?
|
101
|
-
|
102
|
-
|
146
|
+
!(disabled_configured? || deprecated_disabled_configured?)
|
147
|
+
end
|
148
|
+
|
149
|
+
# TODO: MAJOR VERSION
|
150
|
+
# will only return true if a disabled key is found and is truthy
|
151
|
+
def deprecated_disabled_configured?
|
152
|
+
return false if self.name.nil?
|
103
153
|
|
104
154
|
key = "disable_#{self.name}".to_sym
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
155
|
+
return false unless ::NewRelic::Agent.config[key] == true
|
156
|
+
|
157
|
+
::NewRelic::Agent.logger.debug("Not installing #{self.name} instrumentation because of configuration #{key}")
|
158
|
+
::NewRelic::Agent.logger.debug( \
|
159
|
+
"[DEPRECATED] configuration #{key} for #{self.name} will be removed in the next major release. " \
|
160
|
+
"Use `#{config_key}` with one of `#{VALID_CONFIG_VALUES.map(&:to_s).inspect}`"
|
161
|
+
)
|
162
|
+
|
163
|
+
return true
|
164
|
+
end
|
165
|
+
|
166
|
+
def config_key
|
167
|
+
return nil if self.config_name.nil?
|
168
|
+
|
169
|
+
@config_key ||= "instrumentation.#{self.config_name}".to_sym
|
170
|
+
end
|
171
|
+
|
172
|
+
VALID_CONFIG_VALUES = [:auto, :disabled, :prepend, :chain]
|
173
|
+
AUTO_CONFIG_VALUE = VALID_CONFIG_VALUES[0]
|
174
|
+
|
175
|
+
VALID_CONFIG_VALUES.each do |value|
|
176
|
+
define_method "#{value}_configured?" do
|
177
|
+
value == config_value
|
110
178
|
end
|
111
179
|
end
|
112
180
|
|
181
|
+
# returns only a valid value for instrumentation configuration
|
182
|
+
# If user uses "enabled" it's converted to "auto"
|
183
|
+
def valid_config_value(retrieved_value)
|
184
|
+
VALID_CONFIG_VALUES.include?(retrieved_value) ? retrieved_value : AUTO_CONFIG_VALUE
|
185
|
+
end
|
186
|
+
|
187
|
+
# fetches and transform potentially invalid value given to one of the valid config values
|
188
|
+
# logs the resolved value during debug mode.
|
189
|
+
def fetch_config_value(key)
|
190
|
+
valid_value = valid_config_value(::NewRelic::Agent.config[key].to_s.to_sym)
|
191
|
+
::NewRelic::Agent.logger.debug("Using #{valid_value} configuration value for #{self.name} to configure instrumentation")
|
192
|
+
return valid_value
|
193
|
+
end
|
194
|
+
|
195
|
+
def config_value
|
196
|
+
return AUTO_CONFIG_VALUE unless config_key
|
197
|
+
|
198
|
+
fetch_config_value(config_key)
|
199
|
+
end
|
200
|
+
|
113
201
|
def named(new_name)
|
114
202
|
self.name = new_name
|
115
203
|
end
|
116
204
|
|
117
|
-
def
|
118
|
-
|
205
|
+
def configure_with(new_config_name)
|
206
|
+
self.config_name = new_config_name
|
207
|
+
end
|
208
|
+
|
209
|
+
def executes(&block)
|
210
|
+
@executes << block if block
|
211
|
+
end
|
212
|
+
|
213
|
+
def conflicts_with_prepend(&block)
|
214
|
+
@prepend_conflicts << block if block
|
215
|
+
end
|
216
|
+
|
217
|
+
def use_prepend?
|
218
|
+
prepend_configured? || (auto_configured? && !prepend_conflicts?)
|
219
|
+
end
|
220
|
+
|
221
|
+
def prepend_conflicts?
|
222
|
+
@prepend_conflicts.any? do |conflict|
|
223
|
+
begin
|
224
|
+
conflict.call
|
225
|
+
rescue => err
|
226
|
+
NewRelic::Agent.logger.error("Error while checking prepend conflicts #{self.name}:", err)
|
227
|
+
false # assumes no conflicts exist since `prepend` is preferred method of instrumenting
|
228
|
+
end
|
229
|
+
end
|
119
230
|
end
|
120
231
|
end
|
121
232
|
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
|
module NewRelic
|
6
6
|
# The EnvironmentReport is responsible for analyzing the application's
|
@@ -13,7 +13,6 @@ module NewRelic
|
|
13
13
|
# Additional logic can be registered by using the EnvironmentReport.report_on
|
14
14
|
# hook.
|
15
15
|
class EnvironmentReport
|
16
|
-
|
17
16
|
# This is the main interface for registering logic that should be included
|
18
17
|
# in the Environment Report. For example:
|
19
18
|
#
|
@@ -57,25 +56,23 @@ module NewRelic
|
|
57
56
|
end
|
58
57
|
end
|
59
58
|
end
|
60
|
-
report_on('Plugin List'
|
61
|
-
report_on('Ruby version'
|
62
|
-
report_on('Ruby description'
|
63
|
-
report_on('Ruby platform'
|
64
|
-
report_on('Ruby patchlevel'
|
65
|
-
report_on('JRuby version'
|
66
|
-
report_on('Java VM version'
|
59
|
+
report_on('Plugin List') { ::Rails.configuration.plugins.to_a }
|
60
|
+
report_on('Ruby version') { RUBY_VERSION }
|
61
|
+
report_on('Ruby description') { RUBY_DESCRIPTION }
|
62
|
+
report_on('Ruby platform') { RUBY_PLATFORM }
|
63
|
+
report_on('Ruby patchlevel') { RUBY_PATCHLEVEL.to_s }
|
64
|
+
report_on('JRuby version') { JRUBY_VERSION }
|
65
|
+
report_on('Java VM version') { ENV_JAVA['java.vm.version'] }
|
67
66
|
report_on('Logical Processors') { ::NewRelic::Agent::SystemInfo.num_logical_processors }
|
68
|
-
report_on('Physical Cores'
|
69
|
-
report_on('Arch'
|
70
|
-
report_on('OS version'
|
71
|
-
report_on('OS'
|
72
|
-
report_on('Database adapter'
|
73
|
-
|
74
|
-
|
75
|
-
report_on('
|
76
|
-
report_on('
|
77
|
-
report_on('Environment' ) { NewRelic::Control.instance.env }
|
78
|
-
report_on('Rails version' ) { ::Rails::VERSION::STRING }
|
67
|
+
report_on('Physical Cores') { ::NewRelic::Agent::SystemInfo.num_physical_cores }
|
68
|
+
report_on('Arch') { ::NewRelic::Agent::SystemInfo.processor_arch }
|
69
|
+
report_on('OS version') { ::NewRelic::Agent::SystemInfo.os_version }
|
70
|
+
report_on('OS') { ::NewRelic::Agent::SystemInfo.ruby_os_identifier }
|
71
|
+
report_on('Database adapter') { ::NewRelic::Agent::DatabaseAdapter.value }
|
72
|
+
report_on('Framework') { Agent.config[:framework].to_s }
|
73
|
+
report_on('Dispatcher') { Agent.config[:dispatcher].to_s }
|
74
|
+
report_on('Environment') { NewRelic::Control.instance.env }
|
75
|
+
report_on('Rails version') { ::Rails::VERSION::STRING }
|
79
76
|
report_on('Rails threadsafe') do
|
80
77
|
::Rails.configuration.action_controller.allow_concurrency
|
81
78
|
end
|
@@ -90,27 +87,15 @@ module NewRelic
|
|
90
87
|
# end reporting logic
|
91
88
|
####################################
|
92
89
|
|
93
|
-
|
94
90
|
attr_reader :data
|
95
91
|
# Generate the report based on the class level logic.
|
96
92
|
def initialize
|
97
93
|
@data = self.class.registered_reporters.inject(Hash.new) do |data, (key, logic)|
|
98
94
|
begin
|
99
95
|
value = logic.call
|
100
|
-
|
101
|
-
data[key] = value
|
102
|
-
|
103
|
-
Agent.record_metric("Supportability/EnvironmentReport/success", 0.0)
|
104
|
-
Agent.record_metric("Supportability/EnvironmentReport/success/#{key}", 0.0)
|
105
|
-
else
|
106
|
-
Agent.logger.debug("EnvironmentReport ignoring value for #{key.inspect} which came back falsey: #{value.inspect}")
|
107
|
-
Agent.record_metric("Supportability/EnvironmentReport/empty", 0.0)
|
108
|
-
Agent.record_metric("Supportability/EnvironmentReport/empty/#{key}", 0.0)
|
109
|
-
end
|
96
|
+
value ? record_value(data, key, value) : record_empty_value(key, value)
|
110
97
|
rescue => e
|
111
|
-
|
112
|
-
Agent.record_metric("Supportability/EnvironmentReport/error", 0.0)
|
113
|
-
Agent.record_metric("Supportability/EnvironmentReport/error/#{key}", 0.0)
|
98
|
+
rescue_initialize(key, e)
|
114
99
|
end
|
115
100
|
data
|
116
101
|
end
|
@@ -127,5 +112,26 @@ module NewRelic
|
|
127
112
|
def to_a
|
128
113
|
@data.to_a
|
129
114
|
end
|
115
|
+
|
116
|
+
private
|
117
|
+
|
118
|
+
def record_value(data, key, value)
|
119
|
+
data[key] = value
|
120
|
+
|
121
|
+
Agent.record_metric("Supportability/EnvironmentReport/success", 0.0)
|
122
|
+
Agent.record_metric("Supportability/EnvironmentReport/success/#{key}", 0.0)
|
123
|
+
end
|
124
|
+
|
125
|
+
def record_empty_value(key, value)
|
126
|
+
Agent.logger.debug("EnvironmentReport ignoring value for #{key.inspect} which came back falsey: #{value.inspect}")
|
127
|
+
Agent.record_metric("Supportability/EnvironmentReport/empty", 0.0)
|
128
|
+
Agent.record_metric("Supportability/EnvironmentReport/empty/#{key}", 0.0)
|
129
|
+
end
|
130
|
+
|
131
|
+
def rescue_initialize(key, exception)
|
132
|
+
Agent.logger.debug("EnvironmentReport failed to retrieve value for #{key.inspect}: #{exception}")
|
133
|
+
Agent.record_metric("Supportability/EnvironmentReport/error", 0.0)
|
134
|
+
Agent.record_metric("Supportability/EnvironmentReport/error/#{key}", 0.0)
|
135
|
+
end
|
130
136
|
end
|
131
137
|
end
|
data/lib/new_relic/helper.rb
CHANGED
@@ -1,10 +1,14 @@
|
|
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/language_support'
|
6
|
+
require 'open3'
|
6
7
|
|
7
8
|
module NewRelic
|
9
|
+
class CommandExecutableNotFoundError < StandardError; end
|
10
|
+
class CommandRunFailedError < StandardError; end
|
11
|
+
|
8
12
|
# A singleton for shared generic helper methods
|
9
13
|
module Helper
|
10
14
|
extend self
|
@@ -12,16 +16,17 @@ module NewRelic
|
|
12
16
|
# Confirm a string is correctly encoded,
|
13
17
|
# If not force the encoding to ASCII-8BIT (binary)
|
14
18
|
def correctly_encoded(string)
|
15
|
-
return string unless string.is_a?
|
19
|
+
return string unless string.is_a?(String)
|
20
|
+
|
16
21
|
# The .dup here is intentional, since force_encoding mutates the target,
|
17
22
|
# and we don't know who is going to use this string downstream of us.
|
18
23
|
string.valid_encoding? ? string : string.dup.force_encoding(Encoding::ASCII_8BIT)
|
19
24
|
end
|
20
25
|
|
21
26
|
def instance_method_visibility(klass, method_name)
|
22
|
-
if klass.private_instance_methods.map{|s|s.to_sym}.include?
|
27
|
+
if klass.private_instance_methods.map { |s| s.to_sym }.include?(method_name.to_sym)
|
23
28
|
:private
|
24
|
-
elsif klass.protected_instance_methods.map{|s|s.to_sym}.include?
|
29
|
+
elsif klass.protected_instance_methods.map { |s| s.to_sym }.include?(method_name.to_sym)
|
25
30
|
:protected
|
26
31
|
else
|
27
32
|
:public
|
@@ -31,14 +36,50 @@ module NewRelic
|
|
31
36
|
def instance_methods_include?(klass, method_name)
|
32
37
|
method_name_sym = method_name.to_sym
|
33
38
|
(
|
34
|
-
klass.instance_methods.map{ |s| s.to_sym }.include?(method_name_sym)
|
35
|
-
klass.protected_instance_methods.map{ |s|s.to_sym }.include?(method_name_sym) ||
|
36
|
-
klass.private_instance_methods.map{ |s|s.to_sym }.include?(method_name_sym)
|
39
|
+
klass.instance_methods.map { |s| s.to_sym }.include?(method_name_sym) ||
|
40
|
+
klass.protected_instance_methods.map { |s| s.to_sym }.include?(method_name_sym) ||
|
41
|
+
klass.private_instance_methods.map { |s| s.to_sym }.include?(method_name_sym)
|
37
42
|
)
|
38
43
|
end
|
39
44
|
|
40
45
|
def time_to_millis(time)
|
41
46
|
(time.to_f * 1000).round
|
42
47
|
end
|
48
|
+
|
49
|
+
def run_command(command)
|
50
|
+
executable = command.split(' ').first
|
51
|
+
unless executable_in_path?(executable)
|
52
|
+
raise NewRelic::CommandExecutableNotFoundError.new("Executable not found: '#{executable}'")
|
53
|
+
end
|
54
|
+
|
55
|
+
exception = nil
|
56
|
+
begin
|
57
|
+
output, status = Open3.capture2e(command)
|
58
|
+
rescue => exception
|
59
|
+
end
|
60
|
+
|
61
|
+
if exception || !status.success?
|
62
|
+
message = exception ? "#{exception.class} - #{exception.message}" : output
|
63
|
+
raise NewRelic::CommandRunFailedError.new("Failed to run command '#{command}': #{message}")
|
64
|
+
end
|
65
|
+
|
66
|
+
output.chomp if output
|
67
|
+
end
|
68
|
+
|
69
|
+
# TODO: Open3 defers the actual execution of a binary to Process.spawn,
|
70
|
+
# which will raise an Errno::ENOENT exception for a file that
|
71
|
+
# cannot be found. We might want to take the time to evaluate
|
72
|
+
# relying on that Process.spawn behavior instead of checking for
|
73
|
+
# existence ourselves. We'd need to see what it does, how efficient
|
74
|
+
# it is, if it differs in functionality between Ruby versions and
|
75
|
+
# operating systems, etc.
|
76
|
+
def executable_in_path?(executable)
|
77
|
+
return false unless ENV['PATH']
|
78
|
+
|
79
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).any? do |bin_path|
|
80
|
+
executable_path = File.join(bin_path, executable)
|
81
|
+
File.exist?(executable_path) && File.file?(executable_path) && File.executable?(executable_path)
|
82
|
+
end
|
83
|
+
end
|
43
84
|
end
|
44
85
|
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
|
module NewRelic
|
6
6
|
module LanguageSupport
|
@@ -9,7 +9,8 @@ module NewRelic
|
|
9
9
|
@@forkable = nil
|
10
10
|
def can_fork?
|
11
11
|
# this is expensive to check, so we should only check once
|
12
|
-
return @@forkable if
|
12
|
+
return @@forkable if !@@forkable.nil?
|
13
|
+
|
13
14
|
@@forkable = Process.respond_to?(:fork)
|
14
15
|
end
|
15
16
|
|
@@ -22,7 +23,8 @@ module NewRelic
|
|
22
23
|
end
|
23
24
|
|
24
25
|
def object_space_usable?
|
25
|
-
if
|
26
|
+
if jruby?
|
27
|
+
require 'jruby'
|
26
28
|
JRuby.runtime.is_object_space_enabled
|
27
29
|
else
|
28
30
|
defined?(::ObjectSpace)
|
@@ -33,12 +35,29 @@ module NewRelic
|
|
33
35
|
RUBY_ENGINE == 'jruby'
|
34
36
|
end
|
35
37
|
|
38
|
+
# TODO: OLD RUBIES - RUBY_VERSION < 2.6
|
39
|
+
#
|
40
|
+
# Ruby 2.6 introduced an improved version of `Object.const_get` that
|
41
|
+
# respects the full namespace of the input and doesn't just grab the first
|
42
|
+
# constant matching the string to the right of the last '::'.
|
43
|
+
# Once we drop support for Ruby 2.5 and below, the only value this custom
|
44
|
+
# method will provide beyond `Object.const_get` itself is to automatically
|
45
|
+
# catch NameError.
|
46
|
+
#
|
47
|
+
# see: https://github.com/rails/rails/commit/7057ccf6565c1cb5354c1906880119276a9d15c0
|
48
|
+
#
|
49
|
+
# With Ruby 2.6+, this method can be defined like so:
|
50
|
+
# def constantize(constant_as_string_or_symbol)
|
51
|
+
# Object.const_get(constant_as_string_or_symbol)
|
52
|
+
# rescue NameError
|
53
|
+
# end
|
54
|
+
#
|
36
55
|
def constantize(const_name)
|
37
|
-
const_name.to_s.sub(/\A::/,'').split('::').inject(Object) do |namespace, name|
|
56
|
+
const_name.to_s.sub(/\A::/, '').split('::').inject(Object) do |namespace, name|
|
38
57
|
begin
|
39
58
|
result = namespace.const_get(name)
|
40
59
|
|
41
|
-
# const_get looks up the
|
60
|
+
# const_get looks up the inheritance chain, so if it's a class
|
42
61
|
# in the constant make sure we found the one in our namespace.
|
43
62
|
#
|
44
63
|
# Can't help if the constant isn't a class...
|
@@ -54,6 +73,11 @@ module NewRelic
|
|
54
73
|
end
|
55
74
|
end
|
56
75
|
|
76
|
+
def camelize(string)
|
77
|
+
camelized = string.downcase
|
78
|
+
camelized.split(/\-|\_/).map(&:capitalize).join
|
79
|
+
end
|
80
|
+
|
57
81
|
def bundled_gem?(gem_name)
|
58
82
|
defined?(Bundler) && Bundler.rubygems.all_specs.map(&:name).include?(gem_name)
|
59
83
|
rescue => e
|
@@ -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
|
6
6
|
module LatestChanges
|
@@ -9,11 +9,11 @@ module NewRelic
|
|
9
9
|
end
|
10
10
|
|
11
11
|
FOOTER = <<'EOS'
|
12
|
-
See https://github.com/newrelic/
|
12
|
+
See https://github.com/newrelic/newrelic-ruby-agent/blob/main/CHANGELOG.md for a full list of
|
13
13
|
changes.
|
14
14
|
EOS
|
15
15
|
|
16
|
-
def self.read(changelog=default_changelog)
|
16
|
+
def self.read(changelog = default_changelog)
|
17
17
|
changes = extract_latest_changes(File.read(changelog))
|
18
18
|
changes << FOOTER
|
19
19
|
|
@@ -24,14 +24,14 @@ EOS
|
|
24
24
|
# precise version number included in the line in parens. For example:
|
25
25
|
#
|
26
26
|
# * This is a patch item (3.7.1.188)
|
27
|
-
def self.read_patch(patch_level, changelog=default_changelog)
|
27
|
+
def self.read_patch(patch_level, changelog = default_changelog)
|
28
28
|
latest = extract_latest_changes(File.read(changelog))
|
29
29
|
changes = ["## v#{patch_level}", ""]
|
30
30
|
|
31
31
|
current_item = nil
|
32
32
|
latest.each do |line|
|
33
|
-
if line
|
34
|
-
if line
|
33
|
+
if line =~ /^\s*\*.*/
|
34
|
+
if line =~ /\(#{patch_level}\)/
|
35
35
|
# Found a patch level item, so start tracking the lines!
|
36
36
|
current_item = line
|
37
37
|
else
|
@@ -52,10 +52,11 @@ EOS
|
|
52
52
|
changes = []
|
53
53
|
version_count = 0
|
54
54
|
contents.each_line do |line|
|
55
|
-
if line
|
55
|
+
if line =~ /##\s+v[\d.]+/
|
56
56
|
version_count += 1
|
57
57
|
end
|
58
58
|
break if version_count >= 2
|
59
|
+
|
59
60
|
changes << line.sub(/^ \* /, "* ").chomp
|
60
61
|
end
|
61
62
|
changes
|