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
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/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/instrumentation/active_record_prepend'
6
6
 
@@ -11,7 +11,7 @@ module NewRelic
11
11
  EXPLAINER = lambda do |statement|
12
12
  connection = NewRelic::Agent::Database.get_connection(statement.config) do
13
13
  ::ActiveRecord::Base.send("#{statement.config[:adapter]}_connection",
14
- statement.config)
14
+ statement.config)
15
15
  end
16
16
  if connection && connection.respond_to?(:execute)
17
17
  return connection.execute("EXPLAIN #{statement.sql}")
@@ -21,8 +21,8 @@ module NewRelic
21
21
  def self.insert_instrumentation
22
22
  if defined?(::ActiveRecord::VERSION::MAJOR) && ::ActiveRecord::VERSION::MAJOR.to_i >= 3
23
23
  if ::NewRelic::Agent.config[:prepend_active_record_instrumentation]
24
- ::ActiveRecord::Base.prepend ::NewRelic::Agent::Instrumentation::ActiveRecordPrepend::BaseExtensions
25
- ::ActiveRecord::Relation.prepend ::NewRelic::Agent::Instrumentation::ActiveRecordPrepend::RelationExtensions
24
+ ::ActiveRecord::Base.prepend(::NewRelic::Agent::Instrumentation::ActiveRecordPrepend::BaseExtensions)
25
+ ::ActiveRecord::Relation.prepend(::NewRelic::Agent::Instrumentation::ActiveRecordPrepend::RelationExtensions)
26
26
  else
27
27
  ::NewRelic::Agent::Instrumentation::ActiveRecordHelper.instrument_additional_methods
28
28
  end
@@ -36,51 +36,100 @@ module NewRelic
36
36
  def self.included(instrumented_class)
37
37
  instrumented_class.class_eval do
38
38
  unless instrumented_class.method_defined?(:log_without_newrelic_instrumentation)
39
- alias_method :log_without_newrelic_instrumentation, :log
40
- alias_method :log, :log_with_newrelic_instrumentation
41
- protected :log
39
+ alias_method(:log_without_newrelic_instrumentation, :log)
40
+ alias_method(:log, :log_with_newrelic_instrumentation)
41
+ protected(:log)
42
42
  end
43
43
  end
44
44
  end
45
45
 
46
- def log_with_newrelic_instrumentation(*args, &block) #THREAD_LOCAL_ACCESS
47
- state = NewRelic::Agent::TransactionState.tl_get
46
+ if RUBY_VERSION < "2.7.0"
47
+ def log_with_newrelic_instrumentation(*args, &block)
48
+ state = NewRelic::Agent::Tracer.state
48
49
 
49
- if !state.is_execution_traced?
50
- return log_without_newrelic_instrumentation(*args, &block)
51
- end
50
+ if !state.is_execution_traced?
51
+ return log_without_newrelic_instrumentation(*args, &block)
52
+ end
52
53
 
53
- sql, name, _ = args
54
+ sql, name, _ = args
54
55
 
55
- product, operation, collection = ActiveRecordHelper.product_operation_collection_for(
56
- NewRelic::Helper.correctly_encoded(name),
57
- NewRelic::Helper.correctly_encoded(sql),
58
- @config && @config[:adapter])
56
+ product, operation, collection = ActiveRecordHelper.product_operation_collection_for(
57
+ NewRelic::Helper.correctly_encoded(name),
58
+ NewRelic::Helper.correctly_encoded(sql),
59
+ @config && @config[:adapter]
60
+ )
59
61
 
60
- host = nil
61
- port_path_or_id = nil
62
- database = nil
62
+ host = nil
63
+ port_path_or_id = nil
64
+ database = nil
65
+
66
+ if ActiveRecordHelper::InstanceIdentification.supported_adapter?(@config)
67
+ host = ActiveRecordHelper::InstanceIdentification.host(@config)
68
+ port_path_or_id = ActiveRecordHelper::InstanceIdentification.port_path_or_id(@config)
69
+ database = @config && @config[:database]
70
+ end
63
71
 
