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,61 @@
1
+ # This file is distributed under New Relic's license terms.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
+
5
+ require_relative 'instrumentation'
6
+
7
+ module NewRelic
8
+ module Agent
9
+ module Instrumentation
10
+ module Curb
11
+ module Easy
12
+ module Prepend
13
+ include NewRelic::Agent::Instrumentation::Curb::Easy
14
+
15
+ def http_head(*args, &blk)
16
+ http_head_with_tracing { super }
17
+ end
18
+
19
+ def http_post(*args, &blk)
20
+ http_post_with_tracing { super }
21
+ end
22
+
23
+ def http_put(*args, &blk)
24
+ http_put_with_tracing { super }
25
+ end
26
+
27
+ def http(verb)
28
+ http_with_tracing(verb) { super }
29
+ end
30
+
31
+ def perform
32
+ perform_with_tracing { super }
33
+ end
34
+
35
+ def method(verb)
36
+ method_with_tracing(verb) { super }
37
+ end
38
+
39
+ def header_str
40
+ header_str_with_tracing { super }
41
+ end
42
+ end
43
+ end
44
+
45
+ module Multi
46
+ module Prepend
47
+ include NewRelic::Agent::Instrumentation::Curb::Multi
48
+
49
+ def add(curl)
50
+ add_with_tracing(curl) { super }
51
+ end
52
+
53
+ def perform(&blk)
54
+ perform_with_tracing { super }
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -1,6 +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
+
5
+ require_relative 'curb/chain'
6
+ require_relative 'curb/prepend'
4
7
 
5
8
  DependencyDetection.defer do
6
9
  named :curb
@@ -8,197 +11,22 @@ DependencyDetection.defer do
8
11
  CURB_MIN_VERSION = Gem::Version.new("0.8.1")
9
12
 
10
13
  depends_on do
11
- defined?(::Curl) && defined?(::Curl::CURB_VERSION) &&
12
- Gem::Version.new(::Curl::CURB_VERSION) >= CURB_MIN_VERSION
14
+ defined?(Curl) && defined?(Curl::CURB_VERSION) &&
15
+ Gem::Version.new(Curl::CURB_VERSION) >= CURB_MIN_VERSION
13
16
  end
14
17
 
15
18
  executes do
16
- ::NewRelic::Agent.logger.info 'Installing Curb instrumentation'
17
- require 'new_relic/agent/cross_app_tracing'
19
+ NewRelic::Agent.logger.info('Installing Curb instrumentation')
20
+ require 'new_relic/agent/distributed_tracing/cross_app_tracing'
18
21
  require 'new_relic/agent/http_clients/curb_wrappers'
19
22
  end
20
23
 
21
24
  executes do
