newrelic_rpm 6.15.0 → 9.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (485) hide show
  1. checksums.yaml +4 -4
  2. data/.build_ignore +26 -0
  3. data/CHANGELOG.md +4176 -2789
  4. data/CONTRIBUTING.md +32 -13
  5. data/Gemfile +1 -2
  6. data/LICENSE +0 -6
  7. data/README.md +29 -22
  8. data/Rakefile +33 -35
  9. data/THIRD_PARTY_NOTICES.md +14 -199
  10. data/Thorfile +5 -0
  11. data/bin/newrelic +4 -9
  12. data/bin/newrelic_rpm +15 -0
  13. data/bin/nrdebug +85 -62
  14. data/init.rb +6 -8
  15. data/install.rb +2 -2
  16. data/lib/new_relic/agent/adaptive_sampler.rb +13 -9
  17. data/lib/new_relic/agent/agent.rb +99 -941
  18. data/lib/new_relic/agent/agent_helpers/connect.rb +222 -0
  19. data/lib/new_relic/agent/agent_helpers/harvest.rb +153 -0
  20. data/lib/new_relic/agent/agent_helpers/shutdown.rb +72 -0
  21. data/lib/new_relic/agent/agent_helpers/special_startup.rb +74 -0
  22. data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +175 -0
  23. data/lib/new_relic/agent/agent_helpers/startup.rb +202 -0
  24. data/lib/new_relic/agent/agent_helpers/transmit.rb +76 -0
  25. data/lib/new_relic/agent/agent_logger.rb +27 -23
  26. data/lib/new_relic/agent/attribute_filter.rb +67 -50
  27. data/lib/new_relic/agent/attribute_pre_filtering.rb +109 -0
  28. data/lib/new_relic/agent/attribute_processing.rb +9 -9
  29. data/lib/new_relic/agent/attributes.rb +5 -4
  30. data/lib/new_relic/agent/audit_logger.rb +13 -8
  31. data/lib/new_relic/agent/autostart.rb +21 -20
  32. data/lib/new_relic/agent/chained_call.rb +1 -1
  33. data/lib/new_relic/agent/commands/agent_command.rb +4 -4
  34. data/lib/new_relic/agent/commands/agent_command_router.rb +15 -13
  35. data/lib/new_relic/agent/commands/thread_profiler_session.rb +16 -14
  36. data/lib/new_relic/agent/configuration/default_source.rb +1608 -1182
  37. data/lib/new_relic/agent/configuration/dotted_hash.rb +6 -5
  38. data/lib/new_relic/agent/configuration/environment_source.rb +13 -11
  39. data/lib/new_relic/agent/configuration/event_harvest_config.rb +40 -17
  40. data/lib/new_relic/agent/configuration/high_security_source.rb +11 -12
  41. data/lib/new_relic/agent/configuration/manager.rb +103 -75
  42. data/lib/new_relic/agent/configuration/manual_source.rb +1 -1
  43. data/lib/new_relic/agent/configuration/mask_defaults.rb +3 -3
  44. data/lib/new_relic/agent/configuration/security_policy_source.rb +92 -95
  45. data/lib/new_relic/agent/configuration/server_source.rb +43 -41
  46. data/lib/new_relic/agent/configuration/yaml_source.rb +47 -10
  47. data/lib/new_relic/agent/configuration.rb +1 -1
  48. data/lib/new_relic/agent/connect/request_builder.rb +18 -18
  49. data/lib/new_relic/agent/connect/response_handler.rb +5 -8
  50. data/lib/new_relic/agent/custom_event_aggregator.rb +42 -16
  51. data/lib/new_relic/agent/database/explain_plan_helpers.rb +5 -6
  52. data/lib/new_relic/agent/database/obfuscation_helpers.rb +16 -15
  53. data/lib/new_relic/agent/database/obfuscator.rb +4 -4
  54. data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +3 -3
  55. data/lib/new_relic/agent/database.rb +45 -53
  56. data/lib/new_relic/agent/database_adapter.rb +3 -1
  57. data/lib/new_relic/agent/datastores/metric_helper.rb +21 -22
  58. data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +7 -6
  59. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +17 -21
  60. data/lib/new_relic/agent/datastores/mongo.rb +6 -11
  61. data/lib/new_relic/agent/datastores/nosql_obfuscator.rb +41 -0
  62. data/lib/new_relic/agent/datastores/redis.rb +9 -15
  63. data/lib/new_relic/agent/datastores.rb +13 -15
  64. data/lib/new_relic/agent/deprecator.rb +1 -1
  65. data/lib/new_relic/agent/distributed_tracing/cross_app_payload.rb +10 -10
  66. data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +45 -40
  67. data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +22 -22
  68. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +23 -23
  69. data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +52 -54
  70. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +10 -11
  71. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +82 -83
  72. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +42 -41
  73. data/lib/new_relic/agent/distributed_tracing.rb +33 -101
  74. data/lib/new_relic/agent/encoding_normalizer.rb +4 -2
  75. data/lib/new_relic/agent/error_collector.rb +105 -58
  76. data/lib/new_relic/agent/error_event_aggregator.rb +4 -5
  77. data/lib/new_relic/agent/error_filter.rb +174 -0
  78. data/lib/new_relic/agent/error_trace_aggregator.rb +9 -7
  79. data/lib/new_relic/agent/event_aggregator.rb +22 -21
  80. data/lib/new_relic/agent/event_buffer.rb +7 -8
  81. data/lib/new_relic/agent/event_listener.rb +1 -2
  82. data/lib/new_relic/agent/event_loop.rb +27 -25
  83. data/lib/new_relic/agent/external.rb +11 -44
  84. data/lib/new_relic/agent/guid_generator.rb +13 -11
  85. data/lib/new_relic/agent/harvester.rb +5 -8
  86. data/lib/new_relic/agent/heap.rb +8 -9
  87. data/lib/new_relic/agent/hostname.rb +21 -14
  88. data/lib/new_relic/agent/http_clients/abstract.rb +22 -31
  89. data/lib/new_relic/agent/http_clients/async_http_wrappers.rb +80 -0
  90. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +14 -17
  91. data/lib/new_relic/agent/http_clients/ethon_wrappers.rb +109 -0
  92. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +15 -17
  93. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +7 -6
  94. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +8 -9
  95. data/lib/new_relic/agent/http_clients/httpx_wrappers.rb +91 -0
  96. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +13 -8
  97. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +12 -13
  98. data/lib/new_relic/agent/http_clients/uri_util.rb +3 -5
  99. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +9 -22
  100. data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +42 -0
  101. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +41 -33
  102. data/lib/new_relic/agent/instrumentation/action_dispatch.rb +31 -0
  103. data/lib/new_relic/agent/instrumentation/action_dispatch_subscriber.rb +64 -0
  104. data/lib/new_relic/agent/instrumentation/action_mailbox.rb +30 -0
  105. data/lib/new_relic/agent/instrumentation/action_mailbox_subscriber.rb +33 -0
  106. data/lib/new_relic/agent/instrumentation/action_mailer.rb +30 -0
  107. data/lib/new_relic/agent/instrumentation/action_mailer_subscriber.rb +85 -0
  108. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +20 -21
  109. data/lib/new_relic/agent/instrumentation/active_job.rb +33 -13
  110. data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +41 -0
  111. data/lib/new_relic/agent/instrumentation/active_merchant.rb +20 -6
  112. data/lib/new_relic/agent/instrumentation/active_record.rb +41 -38
  113. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +87 -75
  114. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +54 -66
  115. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +6 -6
  116. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +30 -22
  117. data/lib/new_relic/agent/instrumentation/active_storage.rb +7 -3
  118. data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +8 -33
  119. data/lib/new_relic/agent/instrumentation/active_support.rb +27 -0
  120. data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger/chain.rb +69 -0
  121. data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger/instrumentation.rb +13 -0
  122. data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger/prepend.rb +37 -0
  123. data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger.rb +23 -0
  124. data/lib/new_relic/agent/instrumentation/active_support_logger/chain.rb +23 -0
  125. data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +24 -0
  126. data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +12 -0
  127. data/lib/new_relic/agent/instrumentation/active_support_logger.rb +26 -0
  128. data/lib/new_relic/agent/instrumentation/active_support_subscriber.rb +41 -0
  129. data/lib/new_relic/agent/instrumentation/async_http/chain.rb +23 -0
  130. data/lib/new_relic/agent/instrumentation/async_http/instrumentation.rb +37 -0
  131. data/lib/new_relic/agent/instrumentation/async_http/prepend.rb +15 -0
  132. data/lib/new_relic/agent/instrumentation/async_http.rb +28 -0
  133. data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
  134. data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +159 -0
  135. data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
  136. data/lib/new_relic/agent/instrumentation/bunny.rb +11 -154
  137. data/lib/new_relic/agent/instrumentation/concurrent_ruby/chain.rb +36 -0
  138. data/lib/new_relic/agent/instrumentation/concurrent_ruby/instrumentation.rb +20 -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 +74 -63
  142. data/lib/new_relic/agent/instrumentation/curb/chain.rb +91 -0
  143. data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +225 -0
  144. data/lib/new_relic/agent/instrumentation/curb/prepend.rb +61 -0
  145. data/lib/new_relic/agent/instrumentation/curb.rb +14 -246
  146. data/lib/new_relic/agent/instrumentation/custom_events.rb +12 -0
  147. data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +38 -0
  148. data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +36 -0
  149. data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +51 -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 -53
  152. data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +29 -0
  153. data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +70 -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/ethon/chain.rb +39 -0
  157. data/lib/new_relic/agent/instrumentation/ethon/instrumentation.rb +105 -0
  158. data/lib/new_relic/agent/instrumentation/ethon/prepend.rb +35 -0
  159. data/lib/new_relic/agent/instrumentation/ethon.rb +39 -0
  160. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +11 -7
  161. data/lib/new_relic/agent/instrumentation/excon.rb +27 -29
  162. data/lib/new_relic/agent/instrumentation/fiber/chain.rb +27 -0
  163. data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +20 -0
  164. data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +25 -0
  165. data/lib/new_relic/agent/instrumentation/fiber.rb +25 -0
  166. data/lib/new_relic/agent/instrumentation/grape/chain.rb +24 -0
  167. data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +104 -0
  168. data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
  169. data/lib/new_relic/agent/instrumentation/grape.rb +16 -117
  170. data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +97 -0
  171. data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +94 -0
  172. data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +111 -0
  173. data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +30 -0
  174. data/lib/new_relic/agent/instrumentation/grpc/helper.rb +32 -0
  175. data/lib/new_relic/agent/instrumentation/grpc/server/chain.rb +69 -0
  176. data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +138 -0
  177. data/lib/new_relic/agent/instrumentation/grpc/server/rpc_desc_prepend.rb +35 -0
  178. data/lib/new_relic/agent/instrumentation/grpc/server/rpc_server_prepend.rb +26 -0
  179. data/lib/new_relic/agent/instrumentation/grpc_client.rb +23 -0
  180. data/lib/new_relic/agent/instrumentation/grpc_server.rb +25 -0
  181. data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +24 -0
  182. data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +41 -0
  183. data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +15 -0
  184. data/lib/new_relic/agent/instrumentation/httpclient.rb +10 -32
  185. data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
  186. data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +34 -0
  187. data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
  188. data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
  189. data/lib/new_relic/agent/instrumentation/httpx/chain.rb +20 -0
  190. data/lib/new_relic/agent/instrumentation/httpx/instrumentation.rb +51 -0
  191. data/lib/new_relic/agent/instrumentation/httpx/prepend.rb +15 -0
  192. data/lib/new_relic/agent/instrumentation/httpx.rb +27 -0
  193. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +5 -6
  194. data/lib/new_relic/agent/instrumentation/logger/chain.rb +21 -0
  195. data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +69 -0
  196. data/lib/new_relic/agent/instrumentation/logger/prepend.rb +13 -0
  197. data/lib/new_relic/agent/instrumentation/logger.rb +26 -0
  198. data/lib/new_relic/agent/instrumentation/memcache/chain.rb +15 -0
  199. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +59 -128
  200. data/lib/new_relic/agent/instrumentation/memcache/helper.rb +59 -0
  201. data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +99 -0
  202. data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +103 -0
  203. data/lib/new_relic/agent/instrumentation/memcache.rb +58 -74
  204. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +15 -14
  205. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +6 -8
  206. data/lib/new_relic/agent/instrumentation/mongo.rb +6 -137
  207. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +24 -23
  208. data/lib/new_relic/agent/instrumentation/net_http/chain.rb +24 -0
  209. data/lib/new_relic/agent/instrumentation/{net_prepend.rb → net_http/instrumentation.rb} +18 -14
  210. data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
  211. data/lib/new_relic/agent/instrumentation/net_http.rb +44 -0
  212. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +56 -10
  213. data/lib/new_relic/agent/instrumentation/padrino/chain.rb +38 -0
  214. data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +32 -0
  215. data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
  216. data/lib/new_relic/agent/instrumentation/padrino.rb +20 -58
  217. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +6 -6
  218. data/lib/new_relic/agent/instrumentation/queue_time.rb +9 -10
  219. data/lib/new_relic/agent/instrumentation/rack/chain.rb +66 -0
  220. data/lib/new_relic/agent/instrumentation/rack/helpers.rb +33 -0
  221. data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +81 -0
  222. data/lib/new_relic/agent/instrumentation/rack/prepend.rb +43 -0
  223. data/lib/new_relic/agent/instrumentation/rack.rb +32 -142
  224. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +25 -56
  225. data/lib/new_relic/agent/instrumentation/rails_middleware.rb +4 -4
  226. data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +9 -8
  227. data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +18 -5
  228. data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +8 -5
  229. data/lib/new_relic/agent/instrumentation/rails_notifications/custom_events.rb +30 -0
  230. data/lib/new_relic/agent/instrumentation/rake/chain.rb +20 -0
  231. data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +146 -0
  232. data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
  233. data/lib/new_relic/agent/instrumentation/rake.rb +17 -158
  234. data/lib/new_relic/agent/instrumentation/redis/chain.rb +45 -0
  235. data/lib/new_relic/agent/instrumentation/redis/constants.rb +17 -0
  236. data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +98 -0
  237. data/lib/new_relic/agent/instrumentation/redis/middleware.rb +16 -0
  238. data/lib/new_relic/agent/instrumentation/redis/prepend.rb +29 -0
  239. data/lib/new_relic/agent/instrumentation/redis.rb +19 -108
  240. data/lib/new_relic/agent/instrumentation/resque/chain.rb +21 -0
  241. data/lib/new_relic/agent/instrumentation/resque/helper.rb +19 -0
  242. data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +38 -0
  243. data/lib/new_relic/agent/instrumentation/resque/prepend.rb +15 -0
  244. data/lib/new_relic/agent/instrumentation/resque.rb +32 -43
  245. data/lib/new_relic/agent/instrumentation/roda/chain.rb +43 -0
  246. data/lib/new_relic/agent/instrumentation/roda/ignorer.rb +45 -0
  247. data/lib/new_relic/agent/instrumentation/roda/instrumentation.rb +68 -0
  248. data/lib/new_relic/agent/instrumentation/roda/prepend.rb +24 -0
  249. data/lib/new_relic/agent/instrumentation/roda/roda_transaction_namer.rb +29 -0
  250. data/lib/new_relic/agent/instrumentation/roda.rb +36 -0
  251. data/lib/new_relic/agent/instrumentation/sequel.rb +16 -19
  252. data/lib/new_relic/agent/instrumentation/sequel_helper.rb +12 -12
  253. data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +24 -0
  254. data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +30 -0
  255. data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +60 -0
  256. data/lib/new_relic/agent/instrumentation/sidekiq.rb +27 -65
  257. data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
  258. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +30 -36
  259. data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +130 -0
  260. data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
  261. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +4 -6
  262. data/lib/new_relic/agent/instrumentation/sinatra.rb +34 -163
  263. data/lib/new_relic/agent/instrumentation/stripe.rb +28 -0
  264. data/lib/new_relic/agent/instrumentation/stripe_subscriber.rb +77 -0
  265. data/lib/new_relic/agent/instrumentation/thread/chain.rb +24 -0
  266. data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +24 -0
  267. data/lib/new_relic/agent/instrumentation/thread/prepend.rb +22 -0
  268. data/lib/new_relic/agent/instrumentation/thread.rb +20 -0
  269. data/lib/new_relic/agent/instrumentation/tilt/chain.rb +24 -0
  270. data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +46 -0
  271. data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +13 -0
  272. data/lib/new_relic/agent/instrumentation/tilt.rb +25 -0
  273. data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
  274. data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +84 -0
  275. data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
  276. data/lib/new_relic/agent/instrumentation/typhoeus.rb +12 -91
  277. data/lib/new_relic/agent/instrumentation/view_component/chain.rb +21 -0
  278. data/lib/new_relic/agent/instrumentation/view_component/instrumentation.rb +39 -0
  279. data/lib/new_relic/agent/instrumentation/view_component/prepend.rb +13 -0
  280. data/lib/new_relic/agent/instrumentation/view_component.rb +26 -0
  281. data/lib/new_relic/agent/instrumentation.rb +1 -1
  282. data/lib/new_relic/agent/internal_agent_error.rb +2 -2
  283. data/lib/new_relic/agent/javascript_instrumentor.rb +58 -48
  284. data/lib/new_relic/agent/linking_metadata.rb +44 -0
  285. data/lib/new_relic/agent/local_log_decorator.rb +37 -0
  286. data/lib/new_relic/agent/log_event_aggregator.rb +282 -0
  287. data/lib/new_relic/agent/log_event_attributes.rb +115 -0
  288. data/lib/new_relic/agent/log_once.rb +1 -1
  289. data/lib/new_relic/agent/log_priority.rb +20 -0
  290. data/lib/new_relic/agent/logging.rb +95 -52
  291. data/lib/new_relic/agent/memory_logger.rb +2 -2
  292. data/lib/new_relic/agent/messaging.rb +72 -86
  293. data/lib/new_relic/agent/method_tracer.rb +159 -154
  294. data/lib/new_relic/agent/method_tracer_helpers.rb +109 -11
  295. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +26 -19
  296. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +5 -4
  297. data/lib/new_relic/agent/monitors/inbound_request_monitor.rb +1 -2
  298. data/lib/new_relic/agent/monitors/synthetics_monitor.rb +17 -9
  299. data/lib/new_relic/agent/monitors.rb +6 -7
  300. data/lib/new_relic/agent/new_relic_service/encoders.rb +9 -9
  301. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +6 -6
  302. data/lib/new_relic/agent/new_relic_service/marshaller.rb +2 -2
  303. data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +4 -4
  304. data/lib/new_relic/agent/new_relic_service.rb +282 -213
  305. data/lib/new_relic/agent/{noticible_error.rb → noticeable_error.rb} +2 -5
  306. data/lib/new_relic/agent/null_logger.rb +7 -3
  307. data/lib/new_relic/agent/obfuscator.rb +7 -11
  308. data/lib/new_relic/agent/parameter_filtering.rb +29 -15
  309. data/lib/new_relic/agent/payload_metric_mapping.rb +9 -10
  310. data/lib/new_relic/agent/pipe_channel_manager.rb +34 -23
  311. data/lib/new_relic/agent/pipe_service.rb +13 -8
  312. data/lib/new_relic/agent/prepend_supportability.rb +2 -2
  313. data/lib/new_relic/agent/priority_sampled_buffer.rb +9 -12
  314. data/lib/new_relic/agent/rules_engine/replacement_rule.rb +11 -11
  315. data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +12 -14
  316. data/lib/new_relic/agent/rules_engine.rb +6 -5
  317. data/lib/new_relic/agent/sampler.rb +5 -5
  318. data/lib/new_relic/agent/sampler_collection.rb +4 -5
  319. data/lib/new_relic/agent/samplers/cpu_sampler.rb +8 -7
  320. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +20 -17
  321. data/lib/new_relic/agent/samplers/memory_sampler.rb +32 -21
  322. data/lib/new_relic/agent/samplers/object_sampler.rb +2 -2
  323. data/lib/new_relic/agent/samplers/vm_sampler.rb +21 -19
  324. data/lib/new_relic/agent/span_event_aggregator.rb +15 -15
  325. data/lib/new_relic/agent/span_event_primitive.rb +77 -59
  326. data/lib/new_relic/agent/sql_sampler.rb +20 -21
  327. data/lib/new_relic/agent/stats.rb +79 -42
  328. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +9 -11
  329. data/lib/new_relic/agent/stats_engine/stats_hash.rb +12 -13
  330. data/lib/new_relic/agent/stats_engine.rb +8 -8
  331. data/lib/new_relic/agent/synthetics_event_aggregator.rb +8 -9
  332. data/lib/new_relic/agent/system_info.rb +113 -67
  333. data/lib/new_relic/agent/threading/agent_thread.rb +18 -14
  334. data/lib/new_relic/agent/threading/backtrace_node.rb +12 -13
  335. data/lib/new_relic/agent/threading/backtrace_service.rb +17 -21
  336. data/lib/new_relic/agent/threading/thread_profile.rb +24 -24
  337. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +2 -2
  338. data/lib/new_relic/agent/tracer.rb +101 -96
  339. data/lib/new_relic/agent/transaction/abstract_segment.rb +176 -52
  340. data/lib/new_relic/agent/transaction/datastore_segment.rb +22 -18
  341. data/lib/new_relic/agent/transaction/distributed_tracer.rb +65 -57
  342. data/lib/new_relic/agent/transaction/distributed_tracing.rb +46 -48
  343. data/lib/new_relic/agent/transaction/external_request_segment.rb +52 -39
  344. data/lib/new_relic/agent/transaction/message_broker_segment.rb +31 -37
  345. data/lib/new_relic/agent/transaction/request_attributes.rb +78 -42
  346. data/lib/new_relic/agent/transaction/segment.rb +20 -10
  347. data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +1 -3
  348. data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +2 -2
  349. data/lib/new_relic/agent/transaction/trace.rb +16 -12
  350. data/lib/new_relic/agent/transaction/trace_builder.rb +10 -10
  351. data/lib/new_relic/agent/transaction/trace_context.rb +35 -35
  352. data/lib/new_relic/agent/transaction/trace_node.rb +30 -28
  353. data/lib/new_relic/agent/transaction/tracing.rb +32 -13
  354. data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +6 -6
  355. data/lib/new_relic/agent/transaction.rb +229 -178
  356. data/lib/new_relic/agent/transaction_error_primitive.rb +43 -25
  357. data/lib/new_relic/agent/transaction_event_aggregator.rb +16 -16
  358. data/lib/new_relic/agent/transaction_event_primitive.rb +51 -33
  359. data/lib/new_relic/agent/transaction_event_recorder.rb +16 -15
  360. data/lib/new_relic/agent/transaction_metrics.rb +10 -9
  361. data/lib/new_relic/agent/transaction_sampler.rb +7 -8
  362. data/lib/new_relic/agent/transaction_time_aggregator.rb +32 -27
  363. data/lib/new_relic/agent/utilization/aws.rb +34 -4
  364. data/lib/new_relic/agent/utilization/azure.rb +6 -6
  365. data/lib/new_relic/agent/utilization/gcp.rb +11 -13
  366. data/lib/new_relic/agent/utilization/pcf.rb +6 -5
  367. data/lib/new_relic/agent/utilization/vendor.rb +45 -32
  368. data/lib/new_relic/agent/utilization_data.rb +7 -5
  369. data/lib/new_relic/agent/vm/c_ruby_vm.rb +99 -0
  370. data/lib/new_relic/agent/vm/jruby_vm.rb +1 -1
  371. data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +3 -3
  372. data/lib/new_relic/agent/vm/snapshot.rb +5 -5
  373. data/lib/new_relic/agent/vm.rb +3 -3
  374. data/lib/new_relic/agent/worker_loop.rb +10 -12
  375. data/lib/new_relic/agent.rb +204 -111
  376. data/lib/new_relic/base64.rb +25 -0
  377. data/lib/new_relic/cli/command.rb +26 -25
  378. data/lib/new_relic/cli/commands/deployments.rb +100 -49
  379. data/lib/new_relic/cli/commands/install.rb +31 -34
  380. data/lib/new_relic/coerce.rb +15 -13
  381. data/lib/new_relic/collection_helper.rb +50 -48
  382. data/lib/new_relic/constants.rb +13 -12
  383. data/lib/new_relic/control/class_methods.rb +6 -12
  384. data/lib/new_relic/control/frameworks/external.rb +2 -2
  385. data/lib/new_relic/control/frameworks/rails.rb +60 -30
  386. data/lib/new_relic/control/frameworks/rails3.rb +3 -4
  387. data/lib/new_relic/control/frameworks/rails4.rb +1 -1
  388. data/lib/new_relic/control/frameworks/rails_notifications.rb +1 -1
  389. data/lib/new_relic/control/frameworks/roda.rb +20 -0
  390. data/lib/new_relic/control/frameworks/ruby.rb +3 -3
  391. data/lib/new_relic/control/frameworks/sinatra.rb +7 -1
  392. data/lib/new_relic/control/frameworks.rb +1 -1
  393. data/lib/new_relic/control/instance_methods.rb +27 -45
  394. data/lib/new_relic/control/instrumentation.rb +25 -11
  395. data/lib/new_relic/control/private_instance_methods.rb +48 -0
  396. data/lib/new_relic/control/server_methods.rb +3 -4
  397. data/lib/new_relic/control.rb +1 -2
  398. data/lib/new_relic/delayed_job_injection.rb +1 -1
  399. data/lib/new_relic/dependency_detection.rb +141 -32
  400. data/lib/new_relic/environment_report.rb +41 -33
  401. data/lib/new_relic/helper.rb +49 -7
  402. data/lib/new_relic/language_support.rb +39 -6
  403. data/lib/new_relic/latest_changes.rb +10 -9
  404. data/lib/new_relic/local_environment.rb +42 -37
  405. data/lib/new_relic/metric_data.rb +31 -26
  406. data/lib/new_relic/metric_spec.rb +8 -6
  407. data/lib/new_relic/noticed_error.rb +43 -46
  408. data/lib/new_relic/rack/agent_hooks.rb +2 -2
  409. data/lib/new_relic/rack/agent_middleware.rb +3 -17
  410. data/lib/new_relic/rack/browser_monitoring.rb +135 -121
  411. data/lib/new_relic/rack.rb +1 -1
  412. data/lib/new_relic/recipes/capistrano3.rb +4 -62
  413. data/lib/new_relic/recipes/capistrano_legacy.rb +24 -27
  414. data/lib/new_relic/recipes/helpers/send_deployment.rb +70 -0
  415. data/lib/new_relic/recipes.rb +1 -1
  416. data/lib/new_relic/supportability_helper.rb +14 -12
  417. data/lib/new_relic/traced_thread.rb +38 -0
  418. data/lib/new_relic/version.rb +6 -17
  419. data/lib/newrelic_rpm.rb +20 -33
  420. data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +18 -21
  421. data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +9 -15
  422. data/lib/tasks/all.rb +3 -3
  423. data/lib/tasks/bump_version.rake +21 -0
  424. data/lib/tasks/config.rake +25 -119
  425. data/lib/tasks/coverage_report.rake +28 -0
  426. data/lib/tasks/helpers/config.html.erb +114 -0
  427. data/lib/tasks/helpers/format.rb +127 -0
  428. data/lib/tasks/helpers/matches.rb +12 -0
  429. data/lib/tasks/helpers/newrelicyml.rb +144 -0
  430. data/lib/tasks/helpers/prompt.rb +24 -0
  431. data/lib/tasks/helpers/version_bump.rb +62 -0
  432. data/lib/tasks/install.rake +8 -4
  433. data/lib/tasks/instrumentation_generator/README.md +63 -0
  434. data/lib/tasks/instrumentation_generator/TODO.md +33 -0
  435. data/lib/tasks/instrumentation_generator/instrumentation.thor +121 -0
  436. data/lib/tasks/instrumentation_generator/templates/Envfile.tt +9 -0
  437. data/lib/tasks/instrumentation_generator/templates/chain.tt +21 -0
  438. data/lib/tasks/instrumentation_generator/templates/chain_method.tt +7 -0
  439. data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +29 -0
  440. data/lib/tasks/instrumentation_generator/templates/instrumentation.tt +13 -0
  441. data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +3 -0
  442. data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +19 -0
  443. data/lib/tasks/instrumentation_generator/templates/prepend.tt +13 -0
  444. data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +3 -0
  445. data/lib/tasks/instrumentation_generator/templates/test.tt +15 -0
  446. data/lib/tasks/newrelic.rb +2 -1
  447. data/lib/tasks/newrelicyml.rake +13 -0
  448. data/lib/tasks/tests.rake +83 -17
  449. data/newrelic.yml +790 -4
  450. data/newrelic_rpm.gemspec +52 -43
  451. data/recipes/newrelic.rb +2 -2
  452. data/test/agent_helper.rb +252 -198
  453. metadata +275 -95
  454. data/.gitignore +0 -37
  455. data/.project +0 -23
  456. data/.yardopts +0 -26
  457. data/Guardfile +0 -25
  458. data/ROADMAP.md +0 -24
  459. data/bin/mongrel_rpm +0 -33
  460. data/bin/newrelic_cmd +0 -5
  461. data/cert/cacert.pem +0 -1177
  462. data/config/database.yml +0 -5
  463. data/config.dot +0 -278
  464. data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +0 -44
  465. data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +0 -53
  466. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -75
  467. data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -25
  468. data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -204
  469. data/lib/new_relic/agent/instrumentation/excon/connection.rb +0 -49
  470. data/lib/new_relic/agent/instrumentation/http.rb +0 -49
  471. data/lib/new_relic/agent/instrumentation/merb/controller.rb +0 -44
  472. data/lib/new_relic/agent/instrumentation/merb/errors.rb +0 -33
  473. data/lib/new_relic/agent/instrumentation/net.rb +0 -70
  474. data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +0 -125
  475. data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +0 -46
  476. data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +0 -26
  477. data/lib/new_relic/agent/instrumentation/sunspot.rb +0 -33
  478. data/lib/new_relic/agent/range_extensions.rb +0 -47
  479. data/lib/new_relic/agent/supported_versions.rb +0 -275
  480. data/lib/new_relic/agent/vm/mri_vm.rb +0 -81
  481. data/lib/new_relic/control/frameworks/merb.rb +0 -29
  482. data/lib/tasks/config.html.erb +0 -32
  483. data/lib/tasks/multiverse.rake +0 -2
  484. data/lib/tasks/multiverse.rb +0 -104
  485. /data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
