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.
Files changed (476) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +15 -1
  3. data/.rubocop.yml +1919 -0
  4. data/.rubocop_todo.yml +100 -0
  5. data/.simplecov +15 -0
  6. data/.snyk +11 -0
  7. data/.yardopts +2 -0
  8. data/Brewfile +12 -0
  9. data/CHANGELOG.md +4056 -2339
  10. data/CONTRIBUTING.md +132 -19
  11. data/DOCKER.md +167 -0
  12. data/Dockerfile +10 -0
  13. data/Gemfile +5 -2
  14. data/Guardfile +22 -4
  15. data/LICENSE +202 -38
  16. data/README.md +87 -87
  17. data/Rakefile +27 -27
  18. data/THIRD_PARTY_NOTICES.md +28 -0
  19. data/Thorfile +5 -0
  20. data/bin/newrelic +3 -2
  21. data/bin/newrelic_cmd +1 -0
  22. data/bin/nrdebug +77 -54
  23. data/config.dot +5 -5
  24. data/docker-compose.yml +107 -0
  25. data/init.rb +5 -7
  26. data/install.rb +3 -3
  27. data/lefthook.yml +9 -0
  28. data/lib/new_relic/agent/adaptive_sampler.rb +14 -10
  29. data/lib/new_relic/agent/agent.rb +125 -969
  30. data/lib/new_relic/agent/agent_helpers/connect.rb +227 -0
  31. data/lib/new_relic/agent/agent_helpers/harvest.rb +153 -0
  32. data/lib/new_relic/agent/agent_helpers/shutdown.rb +72 -0
  33. data/lib/new_relic/agent/agent_helpers/special_startup.rb +74 -0
  34. data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +167 -0
  35. data/lib/new_relic/agent/agent_helpers/startup.rb +202 -0
  36. data/lib/new_relic/agent/agent_helpers/transmit.rb +76 -0
  37. data/lib/new_relic/agent/agent_logger.rb +26 -18
  38. data/lib/new_relic/agent/attribute_filter.rb +69 -52
  39. data/lib/new_relic/agent/attribute_processing.rb +8 -8
  40. data/lib/new_relic/agent/attributes.rb +153 -0
  41. data/lib/new_relic/agent/audit_logger.rb +19 -4
  42. data/lib/new_relic/agent/autostart.rb +34 -28
  43. data/lib/new_relic/agent/chained_call.rb +2 -2
  44. data/lib/new_relic/agent/commands/agent_command.rb +4 -4
  45. data/lib/new_relic/agent/commands/agent_command_router.rb +15 -33
  46. data/lib/new_relic/agent/commands/thread_profiler_session.rb +13 -11
  47. data/lib/new_relic/agent/configuration/default_source.rb +1480 -1053
  48. data/lib/new_relic/agent/configuration/dotted_hash.rb +7 -6
  49. data/lib/new_relic/agent/configuration/environment_source.rb +15 -11
  50. data/lib/new_relic/agent/configuration/event_harvest_config.rb +68 -0
  51. data/lib/new_relic/agent/configuration/high_security_source.rb +9 -9
  52. data/lib/new_relic/agent/configuration/manager.rb +96 -79
  53. data/lib/new_relic/agent/configuration/manual_source.rb +2 -2
  54. data/lib/new_relic/agent/configuration/mask_defaults.rb +4 -4
  55. data/lib/new_relic/agent/configuration/security_policy_source.rb +83 -86
  56. data/lib/new_relic/agent/configuration/server_source.rb +49 -12
  57. data/lib/new_relic/agent/configuration/yaml_source.rb +42 -13
  58. data/lib/new_relic/agent/configuration.rb +2 -2
  59. data/lib/new_relic/agent/connect/request_builder.rb +61 -0
  60. data/lib/new_relic/agent/connect/response_handler.rb +58 -0
  61. data/lib/new_relic/agent/custom_event_aggregator.rb +15 -15
  62. data/lib/new_relic/agent/database/explain_plan_helpers.rb +5 -6
  63. data/lib/new_relic/agent/database/obfuscation_helpers.rb +16 -15
  64. data/lib/new_relic/agent/database/obfuscator.rb +3 -3
  65. data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +4 -4
  66. data/lib/new_relic/agent/database.rb +44 -53
  67. data/lib/new_relic/agent/database_adapter.rb +35 -0
  68. data/lib/new_relic/agent/datastores/metric_helper.rb +18 -20
  69. data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +9 -8
  70. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +7 -11
  71. data/lib/new_relic/agent/datastores/mongo.rb +7 -12
  72. data/lib/new_relic/agent/datastores/nosql_obfuscator.rb +41 -0
  73. data/lib/new_relic/agent/datastores/redis.rb +6 -12
  74. data/lib/new_relic/agent/datastores.rb +19 -23
  75. data/lib/new_relic/agent/deprecator.rb +2 -2
  76. data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +13 -12
  77. data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +87 -66
  78. data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +84 -0
  79. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
  80. data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +163 -0
  81. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +38 -0
  82. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +245 -0
  83. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +127 -0
  84. data/lib/new_relic/agent/distributed_tracing.rb +113 -32
  85. data/lib/new_relic/agent/encoding_normalizer.rb +5 -3
  86. data/lib/new_relic/agent/error_collector.rb +99 -63
  87. data/lib/new_relic/agent/error_event_aggregator.rb +10 -8
  88. data/lib/new_relic/agent/error_filter.rb +174 -0
  89. data/lib/new_relic/agent/error_trace_aggregator.rb +6 -4
  90. data/lib/new_relic/agent/event_aggregator.rb +43 -48
  91. data/lib/new_relic/agent/event_buffer.rb +8 -9
  92. data/lib/new_relic/agent/event_listener.rb +2 -3
  93. data/lib/new_relic/agent/event_loop.rb +27 -25
  94. data/lib/new_relic/agent/external.rb +20 -51
  95. data/lib/new_relic/agent/guid_generator.rb +30 -0
  96. data/lib/new_relic/agent/harvester.rb +5 -6
  97. data/lib/new_relic/agent/heap.rb +8 -10
  98. data/lib/new_relic/agent/hostname.rb +26 -5
  99. data/lib/new_relic/agent/http_clients/abstract.rb +81 -0
  100. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +26 -26
  101. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +31 -17
  102. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +18 -23
  103. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +12 -15
  104. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +24 -8
  105. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +9 -12
  106. data/lib/new_relic/agent/http_clients/uri_util.rb +12 -13
  107. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +22 -52
  108. data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +39 -0
  109. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +59 -72
  110. data/lib/new_relic/agent/instrumentation/action_dispatch.rb +31 -0
  111. data/lib/new_relic/agent/instrumentation/action_dispatch_subscriber.rb +64 -0
  112. data/lib/new_relic/agent/instrumentation/action_mailbox.rb +30 -0
  113. data/lib/new_relic/agent/instrumentation/action_mailbox_subscriber.rb +33 -0
  114. data/lib/new_relic/agent/instrumentation/action_mailer.rb +30 -0
  115. data/lib/new_relic/agent/instrumentation/action_mailer_subscriber.rb +85 -0
  116. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +86 -62
  117. data/lib/new_relic/agent/instrumentation/active_job.rb +38 -19
  118. data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +41 -0
  119. data/lib/new_relic/agent/instrumentation/active_merchant.rb +21 -7
  120. data/lib/new_relic/agent/instrumentation/active_record.rb +95 -46
  121. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +82 -61
  122. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +155 -0
  123. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +36 -12
  124. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +69 -64
  125. data/lib/new_relic/agent/instrumentation/active_storage.rb +8 -4
  126. data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +11 -32
  127. data/lib/new_relic/agent/instrumentation/active_support.rb +27 -0
  128. data/lib/new_relic/agent/instrumentation/active_support_logger/chain.rb +23 -0
  129. data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +20 -0
  130. data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +12 -0
  131. data/lib/new_relic/agent/instrumentation/active_support_logger.rb +24 -0
  132. data/lib/new_relic/agent/instrumentation/active_support_subscriber.rb +41 -0
  133. data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
  134. data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +150 -0
  135. data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
  136. data/lib/new_relic/agent/instrumentation/bunny.rb +14 -134
  137. data/lib/new_relic/agent/instrumentation/concurrent_ruby/chain.rb +36 -0
  138. data/lib/new_relic/agent/instrumentation/concurrent_ruby/instrumentation.rb +21 -0
  139. data/lib/new_relic/agent/instrumentation/concurrent_ruby/prepend.rb +27 -0
  140. data/lib/new_relic/agent/instrumentation/concurrent_ruby.rb +31 -0
  141. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +77 -61
  142. data/lib/new_relic/agent/instrumentation/curb/chain.rb +91 -0
  143. data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +221 -0
  144. data/lib/new_relic/agent/instrumentation/curb/prepend.rb +61 -0
  145. data/lib/new_relic/agent/instrumentation/curb.rb +15 -187
  146. data/lib/new_relic/agent/instrumentation/custom_events.rb +12 -0
  147. data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +37 -0
  148. data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +35 -0
  149. data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +48 -0
  150. data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +33 -0
  151. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +30 -52
  152. data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +29 -0
  153. data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +66 -0
  154. data/lib/new_relic/agent/instrumentation/elasticsearch/prepend.rb +13 -0
  155. data/lib/new_relic/agent/instrumentation/elasticsearch.rb +31 -0
  156. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +8 -7
  157. data/lib/new_relic/agent/instrumentation/excon.rb +29 -31
  158. data/lib/new_relic/agent/instrumentation/fiber/chain.rb +20 -0
  159. data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +24 -0
  160. data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +18 -0
  161. data/lib/new_relic/agent/instrumentation/fiber.rb +25 -0
  162. data/lib/new_relic/agent/instrumentation/grape/chain.rb +24 -0
  163. data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
  164. data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
  165. data/lib/new_relic/agent/instrumentation/grape.rb +16 -121
  166. data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +97 -0
  167. data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +89 -0
  168. data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +111 -0
  169. data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +30 -0
  170. data/lib/new_relic/agent/instrumentation/grpc/helper.rb +32 -0
  171. data/lib/new_relic/agent/instrumentation/grpc/server/chain.rb +69 -0
  172. data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +134 -0
  173. data/lib/new_relic/agent/instrumentation/grpc/server/rpc_desc_prepend.rb +35 -0
  174. data/lib/new_relic/agent/instrumentation/grpc/server/rpc_server_prepend.rb +26 -0
  175. data/lib/new_relic/agent/instrumentation/grpc_client.rb +23 -0
  176. data/lib/new_relic/agent/instrumentation/grpc_server.rb +25 -0
  177. data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +24 -0
  178. data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +37 -0
  179. data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +15 -0
  180. data/lib/new_relic/agent/instrumentation/httpclient.rb +12 -32
  181. data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
  182. data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
  183. data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
  184. data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
  185. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +5 -6
  186. data/lib/new_relic/agent/instrumentation/logger/chain.rb +21 -0
  187. data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +66 -0
  188. data/lib/new_relic/agent/instrumentation/logger/prepend.rb +13 -0
  189. data/lib/new_relic/agent/instrumentation/logger.rb +26 -0
  190. data/lib/new_relic/agent/instrumentation/memcache/chain.rb +15 -0
  191. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +58 -125
  192. data/lib/new_relic/agent/instrumentation/memcache/helper.rb +59 -0
  193. data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +90 -0
  194. data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +101 -0
  195. data/lib/new_relic/agent/instrumentation/memcache.rb +57 -71
  196. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +15 -14
  197. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +21 -14
  198. data/lib/new_relic/agent/instrumentation/mongo.rb +7 -132
  199. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +49 -13
  200. data/lib/new_relic/agent/instrumentation/net_http/chain.rb +24 -0
  201. data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +40 -0
  202. data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
  203. data/lib/new_relic/agent/instrumentation/net_http.rb +44 -0
  204. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +142 -0
  205. data/lib/new_relic/agent/instrumentation/padrino/chain.rb +38 -0
  206. data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +28 -0
  207. data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
  208. data/lib/new_relic/agent/instrumentation/padrino.rb +22 -58
  209. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +7 -7
  210. data/lib/new_relic/agent/instrumentation/queue_time.rb +9 -10
  211. data/lib/new_relic/agent/instrumentation/rack/chain.rb +66 -0
  212. data/lib/new_relic/agent/instrumentation/rack/helpers.rb +33 -0
  213. data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +75 -0
  214. data/lib/new_relic/agent/instrumentation/rack/prepend.rb +43 -0
  215. data/lib/new_relic/agent/instrumentation/rack.rb +33 -141
  216. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +19 -55
  217. data/lib/new_relic/agent/instrumentation/rails_middleware.rb +5 -5
  218. data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +36 -0
  219. data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +45 -0
  220. data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +30 -0
  221. data/lib/new_relic/agent/instrumentation/rails_notifications/custom_events.rb +30 -0
  222. data/lib/new_relic/agent/instrumentation/rake/chain.rb +20 -0
  223. data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +142 -0
  224. data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
  225. data/lib/new_relic/agent/instrumentation/rake.rb +18 -159
  226. data/lib/new_relic/agent/instrumentation/redis/chain.rb +45 -0
  227. data/lib/new_relic/agent/instrumentation/redis/constants.rb +17 -0
  228. data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +93 -0
  229. data/lib/new_relic/agent/instrumentation/redis/middleware.rb +16 -0
  230. data/lib/new_relic/agent/instrumentation/redis/prepend.rb +29 -0
  231. data/lib/new_relic/agent/instrumentation/redis.rb +20 -103
  232. data/lib/new_relic/agent/instrumentation/resque/chain.rb +21 -0
  233. data/lib/new_relic/agent/instrumentation/resque/helper.rb +19 -0
  234. data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +34 -0
  235. data/lib/new_relic/agent/instrumentation/resque/prepend.rb +15 -0
  236. data/lib/new_relic/agent/instrumentation/resque.rb +33 -41
  237. data/lib/new_relic/agent/instrumentation/sequel.rb +17 -20
  238. data/lib/new_relic/agent/instrumentation/sequel_helper.rb +3 -3
  239. data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +20 -0
  240. data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +30 -0
  241. data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +37 -0
  242. data/lib/new_relic/agent/instrumentation/sidekiq.rb +29 -46
  243. data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
  244. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +31 -37
  245. data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +125 -0
  246. data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
  247. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +3 -3
  248. data/lib/new_relic/agent/instrumentation/sinatra.rb +35 -165
  249. data/lib/new_relic/agent/instrumentation/thread/chain.rb +24 -0
  250. data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +28 -0
  251. data/lib/new_relic/agent/instrumentation/thread/prepend.rb +22 -0
  252. data/lib/new_relic/agent/instrumentation/thread.rb +20 -0
  253. data/lib/new_relic/agent/instrumentation/tilt/chain.rb +24 -0
  254. data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +41 -0
  255. data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +13 -0
  256. data/lib/new_relic/agent/instrumentation/tilt.rb +25 -0
  257. data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
  258. data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +80 -0
  259. data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
  260. data/lib/new_relic/agent/instrumentation/typhoeus.rb +14 -76
  261. data/lib/new_relic/agent/instrumentation.rb +2 -2
  262. data/lib/new_relic/agent/internal_agent_error.rb +3 -3
  263. data/lib/new_relic/agent/javascript_instrumentor.rb +51 -45
  264. data/lib/new_relic/agent/linking_metadata.rb +44 -0
  265. data/lib/new_relic/agent/local_log_decorator.rb +37 -0
  266. data/lib/new_relic/agent/log_event_aggregator.rb +235 -0
  267. data/lib/new_relic/agent/log_once.rb +2 -2
  268. data/lib/new_relic/agent/log_priority.rb +20 -0
  269. data/lib/new_relic/agent/logging.rb +142 -0
  270. data/lib/new_relic/agent/memory_logger.rb +3 -3
  271. data/lib/new_relic/agent/messaging.rb +81 -164
  272. data/lib/new_relic/agent/method_tracer.rb +152 -145
  273. data/lib/new_relic/agent/method_tracer_helpers.rb +90 -13
  274. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +117 -0
  275. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +28 -0
  276. data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +5 -6
  277. data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +9 -15
  278. data/lib/new_relic/agent/monitors.rb +26 -0
  279. data/lib/new_relic/agent/new_relic_service/encoders.rb +7 -7
  280. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +6 -7
  281. data/lib/new_relic/agent/new_relic_service/marshaller.rb +8 -29
  282. data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +5 -5
  283. data/lib/new_relic/agent/new_relic_service.rb +282 -166
  284. data/lib/new_relic/agent/noticeable_error.rb +19 -0
  285. data/lib/new_relic/agent/null_logger.rb +8 -4
  286. data/lib/new_relic/agent/obfuscator.rb +9 -11
  287. data/lib/new_relic/agent/parameter_filtering.rb +35 -8
  288. data/lib/new_relic/agent/payload_metric_mapping.rb +10 -11
  289. data/lib/new_relic/agent/pipe_channel_manager.rb +28 -18
  290. data/lib/new_relic/agent/pipe_service.rb +9 -6
  291. data/lib/new_relic/agent/prepend_supportability.rb +3 -3
  292. data/lib/new_relic/agent/priority_sampled_buffer.rb +16 -14
  293. data/lib/new_relic/agent/range_extensions.rb +9 -29
  294. data/lib/new_relic/agent/rules_engine/replacement_rule.rb +12 -12
  295. data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +13 -14
  296. data/lib/new_relic/agent/rules_engine.rb +6 -5
  297. data/lib/new_relic/agent/sampler.rb +4 -5
  298. data/lib/new_relic/agent/sampler_collection.rb +4 -5
  299. data/lib/new_relic/agent/samplers/cpu_sampler.rb +4 -3
  300. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +14 -11
  301. data/lib/new_relic/agent/samplers/memory_sampler.rb +26 -15
  302. data/lib/new_relic/agent/samplers/object_sampler.rb +2 -2
  303. data/lib/new_relic/agent/samplers/vm_sampler.rb +22 -20
  304. data/lib/new_relic/agent/span_event_aggregator.rb +14 -16
  305. data/lib/new_relic/agent/span_event_primitive.rb +118 -58
  306. data/lib/new_relic/agent/sql_sampler.rb +25 -25
  307. data/lib/new_relic/agent/stats.rb +79 -42
  308. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +11 -13
  309. data/lib/new_relic/agent/stats_engine/stats_hash.rb +13 -14
  310. data/lib/new_relic/agent/stats_engine.rb +11 -11
  311. data/lib/new_relic/agent/synthetics_event_aggregator.rb +8 -9
  312. data/lib/new_relic/agent/system_info.rb +100 -66
  313. data/lib/new_relic/agent/threading/agent_thread.rb +20 -16
  314. data/lib/new_relic/agent/threading/backtrace_node.rb +13 -14
  315. data/lib/new_relic/agent/threading/backtrace_service.rb +18 -18
  316. data/lib/new_relic/agent/threading/thread_profile.rb +31 -45
  317. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +2 -2
  318. data/lib/new_relic/agent/tracer.rb +513 -0
  319. data/lib/new_relic/agent/transaction/abstract_segment.rb +131 -41
  320. data/lib/new_relic/agent/transaction/datastore_segment.rb +22 -18
  321. data/lib/new_relic/agent/transaction/distributed_tracer.rb +184 -0
  322. data/lib/new_relic/agent/transaction/distributed_tracing.rb +72 -163
  323. data/lib/new_relic/agent/transaction/external_request_segment.rb +66 -63
  324. data/lib/new_relic/agent/transaction/message_broker_segment.rb +34 -46
  325. data/lib/new_relic/agent/transaction/request_attributes.rb +36 -36
  326. data/lib/new_relic/agent/transaction/segment.rb +46 -10
  327. data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +2 -4
  328. data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +2 -2
  329. data/lib/new_relic/agent/transaction/trace.rb +21 -24
  330. data/lib/new_relic/agent/transaction/trace_builder.rb +11 -12
  331. data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
  332. data/lib/new_relic/agent/transaction/trace_node.rb +31 -28
  333. data/lib/new_relic/agent/transaction/tracing.rb +15 -111
  334. data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +6 -6
  335. data/lib/new_relic/agent/transaction.rb +252 -259
  336. data/lib/new_relic/agent/transaction_error_primitive.rb +34 -37
  337. data/lib/new_relic/agent/transaction_event_aggregator.rb +13 -13
  338. data/lib/new_relic/agent/transaction_event_primitive.rb +44 -56
  339. data/lib/new_relic/agent/transaction_event_recorder.rb +17 -16
  340. data/lib/new_relic/agent/transaction_metrics.rb +11 -10
  341. data/lib/new_relic/agent/transaction_sampler.rb +7 -12
  342. data/lib/new_relic/agent/transaction_time_aggregator.rb +41 -26
  343. data/lib/new_relic/agent/utilization/aws.rb +34 -4
  344. data/lib/new_relic/agent/utilization/azure.rb +4 -4
  345. data/lib/new_relic/agent/utilization/gcp.rb +8 -8
  346. data/lib/new_relic/agent/utilization/pcf.rb +6 -5
  347. data/lib/new_relic/agent/utilization/vendor.rb +44 -29
  348. data/lib/new_relic/agent/utilization_data.rb +43 -6
  349. data/lib/new_relic/agent/vm/jruby_vm.rb +2 -2
  350. data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +3 -3
  351. data/lib/new_relic/agent/vm/mri_vm.rb +46 -19
  352. data/lib/new_relic/agent/vm/snapshot.rb +6 -6
  353. data/lib/new_relic/agent/vm.rb +2 -2
  354. data/lib/new_relic/agent/worker_loop.rb +11 -13
  355. data/lib/new_relic/agent.rb +151 -79
  356. data/lib/new_relic/cli/command.rb +21 -23
  357. data/lib/new_relic/cli/commands/deployments.rb +94 -45
  358. data/lib/new_relic/cli/commands/install.rb +24 -26
  359. data/lib/new_relic/coerce.rb +42 -15
  360. data/lib/new_relic/collection_helper.rb +51 -49
  361. data/lib/new_relic/constants.rb +39 -0
  362. data/lib/new_relic/control/class_methods.rb +11 -5
  363. data/lib/new_relic/control/frameworks/external.rb +3 -3
  364. data/lib/new_relic/control/frameworks/rails.rb +24 -18
  365. data/lib/new_relic/control/frameworks/rails3.rb +4 -5
  366. data/lib/new_relic/control/frameworks/rails4.rb +2 -2
  367. data/lib/new_relic/control/frameworks/rails_notifications.rb +14 -0
  368. data/lib/new_relic/control/frameworks/ruby.rb +4 -4
  369. data/lib/new_relic/control/frameworks/sinatra.rb +8 -2
  370. data/lib/new_relic/control/frameworks.rb +2 -2
  371. data/lib/new_relic/control/instance_methods.rb +33 -42
  372. data/lib/new_relic/control/instrumentation.rb +40 -12
  373. data/lib/new_relic/control/private_instance_methods.rb +48 -0
  374. data/lib/new_relic/control/server_methods.rb +4 -5
  375. data/lib/new_relic/control.rb +2 -3
  376. data/lib/new_relic/delayed_job_injection.rb +2 -2
  377. data/lib/new_relic/dependency_detection.rb +129 -18
  378. data/lib/new_relic/environment_report.rb +41 -35
  379. data/lib/new_relic/helper.rb +49 -8
  380. data/lib/new_relic/language_support.rb +30 -6
  381. data/lib/new_relic/latest_changes.rb +9 -8
  382. data/lib/new_relic/local_environment.rb +23 -27
  383. data/lib/new_relic/metric_data.rb +32 -27
  384. data/lib/new_relic/metric_spec.rb +9 -7
  385. data/lib/new_relic/noticed_error.rb +46 -33
  386. data/lib/new_relic/rack/agent_hooks.rb +2 -2
  387. data/lib/new_relic/rack/agent_middleware.rb +7 -5
  388. data/lib/new_relic/rack/browser_monitoring.rb +134 -117
  389. data/lib/new_relic/rack.rb +2 -2
  390. data/lib/new_relic/recipes/capistrano3.rb +4 -62
  391. data/lib/new_relic/recipes/capistrano_legacy.rb +24 -27
  392. data/lib/new_relic/recipes/helpers/send_deployment.rb +70 -0
  393. data/lib/new_relic/recipes.rb +2 -2
  394. data/lib/new_relic/supportability_helper.rb +21 -7
  395. data/lib/new_relic/traced_thread.rb +39 -0
  396. data/lib/new_relic/version.rb +7 -18
  397. data/lib/newrelic_rpm.rb +20 -33
  398. data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +16 -19
  399. data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +9 -15
  400. data/lib/tasks/all.rb +4 -4
  401. data/lib/tasks/config.rake +22 -118
  402. data/lib/tasks/coverage_report.rake +28 -0
  403. data/lib/tasks/helpers/config.html.erb +21 -0
  404. data/lib/tasks/helpers/format.rb +123 -0
  405. data/lib/tasks/helpers/matches.rb +12 -0
  406. data/lib/tasks/helpers/prompt.rb +24 -0
  407. data/lib/tasks/helpers/removers.rb +33 -0
  408. data/lib/tasks/install.rake +4 -0
  409. data/lib/tasks/instrumentation_generator/README.md +63 -0
  410. data/lib/tasks/instrumentation_generator/TODO.md +33 -0
  411. data/lib/tasks/instrumentation_generator/instrumentation.thor +121 -0
  412. data/lib/tasks/instrumentation_generator/templates/Envfile.tt +9 -0
  413. data/lib/tasks/instrumentation_generator/templates/chain.tt +22 -0
  414. data/lib/tasks/instrumentation_generator/templates/chain_method.tt +8 -0
  415. data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +29 -0
  416. data/lib/tasks/instrumentation_generator/templates/instrumentation.tt +13 -0
  417. data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +3 -0
  418. data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +19 -0
  419. data/lib/tasks/instrumentation_generator/templates/prepend.tt +13 -0
  420. data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +3 -0
  421. data/lib/tasks/instrumentation_generator/templates/test.tt +15 -0
  422. data/lib/tasks/multiverse.rake +4 -0
  423. data/lib/tasks/multiverse.rb +12 -5
  424. data/lib/tasks/newrelic.rb +2 -2
  425. data/lib/tasks/tests.rake +14 -14
  426. data/newrelic.yml +672 -3
  427. data/newrelic_rpm.gemspec +40 -31
  428. data/recipes/newrelic.rb +3 -3
  429. data/test/agent_helper.rb +419 -98
  430. metadata +238 -127
  431. data/.travis.yml +0 -228
  432. data/bin/mongrel_rpm +0 -33
  433. data/cert/cacert.pem +0 -1177
  434. data/lib/new_relic/agent/commands/xray_session.rb +0 -55
  435. data/lib/new_relic/agent/commands/xray_session_collection.rb +0 -161
  436. data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
  437. data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +0 -44
  438. data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +0 -53
  439. data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -41
  440. data/lib/new_relic/agent/distributed_trace_payload.rb +0 -246
  441. data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
  442. data/lib/new_relic/agent/instrumentation/active_record_4.rb +0 -42
  443. data/lib/new_relic/agent/instrumentation/active_record_5.rb +0 -41
  444. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -74
  445. data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -25
  446. data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -202
  447. data/lib/new_relic/agent/instrumentation/evented_subscriber.rb +0 -104
  448. data/lib/new_relic/agent/instrumentation/excon/connection.rb +0 -46
  449. data/lib/new_relic/agent/instrumentation/http.rb +0 -46
  450. data/lib/new_relic/agent/instrumentation/merb/controller.rb +0 -44
  451. data/lib/new_relic/agent/instrumentation/merb/errors.rb +0 -33
  452. data/lib/new_relic/agent/instrumentation/net.rb +0 -50
  453. data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +0 -125
  454. data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +0 -46
  455. data/lib/new_relic/agent/instrumentation/rails4/action_controller.rb +0 -32
  456. data/lib/new_relic/agent/instrumentation/rails4/action_view.rb +0 -27
  457. data/lib/new_relic/agent/instrumentation/rails5/action_cable.rb +0 -36
  458. data/lib/new_relic/agent/instrumentation/rails5/action_controller.rb +0 -33
  459. data/lib/new_relic/agent/instrumentation/rails5/action_view.rb +0 -27
  460. data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +0 -26
  461. data/lib/new_relic/agent/instrumentation/sunspot.rb +0 -33
  462. data/lib/new_relic/agent/supported_versions.rb +0 -275
  463. data/lib/new_relic/agent/transaction/attributes.rb +0 -154
  464. data/lib/new_relic/agent/transaction/xray_sample_buffer.rb +0 -64
  465. data/lib/new_relic/agent/transaction_state.rb +0 -186
  466. data/lib/new_relic/build.rb +0 -2
  467. data/lib/new_relic/control/frameworks/merb.rb +0 -29
  468. data/lib/new_relic/control/frameworks/rails5.rb +0 -14
  469. data/lib/new_relic/metrics.rb +0 -13
  470. data/lib/tasks/config.html.erb +0 -32
  471. data/lib/tasks/versions.html.erb +0 -28
  472. data/lib/tasks/versions.postface.html +0 -8
  473. data/lib/tasks/versions.preface.html +0 -9
  474. data/lib/tasks/versions.rake +0 -65
  475. data/lib/tasks/versions.txt.erb +0 -14
  476. /data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