64
- if ActiveRecordHelper::InstanceIdentification.supported_adapter?(@config)
65
- host = ActiveRecordHelper::InstanceIdentification.host(@config)
66
- port_path_or_id = ActiveRecordHelper::InstanceIdentification.port_path_or_id(@config)
67
- database = @config && @config[:database]
72
+ segment = NewRelic::Agent::Tracer.start_datastore_segment(
73
+ product: product,
74
+ operation: operation,
75
+ collection: collection,
76
+ host: host,
77
+ port_path_or_id: port_path_or_id,
78
+ database_name: database
79
+ )
80
+ segment._notice_sql(sql, @config, EXPLAINER)
81
+
82
+ begin
83
+ NewRelic::Agent::Tracer.capture_segment_error(segment) do
84
+ log_without_newrelic_instrumentation(*args, &block)
85
+ end
86
+ ensure
87
+ ::NewRelic::Agent::Transaction::Segment.finish(segment)
88
+ end
68
89
  end
90
+ else
91
+ def log_with_newrelic_instrumentation(*args, **kwargs, &block)
92
+ state = NewRelic::Agent::Tracer.state
93
+
94
+ if !state.is_execution_traced?
95
+ return log_without_newrelic_instrumentation(*args, **kwargs, &block)
96
+ end
69
97
 
70
- segment = NewRelic::Agent::Transaction.start_datastore_segment(
71
- product: product,
72
- operation: operation,
73
- collection: collection,
74
- host: host,
75
- port_path_or_id: port_path_or_id,
76
- database_name: database
77
- )
78
- segment._notice_sql(sql, @config, EXPLAINER)
79
-
80
- begin
81
- log_without_newrelic_instrumentation(*args, &block)
82
- ensure
83
- segment.finish if segment
98
+ sql, name, _ = args
99
+
100
+ product, operation, collection = ActiveRecordHelper.product_operation_collection_for(
101
+ NewRelic::Helper.correctly_encoded(name),
102
+ NewRelic::Helper.correctly_encoded(sql),
103
+ @config && @config[:adapter]
104
+ )
105
+
106
+ host = nil
107
+ port_path_or_id = nil
108
+ database = nil
109
+
110
+ if ActiveRecordHelper::InstanceIdentification.supported_adapter?(@config)
111
+ host = ActiveRecordHelper::InstanceIdentification.host(@config)
112
+ port_path_or_id = ActiveRecordHelper::InstanceIdentification.port_path_or_id(@config)
113
+ database = @config && @config[:database]
114
+ end
115
+
116
+ segment = NewRelic::Agent::Tracer.start_datastore_segment(
117
+ product: product,
118
+ operation: operation,
119
+ collection: collection,
120
+ host: host,
121
+ port_path_or_id: port_path_or_id,
122
+ database_name: database
123
+ )
124
+ segment._notice_sql(sql, @config, EXPLAINER)
125
+
126
+ begin
127
+ NewRelic::Agent::Tracer.capture_segment_error(segment) do
128
+ log_without_newrelic_instrumentation(*args, **kwargs, &block)
129
+ end
130
+ ensure
131
+ ::NewRelic::Agent::Transaction::Segment.finish(segment)
132
+ end
84
133
  end
85
134
  end
86
135
  end
@@ -92,9 +141,9 @@ DependencyDetection.defer do
92
141
  @name = :active_record
93
142
 
94
143
  depends_on do
95
- defined?(::ActiveRecord) && defined?(::ActiveRecord::Base) &&
96
- (!defined?(::ActiveRecord::VERSION) ||
97
- ::ActiveRecord::VERSION::MAJOR.to_i <= 3)
144
+ defined?(ActiveRecord) && defined?(ActiveRecord::Base) &&
145
+ (!defined?(ActiveRecord::VERSION) ||
146
+ ActiveRecord::VERSION::MAJOR.to_i <= 3)
98
147
  end
99
148
 
100
149
  depends_on do
@@ -102,18 +151,18 @@ DependencyDetection.defer do
102
151
  end
103
152
 
104
153
  executes do
105
- ::NewRelic::Agent.logger.info 'Installing ActiveRecord instrumentation'
154
+ NewRelic::Agent.logger.info('Installing ActiveRecord instrumentation')
106
155
  end
