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
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
require_relative 'request_wrapper'
|
6
|
+
require_relative '../helper'
|
7
|
+
|
8
|
+
module NewRelic
|
9
|
+
module Agent
|
10
|
+
module Instrumentation
|
11
|
+
module GRPC
|
12
|
+
module Client
|
13
|
+
include NewRelic::Agent::Instrumentation::GRPC::Helper
|
14
|
+
|
15
|
+
def issue_request_with_tracing(grpc_type, method, requests, marshal, unmarshal,
|
16
|
+
deadline:, return_op:, parent:, credentials:, metadata:)
|
17
|
+
return yield unless trace_with_newrelic?
|
18
|
+
|
19
|
+
segment = request_segment(method)
|
20
|
+
request_wrapper = NewRelic::Agent::Instrumentation::GRPC::Client::RequestWrapper.new(@host)
|
21
|
+
segment.add_request_headers(request_wrapper)
|
22
|
+
metadata.merge!(request_wrapper.instance_variable_get(:@newrelic_metadata))
|
23
|
+
grpc_message = nil
|
24
|
+
grpc_status = 0
|
25
|
+
|
26
|
+
NewRelic::Agent.disable_all_tracing do
|
27
|
+
begin
|
28
|
+
yield
|
29
|
+
rescue => e
|
30
|
+
NewRelic::Agent.notice_error(e)
|
31
|
+
grpc_status, grpc_message = grpc_status_and_message_from_exception(e)
|
32
|
+
raise
|
33
|
+
end
|
34
|
+
end
|
35
|
+
ensure
|
36
|
+
add_attributes(segment, grpc_message: grpc_message, grpc_status: grpc_status, grpc_type: grpc_type)
|
37
|
+
::NewRelic::Agent::Transaction::Segment.finish(segment)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def add_attributes(segment, attributes_hash)
|
43
|
+
return unless segment
|
44
|
+
|
45
|
+
attributes_hash.each do |attr, value|
|
46
|
+
segment.add_agent_attribute(attr, value)
|
47
|
+
end
|
48
|
+
segment.record_agent_attributes = true
|
49
|
+
end
|
50
|
+
|
51
|
+
def grpc_status_and_message_from_exception(exception)
|
52
|
+
return unless exception.message =~ /^(\d+):(\w+)\./
|
53
|
+
|
54
|
+
[Regexp.last_match(1).to_i, Regexp.last_match(2)]
|
55
|
+
end
|
56
|
+
|
57
|
+
def request_segment(method)
|
58
|
+
cleaned = cleaned_method(method)
|
59
|
+
NewRelic::Agent::Tracer.start_external_request_segment(
|
60
|
+
library: 'gRPC',
|
61
|
+
uri: method_uri(cleaned),
|
62
|
+
procedure: cleaned
|
63
|
+
)
|
64
|
+
end
|
65
|
+
|
66
|
+
def method_uri(method)
|
67
|
+
return unless @host && method
|
68
|
+
|
69
|
+
"grpc://#{@host}/#{method}"
|
70
|
+
end
|
71
|
+
|
72
|
+
def interceptor?
|
73
|
+
self.class.name.eql?('GRPC::InterceptorRegistry')
|
74
|
+
end
|
75
|
+
|
76
|
+
def trace_with_newrelic?
|
77
|
+
return @trace_with_newrelic unless @trace_with_newrelic.nil? # check for nil, not false
|
78
|
+
|
79
|
+
@trace_with_newrelic = if interceptor?
|
80
|
+
false
|
81
|
+
else
|
82
|
+
!host_denylisted?(@host)
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
require_relative 'instrumentation'
|
6
|
+
|
7
|
+
module NewRelic
|
8
|
+
module Agent
|
9
|
+
module Instrumentation
|
10
|
+
module GRPC
|
11
|
+
module Client
|
12
|
+
module Prepend
|
13
|
+
include NewRelic::Agent::Instrumentation::GRPC::Client
|
14
|
+
|
15
|
+
def bidi_streamer(method, requests, marshal, unmarshal,
|
16
|
+
deadline: nil,
|
17
|
+
return_op: false,
|
18
|
+
parent: nil,
|
19
|
+
credentials: nil,
|
20
|
+
metadata: {},
|
21
|
+
&blk)
|
22
|
+
|
23
|
+
issue_request_with_tracing(:bidi_streamer, method, requests, marshal, unmarshal,
|
24
|
+
deadline: deadline,
|
25
|
+
return_op: return_op,
|
26
|
+
parent: parent,
|
27
|
+
credentials: credentials,
|
28
|
+
metadata: metadata) do
|
29
|
+
super(method, requests, marshal, unmarshal,
|
30
|
+
deadline: deadline,
|
31
|
+
return_op: return_op,
|
32
|
+
parent: parent,
|
33
|
+
credentials: credentials,
|
34
|
+
metadata: metadata,
|
35
|
+
&blk)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def client_streamer(method, requests, marshal, unmarshal,
|
40
|
+
deadline: nil,
|
41
|
+
return_op: false,
|
42
|
+
parent: nil,
|
43
|
+
credentials: nil,
|
44
|
+
metadata: {})
|
45
|
+
|
46
|
+
issue_request_with_tracing(:client_streamer, method, requests, marshal, unmarshal,
|
47
|
+
deadline: deadline,
|
48
|
+
return_op: return_op,
|
49
|
+
parent: parent,
|
50
|
+
credentials: credentials,
|
51
|
+
metadata: metadata) do
|
52
|
+
super(method, requests, marshal, unmarshal,
|
53
|
+
deadline: deadline,
|
54
|
+
return_op: return_op,
|
55
|
+
parent: parent,
|
56
|
+
credentials: credentials,
|
57
|
+
metadata: metadata)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def request_response(method, req, marshal, unmarshal,
|
62
|
+
deadline: nil,
|
63
|
+
return_op: false,
|
64
|
+
parent: nil,
|
65
|
+
credentials: nil,
|
66
|
+
metadata: {})
|
67
|
+
|
68
|
+
issue_request_with_tracing(:request_response, method, req, marshal, unmarshal,
|
69
|
+
deadline: deadline,
|
70
|
+
return_op: return_op,
|
71
|
+
parent: parent,
|
72
|
+
credentials: credentials,
|
73
|
+
metadata: metadata) do
|
74
|
+
super(method, req, marshal, unmarshal,
|
75
|
+
deadline: deadline,
|
76
|
+
return_op: return_op,
|
77
|
+
parent: parent,
|
78
|
+
credentials: credentials,
|
79
|
+
metadata: metadata)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def server_streamer(method, req, marshal, unmarshal,
|
84
|
+
deadline: nil,
|
85
|
+
return_op: false,
|
86
|
+
parent: nil,
|
87
|
+
credentials: nil,
|
88
|
+
metadata: {},
|
89
|
+
&blk)
|
90
|
+
|
91
|
+
issue_request_with_tracing(:server_streamer, method, req, marshal, unmarshal,
|
92
|
+
deadline: deadline,
|
93
|
+
return_op: return_op,
|
94
|
+
parent: parent,
|
95
|
+
credentials: credentials,
|
96
|
+
metadata: metadata) do
|
97
|
+
super(method, req, marshal, unmarshal,
|
98
|
+
deadline: deadline,
|
99
|
+
return_op: return_op,
|
100
|
+
parent: parent,
|
101
|
+
credentials: credentials,
|
102
|
+
metadata: metadata,
|
103
|
+
&blk)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
module NewRelic
|
6
|
+
module Agent
|
7
|
+
module Instrumentation
|
8
|
+
module GRPC
|
9
|
+
module Client
|
10
|
+
class RequestWrapper
|
11
|
+
attr_reader :newrelic_metadata
|
12
|
+
|
13
|
+
def initialize(host)
|
14
|
+
@host = host
|
15
|
+
@newrelic_metadata = {}
|
16
|
+
end
|
17
|
+
|
18
|
+
def host_from_header
|
19
|
+
@host
|
20
|
+
end
|
21
|
+
|
22
|
+
def []=(key, value)
|
23
|
+
@newrelic_metadata[key] = value
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,32 @@
|
|
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 GRPC
|
9
|
+
module Helper
|
10
|
+
NR_8T_HOST_PATTERN = %r{tracing\.(?:staging-)?edge\.nr-data}.freeze
|
11
|
+
|
12
|
+
def cleaned_method(method)
|
13
|
+
method = method.to_s unless method.is_a?(String)
|
14
|
+
return method unless method.start_with?('/')
|
15
|
+
|
16
|
+
method[1..-1]
|
17
|
+
end
|
18
|
+
|
19
|
+
def host_denylisted?(host)
|
20
|
+
return false unless host
|
21
|
+
|
22
|
+
ignore_patterns.any? { |regex| host.match?(regex) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def ignore_patterns
|
26
|
+
([NR_8T_HOST_PATTERN] + NewRelic::Agent.config[:'instrumentation.grpc.host_denylist']).freeze
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,69 @@
|
|
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 GRPC
|
9
|
+
module Server
|
10
|
+
module Chain
|
11
|
+
def self.instrument!
|
12
|
+
# BEGIN RpcServer
|
13
|
+
::GRPC::RpcServer.class_eval do
|
14
|
+
include NewRelic::Agent::Instrumentation::GRPC::Server
|
15
|
+
|
16
|
+
def add_http2_port_with_newrelic_trace(*args)
|
17
|
+
add_http2_port_with_tracing(*args) { add_http2_port_without_newrelic_trace(*args) }
|
18
|
+
end
|
19
|
+
|
20
|
+
alias add_http2_port_without_newrelic_trace add_http2_port
|
21
|
+
alias add_http2_port add_http2_port_with_newrelic_trace
|
22
|
+
|
23
|
+
def run_with_newrelic_trace(*args)
|
24
|
+
run_with_tracing(*args) { run_without_newrelic_trace(*args) }
|
25
|
+
end
|
26
|
+
|
27
|
+
alias run_without_newrelic_trace run
|
28
|
+
alias run run_with_newrelic_trace
|
29
|
+
# END RpcServer
|
30
|
+
end
|
31
|
+
|
32
|
+
# BEGIN RpcDesc
|
33
|
+
::GRPC::RpcDesc.class_eval do
|
34
|
+
include NewRelic::Agent::Instrumentation::GRPC::Server
|
35
|
+
|
36
|
+
def handle_request_response_with_newrelic_trace(active_call, mth, inter_ctx)
|
37
|
+
handle_with_tracing(:request_response, active_call, mth, inter_ctx) { handle_request_response_without_newrelic_trace(active_call, mth, inter_ctx) }
|
38
|
+
end
|
39
|
+
|
40
|
+
alias handle_request_response_without_newrelic_trace handle_request_response
|
41
|
+
alias handle_request_response handle_request_response_with_newrelic_trace
|
42
|
+
|
43
|
+
def handle_client_streamer_with_newrelic_trace(active_call, mth, inter_ctx)
|
44
|
+
handle_with_tracing(:client_streamer, active_call, mth, inter_ctx) { handle_client_streamer_without_newrelic_trace(active_call, mth, inter_ctx) }
|
45
|
+
end
|
46
|
+
|
47
|
+
alias handle_client_streamer_without_newrelic_trace handle_client_streamer
|
48
|
+
alias handle_client_streamer handle_client_streamer_with_newrelic_trace
|
49
|
+
|
50
|
+
def handle_server_streamer_with_newrelic_trace(active_call, mth, inter_ctx)
|
51
|
+
handle_with_tracing(:server_streamer, active_call, mth, inter_ctx) { handle_server_streamer_without_newrelic_trace(active_call, mth, inter_ctx) }
|
52
|
+
end
|
53
|
+
|
54
|
+
alias handle_server_streamer_without_newrelic_trace handle_server_streamer
|
55
|
+
alias handle_server_streamer handle_server_streamer_with_newrelic_trace
|
56
|
+
|
57
|
+
def handle_bidi_streamer_with_newrelic_trace(active_call, mth, inter_ctx)
|
58
|
+
handle_with_tracing(:bidi_streamer, active_call, mth, inter_ctx) { handle_bidi_streamer_without_newrelic_trace(active_call, mth, inter_ctx) }
|
59
|
+
end
|
60
|
+
|
61
|
+
alias handle_bidi_streamer_without_newrelic_trace handle_bidi_streamer
|
62
|
+
alias handle_bidi_streamer handle_bidi_streamer_with_newrelic_trace
|
63
|
+
# END RpcDesc
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
require_relative '../helper'
|
6
|
+
|
7
|
+
module NewRelic
|
8
|
+
module Agent
|
9
|
+
module Instrumentation
|
10
|
+
module GRPC
|
11
|
+
module Server
|
12
|
+
include NewRelic::Agent::Instrumentation::GRPC::Helper
|
13
|
+
|
14
|
+
DT_KEYS = [NewRelic::NEWRELIC_KEY, NewRelic::TRACEPARENT_KEY, NewRelic::TRACESTATE_KEY].freeze
|
15
|
+
INSTANCE_VAR_HOST = :@host_nr
|
16
|
+
INSTANCE_VAR_PORT = :@port_nr
|
17
|
+
INSTANCE_VAR_METHOD = :@method_nr
|
18
|
+
CATEGORY = :web
|
19
|
+
DESTINATIONS = AttributeFilter::DST_TRANSACTION_TRACER |
|
20
|
+
AttributeFilter::DST_TRANSACTION_EVENTS |
|
21
|
+
AttributeFilter::DST_ERROR_COLLECTOR
|
22
|
+
|
23
|
+
def handle_with_tracing(streamer_type, active_call, mth, _inter_ctx)
|
24
|
+
return yield unless trace_with_newrelic?
|
25
|
+
|
26
|
+
metadata = metadata_for_call(active_call)
|
27
|
+
txn = NewRelic::Agent::Transaction.start_new_transaction(NewRelic::Agent::Tracer.state,
|
28
|
+
CATEGORY,
|
29
|
+
trace_options)
|
30
|
+
add_attributes(txn, metadata, streamer_type)
|
31
|
+
process_distributed_tracing_headers(metadata)
|
32
|
+
|
33
|
+
begin
|
34
|
+
yield
|
35
|
+
rescue => e
|
36
|
+
NewRelic::Agent.notice_error(e)
|
37
|
+
raise
|
38
|
+
end
|
39
|
+
ensure
|
40
|
+
txn.finish if txn
|
41
|
+
end
|
42
|
+
|
43
|
+
def add_http2_port_with_tracing(*args)
|
44
|
+
set_host_and_port_on_server_instance(args.first)
|
45
|
+
yield
|
46
|
+
end
|
47
|
+
|
48
|
+
def run_with_tracing(*args)
|
49
|
+
set_host_and_port_and_method_info_on_desc
|
50
|
+
yield
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def add_attributes(txn, metadata, streamer_type)
|
56
|
+
grpc_params(metadata, streamer_type).each do |attr, value|
|
57
|
+
txn.add_agent_attribute(attr, value, DESTINATIONS)
|
58
|
+
txn.current_segment.add_agent_attribute(attr, value) if txn.current_segment
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def metadata_for_call(active_call)
|
63
|
+
return NewRelic::EMPTY_HASH unless active_call && active_call.metadata
|
64
|
+
|
65
|
+
active_call.metadata
|
66
|
+
end
|
67
|
+
|
68
|
+
def process_distributed_tracing_headers(metadata)
|
69
|
+
return unless metadata && !metadata.empty?
|
70
|
+
|
71
|
+
::NewRelic::Agent::DistributedTracing::accept_distributed_trace_headers(metadata, 'Other')
|
72
|
+
end
|
73
|
+
|
74
|
+
def host_and_port_from_host_string(host_string)
|
75
|
+
return unless host_string
|
76
|
+
|
77
|
+
info = host_string.split(':').freeze
|
78
|
+
return unless info.size == 2
|
79
|
+
|
80
|
+
info
|
81
|
+
end
|
82
|
+
|
83
|
+
def set_host_and_port_on_server_instance(host_string)
|
84
|
+
info = host_and_port_from_host_string(host_string)
|
85
|
+
return unless info
|
86
|
+
|
87
|
+
instance_variable_set(INSTANCE_VAR_HOST, info.first)
|
88
|
+
instance_variable_set(INSTANCE_VAR_PORT, info.last)
|
89
|
+
end
|
90
|
+
|
91
|
+
def set_host_and_port_and_method_info_on_desc
|
92
|
+
rpc_descs.each do |method, desc|
|
93
|
+
desc.instance_variable_set(INSTANCE_VAR_HOST, instance_variable_get(INSTANCE_VAR_HOST))
|
94
|
+
desc.instance_variable_set(INSTANCE_VAR_PORT, instance_variable_get(INSTANCE_VAR_PORT))
|
95
|
+
desc.instance_variable_set(INSTANCE_VAR_METHOD, cleaned_method(method))
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def grpc_headers(metadata)
|
100
|
+
metadata.reject { |k, v| DT_KEYS.include?(k) }
|
101
|
+
end
|
102
|
+
|
103
|
+
def grpc_params(metadata, streamer_type)
|
104
|
+
host = instance_variable_get(INSTANCE_VAR_HOST)
|
105
|
+
port = instance_variable_get(INSTANCE_VAR_PORT)
|
106
|
+
method = instance_variable_get(INSTANCE_VAR_METHOD)
|
107
|
+
{'request.headers': grpc_headers(metadata),
|
108
|
+
'request.uri': "grpc://#{host}:#{port}/#{method}",
|
109
|
+
'request.method': method,
|
110
|
+
'request.grpc_type': streamer_type}
|
111
|
+
end
|
112
|
+
|
113
|
+
def trace_options
|
114
|
+
method = instance_variable_get(INSTANCE_VAR_METHOD)
|
115
|
+
{category: CATEGORY, transaction_name: "Controller/#{method}"}
|
116
|
+
end
|
117
|
+
|
118
|
+
def trace_with_newrelic?
|
119
|
+
do_trace = instance_variable_get(:@trace_with_newrelic)
|
120
|
+
return do_trace unless do_trace.nil? # check for nil, not falsey
|
121
|
+
|
122
|
+
host = instance_variable_get(INSTANCE_VAR_HOST)
|
123
|
+
return true unless host
|
124
|
+
|
125
|
+
do_trace = !host_denylisted?(host)
|
126
|
+
instance_variable_set(:@trace_with_newrelic, do_trace)
|
127
|
+
|
128
|
+
do_trace
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -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
|
+
require_relative 'instrumentation'
|
6
|
+
|
7
|
+
module NewRelic
|
8
|
+
module Agent
|
9
|
+
module Instrumentation
|
10
|
+
module GRPC
|
11
|
+
module Server
|
12
|
+
module RpcDescPrepend
|
13
|
+
include NewRelic::Agent::Instrumentation::GRPC::Server
|
14
|
+
|
15
|
+
def handle_request_response(active_call, mth, inter_ctx)
|
16
|
+
handle_with_tracing(:request_response, active_call, mth, inter_ctx) { super }
|
17
|
+
end
|
18
|
+
|
19
|
+
def handle_client_streamer(active_call, mth, inter_ctx)
|
20
|
+
handle_with_tracing(:client_streamer, active_call, mth, inter_ctx) { super }
|
21
|
+
end
|
22
|
+
|
23
|
+
def handle_server_streamer(active_call, mth, inter_ctx)
|
24
|
+
handle_with_tracing(:server_streamer, active_call, mth, inter_ctx) { super }
|
25
|
+
end
|
26
|
+
|
27
|
+
def handle_bidi_streamer(active_call, mth, inter_ctx)
|
28
|
+
handle_with_tracing(:bidi_streamer, active_call, mth, inter_ctx) { super }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,26 @@
|
|
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 GRPC
|
11
|
+
module Server
|
12
|
+
module RpcServerPrepend
|
13
|
+
include NewRelic::Agent::Instrumentation::GRPC::Server
|
14
|
+
def add_http2_port(*args)
|
15
|
+
add_http2_port_with_tracing(*args) { super }
|
16
|
+
end
|
17
|
+
|
18
|
+
def run(*args)
|
19
|
+
run_with_tracing(*args) { super }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
require_relative 'grpc/client/chain'
|
6
|
+
require_relative 'grpc/client/prepend'
|
7
|
+
|
8
|
+
DependencyDetection.defer do
|
9
|
+
named :grpc_client
|
10
|
+
|
11
|
+
depends_on do
|
12
|
+
defined?(GRPC) && defined?(GRPC::ClientStub)
|
13
|
+
end
|
14
|
+
|
15
|
+
executes do
|
16
|
+
supportability_name = 'gRPC_Client'
|
17
|
+
if use_prepend?
|
18
|
+
prepend_instrument GRPC::ClientStub, NewRelic::Agent::Instrumentation::GRPC::Client::Prepend, supportability_name
|
19
|
+
else
|
20
|
+
chain_instrument NewRelic::Agent::Instrumentation::GRPC::Client::Chain, supportability_name
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# This file is distributed under New Relic's license terms.
|
3
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
4
|
+
|
5
|
+
require_relative 'grpc/server/chain'
|
6
|
+
require_relative 'grpc/server/rpc_server_prepend'
|
7
|
+
require_relative 'grpc/server/rpc_desc_prepend'
|
8
|
+
|
9
|
+
DependencyDetection.defer do
|
10
|
+
named :grpc_server
|
11
|
+
|
12
|
+
depends_on do
|
13
|
+
defined?(GRPC) && defined?(GRPC::RpcServer) && defined?(GRPC::RpcDesc)
|
14
|
+
end
|
15
|
+
|
16
|
+
executes do
|
17
|
+
supportability_name = 'gRPC_Server'
|
18
|
+
if use_prepend?
|
19
|
+
prepend_instrument GRPC::RpcServer, NewRelic::Agent::Instrumentation::GRPC::Server::RpcServerPrepend, supportability_name
|
20
|
+
prepend_instrument GRPC::RpcDesc, NewRelic::Agent::Instrumentation::GRPC::Server::RpcDescPrepend, supportability_name
|
21
|
+
else
|
22
|
+
chain_instrument NewRelic::Agent::Instrumentation::GRPC::Server::Chain, supportability_name
|
23
|
+
end
|
24
|
+
end
|
25
|
+
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 HTTPClient
|
7
|
+
module Chain
|
8
|
+
def self.instrument!
|
9
|
+
::HTTPClient.class_eval do
|
10
|
+
include NewRelic::Agent::Instrumentation::HTTPClient::Instrumentation
|
11
|
+
|
12
|
+
def do_get_block_with_newrelic(req, proxy, conn, &block)
|
13
|
+
with_tracing(req, conn) do
|
14
|
+
do_get_block_without_newrelic(req, proxy, conn, &block)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
alias :do_get_block_without_newrelic :do_get_block
|
19
|
+
alias :do_get_block :do_get_block_with_newrelic
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,37 @@
|
|
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 HTTPClient
|
7
|
+
module Instrumentation
|
8
|
+
def with_tracing(request, connection)
|
9
|
+
wrapped_request = NewRelic::Agent::HTTPClients::HTTPClientRequest.new(request)
|
10
|
+
segment = NewRelic::Agent::Tracer.start_external_request_segment(
|
11
|
+
library: wrapped_request.type,
|
12
|
+
uri: wrapped_request.uri,
|
13
|
+
procedure: wrapped_request.method
|
14
|
+
)
|
15
|
+
|
16
|
+
begin
|
17
|
+
response = nil
|
18
|
+
segment.add_request_headers(wrapped_request)
|
19
|
+
|
20
|
+
NewRelic::Agent::Tracer.capture_segment_error(segment) do
|
21
|
+
yield
|
22
|
+
end
|
23
|
+
|
24
|
+
response = connection.pop
|
25
|
+
connection.push(response)
|
26
|
+
|
27
|
+
wrapped_response = ::NewRelic::Agent::HTTPClients::HTTPClientResponse.new(response)
|
28
|
+
segment.process_response_headers(wrapped_response)
|
29
|
+
|
30
|
+
response
|
31
|
+
ensure
|
32
|
+
::NewRelic::Agent::Transaction::Segment.finish(segment)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# This file is distributed under New Relic's license terms.
|
2
|
+
# See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
module NewRelic::Agent::Instrumentation
|
6
|
+
module HTTPClient
|
7
|
+
module Prepend
|
8
|
+
include NewRelic::Agent::Instrumentation::HTTPClient::Instrumentation
|
9
|
+
|
10
|
+
def do_get_block(req, proxy, conn, &block)
|
11
|
+
with_tracing(req, conn) { super }
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|