@@ -0,0 +1,90 @@
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 Memcache
7
+ module Tracer
8
+ SLASH = '/'
9
+ UNKNOWN = 'unknown'
10
+ LOCALHOST = 'localhost'
11
+ MULTIGET_METRIC_NAME = "get_multi_request"
12
+ MEMCACHED = "Memcached"
13
+
14
+ def with_newrelic_tracing(operation, *args)
15
+ segment = NewRelic::Agent::Tracer.start_datastore_segment( \
16
+ product: MEMCACHED,
17
+ operation: operation
18
+ )
19
+
20
+ begin
21
+ NewRelic::Agent::Tracer.capture_segment_error(segment) { yield }
22
+ ensure
23
+ if NewRelic::Agent.config[:capture_memcache_keys]
24
+ segment.notice_nosql_statement("#{operation} #{args.first.inspect}")
25
+ end
26
+ ::NewRelic::Agent::Transaction::Segment.finish(segment)
27
+ end
28
+ end
29
+
30
+ def server_for_key_with_newrelic_tracing
31
+ yield.tap do |server|
32
+ begin
33
+ if txn = ::NewRelic::Agent::Tracer.current_transaction
34
+ segment = txn.current_segment
35
+ if ::NewRelic::Agent::Transaction::DatastoreSegment === segment
36
+ assign_instance_to(segment, server)
37
+ end
38
+ end
39
+ rescue => e
40
+ ::NewRelic::Agent.logger.warn("Unable to set instance info on datastore segment: #{e.message}")
41
+ end
42
+ end
43
+ end
44
+
45
+ def get_multi_with_newrelic_tracing(method_name)
46
+ segment = NewRelic::Agent::Tracer.start_segment( \
47
+ name: "Ruby/Memcached/Dalli/#{method_name}"
48
+ )
49
+
50
+ begin
51
+ NewRelic::Agent::Tracer.capture_segment_error(segment) { yield }
52
+ ensure
53
+ ::NewRelic::Agent::Transaction::Segment.finish(segment)
54
+ end
55
+ end
56
+
57
+ def send_multiget_with_newrelic_tracing(keys)
58
+ segment = ::NewRelic::Agent::Tracer.start_datastore_segment( \
59
+ product: MEMCACHED,
60
+ operation: MULTIGET_METRIC_NAME
61
+ )
62
+
63
+ begin
64
+ assign_instance_to(segment, self)
65
+ NewRelic::Agent::Tracer.capture_segment_error(segment) { yield }
66
+ ensure
67
+ if ::NewRelic::Agent.config[:capture_memcache_keys]
68
+ segment.notice_nosql_statement("#{MULTIGET_METRIC_NAME} #{keys.inspect}")
69
+ end
70
+ ::NewRelic::Agent::Transaction::Segment.finish(segment)
71
+ end
72
+ end
73
+
74
+ def assign_instance_to(segment, server)
75
+ host = port_path_or_id = nil
76
+ if server.hostname.start_with?(SLASH)
77
+ host = LOCALHOST
78
+ port_path_or_id = server.hostname
79
+ else
80
+ host = server.hostname
81
+ port_path_or_id = server.port
82
+ end
83
+ segment.set_instance_info(host, port_path_or_id)
84
+ rescue => e
85
+ ::NewRelic::Agent.logger.debug("Failed to retrieve memcached instance info: #{e.message}")
86
+ segment.set_instance_info(UNKNOWN, UNKNOWN)
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,101 @@
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 Memcache
7
+ module Prepend
8
+ extend Helper
9
+
10
+ module_function
11
+
12
+ def client_prepender(client_class)
13
+ Module.new do
14
+ extend Helper
15
+ include NewRelic::Agent::Instrumentation::Memcache::Tracer
16
+
17
+ supported_methods_for(client_class, client_methods).each do |method_name|
18
+ define_method method_name do |*args, &block|
19
+ with_newrelic_tracing(method_name, *args) { super(*args, &block) }
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ def dalli_cas_prependers
26
+ yield(::Dalli::Client, dalli_client_prepender(dalli_cas_methods))
27
+ yield(::Dalli::Client, dalli_get_multi_prepender(:get_multi_cas))
28
+ end
29
+
30
+ def dalli_prependers
31
+ if supports_datastore_instances?
32
+ yield(::Dalli::Client, dalli_client_prepender(dalli_methods))
33
+ yield(::Dalli::Client, dalli_get_multi_prepender(:get_multi))
34
+
35
+ if supports_binary_protocol?
36
+ yield(::Dalli::Protocol::Binary, dalli_server_prepender)
37
+ else
38
+ yield(::Dalli::Server, dalli_server_prepender)
39
+ end
40
+
41
+ yield(::Dalli::Ring, dalli_ring_prepender)
42
+ else
43
+ yield(::Dalli::Client, dalli_client_prepender(client_methods))
44
+ end
45
+ end
46
+
47
+ def dalli_client_prepender(supported_methods)
48
+ Module.new do
49
+ extend Helper
50
+ include NewRelic::Agent::Instrumentation::Memcache::Tracer
51
+
52
+ supported_methods.each do |method_name|
53
+ define_method method_name do |*args, &block|
54
+ with_newrelic_tracing(method_name, *args) { super(*args, &block) }
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ def dalli_get_multi_prepender(method_name)
61
+ Module.new do
62
+ extend Helper
63
+ include NewRelic::Agent::Instrumentation::Memcache::Tracer
64
+
65
+ define_method method_name do |*args, &block|
66
+ get_multi_with_newrelic_tracing(method_name) { super(*args, &block) }
67
+ end
68
+ end
69
+ end
70
+
71
+ def dalli_ring_prepender
72
+ Module.new do
73
+ extend Helper
74
+ include NewRelic::Agent::Instrumentation::Memcache::Tracer
75
+
76
+ def server_for_key(key)
77
+ server_for_key_with_newrelic_tracing { super }
78
+ end
79
+ end
80
+ end
81
+
82
+ def dalli_server_prepender
83
+ Module.new do
84
+ extend Helper
85
+ include NewRelic::Agent::Instrumentation::Memcache::Tracer
86
+
87
+ # TODO: Dalli - 3.1.0 renamed send_multiget to pipelined_get, but the method is otherwise the same
88
+ if Gem::Version.new(::Dalli::VERSION) >= Gem::Version.new('3.1.0')
89
+ def pipelined_get(keys)
90
+ send_multiget_with_newrelic_tracing(keys) { super }
91
+ end
92
+ else
93
+ def send_multiget(keys)
94
+ send_multiget_with_newrelic_tracing(keys) { super }
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -1,101 +1,87 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
- # NOTE there are multiple implementations of the MemCache client in Ruby,
6
- # each with slightly different API's and semantics.
5
+ # NOTE: there are multiple implementations of the Memcached client in Ruby,
6
+ # each with slightly different APIs and semantics.
7
7
  # See:
8
8
  # http://www.deveiate.org/code/Ruby-MemCache/ (Gem: Ruby-MemCache)
9
9
  # http://seattlerb.rubyforge.org/memcache-client/ (Gem: memcache-client)
10
10
  # https://github.com/mperham/dalli (Gem: dalli)
11
11
 
12
- require 'new_relic/agent/datastores/metric_helper'
13
- require 'new_relic/agent/instrumentation/memcache/dalli'
12
+ require_relative 'memcache/helper'
13
+ require_relative 'memcache/instrumentation'
14
+ require_relative 'memcache/dalli'
15
+ require_relative 'memcache/chain'
16
+ require_relative 'memcache/prepend'
14
17
 
15
- module NewRelic
16
- module Agent
17
- module Instrumentation
18
- module Memcache
19
- module_function
20
-
21
- def enabled?
22
- !::NewRelic::Agent.config[:disable_memcache_instrumentation]
23
- end
24
-
25
- METHODS = [:get, :get_multi, :set, :add, :incr, :decr, :delete, :replace, :append,
26
- :prepend, :cas, :single_get, :multi_get, :single_cas, :multi_cas]
27
-
28
- def supported_methods_for(client_class, methods)
29
- methods.select do |method_name|
30
- client_class.method_defined?(method_name) || client_class.private_method_defined?(method_name)
31
- end
32
- end
33
-
34
- def instrument_methods(client_class, requested_methods = METHODS)
35
- supported_methods_for(client_class, requested_methods).each do |method_name|
18
+ DependencyDetection.defer do
19
+ named :memcache_client
36
20
 
