newrelic_rpm 8.15.0 → 9.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (342) hide show
  1. checksums.yaml +4 -4
  2. data/.build_ignore +26 -0
  3. data/CHANGELOG.md +538 -44
  4. data/CONTRIBUTING.md +1 -1
  5. data/Gemfile +1 -1
  6. data/README.md +11 -6
  7. data/Rakefile +9 -9
  8. data/Thorfile +1 -1
  9. data/bin/newrelic +1 -0
  10. data/bin/newrelic_cmd +1 -0
  11. data/bin/nrdebug +36 -36
  12. data/init.rb +1 -1
  13. data/lib/new_relic/agent/agent.rb +3 -16
  14. data/lib/new_relic/agent/agent_helpers/connect.rb +5 -10
  15. data/lib/new_relic/agent/agent_helpers/harvest.rb +4 -4
  16. data/lib/new_relic/agent/agent_helpers/shutdown.rb +5 -5
  17. data/lib/new_relic/agent/agent_helpers/special_startup.rb +3 -4
  18. data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +47 -39
  19. data/lib/new_relic/agent/agent_helpers/startup.rb +13 -13
  20. data/lib/new_relic/agent/agent_helpers/transmit.rb +6 -6
  21. data/lib/new_relic/agent/agent_logger.rb +9 -9
  22. data/lib/new_relic/agent/attribute_filter.rb +2 -4
  23. data/lib/new_relic/agent/attribute_pre_filtering.rb +109 -0
  24. data/lib/new_relic/agent/attribute_processing.rb +2 -2
  25. data/lib/new_relic/agent/audit_logger.rb +5 -5
  26. data/lib/new_relic/agent/autostart.rb +1 -1
  27. data/lib/new_relic/agent/commands/agent_command.rb +2 -2
  28. data/lib/new_relic/agent/commands/agent_command_router.rb +5 -4
  29. data/lib/new_relic/agent/commands/thread_profiler_session.rb +8 -8
  30. data/lib/new_relic/agent/configuration/default_source.rb +428 -586
  31. data/lib/new_relic/agent/configuration/environment_source.rb +2 -2
  32. data/lib/new_relic/agent/configuration/high_security_source.rb +3 -5
  33. data/lib/new_relic/agent/configuration/manager.rb +16 -2
  34. data/lib/new_relic/agent/configuration/security_policy_source.rb +10 -26
  35. data/lib/new_relic/agent/configuration/server_source.rb +24 -24
  36. data/lib/new_relic/agent/configuration/yaml_source.rb +17 -4
  37. data/lib/new_relic/agent/connect/request_builder.rb +1 -1
  38. data/lib/new_relic/agent/connect/response_handler.rb +1 -1
  39. data/lib/new_relic/agent/custom_event_aggregator.rb +4 -4
  40. data/lib/new_relic/agent/database/explain_plan_helpers.rb +1 -1
  41. data/lib/new_relic/agent/database/obfuscation_helpers.rb +2 -2
  42. data/lib/new_relic/agent/database/obfuscator.rb +2 -2
  43. data/lib/new_relic/agent/database.rb +4 -18
  44. data/lib/new_relic/agent/datastores/metric_helper.rb +5 -5
  45. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +11 -11
  46. data/lib/new_relic/agent/datastores/redis.rb +6 -6
  47. data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +8 -10
  48. data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +10 -10
  49. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +7 -7
  50. data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +1 -1
  51. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +6 -6
  52. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +7 -7
  53. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +4 -4
  54. data/lib/new_relic/agent/distributed_tracing.rb +6 -6
  55. data/lib/new_relic/agent/error_collector.rb +36 -8
  56. data/lib/new_relic/agent/error_filter.rb +5 -5
  57. data/lib/new_relic/agent/error_trace_aggregator.rb +5 -4
  58. data/lib/new_relic/agent/event_loop.rb +3 -3
  59. data/lib/new_relic/agent/external.rb +1 -1
  60. data/lib/new_relic/agent/harvester.rb +1 -3
  61. data/lib/new_relic/agent/heap.rb +2 -1
  62. data/lib/new_relic/agent/hostname.rb +1 -1
  63. data/lib/new_relic/agent/http_clients/abstract.rb +9 -21
  64. data/lib/new_relic/agent/http_clients/async_http_wrappers.rb +83 -0
  65. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +7 -3
  66. data/lib/new_relic/agent/http_clients/ethon_wrappers.rb +111 -0
  67. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +7 -5
  68. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +4 -0
  69. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +6 -2
  70. data/lib/new_relic/agent/http_clients/httpx_wrappers.rb +93 -0
  71. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +5 -1
  72. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +8 -5
  73. data/lib/new_relic/agent/http_clients/uri_util.rb +2 -2
  74. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +6 -19
  75. data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +42 -0
  76. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +3 -2
  77. data/lib/new_relic/agent/instrumentation/action_dispatch.rb +31 -0
  78. data/lib/new_relic/agent/instrumentation/action_dispatch_subscriber.rb +64 -0
  79. data/lib/new_relic/agent/instrumentation/action_mailbox.rb +30 -0
  80. data/lib/new_relic/agent/instrumentation/action_mailbox_subscriber.rb +33 -0
  81. data/lib/new_relic/agent/instrumentation/action_mailer.rb +30 -0
  82. data/lib/new_relic/agent/instrumentation/action_mailer_subscriber.rb +85 -0
  83. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +10 -10
  84. data/lib/new_relic/agent/instrumentation/active_job.rb +16 -3
  85. data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +41 -0
  86. data/lib/new_relic/agent/instrumentation/active_merchant.rb +3 -3
  87. data/lib/new_relic/agent/instrumentation/active_record.rb +4 -3
  88. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +38 -36
  89. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +5 -4
  90. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +2 -2
  91. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +3 -2
  92. data/lib/new_relic/agent/instrumentation/active_storage.rb +4 -0
  93. data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +2 -30
  94. data/lib/new_relic/agent/instrumentation/active_support.rb +21 -6
  95. data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger/chain.rb +69 -0
  96. data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger/instrumentation.rb +13 -0
  97. data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger/prepend.rb +37 -0
  98. data/lib/new_relic/agent/instrumentation/active_support_broadcast_logger.rb +23 -0
  99. data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +4 -0
  100. data/lib/new_relic/agent/instrumentation/active_support_logger.rb +3 -1
  101. data/lib/new_relic/agent/instrumentation/active_support_subscriber.rb +41 -0
  102. data/lib/new_relic/agent/instrumentation/async_http/chain.rb +23 -0
  103. data/lib/new_relic/agent/instrumentation/async_http/instrumentation.rb +37 -0
  104. data/lib/new_relic/agent/instrumentation/async_http/prepend.rb +15 -0
  105. data/lib/new_relic/agent/instrumentation/async_http.rb +26 -0
  106. data/lib/new_relic/agent/instrumentation/bunny/chain.rb +1 -1
  107. data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +12 -3
  108. data/lib/new_relic/agent/instrumentation/bunny.rb +1 -1
  109. data/lib/new_relic/agent/instrumentation/concurrent_ruby/chain.rb +1 -1
  110. data/lib/new_relic/agent/instrumentation/concurrent_ruby/instrumentation.rb +3 -4
  111. data/lib/new_relic/agent/instrumentation/concurrent_ruby/prepend.rb +1 -1
  112. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +7 -6
  113. data/lib/new_relic/agent/instrumentation/curb/chain.rb +1 -1
  114. data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +9 -5
  115. data/lib/new_relic/agent/instrumentation/curb.rb +1 -1
  116. data/lib/new_relic/agent/instrumentation/custom_events.rb +12 -0
  117. data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +2 -1
  118. data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +1 -0
  119. data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +4 -1
  120. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +2 -1
  121. data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +2 -2
  122. data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +8 -4
  123. data/lib/new_relic/agent/instrumentation/elasticsearch.rb +2 -2
  124. data/lib/new_relic/agent/instrumentation/ethon/chain.rb +39 -0
  125. data/lib/new_relic/agent/instrumentation/ethon/instrumentation.rb +105 -0
  126. data/lib/new_relic/agent/instrumentation/ethon/prepend.rb +35 -0
  127. data/lib/new_relic/agent/instrumentation/ethon.rb +39 -0
  128. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +5 -1
  129. data/lib/new_relic/agent/instrumentation/excon.rb +3 -3
  130. data/lib/new_relic/agent/instrumentation/fiber/chain.rb +27 -0
  131. data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +23 -0
  132. data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +25 -0
  133. data/lib/new_relic/agent/instrumentation/fiber.rb +25 -0
  134. data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +8 -4
  135. data/lib/new_relic/agent/instrumentation/grape.rb +4 -4
  136. data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +1 -1
  137. data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +7 -2
  138. data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +1 -1
  139. data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +1 -1
  140. data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +8 -4
  141. data/lib/new_relic/agent/instrumentation/grpc_client.rb +2 -2
  142. data/lib/new_relic/agent/instrumentation/grpc_server.rb +2 -2
  143. data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +4 -0
  144. data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +4 -0
  145. data/lib/new_relic/agent/instrumentation/httprb.rb +1 -1
  146. data/lib/new_relic/agent/instrumentation/httpx/chain.rb +20 -0
  147. data/lib/new_relic/agent/instrumentation/httpx/instrumentation.rb +51 -0
  148. data/lib/new_relic/agent/instrumentation/httpx/prepend.rb +15 -0
  149. data/lib/new_relic/agent/instrumentation/httpx.rb +27 -0
  150. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +1 -1
  151. data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +3 -0
  152. data/lib/new_relic/agent/instrumentation/logger.rb +1 -1
  153. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +3 -1
  154. data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +14 -5
  155. data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +3 -1
  156. data/lib/new_relic/agent/instrumentation/memcache.rb +12 -12
  157. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +3 -3
  158. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +1 -1
  159. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +6 -8
  160. data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +5 -1
  161. data/lib/new_relic/agent/instrumentation/net_http.rb +2 -2
  162. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +46 -1
  163. data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +7 -3
  164. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +2 -2
  165. data/lib/new_relic/agent/instrumentation/queue_time.rb +1 -1
  166. data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +7 -1
  167. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +7 -2
  168. data/lib/new_relic/agent/instrumentation/rails_middleware.rb +1 -1
  169. data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +4 -4
  170. data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +14 -1
  171. data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +12 -15
  172. data/lib/new_relic/agent/instrumentation/rake.rb +3 -3
  173. data/lib/new_relic/agent/instrumentation/redis/constants.rb +1 -1
  174. data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +6 -1
  175. data/lib/new_relic/agent/instrumentation/redis.rb +1 -1
  176. data/lib/new_relic/agent/instrumentation/resque/helper.rb +1 -1
  177. data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +4 -0
  178. data/lib/new_relic/agent/instrumentation/resque.rb +1 -1
  179. data/lib/new_relic/agent/instrumentation/roda/chain.rb +43 -0
  180. data/lib/new_relic/agent/instrumentation/roda/ignorer.rb +45 -0
  181. data/lib/new_relic/agent/instrumentation/roda/instrumentation.rb +68 -0
  182. data/lib/new_relic/agent/instrumentation/roda/prepend.rb +24 -0
  183. data/lib/new_relic/agent/instrumentation/roda/roda_transaction_namer.rb +29 -0
  184. data/lib/new_relic/agent/instrumentation/roda.rb +36 -0
  185. data/lib/new_relic/agent/instrumentation/sequel.rb +8 -9
  186. data/lib/new_relic/agent/instrumentation/sequel_helper.rb +10 -10
  187. data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +4 -0
  188. data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +1 -1
  189. data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +26 -3
  190. data/lib/new_relic/agent/instrumentation/sidekiq.rb +6 -3
  191. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +1 -1
  192. data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +10 -5
  193. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +2 -4
  194. data/lib/new_relic/agent/instrumentation/stripe.rb +28 -0
  195. data/lib/new_relic/agent/instrumentation/stripe_subscriber.rb +77 -0
  196. data/lib/new_relic/agent/instrumentation/thread/chain.rb +1 -1
  197. data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +3 -8
  198. data/lib/new_relic/agent/instrumentation/thread/prepend.rb +1 -1
  199. data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +6 -1
  200. data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +10 -6
  201. data/lib/new_relic/agent/javascript_instrumentor.rb +29 -24
  202. data/lib/new_relic/agent/linking_metadata.rb +2 -2
  203. data/lib/new_relic/agent/log_event_aggregator.rb +64 -17
  204. data/lib/new_relic/agent/log_event_attributes.rb +115 -0
  205. data/lib/new_relic/agent/logging.rb +77 -37
  206. data/lib/new_relic/agent/messaging.rb +9 -7
  207. data/lib/new_relic/agent/method_tracer.rb +7 -7
  208. data/lib/new_relic/agent/method_tracer_helpers.rb +27 -6
  209. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +4 -5
  210. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +1 -1
  211. data/lib/new_relic/agent/monitors/synthetics_monitor.rb +12 -1
  212. data/lib/new_relic/agent/new_relic_service/encoders.rb +1 -1
  213. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +2 -2
  214. data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +0 -1
  215. data/lib/new_relic/agent/new_relic_service.rb +47 -32
  216. data/lib/new_relic/agent/obfuscator.rb +1 -1
  217. data/lib/new_relic/agent/parameter_filtering.rb +6 -6
  218. data/lib/new_relic/agent/pipe_channel_manager.rb +7 -6
  219. data/lib/new_relic/agent/pipe_service.rb +5 -3
  220. data/lib/new_relic/agent/priority_sampled_buffer.rb +1 -1
  221. data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +0 -1
  222. data/lib/new_relic/agent/rules_engine.rb +1 -1
  223. data/lib/new_relic/agent/sampler.rb +2 -1
  224. data/lib/new_relic/agent/sampler_collection.rb +1 -1
  225. data/lib/new_relic/agent/samplers/cpu_sampler.rb +5 -5
  226. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +9 -9
  227. data/lib/new_relic/agent/samplers/memory_sampler.rb +9 -9
  228. data/lib/new_relic/agent/samplers/object_sampler.rb +1 -1
  229. data/lib/new_relic/agent/span_event_aggregator.rb +4 -4
  230. data/lib/new_relic/agent/span_event_primitive.rb +18 -6
  231. data/lib/new_relic/agent/sql_sampler.rb +2 -2
  232. data/lib/new_relic/agent/stats.rb +1 -1
  233. data/lib/new_relic/agent/synthetics_event_aggregator.rb +1 -1
  234. data/lib/new_relic/agent/system_info.rb +36 -10
  235. data/lib/new_relic/agent/threading/agent_thread.rb +1 -1
  236. data/lib/new_relic/agent/threading/backtrace_node.rb +3 -3
  237. data/lib/new_relic/agent/threading/backtrace_service.rb +3 -7
  238. data/lib/new_relic/agent/threading/thread_profile.rb +5 -5
  239. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +1 -1
  240. data/lib/new_relic/agent/tracer.rb +25 -16
  241. data/lib/new_relic/agent/transaction/abstract_segment.rb +109 -48
  242. data/lib/new_relic/agent/transaction/datastore_segment.rb +1 -1
  243. data/lib/new_relic/agent/transaction/distributed_tracer.rb +7 -6
  244. data/lib/new_relic/agent/transaction/distributed_tracing.rb +13 -14
  245. data/lib/new_relic/agent/transaction/external_request_segment.rb +16 -13
  246. data/lib/new_relic/agent/transaction/message_broker_segment.rb +2 -3
  247. data/lib/new_relic/agent/transaction/request_attributes.rb +47 -11
  248. data/lib/new_relic/agent/transaction/segment.rb +1 -1
  249. data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +1 -1
  250. data/lib/new_relic/agent/transaction/trace.rb +1 -1
  251. data/lib/new_relic/agent/transaction/trace_context.rb +4 -4
  252. data/lib/new_relic/agent/transaction/trace_node.rb +8 -7
  253. data/lib/new_relic/agent/transaction/tracing.rb +10 -4
  254. data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +1 -1
  255. data/lib/new_relic/agent/transaction.rb +90 -58
  256. data/lib/new_relic/agent/transaction_error_primitive.rb +21 -5
  257. data/lib/new_relic/agent/transaction_event_aggregator.rb +4 -4
  258. data/lib/new_relic/agent/transaction_event_primitive.rb +22 -3
  259. data/lib/new_relic/agent/transaction_sampler.rb +3 -3
  260. data/lib/new_relic/agent/transaction_time_aggregator.rb +7 -3
  261. data/lib/new_relic/agent/utilization/aws.rb +1 -1
  262. data/lib/new_relic/agent/utilization/azure.rb +3 -3
  263. data/lib/new_relic/agent/utilization/gcp.rb +4 -6
  264. data/lib/new_relic/agent/utilization/pcf.rb +1 -1
  265. data/lib/new_relic/agent/utilization/vendor.rb +6 -8
  266. data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +1 -1
  267. data/lib/new_relic/agent/vm/mri_vm.rb +9 -8
  268. data/lib/new_relic/agent/worker_loop.rb +1 -1
  269. data/lib/new_relic/agent.rb +133 -36
  270. data/lib/new_relic/cli/command.rb +4 -3
  271. data/lib/new_relic/cli/commands/deployments.rb +26 -25
  272. data/lib/new_relic/cli/commands/install.rb +23 -23
  273. data/lib/new_relic/collection_helper.rb +2 -2
  274. data/lib/new_relic/constants.rb +10 -8
  275. data/lib/new_relic/control/class_methods.rb +4 -10
  276. data/lib/new_relic/control/frameworks/rails.rb +44 -20
  277. data/lib/new_relic/control/frameworks/roda.rb +20 -0
  278. data/lib/new_relic/control/instance_methods.rb +6 -6
  279. data/lib/new_relic/control/instrumentation.rb +1 -15
  280. data/lib/new_relic/control/private_instance_methods.rb +1 -1
  281. data/lib/new_relic/dependency_detection.rb +20 -18
  282. data/lib/new_relic/environment_report.rb +4 -4
  283. data/lib/new_relic/helper.rb +2 -1
  284. data/lib/new_relic/language_support.rb +10 -1
  285. data/lib/new_relic/latest_changes.rb +6 -6
  286. data/lib/new_relic/local_environment.rb +0 -10
  287. data/lib/new_relic/noticed_error.rb +25 -20
  288. data/lib/new_relic/rack/agent_hooks.rb +1 -1
  289. data/lib/new_relic/rack/agent_middleware.rb +0 -16
  290. data/lib/new_relic/rack/browser_monitoring.rb +21 -17
  291. data/lib/new_relic/recipes/capistrano3.rb +1 -1
  292. data/lib/new_relic/recipes/capistrano_legacy.rb +6 -6
  293. data/lib/new_relic/recipes/helpers/send_deployment.rb +5 -5
  294. data/lib/new_relic/supportability_helper.rb +4 -1
  295. data/lib/new_relic/traced_thread.rb +2 -3
  296. data/lib/new_relic/version.rb +2 -2
  297. data/lib/newrelic_rpm.rb +4 -4
  298. data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +6 -6
  299. data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +4 -4
  300. data/lib/tasks/bump_version.rake +21 -0
  301. data/lib/tasks/config.rake +13 -12
  302. data/lib/tasks/coverage_report.rake +4 -4
  303. data/lib/tasks/helpers/config.html.erb +93 -0
  304. data/lib/tasks/helpers/format.rb +19 -15
  305. data/lib/tasks/helpers/newrelicyml.rb +144 -0
  306. data/lib/tasks/helpers/version_bump.rb +62 -0
  307. data/lib/tasks/install.rake +4 -4
  308. data/lib/tasks/instrumentation_generator/instrumentation.thor +16 -19
  309. data/lib/tasks/instrumentation_generator/templates/Envfile.tt +1 -1
  310. data/lib/tasks/instrumentation_generator/templates/chain.tt +1 -1
  311. data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +1 -1
  312. data/lib/tasks/newrelic.rb +1 -0
  313. data/lib/tasks/newrelicyml.rake +13 -0
  314. data/lib/tasks/tests.rake +77 -6
  315. data/newrelic.yml +393 -274
  316. data/newrelic_rpm.gemspec +41 -30
  317. data/test/agent_helper.rb +25 -24
  318. metadata +172 -35
  319. data/.gitignore +0 -42
  320. data/.project +0 -23
  321. data/.rubocop.yml +0 -1946
  322. data/.rubocop_todo.yml +0 -62
  323. data/.simplecov +0 -15
  324. data/.snyk +0 -11
  325. data/.yardopts +0 -27
  326. data/Brewfile +0 -12
  327. data/DOCKER.md +0 -167
  328. data/Dockerfile +0 -10
  329. data/Guardfile +0 -26
  330. data/config/database.yml +0 -5
  331. data/config.dot +0 -278
  332. data/docker-compose.yml +0 -107
  333. data/lefthook.yml +0 -9
  334. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -83
  335. data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -33
  336. data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -215
  337. data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +0 -36
  338. data/lib/new_relic/agent/instrumentation/sunspot.rb +0 -41
  339. data/lib/new_relic/agent/range_extensions.rb +0 -27
  340. data/lib/tasks/helpers/removers.rb +0 -33
  341. data/lib/tasks/multiverse.rake +0 -6
  342. data/lib/tasks/multiverse.rb +0 -77
