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,30 @@
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/action_mailbox_subscriber'
6
+
7
+ DependencyDetection.defer do
8
+ named :action_mailbox
9
+
10
+ depends_on do
11
+ !NewRelic::Agent.config[:disable_action_mailbox]
12
+ end
13
+
14
+ depends_on do
15
+ defined?(ActiveSupport) &&
16
+ defined?(ActionMailbox) &&
17
+ ActionMailbox.respond_to?(:gem_version) && # 'require "action_mailbox"' doesn't require version...
18
+ ActionMailbox.gem_version >= Gem::Version.new('7.1.0.alpha') && # notifications added in Rails 7.1
19
+ !NewRelic::Agent::Instrumentation::ActionMailboxSubscriber.subscribed?
20
+ end
21
+
22
+ executes do
23
+ NewRelic::Agent.logger.info('Installing ActionMailbox instrumentation')
24
+ end
25
+
26
+ executes do
27
+ ActiveSupport::Notifications.subscribe(/\A[^\.]+\.action_mailbox\z/,
28
+ NewRelic::Agent::Instrumentation::ActionMailboxSubscriber.new)
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ # This file is distributed under New Relic's license terms.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
+
5
+ require 'new_relic/agent/instrumentation/notifications_subscriber'
6
+
7
+ module NewRelic
8
+ module Agent
9
+ module Instrumentation
10
+ class ActionMailboxSubscriber < NotificationsSubscriber
11
+ def metric_name(name, payload)
12
+ mailbox = payload[:mailbox].class.name
13
+ method = method_from_name(name)
14
+ "Ruby/ActionMailbox/#{mailbox}/#{method}"
15
+ end
16
+
17
+ PATTERN = /\A([^\.]*)\.action_mailbox\z/
18
+
19
+ METHOD_NAME_MAPPING = Hash.new do |h, k|
20
+ if PATTERN =~ k
21
+ h[k] = $1
22
+ else
23
+ h[k] = NewRelic::UNKNOWN
24
+ end
25
+ end
26
+
27
+ def method_from_name(name)
28
+ METHOD_NAME_MAPPING[name]
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,30 @@
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/action_mailer_subscriber'
6
+
7
+ DependencyDetection.defer do
8
+ named :action_mailer
9
+
10
+ depends_on do
11
+ !NewRelic::Agent.config[:disable_action_mailer]
12
+ end
13
+
14
+ depends_on do
15
+ defined?(ActiveSupport) &&
16
+ defined?(ActionMailer) &&
17
+ ActionMailer.respond_to?(:gem_version) &&
18
+ ActionMailer.gem_version >= Gem::Version.new('5.0') &&
19
+ !NewRelic::Agent::Instrumentation::ActionMailerSubscriber.subscribed?
20
+ end
21
+
22
+ executes do
23
+ NewRelic::Agent.logger.info('Installing ActionMailer instrumentation')
24
+ end
25
+
26
+ executes do
27
+ ActiveSupport::Notifications.subscribe(/\A(?:[^\.]+)\.action_mailer\z/,
28
+ NewRelic::Agent::Instrumentation::ActionMailerSubscriber.new)
29
+ end
30
+ end
@@ -0,0 +1,85 @@
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/notifications_subscriber'
6
+
7
+ module NewRelic
8
+ module Agent
9
+ module Instrumentation
10
+ # NOTE: as of v7.1.0.0.alpha, deliver.action_mailer will provide
11
+ # an empty payload hash ({}) to #start, so in this subscriber class
12
+ # we defer params population until #finish and start the segment with
13
+ # a temporary name that is later replaced
14
+ class ActionMailerSubscriber < NotificationsSubscriber
15
+ BASE_NAME = 'Ruby/ActionMailer'
16
+ PAYLOAD_KEYS = %i[action data key mailer message_id perform_deliveries subject]
17
+ PATTERN = /\A([^\.]+)\.action_mailer\z/
18
+ UNKNOWN_MAILER = %r{^#{BASE_NAME}/#{UNKNOWN}/}
19
+
20
+ METHOD_NAME_MAPPING = Hash.new do |h, k|
21
+ if PATTERN =~ k
22
+ h[k] = $1
23
+ else
24
+ h[k] = NewRelic::UNKNOWN
25
+ end
26
+ end
27
+
28
+ def start(name, id, payload)
29
+ return unless state.is_execution_traced?
30
+
31
+ start_segment(name, id, payload)
32
+ rescue => e
33
+ log_notification_error(e, name, 'start')
34
+ end
35
+
36
+ def finish(name, id, payload)
37
+ return unless state.is_execution_traced?
38
+
39
+ finish_segment(id, payload)
40
+ rescue => e
41
+ log_notification_error(e, name, 'finish')
42
+ end
43
+
44
+ private
45
+
46
+ def start_segment(name, id, payload)
47
+ segment = Tracer.start_segment(name: metric_name(name, payload))
48
+ push_segment(id, segment)
49
+ end
50
+
51
+ def finish_segment(id, payload)
52
+ segment = pop_segment(id)
53
+ return unless segment
54
+
55
+ if segment.name.match?(UNKNOWN_MAILER) && payload.key?(:mailer)
56
+ segment.name = segment.name.sub(UNKNOWN_MAILER, "#{BASE_NAME}/#{payload[:mailer]}/")
57
+ end
58
+
59
+ PAYLOAD_KEYS.each do |key|
60
+ segment.params[key] = payload[key] if payload.key?(key)
61
+ end
62
+
63
+ notice_exception(segment, payload)
64
+ segment.finish
65
+ end
66
+
67
+ def notice_exception(segment, payload)
68
+ if exception = exception_object(payload)
69
+ segment.notice_error(exception)
70
+ end
71
+ end
72
+
73
+ def metric_name(name, payload)
74
+ mailer = payload[:mailer] || UNKNOWN
75
+ method = method_from_name(name)
76
+ "#{BASE_NAME}/#{mailer}/#{method}"
77
+ end
78
+
79
+ def method_from_name(name)
80
+ METHOD_NAME_MAPPING[name]
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -1,87 +1,111 @@
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.
4
- require 'new_relic/agent/instrumentation/evented_subscriber'
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/notifications_subscriber'
5
6
 
6
7
  # Listen for ActiveSupport::Notifications events for ActionView render
7
8
  # events. Write metric data and transaction trace nodes for each event.
8
9
  module NewRelic
9
10
  module Agent
10
11
  module Instrumentation
11
- class ActionViewSubscriber < EventedSubscriber
12
+ class ActionViewSubscriber < NotificationsSubscriber
13
+ def start_segment(name, id, payload)
14
+ parent = segment_stack[id].last
15
+ metric_name = format_metric_name(name, payload, parent)
16
+
17
+ event = ActionViewEvent.new(metric_name, payload[:identifier])
12
18
 
13
- def start(name, id, payload) #THREAD_LOCAL_ACCESS
14
- event = RenderEvent.new(name, Time.now, nil, id, payload)
15
- push_event(event)
16
- if state.is_execution_traced? && event.recordable?
17
- event.segment = NewRelic::Agent::Transaction.start_segment name: event.metric_name
19
+ if recordable?(name, metric_name)
20
+ event.finishable = Tracer.start_segment(name: metric_name)
18
21
  end
19
- rescue => e
20
- log_notification_error(e, name, 'start')
22
+ push_segment(id, event)
21
23
  end
22
24
 
23
- def finish(name, id, payload) #THREAD_LOCAL_ACCESS
24
- event = pop_event(id)
25
- event.segment.finish if event.segment
26
- rescue => e
27
- log_notification_error(e, name, 'finish')
25
+ def finish_segment(id, payload)
26
+ if segment = pop_segment(id)
27
+ if exception = exception_object(payload)
28
+ segment.notice_error(exception)
29
+ end
30
+ segment.finish
31
+ end
28
32
  end
29
33
 
30
- class RenderEvent < Event
31
- attr_accessor :segment
32
-
33
- RENDER_TEMPLATE_EVENT_NAME = 'render_template.action_view'.freeze
34
- RENDER_PARTIAL_EVENT_NAME = 'render_partial.action_view'.freeze
35
- RENDER_COLLECTION_EVENT_NAME = 'render_collection.action_view'.freeze
36
-
37
- # Nearly every "render_blah.action_view" event has a child
38
- # in the form of "!render_blah.action_view". The children
39
- # are the ones we want to record. There are a couple
40
- # special cases of events without children.
41
- def recordable?
42
- name[0] == '!' ||
43
- metric_name == 'View/text template/Rendering' ||
44
- metric_name == "View/#{::NewRelic::Agent::UNKNOWN_METRIC}/Partial"
34
+ def format_metric_name(event_name, payload, parent)
35
+ return parent.name if parent \
36
+ && (payload[:virtual_path] \
37
+ || (parent.identifier =~ /template$/))
38
+
39
+ if payload.key?(:virtual_path)
40
+ identifier = payload[:virtual_path]
41
+ else
42
+ identifier = payload[:identifier]
45
43
  end
46
44
 
47
- def metric_name
48
- if parent && (payload[:virtual_path] ||
49
- (parent.payload[:identifier] =~ /template$/))
50
- return parent.metric_name
51
- elsif payload.key?(:virtual_path)
52
- identifier = payload[:virtual_path]
53
- else
54
- identifier = payload[:identifier]
55
- end
45
+ "View/#{metric_path(event_name, identifier)}/#{metric_action(event_name)}"
46
+ end
56
47
 
57
- # memoize
58
- @metric_name ||= "View/#{metric_path(name, identifier)}/#{metric_action(name)}"
59
- @metric_name
60
- end
48
+ # Nearly every "render_blah.action_view" event has a child
49
+ # in the form of "!render_blah.action_view". The children
50
+ # are the ones we want to record. There are a couple
51
+ # special cases of events without children.
52
+ def recordable?(event_name, metric_name)
53
+ event_name[0] == '!' \
54
+ || metric_name == 'View/text template/Rendering' \
55
+ || metric_name == "View/#{::NewRelic::Agent::UNKNOWN_METRIC}/Partial"
56
+ end
61
57
 
62
- def metric_path(name, identifier)
63
- # Rails 5 sets identifier to nil for empty collections,
64
- # so do not mistake rendering a collection for rendering a file.
65
- if identifier == nil && name != RENDER_COLLECTION_EVENT_NAME
66
- 'file'
67
- elsif identifier =~ /template$/
68
- identifier
69
- elsif identifier && (parts = identifier.split('/')).size > 1
70
- parts[-2..-1].join('/')
71
- else
72
- ::NewRelic::Agent::UNKNOWN_METRIC
73
- end
58
+ RENDER_TEMPLATE_EVENT_NAME = 'render_template.action_view'.freeze
59
+ RENDER_PARTIAL_EVENT_NAME = 'render_partial.action_view'.freeze
60
+ RENDER_COLLECTION_EVENT_NAME = 'render_collection.action_view'.freeze
61
+ RENDER_LAYOUT_EVENT_NAME = 'render_layout.action_view'.freeze
62
+
63
+ def metric_action(name)
64
+ case name
65
+ when /#{RENDER_TEMPLATE_EVENT_NAME}$/o then 'Rendering'
66
+ when RENDER_PARTIAL_EVENT_NAME then 'Partial'
67
+ when RENDER_COLLECTION_EVENT_NAME then 'Partial'
68
+ when RENDER_LAYOUT_EVENT_NAME then 'Layout'
69
+ else NewRelic::UNKNOWN
74
70
  end
71
+ end
75
72
 
76
- def metric_action(name)
77
- case name
78
- when /#{RENDER_TEMPLATE_EVENT_NAME}$/ then 'Rendering'
79
- when RENDER_PARTIAL_EVENT_NAME then 'Partial'
80
- when RENDER_COLLECTION_EVENT_NAME then 'Partial'
81
- end
73
+ def metric_path(name, identifier)
74
+ # Rails 5 sets identifier to nil for empty collections,
75
+ # so do not mistake rendering a collection for rendering a file.
76
+ if identifier.nil? && name != RENDER_COLLECTION_EVENT_NAME
77
+ 'file'
78
+ elsif identifier =~ /template$/
79
+ identifier
80
+ elsif identifier && (parts = identifier.split('/')).size > 1
81
+ parts[-2..-1].join('/')
82
+ else
83
+ ::NewRelic::Agent::UNKNOWN_METRIC
82
84
  end
83
85
  end
84
86
  end
87
+
88
+ # This class holds state information between calls to `start`
89
+ # and `finish` for ActiveSupport events that we do not want to track
90
+ # as a transaction or segment.
91
+ class ActionViewEvent
92
+ attr_reader :name, :identifier
93
+ attr_accessor :finishable
94
+
95
+ def initialize(name, identifier)
96
+ @name = name
97
+ @identifier = identifier
98
+ @finishable = nil
99
+ end
100
+
101
+ def finish
102
+ @finishable.finish if @finishable
103
+ end
104
+
105
+ def notice_error(error)
106
+ @finishable.notice_error(error) if @finishable
107
+ end
108
+ end
85
109
  end
86
110
  end
87
111
  end
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/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/prepend_supportability'
6
6
 
@@ -8,22 +8,35 @@ DependencyDetection.defer do
8
8
  named :activejob
9
9
 
10
10
  depends_on do
11
- defined?(::ActiveJob::Base)
11
+ defined?(ActiveJob::Base)
12
12
  end
13
13
 
14
14
  executes do
15
- ::NewRelic::Agent.logger.info 'Installing ActiveJob instrumentation'
15
+ NewRelic::Agent.logger.info('Installing base ActiveJob instrumentation')
16
16
 
17
17
  ActiveSupport.on_load(:active_job) do
18
- ::ActiveJob::Base.around_enqueue do |job, block|
19
- ::NewRelic::Agent::Instrumentation::ActiveJobHelper.enqueue(job, block)
18
+ ActiveJob::Base.around_enqueue do |job, block|
19
+ NewRelic::Agent::Instrumentation::ActiveJobHelper.enqueue(job, block)
20
20
  end
21
21
 
22
- ::ActiveJob::Base.around_perform do |job, block|
23
- ::NewRelic::Agent::Instrumentation::ActiveJobHelper.perform(job, block)
22
+ ActiveJob::Base.around_perform do |job, block|
23
+ NewRelic::Agent::Instrumentation::ActiveJobHelper.perform(job, block)
24
24
  end
25
25
 
26
- ::NewRelic::Agent::PrependSupportability.record_metrics_for(::ActiveJob::Base)
26
+ NewRelic::Agent::PrependSupportability.record_metrics_for(ActiveJob::Base)
27
+ end
28
+ end
29
+
30
+ executes do
31
+ if defined?(ActiveSupport) &&
32
+ ActiveJob.respond_to?(:gem_version) &&
33
+ ActiveJob.gem_version >= Gem::Version.new('6.0.0') &&
34
+ !NewRelic::Agent.config[:disable_activejob] &&
35
+ !NewRelic::Agent::Instrumentation::ActiveJobSubscriber.subscribed?
36
+ NewRelic::Agent.logger.info('Installing notifications based ActiveJob instrumentation')
37
+
38
+ ActiveSupport::Notifications.subscribe(/\A[^\.]+\.active_job\z/,
39
+ NewRelic::Agent::Instrumentation::ActiveJobSubscriber.new)
27
40
  end
28
41
  end
29
42
  end
@@ -39,34 +52,40 @@ module NewRelic
39
52
  end
40
53
 
41
54
  def self.perform(job, block)
42
- state = ::NewRelic::Agent::TransactionState.tl_get
55
+ state = ::NewRelic::Agent::Tracer.state
43
56
  txn = state.current_transaction
44
57
 
45
58
  # Don't nest transactions if we're already in a web transaction.
46
59
  # Probably inline processing the job if that happens, so just trace.
47
- if txn && txn.recording_web_transaction?
60
+ if txn && txn.recording_web_transaction?
48
61
  run_in_trace(job, block, :Consume)
49
62
  elsif txn && !txn.recording_web_transaction?
50
63
  ::NewRelic::Agent::Transaction.set_default_transaction_name(
51
64
  transaction_name_suffix_for_job(job),
52
- transaction_category)
65
+ transaction_category
66
+ )
53
67
  block.call