@@ -1,12 +1,12 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  module NewRelic
6
6
  module Agent
7
7
  module Threading
8
8
  class BacktraceService
9
- ALL_TRANSACTIONS = "**ALL**".freeze
9
+ ALL_TRANSACTIONS = '**ALL**'.freeze
10
10
 
11
11
  def self.is_supported?
12
12
  !is_resque?
@@ -20,10 +20,10 @@ module NewRelic
20
20
  end
21
21
 
22
22
  attr_reader :worker_loop, :buffer, :effective_polling_period,
23
- :overhead_percent_threshold
23
+ :overhead_percent_threshold
24
24
  attr_accessor :worker_thread, :profile_agent_code
25
25
 
26
- def initialize(event_listener=nil)
26
+ def initialize(event_listener = nil)
27
27
  @profiles = {}
28
28
  @buffer = {}
29
29
  @last_poll = nil
@@ -41,9 +41,7 @@ module NewRelic
41
41
  @overhead_percent_threshold = new_value
42
42
  end
43
43
 
44
- if event_listener
45
- event_listener.subscribe(:transaction_finished, &method(:on_transaction_finished))
46
- end
44
+ event_listener&.subscribe(:transaction_finished, &method(:on_transaction_finished))
47
45
  end
48
46
 
49
47
  # Public interface