37
- visibility = NewRelic::Helper.instance_method_visibility client_class, method_name
38
- method_name_without = :"#{method_name}_without_newrelic_trace"
21
+ depends_on { defined? MemCache }
39
22
 
40
- client_class.class_eval do
41
- alias_method method_name_without, method_name
23
+ executes do
24
+ if use_prepend?
25
+ prepend_module = NewRelic::Agent::Instrumentation::Memcache::Prepend.client_prepender(MemCache)
26
+ prepend_instrument MemCache, prepend_module, "MemcacheClient"
27
+ else
28
+ chain_instrument_target MemCache, NewRelic::Agent::Instrumentation::Memcache::Chain, "MemcacheClient"
29
+ end
30
+ end
31
+ end
42
32
 
43
- define_method method_name do |*args, &block|
44
- segment = NewRelic::Agent::Tracer.start_datastore_segment(
45
- product: "Memcached",
46
- operation: method_name
47
- )
48
- begin
49
- send method_name_without, *args, &block
50
- ensure
51
- if NewRelic::Agent.config[:capture_memcache_keys]
52
- segment.notice_nosql_statement "#{method_name} #{args.first.inspect}"
53
- end
54
- segment.finish if segment
55
- end
56
- end
33
+ DependencyDetection.defer do
34
+ named :memcached
57
35
 