107
156
 
108
157
  executes do
109
158
  require 'new_relic/agent/instrumentation/active_record_helper'
110
159
 
111
- if defined?(::Rails::VERSION::MAJOR) && ::Rails::VERSION::MAJOR.to_i == 3
160
+ if defined?(Rails::VERSION::MAJOR) && Rails::VERSION::MAJOR.to_i == 3
112
161
  ActiveSupport.on_load(:active_record) do
113
- ::NewRelic::Agent::Instrumentation::ActiveRecord.insert_instrumentation
162
+ NewRelic::Agent::Instrumentation::ActiveRecord.insert_instrumentation
114
163
  end
115
164
  else
116
- ::NewRelic::Agent::Instrumentation::ActiveRecord.insert_instrumentation
165
+ NewRelic::Agent::Instrumentation::ActiveRecord.insert_instrumentation
117
166
  end
118
167
  end
119
168
  end
@@ -1,8 +1,9 @@
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/datastores/metric_helper'
6
+ require 'new_relic/constants'
6
7
 
7
8
  module NewRelic
8
9
  module Agent
@@ -18,7 +19,7 @@ module NewRelic
18
19
 
19
20
  def instrument_save_methods
20
21
  ::ActiveRecord::Base.class_eval do
21
- alias_method :save_without_newrelic, :save
22
+ alias_method(:save_without_newrelic, :save)
22
23
 
23
24
  def save(*args, &blk)
24
25
  ::NewRelic::Agent.with_database_metric_name(self.class.name, nil, ACTIVE_RECORD) do
@@ -26,7 +27,7 @@ module NewRelic
26
27
  end
27
28
  end
28
29
 
29
- alias_method :save_without_newrelic!, :save!
30
+ alias_method(:save_without_newrelic!, :save!)
30
31
 
31
32
  def save!(*args, &blk)
32
33
  ::NewRelic::Agent.with_database_metric_name(self.class.name, nil, ACTIVE_RECORD) do
@@ -38,7 +39,7 @@ module NewRelic
38
39
 
39
40
  def instrument_relation_methods
40
41
  ::ActiveRecord::Relation.class_eval do
41
- alias_method :update_all_without_newrelic, :update_all
42
+ alias_method(:update_all_without_newrelic, :update_all)
42
43
 
43
44
  def update_all(*args, &blk)
44
45
  ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
@@ -46,15 +47,23 @@ module NewRelic
46
47
  end
47
48
  end
48
49
 
49
- alias_method :delete_all_without_newrelic, :delete_all
50
+ alias_method(:delete_all_without_newrelic, :delete_all)
50
51
 
51
- def delete_all(*args, &blk)
52
- ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
53
- delete_all_without_newrelic(*args, &blk)
52
+ if RUBY_VERSION < "2.7.0"
53
+ def delete_all(*args, &blk)
54
+ ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
55
+ delete_all_without_newrelic(*args, &blk)
56
+ end
57
+ end
58
+ else
59
+ def delete_all(*args, **kwargs, &blk)
60
+ ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
61
+ delete_all_without_newrelic(*args, **kwargs, &blk)
62
+ end
54
63
  end
55
64
  end
56
65
 
57
- alias_method :destroy_all_without_newrelic, :destroy_all
66
+ alias_method(:destroy_all_without_newrelic, :destroy_all)
58
67
 
59
68
  def destroy_all(*args, &blk)
60
69
  ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
@@ -62,7 +71,7 @@ module NewRelic
62
71
  end
63
72
  end
64
73
 
65
- alias_method :calculate_without_newrelic, :calculate
74
+ alias_method(:calculate_without_newrelic, :calculate)
66
75
 
67
76
  def calculate(*args, &blk)
68
77
  ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
@@ -71,44 +80,54 @@ module NewRelic
71
80
  end
72
81
 
73
82
  if method_defined?(:pluck)
74
- alias_method :pluck_without_newrelic, :pluck
83
+ alias_method(:pluck_without_newrelic, :pluck)
75
84
 
76
85
  def pluck(*args, &blk)
