newrelic_rpm 6.15.0 → 9.7.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.build_ignore +26 -0
- data/CHANGELOG.md +4176 -2789
- data/CONTRIBUTING.md +32 -13
- data/Gemfile +1 -2
- data/LICENSE +0 -6
- data/README.md +29 -22
- data/Rakefile +33 -35
- data/THIRD_PARTY_NOTICES.md +14 -199
- data/Thorfile +5 -0
- data/bin/newrelic +4 -9
- data/bin/newrelic_rpm +15 -0
- data/bin/nrdebug +85 -62
- data/init.rb +6 -8
- data/install.rb +2 -2
- data/lib/new_relic/agent/adaptive_sampler.rb +13 -9
- data/lib/new_relic/agent/agent.rb +99 -941
- data/lib/new_relic/agent/agent_helpers/connect.rb +222 -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 +175 -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 +27 -23
- data/lib/new_relic/agent/attribute_filter.rb +67 -50
- data/lib/new_relic/agent/attribute_pre_filtering.rb +109 -0
- data/lib/new_relic/agent/attribute_processing.rb +9 -9
- data/lib/new_relic/agent/attributes.rb +5 -4
- data/lib/new_relic/agent/audit_logger.rb +13 -8
- data/lib/new_relic/agent/autostart.rb +21 -20
- data/lib/new_relic/agent/chained_call.rb +1 -1
- data/lib/new_relic/agent/commands/agent_command.rb +4 -4
- data/lib/new_relic/agent/commands/agent_command_router.rb +15 -13
- data/lib/new_relic/agent/commands/thread_profiler_session.rb +16 -14
- data/lib/new_relic/agent/configuration/default_source.rb +1608 -1182
- data/lib/new_relic/agent/configuration/dotted_hash.rb +6 -5
- data/lib/new_relic/agent/configuration/environment_source.rb +13 -11
- data/lib/new_relic/agent/configuration/event_harvest_config.rb +40 -17
- data/lib/new_relic/agent/configuration/high_security_source.rb +11 -12
- data/lib/new_relic/agent/configuration/manager.rb +103 -75
- 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 +92 -95
- data/lib/new_relic/agent/configuration/server_source.rb +43 -41
- data/lib/new_relic/agent/configuration/yaml_source.rb +47 -10
- 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 +42 -16
- 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 +4 -4
- data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +3 -3
- data/lib/new_relic/agent/database.rb +45 -53
- data/lib/new_relic/agent/database_adapter.rb +3 -1
- data/lib/new_relic/agent/datastores/metric_helper.rb +21 -22
- data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +7 -6
- data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +17 -21
- 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 +9 -15
- 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 +45 -40
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +22 -22
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +23 -23
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +52 -54
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +10 -11
- data/lib/new_relic/agent/distributed_tracing/trace_context.rb +82 -83
- data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +42 -41
- data/lib/new_relic/agent/distributed_tracing.rb +33 -101
- data/lib/new_relic/agent/encoding_normalizer.rb +4 -2
- data/lib/new_relic/agent/error_collector.rb +105 -58
- 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 +9 -7
- 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 +27 -25
- 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 +5 -8
- data/lib/new_relic/agent/heap.rb +8 -9
- data/lib/new_relic/agent/hostname.rb +21 -14
- data/lib/new_relic/agent/http_clients/abstract.rb +22 -31
- data/lib/new_relic/agent/http_clients/async_http_wrappers.rb +80 -0
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +14 -17
- data/lib/new_relic/agent/http_clients/ethon_wrappers.rb +109 -0
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +15 -17
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +7 -6
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +8 -9
- data/lib/new_relic/agent/http_clients/httpx_wrappers.rb +91 -0
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +13 -8
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +12 -13
- data/lib/new_relic/agent/http_clients/uri_util.rb +3 -5
- data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +9 -22
- data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +42 -0
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +41 -33
- 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 +20 -21
- 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 +41 -38
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +87 -75
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +54 -66
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +6 -6
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +30 -22
- 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_broadcast_logger/chain.rb +69 -0
- data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger/instrumentation.rb +13 -0
- data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger/prepend.rb +37 -0
- data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger.rb +23 -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 +24 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +12 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger.rb +26 -0
- data/lib/new_relic/agent/instrumentation/active_support_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/async_http/chain.rb +23 -0
- data/lib/new_relic/agent/instrumentation/async_http/instrumentation.rb +37 -0
- data/lib/new_relic/agent/instrumentation/async_http/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/async_http.rb +28 -0
- data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +159 -0
- data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/bunny.rb +11 -154
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/chain.rb +36 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/instrumentation.rb +20 -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 +74 -63
- data/lib/new_relic/agent/instrumentation/curb/chain.rb +91 -0
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +225 -0
- data/lib/new_relic/agent/instrumentation/curb/prepend.rb +61 -0
- data/lib/new_relic/agent/instrumentation/curb.rb +14 -246
- data/lib/new_relic/agent/instrumentation/custom_events.rb +12 -0
- data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +38 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +36 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +51 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +30 -53
- data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +29 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +70 -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/ethon/chain.rb +39 -0
- data/lib/new_relic/agent/instrumentation/ethon/instrumentation.rb +105 -0
- data/lib/new_relic/agent/instrumentation/ethon/prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/ethon.rb +39 -0
- data/lib/new_relic/agent/instrumentation/excon/middleware.rb +11 -7
- data/lib/new_relic/agent/instrumentation/excon.rb +27 -29
- data/lib/new_relic/agent/instrumentation/fiber/chain.rb +27 -0
- data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +20 -0
- data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +25 -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 +104 -0
- data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
- data/lib/new_relic/agent/instrumentation/grape.rb +16 -117
- data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +97 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +94 -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 +138 -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 +41 -0
- data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httpclient.rb +10 -32
- data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +34 -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/httpx/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/httpx/instrumentation.rb +51 -0
- data/lib/new_relic/agent/instrumentation/httpx/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httpx.rb +27 -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 +69 -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 +59 -128
- data/lib/new_relic/agent/instrumentation/memcache/helper.rb +59 -0
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +99 -0
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +103 -0
- data/lib/new_relic/agent/instrumentation/memcache.rb +58 -74
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +15 -14
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +6 -8
- data/lib/new_relic/agent/instrumentation/mongo.rb +6 -137
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +24 -23
- data/lib/new_relic/agent/instrumentation/net_http/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/{net_prepend.rb → net_http/instrumentation.rb} +18 -14
- 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 +56 -10
- data/lib/new_relic/agent/instrumentation/padrino/chain.rb +38 -0
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +32 -0
- data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
- data/lib/new_relic/agent/instrumentation/padrino.rb +20 -58
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +6 -6
- 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 +81 -0
- data/lib/new_relic/agent/instrumentation/rack/prepend.rb +43 -0
- data/lib/new_relic/agent/instrumentation/rack.rb +32 -142
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +25 -56
- 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 +18 -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 +20 -0
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +146 -0
- data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/rake.rb +17 -158
- 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 +98 -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 +19 -108
- 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 +38 -0
- data/lib/new_relic/agent/instrumentation/resque/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/resque.rb +32 -43
- data/lib/new_relic/agent/instrumentation/roda/chain.rb +43 -0
- data/lib/new_relic/agent/instrumentation/roda/ignorer.rb +45 -0
- data/lib/new_relic/agent/instrumentation/roda/instrumentation.rb +68 -0
- data/lib/new_relic/agent/instrumentation/roda/prepend.rb +24 -0
- data/lib/new_relic/agent/instrumentation/roda/roda_transaction_namer.rb +29 -0
- data/lib/new_relic/agent/instrumentation/roda.rb +36 -0
- data/lib/new_relic/agent/instrumentation/sequel.rb +16 -19
- data/lib/new_relic/agent/instrumentation/sequel_helper.rb +12 -12
- data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +24 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +30 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +60 -0
- data/lib/new_relic/agent/instrumentation/sidekiq.rb +27 -65
- data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +30 -36
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +130 -0
- data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +4 -6
- data/lib/new_relic/agent/instrumentation/sinatra.rb +34 -163
- data/lib/new_relic/agent/instrumentation/stripe.rb +28 -0
- data/lib/new_relic/agent/instrumentation/stripe_subscriber.rb +77 -0
- data/lib/new_relic/agent/instrumentation/thread/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +24 -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 +46 -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 +84 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +12 -91
- data/lib/new_relic/agent/instrumentation/view_component/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/view_component/instrumentation.rb +39 -0
- data/lib/new_relic/agent/instrumentation/view_component/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/view_component.rb +26 -0
- 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 +58 -48
- 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 +282 -0
- data/lib/new_relic/agent/log_event_attributes.rb +115 -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 +95 -52
- data/lib/new_relic/agent/memory_logger.rb +2 -2
- data/lib/new_relic/agent/messaging.rb +72 -86
- data/lib/new_relic/agent/method_tracer.rb +159 -154
- data/lib/new_relic/agent/method_tracer_helpers.rb +109 -11
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +26 -19
- 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 +17 -9
- data/lib/new_relic/agent/monitors.rb +6 -7
- data/lib/new_relic/agent/new_relic_service/encoders.rb +9 -9
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +6 -6
- 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 +282 -213
- 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 +7 -11
- data/lib/new_relic/agent/parameter_filtering.rb +29 -15
- data/lib/new_relic/agent/payload_metric_mapping.rb +9 -10
- data/lib/new_relic/agent/pipe_channel_manager.rb +34 -23
- data/lib/new_relic/agent/pipe_service.rb +13 -8
- data/lib/new_relic/agent/prepend_supportability.rb +2 -2
- data/lib/new_relic/agent/priority_sampled_buffer.rb +9 -12
- data/lib/new_relic/agent/rules_engine/replacement_rule.rb +11 -11
- data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +12 -14
- data/lib/new_relic/agent/rules_engine.rb +6 -5
- data/lib/new_relic/agent/sampler.rb +5 -5
- data/lib/new_relic/agent/sampler_collection.rb +4 -5
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +8 -7
- data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +20 -17
- data/lib/new_relic/agent/samplers/memory_sampler.rb +32 -21
- data/lib/new_relic/agent/samplers/object_sampler.rb +2 -2
- data/lib/new_relic/agent/samplers/vm_sampler.rb +21 -19
- data/lib/new_relic/agent/span_event_aggregator.rb +15 -15
- data/lib/new_relic/agent/span_event_primitive.rb +77 -59
- data/lib/new_relic/agent/sql_sampler.rb +20 -21
- data/lib/new_relic/agent/stats.rb +79 -42
- 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 +8 -9
- data/lib/new_relic/agent/system_info.rb +113 -67
- 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 +17 -21
- data/lib/new_relic/agent/threading/thread_profile.rb +24 -24
- data/lib/new_relic/agent/timestamp_sampled_buffer.rb +2 -2
- data/lib/new_relic/agent/tracer.rb +101 -96
- data/lib/new_relic/agent/transaction/abstract_segment.rb +176 -52
- data/lib/new_relic/agent/transaction/datastore_segment.rb +22 -18
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +65 -57
- data/lib/new_relic/agent/transaction/distributed_tracing.rb +46 -48
- data/lib/new_relic/agent/transaction/external_request_segment.rb +52 -39
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +31 -37
- data/lib/new_relic/agent/transaction/request_attributes.rb +78 -42
- 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 +2 -2
- data/lib/new_relic/agent/transaction/trace.rb +16 -12
- 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 +30 -28
- data/lib/new_relic/agent/transaction/tracing.rb +32 -13
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +6 -6
- data/lib/new_relic/agent/transaction.rb +229 -178
- data/lib/new_relic/agent/transaction_error_primitive.rb +43 -25
- data/lib/new_relic/agent/transaction_event_aggregator.rb +16 -16
- data/lib/new_relic/agent/transaction_event_primitive.rb +51 -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 +7 -8
- data/lib/new_relic/agent/transaction_time_aggregator.rb +32 -27
- data/lib/new_relic/agent/utilization/aws.rb +34 -4
- data/lib/new_relic/agent/utilization/azure.rb +6 -6
- data/lib/new_relic/agent/utilization/gcp.rb +11 -13
- data/lib/new_relic/agent/utilization/pcf.rb +6 -5
- data/lib/new_relic/agent/utilization/vendor.rb +45 -32
- data/lib/new_relic/agent/utilization_data.rb +7 -5
- data/lib/new_relic/agent/vm/c_ruby_vm.rb +99 -0
- data/lib/new_relic/agent/vm/jruby_vm.rb +1 -1
- data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +3 -3
- data/lib/new_relic/agent/vm/snapshot.rb +5 -5
- data/lib/new_relic/agent/vm.rb +3 -3
- data/lib/new_relic/agent/worker_loop.rb +10 -12
- data/lib/new_relic/agent.rb +204 -111
- data/lib/new_relic/base64.rb +25 -0
- data/lib/new_relic/cli/command.rb +26 -25
- data/lib/new_relic/cli/commands/deployments.rb +100 -49
- data/lib/new_relic/cli/commands/install.rb +31 -34
- data/lib/new_relic/coerce.rb +15 -13
- data/lib/new_relic/collection_helper.rb +50 -48
- data/lib/new_relic/constants.rb +13 -12
- data/lib/new_relic/control/class_methods.rb +6 -12
- data/lib/new_relic/control/frameworks/external.rb +2 -2
- data/lib/new_relic/control/frameworks/rails.rb +60 -30
- 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/roda.rb +20 -0
- 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 +27 -45
- data/lib/new_relic/control/instrumentation.rb +25 -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 +141 -32
- data/lib/new_relic/environment_report.rb +41 -33
- data/lib/new_relic/helper.rb +49 -7
- data/lib/new_relic/language_support.rb +39 -6
- data/lib/new_relic/latest_changes.rb +10 -9
- data/lib/new_relic/local_environment.rb +42 -37
- 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 +43 -46
- data/lib/new_relic/rack/agent_hooks.rb +2 -2
- data/lib/new_relic/rack/agent_middleware.rb +3 -17
- data/lib/new_relic/rack/browser_monitoring.rb +135 -121
- data/lib/new_relic/rack.rb +1 -1
- 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 +1 -1
- data/lib/new_relic/supportability_helper.rb +14 -12
- data/lib/new_relic/traced_thread.rb +38 -0
- data/lib/new_relic/version.rb +6 -17
- data/lib/newrelic_rpm.rb +20 -33
- data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +18 -21
- data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +9 -15
- data/lib/tasks/all.rb +3 -3
- data/lib/tasks/bump_version.rake +21 -0
- data/lib/tasks/config.rake +25 -119
- data/lib/tasks/coverage_report.rake +28 -0
- data/lib/tasks/helpers/config.html.erb +114 -0
- data/lib/tasks/helpers/format.rb +127 -0
- data/lib/tasks/helpers/matches.rb +12 -0
- data/lib/tasks/helpers/newrelicyml.rb +144 -0
- data/lib/tasks/helpers/prompt.rb +24 -0
- data/lib/tasks/helpers/version_bump.rb +62 -0
- data/lib/tasks/install.rake +8 -4
- 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 +21 -0
- data/lib/tasks/instrumentation_generator/templates/chain_method.tt +7 -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/newrelic.rb +2 -1
- data/lib/tasks/newrelicyml.rake +13 -0
- data/lib/tasks/tests.rake +83 -17
- data/newrelic.yml +790 -4
- data/newrelic_rpm.gemspec +52 -43
- data/recipes/newrelic.rb +2 -2
- data/test/agent_helper.rb +252 -198
- metadata +275 -95
- data/.gitignore +0 -37
- data/.project +0 -23
- data/.yardopts +0 -26
- data/Guardfile +0 -25
- data/ROADMAP.md +0 -24
- data/bin/mongrel_rpm +0 -33
- data/bin/newrelic_cmd +0 -5
- data/cert/cacert.pem +0 -1177
- data/config/database.yml +0 -5
- data/config.dot +0 -278
- 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/http.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/net.rb +0 -70
- 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/range_extensions.rb +0 -47
- data/lib/new_relic/agent/supported_versions.rb +0 -275
- data/lib/new_relic/agent/vm/mri_vm.rb +0 -81
- data/lib/new_relic/control/frameworks/merb.rb +0 -29
- data/lib/tasks/config.html.erb +0 -32
- data/lib/tasks/multiverse.rake +0 -2
- data/lib/tasks/multiverse.rb +0 -104
- /data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
@@ -0,0 +1,114 @@
|
|
1
|
+
---
|
2
|
+
title: Ruby agent configuration
|
3
|
+
tags:
|
4
|
+
- Agents
|
5
|
+
- Ruby agent
|
6
|
+
- Configuration
|
7
|
+
metaDescription: 'APM for Ruby: how to configure the Ruby agent, including editing the config file and setting environment variables.'
|
8
|
+
redirects:
|
9
|
+
- /docs/agents/ruby-agent/configuration/ruby-agent-configuration
|
10
|
+
- /docs/ruby/ruby-agent-configuration
|
11
|
+
- /docs/agents/ruby-agent/installation-and-configuration/ruby-agent-configuration
|
12
|
+
- /docs/agents/ruby-agent/installation-configuration/ruby-agent-configuration
|
13
|
+
---
|
14
|
+
|
15
|
+
<CONTRIBUTOR_NOTE>
|
16
|
+
This file is automatically generated from values defined in `lib/new_relic/agent/configuration/default_source.rb`.
|
17
|
+
Make all changes directly to `default_source.rb.`
|
18
|
+
Submit PRs or raise issues at: https://github.com/newrelic/newrelic-ruby-agent
|
19
|
+
</CONTRIBUTOR_NOTE>
|
20
|
+
|
21
|
+
You can configure the New Relic Ruby agent with settings in a configuration file, environment variables, or programmatically with server-side configuration. This document summarizes the configuration options available for the Ruby agent.
|
22
|
+
|
23
|
+
If the default value for a configuration option is `(Dynamic)`, this means the Ruby agent calculates the default at runtime. The value for the config setting defaults to the value of another setting as appropriate.
|
24
|
+
|
25
|
+
## Configuration methods and precedence [#Options]
|
26
|
+
|
27
|
+
The primary (default) method to configure the Ruby agent is via the configuration file (`newrelic.yml`) in the `config` subdirectory. To set configuration values using environment variables:
|
28
|
+
|
29
|
+
1. Add the prefix `NEW_RELIC_` to the setting's name.
|
30
|
+
2. Replace any periods `.` with underscores `_`.
|
31
|
+
|
32
|
+
You can also configure a few values in the UI via [server-side configuration](/docs/agents/manage-apm-agents/configuration/server-side-agent-configuration).
|
33
|
+
|
34
|
+
The Ruby agent follows this order of precedence for configuration:
|
35
|
+
|
36
|
+
1. Environment variables
|
37
|
+
2. Server-side configuration
|
38
|
+
3. Configuration file (`newrelic.yml`)
|
39
|
+
4. Default configuration settings
|
40
|
+
|
41
|
+
In other words, environment variables override all other configuration settings and info, server-side configuration overrides the configuration file and default config settings, and so on.
|
42
|
+
|
43
|
+
## View and edit config file options [#Edit]
|
44
|
+
|
45
|
+
The Ruby agent's `newrelic.yml` is a standard YAML configuration file. It typically includes a `Defaults` section at the top, plus sections below for each application environment (`Development`, `Test`, `Staging`, and `Production`).
|
46
|
+
|
47
|
+
The Ruby agent determines which section of the `newrelic.yml` config file to read from by looking at certain environment variables to derive the application's environment. This can be useful when you want to use `info` for the `log_level` config setting in your production environment, and you want more verbose `log_level` config settings (such as `debug`) in your development environment.
|
48
|
+
|
49
|
+
Here is an example `newrelic.yml` config file:
|
50
|
+
|
51
|
+
```yaml
|
52
|
+
common: &default_settings
|
53
|
+
license_key: 'YOUR_LICENSE_KEY'
|
54
|
+
app_name: 'My Application Name'
|
55
|
+
production:
|
56
|
+
<<: *default_settings
|
57
|
+
log_level: info
|
58
|
+
development:
|
59
|
+
<<: *default_settings
|
60
|
+
log_level: debug
|
61
|
+
```
|
62
|
+
|
63
|
+
The Ruby agent looks for the following environment variables, in this order, to find the application environment:
|
64
|
+
|
65
|
+
1. `NEW_RELIC_ENV`
|
66
|
+
2. `RUBY_ENV`
|
67
|
+
3. `RAILS_ENV`
|
68
|
+
4. `APP_ENV`
|
69
|
+
5. `RACK_ENV`
|
70
|
+
|
71
|
+
If the Ruby agent doesn't detect values for any of those environment variables, it will default the application environment to `development` and read from the `development` section of the `newrelic.yml` config file.
|
72
|
+
|
73
|
+
When running the Ruby agent in a Rails app, the agent first looks for the `NEW_RELIC_ENV` environment variable to determine the application environment and which section of the `newrelic.yml` to use. If `NEW_RELIC_ENV` is not present, the agent uses the Rails environment (`RAILS_ENV`).
|
74
|
+
|
75
|
+
When you edit the config file, be sure to:
|
76
|
+
|
77
|
+
* Indent only with two spaces.
|
78
|
+
* Indent only where relevant, in stanzas such as **`error_collector`**.
|
79
|
+
|
80
|
+
If you do not indent correctly, the agent may throw an `Unable to parse configuration file` error on startup.
|
81
|
+
|
82
|
+
To view the most current list of available Ruby agent configuration options, use the `rake newrelic:config:docs` command. This document describes the most common options.
|
83
|
+
|
84
|
+
## Update the config file [#Updates]
|
85
|
+
|
86
|
+
This documentation applies to the Ruby agent's latest release. For details on earlier versions, refer to the comments in `newrelic.yml` itself.
|
87
|
+
|
88
|
+
To update `newrelic.yml` file after a new release, use the template in the base directory of the agent gem. When you update to new gem versions, examine or diff `config/newrelic.yml` and `newrelic.yml` in the [installation directory](/docs/agents/manage-apm-agents/troubleshooting/find-agent-root-directory#ruby-agent) to take advantage of new configuration options.
|
89
|
+
|
90
|
+
<Callout variant="important">
|
91
|
+
Updating the gem does not automatically update `config/newrelic.yml`.
|
92
|
+
</Callout>
|
93
|
+
|
94
|
+
<% sections.each do |(section_key, section_name, section_description, configs)| %>
|
95
|
+
## <%=section_name%>
|
96
|
+
|
97
|
+
<%= "#{section_description}" unless section_description.nil? %>
|
98
|
+
|
99
|
+
<CollapserGroup>
|
100
|
+
<% configs.each do |config|%>
|
101
|
+
<Collapser id="<%= config[:key].gsub('.', '-') %>" title="<%=config[:key]%>">
|
102
|
+
<table>
|
103
|
+
<tbody>
|
104
|
+
<tr><th>Type</th><td><%=config[:type]%></td></tr>
|
105
|
+
<tr><th>Default</th><td>`<%=config[:default]%>`</td></tr>
|
106
|
+
<tr><th>Environ variable</th><td>`<%=config[:env_var]%>`</td></tr>
|
107
|
+
</tbody>
|
108
|
+
</table>
|
109
|
+
|
110
|
+
<%=config[:description]%>
|
111
|
+
</Collapser>
|
112
|
+
<% end %>
|
113
|
+
</CollapserGroup>
|
114
|
+
<% end %>
|
@@ -0,0 +1,127 @@
|
|
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
|
+
DEFAULT_CONFIG_PATH = 'ruby-agent-configuration.mdx'
|
7
|
+
|
8
|
+
def output(format)
|
9
|
+
result = build_erb(format).result(binding).split("\n").map(&:rstrip).join("\n").gsub('. ', '. ')
|
10
|
+
File.write(DEFAULT_CONFIG_PATH, result)
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def sections
|
16
|
+
@sections ||= flatten_config_hash(build_config_hash)
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_data_to_sections(sections)
|
20
|
+
sections.each do |section|
|
21
|
+
section_key = section[0]
|
22
|
+
section.insert(1, format_name(section_key))
|
23
|
+
section.insert(2, SECTION_DESCRIPTIONS[section_key])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def build_config_hash
|
28
|
+
sections = Hash.new { |hash, key| hash[key] = [] }
|
29
|
+
NewRelic::Agent::Configuration::DEFAULTS.each do |key, value|
|
30
|
+
next unless value[:public]
|
31
|
+
|
32
|
+
key = key.to_s
|
33
|
+
section_key = section_key(key, key.split('.'))
|
34
|
+
sections[section_key] << format_sections(key, value)
|
35
|
+
end
|
36
|
+
sections
|
37
|
+
end
|
38
|
+
|
39
|
+
def build_erb(format)
|
40
|
+
require 'erb'
|
41
|
+
path = File.join(File.dirname(__FILE__), "config.#{format}.erb")
|
42
|
+
template = File.read(File.expand_path(path))
|
43
|
+
ERB.new(template)
|
44
|
+
end
|
45
|
+
|
46
|
+
def flatten_config_hash(config_hash)
|
47
|
+
sections = []
|
48
|
+
config = [GENERAL, 'transaction_tracer', 'error_collector',
|
49
|
+
'browser_monitoring', 'transaction_events',
|
50
|
+
'application_logging']
|
51
|
+
|
52
|
+
config.each { |config| sections << pluck(config, config_hash) }
|
53
|
+
|
54
|
+
sections.concat(config_hash.to_a.sort_by { |a| a.first })
|
55
|
+
add_data_to_sections(sections)
|
56
|
+
|
57
|
+
sections
|
58
|
+
end
|
59
|
+
|
60
|
+
def format_default_value(spec)
|
61
|
+
return spec[:documentation_default] if !spec[:documentation_default].nil?
|
62
|
+
|
63
|
+
if spec[:default].is_a?(Proc)
|
64
|
+
'(Dynamic)'
|
65
|
+
else
|
66
|
+
"#{spec[:default].inspect}"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def format_description(value)
|
71
|
+
description = ''
|
72
|
+
description += '**DEPRECATED** ' if value[:deprecated]
|
73
|
+
description += value[:description]
|
74
|
+
description
|
75
|
+
end
|
76
|
+
|
77
|
+
def format_env_var(key)
|
78
|
+
return 'None' if NON_ENV_CONFIGS.include?(key)
|
79
|
+
|
80
|
+
"NEW_RELIC_#{key.tr('.', '_').upcase}"
|
81
|
+
end
|
82
|
+
|
83
|
+
def format_name(key)
|
84
|
+
name = NAME_OVERRIDES[key]
|
85
|
+
return name if name
|
86
|
+
|
87
|
+
title = key.split('_')
|
88
|
+
.each { |fragment| fragment[0] = fragment[0].upcase }
|
89
|
+
.join(' ')
|
90
|
+
"#{title} [##{key.tr('_', '-')}]"
|
91
|
+
end
|
92
|
+
|
93
|
+
def format_sections(key, value)
|
94
|
+
{
|
95
|
+
:key => key,
|
96
|
+
:type => format_type(value[:type]),
|
97
|
+
:description => format_description(value),
|
98
|
+
:default => format_default_value(value),
|
99
|
+
:env_var => format_env_var(key)
|
100
|
+
}
|
101
|
+
end
|
102
|
+
|
103
|
+
def format_type(type)
|
104
|
+
if type == NewRelic::Agent::Configuration::Boolean
|
105
|
+
'Boolean'
|
106
|
+
else
|
107
|
+
type
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def pluck(key, config_hash)
|
112
|
+
value = config_hash.delete(key)
|
113
|
+
[key, value]
|
114
|
+
end
|
115
|
+
|
116
|
+
def section_key(key, components)
|
117
|
+
if /^disable_/.match?(key) # "disable_httpclient"
|
118
|
+
DISABLING
|
119
|
+
elsif components.length >= 2 && !(components[1] == 'attributes') # "analytics_events.enabled"
|
120
|
+
components.first
|
121
|
+
elsif components[1] == 'attributes' # "transaction_tracer.attributes.enabled"
|
122
|
+
ATTRIBUTES
|
123
|
+
else
|
124
|
+
GENERAL
|
125
|
+
end
|
126
|
+
end
|
127
|
+
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,144 @@
|
|
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 '../../new_relic/agent/configuration/default_source'
|
6
|
+
|
7
|
+
module NewRelicYML
|
8
|
+
CRITICAL = [:'agent_enabled', :'app_name', :'license_key', :'log_level']
|
9
|
+
DEFAULTS = NewRelic::Agent::Configuration::DEFAULTS
|
10
|
+
# Skip because not configurable via yml
|
11
|
+
SKIP = [:'defer_rails_initialization']
|
12
|
+
# Don't evaluate Procs, instead use set values
|
13
|
+
PROCS = {:'config_path' => 'newrelic.yml',
|
14
|
+
:'process_host.display_name' => 'default hostname',
|
15
|
+
:'transaction_tracer.transaction_threshold' => 1.0}
|
16
|
+
|
17
|
+
HEADER = <<~HEADER
|
18
|
+
#
|
19
|
+
# This file configures the New Relic agent. New Relic monitors Ruby, Java,
|
20
|
+
# .NET, PHP, Python, Node, and Go applications with deep visibility and low
|
21
|
+
# overhead. For more information, visit www.newrelic.com.
|
22
|
+
|
23
|
+
# Generated <%= Time.now.strftime('%B %d, %Y') %><%= ", for version \#{@agent_version}" if @agent_version %>
|
24
|
+
#<%= "\\n# \#{generated_for_user}\\n#" if generated_for_user %>
|
25
|
+
# For full documentation of agent configuration options, please refer to
|
26
|
+
# https://docs.newrelic.com/docs/agents/ruby-agent/installation-configuration/ruby-agent-configuration
|
27
|
+
|
28
|
+
common: &default_settings
|
29
|
+
# Required license key associated with your New Relic account.
|
30
|
+
license_key: <%= license_key %>
|
31
|
+
|
32
|
+
# Your application name. Renaming here affects where data displays in New
|
33
|
+
# Relic. For more details, see https://docs.newrelic.com/docs/apm/new-relic-apm/maintenance/renaming-applications
|
34
|
+
app_name: <%= app_name %>
|
35
|
+
|
36
|
+
# To disable the agent regardless of other settings, uncomment the following:
|
37
|
+
# agent_enabled: false
|
38
|
+
|
39
|
+
# Logging level for log/newrelic_agent.log; options are error, warn, info, or
|
40
|
+
# debug.
|
41
|
+
log_level: info
|
42
|
+
|
43
|
+
# All of the following configuration options are optional. Review them, and
|
44
|
+
# uncomment or edit them if they appear relevant to your application needs.
|
45
|
+
|
46
|
+
HEADER
|
47
|
+
|
48
|
+
FOOTER = <<~FOOTER
|
49
|
+
# Environment-specific settings are in this section.
|
50
|
+
# RAILS_ENV or RACK_ENV (as appropriate) is used to determine the environment.
|
51
|
+
# If your application has other named environments, configure them here.
|
52
|
+
development:
|
53
|
+
<<: *default_settings
|
54
|
+
app_name: <%= app_name %> (Development)
|
55
|
+
|
56
|
+
test:
|
57
|
+
<<: *default_settings
|
58
|
+
# It doesn't make sense to report to New Relic from automated test runs.
|
59
|
+
monitor_mode: false
|
60
|
+
|
61
|
+
staging:
|
62
|
+
<<: *default_settings
|
63
|
+
app_name: <%= app_name %> (Staging)
|
64
|
+
|
65
|
+
production:
|
66
|
+
<<: *default_settings
|
67
|
+
FOOTER
|
68
|
+
|
69
|
+
def self.get_configs(defaults)
|
70
|
+
defaults.sort.each_with_object({}) do |(key, value), final_configs|
|
71
|
+
next if CRITICAL.include?(key) || SKIP.include?(key)
|
72
|
+
|
73
|
+
next unless public_config?(value) && !deprecated?(value)
|
74
|
+
|
75
|
+
sanitized_description = sanitize_description(value[:description])
|
76
|
+
description = format_description(sanitized_description)
|
77
|
+
default = default_value(key, value)
|
78
|
+
final_configs[key] = {description: description, default: default}
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.public_config?(value)
|
83
|
+
value[:public] == true
|
84
|
+
end
|
85
|
+
|
86
|
+
def self.deprecated?(value)
|
87
|
+
value[:deprecated] == true
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.sanitize_description(description)
|
91
|
+
# remove callouts
|
92
|
+
description = description.split("\n").reject { |line| line.match?('</?Callout') }.join("\n")
|
93
|
+
# remove InlinePopover, keep the text inside type
|
94
|
+
description.gsub!(/<InlinePopover type="(.*)" \/>/, '\1')
|
95
|
+
# remove hyperlinks
|
96
|
+
description.gsub!(/\[([^\]]+)\]\([^\)]+\)/, '\1')
|
97
|
+
# remove single pairs of backticks
|
98
|
+
description.gsub!(/`([^`]+)`/, '\1')
|
99
|
+
# removed href links
|
100
|
+
description.gsub!(/<a href="(.*)">(.*)<\/a>/, '\2')
|
101
|
+
|
102
|
+
description
|
103
|
+
end
|
104
|
+
|
105
|
+
def self.format_description(description)
|
106
|
+
# remove leading and trailing whitespace
|
107
|
+
description.strip!
|
108
|
+
# wrap text after 80 characters
|
109
|
+
description.gsub!(/(.{1,80})(\s+|\Z)/, "\\1\n")
|
110
|
+
# add hashtags to lines
|
111
|
+
description = description.split("\n").map { |line| " # #{line}" }.join("\n")
|
112
|
+
|
113
|
+
description
|
114
|
+
end
|
115
|
+
|
116
|
+
def self.default_value(key, config_hash)
|
117
|
+
if PROCS.include?(key)
|
118
|
+
PROCS[key]
|
119
|
+
else
|
120
|
+
default = config_hash[:documentation_default].nil? ? config_hash[:default] : config_hash[:documentation_default]
|
121
|
+
default = 'nil' if default.nil?
|
122
|
+
default = '""' if default == ''
|
123
|
+
|
124
|
+
default
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
def self.build_string(defaults)
|
129
|
+
configs = get_configs(defaults)
|
130
|
+
yml_string = ''
|
131
|
+
|
132
|
+
configs.each do |key, value|
|
133
|
+
yml_string += "#{value[:description]}\n # #{key}: #{value[:default]}\n\n"
|
134
|
+
end
|
135
|
+
|
136
|
+
yml_string
|
137
|
+
end
|
138
|
+
|
139
|
+
# :nocov:
|
140
|
+
def self.write_file(defaults = DEFAULTS)
|
141
|
+
File.write('newrelic.yml', HEADER + build_string(defaults) + FOOTER)
|
142
|
+
end
|
143
|
+
# :nocov:
|
144
|
+
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
|
@@ -0,0 +1,62 @@
|
|
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 VersionBump
|
6
|
+
MAJOR = 0
|
7
|
+
MINOR = 1
|
8
|
+
TINY = 2
|
9
|
+
VERSION = {major: MAJOR, minor: MINOR, tiny: TINY}
|
10
|
+
|
11
|
+
# Updates version.rb with new version number
|
12
|
+
def self.update_version
|
13
|
+
bump_type = determine_bump_type
|
14
|
+
file = read_file('lib/new_relic/version.rb')
|
15
|
+
new_version = {}
|
16
|
+
|
17
|
+
VERSION.each do |key, current|
|
18
|
+
file.gsub!(/(#{key.to_s.upcase} = )(\d+)/) do
|
19
|
+
match = Regexp.last_match
|
20
|
+
|
21
|
+
new_version[key] = if bump_type == current # bump type, increase by 1
|
22
|
+
match[2].to_i + 1
|
23
|
+
elsif bump_type < current # right of bump type, goes to 0
|
24
|
+
0
|
25
|
+
else # left of bump type, stays the same
|
26
|
+
match[2].to_i
|
27
|
+
end
|
28
|
+
|
29
|
+
match[1] + new_version[key].to_s
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
write_file('lib/new_relic/version.rb', file)
|
34
|
+
new_version.values.join('.')
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.read_file(path)
|
38
|
+
File.read(File.expand_path(path))
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.write_file(path, file)
|
42
|
+
File.write(File.expand_path(path), file)
|
43
|
+
end
|
44
|
+
|
45
|
+
# Determined version based on if changelog has a feature or not for version
|
46
|
+
def self.determine_bump_type
|
47
|
+
file = read_file('CHANGELOG.md')
|
48
|
+
lines = file.split('## ')[1].split('- **')
|
49
|
+
return MAJOR if lines.first.include?('Major version')
|
50
|
+
return MINOR if lines.any? { |line| line.include?('Feature:') }
|
51
|
+
|
52
|
+
TINY
|
53
|
+
end
|
54
|
+
|
55
|
+
# Replace dev with version number in changelog
|
56
|
+
def self.update_changelog(version)
|
57
|
+
file = read_file('CHANGELOG.md')
|
58
|
+
file.gsub!('## dev', "## v#{version}")
|
59
|
+
file.gsub!('Version <dev>', "Version #{version}")
|
60
|
+
write_file('CHANGELOG.md', file)
|
61
|
+
end
|
62
|
+
end
|
data/lib/tasks/install.rake
CHANGED
@@ -1,11 +1,15 @@
|
|
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
|
+
|
1
5
|
namespace :newrelic do
|
2
|
-
desc
|
6
|
+
desc 'Install a default config/newrelic.yml file'
|
3
7
|
task :install do
|
4
|
-
load File.expand_path(File.join(File.dirname(__FILE__),
|
8
|
+
load File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'install.rb'))
|
5
9
|
end
|
6
10
|
|
7
|
-
desc
|
11
|
+
desc 'Gratefulness is always appreciated'
|
8
12
|
task :thanks do
|
9
|
-
puts
|
13
|
+
puts 'The Ruby agent team is grateful to Jim Weirich for his kindness and his code. He will be missed.'
|
10
14
|
end
|
11
15
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
# Instrumentation Generator
|
2
|
+
|
3
|
+
## Usage
|
4
|
+
|
5
|
+
`thor list` can be passed to get a list of all available thor commands
|
6
|
+
|
7
|
+
### instrumentation:scaffold
|
8
|
+
|
9
|
+
This task requires one parameter by default: the name of the library or class you are instrumenting. This task generates the basic file structure needed to add new instrumentation to the Ruby agent.
|
10
|
+
|
11
|
+
Run it using:
|
12
|
+
|
13
|
+
`thor instrumentation:scaffold gem_name`
|
14
|
+
|
15
|
+
It accepts two optional parameters:
|
16
|
+
|
17
|
+
- `--method`: the name of a method to instrument. Only one method can be accepted at this time. Defaults to `method_to_instrument`
|
18
|
+
- `--args`: the arguments for the instrumented method. A comma-separated list can be given if there are multiple arguments. Defaults to `*args`.
|
19
|
+
|
20
|
+
With the optional parameters, the task can be run like so:
|
21
|
+
|
22
|
+
`thor instrumentation:scaffold gem_name --method=method_to_instrument --args=arg1,arg2,arg3`
|
23
|
+
|
24
|
+
### WIP: instrumentation:add_new_method
|
25
|
+
|
26
|
+
Are you trying add instrumentation for a method within library we already instrument? This task is for you! Instead of building the entire scaffold, this task inserts only the changes needed within the `instrumentation.rb` and test files to instrument the new method. It requires one argument, the name of the existing instrumentation to add the method to. If the instrumented library does not already exist, it will create a new scaffold for that library.
|
27
|
+
|
28
|
+
Run it using:
|
29
|
+
|
30
|
+
`thor instrumentation:scaffold gem_name`
|
31
|
+
|
32
|
+
It accepts two optional parameters:
|
33
|
+
|
34
|
+
- `--method`: the name of a method to instrument. Only one method can be accepted at this time. Defaults to `method_to_instrument`
|
35
|
+
- `--args`: the arguments for the instrumented method. A comma-separated list can be given if there are multiple arguments. Defaults to `*args`.
|
36
|
+
|
37
|
+
With the optional parameters, the task can be run like so:
|
38
|
+
|
39
|
+
`thor instrumentation:add_new_method gem_name --method=method_to_instrument --args=arg1,arg2,arg3`
|
40
|
+
|
41
|
+
## Idea
|
42
|
+
|
43
|
+
Create a CLI, similar to Rails’ generators and scaffold scripts, to create the required files and basic classes for instrumenting new libraries. The hope is that the parts of adding new instrumentation that is repetitive can be eliminated and/or reduced so that it takes less time to add new instrumentation and we can spend development time considering the best attributes to collect and interactions to measure. I also hope this project will reduce the overall toil related to adding new instrumentation.
|
44
|
+
|
45
|
+
The files we create with little variation besides library and method names are:
|
46
|
+
|
47
|
+
- Lib
|
48
|
+
- Dependency detection
|
49
|
+
- Chain
|
50
|
+
- Prepend
|
51
|
+
- Instrumentation
|
52
|
+
- Tests
|
53
|
+
- configuration/newrelic.yml
|
54
|
+
- Envfile
|
55
|
+
- Test file
|
56
|
+
|
57
|
+
Furthermore, we also create very similar snippets inside the default source configuration file that could be generated by this project as well.
|
58
|
+
|
59
|
+
## Outcome
|
60
|
+
|
61
|
+
A prototype outside the agent was first created. This prototype generated the required files to add instrumentation. The prototype accepted three arguments: name (name of the library), method (method to instrument), args (arguments for the method). This prototype has evolved into the current directory.
|
62
|
+
|
63
|
+
This project leverages the Ruby gem Thor, a toolkit for building powerful command-line interfaces used in Bundler, Vagrant, Rails and others powers this CLI.
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# TODO
|
2
|
+
|
3
|
+
# - [X] Create instrumentation file
|
4
|
+
|
5
|
+
# - [X] Create chain file
|
6
|
+
|
7
|
+
# - [X] Create prepend file
|
8
|
+
|
9
|
+
# - [X] Create dependency detection file
|
10
|
+
|
11
|
+
# - [X] Add config to default source
|
12
|
+
|
13
|
+
# - [X] Create multiverse suite
|
14
|
+
|
15
|
+
# - [X] Create Envfile
|
16
|
+
|
17
|
+
# - [X] Create test file with examples
|
18
|
+
|
19
|
+
# - [X] Create option for method names to instrument
|
20
|
+
|
21
|
+
# - [X] Add entry to newrelic.yml
|
22
|
+
|
23
|
+
# - [ ] Append a new method to instrument to an existing instrumentation class (with tests?)
|
24
|
+
|
25
|
+
# - [ ] Documentation: examples of what to add in each gap (Good examples of tests, instrumentation, etc. as comments to guide users)
|
26
|
+
|
27
|
+
# - [ ] Handle multi-word gem names (camel case for classes, handle hyphens, concurrent-ruby as example)
|
28
|
+
|
29
|
+
# - [ ] Allow multiple method arguments to be passed to the command line
|
30
|
+
|
31
|
+
# - [ ] Add tests for the instrumentation_generator code
|
32
|
+
|
33
|
+
# - [ ] See if instrumentation PRs can get automatically generated when an already instrumented library adds methods to its codebase
|