58
- send visibility, method_name
59
- send visibility, method_name_without
60
- end
61
- end
62
- end
36
+ depends_on { defined? Memcached }
63
37
 
64
- end
38
+ executes do
39
+ if use_prepend?
40
+ prepend_module = NewRelic::Agent::Instrumentation::Memcache::Prepend.client_prepender(Memcached)
41
+ prepend_instrument Memcached, prepend_module, "Memcached"
42
+ else
43
+ chain_instrument_target Memcached, NewRelic::Agent::Instrumentation::Memcache::Chain, "Memcached"
65
44
  end
66
45
  end
67
46
  end
68
47
 
69
48
  DependencyDetection.defer do
70
- named :memcache_client
49
+ @name = :dalli
50
+ configure_with :memcache
71
51
 
72
- depends_on do
73
- NewRelic::Agent::Instrumentation::Memcache.enabled?
74
- end
75
-
76
- depends_on do
77
- defined?(::MemCache)
78
- end
52
+ depends_on { defined? Dalli::Client }
79
53
 
80
54
  executes do
81
- ::NewRelic::Agent.logger.info 'Installing Memcached instrumentation for memcache-client gem'
82
- NewRelic::Agent::Instrumentation::Memcache.instrument_methods(::MemCache)
55
+ if use_prepend?
56
+ prepend_module = NewRelic::Agent::Instrumentation::Memcache::Prepend
57
+ prepend_module.dalli_prependers do |client_class, instrumenting_module|
58
+ prepend_instrument client_class, instrumenting_module, "MemcachedDalli"
59
+ end
60
+ else
61
+ chain_instrument NewRelic::Agent::Instrumentation::Memcache::Dalli
62
+ end
83
63
  end