22
- class Curl::Easy
23
-
24
- attr_accessor :_nr_instrumented,
25
- :_nr_http_verb,
26
- :_nr_header_str,
27
- :_nr_original_on_header,
28
- :_nr_original_on_complete,
29
- :_nr_serial
30
-
31
- # We have to hook these three methods separately, as they don't use
32
- # Curl::Easy#http
33
- def http_head_with_newrelic(*args, &blk)
34
- self._nr_http_verb = :HEAD
35
- http_head_without_newrelic(*args, &blk)
36
- end
37
- alias_method :http_head_without_newrelic, :http_head
38
- alias_method :http_head, :http_head_with_newrelic
39
-
40
- def http_post_with_newrelic(*args, &blk)
41
- self._nr_http_verb = :POST
42
- http_post_without_newrelic(*args, &blk)
43
- end
44
- alias_method :http_post_without_newrelic, :http_post
45
- alias_method :http_post, :http_post_with_newrelic
46
-
47
- def http_put_with_newrelic(*args, &blk)
48
- self._nr_http_verb = :PUT
49
- http_put_without_newrelic(*args, &blk)
50
- end
51
- alias_method :http_put_without_newrelic, :http_put
52
- alias_method :http_put, :http_put_with_newrelic
53
-
54
-
55
- # Hook the #http method to set the verb.
56
- def http_with_newrelic( verb )
57
- self._nr_http_verb = verb.to_s.upcase
58
- http_without_newrelic( verb )
59
- end
60
-
61
- alias_method :http_without_newrelic, :http
62
- alias_method :http, :http_with_newrelic
63
-
64
- # Hook the #perform method to mark the request as non-parallel.
65
- def perform_with_newrelic
66
- self._nr_http_verb ||= :GET
67
- self._nr_serial = true
68
- perform_without_newrelic
69
- end
70
-
71
- alias_method :perform_without_newrelic, :perform
72
- alias_method :perform, :perform_with_newrelic
73
-
74
- # Record the HTTP verb for future #perform calls
75
- def method_with_newrelic(m)
76
- self._nr_http_verb = m.upcase
77
- method_without_newrelic(m)
78
- end
79
-
80
- alias_method :method_without_newrelic, :method
81
- alias_method :method, :method_with_newrelic
82
-
83
- # We override this method in order to ensure access to header_str even
84
- # though we use an on_header callback
85
- def header_str_with_newrelic
86
- if self._nr_serial
87
- self._nr_header_str
88
- else
89
- # Since we didn't install a header callback for a non-serial request,
90
- # just fall back to the original implementation.
91
- header_str_without_newrelic
92
- end
93
- end
94
-
95
- alias_method :header_str_without_newrelic, :header_str
96
- alias_method :header_str, :header_str_with_newrelic
97
- end # class Curl::Easy
98
-
99
-
100
- class Curl::Multi
101
- include NewRelic::Agent::MethodTracer
102
-
103
- # Add CAT with callbacks if the request is serial
104
- def add_with_newrelic(curl) #THREAD_LOCAL_ACCESS
105
- if curl.respond_to?(:_nr_serial) && curl._nr_serial
106
- hook_pending_request(curl) if NewRelic::Agent::Tracer.tracing_enabled?
107
- end
108
-
109
- return add_without_newrelic( curl )
110
- end
111
-
112
- alias_method :add_without_newrelic, :add
113
- alias_method :add, :add_with_newrelic
114
-
115
-
116
- # Trace as an External/Multiple call if the first request isn't serial.
117
- def perform_with_newrelic(&blk)
118
- return perform_without_newrelic if
119
- self.requests.first &&
120
- self.requests.first.respond_to?(:_nr_serial) &&
121
- self.requests.first._nr_serial
122
-
123
- trace_execution_scoped("External/Multiple/Curb::Multi/perform") do
124
- perform_without_newrelic(&blk)
125
- end
126
- end
127
-
128
- alias_method :perform_without_newrelic, :perform
129
- alias_method :perform, :perform_with_newrelic
130
-
131
-
132
- # Instrument the specified +request+ (a Curl::Easy object) and set up cross-application
133
- # tracing if it's enabled.
134
- def hook_pending_request(request) #THREAD_LOCAL_ACCESS
135
- wrapped_request, wrapped_response = wrap_request(request)
136
-
137
- segment = NewRelic::Agent::Tracer.start_external_request_segment(
138
- library: wrapped_request.type,
139
- uri: wrapped_request.uri,
140
- procedure: wrapped_request.method
141
- )
142
-
143
- segment.add_request_headers wrapped_request
144
-
145
- unless request._nr_instrumented
146
- install_header_callback(request, wrapped_response)
147
- install_completion_callback(request, wrapped_response, segment)
148
- request._nr_instrumented = true
149
- end
150
- rescue => err
151
- NewRelic::Agent.logger.error("Untrapped exception", err)
152
- end
153
-
154
-
155
- # Create request and response adapter objects for the specified +request+
156
- def wrap_request(request)
157
- return NewRelic::Agent::HTTPClients::CurbRequest.new(request),
158
- NewRelic::Agent::HTTPClients::CurbResponse.new(request)
159
- end
160
-
161
-
162
- # Install a callback that will record the response headers to enable
163
- # CAT linking
164
- def install_header_callback( request, wrapped_response )
165
- original_callback = request.on_header
166
- request._nr_original_on_header = original_callback
167
- request._nr_header_str = nil
168
- request.on_header do |header_data|
169
- if original_callback
170
- original_callback.call( header_data )
171
- else
172
- wrapped_response.append_header_data( header_data )
173
- header_data.length
174
- end
175
- end
176
- end
177
-
178
- # Install a callback that will finish the trace.
179
- def install_completion_callback(request, wrapped_response, segment) #THREAD_LOCAL_ACCESS
180
- original_callback = request.on_complete
181
- request._nr_original_on_complete = original_callback
182
- request.on_complete do |finished_request|
183
- begin
184
- segment.read_response_headers wrapped_response
185
- ensure
186
- segment.finish if segment
187
- # Make sure the existing completion callback is run, and restore the
188
- # on_complete callback to how it was before.
189
- original_callback.call(finished_request) if original_callback
190
- remove_instrumentation_callbacks(request)
191
- end
192
- end
193
- end
194
-
195
- def remove_instrumentation_callbacks(request)
196
- request.on_complete(&request._nr_original_on_complete)
197
- request.on_header(&request._nr_original_on_header)
198
- request._nr_instrumented = false
199
- end
200
-
201
- end # class Curl::Multi
202
-
25
+ if use_prepend?
26
+ prepend_instrument Curl::Easy, NewRelic::Agent::Instrumentation::Curb::Easy::Prepend
27
+ prepend_instrument Curl::Multi, NewRelic::Agent::Instrumentation::Curb::Multi::Prepend
28
+ else
29
+ chain_instrument NewRelic::Agent::Instrumentation::Curb::Chain
30
+ end
203
31
  end