54
68
  else
55
- run_in_transaction(state, job, block)
69
+ run_in_transaction(job, block)
56
70
  end
57
71
  end
58
72
 
59
73
  def self.run_in_trace(job, block, event)
60
- trace_execution_scoped("MessageBroker/#{adapter}/Queue/#{event}/Named/#{job.queue_name}") do
74
+ trace_execution_scoped("ActiveJob/#{adapter.sub(/^ActiveJob::/, '')}/Queue/#{event}/Named/#{job.queue_name}",
75
+ code_information: code_information_for_job(job)) do
61
76
  block.call
62
77
  end
63
78
  end
64
79
 
65
- def self.run_in_transaction(state, job, block)
66
- ::NewRelic::Agent::Transaction.wrap(state,
67
- transaction_name_for_job(job),
68
- :other,
69
- &block)
80
+ def self.run_in_transaction(job, block)
81
+ options = code_information_for_job(job)
82
+ options = {} if options.frozen? # the hash will be added to later
83
+ ::NewRelic::Agent::Tracer.in_transaction(name: transaction_name_for_job(job),
84
+ category: :other, options: options, &block)
85
+ end
86
+
87
+ def self.code_information_for_job(job)
88
+ NewRelic::Agent::MethodTracerHelpers.code_information(job.class, :perform)
70
89
  end