@@ -52,7 +50,7 @@ module NewRelic
52
50
  @running
53
51
  end
54
52
 
55
- def subscribe(transaction_name, command_arguments={})
53
+ def subscribe(transaction_name, command_arguments = {})
56
54
  if self.class.is_resque?
57
55
  NewRelic::Agent.logger.info("Backtracing threads on Resque is not supported, so not subscribing transaction '#{transaction_name}'")
58
56
  return
@@ -105,7 +103,7 @@ module NewRelic
105
103
  @lock.synchronize do
106
104
  if @profiles[transaction_name]
107
105
  profile = @profiles.delete(transaction_name)
108
- profile.finished_at = Time.now
106
+ profile.finished_at = Process.clock_gettime(Process::CLOCK_REALTIME)
109
107
  @profiles[transaction_name] = ThreadProfile.new(profile.command_arguments)
110
108
  profile
111
109
  end
@@ -113,11 +111,11 @@ module NewRelic
113
111
  end
114
112
 
115
113
  def on_transaction_finished(payload)
116
- name = payload[:name]
117
- start = payload[:start_timestamp]
114
+ name = payload[:name]
115
+ start = payload[:start_timestamp]
118
116
  duration = payload[:duration]
119
- thread = payload[:thread] || Thread.current
120
- bucket = payload[:bucket]
117
+ thread = payload[:thread] || Thread.current
118
+ bucket = payload[:bucket]
121
119
  @lock.synchronize do