84
64
  end
85
65
 
66
+ # These CAS client methods are only optionally defined if users require
67
+ # dalli/cas/client. Use a separate dependency block so it can potentially
68
+ # re-evaluate after they've done that require.
86
69
  DependencyDetection.defer do
87
- named :memcached
88
-
89
- depends_on do
90
- NewRelic::Agent::Instrumentation::Memcache.enabled?
91
- end
70
+ @name = :dalli_cas_client
71
+ configure_with :memcache
92
72
 
93
- depends_on do
94
- defined?(::Memcached)
95
- end
73
+ depends_on { defined? Dalli::Client }
74
+ depends_on { NewRelic::Agent::Instrumentation::Memcache::DalliCAS.should_instrument? }
96
75
 
97
76
  executes do
98
- ::NewRelic::Agent.logger.info 'Installing Memcached instrumentation for memcached gem'
99
- ::NewRelic::Agent::Instrumentation::Memcache.instrument_methods(::Memcached)
77
+ NewRelic::Agent.logger.info('Installing Dalli CAS Client Memcache instrumentation')
78
+ if use_prepend?
79
+ prepend_module = NewRelic::Agent::Instrumentation::Memcache::Prepend
80
+ prepend_module.dalli_cas_prependers do |client_class, instrumenting_module|
81
+ prepend_instrument client_class, instrumenting_module, "MemcachedDalliCAS"
82
+ end
83
+ else
84
+ chain_instrument NewRelic::Agent::Instrumentation::Memcache::DalliCAS
85
+ end
100
86
  end