204
32
  end
@@ -0,0 +1,12 @@
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
+ # This is a helper file that will allow apps using ActiveSupport without Rails
6
+ # to still leverage all ActiveSupport based instrumentation functionality
7
+ # offered by the agent that would otherwise be gated by the detection of Rails.
8
+
9
+ # ActiveSupport notifications custom events
10
+ if !defined?(Rails) && defined?(ActiveSupport::Notifications) && defined?(ActiveSupport::IsolatedExecutionState)
11
+ require_relative 'rails_notifications/custom_events'
12
+ end
@@ -0,0 +1,37 @@
1
+ # This file is distributed under New Relic's license terms.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
+
5
+ require 'new_relic/agent/instrumentation/notifications_subscriber'
6
+
7
+ # Listen for ActiveSupport::Notifications events for custom events
8
+ module NewRelic::Agent::Instrumentation
9
+ class CustomEventsSubscriber < NotificationsSubscriber
10
+ def start(name, id, _payload) # THREAD_LOCAL_ACCESS
11
+ return unless state.is_execution_traced?
12
+
13
+ finishable = NewRelic::Agent::Tracer.start_transaction_or_segment(name: transaction_name(name),
14
+ category: :custom_events)
15
+ push_segment(id, finishable)
16
+ rescue => e
17
+ log_notification_error(e, name, 'start')
18
+ end
19
+
20
+ def finish(name, id, payload) # THREAD_LOCAL_ACCESS
21
+ return unless state.is_execution_traced?
22
+
23
+ NewRelic::Agent.notice_error(payload[:exception_object]) if payload.key?(:exception_object)
24
+
25
+ finishable = pop_segment(id)
26
+ finishable.finish if finishable
27
+ rescue => e
28
+ log_notification_error(e, name, 'finish')
29
+ end
30
+
31
+ private
32
+
33
+ def transaction_name(name)
34
+ "ActiveSupport/CustomEvents/#{name}"
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,35 @@
1
+ # This file is distributed under New Relic's license terms.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
+ require_relative 'instrumentation'
5
+
6
+ module NewRelic::Agent::Instrumentation
7
+ module DelayedJob
8
+ module Chain
9
+ def self.instrument!
10
+ Delayed::Worker.class_eval do
11
+ include NewRelic::Agent::Instrumentation::DelayedJob
12
+
13
+ def initialize_with_new_relic(*args)
14
+ initialize_with_tracing { initialize_without_new_relic(*args) }
15
+ end
16
+
17
+ alias initialize_without_new_relic initialize
18
+ alias initialize initialize_with_new_relic
19
+
20
+ def install_newrelic_job_tracer
21
+ Delayed::Job.class_eval do
22
+ include NewRelic::Agent::Instrumentation::DelayedJobTracer
23
+
24
+ alias_method(:invoke_job_without_new_relic, :invoke_job)
25
+
26
+ def invoke_job(*args, &block)
27
+ invoke_job_with_tracing { invoke_job_without_new_relic(*args, &block) }
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,48 @@
1
+ # This file is distributed under New Relic's license terms.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
+
5
+ module NewRelic
6
+ module Agent
7
+ module Instrumentation
8
+ module DelayedJob
9
+ def initialize_with_tracing
10
+ yield
11
+ worker_name = case
12
+ when self.respond_to?(:name) then self.name
13
+ when self.class.respond_to?(:default_name) then self.class.default_name
14
+ end
15
+ NewRelic::DelayedJobInjection.worker_name = worker_name
16
+
17
+ # TODO: Refactor the last line of this condition so that it can be evaluated in both prepend and chain instrumentation
18
+ if defined?(::Delayed::Job) && ::Delayed::Job.method_defined?(:invoke_job) &&
19
+ !(::Delayed::Job.method_defined?(:invoke_job_without_new_relic))
20
+
21
+ ::NewRelic::Agent.logger.info('Installing DelayedJob instrumentation [part 2/2]')
22
+ install_newrelic_job_tracer
23
+ NewRelic::Control.instance.init_plugin(:dispatcher => :delayed_job)
24
+ else
25
+ NewRelic::Agent.logger.warn("Did not find a Delayed::Job class responding to invoke_job, aborting DJ instrumentation")
26
+ end
27
+ end
28
+ end
29
+
30
+ module DelayedJobTracer
31
+ include NewRelic::Agent::Instrumentation::ControllerInstrumentation
32
+
33
+ NR_TRANSACTION_CATEGORY = 'OtherTransaction/DelayedJob'.freeze
34
+
35
+ def invoke_job_with_tracing
36
+ options = {
37
+ :category => NR_TRANSACTION_CATEGORY,
38
+ :path => ::NewRelic::Agent::Instrumentation::DelayedJob::Naming.name_from_payload(payload_object)
39
+ }
40
+
41
+ perform_action_with_newrelic_trace(options) do
42
+ yield
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ 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_relative 'instrumentation'
6
+
7
+ module NewRelic
8
+ module Agent
9
+ module Instrumentation
10
+ module DelayedJob
11
+ module Prepend
12
+ include NewRelic::Agent::Instrumentation::DelayedJob
13
+
14
+ def initialize(*args)
15
+ initialize_with_tracing { super }
16
+ end
17
+
18
+ def install_newrelic_job_tracer
19
+ Delayed::Job.send(:prepend, ::NewRelic::Agent::Instrumentation::DelayedJobTracerPrepend)
20
+ end
21
+ end
22
+ end
23
+
24
+ module DelayedJobTracerPrepend
25
+ include NewRelic::Agent::Instrumentation::DelayedJobTracer
26
+
27
+ def invoke_job(*args, &block)
28
+ invoke_job_with_tracing { super }
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,6 +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
+
5
+ require_relative 'delayed_job/chain'
6
+ require_relative 'delayed_job/prepend'
4
7
 