122
120
  backtraces = @buffer.delete(thread)
123
121
  if backtraces && @profiles.has_key?(name)
@@ -151,6 +149,7 @@ module NewRelic
151
149
  # This method is expected to be called with @lock held
152
150
  def stop
153
151
  return unless @running
152
+
154
153
  @running = false
155
154
  self.worker_loop.stop
156
155
 
@@ -163,7 +162,7 @@ module NewRelic
163
162
  end
164
163
 
165
164
  def poll
166
- poll_start = Time.now
165
+ poll_start = Process.clock_gettime(Process::CLOCK_REALTIME)
167
166
 
168
167
  @lock.synchronize do
169
168
  AgentThread.list.each do |thread|
@@ -173,7 +172,7 @@ module NewRelic
173
172
  @buffer.delete_if { |thread, _| !thread.alive? }
174
173
  end
175
174
 
176
- end_time = Time.now
175
+ end_time = Process.clock_gettime(Process::CLOCK_REALTIME)
177
176
  adjust_polling_time(end_time, poll_start)
178
177
  record_supportability_metrics(end_time, poll_start)
179
178
  end
@@ -197,7 +196,7 @@ module NewRelic
197
196
  # This method is expected to be called with @lock held
198
197
  def watching_for_transaction?
199
198
  @profiles.size > 1 ||