101
87
  end
@@ -1,10 +1,10 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  require 'new_relic/agent/method_tracer'
6
6
  require 'new_relic/agent/transaction'
7
- require 'new_relic/agent/transaction_state'
7
+ require 'new_relic/agent/tracer'
8
8
  require 'new_relic/agent/instrumentation/queue_time'
9
9
  require 'new_relic/agent/instrumentation/controller_instrumentation'
10
10
  require 'new_relic/agent/instrumentation/middleware_tracing'
@@ -15,7 +15,7 @@ module NewRelic
15
15
  class MiddlewareProxy
16
16
  include MiddlewareTracing
17
17
 
18
- ANONYMOUS_CLASS = "AnonymousClass".freeze
18
+ ANONYMOUS_CLASS = "AnonymousClass".freeze
19
19
  OBJECT_CLASS_NAME = "Object".freeze
20
20
 
21
21
  # This class is used to wrap classes that are passed to
@@ -31,6 +31,8 @@ module NewRelic
31
31
  middleware_instance = @middleware_class.new(*args, &blk)
32
32
  MiddlewareProxy.wrap(middleware_instance)
33
33
  end
34
+
35
+ ruby2_keywords(:new) if respond_to?(:ruby2_keywords, true)
34
36
  end
35
37
 
36
38
  def self.is_sinatra_app?(target)
@@ -48,7 +50,7 @@ module NewRelic
48
50
  )
49
51
  end
50
52
 
51
- def self.wrap(target, is_app=false)
53
+ def self.wrap(target, is_app = false)
52
54
  if needs_wrapping?(target)
53
55
  self.new(target, is_app)
54
56
  else
@@ -58,13 +60,13 @@ module NewRelic
58
60
 
59
61
  attr_reader :target, :category, :transaction_options
60
62
 
61
- def initialize(target, is_app=false)
62
- @target = target
63
- @is_app = is_app
64
- @category = determine_category
63
+ def initialize(target, is_app = false)
64
+ @target = target
65
+ @is_app = is_app
66
+ @category = determine_category
65
67
  @target_class_name = determine_class_name
66
- @transaction_name = "#{determine_prefix}#{@target_class_name}/call"
67
- @transaction_options = {
68
+ @transaction_name = "#{determine_prefix}#{@target_class_name}/call"
69
+ @transaction_options = {
68
70
  :transaction_name => @transaction_name
69
71
  }
70
72
  end
@@ -84,14 +86,14 @@ module NewRelic
84
86
  # In 'normal' usage, the target will be an application instance that
85
87
  # responds to #call. With Rails, however, the target may be a subclass
86
88
  # of Rails::Application that defines a method_missing that proxies #call
87
- # to a singleton instance of the the subclass. We need to ensure that we
89
+ # to a singleton instance of the subclass. We need to ensure that we
88
90
  # capture the correct name in both cases.
89
91
  def determine_class_name
90
92
  clazz = class_for_target
91
93
 
92
94
  name = clazz.name
93
95
  name = clazz.superclass.name if name.nil? || name == ""
94
- name = ANONYMOUS_CLASS if name.nil? || name == OBJECT_CLASS_NAME
96
+ name = ANONYMOUS_CLASS if name.nil? || name == OBJECT_CLASS_NAME
95
97
  name
96
98
  end
97
99
 
@@ -102,7 +104,6 @@ module NewRelic
102
104
  @target.class
103
105
  end
104
106
  end
105
-
106
107
  end
107
108
  end
108
109
  end
@@ -1,10 +1,10 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  require 'new_relic/agent/method_tracer'
6
6
  require 'new_relic/agent/transaction'
7
- require 'new_relic/agent/transaction_state'
7
+ require 'new_relic/agent/tracer'
8
8
  require 'new_relic/agent/instrumentation/queue_time'
9
9
  require 'new_relic/agent/instrumentation/controller_instrumentation'
10
10
 
@@ -26,7 +26,9 @@ module NewRelic
26
26
  module Agent
27
27
  module Instrumentation
28
28
  module MiddlewareTracing
29
- TXN_STARTED_KEY = 'newrelic.transaction_started'.freeze
29
+ TXN_STARTED_KEY = 'newrelic.transaction_started'
30
+ CONTENT_TYPE = 'Content-Type'
31
+ CONTENT_LENGTH = 'Content-Length'
30
32
 
31
33
  def _nr_has_middleware_tracing
32
34
  true
@@ -42,7 +44,7 @@ module NewRelic
42
44
  opts[:apdex_start_time] = QueueTime.parse_frontend_timestamp(env)
43
45
  # this case is for the rare occasion that an app is using Puma::Rack
44
46
  # without having ::Rack as a dependency
45
- opts[:request] = ::Rack::Request.new(env) if defined? ::Rack
47
+ opts[:request] = ::Rack::Request.new(env.dup) if defined? ::Rack
46
48
  opts
47
49
  end
48
50
 
@@ -56,8 +58,6 @@ module NewRelic
56
58
  end
57
59
  end
58
60
 
59
- CONTENT_TYPE = 'Content-Type'.freeze
60
-
61
61
  def capture_response_content_type(state, result)
62
62
  if result.is_a?(Array) && state.current_transaction
63
63
  _, headers, _ = result
@@ -65,12 +65,12 @@ module NewRelic
65
65
  end
66
66
  end
67
67
 
68
- CONTENT_LENGTH = 'Content-Length'.freeze
69
-
70
68
  def capture_response_content_length(state, result)
71
69
  if result.is_a?(Array) && state.current_transaction
72
70
  _, headers, _ = result
73
- state.current_transaction.response_content_length = headers[CONTENT_LENGTH]
71
+ length = headers[CONTENT_LENGTH]
72
+ length = length.reduce(0) { |sum, h| sum + h.to_i } if length.is_a?(Array)
73
+ state.current_transaction.response_content_length = length
74
74
  end
75
75
  end
76
76
 
@@ -83,13 +83,20 @@ module NewRelic
83
83
  def call(env)
84
84
  first_middleware = note_transaction_started(env)
85
85
 
86
- state = NewRelic::Agent::TransactionState.tl_get
86
+ state = NewRelic::Agent::Tracer.state
87
87
 
88
88
  begin
89
- Transaction.start(state, category, build_transaction_options(env, first_middleware))
89
+ options = build_transaction_options(env, first_middleware)
90
+
91
+ finishable = Tracer.start_transaction_or_segment(
92
+ name: options[:transaction_name],
93
+ category: category,
94
+ options: options
95
+ )
96
+
90
97
  events.notify(:before_call, env) if first_middleware
91
98
 
92
- result = (target == self) ? traced_call(env) : target.call(env)
99
+ result = target == self ? traced_call(env) : target.call(env)
93
100
 
94
101
  if first_middleware
95
102
  capture_response_attributes(state, result)
@@ -101,7 +108,7 @@ module NewRelic
101
108
  NewRelic::Agent.notice_error(e)
102
109
  raise e
103
110
  ensure
104
- Transaction.stop(state)
111
+ finishable.finish if finishable
105
112
  end
106
113
  end
107
114
 
@@ -1,29 +1,25 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  DependencyDetection.defer do
6
6
  named :mongo
7
7
 
8
8
  depends_on do
9
- defined?(::Mongo)
9
+ defined?(Mongo)
10
10
  end
11
11
 
12
12
  depends_on do
13
13
  require 'new_relic/agent/datastores/mongo'
14
- if NewRelic::Agent::Datastores::Mongo.is_unsupported_2x?
15
- NewRelic::Agent.logger.log_once(:info, :mongo2, 'Detected unsupported Mongo 2, upgrade your Mongo Driver to 2.1 or newer for instrumentation')
14
+ unless NewRelic::Agent::Datastores::Mongo.is_supported_version?
15
+ NewRelic::Agent.logger.log_once(:warn, :mongo2, 'Detected unsupported Mongo 2, upgrade your Mongo Driver to 2.1 or newer for instrumentation')
16
16
  end
17
17
  NewRelic::Agent::Datastores::Mongo.is_supported_version?
18
18
  end
19
19
 
20
20
  executes do
21
- NewRelic::Agent.logger.info 'Installing Mongo instrumentation'
22
- if NewRelic::Agent::Datastores::Mongo.is_monitoring_enabled?
23
- install_mongo_command_subscriber
24
- else
25
- install_mongo_instrumentation
26
- end
21
+ NewRelic::Agent.logger.info('Installing Mongo instrumentation')
22
+ install_mongo_command_subscriber
27
23
  end
28
24
 
29
25
  def install_mongo_command_subscriber
@@ -33,125 +29,4 @@ DependencyDetection.defer do
33
29
  NewRelic::Agent::Instrumentation::MongodbCommandSubscriber.new
34
30
  )