5
8
  require 'new_relic/agent/instrumentation/controller_instrumentation'
6
9
 
@@ -11,14 +14,14 @@ module NewRelic
11
14
  module Naming
12
15
  module_function
13
16
 
14
- CLASS_METHOD_DELIMITER = '.'.freeze
15
- INSTANCE_METHOD_DELIMITER = '#'.freeze
17
+ CLASS_METHOD_DELIMITER = '.'.freeze
18
+ INSTANCE_METHOD_DELIMITER = '#'.freeze
16
19
  LEGACY_DJ_FORMAT_DELIMITER = ';'.freeze
17
- LEGACY_DJ_FORMAT_PREFIX = 'LOAD'.freeze
18
- LEGACY_DJ_DEFAULT_CLASS = '(unknown class)'.freeze
20
+ LEGACY_DJ_FORMAT_PREFIX = 'LOAD'.freeze
21
+ LEGACY_DJ_DEFAULT_CLASS = '(unknown class)'.freeze
19
22
 
20
23
  def name_from_payload(payload_object)
21
- if payload_object.is_a? ::Delayed::PerformableMethod
24
+ if payload_object.is_a?(::Delayed::PerformableMethod)
22
25
  # payload_object contains a reference to an object
23
26
  # that received an asynchronous method call via .delay or .handle_asynchronously