200
- (@profiles.size == 1 && @profiles[ALL_TRANSACTIONS].nil?)
199
+ (@profiles.size == 1 && @profiles[ALL_TRANSACTIONS].nil?)
201
200
  end
202
201
 
203
202
  def allowed_bucket?(bucket)
@@ -220,9 +219,7 @@ module NewRelic
220
219
 
221
220
  # This method is expected to be called with @lock held.
222
221
  def aggregate_global_backtrace(backtrace, bucket, thread)
223
- if @profiles[ALL_TRANSACTIONS]
224
- @profiles[ALL_TRANSACTIONS].aggregate(backtrace, bucket, thread)
225
- end
222
+ @profiles[ALL_TRANSACTIONS]&.aggregate(backtrace, bucket, thread)
226
223
  end
227
224
 
228
225
  # This method is expected to be called with @lock held.
@@ -230,7 +227,7 @@ module NewRelic
230
227
  bucket = AgentThread.bucket_thread(thread, @profile_agent_code)
231
228
 
232
229
  if need_backtrace?(bucket)
233
- timestamp = Time.now.to_f
230
+ timestamp = Process.clock_gettime(Process::CLOCK_REALTIME)
234
231
  backtrace = AgentThread.scrub_backtrace(thread, @profile_agent_code)
