newrelic_rpm 7.0.0 → 9.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +7 -2
- data/.rubocop.yml +1919 -0
- data/.rubocop_todo.yml +100 -0
- data/.simplecov +15 -0
- data/.snyk +11 -0
- data/.yardopts +1 -0
- data/Brewfile +12 -0
- data/CHANGELOG.md +3754 -2825
- data/CONTRIBUTING.md +33 -7
- data/DOCKER.md +167 -0
- data/Dockerfile +10 -0
- data/Gemfile +0 -1
- data/Guardfile +9 -8
- data/LICENSE +0 -6
- data/README.md +23 -19
- data/Rakefile +27 -29
- data/THIRD_PARTY_NOTICES.md +14 -199
- data/Thorfile +5 -0
- data/bin/newrelic +3 -2
- data/bin/newrelic_cmd +1 -0
- data/bin/nrdebug +76 -53
- data/config.dot +5 -5
- data/docker-compose.yml +107 -0
- data/init.rb +4 -6
- data/install.rb +2 -2
- data/lefthook.yml +9 -0
- data/lib/new_relic/agent/adaptive_sampler.rb +13 -9
- data/lib/new_relic/agent/agent.rb +96 -925
- 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 +23 -19
- data/lib/new_relic/agent/attribute_filter.rb +64 -47
- data/lib/new_relic/agent/attribute_processing.rb +7 -7
- data/lib/new_relic/agent/attributes.rb +5 -4
- data/lib/new_relic/agent/audit_logger.rb +8 -3
- data/lib/new_relic/agent/autostart.rb +20 -18
- data/lib/new_relic/agent/chained_call.rb +1 -1
- data/lib/new_relic/agent/commands/agent_command.rb +3 -3
- data/lib/new_relic/agent/commands/agent_command_router.rb +12 -11
- data/lib/new_relic/agent/commands/thread_profiler_session.rb +12 -10
- data/lib/new_relic/agent/configuration/default_source.rb +1366 -1297
- data/lib/new_relic/agent/configuration/dotted_hash.rb +6 -5
- data/lib/new_relic/agent/configuration/environment_source.rb +11 -9
- data/lib/new_relic/agent/configuration/event_harvest_config.rb +40 -17
- data/lib/new_relic/agent/configuration/high_security_source.rb +8 -9
- data/lib/new_relic/agent/configuration/manager.rb +82 -69
- data/lib/new_relic/agent/configuration/manual_source.rb +1 -1
- data/lib/new_relic/agent/configuration/mask_defaults.rb +3 -3
- data/lib/new_relic/agent/configuration/security_policy_source.rb +82 -85
- data/lib/new_relic/agent/configuration/server_source.rb +21 -19
- data/lib/new_relic/agent/configuration/yaml_source.rb +31 -7
- data/lib/new_relic/agent/configuration.rb +1 -1
- data/lib/new_relic/agent/connect/request_builder.rb +18 -18
- data/lib/new_relic/agent/connect/response_handler.rb +5 -8
- data/lib/new_relic/agent/custom_event_aggregator.rb +14 -14
- data/lib/new_relic/agent/database/explain_plan_helpers.rb +4 -5
- data/lib/new_relic/agent/database/obfuscation_helpers.rb +14 -13
- data/lib/new_relic/agent/database/obfuscator.rb +2 -2
- data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +3 -3
- data/lib/new_relic/agent/database.rb +42 -50
- data/lib/new_relic/agent/database_adapter.rb +3 -1
- data/lib/new_relic/agent/datastores/metric_helper.rb +17 -18
- data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +7 -6
- data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +6 -10
- data/lib/new_relic/agent/datastores/mongo.rb +6 -11
- data/lib/new_relic/agent/datastores/nosql_obfuscator.rb +41 -0
- data/lib/new_relic/agent/datastores/redis.rb +5 -7
- data/lib/new_relic/agent/datastores.rb +13 -15
- data/lib/new_relic/agent/deprecator.rb +1 -1
- data/lib/new_relic/agent/distributed_tracing/cross_app_payload.rb +10 -10
- data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +40 -34
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +22 -22
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +19 -19
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +50 -52
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +5 -6
- data/lib/new_relic/agent/distributed_tracing/trace_context.rb +76 -77
- data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +39 -38
- data/lib/new_relic/agent/distributed_tracing.rb +33 -35
- data/lib/new_relic/agent/encoding_normalizer.rb +4 -2
- data/lib/new_relic/agent/error_collector.rb +73 -54
- data/lib/new_relic/agent/error_event_aggregator.rb +4 -5
- data/lib/new_relic/agent/error_filter.rb +174 -0
- data/lib/new_relic/agent/error_trace_aggregator.rb +4 -3
- data/lib/new_relic/agent/event_aggregator.rb +22 -21
- data/lib/new_relic/agent/event_buffer.rb +7 -8
- data/lib/new_relic/agent/event_listener.rb +1 -2
- data/lib/new_relic/agent/event_loop.rb +26 -24
- data/lib/new_relic/agent/external.rb +11 -44
- data/lib/new_relic/agent/guid_generator.rb +13 -11
- data/lib/new_relic/agent/harvester.rb +4 -5
- data/lib/new_relic/agent/heap.rb +7 -9
- data/lib/new_relic/agent/hostname.rb +20 -13
- data/lib/new_relic/agent/http_clients/abstract.rb +10 -11
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +6 -11
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +8 -9
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +4 -5
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +2 -4
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +8 -4
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +4 -5
- data/lib/new_relic/agent/http_clients/uri_util.rb +1 -3
- data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +9 -22
- data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +39 -0
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +38 -31
- 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 +18 -19
- data/lib/new_relic/agent/instrumentation/active_job.rb +33 -13
- data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +20 -6
- data/lib/new_relic/agent/instrumentation/active_record.rb +37 -35
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +71 -61
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +49 -46
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +4 -4
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +27 -20
- data/lib/new_relic/agent/instrumentation/active_storage.rb +7 -3
- data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +8 -33
- 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 +11 -11
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +21 -23
- data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +4 -4
- data/lib/new_relic/agent/instrumentation/bunny.rb +4 -5
- 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 +69 -59
- data/lib/new_relic/agent/instrumentation/curb/chain.rb +41 -43
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +52 -53
- data/lib/new_relic/agent/instrumentation/curb/prepend.rb +12 -14
- data/lib/new_relic/agent/instrumentation/curb.rb +7 -7
- 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 +6 -9
- data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +7 -12
- data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +1 -2
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +28 -10
- 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 +6 -6
- data/lib/new_relic/agent/instrumentation/excon.rb +27 -30
- 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 +7 -8
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +12 -12
- data/lib/new_relic/agent/instrumentation/grape/prepend.rb +4 -4
- data/lib/new_relic/agent/instrumentation/grape.rb +12 -13
- 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 +3 -4
- data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +7 -8
- data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +1 -3
- data/lib/new_relic/agent/instrumentation/httpclient.rb +3 -3
- data/lib/new_relic/agent/instrumentation/httprb/chain.rb +3 -3
- data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +11 -11
- data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +2 -2
- data/lib/new_relic/agent/instrumentation/httprb.rb +4 -4
- data/lib/new_relic/agent/instrumentation/ignore_actions.rb +4 -5
- 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 +2 -3
- data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +31 -19
- data/lib/new_relic/agent/instrumentation/memcache/helper.rb +12 -9
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +20 -18
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +28 -15
- data/lib/new_relic/agent/instrumentation/memcache.rb +22 -23
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +11 -12
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +5 -7
- data/lib/new_relic/agent/instrumentation/mongo.rb +6 -144
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +21 -18
- data/lib/new_relic/agent/instrumentation/net_http/chain.rb +4 -5
- data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +10 -10
- data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +5 -5
- data/lib/new_relic/agent/instrumentation/net_http.rb +12 -7
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +51 -9
- data/lib/new_relic/agent/instrumentation/padrino/chain.rb +24 -20
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +4 -3
- data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +3 -3
- data/lib/new_relic/agent/instrumentation/padrino.rb +5 -8
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +6 -6
- data/lib/new_relic/agent/instrumentation/queue_time.rb +8 -9
- data/lib/new_relic/agent/instrumentation/rack/chain.rb +30 -21
- data/lib/new_relic/agent/instrumentation/rack/helpers.rb +3 -2
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +14 -12
- data/lib/new_relic/agent/instrumentation/rack/prepend.rb +15 -8
- data/lib/new_relic/agent/instrumentation/rack.rb +15 -15
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +18 -54
- data/lib/new_relic/agent/instrumentation/rails_middleware.rb +4 -4
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +9 -8
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +17 -5
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +8 -5
- data/lib/new_relic/agent/instrumentation/rails_notifications/custom_events.rb +30 -0
- data/lib/new_relic/agent/instrumentation/rake/chain.rb +2 -7
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +14 -16
- data/lib/new_relic/agent/instrumentation/rake/prepend.rb +1 -1
- data/lib/new_relic/agent/instrumentation/rake.rb +9 -9
- data/lib/new_relic/agent/instrumentation/redis/chain.rb +25 -14
- data/lib/new_relic/agent/instrumentation/redis/constants.rb +17 -0
- data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +53 -25
- data/lib/new_relic/agent/instrumentation/redis/middleware.rb +16 -0
- data/lib/new_relic/agent/instrumentation/redis/prepend.rb +10 -5
- data/lib/new_relic/agent/instrumentation/redis.rb +16 -6
- data/lib/new_relic/agent/instrumentation/resque/chain.rb +4 -5
- data/lib/new_relic/agent/instrumentation/resque/helper.rb +19 -0
- data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +9 -8
- data/lib/new_relic/agent/instrumentation/resque/prepend.rb +2 -3
- data/lib/new_relic/agent/instrumentation/resque.rb +25 -16
- data/lib/new_relic/agent/instrumentation/sequel.rb +16 -19
- data/lib/new_relic/agent/instrumentation/sequel_helper.rb +2 -2
- 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 +24 -65
- data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +2 -3
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +13 -6
- data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +1 -1
- data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +2 -2
- data/lib/new_relic/agent/instrumentation/sinatra.rb +26 -17
- 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 +5 -5
- data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +13 -15
- data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +2 -2
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +2 -2
- data/lib/new_relic/agent/instrumentation.rb +1 -1
- data/lib/new_relic/agent/internal_agent_error.rb +2 -2
- data/lib/new_relic/agent/javascript_instrumentor.rb +48 -42
- 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 +1 -1
- data/lib/new_relic/agent/log_priority.rb +20 -0
- data/lib/new_relic/agent/logging.rb +24 -21
- data/lib/new_relic/agent/memory_logger.rb +2 -2
- data/lib/new_relic/agent/messaging.rb +65 -81
- data/lib/new_relic/agent/method_tracer.rb +154 -149
- data/lib/new_relic/agent/method_tracer_helpers.rb +88 -11
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +24 -17
- data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +5 -4
- data/lib/new_relic/agent/monitors/inbound_request_monitor.rb +1 -2
- data/lib/new_relic/agent/monitors/synthetics_monitor.rb +6 -9
- data/lib/new_relic/agent/monitors.rb +6 -7
- data/lib/new_relic/agent/new_relic_service/encoders.rb +6 -6
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +5 -5
- data/lib/new_relic/agent/new_relic_service/marshaller.rb +2 -2
- data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +4 -4
- data/lib/new_relic/agent/new_relic_service.rb +247 -186
- data/lib/new_relic/agent/{noticible_error.rb → noticeable_error.rb} +2 -5
- data/lib/new_relic/agent/null_logger.rb +7 -3
- data/lib/new_relic/agent/obfuscator.rb +8 -10
- data/lib/new_relic/agent/parameter_filtering.rb +24 -10
- data/lib/new_relic/agent/payload_metric_mapping.rb +9 -10
- data/lib/new_relic/agent/pipe_channel_manager.rb +27 -17
- data/lib/new_relic/agent/pipe_service.rb +8 -5
- data/lib/new_relic/agent/prepend_supportability.rb +2 -2
- data/lib/new_relic/agent/priority_sampled_buffer.rb +8 -11
- data/lib/new_relic/agent/range_extensions.rb +8 -28
- data/lib/new_relic/agent/rules_engine/replacement_rule.rb +11 -11
- data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +12 -13
- data/lib/new_relic/agent/rules_engine.rb +5 -4
- data/lib/new_relic/agent/sampler.rb +3 -4
- data/lib/new_relic/agent/sampler_collection.rb +3 -4
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +3 -2
- data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +13 -10
- data/lib/new_relic/agent/samplers/memory_sampler.rb +24 -13
- data/lib/new_relic/agent/samplers/object_sampler.rb +1 -1
- data/lib/new_relic/agent/samplers/vm_sampler.rb +21 -19
- data/lib/new_relic/agent/span_event_aggregator.rb +12 -12
- data/lib/new_relic/agent/span_event_primitive.rb +62 -56
- data/lib/new_relic/agent/sql_sampler.rb +17 -17
- data/lib/new_relic/agent/stats.rb +78 -41
- data/lib/new_relic/agent/stats_engine/gc_profiler.rb +9 -11
- data/lib/new_relic/agent/stats_engine/stats_hash.rb +12 -13
- data/lib/new_relic/agent/stats_engine.rb +8 -8
- data/lib/new_relic/agent/synthetics_event_aggregator.rb +7 -8
- data/lib/new_relic/agent/system_info.rb +85 -65
- data/lib/new_relic/agent/threading/agent_thread.rb +18 -14
- data/lib/new_relic/agent/threading/backtrace_node.rb +12 -13
- data/lib/new_relic/agent/threading/backtrace_service.rb +14 -14
- data/lib/new_relic/agent/threading/thread_profile.rb +23 -23
- data/lib/new_relic/agent/timestamp_sampled_buffer.rb +1 -1
- data/lib/new_relic/agent/tracer.rb +89 -85
- data/lib/new_relic/agent/transaction/abstract_segment.rb +103 -40
- data/lib/new_relic/agent/transaction/datastore_segment.rb +21 -17
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +63 -56
- data/lib/new_relic/agent/transaction/distributed_tracing.rb +43 -44
- data/lib/new_relic/agent/transaction/external_request_segment.rb +44 -34
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +31 -36
- data/lib/new_relic/agent/transaction/request_attributes.rb +35 -35
- data/lib/new_relic/agent/transaction/segment.rb +20 -10
- data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +1 -3
- data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +1 -1
- data/lib/new_relic/agent/transaction/trace.rb +15 -11
- data/lib/new_relic/agent/transaction/trace_builder.rb +10 -10
- data/lib/new_relic/agent/transaction/trace_context.rb +35 -35
- data/lib/new_relic/agent/transaction/trace_node.rb +25 -24
- data/lib/new_relic/agent/transaction/tracing.rb +14 -11
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +5 -5
- data/lib/new_relic/agent/transaction.rb +175 -152
- data/lib/new_relic/agent/transaction_error_primitive.rb +27 -25
- data/lib/new_relic/agent/transaction_event_aggregator.rb +12 -12
- data/lib/new_relic/agent/transaction_event_primitive.rb +32 -33
- data/lib/new_relic/agent/transaction_event_recorder.rb +16 -15
- data/lib/new_relic/agent/transaction_metrics.rb +10 -9
- data/lib/new_relic/agent/transaction_sampler.rb +5 -6
- data/lib/new_relic/agent/transaction_time_aggregator.rb +26 -25
- data/lib/new_relic/agent/utilization/aws.rb +33 -3
- data/lib/new_relic/agent/utilization/azure.rb +3 -3
- data/lib/new_relic/agent/utilization/gcp.rb +7 -7
- data/lib/new_relic/agent/utilization/pcf.rb +5 -4
- data/lib/new_relic/agent/utilization/vendor.rb +43 -28
- data/lib/new_relic/agent/utilization_data.rb +7 -5
- data/lib/new_relic/agent/vm/jruby_vm.rb +1 -1
- data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +2 -2
- data/lib/new_relic/agent/vm/mri_vm.rb +40 -15
- data/lib/new_relic/agent/vm/snapshot.rb +5 -5
- data/lib/new_relic/agent/vm.rb +1 -1
- data/lib/new_relic/agent/worker_loop.rb +10 -12
- data/lib/new_relic/agent.rb +70 -86
- data/lib/new_relic/cli/command.rb +20 -22
- data/lib/new_relic/cli/commands/deployments.rb +92 -42
- data/lib/new_relic/cli/commands/install.rb +21 -24
- data/lib/new_relic/coerce.rb +15 -13
- data/lib/new_relic/collection_helper.rb +50 -48
- data/lib/new_relic/constants.rb +1 -4
- data/lib/new_relic/control/class_methods.rb +3 -3
- data/lib/new_relic/control/frameworks/external.rb +2 -2
- data/lib/new_relic/control/frameworks/rails.rb +13 -9
- data/lib/new_relic/control/frameworks/rails3.rb +3 -4
- data/lib/new_relic/control/frameworks/rails4.rb +1 -1
- data/lib/new_relic/control/frameworks/rails_notifications.rb +1 -1
- data/lib/new_relic/control/frameworks/ruby.rb +3 -3
- data/lib/new_relic/control/frameworks/sinatra.rb +7 -1
- data/lib/new_relic/control/frameworks.rb +1 -1
- data/lib/new_relic/control/instance_methods.rb +26 -45
- data/lib/new_relic/control/instrumentation.rb +39 -11
- data/lib/new_relic/control/private_instance_methods.rb +48 -0
- data/lib/new_relic/control/server_methods.rb +3 -4
- data/lib/new_relic/control.rb +1 -2
- data/lib/new_relic/delayed_job_injection.rb +1 -1
- data/lib/new_relic/dependency_detection.rb +29 -28
- data/lib/new_relic/environment_report.rb +40 -32
- data/lib/new_relic/helper.rb +48 -7
- data/lib/new_relic/language_support.rb +29 -5
- data/lib/new_relic/latest_changes.rb +7 -6
- data/lib/new_relic/local_environment.rb +22 -26
- data/lib/new_relic/metric_data.rb +31 -26
- data/lib/new_relic/metric_spec.rb +8 -6
- data/lib/new_relic/noticed_error.rb +21 -25
- data/lib/new_relic/rack/agent_hooks.rb +1 -1
- data/lib/new_relic/rack/agent_middleware.rb +5 -3
- data/lib/new_relic/rack/browser_monitoring.rb +133 -123
- data/lib/new_relic/rack.rb +1 -1
- data/lib/new_relic/recipes/capistrano3.rb +3 -61
- data/lib/new_relic/recipes/capistrano_legacy.rb +23 -26
- data/lib/new_relic/recipes/helpers/send_deployment.rb +70 -0
- data/lib/new_relic/recipes.rb +1 -1
- data/lib/new_relic/supportability_helper.rb +8 -9
- data/lib/new_relic/traced_thread.rb +39 -0
- data/lib/new_relic/version.rb +5 -16
- data/lib/newrelic_rpm.rb +19 -32
- data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +15 -18
- data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +8 -14
- data/lib/tasks/all.rb +3 -3
- data/lib/tasks/config.rake +22 -117
- 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 +5 -32
- data/lib/tasks/newrelic.rb +1 -1
- data/lib/tasks/tests.rake +10 -15
- data/newrelic.yml +672 -3
- data/newrelic_rpm.gemspec +35 -31
- data/recipes/newrelic.rb +2 -2
- data/test/agent_helper.rb +221 -180
- metadata +141 -111
- data/ROADMAP.md +0 -24
- data/bin/mongrel_rpm +0 -33
- 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/instrumentation/acts_as_solr.rb +0 -75
- data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -25
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -204
- data/lib/new_relic/agent/instrumentation/excon/connection.rb +0 -49
- 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/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/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/control/frameworks/merb.rb +0 -29
- data/lib/tasks/config.html.erb +0 -32
- /data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
data/lib/new_relic/version.rb
CHANGED
@@ -1,25 +1,14 @@
|
|
1
1
|
#!/usr/bin/ruby
|
2
|
-
# encoding: utf-8
|
3
2
|
# This file is distributed under New Relic's license terms.
|
4
3
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
5
|
-
|
4
|
+
# frozen_string_literal: true
|
6
5
|
|
7
6
|
module NewRelic
|
8
|
-
module VERSION
|
9
|
-
|
10
|
-
parts.compact.join('.')
|
11
|
-
end
|
12
|
-
|
13
|
-
MAJOR = 7
|
7
|
+
module VERSION # :nodoc:
|
8
|
+
MAJOR = 9
|
14
9
|
MINOR = 0
|
15
|
-
TINY
|
16
|
-
|
17
|
-
begin
|
18
|
-
require File.join(File.dirname(__FILE__), 'build')
|
19
|
-
rescue LoadError
|
20
|
-
BUILD = nil
|
21
|
-
end
|
10
|
+
TINY = 0
|
22
11
|
|
23
|
-
STRING =
|
12
|
+
STRING = "#{MAJOR}.#{MINOR}.#{TINY}"
|
24
13
|
end
|
25
14
|
end
|
data/lib/newrelic_rpm.rb
CHANGED
@@ -1,53 +1,40 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
# == New Relic Initialization
|
6
6
|
#
|
7
7
|
# When installed as a gem, you can activate the New Relic agent one of the following ways:
|
8
8
|
#
|
9
|
-
# For
|
10
|
-
#
|
11
|
-
# to your initialization sequence.
|
9
|
+
# For applications using Bundler, add this to the Gemfile:
|
10
|
+
# gem 'newrelic_rpm'
|
12
11
|
#
|
13
|
-
#
|
14
|
-
# dependency 'newrelic_rpm'
|
15
|
-
# in the Merb config/init.rb
|
12
|
+
# You will also need to install the newrelic.yml configuration file
|
16
13
|
#
|
17
|
-
# For
|
18
|
-
#
|
19
|
-
# after requiring 'sinatra'.
|
20
|
-
#
|
21
|
-
# For other frameworks, or to manage the agent manually, invoke NewRelic::Agent#manual_start
|
22
|
-
# directly.
|
14
|
+
# For applications not using Bundler, and for other installation information, visit:
|
15
|
+
# https://docs.newrelic.com/docs/agents/ruby-agent/installation/install-new-relic-ruby-agent/
|
23
16
|
#
|
24
17
|
|
25
18
|
require 'new_relic/control'
|
26
|
-
|
19
|
+
|
20
|
+
if defined?(Rails::VERSION)
|
27
21
|
module NewRelic
|
28
|
-
class
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
35
|
-
elsif defined?(Rails::VERSION)
|
36
|
-
if Rails::VERSION::MAJOR.to_i >= 3
|
37
|
-
module NewRelic
|
38
|
-
class Railtie < Rails::Railtie
|
22
|
+
class Railtie < Rails::Railtie
|
23
|
+
if ENV['NEW_RELIC_DEFER_RAILS_INITIALIZATION']
|
24
|
+
initializer "newrelic_rpm.include_method_tracers", before: :load_config_initializers do |app|
|
25
|
+
Module.send(:include, NewRelic::Agent::MethodTracer::ClassMethods)
|
26
|
+
Module.send(:include, NewRelic::Agent::MethodTracer)
|
27
|
+
end
|
39
28
|
|
29
|
+
initializer "newrelic_rpm.start_plugin", after: :load_config_initializers do |app|
|
30
|
+
NewRelic::Control.instance.init_plugin(config: app.config)
|
31
|
+
end
|
32
|
+
else
|
40
33
|
initializer "newrelic_rpm.start_plugin", before: :load_config_initializers do |app|
|
41
|
-
NewRelic::Control.instance.init_plugin(:
|
34
|
+
NewRelic::Control.instance.init_plugin(config: app.config)
|
42
35
|
end
|
43
36
|
end
|
44
37
|
end
|
45
|
-
else
|
46
|
-
# After version 2.0 of Rails we can access the configuration directly.
|
47
|
-
# We need it to add dev mode routes after initialization finished.
|
48
|
-
config = nil
|
49
|
-
config = Rails.configuration if Rails.respond_to?(:configuration)
|
50
|
-
NewRelic::Control.instance.init_plugin :config => config
|
51
38
|
end
|
52
39
|
else
|
53
40
|
NewRelic::Control.instance.init_plugin
|
@@ -1,15 +1,14 @@
|
|
1
1
|
# -*- ruby -*-
|
2
|
-
# encoding: utf-8
|
3
2
|
# This file is distributed under New Relic's license terms.
|
4
3
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
# frozen_string_literal: true
|
5
5
|
|
6
|
-
require 'sequel' unless defined?(
|
7
|
-
require 'newrelic_rpm' unless defined?(
|
6
|
+
require 'sequel' unless defined?(Sequel)
|
7
|
+
require 'newrelic_rpm' unless defined?(NewRelic)
|
8
8
|
require 'new_relic/agent/instrumentation/sequel_helper'
|
9
9
|
require 'new_relic/agent/datastores/metric_helper'
|
10
10
|
|
11
11
|
module Sequel
|
12
|
-
|
13
12
|
# New Relic's Sequel instrumentation is implemented via a plugin for
|
14
13
|
# Sequel::Models, and an extension for Sequel::Databases. Every database
|
15
14
|
# handle that Sequel knows about when New Relic is loaded will automatically
|
@@ -18,7 +17,7 @@ module Sequel
|
|
18
17
|
# instrumentation is loaded:
|
19
18
|
#
|
20
19
|
# db = Sequel.connect( ... )
|
21
|
-
# db.extension :
|
20
|
+
# db.extension :new_relic_instrumentation
|
22
21
|
#
|
23
22
|
# Versions 3.47.0 and later use `Database.extension` to automatically
|
24
23
|
# install the extension for new connections.
|
@@ -31,7 +30,6 @@ module Sequel
|
|
31
30
|
# `disable_activerecord_instrumentation` setting.
|
32
31
|
#
|
33
32
|
module NewRelicInstrumentation
|
34
|
-
|
35
33
|
module Naming
|
36
34
|
def self.query_method_name
|
37
35
|
if Sequel::VERSION >= "4.35.0"
|
@@ -42,7 +40,7 @@ module Sequel
|
|
42
40
|
end
|
43
41
|
end
|
44
42
|
|
45
|
-
define_method Naming.query_method_name do |*args, &blk| #THREAD_LOCAL_ACCESS
|
43
|
+
define_method Naming.query_method_name do |*args, &blk| # THREAD_LOCAL_ACCESS
|
46
44
|
sql = args.first
|
47
45
|
|
48
46
|
product = NewRelic::Agent::Instrumentation::SequelHelper.product_name_from_adapter(self.class.adapter_scheme)
|
@@ -56,7 +54,7 @@ module Sequel
|
|
56
54
|
super(*args, &blk)
|
57
55
|
ensure
|
58
56
|
notice_sql(sql)
|
59
|
-
|
57
|
+
::NewRelic::Agent::Transaction::Segment.finish(segment)
|
60
58
|
end
|
61
59
|
end
|
62
60
|
|
@@ -64,18 +62,18 @@ module Sequel
|
|
64
62
|
# block in the sequel Plugin instrumentation. A simple ORM operation from the Plugin
|
65
63
|
# instrumentation may trigger a number of calls to this method. We want to append
|
66
64
|
# the statements that come from the disable_all_tracing block into this node's
|
67
|
-
# statement, otherwise we would end up
|
65
|
+
# statement, otherwise we would end up overwriting the sql statement with the
|
68
66
|
# last one executed.
|
69
|
-
def notice_sql
|
67
|
+
def notice_sql(sql)
|
70
68
|
return unless txn = NewRelic::Agent::Tracer.current_transaction
|
71
69
|
|
72
70
|
current_segment = txn.current_segment
|
73
71
|
return unless current_segment.is_a?(NewRelic::Agent::Transaction::DatastoreSegment)
|
74
72
|
|
75
73
|
if current_segment.sql_statement
|
76
|
-
current_segment.sql_statement.append_sql
|
74
|
+
current_segment.sql_statement.append_sql(sql)
|
77
75
|
else
|
78
|
-
current_segment._notice_sql
|
76
|
+
current_segment._notice_sql(sql, self.opts, explainer_for(sql))
|
79
77
|
end
|
80
78
|
end
|
81
79
|
|
@@ -83,10 +81,10 @@ module Sequel
|
|
83
81
|
(defined?(::Sequel::ThreadedConnectionPool) && ::Sequel::ThreadedConnectionPool)
|
84
82
|
].freeze
|
85
83
|
|
86
|
-
def explainer_for
|
87
|
-
|
84
|
+
def explainer_for(sql)
|
85
|
+
proc do |*|
|
88
86
|
if THREAD_SAFE_CONNECTION_POOL_CLASSES.include?(self.pool.class)
|
89
|
-
self[
|
87
|
+
self[sql].explain
|
90
88
|
else
|
91
89
|
NewRelic::Agent.logger.log_once(:info, :sequel_explain_skipped, "Not running SQL explains because Sequel is not in recognized multi-threaded mode")
|
92
90
|
nil
|
@@ -95,7 +93,6 @@ module Sequel
|
|
95
93
|
end
|
96
94
|
end # module NewRelicInstrumentation
|
97
95
|
|
98
|
-
NewRelic::Agent.logger.debug
|
99
|
-
Database.register_extension(:
|
100
|
-
|
96
|
+
NewRelic::Agent.logger.debug("Registering the :new_relic_instrumentation extension.")
|
97
|
+
Database.register_extension(:new_relic_instrumentation, NewRelicInstrumentation)
|
101
98
|
end # module Sequel
|
@@ -1,25 +1,23 @@
|
|
1
1
|
# -*- ruby -*-
|
2
|
-
# encoding: utf-8
|
3
2
|
# This file is distributed under New Relic's license terms.
|
4
3
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
# frozen_string_literal: true
|
5
5
|
|
6
|
-
require 'sequel' unless defined?(
|
7
|
-
require 'newrelic_rpm' unless defined?(
|
6
|
+
require 'sequel' unless defined?(Sequel)
|
7
|
+
require 'newrelic_rpm' unless defined?(NewRelic)
|
8
8
|
require 'new_relic/agent/instrumentation/sequel_helper'
|
9
9
|
require 'new_relic/agent/datastores/metric_helper'
|
10
10
|
|
11
11
|
module Sequel
|
12
12
|
module Plugins
|
13
|
-
|
14
13
|
# Sequel::Model instrumentation for the New Relic agent.
|
15
|
-
module
|
16
|
-
|
14
|
+
module NewRelicInstrumentation
|
17
15
|
# Meta-programming for creating method tracers for the Sequel::Model plugin.
|
18
16
|
module MethodWrapping
|
19
17
|
# Install a method named +method_name+ that will trace execution
|
20
18
|
# with a metric name derived from +operation_name+ (or +method_name+ if +operation_name+
|
21
19
|
# isn't specified).
|
22
|
-
def wrap_sequel_method(method_name, operation_name=method_name)
|
20
|
+
def wrap_sequel_method(method_name, operation_name = method_name)
|
23
21
|
define_method(method_name) do |*args, &block|
|
24
22
|
klass = self.is_a?(Class) ? self : self.class
|
25
23
|
product = NewRelic::Agent::Instrumentation::SequelHelper.product_name_from_adapter(db.adapter_scheme)
|
@@ -32,16 +30,15 @@ module Sequel
|
|
32
30
|
begin
|
33
31
|
NewRelic::Agent.disable_all_tracing { super(*args, &block) }
|
34
32
|
ensure
|
35
|
-
|
33
|
+
::NewRelic::Agent::Transaction::Segment.finish(segment)
|
36
34
|
end
|
37
35
|
end
|
38
36
|
end
|
39
|
-
|
40
37
|
end # module MethodTracer
|
41
38
|
|
42
39
|
# Methods to be added to Sequel::Model instances.
|
43
40
|
module InstanceMethods
|
44
|
-
extend Sequel::Plugins::
|
41
|
+
extend Sequel::Plugins::NewRelicInstrumentation::MethodWrapping
|
45
42
|
|
46
43
|
wrap_sequel_method :delete
|
47
44
|
wrap_sequel_method :destroy
|
@@ -51,20 +48,17 @@ module Sequel
|
|
51
48
|
wrap_sequel_method :update_fields
|
52
49
|
wrap_sequel_method :update_only
|
53
50
|
wrap_sequel_method :save
|
54
|
-
|
55
51
|
end # module InstanceMethods
|
56
52
|
|
57
|
-
|
58
53
|
# Methods to be added to Sequel::Model classes.
|
59
54
|
module ClassMethods
|
60
|
-
extend Sequel::Plugins::
|
55
|
+
extend Sequel::Plugins::NewRelicInstrumentation::MethodWrapping
|
61
56
|
|
62
57
|
wrap_sequel_method :[], "get"
|
63
58
|
wrap_sequel_method :all
|
64
59
|
wrap_sequel_method :first
|
65
60
|
wrap_sequel_method :create
|
66
61
|
end # module ClassMethods
|
67
|
-
|
68
62
|
end # module NewRelicInstrumentation
|
69
63
|
end # module Plugins
|
70
64
|
end # module Sequel
|
data/lib/tasks/all.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
2
|
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
|
-
# This is required to load in task definitions
|
6
|
-
Dir.glob(File.join(File.dirname(__FILE__),'*.rake')) do |file|
|
5
|
+
# This is required to load in task definitions
|
6
|
+
Dir.glob(File.join(File.dirname(__FILE__), '*.rake')) do |file|
|
7
7
|
load file
|
8
8
|
end
|
data/lib/tasks/config.rake
CHANGED
@@ -1,130 +1,35 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative 'helpers/format'
|
6
|
+
include Format
|
7
|
+
|
1
8
|
namespace :newrelic do
|
2
9
|
namespace :config do
|
3
|
-
|
4
|
-
|
5
|
-
GENERAL = "general"
|
6
|
-
DISABLING = "disabling"
|
10
|
+
GENERAL = "general"
|
11
|
+
DISABLING = "disabling"
|
7
12
|
ATTRIBUTES = "attributes"
|
8
13
|
|
14
|
+
# these configuration options are not able to be set using environment variables
|
15
|
+
NON_ENV_CONFIGS = ['error_collector.ignore_classes', 'error_collector.ignore_messages', 'error_collector.expected_classes', 'error_collector.expected_messages']
|
16
|
+
|
9
17
|
SECTION_DESCRIPTIONS = {
|
10
|
-
GENERAL
|
11
|
-
DISABLING
|
12
|
-
ATTRIBUTES
|
13
|
-
"transaction_tracer" => 'The
|
14
|
-
"error_collector"
|
15
|
-
"browser_monitoring" =>
|
16
|
-
"analytics_events"
|
18
|
+
GENERAL => 'These settings are available for agent configuration. Some settings depend on your New Relic subscription level.',
|
19
|
+
DISABLING => 'Use these settings to toggle instrumentation types during agent startup.',
|
20
|
+
ATTRIBUTES => '[Attributes](/docs/features/agent-attributes) are key-value pairs containing information that determines the properties of an event or transaction. These key-value pairs can be viewed within transaction traces in APM, traced errors in APM, transaction events in dashboards, and page views in dashboards. You can customize exactly which attributes will be sent to each of these destinations',
|
21
|
+
"transaction_tracer" => 'The [transaction traces](/docs/apm/traces/transaction-traces/transaction-traces) feature collects detailed information from a selection of transactions, including a summary of the calling sequence, a breakdown of time spent, and a list of SQL queries and their query plans (on mysql and postgresql). Available features depend on your New Relic subscription level.',
|
22
|
+
"error_collector" => "The agent collects and reports all uncaught exceptions by default. These configuration options allow you to customize the error collection.\n\nFor information on ignored and expected errors, [see this page on Error Analytics in APM](/docs/agents/manage-apm-agents/agent-data/manage-errors-apm-collect-ignore-or-mark-expected/). To set expected errors via the `NewRelic::Agent.notice_error` Ruby method, [consult the Ruby Agent API](/docs/agents/ruby-agent/api-guides/sending-handled-errors-new-relic/).",
|
23
|
+
"browser_monitoring" => "The browser monitoring [page load timing](/docs/browser/new-relic-browser/page-load-timing/page-load-timing-process) feature (sometimes referred to as real user monitoring or RUM) gives you insight into the performance real users are experiencing with your website. This is accomplished by measuring the time it takes for your users' browsers to download and render your web pages by injecting a small amount of JavaScript code into the header and footer of each page.",
|
24
|
+
"analytics_events" => '[New Relic dashboards](/docs/query-your-data/explore-query-data/dashboards/introduction-new-relic-one-dashboards) is a resource to gather and visualize data about your software and what it says about your business. With it you can quickly and easily create real-time dashboards to get immediate answers about end-user experiences, clickstreams, mobile activities, and server transactions.'
|
17
25
|
}
|
18
26
|
|
19
27
|
NAME_OVERRIDES = {
|
20
|
-
"slow_sql"
|
28
|
+
"slow_sql" => "Slow SQL",
|
29
|
+
"custom_insights_events" => "Custom Events"
|
21
30
|
}
|
22
31
|
|
23
|
-
|
24
|
-
config_hash = build_config_hash
|
25
|
-
sections = flatten_config_hash(config_hash)
|
26
|
-
|
27
|
-
puts build_erb(format).result(binding)
|
28
|
-
sections # silences unused warning to return this
|
29
|
-
end
|
30
|
-
|
31
|
-
def build_config_hash
|
32
|
-
sections = Hash.new {|hash, key| hash[key] = []}
|
33
|
-
NewRelic::Agent::Configuration::DEFAULTS.each do |key, value|
|
34
|
-
next unless value[:public]
|
35
|
-
|
36
|
-
section_key = GENERAL
|
37
|
-
key = key.to_s
|
38
|
-
components = key.split(".")
|
39
|
-
|
40
|
-
if key.match(/^disable_/) # "disable_httpclient"
|
41
|
-
section_key = DISABLING
|
42
|
-
elsif components.length == 2 # "analytics_events.enabled"
|
43
|
-
section_key = components.first
|
44
|
-
elsif components[1] == "attributes" # "transaction_tracer.attributes.enabled"
|
45
|
-
section_key = ATTRIBUTES
|
46
|
-
end
|
47
|
-
|
48
|
-
sections[section_key] << {
|
49
|
-
:key => key,
|
50
|
-
:type => format_type(value[:type]),
|
51
|
-
:description => format_description(value),
|
52
|
-
:default => format_default_value(value),
|
53
|
-
:env_var => format_env_var(key)
|
54
|
-
}
|
55
|
-
end
|
56
|
-
sections
|
57
|
-
end
|
58
|
-
|
59
|
-
def flatten_config_hash(config_hash)
|
60
|
-
sections = []
|
61
|
-
sections << pluck(GENERAL, config_hash)
|
62
|
-
sections << pluck("transaction_tracer", config_hash)
|
63
|
-
sections << pluck("error_collector", config_hash)
|
64
|
-
sections << pluck("browser_monitoring", config_hash)
|
65
|
-
sections << pluck("analytics_events", config_hash)
|
66
|
-
sections.concat(config_hash.to_a.sort_by { |a| a.first})
|
67
|
-
|
68
|
-
add_data_to_sections(sections)
|
69
|
-
|
70
|
-
sections
|
71
|
-
end
|
72
|
-
|
73
|
-
def add_data_to_sections(sections)
|
74
|
-
sections.each do |section|
|
75
|
-
section_key = section[0]
|
76
|
-
section.insert(1, format_name(section_key))
|
77
|
-
section.insert(2, SECTION_DESCRIPTIONS[section_key])
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
def format_name(key)
|
82
|
-
name = NAME_OVERRIDES[key]
|
83
|
-
return name if name
|
84
|
-
|
85
|
-
key.split("_").
|
86
|
-
each { |fragment| fragment[0] = fragment[0].upcase }.
|
87
|
-
join(" ")
|
88
|
-
end
|
89
|
-
|
90
|
-
def format_type(type)
|
91
|
-
if type == NewRelic::Agent::Configuration::Boolean
|
92
|
-
"Boolean"
|
93
|
-
else
|
94
|
-
type
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
|
-
def format_description(value)
|
99
|
-
description = value[:description]
|
100
|
-
description = "<b>DEPRECATED</b> #{description}" if value[:deprecated]
|
101
|
-
description
|
102
|
-
end
|
103
|
-
|
104
|
-
def format_default_value(spec)
|
105
|
-
if spec[:default].is_a?(Proc)
|
106
|
-
'(Dynamic)'
|
107
|
-
else
|
108
|
-
"<code>#{spec[:default].inspect}</code>"
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def format_env_var(key)
|
113
|
-
"NEW_RELIC_#{key.gsub(".", "_").upcase}"
|
114
|
-
end
|
115
|
-
|
116
|
-
def pluck(key, config_hash)
|
117
|
-
value = config_hash.delete(key)
|
118
|
-
[key, value]
|
119
|
-
end
|
120
|
-
|
121
|
-
def build_erb(format)
|
122
|
-
require 'erb'
|
123
|
-
path = File.join(File.dirname(__FILE__), "config.#{format}.erb")
|
124
|
-
template = File.read(File.expand_path(path))
|
125
|
-
ERB.new(template)
|
126
|
-
end
|
127
|
-
|
32
|
+
desc "Describe available New Relic configuration settings"
|
128
33
|
task :docs, [:format] => [] do |t, args|
|
129
34
|
require File.expand_path(File.join(File.dirname(__FILE__), "..", "new_relic", "agent", "configuration", "default_source.rb"))
|
130
35
|
format = args[:format] || "text"
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
if ENV['CI']
|
6
|
+
namespace :coverage do
|
7
|
+
desc "Collates all result sets generated by the different test runners"
|
8
|
+
task :report do
|
9
|
+
require 'simplecov'
|
10
|
+
require 'fileutils'
|
11
|
+
|
12
|
+
SimpleCov.coverage_dir('coverage_results')
|
13
|
+
|
14
|
+
SimpleCov.collate(Dir['*/coverage_*/.resultset.json']) do
|
15
|
+
formatter SimpleCov::Formatter::HTMLFormatter
|
16
|
+
refuse_coverage_drop
|
17
|
+
end
|
18
|
+
|
19
|
+
Dir['lib/coverage_{[!r][!e][!s][!u][!l][!t][!s]}*'].each { |dir| FileUtils.rm_rf(dir) }
|
20
|
+
end
|
21
|
+
|
22
|
+
desc "Removes all coverage_* directories"
|
23
|
+
task :clear do
|
24
|
+
require 'fileutils'
|
25
|
+
Dir["lib/coverage_*"].each { |dir| FileUtils.rm_rf(dir) }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<% sections.each do |(section_key, section_name, section_description, configs)| %>
|
2
|
+
## <%=section_name%>
|
3
|
+
|
4
|
+
<%= "#{section_description}" unless section_description.nil? %>
|
5
|
+
|
6
|
+
<CollapserGroup>
|
7
|
+
<% configs.each do |config|%>
|
8
|
+
<Collapser id="<%= config[:key].gsub('.', '-') %>" title="<%=config[:key]%>">
|
9
|
+
<table>
|
10
|
+
<tbody>
|
11
|
+
<tr><th>Type</th><td><%=config[:type]%></td></tr>
|
12
|
+
<tr><th>Default</th><td>`<%=config[:default]%>`</td></tr>
|
13
|
+
<tr><th>Environ variable</th><td>`<%=config[:env_var]%>`</td></tr>
|
14
|
+
</tbody>
|
15
|
+
</table>
|
16
|
+
|
17
|
+
<%=config[:description]%>
|
18
|
+
</Collapser>
|
19
|
+
<% end %>
|
20
|
+
</CollapserGroup>
|
21
|
+
<% end %>
|
@@ -0,0 +1,123 @@
|
|
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 Format
|
6
|
+
def output(format)
|
7
|
+
config_hash = build_config_hash
|
8
|
+
sections = flatten_config_hash(config_hash)
|
9
|
+
|
10
|
+
puts build_erb(format).result(binding).split("\n").map(&:rstrip).join("\n").gsub('. ', '. ')
|
11
|
+
sections # silences unused warning to return this
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def add_data_to_sections(sections)
|
17
|
+
sections.each do |section|
|
18
|
+
section_key = section[0]
|
19
|
+
section.insert(1, format_name(section_key))
|
20
|
+
section.insert(2, SECTION_DESCRIPTIONS[section_key])
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def build_config_hash
|
25
|
+
sections = Hash.new { |hash, key| hash[key] = [] }
|
26
|
+
NewRelic::Agent::Configuration::DEFAULTS.each do |key, value|
|
27
|
+
next unless value[:public]
|
28
|
+
|
29
|
+
key = key.to_s
|
30
|
+
section_key = section_key(key, key.split('.'))
|
31
|
+
sections[section_key] << format_sections(key, value)
|
32
|
+
end
|
33
|
+
sections
|
34
|
+
end
|
35
|
+
|
36
|
+
def build_erb(format)
|
37
|
+
require 'erb'
|
38
|
+
path = File.join(File.dirname(__FILE__), "config.#{format}.erb")
|
39
|
+
template = File.read(File.expand_path(path))
|
40
|
+
ERB.new(template)
|
41
|
+
end
|
42
|
+
|
43
|
+
def flatten_config_hash(config_hash)
|
44
|
+
sections = []
|
45
|
+
config = [GENERAL, 'transaction_tracer', 'error_collector',
|
46
|
+
'browser_monitoring', 'transaction_events',
|
47
|
+
'application_logging']
|
48
|
+
|
49
|
+
config.each { |config| sections << pluck(config, config_hash) }
|
50
|
+
|
51
|
+
sections.concat(config_hash.to_a.sort_by { |a| a.first })
|
52
|
+
add_data_to_sections(sections)
|
53
|
+
|
54
|
+
sections
|
55
|
+
end
|
56
|
+
|
57
|
+
def format_default_value(spec)
|
58
|
+
return spec[:documentation_default] if !spec[:documentation_default].nil?
|
59
|
+
|
60
|
+
if spec[:default].is_a?(Proc)
|
61
|
+
'(Dynamic)'
|
62
|
+
else
|
63
|
+
"#{spec[:default].inspect}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def format_description(value)
|
68
|
+
description = ''
|
69
|
+
description += "<b>DEPRECATED</b> " if value[:deprecated]
|
70
|
+
description += value[:description]
|
71
|
+
description
|
72
|
+
end
|
73
|
+
|
74
|
+
def format_env_var(key)
|
75
|
+
return "None" if NON_ENV_CONFIGS.include?(key)
|
76
|
+
|
77
|
+
"NEW_RELIC_#{key.tr(".", "_").upcase}"
|
78
|
+
end
|
79
|
+
|
80
|
+
def format_name(key)
|
81
|
+
name = NAME_OVERRIDES[key]
|
82
|
+
return name if name
|
83
|
+
|
84
|
+
key.split("_")
|
85
|
+
.each { |fragment| fragment[0] = fragment[0].upcase }
|
86
|
+
.join(" ")
|
87
|
+
end
|
88
|
+
|
89
|
+
def format_sections(key, value)
|
90
|
+
{
|
91
|
+
:key => key,
|
92
|
+
:type => format_type(value[:type]),
|
93
|
+
:description => format_description(value),
|
94
|
+
:default => format_default_value(value),
|
95
|
+
:env_var => format_env_var(key)
|
96
|
+
}
|
97
|
+
end
|
98
|
+
|
99
|
+
def format_type(type)
|
100
|
+
if type == NewRelic::Agent::Configuration::Boolean
|
101
|
+
"Boolean"
|
102
|
+
else
|
103
|
+
type
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def pluck(key, config_hash)
|
108
|
+
value = config_hash.delete(key)
|
109
|
+
[key, value]
|
110
|
+
end
|
111
|
+
|
112
|
+
def section_key(key, components)
|
113
|
+
if key =~ /^disable_/ # "disable_httpclient"
|
114
|
+
DISABLING
|
115
|
+
elsif components.length >= 2 && !(components[1] == "attributes") # "analytics_events.enabled"
|
116
|
+
components.first
|
117
|
+
elsif components[1] == "attributes" # "transaction_tracer.attributes.enabled"
|
118
|
+
ATTRIBUTES
|
119
|
+
else
|
120
|
+
GENERAL
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,12 @@
|
|
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 Matches
|
6
|
+
def look_for_seed(tasks)
|
7
|
+
matches = tasks.map { |t| /(seed=.*?)[,\]]/.match(t) }.compact
|
8
|
+
if matches.any?
|
9
|
+
matches.first[1]
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,24 @@
|
|
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 Prompt
|
6
|
+
def prompt_to_continue(command, destination = 'local')
|
7
|
+
puts "The following rsync command will be executed to update the #{destination} copy of the specs:"
|
8
|
+
puts
|
9
|
+
puts command
|
10
|
+
puts
|
11
|
+
puts "CAUTION: Any unsaved changes that exist within the #{destination} content will be OVERWRITTEN!"
|
12
|
+
if destination.eql?('local')
|
13
|
+
puts 'CAUTION 2: Before continuing, make sure your local repo is on the correct, synced branch!'
|
14
|
+
end
|
15
|
+
puts
|
16
|
+
print "Do you wish to continue? ('y' to continue, return to cancel) [n] "
|
17
|
+
continue = STDIN.gets.chomp
|
18
|
+
if continue.casecmp('y') == 0
|
19
|
+
system(command)
|
20
|
+
else
|
21
|
+
puts 'Cancelled'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|