newrelic_rpm 5.7.0.350 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +15 -1
- data/.rubocop.yml +1919 -0
- data/.rubocop_todo.yml +100 -0
- data/.simplecov +15 -0
- data/.snyk +11 -0
- data/.yardopts +2 -0
- data/Brewfile +12 -0
- data/CHANGELOG.md +4056 -2339
- data/CONTRIBUTING.md +132 -19
- data/DOCKER.md +167 -0
- data/Dockerfile +10 -0
- data/Gemfile +5 -2
- data/Guardfile +22 -4
- data/LICENSE +202 -38
- data/README.md +87 -87
- data/Rakefile +27 -27
- data/THIRD_PARTY_NOTICES.md +28 -0
- data/Thorfile +5 -0
- data/bin/newrelic +3 -2
- data/bin/newrelic_cmd +1 -0
- data/bin/nrdebug +77 -54
- data/config.dot +5 -5
- data/docker-compose.yml +107 -0
- data/init.rb +5 -7
- data/install.rb +3 -3
- data/lefthook.yml +9 -0
- data/lib/new_relic/agent/adaptive_sampler.rb +14 -10
- data/lib/new_relic/agent/agent.rb +125 -969
- data/lib/new_relic/agent/agent_helpers/connect.rb +227 -0
- data/lib/new_relic/agent/agent_helpers/harvest.rb +153 -0
- data/lib/new_relic/agent/agent_helpers/shutdown.rb +72 -0
- data/lib/new_relic/agent/agent_helpers/special_startup.rb +74 -0
- data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +167 -0
- data/lib/new_relic/agent/agent_helpers/startup.rb +202 -0
- data/lib/new_relic/agent/agent_helpers/transmit.rb +76 -0
- data/lib/new_relic/agent/agent_logger.rb +26 -18
- data/lib/new_relic/agent/attribute_filter.rb +69 -52
- data/lib/new_relic/agent/attribute_processing.rb +8 -8
- data/lib/new_relic/agent/attributes.rb +153 -0
- data/lib/new_relic/agent/audit_logger.rb +19 -4
- data/lib/new_relic/agent/autostart.rb +34 -28
- data/lib/new_relic/agent/chained_call.rb +2 -2
- data/lib/new_relic/agent/commands/agent_command.rb +4 -4
- data/lib/new_relic/agent/commands/agent_command_router.rb +15 -33
- data/lib/new_relic/agent/commands/thread_profiler_session.rb +13 -11
- data/lib/new_relic/agent/configuration/default_source.rb +1480 -1053
- data/lib/new_relic/agent/configuration/dotted_hash.rb +7 -6
- data/lib/new_relic/agent/configuration/environment_source.rb +15 -11
- data/lib/new_relic/agent/configuration/event_harvest_config.rb +68 -0
- data/lib/new_relic/agent/configuration/high_security_source.rb +9 -9
- data/lib/new_relic/agent/configuration/manager.rb +96 -79
- data/lib/new_relic/agent/configuration/manual_source.rb +2 -2
- data/lib/new_relic/agent/configuration/mask_defaults.rb +4 -4
- data/lib/new_relic/agent/configuration/security_policy_source.rb +83 -86
- data/lib/new_relic/agent/configuration/server_source.rb +49 -12
- data/lib/new_relic/agent/configuration/yaml_source.rb +42 -13
- data/lib/new_relic/agent/configuration.rb +2 -2
- data/lib/new_relic/agent/connect/request_builder.rb +61 -0
- data/lib/new_relic/agent/connect/response_handler.rb +58 -0
- data/lib/new_relic/agent/custom_event_aggregator.rb +15 -15
- data/lib/new_relic/agent/database/explain_plan_helpers.rb +5 -6
- data/lib/new_relic/agent/database/obfuscation_helpers.rb +16 -15
- data/lib/new_relic/agent/database/obfuscator.rb +3 -3
- data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +4 -4
- data/lib/new_relic/agent/database.rb +44 -53
- data/lib/new_relic/agent/database_adapter.rb +35 -0
- data/lib/new_relic/agent/datastores/metric_helper.rb +18 -20
- data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +9 -8
- data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +7 -11
- data/lib/new_relic/agent/datastores/mongo.rb +7 -12
- data/lib/new_relic/agent/datastores/nosql_obfuscator.rb +41 -0
- data/lib/new_relic/agent/datastores/redis.rb +6 -12
- data/lib/new_relic/agent/datastores.rb +19 -23
- data/lib/new_relic/agent/deprecator.rb +2 -2
- data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +13 -12
- data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +87 -66
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +84 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +163 -0
- data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +38 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context.rb +245 -0
- data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +127 -0
- data/lib/new_relic/agent/distributed_tracing.rb +113 -32
- data/lib/new_relic/agent/encoding_normalizer.rb +5 -3
- data/lib/new_relic/agent/error_collector.rb +99 -63
- data/lib/new_relic/agent/error_event_aggregator.rb +10 -8
- data/lib/new_relic/agent/error_filter.rb +174 -0
- data/lib/new_relic/agent/error_trace_aggregator.rb +6 -4
- data/lib/new_relic/agent/event_aggregator.rb +43 -48
- data/lib/new_relic/agent/event_buffer.rb +8 -9
- data/lib/new_relic/agent/event_listener.rb +2 -3
- data/lib/new_relic/agent/event_loop.rb +27 -25
- data/lib/new_relic/agent/external.rb +20 -51
- data/lib/new_relic/agent/guid_generator.rb +30 -0
- data/lib/new_relic/agent/harvester.rb +5 -6
- data/lib/new_relic/agent/heap.rb +8 -10
- data/lib/new_relic/agent/hostname.rb +26 -5
- data/lib/new_relic/agent/http_clients/abstract.rb +81 -0
- data/lib/new_relic/agent/http_clients/curb_wrappers.rb +26 -26
- data/lib/new_relic/agent/http_clients/excon_wrappers.rb +31 -17
- data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +18 -23
- data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +12 -15
- data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +24 -8
- data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +9 -12
- data/lib/new_relic/agent/http_clients/uri_util.rb +12 -13
- data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +22 -52
- data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +39 -0
- data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +59 -72
- data/lib/new_relic/agent/instrumentation/action_dispatch.rb +31 -0
- data/lib/new_relic/agent/instrumentation/action_dispatch_subscriber.rb +64 -0
- data/lib/new_relic/agent/instrumentation/action_mailbox.rb +30 -0
- data/lib/new_relic/agent/instrumentation/action_mailbox_subscriber.rb +33 -0
- data/lib/new_relic/agent/instrumentation/action_mailer.rb +30 -0
- data/lib/new_relic/agent/instrumentation/action_mailer_subscriber.rb +85 -0
- data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +86 -62
- data/lib/new_relic/agent/instrumentation/active_job.rb +38 -19
- data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/active_merchant.rb +21 -7
- data/lib/new_relic/agent/instrumentation/active_record.rb +95 -46
- data/lib/new_relic/agent/instrumentation/active_record_helper.rb +82 -61
- data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +155 -0
- data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +36 -12
- data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +69 -64
- data/lib/new_relic/agent/instrumentation/active_storage.rb +8 -4
- data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +11 -32
- data/lib/new_relic/agent/instrumentation/active_support.rb +27 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/chain.rb +23 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +20 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +12 -0
- data/lib/new_relic/agent/instrumentation/active_support_logger.rb +24 -0
- data/lib/new_relic/agent/instrumentation/active_support_subscriber.rb +41 -0
- data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +150 -0
- data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/bunny.rb +14 -134
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/chain.rb +36 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/instrumentation.rb +21 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby/prepend.rb +27 -0
- data/lib/new_relic/agent/instrumentation/concurrent_ruby.rb +31 -0
- data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +77 -61
- data/lib/new_relic/agent/instrumentation/curb/chain.rb +91 -0
- data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +221 -0
- data/lib/new_relic/agent/instrumentation/curb/prepend.rb +61 -0
- data/lib/new_relic/agent/instrumentation/curb.rb +15 -187
- data/lib/new_relic/agent/instrumentation/custom_events.rb +12 -0
- data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +37 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +35 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +48 -0
- data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +30 -52
- data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +29 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +66 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/elasticsearch.rb +31 -0
- data/lib/new_relic/agent/instrumentation/excon/middleware.rb +8 -7
- data/lib/new_relic/agent/instrumentation/excon.rb +29 -31
- data/lib/new_relic/agent/instrumentation/fiber/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +24 -0
- data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +18 -0
- data/lib/new_relic/agent/instrumentation/fiber.rb +25 -0
- data/lib/new_relic/agent/instrumentation/grape/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
- data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
- data/lib/new_relic/agent/instrumentation/grape.rb +16 -121
- data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +97 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +89 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +111 -0
- data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +30 -0
- data/lib/new_relic/agent/instrumentation/grpc/helper.rb +32 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/chain.rb +69 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +134 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/rpc_desc_prepend.rb +35 -0
- data/lib/new_relic/agent/instrumentation/grpc/server/rpc_server_prepend.rb +26 -0
- data/lib/new_relic/agent/instrumentation/grpc_client.rb +23 -0
- data/lib/new_relic/agent/instrumentation/grpc_server.rb +25 -0
- data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +37 -0
- data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httpclient.rb +12 -32
- data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
- data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
- data/lib/new_relic/agent/instrumentation/ignore_actions.rb +5 -6
- data/lib/new_relic/agent/instrumentation/logger/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +66 -0
- data/lib/new_relic/agent/instrumentation/logger/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/logger.rb +26 -0
- data/lib/new_relic/agent/instrumentation/memcache/chain.rb +15 -0
- data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +58 -125
- data/lib/new_relic/agent/instrumentation/memcache/helper.rb +59 -0
- data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +90 -0
- data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +101 -0
- data/lib/new_relic/agent/instrumentation/memcache.rb +57 -71
- data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +15 -14
- data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +21 -14
- data/lib/new_relic/agent/instrumentation/mongo.rb +7 -132
- data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +49 -13
- data/lib/new_relic/agent/instrumentation/net_http/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +40 -0
- data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
- data/lib/new_relic/agent/instrumentation/net_http.rb +44 -0
- data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +142 -0
- data/lib/new_relic/agent/instrumentation/padrino/chain.rb +38 -0
- data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +28 -0
- data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
- data/lib/new_relic/agent/instrumentation/padrino.rb +22 -58
- data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +7 -7
- data/lib/new_relic/agent/instrumentation/queue_time.rb +9 -10
- data/lib/new_relic/agent/instrumentation/rack/chain.rb +66 -0
- data/lib/new_relic/agent/instrumentation/rack/helpers.rb +33 -0
- data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +75 -0
- data/lib/new_relic/agent/instrumentation/rack/prepend.rb +43 -0
- data/lib/new_relic/agent/instrumentation/rack.rb +33 -141
- data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +19 -55
- data/lib/new_relic/agent/instrumentation/rails_middleware.rb +5 -5
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +36 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +45 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +30 -0
- data/lib/new_relic/agent/instrumentation/rails_notifications/custom_events.rb +30 -0
- data/lib/new_relic/agent/instrumentation/rake/chain.rb +20 -0
- data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +142 -0
- data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/rake.rb +18 -159
- data/lib/new_relic/agent/instrumentation/redis/chain.rb +45 -0
- data/lib/new_relic/agent/instrumentation/redis/constants.rb +17 -0
- data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +93 -0
- data/lib/new_relic/agent/instrumentation/redis/middleware.rb +16 -0
- data/lib/new_relic/agent/instrumentation/redis/prepend.rb +29 -0
- data/lib/new_relic/agent/instrumentation/redis.rb +20 -103
- data/lib/new_relic/agent/instrumentation/resque/chain.rb +21 -0
- data/lib/new_relic/agent/instrumentation/resque/helper.rb +19 -0
- data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +34 -0
- data/lib/new_relic/agent/instrumentation/resque/prepend.rb +15 -0
- data/lib/new_relic/agent/instrumentation/resque.rb +33 -41
- data/lib/new_relic/agent/instrumentation/sequel.rb +17 -20
- data/lib/new_relic/agent/instrumentation/sequel_helper.rb +3 -3
- data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +20 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +30 -0
- data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +37 -0
- data/lib/new_relic/agent/instrumentation/sidekiq.rb +29 -46
- data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
- data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +31 -37
- data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +125 -0
- data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
- data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +3 -3
- data/lib/new_relic/agent/instrumentation/sinatra.rb +35 -165
- data/lib/new_relic/agent/instrumentation/thread/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +28 -0
- data/lib/new_relic/agent/instrumentation/thread/prepend.rb +22 -0
- data/lib/new_relic/agent/instrumentation/thread.rb +20 -0
- data/lib/new_relic/agent/instrumentation/tilt/chain.rb +24 -0
- data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +41 -0
- data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +13 -0
- data/lib/new_relic/agent/instrumentation/tilt.rb +25 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +80 -0
- data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
- data/lib/new_relic/agent/instrumentation/typhoeus.rb +14 -76
- data/lib/new_relic/agent/instrumentation.rb +2 -2
- data/lib/new_relic/agent/internal_agent_error.rb +3 -3
- data/lib/new_relic/agent/javascript_instrumentor.rb +51 -45
- data/lib/new_relic/agent/linking_metadata.rb +44 -0
- data/lib/new_relic/agent/local_log_decorator.rb +37 -0
- data/lib/new_relic/agent/log_event_aggregator.rb +235 -0
- data/lib/new_relic/agent/log_once.rb +2 -2
- data/lib/new_relic/agent/log_priority.rb +20 -0
- data/lib/new_relic/agent/logging.rb +142 -0
- data/lib/new_relic/agent/memory_logger.rb +3 -3
- data/lib/new_relic/agent/messaging.rb +81 -164
- data/lib/new_relic/agent/method_tracer.rb +152 -145
- data/lib/new_relic/agent/method_tracer_helpers.rb +90 -13
- data/lib/new_relic/agent/monitors/cross_app_monitor.rb +117 -0
- data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +28 -0
- data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +5 -6
- data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +9 -15
- data/lib/new_relic/agent/monitors.rb +26 -0
- data/lib/new_relic/agent/new_relic_service/encoders.rb +7 -7
- data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +6 -7
- data/lib/new_relic/agent/new_relic_service/marshaller.rb +8 -29
- data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +5 -5
- data/lib/new_relic/agent/new_relic_service.rb +282 -166
- data/lib/new_relic/agent/noticeable_error.rb +19 -0
- data/lib/new_relic/agent/null_logger.rb +8 -4
- data/lib/new_relic/agent/obfuscator.rb +9 -11
- data/lib/new_relic/agent/parameter_filtering.rb +35 -8
- data/lib/new_relic/agent/payload_metric_mapping.rb +10 -11
- data/lib/new_relic/agent/pipe_channel_manager.rb +28 -18
- data/lib/new_relic/agent/pipe_service.rb +9 -6
- data/lib/new_relic/agent/prepend_supportability.rb +3 -3
- data/lib/new_relic/agent/priority_sampled_buffer.rb +16 -14
- data/lib/new_relic/agent/range_extensions.rb +9 -29
- data/lib/new_relic/agent/rules_engine/replacement_rule.rb +12 -12
- data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +13 -14
- data/lib/new_relic/agent/rules_engine.rb +6 -5
- data/lib/new_relic/agent/sampler.rb +4 -5
- data/lib/new_relic/agent/sampler_collection.rb +4 -5
- data/lib/new_relic/agent/samplers/cpu_sampler.rb +4 -3
- data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +14 -11
- data/lib/new_relic/agent/samplers/memory_sampler.rb +26 -15
- data/lib/new_relic/agent/samplers/object_sampler.rb +2 -2
- data/lib/new_relic/agent/samplers/vm_sampler.rb +22 -20
- data/lib/new_relic/agent/span_event_aggregator.rb +14 -16
- data/lib/new_relic/agent/span_event_primitive.rb +118 -58
- data/lib/new_relic/agent/sql_sampler.rb +25 -25
- data/lib/new_relic/agent/stats.rb +79 -42
- data/lib/new_relic/agent/stats_engine/gc_profiler.rb +11 -13
- data/lib/new_relic/agent/stats_engine/stats_hash.rb +13 -14
- data/lib/new_relic/agent/stats_engine.rb +11 -11
- data/lib/new_relic/agent/synthetics_event_aggregator.rb +8 -9
- data/lib/new_relic/agent/system_info.rb +100 -66
- data/lib/new_relic/agent/threading/agent_thread.rb +20 -16
- data/lib/new_relic/agent/threading/backtrace_node.rb +13 -14
- data/lib/new_relic/agent/threading/backtrace_service.rb +18 -18
- data/lib/new_relic/agent/threading/thread_profile.rb +31 -45
- data/lib/new_relic/agent/timestamp_sampled_buffer.rb +2 -2
- data/lib/new_relic/agent/tracer.rb +513 -0
- data/lib/new_relic/agent/transaction/abstract_segment.rb +131 -41
- data/lib/new_relic/agent/transaction/datastore_segment.rb +22 -18
- data/lib/new_relic/agent/transaction/distributed_tracer.rb +184 -0
- data/lib/new_relic/agent/transaction/distributed_tracing.rb +72 -163
- data/lib/new_relic/agent/transaction/external_request_segment.rb +66 -63
- data/lib/new_relic/agent/transaction/message_broker_segment.rb +34 -46
- data/lib/new_relic/agent/transaction/request_attributes.rb +36 -36
- data/lib/new_relic/agent/transaction/segment.rb +46 -10
- data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +2 -4
- data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +2 -2
- data/lib/new_relic/agent/transaction/trace.rb +21 -24
- data/lib/new_relic/agent/transaction/trace_builder.rb +11 -12
- data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
- data/lib/new_relic/agent/transaction/trace_node.rb +31 -28
- data/lib/new_relic/agent/transaction/tracing.rb +15 -111
- data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +6 -6
- data/lib/new_relic/agent/transaction.rb +252 -259
- data/lib/new_relic/agent/transaction_error_primitive.rb +34 -37
- data/lib/new_relic/agent/transaction_event_aggregator.rb +13 -13
- data/lib/new_relic/agent/transaction_event_primitive.rb +44 -56
- data/lib/new_relic/agent/transaction_event_recorder.rb +17 -16
- data/lib/new_relic/agent/transaction_metrics.rb +11 -10
- data/lib/new_relic/agent/transaction_sampler.rb +7 -12
- data/lib/new_relic/agent/transaction_time_aggregator.rb +41 -26
- data/lib/new_relic/agent/utilization/aws.rb +34 -4
- data/lib/new_relic/agent/utilization/azure.rb +4 -4
- data/lib/new_relic/agent/utilization/gcp.rb +8 -8
- data/lib/new_relic/agent/utilization/pcf.rb +6 -5
- data/lib/new_relic/agent/utilization/vendor.rb +44 -29
- data/lib/new_relic/agent/utilization_data.rb +43 -6
- data/lib/new_relic/agent/vm/jruby_vm.rb +2 -2
- data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +3 -3
- data/lib/new_relic/agent/vm/mri_vm.rb +46 -19
- data/lib/new_relic/agent/vm/snapshot.rb +6 -6
- data/lib/new_relic/agent/vm.rb +2 -2
- data/lib/new_relic/agent/worker_loop.rb +11 -13
- data/lib/new_relic/agent.rb +151 -79
- data/lib/new_relic/cli/command.rb +21 -23
- data/lib/new_relic/cli/commands/deployments.rb +94 -45
- data/lib/new_relic/cli/commands/install.rb +24 -26
- data/lib/new_relic/coerce.rb +42 -15
- data/lib/new_relic/collection_helper.rb +51 -49
- data/lib/new_relic/constants.rb +39 -0
- data/lib/new_relic/control/class_methods.rb +11 -5
- data/lib/new_relic/control/frameworks/external.rb +3 -3
- data/lib/new_relic/control/frameworks/rails.rb +24 -18
- data/lib/new_relic/control/frameworks/rails3.rb +4 -5
- data/lib/new_relic/control/frameworks/rails4.rb +2 -2
- data/lib/new_relic/control/frameworks/rails_notifications.rb +14 -0
- data/lib/new_relic/control/frameworks/ruby.rb +4 -4
- data/lib/new_relic/control/frameworks/sinatra.rb +8 -2
- data/lib/new_relic/control/frameworks.rb +2 -2
- data/lib/new_relic/control/instance_methods.rb +33 -42
- data/lib/new_relic/control/instrumentation.rb +40 -12
- data/lib/new_relic/control/private_instance_methods.rb +48 -0
- data/lib/new_relic/control/server_methods.rb +4 -5
- data/lib/new_relic/control.rb +2 -3
- data/lib/new_relic/delayed_job_injection.rb +2 -2
- data/lib/new_relic/dependency_detection.rb +129 -18
- data/lib/new_relic/environment_report.rb +41 -35
- data/lib/new_relic/helper.rb +49 -8
- data/lib/new_relic/language_support.rb +30 -6
- data/lib/new_relic/latest_changes.rb +9 -8
- data/lib/new_relic/local_environment.rb +23 -27
- data/lib/new_relic/metric_data.rb +32 -27
- data/lib/new_relic/metric_spec.rb +9 -7
- data/lib/new_relic/noticed_error.rb +46 -33
- data/lib/new_relic/rack/agent_hooks.rb +2 -2
- data/lib/new_relic/rack/agent_middleware.rb +7 -5
- data/lib/new_relic/rack/browser_monitoring.rb +134 -117
- data/lib/new_relic/rack.rb +2 -2
- data/lib/new_relic/recipes/capistrano3.rb +4 -62
- data/lib/new_relic/recipes/capistrano_legacy.rb +24 -27
- data/lib/new_relic/recipes/helpers/send_deployment.rb +70 -0
- data/lib/new_relic/recipes.rb +2 -2
- data/lib/new_relic/supportability_helper.rb +21 -7
- data/lib/new_relic/traced_thread.rb +39 -0
- data/lib/new_relic/version.rb +7 -18
- data/lib/newrelic_rpm.rb +20 -33
- data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +16 -19
- data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +9 -15
- data/lib/tasks/all.rb +4 -4
- data/lib/tasks/config.rake +22 -118
- data/lib/tasks/coverage_report.rake +28 -0
- data/lib/tasks/helpers/config.html.erb +21 -0
- data/lib/tasks/helpers/format.rb +123 -0
- data/lib/tasks/helpers/matches.rb +12 -0
- data/lib/tasks/helpers/prompt.rb +24 -0
- data/lib/tasks/helpers/removers.rb +33 -0
- data/lib/tasks/install.rake +4 -0
- data/lib/tasks/instrumentation_generator/README.md +63 -0
- data/lib/tasks/instrumentation_generator/TODO.md +33 -0
- data/lib/tasks/instrumentation_generator/instrumentation.thor +121 -0
- data/lib/tasks/instrumentation_generator/templates/Envfile.tt +9 -0
- data/lib/tasks/instrumentation_generator/templates/chain.tt +22 -0
- data/lib/tasks/instrumentation_generator/templates/chain_method.tt +8 -0
- data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +29 -0
- data/lib/tasks/instrumentation_generator/templates/instrumentation.tt +13 -0
- data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +3 -0
- data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +19 -0
- data/lib/tasks/instrumentation_generator/templates/prepend.tt +13 -0
- data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +3 -0
- data/lib/tasks/instrumentation_generator/templates/test.tt +15 -0
- data/lib/tasks/multiverse.rake +4 -0
- data/lib/tasks/multiverse.rb +12 -5
- data/lib/tasks/newrelic.rb +2 -2
- data/lib/tasks/tests.rake +14 -14
- data/newrelic.yml +672 -3
- data/newrelic_rpm.gemspec +40 -31
- data/recipes/newrelic.rb +3 -3
- data/test/agent_helper.rb +419 -98
- metadata +238 -127
- data/.travis.yml +0 -228
- data/bin/mongrel_rpm +0 -33
- data/cert/cacert.pem +0 -1177
- data/lib/new_relic/agent/commands/xray_session.rb +0 -55
- data/lib/new_relic/agent/commands/xray_session_collection.rb +0 -161
- data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
- data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +0 -44
- data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +0 -53
- data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -41
- data/lib/new_relic/agent/distributed_trace_payload.rb +0 -246
- data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
- data/lib/new_relic/agent/instrumentation/active_record_4.rb +0 -42
- data/lib/new_relic/agent/instrumentation/active_record_5.rb +0 -41
- data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -74
- data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -25
- data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -202
- data/lib/new_relic/agent/instrumentation/evented_subscriber.rb +0 -104
- data/lib/new_relic/agent/instrumentation/excon/connection.rb +0 -46
- data/lib/new_relic/agent/instrumentation/http.rb +0 -46
- data/lib/new_relic/agent/instrumentation/merb/controller.rb +0 -44
- data/lib/new_relic/agent/instrumentation/merb/errors.rb +0 -33
- data/lib/new_relic/agent/instrumentation/net.rb +0 -50
- data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +0 -125
- data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +0 -46
- data/lib/new_relic/agent/instrumentation/rails4/action_controller.rb +0 -32
- data/lib/new_relic/agent/instrumentation/rails4/action_view.rb +0 -27
- data/lib/new_relic/agent/instrumentation/rails5/action_cable.rb +0 -36
- data/lib/new_relic/agent/instrumentation/rails5/action_controller.rb +0 -33
- data/lib/new_relic/agent/instrumentation/rails5/action_view.rb +0 -27
- data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +0 -26
- data/lib/new_relic/agent/instrumentation/sunspot.rb +0 -33
- data/lib/new_relic/agent/supported_versions.rb +0 -275
- data/lib/new_relic/agent/transaction/attributes.rb +0 -154
- data/lib/new_relic/agent/transaction/xray_sample_buffer.rb +0 -64
- data/lib/new_relic/agent/transaction_state.rb +0 -186
- data/lib/new_relic/build.rb +0 -2
- data/lib/new_relic/control/frameworks/merb.rb +0 -29
- data/lib/new_relic/control/frameworks/rails5.rb +0 -14
- data/lib/new_relic/metrics.rb +0 -13
- data/lib/tasks/config.html.erb +0 -32
- data/lib/tasks/versions.html.erb +0 -28
- data/lib/tasks/versions.postface.html +0 -8
- data/lib/tasks/versions.preface.html +0 -9
- data/lib/tasks/versions.rake +0 -65
- data/lib/tasks/versions.txt.erb +0 -14
- /data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
require 'new_relic/agent/event_aggregator'
|
6
6
|
require 'new_relic/agent/attribute_processing'
|
@@ -10,9 +10,9 @@ module NewRelic
|
|
10
10
|
class CustomEventAggregator < EventAggregator
|
11
11
|
include NewRelic::Coerce
|
12
12
|
|
13
|
-
TYPE
|
14
|
-
TIMESTAMP
|
15
|
-
PRIORITY
|
13
|
+
TYPE = 'type'.freeze
|
14
|
+
TIMESTAMP = 'timestamp'.freeze
|
15
|
+
PRIORITY = 'priority'.freeze
|
16
16
|
EVENT_TYPE_REGEX = /^[a-zA-Z0-9:_ ]+$/.freeze
|
17
17
|
|
18
18
|
named :CustomEventAggregator
|
@@ -20,7 +20,7 @@ module NewRelic
|
|
20
20
|
enabled_key :'custom_insights_events.enabled'
|
21
21
|
|
22
22
|
def record(type, attributes)
|
23
|
-
unless attributes.is_a?
|
23
|
+
unless attributes.is_a?(Hash)
|
24
24
|
raise ArgumentError, "Expected Hash but got #{attributes.class}"
|
25
25
|
end
|
26
26
|
|
@@ -46,9 +46,9 @@ module NewRelic
|
|
46
46
|
|
47
47
|
def create_event(type, priority, attributes)
|
48
48
|
[
|
49
|
-
{
|
50
|
-
|
51
|
-
|
49
|
+
{TYPE => type,
|
50
|
+
TIMESTAMP => Process.clock_gettime(Process::CLOCK_REALTIME).to_i,
|
51
|
+
PRIORITY => priority},
|
52
52
|
AttributeProcessing.flatten_and_coerce(attributes)
|
53
53
|
]
|
54
54
|
end
|
@@ -57,23 +57,23 @@ module NewRelic
|
|
57
57
|
@type_strings = Hash.new { |hash, key| hash[key] = key.to_s.freeze }
|
58
58
|
end
|
59
59
|
|
60
|
-
def after_harvest
|
60
|
+
def after_harvest(metadata)
|
61
61
|
dropped_count = metadata[:seen] - metadata[:captured]
|
62
62
|
note_dropped_events(metadata[:seen], dropped_count)
|
63
63
|
record_supportability_metrics(metadata[:seen], metadata[:captured], dropped_count)
|
64
64
|
end
|
65
65
|
|
66
|
-
def note_dropped_events
|
66
|
+
def note_dropped_events(total_count, dropped_count)
|
67
67
|
if dropped_count > 0
|
68
68
|
NewRelic::Agent.logger.warn("Dropped #{dropped_count} custom events out of #{total_count}.")
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
72
|
-
def record_supportability_metrics
|
72
|
+
def record_supportability_metrics(total_count, captured_count, dropped_count)
|
73
73
|
engine = NewRelic::Agent.instance.stats_engine
|
74
|
-
engine.tl_record_supportability_metric_count("Events/Customer/Seen"
|
75
|
-
engine.tl_record_supportability_metric_count("Events/Customer/Sent"
|
76
|
-
engine.tl_record_supportability_metric_count("Events/Customer/Dropped",
|
74
|
+
engine.tl_record_supportability_metric_count("Events/Customer/Seen", total_count)
|
75
|
+
engine.tl_record_supportability_metric_count("Events/Customer/Sent", captured_count)
|
76
|
+
engine.tl_record_supportability_metric_count("Events/Customer/Dropped", dropped_count)
|
77
77
|
end
|
78
78
|
|
79
79
|
def note_dropped_event(type)
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
require 'new_relic/agent/database/obfuscator'
|
6
6
|
require 'new_relic/agent/database/postgres_explain_obfuscator'
|
@@ -9,7 +9,6 @@ module NewRelic
|
|
9
9
|
module Agent
|
10
10
|
module Database
|
11
11
|
module ExplainPlanHelpers
|
12
|
-
|
13
12
|
SUPPORTED_ADAPTERS_FOR_EXPLAIN = [:postgres, :mysql2, :mysql, :sqlite]
|
14
13
|
SELECT = 'select'.freeze
|
15
14
|
|
@@ -97,7 +96,7 @@ module NewRelic
|
|
97
96
|
|
98
97
|
def process_explain_results_mysql(results)
|
99
98
|
headers = []
|
100
|
-
values
|
99
|
+
values = []
|
101
100
|
if results.is_a?(Array)
|
102
101
|
# We're probably using the jdbc-mysql gem for JRuby, which will give
|
103
102
|
# us an array of hashes.
|
@@ -118,7 +117,7 @@ module NewRelic
|
|
118
117
|
|
119
118
|
def process_explain_results_mysql2(results)
|
120
119
|
headers = results.fields
|
121
|
-
values
|
120
|
+
values = []
|
122
121
|
results.each { |row| values << row }
|
123
122
|
[headers, values]
|
124
123
|
end
|
@@ -127,7 +126,7 @@ module NewRelic
|
|
127
126
|
|
128
127
|
def process_explain_results_sqlite(results)
|
129
128
|
headers = SQLITE_EXPLAIN_COLUMNS
|
130
|
-
values
|
129
|
+
values = []
|
131
130
|
results.each do |row|
|
132
131
|
values << headers.map { |h| row[h] }
|
133
132
|
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
module NewRelic
|
6
6
|
module Agent
|
@@ -11,7 +11,7 @@ module NewRelic
|
|
11
11
|
:double_quotes => /"(?:[^"]|"")*?(?:\\".*|"(?!"))/,
|
12
12
|
:dollar_quotes => /(\$(?!\d)[^$]*?\$).*?(?:\1|$)/,
|
13
13
|
:uuids => /\{?(?:[0-9a-fA-F]\-*){32}\}?/,
|
14
|
-
:numeric_literals =>
|
14
|
+
:numeric_literals => /-?\b(?:[0-9]+\.)?[0-9]+([eE][+-]?[0-9]+)?\b/,
|
15
15
|
:boolean_literals => /\b(?:true|false|null)\b/i,
|
16
16
|
:hexadecimal_literals => /0x[0-9a-fA-F]+/,
|
17
17
|
:comments => /(?:#|--).*?(?=\r|\n|$)/i,
|
@@ -20,17 +20,17 @@ module NewRelic
|
|
20
20
|
}
|
21
21
|
|
22
22
|
DIALECT_COMPONENTS = {
|
23
|
-
:fallback
|
24
|
-
:mysql
|
25
|
-
|
26
|
-
:postgres
|
27
|
-
|
28
|
-
:sqlite
|
29
|
-
|
30
|
-
:oracle
|
31
|
-
|
32
|
-
:cassandra
|
33
|
-
|
23
|
+
:fallback => COMPONENTS_REGEX_MAP.keys,
|
24
|
+
:mysql => [:single_quotes, :double_quotes, :numeric_literals, :boolean_literals,
|
25
|
+
:hexadecimal_literals, :comments, :multi_line_comments],
|
26
|
+
:postgres => [:single_quotes, :dollar_quotes, :uuids, :numeric_literals,
|
27
|
+
:boolean_literals, :comments, :multi_line_comments],
|
28
|
+
:sqlite => [:single_quotes, :numeric_literals, :boolean_literals, :hexadecimal_literals,
|
29
|
+
:comments, :multi_line_comments],
|
30
|
+
:oracle => [:single_quotes, :oracle_quoted_strings, :numeric_literals, :comments,
|
31
|
+
:multi_line_comments],
|
32
|
+
:cassandra => [:single_quotes, :uuids, :numeric_literals, :boolean_literals,
|
33
|
+
:hexadecimal_literals, :comments, :multi_line_comments]
|
34
34
|
}
|
35
35
|
|
36
36
|
# We use these to check whether the query contains any quote characters
|
@@ -53,12 +53,13 @@ module NewRelic
|
|
53
53
|
|
54
54
|
def obfuscate_single_quote_literals(sql)
|
55
55
|
return sql unless sql =~ COMPONENTS_REGEX_MAP[:single_quotes]
|
56
|
+
|
56
57
|
sql.gsub(COMPONENTS_REGEX_MAP[:single_quotes], PLACEHOLDER)
|
57
58
|
end
|
58
59
|
|
59
60
|
def self.generate_regex(dialect)
|
60
61
|
components = DIALECT_COMPONENTS[dialect]
|
61
|
-
Regexp.union(components.map{|component| COMPONENTS_REGEX_MAP[component]})
|
62
|
+
Regexp.union(components.map { |component| COMPONENTS_REGEX_MAP[component] })
|
62
63
|
end
|
63
64
|
|
64
65
|
MYSQL_COMPONENTS_REGEX = self.generate_regex(:mysql)
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
require 'new_relic/agent/database/obfuscation_helpers'
|
6
6
|
|
@@ -50,7 +50,7 @@ module NewRelic
|
|
50
50
|
def default_sql_obfuscator(sql)
|
51
51
|
stmt = sql.kind_of?(Statement) ? sql : Statement.new(sql)
|
52
52
|
|
53
|
-
if stmt.sql.end_with?
|
53
|
+
if stmt.sql.end_with?(ELLIPSIS)
|
54
54
|
return QUERY_TOO_LARGE_MESSAGE
|
55
55
|
end
|
56
56
|
|
@@ -1,6 +1,6 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
5
|
module NewRelic
|
6
6
|
module Agent
|
@@ -12,7 +12,7 @@ module NewRelic
|
|
12
12
|
# Database::Obfuscator class because here we don't look for
|
13
13
|
# backslash-escaped strings.
|
14
14
|
QUOTED_STRINGS_REGEX = /'(?:[^']|'')*'|"(?:[^"]|"")*"/
|
15
|
-
LABEL_LINE_REGEX
|
15
|
+
LABEL_LINE_REGEX = /^([^:\n]*:\s+).*$/.freeze
|
16
16
|
|
17
17
|
def obfuscate(explain)
|
18
18
|
# First, we replace all single-quoted strings.
|
@@ -35,7 +35,7 @@ module NewRelic
|
|
35
35
|
# All parts of the query that can appear in the explain output are
|
36
36
|
# prefixed with "<label>: ", so we want to preserve the label, but
|
37
37
|
# remove the rest of the line.
|
38
|
-
explain.gsub!(LABEL_LINE_REGEX,
|
38
|
+
explain.gsub!(LABEL_LINE_REGEX, '\1?')
|
39
39
|
explain
|
40
40
|
end
|
41
41
|
end
|
@@ -1,26 +1,12 @@
|
|
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 'singleton'
|
6
6
|
require 'new_relic/agent/database/explain_plan_helpers'
|
7
7
|
require 'new_relic/agent/database/obfuscator'
|
8
8
|
|
9
9
|
module NewRelic
|
10
|
-
# columns for a mysql explain plan
|
11
|
-
MYSQL_EXPLAIN_COLUMNS = [
|
12
|
-
"Id",
|
13
|
-
"Select Type",
|
14
|
-
"Table",
|
15
|
-
"Type",
|
16
|
-
"Possible Keys",
|
17
|
-
"Key",
|
18
|
-
"Key Length",
|
19
|
-
"Ref",
|
20
|
-
"Rows",
|
21
|
-
"Extra"
|
22
|
-
].freeze
|
23
|
-
|
24
10
|
module Agent
|
25
11
|
module Database
|
26
12
|
MAX_QUERY_LENGTH = 16384
|
@@ -32,6 +18,8 @@ module NewRelic
|
|
32
18
|
# Take care not to the dup the query more than once as
|
33
19
|
# correctly encoded may also dup the query.
|
34
20
|
def capture_query(query)
|
21
|
+
return unless query
|
22
|
+
|
35
23
|
id = query.object_id
|
36
24
|
query = Helper.correctly_encoded(truncate_query(query))
|
37
25
|
if query.object_id == id
|
@@ -42,6 +30,8 @@ module NewRelic
|
|
42
30
|
end
|
43
31
|
|
44
32
|
def truncate_query(query)
|
33
|
+
return unless query
|
34
|
+
|
45
35
|
if query.length > (MAX_QUERY_LENGTH - 4)
|
46
36
|
query[0..MAX_QUERY_LENGTH - 4] << ELLIPSIS
|
47
37
|
else
|
@@ -57,7 +47,7 @@ module NewRelic
|
|
57
47
|
Obfuscator.instance.set_sql_obfuscator(type, &block)
|
58
48
|
end
|
59
49
|
|
60
|
-
def record_sql_method(config_section
|
50
|
+
def record_sql_method(config_section = :transaction_tracer)
|
61
51
|
key = record_sql_method_key(config_section)
|
62
52
|
|
63
53
|
case Agent.config[key].to_s
|
@@ -87,11 +77,11 @@ module NewRelic
|
|
87
77
|
|
88
78
|
RECORD_FOR = [:raw, :obfuscated].freeze
|
89
79
|
|
90
|
-
def should_record_sql?(config_section
|
80
|
+
def should_record_sql?(config_section = :transaction_tracer)
|
91
81
|
RECORD_FOR.include?(record_sql_method(config_section))
|
92
82
|
end
|
93
83
|
|
94
|
-
def should_collect_explain_plans?(config_section
|
84
|
+
def should_collect_explain_plans?(config_section = :transaction_tracer)
|
95
85
|
should_record_sql?(config_section) &&
|
96
86
|
Agent.config["#{config_section}.explain_enabled".to_sym]
|
97
87
|
end
|
@@ -114,33 +104,33 @@ module NewRelic
|
|
114
104
|
# in a report period, selected for shipment to New Relic
|
115
105
|
def explain_sql(statement)
|
116
106
|
return nil unless statement.sql && statement.explainer && statement.config
|
107
|
+
|
117
108
|
statement.sql = statement.sql.split(";\n")[0] # only explain the first
|
118
109
|
return statement.explain || []
|
119
110
|
end
|
120
111
|
|
121
|
-
KNOWN_OPERATIONS = [
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
112
|
+
KNOWN_OPERATIONS = %w[
|
113
|
+
alter
|
114
|
+
select
|
115
|
+
update
|
116
|
+
delete
|
117
|
+
insert
|
118
|
+
create
|
119
|
+
show
|
120
|
+
set
|
121
|
+
exec
|
122
|
+
execute
|
123
|
+
call
|
133
124
|
]
|
134
|
-
|
125
|
+
OTHER_OPERATION = 'other'.freeze
|
135
126
|
SQL_COMMENT_REGEX = Regexp.new('/\*.*?\*/', Regexp::MULTILINE).freeze
|
136
|
-
EMPTY_STRING = ''.freeze
|
137
127
|
|
138
128
|
def parse_operation_from_query(sql)
|
139
|
-
sql = Helper.correctly_encoded(sql).gsub(SQL_COMMENT_REGEX,
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
129
|
+
sql = Helper.correctly_encoded(sql).gsub(SQL_COMMENT_REGEX, NewRelic::EMPTY_STR)
|
130
|
+
return unless sql =~ /(\w+)/
|
131
|
+
|
132
|
+
op = Regexp.last_match(1).downcase
|
133
|
+
KNOWN_OPERATIONS.include?(op) ? op : OTHER_OPERATION
|
144
134
|
end
|
145
135
|
|
146
136
|
class ConnectionManager
|
@@ -158,7 +148,7 @@ module NewRelic
|
|
158
148
|
return connection if connection
|
159
149
|
|
160
150
|
begin
|
161
|
-
@connections[config] =
|
151
|
+
@connections[config] = yield(config)
|
162
152
|
rescue => e
|
163
153
|
::NewRelic::Agent.logger.error("Caught exception trying to get connection to DB for explain.", e)
|
164
154
|
nil
|
@@ -186,7 +176,7 @@ module NewRelic
|
|
186
176
|
|
187
177
|
DEFAULT_QUERY_NAME = "SQL".freeze
|
188
178
|
|
189
|
-
def initialize(sql, config={}, explainer=nil, binds=nil, name=DEFAULT_QUERY_NAME, host=nil, port_path_or_id=nil, database_name=nil)
|
179
|
+
def initialize(sql, config = {}, explainer = nil, binds = nil, name = DEFAULT_QUERY_NAME, host = nil, port_path_or_id = nil, database_name = nil)
|
190
180
|
@sql = Database.capture_query(sql)
|
191
181
|
@config = config
|
192
182
|
@explainer = explainer
|
@@ -206,9 +196,7 @@ module NewRelic
|
|
206
196
|
Database.obfuscate_sql(self)
|
207
197
|
when :raw
|
208
198
|
sql.to_s
|
209
|
-
|
210
|
-
nil
|
211
|
-
end
|
199
|
+
end
|
212
200
|
end
|
213
201
|
|
214
202
|
# This takes a connection config hash from ActiveRecord or Sequel and
|
@@ -221,35 +209,38 @@ module NewRelic
|
|
221
209
|
elsif @config[:uri] && @config[:uri].to_s =~ /^jdbc:([^:]+):/
|
222
210
|
# This case is for Sequel with the jdbc-mysql, jdbc-postgres, or jdbc-sqlite3 gems.
|
223
211
|
symbolized_adapter($1)
|
224
|
-
else
|
225
|
-
nil
|
226
212
|
end
|
227
213
|
end
|
228
214
|
|
229
215
|
def explain
|
230
216
|
return unless explainable?
|
217
|
+
|
231
218
|
handle_exception_in_explain do
|
232
|
-
start =
|
219
|
+
start = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
233
220
|
plan = @explainer.call(self)
|
234
|
-
::NewRelic::Agent.record_metric(
|
221
|
+
::NewRelic::Agent.record_metric(
|
222
|
+
"Supportability/Database/execute_explain_plan",
|
223
|
+
Process.clock_gettime(Process::CLOCK_MONOTONIC) - start
|
224
|
+
)
|
235
225
|
return process_resultset(plan, adapter) if plan
|
236
226
|
end
|
237
227
|
end
|
238
228
|
|
239
229
|
NEWLINE = "\n".freeze
|
240
230
|
|
241
|
-
def append_sql
|
231
|
+
def append_sql(new_sql)
|
242
232
|
return if new_sql.empty?
|
233
|
+
|
243
234
|
@sql = Database.truncate_query(@sql << NEWLINE << new_sql)
|
244
235
|
end
|
245
236
|
|
246
237
|
private
|
247
238
|
|
248
|
-
POSTGIS_PREFIX
|
239
|
+
POSTGIS_PREFIX = 'postgis'.freeze
|
249
240
|
POSTGRES_PREFIX = 'postgres'.freeze
|
250
|
-
MYSQL_PREFIX
|
251
|
-
MYSQL2_PREFIX
|
252
|
-
SQLITE_PREFIX
|
241
|
+
MYSQL_PREFIX = 'mysql'.freeze
|
242
|
+
MYSQL2_PREFIX = 'mysql2'.freeze
|
243
|
+
SQLITE_PREFIX = 'sqlite'.freeze
|
253
244
|
|
254
245
|
def symbolized_adapter(adapter)
|
255
246
|
if adapter.start_with?(POSTGRES_PREFIX) || adapter == POSTGIS_PREFIX
|
@@ -260,7 +251,7 @@ module NewRelic
|
|
260
251
|
# between usage of mysql and mysql2. Obfuscation is the same, though.
|
261
252
|
elsif adapter == MYSQL2_PREFIX
|
262
253
|
:mysql2
|
263
|
-
elsif adapter.start_with?
|
254
|
+
elsif adapter.start_with?(SQLITE_PREFIX)
|
264
255
|
:sqlite
|
265
256
|
else
|
266
257
|
adapter.to_sym
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
module NewRelic
|
6
|
+
module Agent
|
7
|
+
class DatabaseAdapter
|
8
|
+
VERSIONS = {
|
9
|
+
'6.1.0' => proc { ActiveRecord::Base.connection_db_config.configuration_hash[:adapter] },
|
10
|
+
'4.0.0' => proc { ActiveRecord::Base.connection_config[:adapter] },
|
11
|
+
'3.0.0' => proc { |env| ActiveRecord::Base.configurations[env]['adapter'] }
|
12
|
+
}
|
13
|
+
|
14
|
+
def self.value
|
15
|
+
return unless defined? ActiveRecord::Base
|
16
|
+
|
17
|
+
new(::NewRelic::Control.instance.env, ActiveRecord::VERSION::STRING).value
|
18
|
+
end
|
19
|
+
|
20
|
+
attr_reader :env, :version
|
21
|
+
|
22
|
+
def initialize(env, version)
|
23
|
+
@env = env
|
24
|
+
@version = Gem::Version.new(version)
|
25
|
+
end
|
26
|
+
|
27
|
+
def value
|
28
|
+
match = VERSIONS.keys.find { |key| version >= Gem::Version.new(key) }
|
29
|
+
return unless match
|
30
|
+
|
31
|
+
VERSIONS[match].call(env)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -1,15 +1,12 @@
|
|
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 Datastores
|
8
8
|
module MetricHelper
|
9
|
-
ROLLUP_METRIC
|
10
|
-
WEB_ROLLUP_METRIC = "Datastore/allWeb".freeze
|
11
|
-
OTHER_ROLLUP_METRIC = "Datastore/allOther".freeze
|
12
|
-
DEFAULT_PRODUCT_NAME = "ActiveRecord".freeze
|
9
|
+
ROLLUP_METRIC = "Datastore/all".freeze
|
13
10
|
OTHER = "Other".freeze
|
14
11
|
|
15
12
|
ALL = "all".freeze
|
@@ -48,15 +45,15 @@ module NewRelic
|
|
48
45
|
end
|
49
46
|
end
|
50
47
|
|
51
|
-
def self.scoped_metric_for
|
48
|
+
def self.scoped_metric_for(product, operation, collection = nil)
|
52
49
|
if collection
|
53
|
-
statement_metric_for
|
50
|
+
statement_metric_for(product, collection, operation)
|
54
51
|
else
|
55
|
-
operation_metric_for
|
52
|
+
operation_metric_for(product, operation)
|
56
53
|
end
|
57
54
|
end
|
58
55
|
|
59
|
-
def self.unscoped_metrics_for
|
56
|
+
def self.unscoped_metrics_for(product, operation, collection = nil, host = nil, port_path_or_id = nil)
|
60
57
|
suffix = all_suffix
|
61
58
|
|
62
59
|
metrics = [
|
@@ -67,30 +64,30 @@ module NewRelic
|
|
67
64
|
]
|
68
65
|
|
69
66
|
if NewRelic::Agent.config[:'datastore_tracer.instance_reporting.enabled'] && host && port_path_or_id
|
70
|
-
metrics.unshift
|
67
|
+
metrics.unshift(instance_metric_for(product, host, port_path_or_id))
|
71
68
|
end
|
72
|
-
metrics.unshift
|
69
|
+
metrics.unshift(operation_metric_for(product, operation)) if collection
|
73
70
|
|
74
71
|
metrics
|
75
72
|
end
|
76
73
|
|
77
|
-
def self.product_operation_collection_for
|
74
|
+
def self.product_operation_collection_for(product, operation, collection = nil, generic_product = nil)
|
78
75
|
if overrides = overridden_operation_and_collection
|
79
76
|
if should_override?(overrides, product, generic_product)
|
80
|
-
operation
|
77
|
+
operation = overrides[0] || operation
|
81
78
|
collection = overrides[1] || collection
|
82
79
|
end
|
83
80
|
end
|
84
81
|
[product, operation, collection]
|
85
82
|
end
|
86
83
|
|
87
|
-
def self.metrics_for(product, operation, collection = nil, generic_product = nil, host=nil, port_path_or_id=nil)
|
84
|
+
def self.metrics_for(product, operation, collection = nil, generic_product = nil, host = nil, port_path_or_id = nil)
|
88
85
|
product, operation, collection = product_operation_collection_for(product, operation, collection, generic_product)
|
89
86
|
|
90
87
|
# Order of these metrics matters--the first metric in the list will
|
91
88
|
# be treated as the scoped metric in a bunch of different cases.
|
92
89
|
metrics = unscoped_metrics_for(product, operation, collection, host, port_path_or_id)
|
93
|
-
metrics.unshift
|
90
|
+
metrics.unshift(scoped_metric_for(product, operation, collection))
|
94
91
|
|
95
92
|
metrics
|
96
93
|
end
|
@@ -101,14 +98,15 @@ module NewRelic
|
|
101
98
|
end
|
102
99
|
|
103
100
|
def self.operation_from_sql(sql)
|
104
|
-
NewRelic::Agent::Database.parse_operation_from_query(sql)
|
101
|
+
operation = NewRelic::Agent::Database.parse_operation_from_query(sql)
|
102
|
+
operation = OTHER if operation.eql?(NewRelic::Agent::Database::OTHER_OPERATION)
|
103
|
+
operation
|
105
104
|
end
|
106
105
|
|
107
106
|
# Allow Transaction#with_database_metric_name to override our
|
108
107
|
# collection and operation
|
109
|
-
def self.overridden_operation_and_collection #THREAD_LOCAL_ACCESS
|
110
|
-
|
111
|
-
txn = state.current_transaction
|
108
|
+
def self.overridden_operation_and_collection # THREAD_LOCAL_ACCESS
|
109
|
+
txn = Tracer.current_transaction
|
112
110
|
txn ? txn.instrumentation_state[:datastore_override] : nil
|
113
111
|
end
|
114
112
|
|
@@ -1,19 +1,19 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
4
|
-
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative '../nosql_obfuscator'
|
5
6
|
|
6
7
|
module NewRelic
|
7
8
|
module Agent
|
8
9
|
module Datastores
|
9
10
|
module Mongo
|
10
11
|
module EventFormatter
|
11
|
-
|
12
12
|
# Keys that will get their values replaced with '?'.
|
13
|
-
OBFUSCATE_KEYS = [
|
13
|
+
OBFUSCATE_KEYS = %w[filter query pipeline].freeze
|
14
14
|
|
15
15
|
# Keys that will get completely removed from the statement.
|
16
|
-
|
16
|
+
DENYLISTED_KEYS = %w[deletes documents updates].freeze
|
17
17
|
|
18
18
|
def self.format(command_name, database_name, command)
|
19
19
|
return nil unless NewRelic::Agent.config[:'mongo.capture_queries']
|
@@ -25,7 +25,8 @@ module NewRelic
|
|
25
25
|
}
|
26
26
|
|
27
27
|
command.each do |key, value|
|
28
|
-
next if
|
28
|
+
next if DENYLISTED_KEYS.include?(key)
|
29
|
+
|
29
30
|
if OBFUSCATE_KEYS.include?(key)
|
30
31
|
obfuscated = obfuscate(value)
|
31
32
|
result[key] = obfuscated if obfuscated
|
@@ -38,7 +39,7 @@ module NewRelic
|
|
38
39
|
|
39
40
|
def self.obfuscate(statement)
|
40
41
|
if NewRelic::Agent.config[:'mongo.obfuscate_queries']
|
41
|
-
statement =
|
42
|
+
statement = NewRelic::Agent::Datastores::NosqlObfuscator.obfuscate_statement(statement)
|
42
43
|
end
|
43
44
|
statement
|
44
45
|
end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
# encoding: utf-8
|
2
1
|
# This file is distributed under New Relic's license terms.
|
3
|
-
# See https://github.com/newrelic/
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
4
|
|
5
|
-
require 'new_relic/agent/datastores/
|
5
|
+
require 'new_relic/agent/datastores/nosql_obfuscator'
|
6
6
|
require 'new_relic/agent/datastores/metric_helper'
|
7
7
|
|
8
8
|
module NewRelic
|
@@ -15,8 +15,8 @@ module NewRelic
|
|
15
15
|
|
16
16
|
if collection_in_selector?(payload)
|
17
17
|
command_key = command_key_from_selector(payload)
|
18
|
-
name
|
19
|
-
collection
|
18
|
+
name = get_name_from_selector(command_key, payload)
|
19
|
+
collection = get_collection_from_selector(command_key, payload)
|
20
20
|
else
|
21
21
|
collection = payload[:collection]
|
22
22
|
end
|
@@ -57,8 +57,6 @@ module NewRelic
|
|
57
57
|
nil
|
58
58
|
end
|
59
59
|
|
60
|
-
MONGO_PRODUCT_NAME = "MongoDB".freeze
|
61
|
-
|
62
60
|
def self.collection_in_selector?(payload)
|
63
61
|
payload[:collection] == '$cmd' && payload[:selector]
|
64
62
|
end
|
@@ -79,7 +77,7 @@ module NewRelic
|
|
79
77
|
|
80
78
|
:collstats,
|
81
79
|
:renameCollection,
|
82
|
-
:drop
|
80
|
+
:drop
|
83
81
|
]
|
84
82
|
|
85
83
|
def self.command_key_from_selector(payload)
|
@@ -121,7 +119,7 @@ module NewRelic
|
|
121
119
|
name == :findandmodify && payload[:selector] && payload[:selector][:remove]
|
122
120
|
end
|
123
121
|
|
124
|
-
def self.create_indexes?(name,
|
122
|
+
def self.create_indexes?(name, _payload)
|
125
123
|
name == :createIndexes
|
126
124
|
end
|
127
125
|
|
@@ -176,9 +174,7 @@ module NewRelic
|
|
176
174
|
parts.shift
|
177
175
|
parts.join('.')
|
178
176
|
end
|
179
|
-
|
180
177
|
end
|
181
|
-
|
182
178
|
end
|
183
179
|
end
|
184
180
|
end
|