35
31
  end
36
-
37
- def install_mongo_instrumentation
38
- require 'new_relic/agent/datastores/mongo/metric_translator'
39
- require 'new_relic/agent/datastores/mongo/statement_formatter'
40
-
41
- hook_instrument_methods
42
- instrument_save
43
- instrument_ensure_index
44
- end
45
-
46
- def hook_instrument_methods
47
- hook_instrument_method(::Mongo::Collection)
48
- hook_instrument_method(::Mongo::Connection)
49
- hook_instrument_method(::Mongo::Cursor)
50
- hook_instrument_method(::Mongo::CollectionWriter) if defined?(::Mongo::CollectionWriter)
51
- end
52
-
53
- def hook_instrument_method(target_class)
54
- target_class.class_eval do
55
- include NewRelic::Agent::MethodTracer
56
-
57
- # It's key that this method eats all exceptions, as it rests between the
58
- # Mongo operation the user called and us returning them the data. Be safe!
59
- def new_relic_notice_statement(segment, payload, name)
60
- statement = NewRelic::Agent::Datastores::Mongo::StatementFormatter.format(payload, name)
61
- if statement
62
- segment.notice_nosql_statement statement
63
- end
64
- rescue => e
65
- NewRelic::Agent.logger.debug("Exception during Mongo statement gathering", e)
66
- end
67
-
68
- def new_relic_default_payload
69
- { :collection => self.name, :database => self.db.name }
70
- end
71
-
72
- def new_relic_start_segment name, payload
73
- product = NewRelic::Agent::Datastores::Mongo::MetricTranslator::MONGO_PRODUCT_NAME
74
- op_and_col = NewRelic::Agent::Datastores::Mongo::MetricTranslator.operation_and_collection_for name, payload
75
- if op_and_col
76
- operation, collection = op_and_col
77
- NewRelic::Agent::Tracer.start_datastore_segment(
78
- product: product,
79
- operation: operation,
80
- collection: collection
81
- )
82
- end
83
- end
84
-
85
- def instrument_with_new_relic_trace(name, payload = {}, &block)
86
- segment = new_relic_start_segment name, payload
87
-
88
- begin
89
- result = NewRelic::Agent.disable_all_tracing do
90
- instrument_without_new_relic_trace(name, payload, &block)
91
- end
92
-
93
- new_relic_notice_statement(segment, payload, name) if segment
94
- result
95
- ensure
96
- segment.finish if segment
97
- end
98
- end
99
-
100
- alias_method :instrument_without_new_relic_trace, :instrument
101
- alias_method :instrument, :instrument_with_new_relic_trace
102
- end
103
- end
104
-
105
- def instrument_save
106
- ::Mongo::Collection.class_eval do
107
- def save_with_new_relic_trace(doc, opts = {}, &block)
108
- segment = new_relic_start_segment :save, new_relic_default_payload
109
-
110
- begin
111
- result = NewRelic::Agent.disable_all_tracing do
112
- save_without_new_relic_trace(doc, opts, &block)
113
- end
114
-
115
- new_relic_notice_statement(segment, doc, :save) if segment
116
- result
117
- ensure
118
- segment.finish if segment
119
- end
120
- end
121
-
122
- alias_method :save_without_new_relic_trace, :save
123
- alias_method :save, :save_with_new_relic_trace
124
- end
125
- end
126
-
127
- def instrument_ensure_index
128
- ::Mongo::Collection.class_eval do
129
- def ensure_index_with_new_relic_trace(spec, opts = {}, &block)
130
- segment = new_relic_start_segment :ensureIndex, new_relic_default_payload
131
-
132
- begin
133
- result = NewRelic::Agent.disable_all_tracing do
134
- ensure_index_without_new_relic_trace(spec, opts, &block)
135
- end
136
-
137
- spec = case spec
138
- when Array
139
- Hash[spec]
140
- when String, Symbol
141
- { spec => 1 }
142
- else
143
- spec.dup
144
- end
145
-
146
- new_relic_notice_statement(segment, spec, :ensureIndex) if segment
147
- result
148
- ensure
149
- segment.finish if segment
150
- end
151
- end
152
-
153
- alias_method :ensure_index_without_new_relic_trace, :ensure_index
154
- alias_method :ensure_index, :ensure_index_with_new_relic_trace
155
- end
156
- end
157
32
  end