235
232
  aggregate_global_backtrace(backtrace, bucket, thread)
236
233
  buffer_backtrace_for_thread(thread, timestamp, backtrace, bucket)
@@ -277,7 +274,6 @@ module NewRelic
277
274
  end
278
275
  @last_poll = poll_start
279
276
  end
280
-
281
277
  end
282
278
  end
283
279
  end
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
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 'set'
6
6
  require 'new_relic/agent/worker_loop'
@@ -11,27 +11,25 @@ require 'new_relic/agent/threading/backtrace_node'
11
11
  module NewRelic
12
12
  module Agent
13
13
  module Threading
14
-
15
14
  class ThreadProfile
16
-
17
15
  attr_reader :profile_id, :traces, :sample_period,
18
16
  :duration, :poll_count, :backtrace_count, :failure_count,
19
17
  :created_at, :command_arguments, :profile_agent_code
20
18
  attr_accessor :finished_at
21
19
 
22
- def initialize(command_arguments={})
23
- @command_arguments = command_arguments
24
- @profile_id = command_arguments.fetch('profile_id', -1)
25
- @duration = command_arguments.fetch('duration', 120)
26
- @sample_period = command_arguments.fetch('sample_period', 0.1)
20
+ def initialize(command_arguments = {})
21
+ @command_arguments = command_arguments
22
+ @profile_id = command_arguments.fetch('profile_id', -1)
23
+ @duration = command_arguments.fetch('duration', 120)
24
+ @sample_period = command_arguments.fetch('sample_period', 0.1)
27
25
  @profile_agent_code = command_arguments.fetch('profile_agent_code', false)
28
26
  @finished = false
29
27
 
30
28
  @traces = {
31
- :agent => BacktraceRoot.new,
29
+ :agent => BacktraceRoot.new,
32
30
  :background => BacktraceRoot.new,
33
- :other => BacktraceRoot.new,
34
- :request => BacktraceRoot.new
31
+ :other => BacktraceRoot.new,
32
+ :request => BacktraceRoot.new
35
33
  }
36
34
 
37
35
  @poll_count = 0
@@ -39,7 +37,7 @@ module NewRelic
39
37
  @failure_count = 0
40
38
  @unique_threads = []
41
39
 
42
- @created_at = Time.now
40
+ @created_at = Process.clock_gettime(Process::CLOCK_REALTIME)
43
41
  end
44
42
 
45
43
  def requested_period
@@ -56,6 +54,7 @@ module NewRelic
56
54
 
57
55
  def unique_thread_count
58
56
  return 0 if @unique_threads.nil?
57
+
59
58
  @unique_threads.length
60
59
  end
61
60
 
@@ -69,27 +68,29 @@ module NewRelic
69
68
  end
70
69
  end
71
70
 
72
- def convert_N_trace_nodes_to_arrays(count_to_keep) #THREAD_LOCAL_ACCESS
71
+ def convert_N_trace_nodes_to_arrays(count_to_keep) # THREAD_LOCAL_ACCESS
73
72
  all_nodes = @traces.values.map { |n| n.flattened }.flatten
74
73
 
75
- NewRelic::Agent.instance.stats_engine.
76
- tl_record_supportability_metric_count("ThreadProfiler/NodeCount", all_nodes.size)
74
+ NewRelic::Agent.instance.stats_engine
75
+ .tl_record_supportability_metric_count('ThreadProfiler/NodeCount', all_nodes.size)
77
76
 
78
77
  all_nodes.sort! do |a, b|
79
78
  # we primarily prefer higher runnable_count
80
79
  comparison = b.runnable_count <=> a.runnable_count
81
80
  # we secondarily prefer lower depth
82
- comparison = a.depth <=> b.depth if comparison == 0
83
- # it is thus impossible for any child to preceed their parent
81
+ comparison = a.depth <=> b.depth if comparison == 0
82
+ # it is thus impossible for any child to precede their parent
84
83
  comparison
85
84
  end
86
85
 
87
86
  all_nodes.each_with_index do |n, i|
88
87
  break if i >= count_to_keep
88
+
89
89
  n.mark_for_array_conversion
90
90
  end
91
91
  all_nodes.each_with_index do |n, i|
92
92
  break if i >= count_to_keep
93
+
93
94
  n.complete_array_conversion
94
95
  end
95
96
  end
@@ -102,10 +103,10 @@ module NewRelic
102
103
  convert_N_trace_nodes_to_arrays(THREAD_PROFILER_NODES)
103
104
 
104
105
  {
105
- "OTHER" => @traces[:other ].as_array,
106
- "REQUEST" => @traces[:request ].as_array,
107
- "AGENT" => @traces[:agent ].as_array,
108
- "BACKGROUND" => @traces[:background].as_array
106
+ 'OTHER' => @traces[:other].as_array,
107
+ 'REQUEST' => @traces[:request].as_array,
108
+ 'AGENT' => @traces[:agent].as_array,
109
+ 'BACKGROUND' => @traces[:background].as_array
109
110
  }
110
111
  end
111
112
 
@@ -124,11 +125,10 @@ module NewRelic
124
125
  end
125
126
 
126
127
  def to_log_description
127
- "#<ThreadProfile:#{object_id} "\
128
- "@profile_id: #{profile_id} "\
128
+ "#<ThreadProfile:#{object_id} " \
129
+ "@profile_id: #{profile_id} " \
129
130
  "@command_arguments=#{@command_arguments.inspect}>"