71
90
 
72
91
  def self.transaction_category
@@ -0,0 +1,41 @@
1
+ # This file is distributed under New Relic's license terms.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
+
5
+ require 'new_relic/agent/instrumentation/notifications_subscriber'
6
+
7
+ module NewRelic
8
+ module Agent
9
+ module Instrumentation
10
+ class ActiveJobSubscriber < NotificationsSubscriber
11
+ PAYLOAD_KEYS = %i[adapter db_runtime error job wait]
12
+
13
+ def add_segment_params(segment, payload)
14
+ PAYLOAD_KEYS.each do |key|
15
+ segment.params[key] = payload[key] if payload.key?(key)
16
+ end
17
+ end
18
+
19
+ def metric_name(name, payload)
20
+ queue = payload[:job].queue_name
21
+ method = method_from_name(name)
22
+ "Ruby/ActiveJob/#{queue}/#{method}"
23
+ end
24
+
25
+ PATTERN = /\A([^\.]+)\.active_job\z/
26
+
27
+ METHOD_NAME_MAPPING = Hash.new do |h, k|
28
+ if PATTERN =~ k
29
+ h[k] = $1
30
+ else
31
+ h[k] = NewRelic::UNKNOWN
32
+ end
33
+ end
34
+
35
+ def method_from_name(name)
36
+ METHOD_NAME_MAPPING[name]
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/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
  @name = :active_merchant