24
27
  "#{object_name(payload_object)}#{delimiter(payload_object)}#{method_name(payload_object)}"
@@ -76,61 +79,36 @@ DependencyDetection.defer do
76
79
  @name = :delayed_job
77
80
 
78
81
  depends_on do
79
- !NewRelic::Agent.config[:disable_dj]
82
+ defined?(Delayed) && defined?(Delayed::Worker)
80
83
  end
81
84
 
82
- depends_on do
83
- defined?(::Delayed) && defined?(::Delayed::Worker) && !NewRelic::Agent.config[:disable_dj]
85
+ executes do
86
+ NewRelic::Agent.logger.info('Installing DelayedJob instrumentation [part 1/2]')
84
87
  end
85
88
 
86
89
  executes do
87
- ::NewRelic::Agent.logger.info 'Installing DelayedJob instrumentation [part 1/2]'
90
+ if use_prepend?
91
+ prepend_instrument Delayed::Worker, NewRelic::Agent::Instrumentation::DelayedJob::Prepend
92
+ else
93
+ chain_instrument NewRelic::Agent::Instrumentation::DelayedJob::Chain
94
+ end
88
95
  end
89
96
 
90
97
  executes do
91
- Delayed::Worker.class_eval do
92
- def initialize_with_new_relic(*args)
93
- initialize_without_new_relic(*args)
94
- worker_name = case
95
- when self.respond_to?(:name) then self.name
96
- when self.class.respond_to?(:default_name) then self.class.default_name
97
- end
98
- NewRelic::DelayedJobInjection.worker_name = worker_name
99
-
100
- if defined?(::Delayed::Job) && ::Delayed::Job.method_defined?(:invoke_job) &&
101
- !(::Delayed::Job.method_defined?(:invoke_job_without_new_relic) )
102
-
103
- ::NewRelic::Agent.logger.info 'Installing DelayedJob instrumentation [part 2/2]'
104
- install_newrelic_job_tracer
105
- NewRelic::Control.instance.init_plugin :dispatcher => :delayed_job
106
- else
107
- NewRelic::Agent.logger.warn("Did not find a Delayed::Job class responding to invoke_job, aborting DJ instrumentation")
108
- end
109
- end
110
-
111
- alias initialize_without_new_relic initialize
112
- alias initialize initialize_with_new_relic
113
-
114
- NR_TRANSACTION_CATEGORY = 'OtherTransaction/DelayedJob'.freeze
98
+ next unless delayed_job_version < Gem::Version.new('4.1.0')
115
99
 
116
- def install_newrelic_job_tracer
117
- Delayed::Job.class_eval do
118
- include NewRelic::Agent::Instrumentation::ControllerInstrumentation
100
+ deprecation_msg = 'Instrumentation for DelayedJob versions below 4.1.0 is deprecated.' \
101
+ 'It will stop being monitored in version 9.0.0. ' \
102
+ 'Please upgrade your DelayedJob version to continue receiving full support. ' \
119
103
 
120
- alias_method :invoke_job_without_new_relic, :invoke_job
121
-
122
- def invoke_job(*args, &block)
123
- options = {
124
- :category => NR_TRANSACTION_CATEGORY,
125
- :path => ::NewRelic::Agent::Instrumentation::DelayedJob::Naming.name_from_payload(payload_object)
126
- }
104
+ NewRelic::Agent.logger.log_once(
105
+ :warn,
106
+ :deprecated_delayed_job_version,
107
+ deprecation_msg
108
+ )
109
+ end
127
110
 
