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,50 +1,44 @@
|
|
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
|
-
module NewRelic
|
6
|
-
module
|
7
|
-
module
|
8
|
-
|
9
|
-
|
5
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module Sinatra
|
7
|
+
module Ignorer
|
8
|
+
def self.should_ignore?(app, type)
|
9
|
+
return false if !app.settings.respond_to?(:newrelic_ignores)
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
pattern.match(app.request.path_info)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def newrelic_ignore(*routes)
|
20
|
-
set_newrelic_ignore(:routes, *routes)
|
21
|
-
end
|
11
|
+
app.settings.newrelic_ignores[type].any? do |pattern|
|
12
|
+
pattern.match(app.request.path_info)
|
13
|
+
end
|
14
|
+
end
|
22
15
|
|
23
|
-
|
24
|
-
|
25
|
-
|
16
|
+
def newrelic_ignore(*routes)
|
17
|
+
set_newrelic_ignore(:routes, *routes)
|
18
|
+
end
|
26
19
|
|
27
|
-
|
28
|
-
|
29
|
-
|
20
|
+
def newrelic_ignore_apdex(*routes)
|
21
|
+
set_newrelic_ignore(:apdex, *routes)
|
22
|
+
end
|
30
23
|
|
31
|
-
|
24
|
+
def newrelic_ignore_enduser(*routes)
|
25
|
+
set_newrelic_ignore(:enduser, *routes)
|
26
|
+
end
|
32
27
|
|
33
|
-
|
34
|
-
# Important to default this in the context of the actual app
|
35
|
-
# If it's done at register time, ignores end up shared between apps.
|
36
|
-
set :newrelic_ignores, Hash.new([]) if !respond_to?(:newrelic_ignores)
|
28
|
+
private
|
37
29
|
|
38
|
-
|
39
|
-
|
30
|
+
def set_newrelic_ignore(type, *routes)
|
31
|
+
# Important to default this in the context of the actual app
|
32
|
+
# If it's done at register time, ignores end up shared between apps.
|
33
|
+
set(:newrelic_ignores, Hash.new([])) if !respond_to?(:newrelic_ignores)
|
40
34
|
|
41
|
-
|
42
|
-
|
43
|
-
# exactly Sinatra's mapping of route text to regex
|
44
|
-
Array(send(:compile, r)).first
|
45
|
-
end
|
46
|
-
end
|
35
|
+
# If we call an ignore without a route, it applies to the whole app
|
36
|
+
routes = ["*"] if routes.empty?
|
47
37
|
|
38
|
+
settings.newrelic_ignores[type] += routes.map do |r|
|
39
|
+
# Ugly sending to private Base#compile, but we want to mimic
|
40
|
+
# exactly Sinatra's mapping of route text to regex
|
41
|
+
Array(send(:compile, r)).first
|
48
42
|
end
|
49
43
|
end
|
50
44
|
end
|
@@ -0,0 +1,125 @@
|
|
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
|
+
# NewRelic instrumentation for Sinatra applications. Sinatra actions will
|
6
|
+
# appear in the UI similar to controller actions, and have breakdown charts
|
7
|
+
# and transaction traces.
|
8
|
+
#
|
9
|
+
# The actions in the UI will correspond to the pattern expression used
|
10
|
+
# to match them, not directly to full URL's.
|
11
|
+
module NewRelic::Agent::Instrumentation
|
12
|
+
module Sinatra
|
13
|
+
module Tracer
|
14
|
+
include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
15
|
+
|
16
|
+
def self.included(clazz)
|
17
|
+
clazz.extend(self)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Expected method for supporting ControllerInstrumentation
|
21
|
+
def newrelic_request_headers(_)
|
22
|
+
request.env
|
23
|
+
end
|
24
|
+
|
25
|
+
def newrelic_middlewares
|
26
|
+
middlewares = [NewRelic::Rack::BrowserMonitoring]
|
27
|
+
if NewRelic::Rack::AgentHooks.needed?
|
28
|
+
middlewares << NewRelic::Rack::AgentHooks
|
29
|
+
end
|
30
|
+
middlewares
|
31
|
+
end
|
32
|
+
|
33
|
+
def build_with_tracing(*args, &block)
|
34
|
+
unless NewRelic::Agent.config[:disable_sinatra_auto_middleware]
|
35
|
+
newrelic_middlewares.each do |middleware_class|
|
36
|
+
try_to_use(self, middleware_class)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
yield
|
40
|
+
end
|
41
|
+
|
42
|
+
def install_lock
|
43
|
+
@install_lock ||= Mutex.new
|
44
|
+
end
|
45
|
+
|
46
|
+
def try_to_use(app, clazz)
|
47
|
+
install_lock.synchronize do
|
48
|
+
has_middleware = app.middleware && app.middleware.any? { |info| info && info[0] == clazz }
|
49
|
+
app.use(clazz) unless has_middleware
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
# Capture last route we've seen. Will set for transaction on route_eval
|
54
|
+
def process_route_with_tracing(*args)
|
55
|
+
begin
|
56
|
+
env["newrelic.last_route"] = args[0]
|
57
|
+
rescue => e
|
58
|
+
::NewRelic::Agent.logger.debug("Failed determining last route in Sinatra", e)
|
59
|
+
end
|
60
|
+
yield
|
61
|
+
end
|
62
|
+
|
63
|
+
# If a transaction name is already set, this call will tromple over it.
|
64
|
+
# This is intentional, as typically passing to a separate route is like
|
65
|
+
# an entirely separate transaction, so we pick up the new name.
|
66
|
+
#
|
67
|
+
# If we're ignored, this remains safe, since set_transaction_name
|
68
|
+
# care for the gating on the transaction's existence for us.
|
69
|
+
def route_eval_with_tracing(*args)
|
70
|
+
begin
|
71
|
+
if txn_name = TransactionNamer.transaction_name_for_route(env, request)
|
72
|
+
::NewRelic::Agent::Transaction.set_default_transaction_name(
|
73
|
+
"#{self.class.name}/#{txn_name}", :sinatra
|
74
|
+
)
|
75
|
+
end
|
76
|
+
rescue => e
|
77
|
+
::NewRelic::Agent.logger.debug("Failed during route_eval to set transaction name", e)
|
78
|
+
end
|
79
|
+
yield
|
80
|
+
end
|
81
|
+
|
82
|
+
def get_request_params
|
83
|
+
begin
|
84
|
+
@request.params
|
85
|
+
rescue => e
|
86
|
+
NewRelic::Agent.logger.debug("Failed to get params from Rack request.", e)
|
87
|
+
nil
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def dispatch_with_tracing
|
92
|
+
request_params = get_request_params
|
93
|
+
filtered_params = ::NewRelic::Agent::ParameterFiltering::apply_filters(request.env, request_params || {})
|
94
|
+
|
95
|
+
name = TransactionNamer.initial_transaction_name(request)
|
96
|
+
perform_action_with_newrelic_trace(:category => :sinatra,
|
97
|
+
:name => name,
|
98
|
+
:params => filtered_params) do
|
99
|
+
begin
|
100
|
+
yield
|
101
|
+
ensure
|
102
|
+
# Will only see an error raised if :show_exceptions is true, but
|
103
|
+
# will always see them in the env hash if they occur
|
104
|
+
had_error = env.has_key?('sinatra.error')
|
105
|
+
::NewRelic::Agent.notice_error(env['sinatra.error']) if had_error
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def do_not_trace?
|
111
|
+
Ignorer.should_ignore?(self, :routes)
|
112
|
+
end
|
113
|
+
|
114
|
+
# Overrides ControllerInstrumentation implementation
|
115
|
+
def ignore_apdex?
|
116
|
+
Ignorer.should_ignore?(self, :apdex)
|
117
|
+
end
|
118
|
+
|
119
|
+
# Overrides ControllerInstrumentation implementation
|
120
|
+
def ignore_enduser?
|
121
|
+
Ignorer.should_ignore?(self, :enduser)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
@@ -0,0 +1,33 @@
|
|
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::Agent::Instrumentation
|
6
|
+
module Sinatra
|
7
|
+
module Prepend
|
8
|
+
include ::NewRelic::Agent::Instrumentation::Sinatra::Tracer
|
9
|
+
|
10
|
+
def dispatch!
|
11
|
+
dispatch_with_tracing { super }
|
12
|
+
end
|
13
|
+
|
14
|
+
def process_route(*args, &block)
|
15
|
+
process_route_with_tracing(*args) { super }
|
16
|
+
end
|
17
|
+
|
18
|
+
def route_eval(*args, &block)
|
19
|
+
route_eval_with_tracing(*args) { super }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
module Build
|
24
|
+
module Prepend
|
25
|
+
include ::NewRelic::Agent::Instrumentation::Sinatra::Tracer
|
26
|
+
|
27
|
+
def build(*args, &block)
|
28
|
+
build_with_tracing(*args) { super }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
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
|
@@ -12,7 +12,7 @@ module NewRelic
|
|
12
12
|
SINATRA_ROUTE = 'sinatra.route'
|
13
13
|
|
14
14
|
def transaction_name_for_route(env, request)
|
15
|
-
if env.key?
|
15
|
+
if env.key?(SINATRA_ROUTE)
|
16
16
|
env[SINATRA_ROUTE]
|
17
17
|
else
|
18
18
|
name = route_for_sinatra(env)
|
@@ -1,188 +1,58 @@
|
|
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
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
require_relative 'sinatra/transaction_namer'
|
6
|
+
require_relative 'sinatra/ignorer'
|
7
|
+
require_relative 'sinatra/instrumentation'
|
8
|
+
require_relative 'sinatra/chain'
|
9
|
+
require_relative 'sinatra/prepend'
|
9
10
|
|
10
11
|
DependencyDetection.defer do
|
11
|
-
|
12
|
+
named :sinatra
|
12
13
|
|
13
|
-
depends_on
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
Sinatra::Base.private_method_defined?(:process_route) &&
|
18
|
-
Sinatra::Base.private_method_defined?(:route_eval)
|
19
|
-
end
|
14
|
+
depends_on { defined?(Sinatra) && defined?(Sinatra::Base) }
|
15
|
+
depends_on { Sinatra::Base.private_method_defined?(:dispatch!) }
|
16
|
+
depends_on { Sinatra::Base.private_method_defined?(:process_route) }
|
17
|
+
depends_on { Sinatra::Base.private_method_defined?(:route_eval) }
|
20
18
|
|
21
19
|
executes do
|
22
|
-
|
20
|
+
NewRelic::Agent.logger.info('Installing Sinatra instrumentation')
|
23
21
|
end
|
24
22
|
|
25
23
|
executes do
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
alias dispatch! dispatch_with_newrelic
|
31
|
-
|
32
|
-
alias process_route_without_newrelic process_route
|
33
|
-
alias process_route process_route_with_newrelic
|
34
|
-
|
35
|
-
alias route_eval_without_newrelic route_eval
|
36
|
-
alias route_eval route_eval_with_newrelic
|
37
|
-
|
38
|
-
register NewRelic::Agent::Instrumentation::Sinatra::Ignorer
|
24
|
+
if use_prepend?
|
25
|
+
prepend_instrument Sinatra::Base, NewRelic::Agent::Instrumentation::Sinatra::Prepend
|
26
|
+
else
|
27
|
+
chain_instrument NewRelic::Agent::Instrumentation::Sinatra::Chain
|
39
28
|
end
|
40
29
|
|
41
|
-
|
42
|
-
|
43
|
-
end
|
30
|
+
Sinatra::Base.class_eval { register NewRelic::Agent::Instrumentation::Sinatra::Ignorer }
|
31
|
+
Sinatra.module_eval { register NewRelic::Agent::Instrumentation::Sinatra::Ignorer }
|
44
32
|
end
|
45
33
|
|
46
34
|
executes do
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
::Sinatra::Base.class_eval do
|
54
|
-
class << self
|
55
|
-
alias build_without_newrelic build
|
56
|
-
alias build build_with_newrelic
|
57
|
-
end
|
58
|
-
end
|
35
|
+
# These requires are inside an executes block because they require rack, and
|
36
|
+
# we can't be sure that rack is available when this file is first required.
|
37
|
+
require 'new_relic/rack/agent_hooks'
|
38
|
+
require 'new_relic/rack/browser_monitoring'
|
39
|
+
if use_prepend?
|
40
|
+
prepend_instrument Sinatra::Base.singleton_class, NewRelic::Agent::Instrumentation::Sinatra::Build::Prepend
|
59
41
|
else
|
60
|
-
|
42
|
+
chain_instrument NewRelic::Agent::Instrumentation::Sinatra::Build::Chain
|
61
43
|
end
|
62
44
|
end
|
63
|
-
end
|
64
|
-
|
65
|
-
module NewRelic
|
66
|
-
module Agent
|
67
|
-
module Instrumentation
|
68
|
-
# NewRelic instrumentation for Sinatra applications. Sinatra actions will
|
69
|
-
# appear in the UI similar to controller actions, and have breakdown charts
|
70
|
-
# and transaction traces.
|
71
|
-
#
|
72
|
-
# The actions in the UI will correspond to the pattern expression used
|
73
|
-
# to match them, not directly to full URL's.
|
74
|
-
module Sinatra
|
75
|
-
include ::NewRelic::Agent::Instrumentation::ControllerInstrumentation
|
76
|
-
|
77
|
-
# Expected method for supporting ControllerInstrumentation
|
78
|
-
def newrelic_request_headers(_)
|
79
|
-
request.env
|
80
|
-
end
|
81
|
-
|
82
|
-
def self.included(clazz)
|
83
|
-
clazz.extend(ClassMethods)
|
84
|
-
end
|
85
|
-
|
86
|
-
module ClassMethods
|
87
|
-
def newrelic_middlewares
|
88
|
-
middlewares = [NewRelic::Rack::BrowserMonitoring]
|
89
|
-
if NewRelic::Rack::AgentHooks.needed?
|
90
|
-
middlewares << NewRelic::Rack::AgentHooks
|
91
|
-
end
|
92
|
-
middlewares
|
93
|
-
end
|
94
45
|
|
95
|
-
|
96
|
-
|
97
|
-
newrelic_middlewares.each do |middleware_class|
|
98
|
-
try_to_use(self, middleware_class)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
build_without_newrelic(*args, &block)
|
102
|
-
end
|
103
|
-
|
104
|
-
def try_to_use(app, clazz)
|
105
|
-
has_middleware = app.middleware.any? { |info| info[0] == clazz }
|
106
|
-
app.use(clazz) unless has_middleware
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
# Capture last route we've seen. Will set for transaction on route_eval
|
111
|
-
def process_route_with_newrelic(*args, &block)
|
112
|
-
begin
|
113
|
-
env["newrelic.last_route"] = args[0]
|
114
|
-
rescue => e
|
115
|
-
::NewRelic::Agent.logger.debug("Failed determining last route in Sinatra", e)
|
116
|
-
end
|
117
|
-
|
118
|
-
process_route_without_newrelic(*args, &block)
|
119
|
-
end
|
120
|
-
|
121
|
-
# If a transaction name is already set, this call will tromple over it.
|
122
|
-
# This is intentional, as typically passing to a separate route is like
|
123
|
-
# an entirely separate transaction, so we pick up the new name.
|
124
|
-
#
|
125
|
-
# If we're ignored, this remains safe, since set_transaction_name
|
126
|
-
# care for the gating on the transaction's existence for us.
|
127
|
-
def route_eval_with_newrelic(*args, &block)
|
128
|
-
begin
|
129
|
-
txn_name = TransactionNamer.transaction_name_for_route(env, request)
|
130
|
-
unless txn_name.nil?
|
131
|
-
::NewRelic::Agent::Transaction.set_default_transaction_name(
|
132
|
-
"#{self.class.name}/#{txn_name}", :sinatra)
|
133
|
-
end
|
134
|
-
rescue => e
|
135
|
-
::NewRelic::Agent.logger.debug("Failed during route_eval to set transaction name", e)
|
136
|
-
end
|
137
|
-
|
138
|
-
route_eval_without_newrelic(*args, &block)
|
139
|
-
end
|
140
|
-
|
141
|
-
def dispatch_with_newrelic #THREAD_LOCAL_ACCESS
|
142
|
-
request_params = get_request_params
|
143
|
-
filtered_params = ParameterFiltering::apply_filters(request.env, request_params || {})
|
144
|
-
|
145
|
-
name = TransactionNamer.initial_transaction_name(request)
|
146
|
-
perform_action_with_newrelic_trace(:category => :sinatra,
|
147
|
-
:name => name,
|
148
|
-
:params => filtered_params) do
|
149
|
-
dispatch_and_notice_errors_with_newrelic
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
def get_request_params
|
154
|
-
begin
|
155
|
-
@request.params
|
156
|
-
rescue => e
|
157
|
-
NewRelic::Agent.logger.debug("Failed to get params from Rack request.", e)
|
158
|
-
nil
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
def dispatch_and_notice_errors_with_newrelic
|
163
|
-
dispatch_without_newrelic
|
164
|
-
ensure
|
165
|
-
# Will only see an error raised if :show_exceptions is true, but
|
166
|
-
# will always see them in the env hash if they occur
|
167
|
-
had_error = env.has_key?('sinatra.error')
|
168
|
-
::NewRelic::Agent.notice_error(env['sinatra.error']) if had_error
|
169
|
-
end
|
170
|
-
|
171
|
-
def do_not_trace?
|
172
|
-
Ignorer.should_ignore?(self, :routes)
|
173
|
-
end
|
174
|
-
|
175
|
-
# Overrides ControllerInstrumentation implementation
|
176
|
-
def ignore_apdex?
|
177
|
-
Ignorer.should_ignore?(self, :apdex)
|
178
|
-
end
|
46
|
+
executes do
|
47
|
+
next unless Gem::Version.new(Sinatra::VERSION) < Gem::Version.new('2.0.0')
|
179
48
|
|
180
|
-
|
181
|
-
|
182
|
-
Ignorer.should_ignore?(self, :enduser)
|
183
|
-
end
|
49
|
+
deprecation_msg = 'The Ruby Agent is dropping support for Sinatra versions below 2.0.0 ' \
|
50
|
+
'in version 9.0.0. Please upgrade your Sinatra version to continue receiving full compatibility. ' \
|
184
51
|
|
185
|
-
|
186
|
-
|
52
|
+
NewRelic::Agent.logger.log_once(
|
53
|
+
:warn,
|
54
|
+
:deprecated_sinatra_version,
|
55
|
+
deprecation_msg
|
56
|
+
)
|
187
57
|
end
|
188
58
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative 'instrumentation'
|
6
|
+
|
7
|
+
module NewRelic::Agent::Instrumentation
|
8
|
+
module MonitoredThread
|
9
|
+
module Chain
|
10
|
+
def self.instrument!
|
11
|
+
::Thread.class_eval do
|
12
|
+
include NewRelic::Agent::Instrumentation::MonitoredThread
|
13
|
+
|
14
|
+
alias_method(:initialize_without_new_relic, :initialize)
|
15
|
+
|
16
|
+
def initialize(*args, &block)
|
17
|
+
traced_block = add_thread_tracing(*args, &block)
|
18
|
+
initialize_with_newrelic_tracing { initialize_without_new_relic(*args, &traced_block) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,28 @@
|
|
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 Instrumentation
|
8
|
+
module MonitoredThread
|
9
|
+
attr_reader :nr_parent_key
|
10
|
+
|
11
|
+
def initialize_with_newrelic_tracing
|
12
|
+
@nr_parent_key = NewRelic::Agent::Tracer.current_segment_key
|
13
|
+
yield
|
14
|
+
end
|
15
|
+
|
16
|
+
def add_thread_tracing(*args, &block)
|
17
|
+
return block if !NewRelic::Agent::Tracer.thread_tracing_enabled?
|
18
|
+
|
19
|
+
NewRelic::Agent::Tracer.thread_block_with_current_transaction(
|
20
|
+
*args,
|
21
|
+
segment_name: 'Ruby/Thread',
|
22
|
+
&block
|
23
|
+
)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative 'instrumentation'
|
6
|
+
|
7
|
+
module NewRelic
|
8
|
+
module Agent
|
9
|
+
module Instrumentation
|
10
|
+
module MonitoredThread
|
11
|
+
module Prepend
|
12
|
+
include NewRelic::Agent::Instrumentation::MonitoredThread
|
13
|
+
|
14
|
+
def initialize(*args, &block)
|
15
|
+
traced_block = add_thread_tracing(*args, &block)
|
16
|
+
initialize_with_newrelic_tracing { super(*args, &traced_block) }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative 'thread/chain'
|
6
|
+
require_relative 'thread/prepend'
|
7
|
+
|
8
|
+
DependencyDetection.defer do
|
9
|
+
named :thread
|
10
|
+
|
11
|
+
executes do
|
12
|
+
NewRelic::Agent.logger.info('Installing Thread Instrumentation')
|
13
|
+
|
14
|
+
if use_prepend?
|
15
|
+
prepend_instrument Thread, NewRelic::Agent::Instrumentation::MonitoredThread::Prepend
|
16
|
+
else
|
17
|
+
chain_instrument NewRelic::Agent::Instrumentation::MonitoredThread::Chain
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module Tilt
|
7
|
+
module Chain
|
8
|
+
def self.instrument!
|
9
|
+
::Tilt::Template.module_eval do
|
10
|
+
include NewRelic::Agent::Instrumentation::Tilt
|
11
|
+
|
12
|
+
def render_with_new_relic(*args, &block)
|
13
|
+
render_with_tracing(*args) {
|
14
|
+
render_without_newrelic(*args, &block)
|
15
|
+
}
|
16
|
+
end
|
17
|
+
|
18
|
+
alias render_without_newrelic render
|
19
|
+
alias render render_with_new_relic
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,41 @@
|
|
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 Instrumentation
|
8
|
+
module Tilt
|
9
|
+
def metric_name(klass, file)
|
10
|
+
"View/#{klass}/#{file}/Rendering"
|
11
|
+
end
|
12
|
+
|
13
|
+
# Sinatra uses #caller_locations for the file name in Tilt (unlike Rails/Rack)
|
14
|
+
# So here we are only grabbing the file name and name of directory it is in
|
15
|
+
def create_filename_for_metric(file)
|
16
|
+
return file unless defined?(::Sinatra) && defined?(::Sinatra::Base)
|
17
|
+
|
18
|
+
file.split('/')[-2..-1].join('/')
|
19
|
+
rescue NoMethodError
|
20
|
+
file
|
21
|
+
end
|
22
|
+
|
23
|
+
def render_with_tracing(*args, &block)
|
24
|
+
begin
|
25
|
+
finishable = Tracer.start_segment(
|
26
|
+
name: metric_name(self.class, create_filename_for_metric(self.file))
|
27
|
+
)
|
28
|
+
begin
|
29
|
+
yield
|
30
|
+
rescue => error
|
31
|
+
NewRelic::Agent.notice_error(error)
|
32
|
+
raise
|
33
|
+
end
|
34
|
+
ensure
|
35
|
+
finishable.finish if finishable
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,13 @@
|
|
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::Agent::Instrumentation
|
6
|
+
module Tilt::Prepend
|
7
|
+
include NewRelic::Agent::Instrumentation::Tilt
|
8
|
+
|
9
|
+
def render(*args, &block)
|
10
|
+
render_with_tracing { super }
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|