130
131
  end
131
-
132
132
  end
133
133
  end
134
134
  end
@@ -1,13 +1,13 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
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/heap'
6
6
 
7
7
  module NewRelic
8
8
  module Agent
9
9
  class TimestampSampledBuffer < PrioritySampledBuffer
10
- TIMESTAMP_KEY = "timestamp".freeze
10
+ TIMESTAMP_KEY = 'timestamp'.freeze
11
11
 
12
12
  private
13
13
 
@@ -1,7 +1,8 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
+ require 'fiber'
5
6
  require 'new_relic/agent/transaction'
6
7
  require 'new_relic/agent/transaction/segment'
7
8
  require 'new_relic/agent/transaction/datastore_segment'
@@ -65,9 +66,10 @@ module NewRelic
65
66
  #
66
67
  # @api public
67
68
  def transaction_sampled?
68
- if txn = current_transaction
69
- txn.sampled?
70
- end
69
+ txn = current_transaction
70
+ return false unless txn
71
+
72
+ txn.sampled?
71
73
  end
72
74
  alias_method :sampled?, :transaction_sampled?
73
75
 
@@ -86,9 +88,9 @@ module NewRelic
86
88
  #
87
89
  # @api public
88
90
  def in_transaction(name: nil,
89
- partial_name: nil,
90
- category: nil,
91
- options: {})
91
+ partial_name: nil,
92
+ category:,
93
+ options: {})
92
94
 
93
95
  finishable = start_transaction_or_segment(
94
96
  name: name,
@@ -106,7 +108,7 @@ module NewRelic
106
108
  current_transaction.notice_error(exception)
107
109
  raise
108
110
  ensure
109
- finishable.finish if finishable
111
+ finishable&.finish
110
112
  end
111
113
  end
112
114
 
@@ -130,15 +132,11 @@ module NewRelic
130
132
  #
131
133
  # @api public
132
134
  def start_transaction_or_segment(name: nil,
133
- partial_name: nil,
134
- category: nil,
135
- options: {})
136
- if name.nil? && partial_name.nil?
137
- raise ArgumentError, 'missing required argument: name or partial_name'
138
- end
139
- if category.nil?
140
- raise ArgumentError, 'missing required argument: category'
141
- end
135
+ partial_name: nil,
136
+ category:,
137
+ options: {})
138
+
139
+ raise ArgumentError, 'missing required argument: name or partial_name' if name.nil? && partial_name.nil?
142
140
 
143
141
  if name
144
142
  options[:transaction_name] = name
@@ -154,7 +152,6 @@ module NewRelic
154
152
  else
155
153
  Transaction.start_new_transaction(state, category, options)
156
154
  end
157
-
158
155
  rescue ArgumentError
159
156
  raise
160
157
  rescue => exception
@@ -163,16 +160,12 @@ module NewRelic
163
160
 
164
161
  # Takes name or partial_name and a category.
165
162
  # Returns a transaction instance or nil
166
- def start_transaction(name: nil,
167
- partial_name: nil,
168
- category: nil,
169
- **options)
170
- if name.nil? && partial_name.nil?
171
- raise ArgumentError, 'missing required argument: name or partial_name'
172
- end
173
- if category.nil?
174
- raise ArgumentError, 'missing required argument: category'
175
- end
163
+ def start_transaction(category:,
164
+ name: nil,
165
+ partial_name: nil,
166
+ **options)
167
+
168
+ raise ArgumentError, 'missing required argument: name or partial_name' if name.nil? && partial_name.nil?
176
169
 
177
170
  return current_transaction if current_transaction
178
171
 
@@ -186,8 +179,8 @@ module NewRelic
186
179
  end
187
180
 
188
181
  Transaction.start_new_transaction(state,
189
- category,
190
- options)
182
+ category,
183
+ options)
191
184
  rescue ArgumentError
192
185
  raise
193
186
  rescue => exception
@@ -196,11 +189,13 @@ module NewRelic
196
189
 
197
190
  def create_distributed_trace_payload
198
191
  return unless txn = current_transaction
192
+
199
193
  txn.distributed_tracer.create_distributed_trace_payload
200
194
  end
201
195
 
202
196
  def accept_distributed_trace_payload(payload)
203
197
  return unless txn = current_transaction
198
+
204
199
  txn.distributed_tracer.accept_distributed_trace_payload(payload)
205
200
  end
206
201
 
@@ -211,6 +206,7 @@ module NewRelic
211
206
  # @api public
212
207
  def current_segment
213
208
  return unless txn = current_transaction
209
+
214
210
  txn.current_segment
215
211
  end
216
212
 
@@ -238,25 +234,21 @@ module NewRelic
238
234
  # +finish+ on it at the end of the code you're tracing
239
235
  #
240
236
  # @api public
241
- def start_segment(name:nil,
242
- unscoped_metrics:nil,
243
- start_time: nil,
244
- parent: nil)
245
-
246
- # ruby 2.0.0 does not support required kwargs
247
- raise ArgumentError, 'missing required argument: name' if name.nil?
248
-
249
- segment = Transaction::Segment.new name, unscoped_metrics, start_time
250
- start_and_add_segment segment, parent
237
+ def start_segment(name:,
238
+ unscoped_metrics: nil,
239
+ start_time: nil,
240
+ parent: nil)
251
241
 
242
+ segment = Transaction::Segment.new(name, unscoped_metrics, start_time)
243
+ start_and_add_segment(segment, parent)
252
244
  rescue ArgumentError
253
245
  raise
254
246
  rescue => exception
255
247
  log_error('start_segment', exception)
256
248
  end
257
249
 
258
- UNKNOWN = "Unknown".freeze
259
- OTHER = "other".freeze
250
+ UNKNOWN = 'Unknown'.freeze
251
+ OTHER = 'other'.freeze
260
252
 
261
253
  # Creates and starts a datastore segment used to time
262
254
  # datastore operations.
@@ -294,20 +286,19 @@ module NewRelic
294
286
  #
295
287
  # @api public
296
288
  def start_datastore_segment(product: nil,
297
- operation: nil,
298
- collection: nil,
299
- host: nil,
300
- port_path_or_id: nil,
301
- database_name: nil,
302
- start_time: nil,
303
- parent: nil)
289
+ operation: nil,
290
+ collection: nil,
291
+ host: nil,
292
+ port_path_or_id: nil,
293
+ database_name: nil,
294
+ start_time: nil,
295
+ parent: nil)
304
296
 
305
297
  product ||= UNKNOWN
306
298
  operation ||= OTHER
307
299
 
308
- segment = Transaction::DatastoreSegment.new product, operation, collection, host, port_path_or_id, database_name
309
- start_and_add_segment segment, parent
310
-
300
+ segment = Transaction::DatastoreSegment.new(product, operation, collection, host, port_path_or_id, database_name)
301
+ start_and_add_segment(segment, parent)
311
302
  rescue ArgumentError
312
303
  raise
313
304
  rescue => exception