@@ -12,7 +12,7 @@ DependencyDetection.defer do
12
12
  end
13
13
 
14
14
  executes do
15
- ::NewRelic::Agent.logger.info 'Installing ActiveMerchant instrumentation'
15
+ NewRelic::Agent.logger.info('Installing ActiveMerchant instrumentation')
16
16
  end
17
17
 
18
18
  executes do
@@ -24,14 +24,28 @@ DependencyDetection.defer do
24
24
  gateway.class_eval do
25
25
  implemented_methods = public_instance_methods(false).map(&:to_sym)
26
26
  gateway_name = self.name.split('::').last
27
- [:authorize, :purchase, :credit, :void, :capture, :recurring, :store, :unstore, :update].each do |operation|
27
+ actions = [:authorize, :purchase, :credit, :void, :capture, :recurring, :store, :unstore, :update]
28
+ actions.each do |operation|
28
29
  if implemented_methods.include?(operation)
29
- add_method_tracer operation, "ActiveMerchant/gateway/#{gateway_name}/#{operation}"
30
- add_method_tracer operation, "ActiveMerchant/gateway/#{gateway_name}", :push_scope => false
31
- add_method_tracer operation, "ActiveMerchant/operation/#{operation}", :push_scope => false
30
+ add_method_tracer operation, [-> (*) { "ActiveMerchant/gateway/#{gateway_name}/#{operation}" },
31
+ -> (*) { "ActiveMerchant/gateway/#{gateway_name}" },
32
+ -> (*) { "ActiveMerchant/operation/#{operation}" }]
32
33
  end
33
34
  end
34
35
  end
35
36
  end
36
37
  end
38
+
39
+ executes do
40
+ next unless Gem::Version.new(ActiveMerchant::VERSION) < Gem::Version.new('1.65.0')
41
+
42
+ deprecation_msg = 'The Ruby Agent is dropping support for ActiveMerchant versions below 1.65.0 ' \
43
+ 'in version 9.0.0. Please upgrade your ActiveMerchant version to continue receiving full support. ' \
44
+
45
+ NewRelic::Agent.logger.log_once(
46
+ :warn,
47
+ :deprecated_active_merchant_version,
48
+ deprecation_msg
49
+ )
50
+ end
37
51
  end