128
- perform_action_with_newrelic_trace(options) do
129
- invoke_job_without_new_relic(*args, &block)
130
- end
131
- end
132
- end
133
- end
134
- end
111
+ def delayed_job_version
112
+ Gem.loaded_specs['delayed_job'].version if Gem.loaded_specs['delayed_job']
135
113
  end
136
114
  end
@@ -0,0 +1,29 @@
1
+ # This file is distributed under New Relic's license terms.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
+
5
+ module NewRelic::Agent::Instrumentation
6
+ module Elasticsearch
7
+ def self.instrument!
8
+ to_instrument = if ::Gem::Version.create(::Elasticsearch::VERSION) <
9
+ ::Gem::Version.create("8.0.0")
10
+ ::Elasticsearch::Transport::Client
11
+ else
12
+ ::Elastic::Transport::Client
13
+ end
14
+
15
+ to_instrument.class_eval do
16
+ include NewRelic::Agent::Instrumentation::Elasticsearch
17
+
18
+ alias_method(:perform_request_without_tracing, :perform_request)
19
+ alias_method(:perform_request, :perform_request_with_tracing)
20
+
21
+ def perform_request(*args)
22
+ perform_request_with_tracing(*args) do
23
+ perform_request_without_tracing(*args)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,66 @@
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
+ require_relative '../../datastores/nosql_obfuscator'
5
+
6
+ module NewRelic::Agent::Instrumentation
7
+ module Elasticsearch
8
+ PRODUCT_NAME = 'Elasticsearch'
9
+ OPERATION = 'perform_request'
10
+
11
+ def perform_request_with_tracing(method, path, params = {}, body = nil, headers = nil)
12
+ return yield unless NewRelic::Agent::Tracer.tracing_enabled?
13
+
14
+ segment = NewRelic::Agent::Tracer.start_datastore_segment(
15
+ product: PRODUCT_NAME,
16
+ operation: nr_operation || OPERATION,
17
+ host: nr_hosts[:host],
18
+ port_path_or_id: path,
19
+ database_name: nr_cluster_name
20
+ )
21
+ begin
22
+ NewRelic::Agent::Tracer.capture_segment_error(segment) { yield }
23
+ ensure
24
+ if segment
25
+ segment.notice_nosql_statement(nr_reported_query(body || params))
26
+ segment.finish
27
+ end
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def nr_operation
34
+ operation_index = caller_locations.index do |line|
35
+ string = line.to_s
36
+ string.include?('lib/elasticsearch/api') && !string.include?(OPERATION)
37
+ end
38
+ return nil unless operation_index
39
+
40
+ caller_locations[operation_index].to_s.split('`')[-1].gsub(/\W/, "")
41
+ end
42
+
43
+ def nr_reported_query(query)
44
+ return unless NewRelic::Agent.config[:'elasticsearch.capture_queries']
45
+ return query unless NewRelic::Agent.config[:'elasticsearch.obfuscate_queries']
46
+
47
+ NewRelic::Agent::Datastores::NosqlObfuscator.obfuscate_statement(query)
48
+ end
49
+
50
+ def nr_cluster_name
51
+ return @nr_cluster_name if @nr_cluster_name
52
+ return if nr_hosts.empty?
53
+
54
+ NewRelic::Agent.disable_all_tracing do
55
+ @nr_cluster_name ||= perform_request('GET', '_cluster/health').body["cluster_name"]
56
+ end
57
+ rescue StandardError => e
58
+ NewRelic::Agent.logger.error("Failed to get cluster name for elasticsearch", e)
59
+ nil
60
+ end
61
+
62
+ def nr_hosts
63
+ @nr_hosts ||= (transport.hosts.first || NewRelic::EMPTY_HASH)
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,13 @@
1
+ # This file is distributed under New Relic's license terms.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
+
5
+ module NewRelic::Agent::Instrumentation
6
+ module Elasticsearch::Prepend
7
+ include NewRelic::Agent::Instrumentation::Elasticsearch
8
+
9
+ def perform_request(*args)
10
+ perform_request_with_tracing(*args) { super }
11
+ end
12
+ end
13
+ end