newrelic_rpm 6.8.0.360 → 9.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +14 -1
- data/.rubocop.yml +1845 -0
- data/.rubocop_todo.yml +61 -0
- data/.simplecov +16 -0
- data/.snyk +11 -0
- data/.yardopts +1 -0
- data/Brewfile +13 -0
- data/CHANGELOG.md +4029 -2514
- data/CONTRIBUTING.md +132 -19
- data/DOCKER.md +167 -0
- data/Dockerfile +10 -0
- data/Gemfile +5 -2
- data/Guardfile +21 -8
- data/LICENSE +202 -38
- data/README.md +86 -87
- data/Rakefile +32 -32
- data/THIRD_PARTY_NOTICES.md +28 -0
- data/Thorfile +5 -0
- data/bin/newrelic +4 -2
- data/bin/newrelic_cmd +2 -0
- data/bin/nrdebug +86 -63
- data/config.dot +5 -5
- data/docker-compose.yml +107 -0
- data/init.rb +5 -7
- data/install.rb +3 -3
- data/lefthook.yml +9 -0
- data/lib/new_relic/agent/adaptive_sampler.rb +14 -10
- data/lib/new_relic/agent/agent.rb +114 -942
- 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 +28 -24
- data/lib/new_relic/agent/attribute_filter.rb +66 -49
- data/lib/new_relic/agent/attribute_processing.rb +10 -10
- data/lib/new_relic/agent/attributes.rb +9 -8
- data/lib/new_relic/agent/audit_logger.rb +22 -7
- data/lib/new_relic/agent/autostart.rb +22 -21
- data/lib/new_relic/agent/chained_call.rb +2 -2
- data/lib/new_relic/agent/commands/agent_command.rb +5 -5
- data/lib/new_relic/agent/commands/agent_command_router.rb +16 -14
- data/lib/new_relic/agent/commands/thread_profiler_session.rb +17 -15
- data/lib/new_relic/agent/configuration/default_source.rb +1444 -1167
- data/lib/new_relic/agent/configuration/dotted_hash.rb +7 -6
- data/lib/new_relic/agent/configuration/environment_source.rb +14 -12
- data/lib/new_relic/agent/configuration/event_harvest_config.rb +41 -18
- data/lib/new_relic/agent/configuration/high_security_source.rb +12 -13
- data/lib/new_relic/agent/configuration/manager.rb +96 -70
- data/lib/new_relic/agent/configuration/manual_source.rb +2 -2
- data/lib/new_relic/agent/configuration/mask_defaults.rb +4 -4
- data/lib/new_relic/agent/configuration/security_policy_source.rb +93 -96
- data/lib/new_relic/agent/configuration/server_source.rb +44 -42
- data/lib/new_relic/agent/configuration/yaml_source.rb +36 -12
- data/lib/new_relic/agent/configuration.rb +2 -2
- data/lib/new_relic/agent/connect/request_builder.rb +19 -19
- data/lib/new_relic/agent/connect/response_handler.rb +6 -9
- data/lib/new_relic/agent/custom_event_aggregator.rb +16 -16
- data/lib/new_relic/agent/database/explain_plan_helpers.rb +6 -7
- data/lib/new_relic/agent/database/obfuscation_helpers.rb +18 -17
- data/lib/new_relic/agent/database/obfuscator.rb +5 -5
- data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +4 -4
- data/lib/new_relic/agent/database.rb +47 -56
- data/lib/new_relic/agent/database_adapter.rb +35 -0
- data/lib/new_relic/agent/datastores/metric_helper.rb +22 -23
- data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +8 -7
- data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +18 -22
- data/lib/new_relic/agent/datastores/mongo.rb +7 -12
- data/lib/new_relic/agent/datastores/nosql_obfuscator.rb +41 -0
- data/lib/new_relic/agent/datastores/redis.rb +10 -16
- data/lib/new_relic/agent/datastores.rb +14 -16
- data/lib/new_relic/agent/deprecator.rb +2 -2
- data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +13 -12
- data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +90 -70
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +84 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +163 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +38 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context.rb +245 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +127 -0
- data/lib/new_relic/agent/distributed_tracing.rb +113 -32
- data/lib/new_relic/agent/encoding_normalizer.rb +5 -3
- data/lib/new_relic/agent/error_collector.rb +129 -65
- data/lib/new_relic/agent/error_event_aggregator.rb +9 -8
- data/lib/new_relic/agent/error_filter.rb +174 -0
- data/lib/new_relic/agent/error_trace_aggregator.rb +10 -8
- data/lib/new_relic/agent/event_aggregator.rb +23 -22
- data/lib/new_relic/agent/event_buffer.rb +8 -9
- data/lib/new_relic/agent/event_listener.rb +2 -3
- data/lib/new_relic/agent/event_loop.rb +28 -26
- data/lib/new_relic/agent/external.rb +19 -52
- data/lib/new_relic/agent/guid_generator.rb +14 -12
- data/lib/new_relic/agent/harvester.rb +6 -9
- data/lib/new_relic/agent/heap.rb +9 -10
- data/lib/new_relic/agent/hostname.rb +22 -9
- data/lib/new_relic/agent/http_clients/abstract.rb +69 -0
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +30 -26
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +37 -21
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +22 -23
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +18 -17
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +28 -8
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +17 -17
- data/lib/new_relic/agent/http_clients/uri_util.rb +13 -14
- data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +10 -25
- data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +42 -0
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +46 -34
- 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 +28 -21
- data/lib/new_relic/agent/instrumentation/active_job.rb +34 -14
- data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +21 -7
- data/lib/new_relic/agent/instrumentation/active_record.rb +97 -47
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +97 -73
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +53 -66
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +36 -12
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +37 -24
- data/lib/new_relic/agent/instrumentation/active_storage.rb +8 -4
- data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +9 -30
- data/lib/new_relic/agent/instrumentation/active_support.rb +27 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/chain.rb +23 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +20 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +12 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger.rb +24 -0
- data/lib/new_relic/agent/instrumentation/active_support_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +150 -0
- data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/bunny.rb +14 -138
- 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 +75 -63
- data/lib/new_relic/agent/instrumentation/curb/chain.rb +91 -0
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +221 -0
- data/lib/new_relic/agent/instrumentation/curb/prepend.rb +61 -0
- data/lib/new_relic/agent/instrumentation/curb.rb +16 -201
- 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 +48 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +31 -52
- data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +29 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +67 -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 +10 -8
- data/lib/new_relic/agent/instrumentation/excon.rb +29 -31
- data/lib/new_relic/agent/instrumentation/fiber/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +24 -0
- data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +18 -0
- data/lib/new_relic/agent/instrumentation/fiber.rb +25 -0
- data/lib/new_relic/agent/instrumentation/grape/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
- data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
- data/lib/new_relic/agent/instrumentation/grape.rb +17 -123
- data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +97 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +90 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +111 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +30 -0
- data/lib/new_relic/agent/instrumentation/grpc/helper.rb +32 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/chain.rb +69 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +134 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/rpc_desc_prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/rpc_server_prepend.rb +26 -0
- data/lib/new_relic/agent/instrumentation/grpc_client.rb +23 -0
- data/lib/new_relic/agent/instrumentation/grpc_server.rb +25 -0
- data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +37 -0
- data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httpclient.rb +12 -32
- data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
- data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
- data/lib/new_relic/agent/instrumentation/ignore_actions.rb +6 -7
- data/lib/new_relic/agent/instrumentation/logger/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +66 -0
- data/lib/new_relic/agent/instrumentation/logger/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/logger.rb +26 -0
- data/lib/new_relic/agent/instrumentation/memcache/chain.rb +15 -0
- data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +60 -125
- data/lib/new_relic/agent/instrumentation/memcache/helper.rb +59 -0
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +90 -0
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +103 -0
- data/lib/new_relic/agent/instrumentation/memcache.rb +57 -71
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +16 -15
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +11 -11
- data/lib/new_relic/agent/instrumentation/mongo.rb +7 -132
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +53 -17
- data/lib/new_relic/agent/instrumentation/net_http/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +40 -0
- data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
- data/lib/new_relic/agent/instrumentation/net_http.rb +44 -0
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +75 -9
- data/lib/new_relic/agent/instrumentation/padrino/chain.rb +38 -0
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +28 -0
- data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
- data/lib/new_relic/agent/instrumentation/padrino.rb +22 -58
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +7 -7
- data/lib/new_relic/agent/instrumentation/queue_time.rb +9 -10
- data/lib/new_relic/agent/instrumentation/rack/chain.rb +66 -0
- data/lib/new_relic/agent/instrumentation/rack/helpers.rb +33 -0
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +75 -0
- data/lib/new_relic/agent/instrumentation/rack/prepend.rb +43 -0
- data/lib/new_relic/agent/instrumentation/rack.rb +33 -141
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +22 -57
- data/lib/new_relic/agent/instrumentation/rails_middleware.rb +5 -5
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +10 -9
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +18 -6
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +9 -6
- data/lib/new_relic/agent/instrumentation/rails_notifications/custom_events.rb +30 -0
- data/lib/new_relic/agent/instrumentation/rake/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +142 -0
- data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/rake.rb +18 -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 +94 -0
- data/lib/new_relic/agent/instrumentation/redis/middleware.rb +16 -0
- data/lib/new_relic/agent/instrumentation/redis/prepend.rb +29 -0
- data/lib/new_relic/agent/instrumentation/redis.rb +20 -103
- data/lib/new_relic/agent/instrumentation/resque/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/resque/helper.rb +19 -0
- data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +34 -0
- data/lib/new_relic/agent/instrumentation/resque/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/resque.rb +33 -41
- data/lib/new_relic/agent/instrumentation/sequel.rb +17 -20
- data/lib/new_relic/agent/instrumentation/sequel_helper.rb +13 -13
- 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 +30 -46
- data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +31 -37
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +126 -0
- data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +4 -4
- data/lib/new_relic/agent/instrumentation/sinatra.rb +35 -165
- data/lib/new_relic/agent/instrumentation/thread/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +28 -0
- data/lib/new_relic/agent/instrumentation/thread/prepend.rb +22 -0
- data/lib/new_relic/agent/instrumentation/thread.rb +20 -0
- data/lib/new_relic/agent/instrumentation/tilt/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +42 -0
- data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/tilt.rb +25 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +80 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +14 -76
- data/lib/new_relic/agent/instrumentation.rb +2 -2
- data/lib/new_relic/agent/internal_agent_error.rb +3 -3
- data/lib/new_relic/agent/javascript_instrumentor.rb +59 -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 +235 -0
- data/lib/new_relic/agent/log_once.rb +2 -2
- data/lib/new_relic/agent/log_priority.rb +20 -0
- data/lib/new_relic/agent/logging.rb +104 -51
- data/lib/new_relic/agent/memory_logger.rb +3 -3
- data/lib/new_relic/agent/messaging.rb +74 -156
- data/lib/new_relic/agent/method_tracer.rb +157 -150
- data/lib/new_relic/agent/method_tracer_helpers.rb +89 -12
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +117 -0
- data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +28 -0
- data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +3 -4
- data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +8 -13
- data/lib/new_relic/agent/monitors.rb +26 -0
- data/lib/new_relic/agent/new_relic_service/encoders.rb +8 -8
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +7 -7
- data/lib/new_relic/agent/new_relic_service/marshaller.rb +3 -3
- data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +5 -5
- data/lib/new_relic/agent/new_relic_service.rb +266 -193
- data/lib/new_relic/agent/noticeable_error.rb +19 -0
- data/lib/new_relic/agent/null_logger.rb +8 -4
- data/lib/new_relic/agent/obfuscator.rb +9 -11
- data/lib/new_relic/agent/parameter_filtering.rb +30 -16
- data/lib/new_relic/agent/payload_metric_mapping.rb +10 -11
- data/lib/new_relic/agent/pipe_channel_manager.rb +34 -23
- data/lib/new_relic/agent/pipe_service.rb +14 -9
- data/lib/new_relic/agent/prepend_supportability.rb +3 -3
- data/lib/new_relic/agent/priority_sampled_buffer.rb +16 -16
- data/lib/new_relic/agent/rules_engine/replacement_rule.rb +12 -12
- data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +13 -14
- data/lib/new_relic/agent/rules_engine.rb +6 -5
- data/lib/new_relic/agent/sampler.rb +6 -6
- data/lib/new_relic/agent/sampler_collection.rb +5 -6
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +9 -8
- data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +21 -18
- data/lib/new_relic/agent/samplers/memory_sampler.rb +33 -22
- data/lib/new_relic/agent/samplers/object_sampler.rb +3 -3
- data/lib/new_relic/agent/samplers/vm_sampler.rb +22 -20
- data/lib/new_relic/agent/span_event_aggregator.rb +16 -16
- data/lib/new_relic/agent/span_event_primitive.rb +106 -68
- data/lib/new_relic/agent/sql_sampler.rb +23 -23
- data/lib/new_relic/agent/stats.rb +80 -43
- data/lib/new_relic/agent/stats_engine/gc_profiler.rb +11 -13
- data/lib/new_relic/agent/stats_engine/stats_hash.rb +13 -14
- data/lib/new_relic/agent/stats_engine.rb +9 -9
- data/lib/new_relic/agent/synthetics_event_aggregator.rb +9 -10
- data/lib/new_relic/agent/system_info.rb +97 -68
- data/lib/new_relic/agent/threading/agent_thread.rb +19 -15
- data/lib/new_relic/agent/threading/backtrace_node.rb +13 -14
- data/lib/new_relic/agent/threading/backtrace_service.rb +18 -22
- data/lib/new_relic/agent/threading/thread_profile.rb +25 -25
- data/lib/new_relic/agent/timestamp_sampled_buffer.rb +3 -3
- data/lib/new_relic/agent/tracer.rb +127 -107
- data/lib/new_relic/agent/transaction/abstract_segment.rb +145 -49
- data/lib/new_relic/agent/transaction/datastore_segment.rb +23 -19
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +185 -0
- data/lib/new_relic/agent/transaction/distributed_tracing.rb +76 -86
- data/lib/new_relic/agent/transaction/external_request_segment.rb +67 -77
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +34 -46
- data/lib/new_relic/agent/transaction/request_attributes.rb +40 -40
- data/lib/new_relic/agent/transaction/segment.rb +41 -11
- data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +2 -4
- data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +3 -3
- data/lib/new_relic/agent/transaction/trace.rb +19 -17
- data/lib/new_relic/agent/transaction/trace_builder.rb +11 -11
- data/lib/new_relic/agent/transaction/trace_context.rb +102 -93
- data/lib/new_relic/agent/transaction/trace_node.rb +31 -32
- data/lib/new_relic/agent/transaction/tracing.rb +22 -13
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +7 -7
- data/lib/new_relic/agent/transaction.rb +239 -198
- data/lib/new_relic/agent/transaction_error_primitive.rb +32 -28
- data/lib/new_relic/agent/transaction_event_aggregator.rb +17 -17
- data/lib/new_relic/agent/transaction_event_primitive.rb +43 -47
- data/lib/new_relic/agent/transaction_event_recorder.rb +17 -16
- data/lib/new_relic/agent/transaction_metrics.rb +11 -10
- data/lib/new_relic/agent/transaction_sampler.rb +8 -9
- data/lib/new_relic/agent/transaction_time_aggregator.rb +33 -28
- data/lib/new_relic/agent/utilization/aws.rb +35 -5
- data/lib/new_relic/agent/utilization/azure.rb +7 -7
- data/lib/new_relic/agent/utilization/gcp.rb +11 -11
- data/lib/new_relic/agent/utilization/pcf.rb +7 -6
- data/lib/new_relic/agent/utilization/vendor.rb +45 -30
- data/lib/new_relic/agent/utilization_data.rb +8 -6
- data/lib/new_relic/agent/vm/jruby_vm.rb +2 -2
- data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +4 -4
- data/lib/new_relic/agent/vm/mri_vm.rb +54 -26
- data/lib/new_relic/agent/vm/snapshot.rb +6 -6
- data/lib/new_relic/agent/vm.rb +2 -2
- data/lib/new_relic/agent/worker_loop.rb +11 -13
- data/lib/new_relic/agent.rb +159 -109
- data/lib/new_relic/cli/command.rb +22 -24
- data/lib/new_relic/cli/commands/deployments.rb +101 -51
- data/lib/new_relic/cli/commands/install.rb +33 -35
- data/lib/new_relic/coerce.rb +19 -15
- data/lib/new_relic/collection_helper.rb +51 -49
- data/lib/new_relic/constants.rb +38 -0
- data/lib/new_relic/control/class_methods.rb +6 -6
- data/lib/new_relic/control/frameworks/external.rb +3 -3
- data/lib/new_relic/control/frameworks/rails.rb +50 -32
- data/lib/new_relic/control/frameworks/rails3.rb +4 -5
- data/lib/new_relic/control/frameworks/rails4.rb +2 -2
- data/lib/new_relic/control/frameworks/rails_notifications.rb +2 -2
- data/lib/new_relic/control/frameworks/ruby.rb +4 -4
- data/lib/new_relic/control/frameworks/sinatra.rb +8 -2
- data/lib/new_relic/control/frameworks.rb +2 -2
- data/lib/new_relic/control/instance_methods.rb +28 -46
- data/lib/new_relic/control/instrumentation.rb +26 -12
- data/lib/new_relic/control/private_instance_methods.rb +48 -0
- data/lib/new_relic/control/server_methods.rb +4 -5
- data/lib/new_relic/control.rb +2 -3
- data/lib/new_relic/delayed_job_injection.rb +2 -2
- data/lib/new_relic/dependency_detection.rb +138 -31
- data/lib/new_relic/environment_report.rb +42 -36
- data/lib/new_relic/helper.rb +50 -8
- data/lib/new_relic/language_support.rb +31 -7
- data/lib/new_relic/latest_changes.rb +11 -10
- data/lib/new_relic/local_environment.rb +23 -27
- data/lib/new_relic/metric_data.rb +32 -27
- data/lib/new_relic/metric_spec.rb +9 -7
- data/lib/new_relic/noticed_error.rb +58 -47
- data/lib/new_relic/rack/agent_hooks.rb +2 -2
- data/lib/new_relic/rack/agent_middleware.rb +6 -4
- data/lib/new_relic/rack/browser_monitoring.rb +136 -117
- data/lib/new_relic/rack.rb +2 -2
- data/lib/new_relic/recipes/capistrano3.rb +5 -63
- data/lib/new_relic/recipes/capistrano_legacy.rb +25 -28
- data/lib/new_relic/recipes/helpers/send_deployment.rb +70 -0
- data/lib/new_relic/recipes.rb +2 -2
- data/lib/new_relic/supportability_helper.rb +23 -7
- data/lib/new_relic/traced_thread.rb +39 -0
- data/lib/new_relic/version.rb +7 -18
- data/lib/newrelic_rpm.rb +21 -34
- data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +18 -21
- data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +10 -16
- data/lib/tasks/all.rb +4 -4
- data/lib/tasks/config.rake +24 -119
- 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 +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 +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 +23 -9
- data/lib/tasks/newrelic.rb +3 -2
- data/lib/tasks/tests.rake +17 -17
- data/newrelic.yml +672 -3
- data/newrelic_rpm.gemspec +46 -39
- data/recipes/newrelic.rb +3 -3
- data/test/agent_helper.rb +340 -110
- metadata +272 -97
- data/.travis.yml +0 -210
- data/bin/mongrel_rpm +0 -33
- data/cert/cacert.pem +0 -1177
- data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
- data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +0 -44
- data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +0 -53
- data/lib/new_relic/agent/distributed_trace_intrinsics.rb +0 -90
- data/lib/new_relic/agent/distributed_trace_metrics.rb +0 -74
- data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -30
- data/lib/new_relic/agent/distributed_trace_payload.rb +0 -175
- data/lib/new_relic/agent/distributed_trace_transport_type.rb +0 -43
- data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
- data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -74
- data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -25
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -202
- data/lib/new_relic/agent/instrumentation/excon/connection.rb +0 -46
- data/lib/new_relic/agent/instrumentation/http.rb +0 -46
- data/lib/new_relic/agent/instrumentation/merb/controller.rb +0 -44
- data/lib/new_relic/agent/instrumentation/merb/errors.rb +0 -33
- data/lib/new_relic/agent/instrumentation/net.rb +0 -50
- data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +0 -125
- data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +0 -46
- data/lib/new_relic/agent/instrumentation/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/trace_context.rb +0 -244
- data/lib/new_relic/agent/trace_context_payload.rb +0 -134
- data/lib/new_relic/agent/trace_context_request_monitor.rb +0 -42
- data/lib/new_relic/build.rb +0 -2
- data/lib/new_relic/control/frameworks/merb.rb +0 -29
- data/lib/new_relic/metrics.rb +0 -13
- data/lib/tasks/config.html.erb +0 -32
- data/true +0 -0
- /data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
@@ -0,0 +1,202 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
module NewRelic
|
6
|
+
module Agent
|
7
|
+
module AgentHelpers
|
8
|
+
module Startup
|
9
|
+
# True if we have initialized and completed 'start'
|
10
|
+
def started?
|
11
|
+
@started
|
12
|
+
end
|
13
|
+
|
14
|
+
# Check whether we have already started, which is an error condition
|
15
|
+
def already_started?
|
16
|
+
if started?
|
17
|
+
::NewRelic::Agent.logger.error('Agent Started Already!')
|
18
|
+
true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Logs a bunch of data and starts the agent, if needed
|
23
|
+
def start
|
24
|
+
return unless agent_should_start?
|
25
|
+
|
26
|
+
log_startup
|
27
|
+
check_config_and_start_agent
|
28
|
+
log_version_and_pid
|
29
|
+
|
30
|
+
events.subscribe(:initial_configuration_complete) do
|
31
|
+
log_ignore_url_regexes
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
# Sanity-check the agent configuration and start the agent,
|
36
|
+
# setting up the worker thread and the exit handler to shut
|
37
|
+
# down the agent
|
38
|
+
def check_config_and_start_agent
|
39
|
+
return unless monitoring? && has_correct_license_key?
|
40
|
+
return if using_forking_dispatcher?
|
41
|
+
|
42
|
+
setup_and_start_agent
|
43
|
+
end
|
44
|
+
|
45
|
+
# This is the shared method between the main agent startup and the
|
46
|
+
# after_fork call restarting the thread in deferred dispatchers.
|
47
|
+
#
|
48
|
+
# Treatment of @started and env report is important to get right.
|
49
|
+
def setup_and_start_agent(options = {})
|
50
|
+
@started = true
|
51
|
+
@harvester.mark_started
|
52
|
+
|
53
|
+
unless in_resque_child_process?
|
54
|
+
install_exit_handler
|
55
|
+
environment_for_connect
|
56
|
+
@harvest_samplers.load_samplers unless Agent.config[:disable_samplers]
|
57
|
+
end
|
58
|
+
|
59
|
+
connect_in_foreground if Agent.config[:sync_startup]
|
60
|
+
start_worker_thread(options)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Log startup information that we almost always want to know
|
64
|
+
def log_startup
|
65
|
+
log_environment
|
66
|
+
log_dispatcher
|
67
|
+
log_app_name
|
68
|
+
end
|
69
|
+
|
70
|
+
# Log the environment the app thinks it's running in.
|
71
|
+
# Useful in debugging, as this is the key for config YAML lookups.
|
72
|
+
def log_environment
|
73
|
+
::NewRelic::Agent.logger.info("Environment: #{NewRelic::Control.instance.env}")
|
74
|
+
end
|
75
|
+
|
76
|
+
# Logs the dispatcher to the log file to assist with
|
77
|
+
# debugging. When no debugger is present, logs this fact to
|
78
|
+
# assist with proper dispatcher detection
|
79
|
+
def log_dispatcher
|
80
|
+
dispatcher_name = Agent.config[:dispatcher].to_s
|
81
|
+
|
82
|
+
if dispatcher_name.empty?
|
83
|
+
::NewRelic::Agent.logger.info('No known dispatcher detected.')
|
84
|
+
else
|
85
|
+
::NewRelic::Agent.logger.info("Dispatcher: #{dispatcher_name}")
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def log_app_name
|
90
|
+
::NewRelic::Agent.logger.info("Application: #{Agent.config[:app_name].join(', ')}")
|
91
|
+
end
|
92
|
+
|
93
|
+
def log_ignore_url_regexes
|
94
|
+
regexes = NewRelic::Agent.config[:'rules.ignore_url_regexes']
|
95
|
+
|
96
|
+
unless regexes.empty?
|
97
|
+
::NewRelic::Agent.logger.info('Ignoring URLs that match the following regexes: ' \
|
98
|
+
"#{regexes.map(&:inspect).join(', ')}.")
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# Classy logging of the agent version and the current pid,
|
103
|
+
# so we can disambiguate processes in the log file and make
|
104
|
+
# sure they're running a reasonable version
|
105
|
+
def log_version_and_pid
|
106
|
+
::NewRelic::Agent.logger.debug("New Relic Ruby Agent #{NewRelic::VERSION::STRING} Initialized: pid = #{$$}")
|
107
|
+
end
|
108
|
+
|
109
|
+
# Logs the configured application names
|
110
|
+
def app_name_configured?
|
111
|
+
names = Agent.config[:app_name]
|
112
|
+
return names.respond_to?(:any?) && names.any?
|
113
|
+
end
|
114
|
+
|
115
|
+
# Connecting in the foreground blocks further startup of the
|
116
|
+
# agent until we have a connection - useful in cases where
|
117
|
+
# you're trying to log a very-short-running process and want
|
118
|
+
# to get statistics from before a server connection
|
119
|
+
# (typically 20 seconds) exists
|
120
|
+
def connect_in_foreground
|
121
|
+
NewRelic::Agent.disable_all_tracing { connect(:keep_retrying => false) }
|
122
|
+
end
|
123
|
+
|
124
|
+
# Warn the user if they have configured their agent not to
|
125
|
+
# send data, that way we can see this clearly in the log file
|
126
|
+
def monitoring?
|
127
|
+
if Agent.config[:monitor_mode]
|
128
|
+
true
|
129
|
+
else
|
130
|
+
::NewRelic::Agent.logger.warn('Agent configured not to send data in this environment.')
|
131
|
+
false
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
# Tell the user when the license key is missing so they can
|
136
|
+
# fix it by adding it to the file
|
137
|
+
def has_license_key?
|
138
|
+
if Agent.config[:license_key] && Agent.config[:license_key].length > 0
|
139
|
+
true
|
140
|
+
else
|
141
|
+
::NewRelic::Agent.logger.warn('No license key found. ' +
|
142
|
+
'This often means your newrelic.yml file was not found, or it lacks a section for the running ' \
|
143
|
+
"environment, '#{NewRelic::Control.instance.env}'. You may also want to try linting your newrelic.yml " \
|
144
|
+
'to ensure it is valid YML.')
|
145
|
+
false
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
# A correct license key exists and is of the proper length
|
150
|
+
def has_correct_license_key?
|
151
|
+
has_license_key? && correct_license_length
|
152
|
+
end
|
153
|
+
|
154
|
+
# A license key is an arbitrary 40 character string,
|
155
|
+
# usually looks something like a SHA1 hash
|
156
|
+
def correct_license_length
|
157
|
+
key = Agent.config[:license_key]
|
158
|
+
|
159
|
+
if key.length == 40
|
160
|
+
true
|
161
|
+
else
|
162
|
+
::NewRelic::Agent.logger.error("Invalid license key: #{key}")
|
163
|
+
false
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
# Check to see if the agent should start, returning +true+ if it should.
|
168
|
+
def agent_should_start?
|
169
|
+
return false if already_started? || disabled?
|
170
|
+
|
171
|
+
if defer_for_delayed_job?
|
172
|
+
::NewRelic::Agent.logger.debug('Deferring startup for DelayedJob')
|
173
|
+
return false
|
174
|
+
end
|
175
|
+
|
176
|
+
if defer_for_resque?
|
177
|
+
::NewRelic::Agent.logger.debug('Deferring startup for Resque in case it daemonizes')
|
178
|
+
return false
|
179
|
+
end
|
180
|
+
|
181
|
+
unless app_name_configured?
|
182
|
+
NewRelic::Agent.logger.error('No application name configured.',
|
183
|
+
'The Agent cannot start without at least one. Please check your ',
|
184
|
+
'newrelic.yml and ensure that it is valid and has at least one ',
|
185
|
+
"value set for app_name in the #{NewRelic::Control.instance.env} ",
|
186
|
+
'environment.')
|
187
|
+
return false
|
188
|
+
end
|
189
|
+
|
190
|
+
return true
|
191
|
+
end
|
192
|
+
|
193
|
+
# The agent is disabled when it is not force enabled by the
|
194
|
+
# 'agent_enabled' option (e.g. in a manual start), or
|
195
|
+
# enabled normally through the configuration file
|
196
|
+
def disabled?
|
197
|
+
!Agent.config[:agent_enabled]
|
198
|
+
end
|
199
|
+
end
|
200
|
+
end
|
201
|
+
end
|
202
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
module NewRelic
|
6
|
+
module Agent
|
7
|
+
module AgentHelpers
|
8
|
+
module Transmit
|
9
|
+
TRANSACTION_EVENT = 'TransactionEvent'.freeze
|
10
|
+
def transmit_analytic_event_data
|
11
|
+
transmit_single_data_type(:harvest_and_send_analytic_event_data, TRANSACTION_EVENT)
|
12
|
+
end
|
13
|
+
|
14
|
+
CUSTOM_EVENT = 'CustomEvent'.freeze
|
15
|
+
def transmit_custom_event_data
|
16
|
+
transmit_single_data_type(:harvest_and_send_custom_event_data, CUSTOM_EVENT)
|
17
|
+
end
|
18
|
+
|
19
|
+
ERROR_EVENT = 'ErrorEvent'.freeze
|
20
|
+
def transmit_error_event_data
|
21
|
+
transmit_single_data_type(:harvest_and_send_error_event_data, ERROR_EVENT)
|
22
|
+
end
|
23
|
+
|
24
|
+
SPAN_EVENT = 'SpanEvent'.freeze
|
25
|
+
def transmit_span_event_data
|
26
|
+
transmit_single_data_type(:harvest_and_send_span_event_data, SPAN_EVENT)
|
27
|
+
end
|
28
|
+
|
29
|
+
LOG_EVENT = 'LogEvent'.freeze
|
30
|
+
def transmit_log_event_data
|
31
|
+
transmit_single_data_type(:harvest_and_send_log_event_data, LOG_EVENT)
|
32
|
+
end
|
33
|
+
|
34
|
+
def transmit_single_data_type(harvest_method, supportability_name)
|
35
|
+
now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
36
|
+
|
37
|
+
msg = "Sending #{supportability_name} data to New Relic Service"
|
38
|
+
::NewRelic::Agent.logger.debug(msg)
|
39
|
+
|
40
|
+
@service.session do # use http keep-alive
|
41
|
+
self.send(harvest_method)
|
42
|
+
end
|
43
|
+
ensure
|
44
|
+
duration = Process.clock_gettime(Process::CLOCK_MONOTONIC) - now
|
45
|
+
NewRelic::Agent.record_metric("Supportability/#{supportability_name}Harvest", duration)
|
46
|
+
end
|
47
|
+
|
48
|
+
def transmit_data
|
49
|
+
now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
50
|
+
::NewRelic::Agent.logger.debug('Sending data to New Relic Service')
|
51
|
+
|
52
|
+
@events.notify(:before_harvest)
|
53
|
+
@service.session do # use http keep-alive
|
54
|
+
harvest_and_send_data_types
|
55
|
+
|
56
|
+
check_for_and_handle_agent_commands
|
57
|
+
harvest_and_send_for_agent_commands
|
58
|
+
end
|
59
|
+
ensure
|
60
|
+
NewRelic::Agent::Database.close_connections
|
61
|
+
duration = Process.clock_gettime(Process::CLOCK_MONOTONIC) - now
|
62
|
+
NewRelic::Agent.record_metric('Supportability/Harvest', duration)
|
63
|
+
end
|
64
|
+
|
65
|
+
def transmit_data_types
|
66
|
+
transmit_data
|
67
|
+
transmit_analytic_event_data
|
68
|
+
transmit_custom_event_data
|
69
|
+
transmit_error_event_data
|
70
|
+
transmit_span_event_data
|
71
|
+
transmit_log_event_data
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -1,23 +1,25 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
require 'thread'
|
6
6
|
require 'logger'
|
7
7
|
require 'new_relic/agent/hostname'
|
8
8
|
require 'new_relic/agent/log_once'
|
9
|
+
require 'new_relic/agent/instrumentation/logger/instrumentation'
|
9
10
|
|
10
11
|
module NewRelic
|
11
12
|
module Agent
|
12
13
|
class AgentLogger
|
13
14
|
include LogOnce
|
14
15
|
|
15
|
-
def initialize(root =
|
16
|
+
def initialize(root = '', override_logger = nil)
|
16
17
|
@already_logged_lock = Mutex.new
|
17
18
|
clear_already_logged
|
18
19
|
create_log(root, override_logger)
|
19
20
|
set_log_level!
|
20
21
|
set_log_format!
|
22
|
+
disable_log_instrumentation!
|
21
23
|
|
22
24
|
gather_startup_logs
|
23
25
|
end
|
@@ -50,14 +52,14 @@ module NewRelic
|
|
50
52
|
# the log level that the backtrace is logged at. If you just want the
|
51
53
|
# default behavior of backtraces logged at debug, use one of the methods
|
52
54
|
# above and pass an Exception as one of the args.
|
53
|
-
def log_exception(level, e, backtrace_level=level)
|
54
|
-
@log.send(level,
|
55
|
+
def log_exception(level, e, backtrace_level = level)
|
56
|
+
@log.send(level, '%p: %s' % [e.class, e.message])
|
55
57
|
@log.send(backtrace_level) do
|
56
58
|
backtrace = backtrace_from_exception(e)
|
57
59
|
if backtrace
|
58
60
|
"Debugging backtrace:\n" + backtrace.join("\n ")
|
59
61
|
else
|
60
|
-
|
62
|
+
'No backtrace available.'
|
61
63
|
end
|
62
64
|
end
|
63
65
|
end
|
@@ -72,7 +74,7 @@ module NewRelic
|
|
72
74
|
# We've seen that often the backtrace on a SystemStackError is bunk
|
73
75
|
# so massage the caller instead at a known depth.
|
74
76
|
#
|
75
|
-
# Tests keep us honest about
|
77
|
+
# Tests keep us honest about minimum method depth our log calls add.
|
76
78
|
return caller.drop(5) if e.is_a?(SystemStackError)
|
77
79
|
|
78
80
|
e.backtrace
|
@@ -81,11 +83,9 @@ module NewRelic
|
|
81
83
|
# Allows for passing exceptions in explicitly, which format with backtrace
|
82
84
|
def format_and_send(level, *msgs, &block)
|
83
85
|
if block
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
msgs = []
|
88
|
-
end
|
86
|
+
return unless @log.send("#{level}?")
|
87
|
+
|
88
|
+
msgs = Array(yield)
|
89
89
|
end
|
90
90
|
|
91
91
|
msgs.flatten.each do |item|
|
@@ -132,12 +132,12 @@ module NewRelic
|
|
132
132
|
end
|
133
133
|
|
134
134
|
def wants_stdout?
|
135
|
-
::NewRelic::Agent.config[:log_file_path].
|
135
|
+
::NewRelic::Agent.config[:log_file_path].casecmp(NewRelic::STANDARD_OUT) == 0
|
136
136
|
end
|
137
137
|
|
138
138
|
def find_or_create_file_path(path_setting, root)
|
139
|
-
for abs_path in [
|
140
|
-
|
139
|
+
for abs_path in [File.expand_path(path_setting),
|
140
|
+
File.expand_path(File.join(root, path_setting))] do
|
141
141
|
if File.directory?(abs_path) || (Dir.mkdir(abs_path) rescue nil)
|
142
142
|
return abs_path[%r{^(.*?)/?$}]
|
143
143
|
end
|
@@ -150,11 +150,11 @@ module NewRelic
|
|
150
150
|
end
|
151
151
|
|
152
152
|
LOG_LEVELS = {
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
153
|
+
'debug' => ::Logger::DEBUG,
|
154
|
+
'info' => ::Logger::INFO,
|
155
|
+
'warn' => ::Logger::WARN,
|
156
|
+
'error' => ::Logger::ERROR,
|
157
|
+
'fatal' => ::Logger::FATAL
|
158
158
|
}
|
159
159
|
|
160
160
|
def self.log_level_for(level)
|
@@ -164,19 +164,23 @@ module NewRelic
|
|
164
164
|
def set_log_format!
|
165
165
|
@hostname = NewRelic::Agent::Hostname.get
|
166
166
|
@prefix = wants_stdout? ? '** [NewRelic]' : ''
|
167
|
-
@log.formatter =
|
168
|
-
"#{@prefix}[#{timestamp.strftime(
|
167
|
+
@log.formatter = proc do |severity, timestamp, progname, msg|
|
168
|
+
"#{@prefix}[#{timestamp.strftime('%F %H:%M:%S %z')} #{@hostname} (#{$$})] #{severity} : #{msg}\n"
|
169
169
|
end
|
170
170
|
end
|
171
171
|
|
172
|
+
# Don't allow agent logs into agent log forwarding for now
|
173
|
+
def disable_log_instrumentation!
|
174
|
+
NewRelic::Agent::Instrumentation::Logger.mark_skip_instrumenting(@log)
|
175
|
+
end
|
176
|
+
|
172
177
|
def gather_startup_logs
|
173
178
|
StartupLogger.instance.dump(self)
|
174
179
|
end
|
175
180
|
|
176
|
-
def self.format_fatal_error
|
181
|
+
def self.format_fatal_error(message)
|
177
182
|
"** [NewRelic] FATAL : #{message}\n"
|
178
183
|
end
|
179
|
-
|
180
184
|
end
|
181
185
|
|
182
186
|
# In an effort to not lose messages during startup, we trap them in memory
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
# This class applies filtering rules as specified in the Agent Attributes
|
6
6
|
# cross-agent spec.
|
@@ -64,64 +64,81 @@ module NewRelic
|
|
64
64
|
class AttributeFilter
|
65
65
|
DST_NONE = 0x0
|
66
66
|
|
67
|
-
DST_TRANSACTION_EVENTS
|
68
|
-
DST_TRANSACTION_TRACER
|
69
|
-
DST_ERROR_COLLECTOR
|
70
|
-
DST_BROWSER_MONITORING
|
71
|
-
DST_SPAN_EVENTS
|
67
|
+
DST_TRANSACTION_EVENTS = 1 << 0
|
68
|
+
DST_TRANSACTION_TRACER = 1 << 1
|
69
|
+
DST_ERROR_COLLECTOR = 1 << 2
|
70
|
+
DST_BROWSER_MONITORING = 1 << 3
|
71
|
+
DST_SPAN_EVENTS = 1 << 4
|
72
72
|
DST_TRANSACTION_SEGMENTS = 1 << 5
|
73
73
|
|
74
|
-
DST_ALL
|
74
|
+
DST_ALL = 0x3f
|
75
75
|
|
76
76
|
attr_reader :rules
|
77
77
|
|
78
78
|
def initialize(config)
|
79
|
-
|
79
|
+
prep_enabled_destinations(config)
|
80
|
+
prep_rules(config)
|
80
81
|
|
81
|
-
|
82
|
-
|
83
|
-
@
|
84
|
-
|
85
|
-
|
86
|
-
|
82
|
+
# We're ok to cache high security for fast lookup because the attribute
|
83
|
+
# filter is re-generated on any significant config change.
|
84
|
+
@high_security = config[:high_security]
|
85
|
+
|
86
|
+
setup_key_cache
|
87
|
+
cache_prefix_denylist
|
88
|
+
end
|
87
89
|
|
88
|
-
|
90
|
+
def prep_enabled_destinations(config)
|
91
|
+
@enabled_destinations = config[:'attributes.enabled'] ? enabled_destinations_for_attributes(config) : DST_NONE
|
92
|
+
end
|
93
|
+
|
94
|
+
def enabled_destinations_for_attributes(config)
|
95
|
+
destinations = DST_NONE
|
96
|
+
destinations |= DST_TRANSACTION_TRACER if config[:'transaction_tracer.attributes.enabled']
|
97
|
+
destinations |= DST_TRANSACTION_EVENTS if config[:'transaction_events.attributes.enabled']
|
98
|
+
destinations |= DST_ERROR_COLLECTOR if config[:'error_collector.attributes.enabled']
|
99
|
+
destinations |= DST_BROWSER_MONITORING if config[:'browser_monitoring.attributes.enabled']
|
100
|
+
destinations |= DST_SPAN_EVENTS if config[:'span_events.attributes.enabled']
|
101
|
+
destinations |= DST_TRANSACTION_SEGMENTS if config[:'transaction_segments.attributes.enabled']
|
102
|
+
destinations
|
103
|
+
end
|
89
104
|
|
105
|
+
def prep_rules(config)
|
90
106
|
@rules = []
|
107
|
+
prep_attributes_exclude_rules(config)
|
108
|
+
prep_capture_params_rules(config)
|
109
|
+
prep_datastore_rules(config)
|
110
|
+
prep_attributes_include_rules(config)
|
111
|
+
build_uri_rule(config[:'attributes.exclude'])
|
112
|
+
@rules.sort!
|
113
|
+
end
|
91
114
|
|
115
|
+
def prep_attributes_exclude_rules(config)
|
92
116
|
build_rule(config[:'attributes.exclude'], DST_ALL, false)
|
93
|
-
build_rule(config[:'transaction_tracer.attributes.exclude'],
|
94
|
-
build_rule(config[:'transaction_events.attributes.exclude'],
|
95
|
-
build_rule(config[:'error_collector.attributes.exclude'],
|
96
|
-
build_rule(config[:'browser_monitoring.attributes.exclude'],
|
97
|
-
build_rule(config[:'span_events.attributes.exclude'],
|
117
|
+
build_rule(config[:'transaction_tracer.attributes.exclude'], DST_TRANSACTION_TRACER, false)
|
118
|
+
build_rule(config[:'transaction_events.attributes.exclude'], DST_TRANSACTION_EVENTS, false)
|
119
|
+
build_rule(config[:'error_collector.attributes.exclude'], DST_ERROR_COLLECTOR, false)
|
120
|
+
build_rule(config[:'browser_monitoring.attributes.exclude'], DST_BROWSER_MONITORING, false)
|
121
|
+
build_rule(config[:'span_events.attributes.exclude'], DST_SPAN_EVENTS, false)
|
98
122
|
build_rule(config[:'transaction_segments.attributes.exclude'], DST_TRANSACTION_SEGMENTS, false)
|
123
|
+
end
|
99
124
|
|
125
|
+
def prep_capture_params_rules(config)
|
100
126
|
build_rule(['request.parameters.*'], include_destinations_for_capture_params(config[:capture_params]), true)
|
101
|
-
|
102
|
-
build_rule(['job.sidekiq.args.*'], include_destinations_for_capture_params(config[:'sidekiq.capture_params']), true)
|
127
|
+
end
|
103
128
|
|
104
|
-
|
105
|
-
build_rule([
|
129
|
+
def prep_datastore_rules(config)
|
130
|
+
build_rule(%w[host port_path_or_id], DST_TRANSACTION_SEGMENTS, config[:'datastore_tracer.instance_reporting.enabled'])
|
131
|
+
build_rule(['database_name'], DST_TRANSACTION_SEGMENTS, config[:'datastore_tracer.database_name_reporting.enabled'])
|
132
|
+
end
|
106
133
|
|
134
|
+
def prep_attributes_include_rules(config)
|
107
135
|
build_rule(config[:'attributes.include'], DST_ALL, true)
|
108
|
-
build_rule(config[:'transaction_tracer.attributes.include'],
|
109
|
-
build_rule(config[:'transaction_events.attributes.include'],
|
110
|
-
build_rule(config[:'error_collector.attributes.include'],
|
111
|
-
build_rule(config[:'browser_monitoring.attributes.include'],
|
112
|
-
build_rule(config[:'span_events.attributes.include'],
|
136
|
+
build_rule(config[:'transaction_tracer.attributes.include'], DST_TRANSACTION_TRACER, true)
|
137
|
+
build_rule(config[:'transaction_events.attributes.include'], DST_TRANSACTION_EVENTS, true)
|
138
|
+
build_rule(config[:'error_collector.attributes.include'], DST_ERROR_COLLECTOR, true)
|
139
|
+
build_rule(config[:'browser_monitoring.attributes.include'], DST_BROWSER_MONITORING, true)
|
140
|
+
build_rule(config[:'span_events.attributes.include'], DST_SPAN_EVENTS, true)
|
113
141
|
build_rule(config[:'transaction_segments.attributes.include'], DST_TRANSACTION_SEGMENTS, true)
|
114
|
-
|
115
|
-
build_uri_rule(config[:'attributes.exclude'])
|
116
|
-
|
117
|
-
@rules.sort!
|
118
|
-
|
119
|
-
# We're ok to cache high security for fast lookup because the attribute
|
120
|
-
# filter is re-generated on any significant config change.
|
121
|
-
@high_security = config[:high_security]
|
122
|
-
|
123
|
-
setup_key_cache
|
124
|
-
cache_prefix_denylist
|
125
142
|
end
|
126
143
|
|
127
144
|
# Note the key_cache is a global cache, accessible by multiple threads,
|
@@ -165,7 +182,7 @@ module NewRelic
|
|
165
182
|
end
|
166
183
|
|
167
184
|
def build_uri_rule(excluded_attributes)
|
168
|
-
uri_aliases = %w
|
185
|
+
uri_aliases = %w[uri url request_uri request.uri http.url]
|
169
186
|
|
170
187
|
if (excluded_attributes & uri_aliases).size > 0
|
171
188
|
build_rule(uri_aliases - excluded_attributes, DST_ALL, false)
|
@@ -175,7 +192,7 @@ module NewRelic
|
|
175
192
|
def apply(attribute_name, default_destinations)
|
176
193
|
return DST_NONE if @enabled_destinations == DST_NONE
|
177
194
|
|
178
|
-
destinations
|
195
|
+
destinations = default_destinations
|
179
196
|
attribute_name = attribute_name.to_s
|
180
197
|
|
181
198
|
@rules.each do |rule|
|
@@ -225,8 +242,8 @@ module NewRelic
|
|
225
242
|
def cache_prefix_denylist
|
226
243
|
@prefix_denylist = {}
|
227
244
|
@prefix_denylist[:'request.parameters'] = true unless might_allow_prefix_uncached?(:'request.parameters')
|
228
|
-
@prefix_denylist[:'job.sidekiq.args']
|
229
|
-
@prefix_denylist[:'job.resque.args']
|
245
|
+
@prefix_denylist[:'job.sidekiq.args'] = true unless might_allow_prefix_uncached?(:'job.sidekiq.args')
|
246
|
+
@prefix_denylist[:'job.resque.args'] = true unless might_allow_prefix_uncached?(:'job.resque.args')
|
230
247
|
end
|
231
248
|
|
232
249
|
# Note that the given prefix *must* be a Symbol
|
@@ -256,10 +273,10 @@ module NewRelic
|
|
256
273
|
attr_reader :attribute_name, :destinations, :is_include, :wildcard
|
257
274
|
|
258
275
|
def initialize(attribute_name, destinations, is_include)
|
259
|
-
@attribute_name = attribute_name.sub(/\*$/,
|
260
|
-
@wildcard
|
261
|
-
@is_include
|
262
|
-
@destinations
|
276
|
+
@attribute_name = attribute_name.sub(/\*$/, '')
|
277
|
+
@wildcard = attribute_name.end_with?('*')
|
278
|
+
@is_include = is_include
|
279
|
+
@destinations = is_include ? destinations : ~destinations
|
263
280
|
end
|
264
281
|
|
265
282
|
# Rules are sorted from least specific to most specific
|
@@ -1,29 +1,29 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
module NewRelic
|
6
6
|
module Agent
|
7
7
|
module AttributeProcessing
|
8
8
|
module_function
|
9
9
|
|
10
|
-
EMPTY_HASH_STRING_LITERAL =
|
11
|
-
EMPTY_ARRAY_STRING_LITERAL =
|
10
|
+
EMPTY_HASH_STRING_LITERAL = '{}'.freeze
|
11
|
+
EMPTY_ARRAY_STRING_LITERAL = '[]'.freeze
|
12
12
|
|
13
13
|
def flatten_and_coerce(object, prefix = nil, result = {}, &blk)
|
14
|
-
if object.is_a?
|
14
|
+
if object.is_a?(Hash)
|
15
15
|
flatten_and_coerce_hash(object, prefix, result, &blk)
|
16
|
-
elsif object.is_a?
|
16
|
+
elsif object.is_a?(Array)
|
17
17
|
flatten_and_coerce_array(object, prefix, result, &blk)
|
18
18
|
elsif prefix
|
19
19
|
val = Coerce.scalar(object)
|
20
20
|
if blk
|
21
|
-
|
21
|
+
yield(prefix, val)
|
22
22
|
elsif !val.nil?
|
23
23
|
result[prefix] = val
|
24
24
|
end
|
25
25
|
else
|
26
|
-
NewRelic::Agent.logger.warn
|
26
|
+
NewRelic::Agent.logger.warn("Unexpected object: #{object.inspect} with nil prefix passed to NewRelic::Agent::AttributeProcessing.flatten_and_coerce")
|
27
27
|
end
|
28
28
|
result
|
29
29
|
end
|
@@ -31,7 +31,7 @@ module NewRelic
|
|
31
31
|
def flatten_and_coerce_hash(hash, prefix, result, &blk)
|
32
32
|
if hash.empty?
|
33
33
|
if blk
|
34
|
-
|
34
|
+
yield(prefix, EMPTY_HASH_STRING_LITERAL)
|
35
35
|
else
|
36
36
|
result[prefix] = EMPTY_HASH_STRING_LITERAL
|
37
37
|
end
|
@@ -46,7 +46,7 @@ module NewRelic
|
|
46
46
|
def flatten_and_coerce_array(array, prefix, result, &blk)
|
47
47
|
if array.empty?
|
48
48
|
if blk
|
49
|
-
|
49
|
+
yield(prefix, EMPTY_ARRAY_STRING_LITERAL)
|
50
50
|
else
|
51
51
|
result[prefix] = EMPTY_ARRAY_STRING_LITERAL
|
52
52
|
end
|