data/CONTRIBUTING.md CHANGED
@@ -94,7 +94,7 @@ includes unreleased work. Please create all new branches off of `dev`.
94
94
  - Fork the repository inside GitHub
95
95
  - `git clone git@github.com:<gh username>/newrelic-ruby-agent.git`
96
96
  1. Pick a Ruby version
97
- - Use rbenv, rvm, chruby, asdf, etc. to install any version of Ruby between 2.2 up to the latest stable version
97
+ - Use rbenv, rvm, chruby, asdf, etc. to install any version of Ruby between 2.4 up to the latest stable version
98
98
  1. Install development dependencies
99
99
  - `bundle install`
100
100
  1. Check that your env is setup correctly
data/Gemfile CHANGED
@@ -3,4 +3,4 @@
3
3
  # frozen_string_literal: true
4
4
 
5
5
  source 'https://rubygems.org'
6
- gemspec name: "newrelic_rpm"
6
+ gemspec name: 'newrelic_rpm'
data/README.md CHANGED
@@ -1,5 +1,4 @@
1
- [![Open Source, New Relic Community Plus: This code is currently maintained by New Relic engineering teams and delivered here in GitHub. See the README for troubleshooting and defect reporting instructions.](https://github.com/newrelic/open-source-office/raw/master/examples/categories/images/Community_Plus.png)](https://opensource.newrelic.com/oss-category/#community-plus)
2
-
1
+ <a href="https://opensource.newrelic.com/oss-category/#community-plus"><picture><source media="(prefers-color-scheme: dark)" srcset="https://github.com/newrelic/opensource-website/raw/main/src/images/categories/dark/Community_Plus.png"><source media="(prefers-color-scheme: light)" srcset="https://github.com/newrelic/opensource-website/raw/main/src/images/categories/Community_Plus.png"><img alt="New Relic Open Source community plus project banner." src="https://github.com/newrelic/opensource-website/raw/main/src/images/categories/Community_Plus.png"></picture></a>
3
2
 
4
3
  # New Relic Ruby Agent
5
4
 
@@ -10,7 +9,9 @@ You can also extend the agent's performance monitoring to
10
9
  to help you improve the customer experience and make data-driven business decisions.
11
10
 
12
11
  The New Relic Ruby agent is dual-purposed as either a Gem or a Rails plugin,
13
- hosted on [github](https://github.com/newrelic/newrelic-ruby-agent).
12
+ hosted on [GitHub](https://github.com/newrelic/newrelic-ruby-agent).
13
+
14
+ This code is actively maintained by New Relic engineering teams and delivered here in GitHub. See below for troubleshooting and defect reporting instructions.
14
15
 
15
16
  [![Gem Version](https://badge.fury.io/rb/newrelic_rpm.svg)](https://badge.fury.io/rb/newrelic_rpm)
16
17
 
@@ -24,7 +25,7 @@ Environments" section below.
24
25
 
25
26
  ## Installing and Using
26
27
 
27
- The latest released gem for the Ruby agent can be found at [Rubygems.org](https://rubygems.org/gems/newrelic_rpm)
28
+ The latest released gem for the Ruby agent can be found at [RubyGems.org](https://rubygems.org/gems/newrelic_rpm)
28
29
 
29
30
  ### Quick Start
30
31
 
@@ -87,7 +88,7 @@ for more information.
87
88
 
88
89
  Should you need assistance with New Relic products, you are in good hands with several support diagnostic tools and support channels.
89
90
 
90
- This [troubleshooting framework](https://discuss.newrelic.com/t/ruby-troubleshooting-framework-install/108685) steps you through common troubleshooting questions.
91
+ This [troubleshooting framework](https://forum.newrelic.com/s/hubtopic/aAX8W0000008bSgWAI/ruby-troubleshooting-framework-install) steps you through common troubleshooting questions.
91
92
 
92
93
  New Relic offers NRDiag, [a client-side diagnostic utility](https://docs.newrelic.com/docs/using-new-relic/cross-product-functions/troubleshooting/new-relic-diagnostics) that automatically detects common problems with New Relic agents. If NRDiag detects a problem, it suggests troubleshooting steps. NRDiag can also automatically attach troubleshooting data to a New Relic Support ticket.
93
94
 
@@ -96,7 +97,7 @@ If the issue has been confirmed as a bug or is a Feature request, please file a
96
97
  **Support Channels**
97
98
 
98
99
  * [New Relic Documentation](https://docs.newrelic.com/docs/agents/ruby-agent): Comprehensive guidance for using our platform
99
- * [New Relic Community](https://discuss.newrelic.com/tags/rubyagent): The best place to engage in troubleshooting questions
100
+ * [New Relic Community](https://forum.newrelic.com): The best place to engage in troubleshooting questions
100
101
  * [New Relic Developer](https://developer.newrelic.com/): Resources for building a custom observability applications
101
102
  * [New Relic University](https://learn.newrelic.com/): A range of online training for New Relic users of every level
102
103
  * [New Relic Technical Support](https://support.newrelic.com/) 24/7/365 ticketed support. Read more about our [Technical Support Offerings](https://docs.newrelic.com/docs/licenses/license-information/general-usage-licenses/support-plan).
@@ -133,6 +134,10 @@ The New Relic Ruby agent may use source code from third-party libraries. When us
133
134
 
134
135
  ## Thank You
135
136
 
137
+ We always look forward to connecting with the community. We welcome [contributions](https://github.com/newrelic/newrelic-ruby-agent#contributing) to our source code and suggestions for improvements, and would love to hear about what you like and want to see in the future.
138
+
139
+ Visit our [project board](https://github.com/orgs/newrelic/projects/84/) to see what's upcoming in a future release, what we're currently working on, and what we're planning next.
140
+
136
141
  Thank you,
137
142
 
138
143
  New Relic Ruby agent team
data/Rakefile CHANGED
@@ -15,11 +15,11 @@ task :default => :test
15
15
  task :test => ['test:newrelic']
16
16
 
17
17
  namespace :test do
18
- desc "Run all tests"
18
+ desc 'Run all tests'
19
19
  task :all => %w[newrelic multiverse all_compatible_envs]
20
20
  agent_home = File.expand_path(File.dirname(__FILE__))
21
21
 
22
- desc "Run agent performance tests"
22
+ desc 'Run agent performance tests'
23
23
  task :performance, [:suite, :name] => [] do |t, args|
24
24
  require File.expand_path(File.join(File.dirname(__FILE__), 'test', 'performance', 'lib', 'performance'))
25
25
  options = {}
@@ -28,13 +28,13 @@ namespace :test do
28
28
  Performance::Runner.new(options).run_and_report
29
29
  end
30
30
 
31
- desc "Run agent within existing mini environment(s): env[name1,name2,name3,etc.]"
31
+ desc 'Run agent within existing mini environment(s): env[name1,name2,name3,etc.]'
32
32
  task :env do |t, args|
33
33
  require File.expand_path(File.join(File.dirname(__FILE__), 'test', 'environments', 'lib', 'environments', 'runner'))
34
34
  Environments::Runner.new(args.to_a).run_and_report
35
35
  end
36
36
 
37
- desc "Run all mini environment tests known to work with the current Ruby version"
37
+ desc 'Run all mini environment tests known to work with the current Ruby version'
38
38
  task :all_compatible_envs do |t, args|
39
39
  require File.expand_path(File.join(File.dirname(__FILE__), 'test', 'helpers', 'ruby_rails_mappings'))
40
40
  rails_versions = rails_versions_for_ruby_version(RUBY_VERSION)
@@ -62,10 +62,10 @@ task :record_build, [:build_number, :stage] do |t, args|
62
62
  build_string = args.build_number
63
63
  build_string << ".#{args.stage}" unless args.stage.nil? || args.stage.empty?
64
64
 
65
- gitsha = File.exist?(".git") ? `git rev-parse HEAD` : "Unknown"
65
+ gitsha = File.exist?('.git') ? `git rev-parse HEAD` : 'Unknown'
66
66
  gitsha.chomp!
67
67
 
68
- File.open("lib/new_relic/build.rb", "w") do |f|
68
+ File.open('lib/new_relic/build.rb', 'w') do |f|
69
69
  f.write("# GITSHA: #{gitsha}\n")
70
70
  f.write("module NewRelic; module VERSION; BUILD='#{build_string}'; end; end\n")
71
71
  end
@@ -93,14 +93,14 @@ task :update_ca_bundle do |t|
93
93
  bundle_last_update = `cd #{ca_bundle_path} && git show -s --format=%ci HEAD`
94
94
  puts "Source CA bundle last updated #{bundle_last_update}"
95
95
 
96
- bundle_path = "cert/cacert.pem"
96
+ bundle_path = 'cert/cacert.pem'
97
97
  cert_paths = []
98
98
  Dir.glob("#{ca_bundle_path}/*.pem").each { |p| cert_paths << p }
99
99
  cert_paths.sort!
100
100
 
101
101
  puts "Writing #{cert_paths.size} certs to bundle at #{bundle_path}..."
102
102
 
103
- File.open(bundle_path, "w") do |f|
103
+ File.open(bundle_path, 'w') do |f|
104
104
  cert_paths.each do |cert_path|
105
105
  cert_name = File.basename(cert_path, '.pem')
106
106
  puts "Adding #{cert_name}"
@@ -131,7 +131,7 @@ end
131
131
 
132
132
  desc 'Start an interactive console session'
133
133
  task :console do
134
- require 'pry'
134
+ require 'pry' if ENV['ENABLE_PRY']
135
135
  require 'newrelic_rpm'
136
136
  ARGV.clear
137
137
  Pry.start
data/Thorfile CHANGED
@@ -2,4 +2,4 @@
2
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
3
  # frozen_string_literal: true
4
4
 
5
- Dir["./lib/tasks/**/*.thor"].sort.each { |f| load f }
5
+ Dir['./lib/tasks/**/*.thor'].sort.each { |f| load f }
data/bin/newrelic CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
+
3
4
  # executes one of the commands in the new_relic/commands directory
4
5
  # pass the name of the command as an argument
5
6
 
data/bin/newrelic_cmd CHANGED
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # frozen_string_literal: true
3
+
3
4
  # This command has been renamed "newrelic"
4
5
  # executes one of the commands in the new_relic/commands directory
5
6
  # pass the name of the command as an argument
data/bin/nrdebug CHANGED
@@ -96,7 +96,7 @@ class LinuxProcessDataProvider < ProcessDataProvider
96
96
  end
97
97
 
98
98
  def procline
99
- File.read(proc_path('cmdline')).tr("\000", " ")
99
+ File.read(proc_path('cmdline')).tr("\000", ' ')
100
100
  end
101
101
 
102
102
  def environment
@@ -155,7 +155,7 @@ class RubyProcess
155
155
  def gdb_script_body(backtrace_file)
156
156
  backtrace_gathering_code = 'Thread.list.each { |t| bt = t.backtrace rescue nil; ' \
157
157
  'puts \"#{t.inspect}\n#{bt && bt.join(\"\n\")}\n\n\" }'
158
- <<-END
158
+ <<~END
159
159
  attach #{pid}
160
160
  t a a bt
161
161
  call (void)close(1)
@@ -189,7 +189,7 @@ class ProcessReport
189
189
 
190
190
  def open
191
191
  if @path
192
- File.open(@path, "w") do |f|
192
+ File.open(@path, 'w') do |f|
193
193
  yield(f)
194
194
  end
195
195
  else
@@ -216,16 +216,16 @@ class ProcessReport
216
216
 
217
217
  section(f) do
218
218
  c_backtraces, ruby_backtraces = @target.gather_backtraces
219
- if c_backtraces =~ /could not attach/i
220
- fail("Failed to attach to target process. Please try again with sudo.")
219
+ if /could not attach/i.match?(c_backtraces)
220
+ fail('Failed to attach to target process. Please try again with sudo.')
221
221
  end
222
222
 
223
- section(f, "C Backtraces") { c_backtraces }
224
- section(f, "Ruby Backtrace(s)") { ruby_backtraces }
223
+ section(f, 'C Backtraces') { c_backtraces }
224
+ section(f, 'Ruby Backtrace(s)') { ruby_backtraces }
225
225
  end
226
226
 
227
- section(f, "Open files") { @target.open_files }
228
- section(f, "Log") do
227
+ section(f, 'Open files') { @target.open_files }
228
+ section(f, 'Log') do
229
229
  commands = Logger.messages.map { |(_, msg)| msg }
230
230
  commands.join("\n")
231
231
  end
@@ -235,33 +235,33 @@ class ProcessReport
235
235
  private
236
236
 
237
237
  def add_environment_sections(handle)
238
- section(handle, "Time") { Time.now }
239
- section(handle, "PID") { @target.pid }
240
- section(handle, "Command") { @target.procline }
241
- section(handle, "RSS") { @target.rss }
242
- section(handle, "CPU") { @target.cpu }
243
- section(handle, "Parent PID") { @target.ppid }
244
- section(handle, "OS") { ShellWrapper.execute('uname -a') }
245
- section(handle, "Environment") { @target.environment }
238
+ section(handle, 'Time') { Time.now }
239
+ section(handle, 'PID') { @target.pid }
240
+ section(handle, 'Command') { @target.procline }
241
+ section(handle, 'RSS') { @target.rss }
242
+ section(handle, 'CPU') { @target.cpu }
243
+ section(handle, 'Parent PID') { @target.ppid }
244
+ section(handle, 'OS') { ShellWrapper.execute('uname -a') }
245
+ section(handle, 'Environment') { @target.environment }
246
246
  end
247
247
  end
248
248
 
249
249
  def prompt_for_confirmation(target_pid, target_cmd)
250
- puts <<-PROMPT
251
- Are you sure you want to attach to PID #{target_pid} ('#{target_cmd}')}?
252
-
253
- ************************** !WARNING! **************************
254
- Extracting debug information from this process may cause it to CRASH OR HANG.
255
-
256
- It is highly recommended that you only run this script against processes that
257
- are already unresponsive.
258
-
259
- Additionally, the output may contain sensitive information from the program's
260
- command line arguments, environment, or open file list. Please examine the
261
- output before sharing it.
262
- ************************** !WARNING! **************************
263
-
264
- To continue, type 'continue':
250
+ puts <<~PROMPT
251
+ Are you sure you want to attach to PID #{target_pid} ('#{target_cmd}')}?
252
+
253
+ ************************** !WARNING! **************************
254
+ Extracting debug information from this process may cause it to CRASH OR HANG.
255
+
256
+ It is highly recommended that you only run this script against processes that
257
+ are already unresponsive.
258
+
259
+ Additionally, the output may contain sensitive information from the program's
260
+ command line arguments, environment, or open file list. Please examine the
261
+ output before sharing it.
262
+ ************************** !WARNING! **************************
263
+
264
+ To continue, type 'continue':
265
265
  PROMPT
266
266
 
267
267
  until $stdin.gets.strip == 'continue'
@@ -270,10 +270,10 @@ def prompt_for_confirmation(target_pid, target_cmd)
270
270
  end
271
271
 
272
272
  target_pid = ARGV[0]
273
- fail("Please provide a PID for the target process", :usage => true) unless target_pid
273
+ fail('Please provide a PID for the target process', :usage => true) unless target_pid
274
274
 
275
275
  gdb_path = `which gdb`
276
- fail("Could not find gdb, please ensure it is installed and in your PATH") if gdb_path.empty?
276
+ fail('Could not find gdb, please ensure it is installed and in your PATH') if gdb_path.empty?
277
277
 
278
278
  target = RubyProcess.new(target_pid)
279
279
  if !target.attachable?
@@ -298,5 +298,5 @@ report.generate
298
298
 
299
299
  puts "Generated '#{report_filename}'"
300
300
  puts ''
301
- puts "Please examine the output file for potentially sensitive information and"
302
- puts "remove it before sharing this file with anyone."
301
+ puts 'Please examine the output file for potentially sensitive information and'
302
+ puts 'remove it before sharing this file with anyone.'
data/init.rb CHANGED
@@ -26,5 +26,5 @@ begin
26
26
 
27
27
  NewRelic::Control.instance.init_plugin(:config => current_config)
28
28
  rescue => e
29
- NewRelic::Agent.logger.error("Error initializing New Relic plugin. Agent is disabled.", e)
29
+ NewRelic::Agent.logger.error('Error initializing New Relic plugin. Agent is disabled.', e)
30
30
  end
@@ -142,20 +142,16 @@ module NewRelic
142
142
  # the transaction sampler that handles recording transactions
143
143
  attr_reader :transaction_sampler
144
144
  attr_reader :sql_sampler
145
- # manages agent commands we receive from the collector, and the handlers
146
- attr_reader :agent_command_router
147
145
  # error collector is a simple collection of recorded errors
148
146
  attr_reader :error_collector
149
- attr_reader :harvest_samplers
150
147
  # whether we should record raw, obfuscated, or no sql
151
148
  attr_reader :record_sql
152
149
  # builder for JS agent scripts to inject
153
150
  attr_reader :javascript_instrumentor
154
151
  # cross application tracing ids and encoding
155
152
  attr_reader :cross_process_id
156
- attr_reader :cross_app_encoding_bytes
157
153
  # service for communicating with collector
158
- attr_accessor :service
154
+ attr_reader :service
159
155
  # Global events dispatcher. This will provides our primary mechanism
160
156
  # for agent-wide events, such as finishing configuration, error notification
161
157
  # and request before/after from Rack.
@@ -168,8 +164,6 @@ module NewRelic
168
164
  # collector on connect. The former are applied during txns,
169
165
  # the latter during harvest.
170
166
  attr_accessor :transaction_rules
171
- # Responsible for restarting the harvest thread
172
- attr_reader :harvester
173
167
  # GC::Profiler.total_time is not monotonic so we wrap it.
174
168
  attr_reader :monotonic_gc_profiler
175
169
  attr_reader :custom_event_aggregator
@@ -178,7 +172,6 @@ module NewRelic
178
172
  attr_reader :transaction_event_recorder
179
173
  attr_reader :attribute_filter
180
174
  attr_reader :adaptive_sampler
181
- attr_reader :environment_report
182
175
 
183
176
  def transaction_event_aggregator
184
177
  @transaction_event_recorder.transaction_event_aggregator
@@ -262,8 +255,8 @@ module NewRelic
262
255
  # if litespeed, then ignore all future SIGUSR1 - it's
263
256
  # litespeed trying to shut us down
264
257
  if Agent.config[:dispatcher] == :litespeed
265
- Signal.trap("SIGUSR1", "IGNORE")
266
- Signal.trap("SIGTERM", "IGNORE")
258
+ Signal.trap('SIGUSR1', 'IGNORE')
259
+ Signal.trap('SIGTERM', 'IGNORE')
267
260
  end
268
261
  end
269
262
 
@@ -355,12 +348,6 @@ module NewRelic
355
348
  end
356
349
 
357
350
  public :merge_data_for_endpoint
358
-
359
- # Delegates to the control class to determine the root
360
- # directory of this project
361
- def determine_home_directory
362
- control.root
363
- end
364
351
  end
365
352
 
366
353
  extend ClassMethods
@@ -64,7 +64,7 @@ module NewRelic
64
64
  def handle_license_error(error)
65
65
  ::NewRelic::Agent.logger.error( \
66
66
  error.message, \
67
- "Visit NewRelic.com to obtain a valid license key, or to upgrade your account."
67
+ 'Visit NewRelic.com to obtain a valid license key, or to upgrade your account.'
68
68
  )
69
69
  disconnect
70
70
  end
@@ -115,7 +115,7 @@ module NewRelic
115
115
  ::NewRelic::Agent.logger.debug("Connected to NewRelic Service at #{@service.collector.name}")
116
116
  ::NewRelic::Agent.logger.debug("Agent Run = #{@service.agent_id}.")
117
117
  ::NewRelic::Agent.logger.debug("Connection data = #{config_data.inspect}")
118
- if config_data['messages'] && config_data['messages'].any?
118
+ if config_data['messages']&.any?
119
119
  log_collector_messages(config_data['messages'])
120
120
  end
121
121
  end
@@ -126,11 +126,6 @@ module NewRelic
126
126
  end
127
127
  end
128
128
 
129
- # apdex_f is always 4 times the apdex_t
130
- def apdex_f
131
- (Agent.config[:apdex_t] * 4).to_f
132
- end
133
-
134
129
  class WaitOnConnectTimeout < StandardError
135
130
  end
136
131
 
@@ -149,7 +144,7 @@ module NewRelic
149
144
  return if connected?
150
145
 
151
146
  @waited_on_connect = true
152
- NewRelic::Agent.logger.debug("Waiting on connect to complete.")
147
+ NewRelic::Agent.logger.debug('Waiting on connect to complete.')
153
148
 
154
149
  @wait_on_connect_mutex.synchronize do
155
150
  @wait_on_connect_condition.wait(@wait_on_connect_mutex, timeout)
@@ -162,7 +157,7 @@ module NewRelic
162
157
 
163
158
  def connect_options(options)
164
159
  {
165
- keep_retrying: Agent.config[:keep_retrying],
160
+ keep_retrying: true,
166
161
  force_reconnect: Agent.config[:force_reconnect]
167
162
  }.merge(options)
168
163
  end
@@ -203,7 +198,7 @@ module NewRelic
203
198
  rescue StandardError, Timeout::Error, NewRelic::Agent::ServerConnectionException => e
204
199
  retry if retry_from_error?(e, opts)
205
200
  rescue Exception => e
206
- ::NewRelic::Agent.logger.error("Exception of unexpected type during Agent#connect():", e)
201
+ ::NewRelic::Agent.logger.error('Exception of unexpected type during Agent#connect():', e)
207
202
 
208
203
  raise
209
204
  end
@@ -133,18 +133,18 @@ module NewRelic
133
133
  rescue ForceRestartException, ForceDisconnectException
134
134
  raise
135
135
  rescue UnrecoverableServerException => e
136
- NewRelic::Agent.logger.warn("get_agent_commands message was rejected by remote service, discarding. " \
137
- "Error: ", e)
136
+ NewRelic::Agent.logger.warn('get_agent_commands message was rejected by remote service, discarding. ' \
137
+ 'Error: ', e)
138
138
  rescue ServerConnectionException => e
139
139
  log_remote_unavailable(:get_agent_commands, e)
140
140
  rescue => e
141
- NewRelic::Agent.logger.info("Error during check_for_and_handle_agent_commands, will retry later: ", e)
141
+ NewRelic::Agent.logger.info('Error during check_for_and_handle_agent_commands, will retry later: ', e)
142
142
  end
143
143
  end
144
144
 
145
145
  def log_remote_unavailable(endpoint, e)
146
146
  NewRelic::Agent.logger.debug("Unable to send #{endpoint} data, will try again later. Error: ", e)
147
- NewRelic::Agent.record_metric("Supportability/remote_unavailable", 0.0)
147
+ NewRelic::Agent.record_metric('Supportability/remote_unavailable', 0.0)
148
148
  NewRelic::Agent.record_metric("Supportability/remote_unavailable/#{endpoint.to_s}", 0.0)
149
149
  end
150
150
  end
@@ -11,7 +11,7 @@ module NewRelic
11
11
  def shutdown
12
12
  return unless started?
13
13
 
14
- ::NewRelic::Agent.logger.info("Starting Agent shutdown")
14
+ ::NewRelic::Agent.logger.info('Starting Agent shutdown')
15
15
 
16
16
  stop_event_loop
17
17
  trap_signals_for_litespeed
@@ -48,22 +48,22 @@ module NewRelic
48
48
  transmit_data_types
49
49
  shutdown_service
50
50
 
51
- ::NewRelic::Agent.logger.debug("Graceful disconnect complete")
51
+ ::NewRelic::Agent.logger.debug('Graceful disconnect complete')
52
52
  rescue Timeout::Error, StandardError => e
53
53
  ::NewRelic::Agent.logger.debug("Error when disconnecting #{e.class.name}: #{e.message}")
54
54
  end
55
55
  else
56
- ::NewRelic::Agent.logger.debug("Bypassing graceful disconnect - agent not connected")
56
+ ::NewRelic::Agent.logger.debug('Bypassing graceful disconnect - agent not connected')
57
57
  end
58
58
  end
59
59
 
60
60
  def shutdown_service
61
61
  if @connected_pid == $$ && !@service.kind_of?(NewRelic::Agent::NewRelicService)
62
- ::NewRelic::Agent.logger.debug("Sending New Relic service agent run shutdown message")
62
+ ::NewRelic::Agent.logger.debug('Sending New Relic service agent run shutdown message')
63
63
  @service.shutdown
64
64
  else
65
65
  ::NewRelic::Agent.logger.debug("This agent connected from parent process #{@connected_pid}--not sending " \
66
- "shutdown")
66
+ 'shutdown')
67
67
  end
68
68
  end
69
69
  end
@@ -10,9 +10,8 @@ module NewRelic
10
10
  # requests, we need to wait until the children are forked
11
11
  # before connecting, otherwise the parent process sends useless data
12
12
  def using_forking_dispatcher?
13
- # TODO: MAJOR VERSION - remove :rainbows
14
- if [:puma, :passenger, :rainbows, :unicorn].include?(Agent.config[:dispatcher])
15
- ::NewRelic::Agent.logger.info("Deferring startup of agent reporting thread because " \
13
+ if [:puma, :passenger, :unicorn].include?(Agent.config[:dispatcher])
14
+ ::NewRelic::Agent.logger.info('Deferring startup of agent reporting thread because ' \
16
15
  "#{Agent.config[:dispatcher]} may fork.")
17
16
  true
18
17
  else
@@ -66,7 +65,7 @@ module NewRelic
66
65
  def install_exit_handler
67
66
  return unless should_install_exit_handler?
68
67
 
69
- NewRelic::Agent.logger.debug("Installing at_exit handler")
68
+ NewRelic::Agent.logger.debug('Installing at_exit handler')
70
69
  at_exit { shutdown }
71
70
  end
72
71
  end
@@ -8,23 +8,23 @@ module NewRelic
8
8
  module StartWorkerThread
9
9
  LOG_ONCE_KEYS_RESET_PERIOD = 60.0
10
10
 
11
- TRANSACTION_EVENT_DATA = "transaction_event_data".freeze
12
- CUSTOM_EVENT_DATA = "custom_event_data".freeze
13
- ERROR_EVENT_DATA = "error_event_data".freeze
14
- SPAN_EVENT_DATA = "span_event_data".freeze
15
- LOG_EVENT_DATA = "log_event_data".freeze
11
+ TRANSACTION_EVENT_DATA = 'transaction_event_data'.freeze
12
+ CUSTOM_EVENT_DATA = 'custom_event_data'.freeze
13
+ ERROR_EVENT_DATA = 'error_event_data'.freeze
14
+ SPAN_EVENT_DATA = 'span_event_data'.freeze
15
+ LOG_EVENT_DATA = 'log_event_data'.freeze
16
16
 
17
17
  # Try to launch the worker thread and connect to the server.
18
18
  #
19
19
  # See #connect for a description of connection_options.
20
20
  def start_worker_thread(connection_options = {})
21
21
  if disable = NewRelic::Agent.config[:disable_harvest_thread]
22
- NewRelic::Agent.logger.info("Not starting Ruby Agent worker thread because :disable_harvest_thread is " \
22
+ NewRelic::Agent.logger.info('Not starting Ruby Agent worker thread because :disable_harvest_thread is ' \
23
23
  "#{disable}")
24
24
  return
25
25
  end
26
26
 
27
- ::NewRelic::Agent.logger.debug("Creating Ruby Agent worker thread.")
27
+ ::NewRelic::Agent.logger.debug('Creating Ruby Agent worker thread.')
28
28
  @worker_thread = Threading::AgentThread.create('Worker Loop') do
29
29
  deferred_work!(connection_options)
30
30
  end
@@ -42,11 +42,11 @@ module NewRelic
42
42
  # The use-case where this typically arises is in cronjob scheduled rake tasks where there's
43
43
  # also some network stability/latency issues happening.
44
44
  def stop_event_loop
45
- @event_loop.stop if @event_loop
45
+ @event_loop&.stop
46
46
  # Wait the end of the event loop thread.
47
47
  if @worker_thread
48
48
  unless @worker_thread.join(3)
49
- ::NewRelic::Agent.logger.debug("Event loop thread did not stop within 3 seconds")
49
+ ::NewRelic::Agent.logger.debug('Event loop thread did not stop within 3 seconds')
50
50
  end
51
51
  end
52
52
  end
@@ -60,36 +60,13 @@ module NewRelic
60
60
  end
61
61
 
62
62
  def create_and_run_event_loop
63
- data_harvest = :"#{Agent.config[:data_report_period]}_second_harvest"
64
- event_harvest = :"#{Agent.config[:event_report_period]}_second_harvest"
65
-
66
63
  @event_loop = create_event_loop
64
+ data_harvest = :"#{Agent.config[:data_report_period]}_second_harvest"
67
65
  @event_loop.on(data_harvest) do
68
66
  transmit_data
69
67
  end
70
-
71
- @event_loop.on(interval_for(TRANSACTION_EVENT_DATA)) do
72
- transmit_analytic_event_data
73
- end
74
- @event_loop.on(interval_for(CUSTOM_EVENT_DATA)) do
75
- transmit_custom_event_data
76
- end
77
- @event_loop.on(interval_for(ERROR_EVENT_DATA)) do
78
- transmit_error_event_data
79
- end
80
- @event_loop.on(interval_for(SPAN_EVENT_DATA)) do
81
- transmit_span_event_data
82
- end
83
- @event_loop.on(interval_for(LOG_EVENT_DATA)) do
84
- transmit_log_event_data
85
- end
86
-
87
- @event_loop.on(:reset_log_once_keys) do
88
- ::NewRelic::Agent.logger.clear_already_logged
89
- end
90
- @event_loop.fire_every(Agent.config[:data_report_period], data_harvest)
91
- @event_loop.fire_every(Agent.config[:event_report_period], event_harvest)
92
- @event_loop.fire_every(LOG_ONCE_KEYS_RESET_PERIOD, :reset_log_once_keys)
68
+ establish_interval_transmissions
69
+ establish_fire_everies(data_harvest)
93
70
 
94
71
  @event_loop.run
95
72
  end
@@ -100,7 +77,7 @@ module NewRelic
100
77
  def handle_force_restart(error)
101
78
  ::NewRelic::Agent.logger.debug(error.message)
102
79
  drop_buffered_data
103
- @service.force_restart if @service
80
+ @service&.force_restart
104
81
  @connect_state = :pending
105
82
  sleep(30)
106
83
  end
@@ -109,7 +86,7 @@ module NewRelic
109
86
  # is the worker thread that gathers data and talks to the
110
87
  # server.
111
88
  def handle_force_disconnect(error)
112
- ::NewRelic::Agent.logger.warn("Agent received a ForceDisconnectException from the server, disconnecting. " \
89
+ ::NewRelic::Agent.logger.warn('Agent received a ForceDisconnectException from the server, disconnecting. ' \
113
90
  "(#{error.message})")
114
91
  disconnect
115
92
  end
@@ -118,7 +95,7 @@ module NewRelic
118
95
  # it and disconnecting the agent, since we are now in an
119
96
  # unknown state.
120
97
  def handle_other_error(error)
121
- ::NewRelic::Agent.logger.error("Unhandled error in worker thread, disconnecting.")
98
+ ::NewRelic::Agent.logger.error('Unhandled error in worker thread, disconnecting.')
122
99
  # These errors are fatal (that is, they will prevent the agent from
123
100
  # reporting entirely), so we really want backtraces when they happen
124
101
  ::NewRelic::Agent.logger.log_exception(:error, error)
@@ -156,11 +133,42 @@ module NewRelic
156
133
  # never reaches here unless there is a problem or
157
134
  # the agent is exiting
158
135
  else
159
- ::NewRelic::Agent.logger.debug("No connection. Worker thread ending.")
136
+ ::NewRelic::Agent.logger.debug('No connection. Worker thread ending.')
160
137
  end
161
138
  end
162
139
  end
163
140
  end
141
+
142
+ private
143
+
144
+ def establish_interval_transmissions
145
+ @event_loop.on(interval_for(TRANSACTION_EVENT_DATA)) do
146
+ transmit_analytic_event_data
147
+ end
148
+ @event_loop.on(interval_for(CUSTOM_EVENT_DATA)) do
149
+ transmit_custom_event_data
150
+ end
151
+ @event_loop.on(interval_for(ERROR_EVENT_DATA)) do
152
+ transmit_error_event_data
153
+ end
154
+ @event_loop.on(interval_for(SPAN_EVENT_DATA)) do
155
+ transmit_span_event_data
156
+ end
157
+ @event_loop.on(interval_for(LOG_EVENT_DATA)) do
158
+ transmit_log_event_data
159
+ end
160
+ end
161
+
162
+ def establish_fire_everies(data_harvest)
163
+ @event_loop.on(:reset_log_once_keys) do
164
+ ::NewRelic::Agent.logger.clear_already_logged
165
+ end
166
+
167
+ event_harvest = :"#{Agent.config[:event_report_period]}_second_harvest"
168
+ @event_loop.fire_every(Agent.config[:data_report_period], data_harvest)
169
+ @event_loop.fire_every(Agent.config[:event_report_period], event_harvest)
170
+ @event_loop.fire_every(LOG_ONCE_KEYS_RESET_PERIOD, :reset_log_once_keys)
171
+ end
164
172
  end
165
173
  end
166
174
  end