@@ -341,20 +332,14 @@ module NewRelic
341
332
  # you're tracing
342
333
  #
343
334
  # @api public
344
- def start_external_request_segment(library: nil,
345
- uri: nil,
346
- procedure: nil,
347
- start_time: nil,
348
- parent: nil)
349
-
350
- # ruby 2.0.0 does not support required kwargs
351
- raise ArgumentError, 'missing required argument: library' if library.nil?
352
- raise ArgumentError, 'missing required argument: uri' if uri.nil?
353
- raise ArgumentError, 'missing required argument: procedure' if procedure.nil?
354
-
355
- segment = Transaction::ExternalRequestSegment.new library, uri, procedure, start_time
356
- start_and_add_segment segment, parent
357
-
335
+ def start_external_request_segment(library:,
336
+ uri:,
337
+ procedure:,
338
+ start_time: nil,
339
+ parent: nil)
340
+
341
+ segment = Transaction::ExternalRequestSegment.new(library, uri, procedure, start_time)
342
+ start_and_add_segment(segment, parent)
358
343
  rescue ArgumentError
359
344
  raise
360
345
  rescue => exception
@@ -363,34 +348,28 @@ module NewRelic
363
348
 
364
349
  # Will potentially capture and notice an error at the
365
350
  # segment that was executing when error occurred.
366
- # if passed +segment+ is something that doesn't
351
+ # if passed +segment+ is something that doesn't
367
352
  # respond to +notice_segment_error+ then this method
368
353
  # is effectively just a yield to the given &block
369
- def capture_segment_error segment
354
+ def capture_segment_error(segment)
370
355
  return unless block_given?
356
+
371
357
  yield
372
358
  rescue => exception
373
- if segment && segment.is_a?(Transaction::AbstractSegment)
374
- segment.notice_error exception
375
- end
359
+ # needs else branch coverage
360
+ segment.notice_error(exception) if segment&.is_a?(Transaction::AbstractSegment)
376
361
  raise
377
362
  end
378
363
 
379
364
  # For New Relic internal use only.
380
- def start_message_broker_segment(action: nil,
381
- library: nil,
382
- destination_type: nil,
383
- destination_name: nil,
384
- headers: nil,
385
- parameters: nil,
386
- start_time: nil,
387
- parent: nil)
388
-
389
- # ruby 2.0.0 does not support required kwargs
390
- raise ArgumentError, 'missing required argument: action' if action.nil?
391
- raise ArgumentError, 'missing required argument: library' if library.nil?
392
- raise ArgumentError, 'missing required argument: destination_type' if destination_type.nil?
393
- raise ArgumentError, 'missing required argument: destination_name' if destination_name.nil?
365
+ def start_message_broker_segment(action:,
366
+ library:,
367
+ destination_type:,
368
+ destination_name:,
369
+ headers: nil,
370
+ parameters: nil,
371
+ start_time: nil,
372
+ parent: nil)
394
373
 
395
374
  segment = Transaction::MessageBrokerSegment.new(
396
375
  action: action,
@@ -401,8 +380,7 @@ module NewRelic
401
380
  parameters: parameters,
402
381
  start_time: start_time
403
382
  )
404
- start_and_add_segment segment, parent
405
-
383
+ start_and_add_segment(segment, parent)
406
384
  rescue ArgumentError
407
385
  raise
408
386
  rescue => exception
@@ -432,13 +410,42 @@ module NewRelic
432
410
 
433
411
  alias_method :tl_clear, :clear_state
434
412
 
413
+ def current_segment_key
414
+ ::Fiber.current.object_id
415
+ end
416
+
417
+ def thread_tracing_enabled?
418
+ NewRelic::Agent.config[:'instrumentation.thread.tracing']
419
+ end
420
+
421
+ def thread_block_with_current_transaction(segment_name: nil, parent: nil, &block)
422
+ parent ||= current_segment
423
+ current_txn = ::Thread.current[:newrelic_tracer_state]&.current_transaction if ::Thread.current[:newrelic_tracer_state]&.is_execution_traced?
424
+ proc do |*args|
425
+ begin
426
+ if current_txn && !current_txn.finished?
427
+ NewRelic::Agent::Tracer.state.current_transaction = current_txn
428
+ ::Thread.current[:newrelic_thread_span_parent] = parent
429
+ current_txn.async = true
430
+ segment_name = "#{segment_name}/Thread#{::Thread.current.object_id}/Fiber#{::Fiber.current.object_id}" if NewRelic::Agent.config[:'thread_ids_enabled']
431
+ segment = NewRelic::Agent::Tracer.start_segment(name: segment_name, parent: parent) if segment_name
432
+ end
433
+ NewRelic::Agent::Tracer.capture_segment_error(segment) do
434
+ yield(*args)
435
+ end
436
+ ensure
437
+ ::NewRelic::Agent::Transaction::Segment.finish(segment)
438
+ end
439
+ end
440
+ end
441
+
435
442
  private
436
443
 
437
- def start_and_add_segment segment, parent = nil
444
+ def start_and_add_segment(segment, parent = nil)
438
445
  tracer_state = state
439
446
  if (txn = tracer_state.current_transaction) &&
440
- tracer_state.tracing_enabled?
441
- txn.add_segment segment, parent
447
+ tracer_state.tracing_enabled?
448
+ txn.add_segment(segment, parent)
442
449
  else
443
450
  segment.record_metrics = false
444
451
  end
@@ -455,7 +462,6 @@ module NewRelic
455
462
  # This is THE location to store thread local information during a transaction
456
463
  # Need a new piece of data? Add a method here, NOT a new thread local variable.
457
464
  class State
458
-
459
465
  def initialize
460
466
  @untraced = []
461
467
  @current_transaction = nil
@@ -463,7 +469,7 @@ module NewRelic
463
469
  end
464
470
 
465
471
  # This starts the timer for the transaction.
466
- def reset(transaction=nil)
472
+ def reset(transaction = nil)
467
473
  # We purposefully don't reset @untraced or @record_sql
468
474
  # since those are managed by NewRelic::Agent.disable_* calls explicitly
469
475
  # and (more importantly) outside the scope of a transaction
@@ -473,7 +479,7 @@ module NewRelic
473
479
  end
474
480
 
475
481
  # Current transaction stack
476
- attr_reader :current_transaction
482
+ attr_accessor :current_transaction
477
483
 
478
484
  # Execution tracing on current thread
479
485
  attr_accessor :untraced
@@ -483,7 +489,8 @@ module NewRelic
483
489
  end
484
490
 
485
491
  def pop_traced
486
- @untraced.pop if @untraced
492
+ # needs else branch coverage
493
+ @untraced.pop if @untraced # rubocop:disable Style/SafeNavigation
487
494
  end
488
495
 
489
496
  def is_execution_traced?
@@ -503,7 +510,5 @@ module NewRelic
503
510
  attr_accessor :sql_sampler_transaction_data
504
511
  end
505
512
  end
506
-
507
- TransactionState = Tracer
508
513
  end
509
514
  end