77
86
  ::NewRelic::Agent.with_database_metric_name(self.name, nil, ACTIVE_RECORD) do
78
87
  pluck_without_newrelic(*args, &blk)
79
88
  end
80
89
  end
90
+
81
91
  end
82
92
  end
83
93
  end
84
94
 
85
95
  ACTIVE_RECORD = "ActiveRecord".freeze
86
- OTHER = "other".freeze
96
+ OTHER = "other".freeze
97
+ MAKARA_SUFFIX = "_makara".freeze
98
+
99
+ # convert vendor (makara, etc.) wrapper names to their bare names
100
+ # ex: postgresql_makara -> postgresql
101
+ def bare_adapter_name(adapter_name)
102
+ # TODO: OLD RUBIES - RUBY_VERSION < 2.5
103
+ # With Ruby 2.5+ we could use #delete_suffix instead of #chomp for a
104
+ # potential speed boost
105
+ return adapter_name.chomp(MAKARA_SUFFIX) if adapter_name && adapter_name.end_with?(MAKARA_SUFFIX)
106
+
107
+ adapter_name
108
+ end
87
109
 
88
- def product_operation_collection_for name, sql, adapter_name
89
- product = map_product(adapter_name)
90
- splits = split_name(name)
91
- model = model_from_splits(splits)
110
+ def product_operation_collection_for(name, sql, adapter_name)
111
+ product = map_product(bare_adapter_name(adapter_name))
112
+ splits = split_name(name)
113
+ model = model_from_splits(splits)
92
114
  operation = operation_from_splits(splits, sql)
93
- NewRelic::Agent::Datastores::MetricHelper.product_operation_collection_for product, operation, model, ACTIVE_RECORD
115
+ NewRelic::Agent::Datastores::MetricHelper.product_operation_collection_for(product, operation, model, ACTIVE_RECORD)
94
116
  end
95
117
 
96
118
  SPACE = ' '.freeze
97
- EMPTY = [].freeze
98
119
 
99
120
  def split_name(name)
100
121
  if name && name.respond_to?(:split)
101
122
  name.split(SPACE)
102
123
  else
103
- EMPTY
124
+ NewRelic::EMPTY_ARRAY
104
125
  end
105
126
  end
106
127
 
107
128
  def model_from_splits(splits)
108
129
  if splits.length == 2
109
130
  splits.first
110
- else
111
- nil
112
131
  end
113
132
  end
114
133
 
@@ -124,16 +143,16 @@ module NewRelic
124
143
  # known operations coming in. Anything not matching the list is fine,
125
144
  # it just needs to get downcased directly for use.
126
145
  OPERATION_NAMES = {
127
- 'Find' => 'find',
128
- 'Load' => 'find',
129
- 'Count' => 'find',
130
- 'Exists' => 'find',
131
- 'Create' => 'create',
146
+ 'Find' => 'find',
147
+ 'Load' => 'find',
148
+ 'Count' => 'find',
149
+ 'Exists' => 'find',
150
+ 'Create' => 'create',
132
151
  'Columns' => 'columns',
133
152
  'Indexes' => 'indexes',
134
153
  'Destroy' => 'destroy',
135
- 'Update' => 'update',
136
- 'Save' => 'save'
154
+ 'Update' => 'update',
155
+ 'Save' => 'save'
137
156
  }.freeze
138
157
 
139
158
  def map_operation(raw_operation)
@@ -144,41 +163,41 @@ module NewRelic
144
163
  end
145
164
 
146
165
  PRODUCT_NAMES = {
147
- "mysql" => "MySQL",
148
- "mysql2" => "MySQL",
166
+ "mysql" => "MySQL",
167
+ "mysql2" => "MySQL",
149
168
 
150
169
  "postgresql" => "Postgres",
151
170
 
152
- "sqlite3" => "SQLite",
171
+ "sqlite3" => "SQLite",
153
172
 
154
173
  # https://rubygems.org/gems/activerecord-jdbcpostgresql-adapter
155
- "jdbcmysql" => "MySQL",
174
+ "jdbcmysql" => "MySQL",
156
175
 
157
176
  # https://rubygems.org/gems/activerecord-jdbcpostgresql-adapter
158
177
  "jdbcpostgresql" => "Postgres",
159
-
178
+
160
179
  # https://rubygems.org/gems/activerecord-postgis-adapter
161
- "postgis" => "Postgres",
180
+ "postgis" => "Postgres",
162
181
 
163
182
  # https://rubygems.org/gems/activerecord-jdbcsqlite3-adapter
164
- "jdbcsqlite3" => "SQLite",
183
+ "jdbcsqlite3" => "SQLite",
165
184
 
166
185
  # https://rubygems.org/gems/activerecord-jdbcderby-adapter
167
- "derby" => "Derby",
168
- "jdbcderby" => "Derby",
186
+ "derby" => "Derby",
187
+ "jdbcderby" => "Derby",
169
188
 
170
189
  # https://rubygems.org/gems/activerecord-jdbc-adapter
171
- "jdbc" => "JDBC",
190
+ "jdbc" => "JDBC",
172
191
 
173
192
  # https://rubygems.org/gems/activerecord-jdbcmssql-adapter
174
- "jdbcmssql" => "MSSQL",
175
- "mssql" => "MSSQL",
193
+ "jdbcmssql" => "MSSQL",
194
+ "mssql" => "MSSQL",
176
195
 
177
196
  # https://rubygems.org/gems/activerecord-sqlserver-adapter
178
- "sqlserver" => "MSSQL",
197
+ "sqlserver" => "MSSQL",
179
198
 
180
199
  # https://rubygems.org/gems/activerecord-odbc-adapter
181
- "odbc" => "ODBC",
200
+ "odbc" => "ODBC",
182
201
 
183
202
  # https://rubygems.org/gems/activerecord-oracle_enhanced-adapter
184
203
  "oracle_enhanced" => "Oracle"
@@ -187,25 +206,24 @@ module NewRelic
187
206
  ACTIVE_RECORD_DEFAULT_PRODUCT_NAME = "ActiveRecord".freeze
188
207
 
189
208
  def map_product(adapter_name)
190
- PRODUCT_NAMES.fetch(adapter_name,
191
- ACTIVE_RECORD_DEFAULT_PRODUCT_NAME)
209
+ PRODUCT_NAMES.fetch(adapter_name, ACTIVE_RECORD_DEFAULT_PRODUCT_NAME)
192
210
  end
193
211
 
194
212
  module InstanceIdentification
195
213
  extend self
196
214
 
197
215
  PRODUCT_SYMBOLS = {
198
- "mysql" => :mysql,
199
- "mysql2" => :mysql,
200
- "jdbcmysql" => :mysql,
216
+ "mysql" => :mysql,
217
+ "mysql2" => :mysql,
218
+ "jdbcmysql" => :mysql,
201
219
 
202
- "postgresql" => :postgres,
220
+ "postgresql" => :postgres,
203
221
  "jdbcpostgresql" => :postgres,
204
- "postgis" => :postgres
222
+ "postgis" => :postgres
205
223
  }.freeze
206
224
 
207
225
  DATASTORE_DEFAULT_PORTS = {
208
- :mysql => "3306",
226
+ :mysql => "3306",
209
227
  :postgres => "5432"
210
228
  }.freeze
211
229
 
@@ -214,13 +232,18 @@ module NewRelic
214
232
  SLASH = "/".freeze
215
233
  LOCALHOST = "localhost".freeze
216
234
 
235
+ def adapter_from_config(config)
236
+ bare_name = NewRelic::Agent::Instrumentation::ActiveRecordHelper.bare_adapter_name(config[:adapter])
237
+ PRODUCT_SYMBOLS[bare_name]
238
+ end
239
+
217
240
  def host(config)
218
241
  return UNKNOWN unless config
219
242
 
220
- configured_value = config[:host]
221
- adapter = PRODUCT_SYMBOLS[config[:adapter]]
243
+ configured_value = config[:host]
244
+ adapter = adapter_from_config(config)
222
245
  if configured_value.nil? ||
223
- postgres_unix_domain_socket_case?(configured_value, adapter)
246
+ postgres_unix_domain_socket_case?(configured_value, adapter)
224
247
 
225
248
  LOCALHOST
226
249
  elsif configured_value.empty?
@@ -228,16 +251,15 @@ module NewRelic
228
251
  else
229
252
  configured_value
230
253
  end
231
-
232
254
  rescue => e
233
- NewRelic::Agent.logger.debug "Failed to retrieve ActiveRecord host: #{e}"
255
+ NewRelic::Agent.logger.debug("Failed to retrieve ActiveRecord host: #{e}")
234
256
  UNKNOWN
235
257
  end
236
258
 
237
259
  def port_path_or_id(config)
238
260
  return UNKNOWN unless config
239
261
 
240
- adapter = PRODUCT_SYMBOLS[config[:adapter]]
262
+ adapter = adapter_from_config(config)
241
263
  if config[:socket]
242
264
  config[:socket].empty? ? UNKNOWN : config[:socket]
243
265
  elsif postgres_unix_domain_socket_case?(config[:host], adapter) || mysql_default_case?(config, adapter)
@@ -249,16 +271,15 @@ module NewRelic
249
271
  else
250
272
  UNKNOWN
251
273
  end
252
-
253
274
  rescue => e
254
- NewRelic::Agent.logger.debug "Failed to retrieve ActiveRecord port_path_or_id: #{e}"
275
+ NewRelic::Agent.logger.debug("Failed to retrieve ActiveRecord port_path_or_id: #{e}")
255
276
  UNKNOWN
256
277
  end
257
278
 
258
279
  SUPPORTED_ADAPTERS = [:mysql, :postgres].freeze
259
280
 
260
- def supported_adapter? config
261
- config && SUPPORTED_ADAPTERS.include?(PRODUCT_SYMBOLS[config[:adapter]])
281
+ def supported_adapter?(config)
282
+ config && SUPPORTED_ADAPTERS.include?(adapter_from_config(config))
262
283
  end
263
284
 
264
285
  private
@@ -0,0 +1,155 @@
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 'new_relic/agent/instrumentation/active_record_subscriber'
6
+ require 'new_relic/agent/instrumentation/active_record_prepend'
7
+
8
+ # Provides a way to send :connection through ActiveSupport notifications to avoid
9
+ # looping through connection handlers to locate a connection by connection_id
10
+ # This is not needed in Rails 6+: https://github.com/rails/rails/pull/34602
11
+ module NewRelic
12
+ module Agent
13
+ module Instrumentation
14
+ module ActiveRecordNotifications
15
+ SQL_ACTIVE_RECORD = 'sql.active_record'.freeze
16
+
17
+ module BaseExtensions4x
18
+ # https://github.com/rails/rails/blob/4-1-stable/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb#L371
19
+ def log(sql, name = "SQL", binds = [], statement_name = nil)
20
+ @instrumenter.instrument(
21
+ SQL_ACTIVE_RECORD,
22
+ :sql => sql,
23
+ :name => name,
24
+ :connection_id => object_id,
25
+ :connection => self,
26
+ :statement_name => statement_name,
27
+ :binds => binds
28
+ ) { yield }
29
+ rescue => e
30
+ # The translate_exception_class method got introduced in 4.1
31
+ if ::ActiveRecord::VERSION::MINOR == 0
32
+ raise translate_exception(e, sql)
33
+ else
34
+ raise translate_exception_class(e, sql)
35
+ end
36
+ end
37
+ end
38
+
39
+ module BaseExtensions50
40
+ # https://github.com/rails/rails/blob/5-0-stable/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb#L582
41
+ def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil)
42
+ @instrumenter.instrument(
43
+ SQL_ACTIVE_RECORD,
44
+ sql: sql,
45
+ name: name,
46
+ binds: binds,
47
+ type_casted_binds: type_casted_binds,
48
+ statement_name: statement_name,
49
+ connection_id: object_id,
50
+ connection: self
51
+ ) { yield }
52
+ rescue => e
53
+ raise translate_exception_class(e, sql)
54
+ end
55
+ end
56
+
57
+ module BaseExtensions51
58
+ # https://github.com/rails/rails/blob/5-1-stable/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb#L603
59
+ def log(sql, name = "SQL", binds = [], type_casted_binds = [], statement_name = nil) # :doc:
60
+ @instrumenter.instrument(
61
+ SQL_ACTIVE_RECORD,
62
+ sql: sql,
63
+ name: name,
64
+ binds: binds,
65
+ type_casted_binds: type_casted_binds,
66
+ statement_name: statement_name,
67
+ connection_id: object_id,
68
+ connection: self
69
+ ) do
70
+ @lock.synchronize do
71
+ yield
72
+ end
73
+ end
74
+ rescue => e
75
+ raise translate_exception_class(e, sql)
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ DependencyDetection.defer do
84
+ named :active_record_notifications
85
+
86
+ depends_on do
87
+ defined?(ActiveRecord) && defined?(ActiveRecord::Base) &&
88
+ defined?(ActiveRecord::VERSION) &&
89
+ ActiveRecord::VERSION::MAJOR.to_i >= 4
90
+ end
91
+
92
+ depends_on do
93
+ !NewRelic::Agent.config[:disable_activerecord_instrumentation] &&
94
+ !NewRelic::Agent::Instrumentation::ActiveRecordSubscriber.subscribed?
95
+ end
96
+
97
+ executes do
98
+ NewRelic::Agent.logger.info('Installing notifications based Active Record instrumentation')
99
+ end
100
+
101
+ executes do
102
+ ActiveSupport::Notifications.subscribe('sql.active_record',
103
+ NewRelic::Agent::Instrumentation::ActiveRecordSubscriber.new)
104
+ end
105
+
106
+ executes do
107
+ ActiveSupport.on_load(:active_record) do
108
+ NewRelic::Agent::PrependSupportability.record_metrics_for(
109
+ ActiveRecord::Base,
110
+ ActiveRecord::Relation
111
+ )
112
+
113
+ # Default to .prepending, unless the ActiveRecord version is <=4
114
+ # **AND** the :prepend_active_record_instrumentation config is false
115
+ if ActiveRecord::VERSION::MAJOR > 4 \
116
+ || NewRelic::Agent.config[:prepend_active_record_instrumentation]
117
+
118
+ ActiveRecord::Base.send(:prepend,
119
+ NewRelic::Agent::Instrumentation::ActiveRecordPrepend::BaseExtensions)
120
+ ActiveRecord::Relation.send(:prepend,
121
+ NewRelic::Agent::Instrumentation::ActiveRecordPrepend::RelationExtensions)
122
+ else
123
+ NewRelic::Agent::Instrumentation::ActiveRecordHelper.instrument_additional_methods
124
+ end
125
+ end
126
+ end
127
+
128
+ executes do
129
+ if NewRelic::Agent.config[:backport_fast_active_record_connection_lookup]
130
+ major_version = ActiveRecord::VERSION::MAJOR.to_i
131
+ minor_version = ActiveRecord::VERSION::MINOR.to_i
132
+
133
+ activerecord_extension = if major_version == 4
134
+ NewRelic::Agent::Instrumentation::ActiveRecordNotifications::BaseExtensions4x
135
+ elsif major_version == 5 && minor_version == 0
136
+ NewRelic::Agent::Instrumentation::ActiveRecordNotifications::BaseExtensions50
137
+ elsif major_version == 5 && minor_version == 1
138
+ NewRelic::Agent::Instrumentation::ActiveRecordNotifications::BaseExtensions51
139
+ end
140
+
141
+ unless activerecord_extension.nil?
142
+ ActiveRecord::ConnectionAdapters::AbstractAdapter.send(:prepend, activerecord_extension)
143
+ end
144
+ end
145
+ end
146
+
147
+ executes do
148
+ if ActiveRecord::VERSION::MAJOR == 5 \
149
+ && ActiveRecord::VERSION::MINOR.to_i == 1 \
150
+ && ActiveRecord::VERSION::TINY.to_i >= 6
151
+
152
+ ActiveRecord::Base.prepend(NewRelic::Agent::Instrumentation::ActiveRecordPrepend::BaseExtensions516)
153
+ end
154
+ end
155
+ end