newrelic_rpm 5.7.0.350 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +15 -1
  3. data/.rubocop.yml +1919 -0
  4. data/.rubocop_todo.yml +100 -0
  5. data/.simplecov +15 -0
  6. data/.snyk +11 -0
  7. data/.yardopts +2 -0
  8. data/Brewfile +12 -0
  9. data/CHANGELOG.md +4056 -2339
  10. data/CONTRIBUTING.md +132 -19
  11. data/DOCKER.md +167 -0
  12. data/Dockerfile +10 -0
  13. data/Gemfile +5 -2
  14. data/Guardfile +22 -4
  15. data/LICENSE +202 -38
  16. data/README.md +87 -87
  17. data/Rakefile +27 -27
  18. data/THIRD_PARTY_NOTICES.md +28 -0
  19. data/Thorfile +5 -0
  20. data/bin/newrelic +3 -2
  21. data/bin/newrelic_cmd +1 -0
  22. data/bin/nrdebug +77 -54
  23. data/config.dot +5 -5
  24. data/docker-compose.yml +107 -0
  25. data/init.rb +5 -7
  26. data/install.rb +3 -3
  27. data/lefthook.yml +9 -0
  28. data/lib/new_relic/agent/adaptive_sampler.rb +14 -10
  29. data/lib/new_relic/agent/agent.rb +125 -969
  30. data/lib/new_relic/agent/agent_helpers/connect.rb +227 -0
  31. data/lib/new_relic/agent/agent_helpers/harvest.rb +153 -0
  32. data/lib/new_relic/agent/agent_helpers/shutdown.rb +72 -0
  33. data/lib/new_relic/agent/agent_helpers/special_startup.rb +74 -0
  34. data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +167 -0
  35. data/lib/new_relic/agent/agent_helpers/startup.rb +202 -0
  36. data/lib/new_relic/agent/agent_helpers/transmit.rb +76 -0
  37. data/lib/new_relic/agent/agent_logger.rb +26 -18
  38. data/lib/new_relic/agent/attribute_filter.rb +69 -52
  39. data/lib/new_relic/agent/attribute_processing.rb +8 -8
  40. data/lib/new_relic/agent/attributes.rb +153 -0
  41. data/lib/new_relic/agent/audit_logger.rb +19 -4
  42. data/lib/new_relic/agent/autostart.rb +34 -28
  43. data/lib/new_relic/agent/chained_call.rb +2 -2
  44. data/lib/new_relic/agent/commands/agent_command.rb +4 -4
  45. data/lib/new_relic/agent/commands/agent_command_router.rb +15 -33
  46. data/lib/new_relic/agent/commands/thread_profiler_session.rb +13 -11
  47. data/lib/new_relic/agent/configuration/default_source.rb +1480 -1053
  48. data/lib/new_relic/agent/configuration/dotted_hash.rb +7 -6
  49. data/lib/new_relic/agent/configuration/environment_source.rb +15 -11
  50. data/lib/new_relic/agent/configuration/event_harvest_config.rb +68 -0
  51. data/lib/new_relic/agent/configuration/high_security_source.rb +9 -9
  52. data/lib/new_relic/agent/configuration/manager.rb +96 -79
  53. data/lib/new_relic/agent/configuration/manual_source.rb +2 -2
  54. data/lib/new_relic/agent/configuration/mask_defaults.rb +4 -4
  55. data/lib/new_relic/agent/configuration/security_policy_source.rb +83 -86
  56. data/lib/new_relic/agent/configuration/server_source.rb +49 -12
  57. data/lib/new_relic/agent/configuration/yaml_source.rb +42 -13
  58. data/lib/new_relic/agent/configuration.rb +2 -2
  59. data/lib/new_relic/agent/connect/request_builder.rb +61 -0
  60. data/lib/new_relic/agent/connect/response_handler.rb +58 -0
  61. data/lib/new_relic/agent/custom_event_aggregator.rb +15 -15
  62. data/lib/new_relic/agent/database/explain_plan_helpers.rb +5 -6
  63. data/lib/new_relic/agent/database/obfuscation_helpers.rb +16 -15
  64. data/lib/new_relic/agent/database/obfuscator.rb +3 -3
  65. data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +4 -4
  66. data/lib/new_relic/agent/database.rb +44 -53
  67. data/lib/new_relic/agent/database_adapter.rb +35 -0
  68. data/lib/new_relic/agent/datastores/metric_helper.rb +18 -20
  69. data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +9 -8
  70. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +7 -11
  71. data/lib/new_relic/agent/datastores/mongo.rb +7 -12
  72. data/lib/new_relic/agent/datastores/nosql_obfuscator.rb +41 -0
  73. data/lib/new_relic/agent/datastores/redis.rb +6 -12
  74. data/lib/new_relic/agent/datastores.rb +19 -23
  75. data/lib/new_relic/agent/deprecator.rb +2 -2
  76. data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +13 -12
  77. data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +87 -66
  78. data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +84 -0
  79. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
  80. data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +163 -0
  81. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +38 -0
  82. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +245 -0
  83. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +127 -0
  84. data/lib/new_relic/agent/distributed_tracing.rb +113 -32
  85. data/lib/new_relic/agent/encoding_normalizer.rb +5 -3
  86. data/lib/new_relic/agent/error_collector.rb +99 -63
  87. data/lib/new_relic/agent/error_event_aggregator.rb +10 -8
  88. data/lib/new_relic/agent/error_filter.rb +174 -0
  89. data/lib/new_relic/agent/error_trace_aggregator.rb +6 -4
  90. data/lib/new_relic/agent/event_aggregator.rb +43 -48
  91. data/lib/new_relic/agent/event_buffer.rb +8 -9
  92. data/lib/new_relic/agent/event_listener.rb +2 -3
  93. data/lib/new_relic/agent/event_loop.rb +27 -25
  94. data/lib/new_relic/agent/external.rb +20 -51
  95. data/lib/new_relic/agent/guid_generator.rb +30 -0
  96. data/lib/new_relic/agent/harvester.rb +5 -6
  97. data/lib/new_relic/agent/heap.rb +8 -10
  98. data/lib/new_relic/agent/hostname.rb +26 -5
  99. data/lib/new_relic/agent/http_clients/abstract.rb +81 -0
  100. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +26 -26
  101. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +31 -17
  102. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +18 -23
  103. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +12 -15
  104. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +24 -8
  105. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +9 -12
  106. data/lib/new_relic/agent/http_clients/uri_util.rb +12 -13
  107. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +22 -52
  108. data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +39 -0
  109. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +59 -72
  110. data/lib/new_relic/agent/instrumentation/action_dispatch.rb +31 -0
  111. data/lib/new_relic/agent/instrumentation/action_dispatch_subscriber.rb +64 -0
  112. data/lib/new_relic/agent/instrumentation/action_mailbox.rb +30 -0
  113. data/lib/new_relic/agent/instrumentation/action_mailbox_subscriber.rb +33 -0
  114. data/lib/new_relic/agent/instrumentation/action_mailer.rb +30 -0
  115. data/lib/new_relic/agent/instrumentation/action_mailer_subscriber.rb +85 -0
  116. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +86 -62
  117. data/lib/new_relic/agent/instrumentation/active_job.rb +38 -19
  118. data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +41 -0
  119. data/lib/new_relic/agent/instrumentation/active_merchant.rb +21 -7
  120. data/lib/new_relic/agent/instrumentation/active_record.rb +95 -46
  121. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +82 -61
  122. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +155 -0
  123. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +36 -12
  124. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +69 -64
  125. data/lib/new_relic/agent/instrumentation/active_storage.rb +8 -4
  126. data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +11 -32
  127. data/lib/new_relic/agent/instrumentation/active_support.rb +27 -0
  128. data/lib/new_relic/agent/instrumentation/active_support_logger/chain.rb +23 -0
  129. data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +20 -0
  130. data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +12 -0
  131. data/lib/new_relic/agent/instrumentation/active_support_logger.rb +24 -0
  132. data/lib/new_relic/agent/instrumentation/active_support_subscriber.rb +41 -0
  133. data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
  134. data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +150 -0
  135. data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
  136. data/lib/new_relic/agent/instrumentation/bunny.rb +14 -134
  137. data/lib/new_relic/agent/instrumentation/concurrent_ruby/chain.rb +36 -0
  138. data/lib/new_relic/agent/instrumentation/concurrent_ruby/instrumentation.rb +21 -0
  139. data/lib/new_relic/agent/instrumentation/concurrent_ruby/prepend.rb +27 -0
  140. data/lib/new_relic/agent/instrumentation/concurrent_ruby.rb +31 -0
  141. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +77 -61
  142. data/lib/new_relic/agent/instrumentation/curb/chain.rb +91 -0
  143. data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +221 -0
  144. data/lib/new_relic/agent/instrumentation/curb/prepend.rb +61 -0
  145. data/lib/new_relic/agent/instrumentation/curb.rb +15 -187
  146. data/lib/new_relic/agent/instrumentation/custom_events.rb +12 -0
  147. data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +37 -0
  148. data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +35 -0
  149. data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +48 -0
  150. data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +33 -0
  151. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +30 -52
  152. data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +29 -0
  153. data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +66 -0
  154. data/lib/new_relic/agent/instrumentation/elasticsearch/prepend.rb +13 -0
  155. data/lib/new_relic/agent/instrumentation/elasticsearch.rb +31 -0
  156. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +8 -7
  157. data/lib/new_relic/agent/instrumentation/excon.rb +29 -31
  158. data/lib/new_relic/agent/instrumentation/fiber/chain.rb +20 -0
  159. data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +24 -0
  160. data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +18 -0
  161. data/lib/new_relic/agent/instrumentation/fiber.rb +25 -0
  162. data/lib/new_relic/agent/instrumentation/grape/chain.rb +24 -0
  163. data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
  164. data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
  165. data/lib/new_relic/agent/instrumentation/grape.rb +16 -121
  166. data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +97 -0
  167. data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +89 -0
  168. data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +111 -0
  169. data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +30 -0
  170. data/lib/new_relic/agent/instrumentation/grpc/helper.rb +32 -0
  171. data/lib/new_relic/agent/instrumentation/grpc/server/chain.rb +69 -0
  172. data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +134 -0
  173. data/lib/new_relic/agent/instrumentation/grpc/server/rpc_desc_prepend.rb +35 -0
  174. data/lib/new_relic/agent/instrumentation/grpc/server/rpc_server_prepend.rb +26 -0
  175. data/lib/new_relic/agent/instrumentation/grpc_client.rb +23 -0
  176. data/lib/new_relic/agent/instrumentation/grpc_server.rb +25 -0
  177. data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +24 -0
  178. data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +37 -0
  179. data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +15 -0
  180. data/lib/new_relic/agent/instrumentation/httpclient.rb +12 -32
  181. data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
  182. data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
  183. data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
  184. data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
  185. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +5 -6
  186. data/lib/new_relic/agent/instrumentation/logger/chain.rb +21 -0
  187. data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +66 -0
  188. data/lib/new_relic/agent/instrumentation/logger/prepend.rb +13 -0
  189. data/lib/new_relic/agent/instrumentation/logger.rb +26 -0
  190. data/lib/new_relic/agent/instrumentation/memcache/chain.rb +15 -0
  191. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +58 -125
  192. data/lib/new_relic/agent/instrumentation/memcache/helper.rb +59 -0
  193. data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +90 -0
  194. data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +101 -0
  195. data/lib/new_relic/agent/instrumentation/memcache.rb +57 -71
  196. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +15 -14
  197. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +21 -14
  198. data/lib/new_relic/agent/instrumentation/mongo.rb +7 -132
  199. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +49 -13
  200. data/lib/new_relic/agent/instrumentation/net_http/chain.rb +24 -0
  201. data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +40 -0
  202. data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
  203. data/lib/new_relic/agent/instrumentation/net_http.rb +44 -0
  204. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +142 -0
  205. data/lib/new_relic/agent/instrumentation/padrino/chain.rb +38 -0
  206. data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +28 -0
  207. data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
  208. data/lib/new_relic/agent/instrumentation/padrino.rb +22 -58
  209. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +7 -7
  210. data/lib/new_relic/agent/instrumentation/queue_time.rb +9 -10
  211. data/lib/new_relic/agent/instrumentation/rack/chain.rb +66 -0
  212. data/lib/new_relic/agent/instrumentation/rack/helpers.rb +33 -0
  213. data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +75 -0
  214. data/lib/new_relic/agent/instrumentation/rack/prepend.rb +43 -0
  215. data/lib/new_relic/agent/instrumentation/rack.rb +33 -141
  216. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +19 -55
  217. data/lib/new_relic/agent/instrumentation/rails_middleware.rb +5 -5
  218. data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +36 -0
  219. data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +45 -0
  220. data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +30 -0
  221. data/lib/new_relic/agent/instrumentation/rails_notifications/custom_events.rb +30 -0
  222. data/lib/new_relic/agent/instrumentation/rake/chain.rb +20 -0
  223. data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +142 -0
  224. data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
  225. data/lib/new_relic/agent/instrumentation/rake.rb +18 -159
  226. data/lib/new_relic/agent/instrumentation/redis/chain.rb +45 -0
  227. data/lib/new_relic/agent/instrumentation/redis/constants.rb +17 -0
  228. data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +93 -0
  229. data/lib/new_relic/agent/instrumentation/redis/middleware.rb +16 -0
  230. data/lib/new_relic/agent/instrumentation/redis/prepend.rb +29 -0
  231. data/lib/new_relic/agent/instrumentation/redis.rb +20 -103
  232. data/lib/new_relic/agent/instrumentation/resque/chain.rb +21 -0
  233. data/lib/new_relic/agent/instrumentation/resque/helper.rb +19 -0
  234. data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +34 -0
  235. data/lib/new_relic/agent/instrumentation/resque/prepend.rb +15 -0
  236. data/lib/new_relic/agent/instrumentation/resque.rb +33 -41
  237. data/lib/new_relic/agent/instrumentation/sequel.rb +17 -20
  238. data/lib/new_relic/agent/instrumentation/sequel_helper.rb +3 -3
  239. data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +20 -0
  240. data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +30 -0
  241. data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +37 -0
  242. data/lib/new_relic/agent/instrumentation/sidekiq.rb +29 -46
  243. data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
  244. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +31 -37
  245. data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +125 -0
  246. data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
  247. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +3 -3
  248. data/lib/new_relic/agent/instrumentation/sinatra.rb +35 -165
  249. data/lib/new_relic/agent/instrumentation/thread/chain.rb +24 -0
  250. data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +28 -0
  251. data/lib/new_relic/agent/instrumentation/thread/prepend.rb +22 -0
  252. data/lib/new_relic/agent/instrumentation/thread.rb +20 -0
  253. data/lib/new_relic/agent/instrumentation/tilt/chain.rb +24 -0
  254. data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +41 -0
  255. data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +13 -0
  256. data/lib/new_relic/agent/instrumentation/tilt.rb +25 -0
  257. data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
  258. data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +80 -0
  259. data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
  260. data/lib/new_relic/agent/instrumentation/typhoeus.rb +14 -76
  261. data/lib/new_relic/agent/instrumentation.rb +2 -2
  262. data/lib/new_relic/agent/internal_agent_error.rb +3 -3
  263. data/lib/new_relic/agent/javascript_instrumentor.rb +51 -45
  264. data/lib/new_relic/agent/linking_metadata.rb +44 -0
  265. data/lib/new_relic/agent/local_log_decorator.rb +37 -0
  266. data/lib/new_relic/agent/log_event_aggregator.rb +235 -0
  267. data/lib/new_relic/agent/log_once.rb +2 -2
  268. data/lib/new_relic/agent/log_priority.rb +20 -0
  269. data/lib/new_relic/agent/logging.rb +142 -0
  270. data/lib/new_relic/agent/memory_logger.rb +3 -3
  271. data/lib/new_relic/agent/messaging.rb +81 -164
  272. data/lib/new_relic/agent/method_tracer.rb +152 -145
  273. data/lib/new_relic/agent/method_tracer_helpers.rb +90 -13
  274. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +117 -0
  275. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +28 -0
  276. data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +5 -6
  277. data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +9 -15
  278. data/lib/new_relic/agent/monitors.rb +26 -0
  279. data/lib/new_relic/agent/new_relic_service/encoders.rb +7 -7
  280. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +6 -7
  281. data/lib/new_relic/agent/new_relic_service/marshaller.rb +8 -29
  282. data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +5 -5
  283. data/lib/new_relic/agent/new_relic_service.rb +282 -166
  284. data/lib/new_relic/agent/noticeable_error.rb +19 -0
  285. data/lib/new_relic/agent/null_logger.rb +8 -4
  286. data/lib/new_relic/agent/obfuscator.rb +9 -11
  287. data/lib/new_relic/agent/parameter_filtering.rb +35 -8
  288. data/lib/new_relic/agent/payload_metric_mapping.rb +10 -11
  289. data/lib/new_relic/agent/pipe_channel_manager.rb +28 -18
  290. data/lib/new_relic/agent/pipe_service.rb +9 -6
  291. data/lib/new_relic/agent/prepend_supportability.rb +3 -3
  292. data/lib/new_relic/agent/priority_sampled_buffer.rb +16 -14
  293. data/lib/new_relic/agent/range_extensions.rb +9 -29
  294. data/lib/new_relic/agent/rules_engine/replacement_rule.rb +12 -12
  295. data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +13 -14
  296. data/lib/new_relic/agent/rules_engine.rb +6 -5
  297. data/lib/new_relic/agent/sampler.rb +4 -5
  298. data/lib/new_relic/agent/sampler_collection.rb +4 -5
  299. data/lib/new_relic/agent/samplers/cpu_sampler.rb +4 -3
  300. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +14 -11
  301. data/lib/new_relic/agent/samplers/memory_sampler.rb +26 -15
  302. data/lib/new_relic/agent/samplers/object_sampler.rb +2 -2
  303. data/lib/new_relic/agent/samplers/vm_sampler.rb +22 -20
  304. data/lib/new_relic/agent/span_event_aggregator.rb +14 -16
  305. data/lib/new_relic/agent/span_event_primitive.rb +118 -58
  306. data/lib/new_relic/agent/sql_sampler.rb +25 -25
  307. data/lib/new_relic/agent/stats.rb +79 -42
  308. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +11 -13
  309. data/lib/new_relic/agent/stats_engine/stats_hash.rb +13 -14
  310. data/lib/new_relic/agent/stats_engine.rb +11 -11
  311. data/lib/new_relic/agent/synthetics_event_aggregator.rb +8 -9
  312. data/lib/new_relic/agent/system_info.rb +100 -66
  313. data/lib/new_relic/agent/threading/agent_thread.rb +20 -16
  314. data/lib/new_relic/agent/threading/backtrace_node.rb +13 -14
  315. data/lib/new_relic/agent/threading/backtrace_service.rb +18 -18
  316. data/lib/new_relic/agent/threading/thread_profile.rb +31 -45
  317. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +2 -2
  318. data/lib/new_relic/agent/tracer.rb +513 -0
  319. data/lib/new_relic/agent/transaction/abstract_segment.rb +131 -41
  320. data/lib/new_relic/agent/transaction/datastore_segment.rb +22 -18
  321. data/lib/new_relic/agent/transaction/distributed_tracer.rb +184 -0
  322. data/lib/new_relic/agent/transaction/distributed_tracing.rb +72 -163
  323. data/lib/new_relic/agent/transaction/external_request_segment.rb +66 -63
  324. data/lib/new_relic/agent/transaction/message_broker_segment.rb +34 -46
  325. data/lib/new_relic/agent/transaction/request_attributes.rb +36 -36
  326. data/lib/new_relic/agent/transaction/segment.rb +46 -10
  327. data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +2 -4
  328. data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +2 -2
  329. data/lib/new_relic/agent/transaction/trace.rb +21 -24
  330. data/lib/new_relic/agent/transaction/trace_builder.rb +11 -12
  331. data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
  332. data/lib/new_relic/agent/transaction/trace_node.rb +31 -28
  333. data/lib/new_relic/agent/transaction/tracing.rb +15 -111
  334. data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +6 -6
  335. data/lib/new_relic/agent/transaction.rb +252 -259
  336. data/lib/new_relic/agent/transaction_error_primitive.rb +34 -37
  337. data/lib/new_relic/agent/transaction_event_aggregator.rb +13 -13
  338. data/lib/new_relic/agent/transaction_event_primitive.rb +44 -56
  339. data/lib/new_relic/agent/transaction_event_recorder.rb +17 -16
  340. data/lib/new_relic/agent/transaction_metrics.rb +11 -10
  341. data/lib/new_relic/agent/transaction_sampler.rb +7 -12
  342. data/lib/new_relic/agent/transaction_time_aggregator.rb +41 -26
  343. data/lib/new_relic/agent/utilization/aws.rb +34 -4
  344. data/lib/new_relic/agent/utilization/azure.rb +4 -4
  345. data/lib/new_relic/agent/utilization/gcp.rb +8 -8
  346. data/lib/new_relic/agent/utilization/pcf.rb +6 -5
  347. data/lib/new_relic/agent/utilization/vendor.rb +44 -29
  348. data/lib/new_relic/agent/utilization_data.rb +43 -6
  349. data/lib/new_relic/agent/vm/jruby_vm.rb +2 -2
  350. data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +3 -3
  351. data/lib/new_relic/agent/vm/mri_vm.rb +46 -19
  352. data/lib/new_relic/agent/vm/snapshot.rb +6 -6
  353. data/lib/new_relic/agent/vm.rb +2 -2
  354. data/lib/new_relic/agent/worker_loop.rb +11 -13
  355. data/lib/new_relic/agent.rb +151 -79
  356. data/lib/new_relic/cli/command.rb +21 -23
  357. data/lib/new_relic/cli/commands/deployments.rb +94 -45
  358. data/lib/new_relic/cli/commands/install.rb +24 -26
  359. data/lib/new_relic/coerce.rb +42 -15
  360. data/lib/new_relic/collection_helper.rb +51 -49
  361. data/lib/new_relic/constants.rb +39 -0
  362. data/lib/new_relic/control/class_methods.rb +11 -5
  363. data/lib/new_relic/control/frameworks/external.rb +3 -3
  364. data/lib/new_relic/control/frameworks/rails.rb +24 -18
  365. data/lib/new_relic/control/frameworks/rails3.rb +4 -5
  366. data/lib/new_relic/control/frameworks/rails4.rb +2 -2
  367. data/lib/new_relic/control/frameworks/rails_notifications.rb +14 -0
  368. data/lib/new_relic/control/frameworks/ruby.rb +4 -4
  369. data/lib/new_relic/control/frameworks/sinatra.rb +8 -2
  370. data/lib/new_relic/control/frameworks.rb +2 -2
  371. data/lib/new_relic/control/instance_methods.rb +33 -42
  372. data/lib/new_relic/control/instrumentation.rb +40 -12
  373. data/lib/new_relic/control/private_instance_methods.rb +48 -0
  374. data/lib/new_relic/control/server_methods.rb +4 -5
  375. data/lib/new_relic/control.rb +2 -3
  376. data/lib/new_relic/delayed_job_injection.rb +2 -2
  377. data/lib/new_relic/dependency_detection.rb +129 -18
  378. data/lib/new_relic/environment_report.rb +41 -35
  379. data/lib/new_relic/helper.rb +49 -8
  380. data/lib/new_relic/language_support.rb +30 -6
  381. data/lib/new_relic/latest_changes.rb +9 -8
  382. data/lib/new_relic/local_environment.rb +23 -27
  383. data/lib/new_relic/metric_data.rb +32 -27
  384. data/lib/new_relic/metric_spec.rb +9 -7
  385. data/lib/new_relic/noticed_error.rb +46 -33
  386. data/lib/new_relic/rack/agent_hooks.rb +2 -2
  387. data/lib/new_relic/rack/agent_middleware.rb +7 -5
  388. data/lib/new_relic/rack/browser_monitoring.rb +134 -117
  389. data/lib/new_relic/rack.rb +2 -2
  390. data/lib/new_relic/recipes/capistrano3.rb +4 -62
  391. data/lib/new_relic/recipes/capistrano_legacy.rb +24 -27
  392. data/lib/new_relic/recipes/helpers/send_deployment.rb +70 -0
  393. data/lib/new_relic/recipes.rb +2 -2
  394. data/lib/new_relic/supportability_helper.rb +21 -7
  395. data/lib/new_relic/traced_thread.rb +39 -0
  396. data/lib/new_relic/version.rb +7 -18
  397. data/lib/newrelic_rpm.rb +20 -33
  398. data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +16 -19
  399. data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +9 -15
  400. data/lib/tasks/all.rb +4 -4
  401. data/lib/tasks/config.rake +22 -118
  402. data/lib/tasks/coverage_report.rake +28 -0
  403. data/lib/tasks/helpers/config.html.erb +21 -0
  404. data/lib/tasks/helpers/format.rb +123 -0
  405. data/lib/tasks/helpers/matches.rb +12 -0
  406. data/lib/tasks/helpers/prompt.rb +24 -0
  407. data/lib/tasks/helpers/removers.rb +33 -0
  408. data/lib/tasks/install.rake +4 -0
  409. data/lib/tasks/instrumentation_generator/README.md +63 -0
  410. data/lib/tasks/instrumentation_generator/TODO.md +33 -0
  411. data/lib/tasks/instrumentation_generator/instrumentation.thor +121 -0
  412. data/lib/tasks/instrumentation_generator/templates/Envfile.tt +9 -0
  413. data/lib/tasks/instrumentation_generator/templates/chain.tt +22 -0
  414. data/lib/tasks/instrumentation_generator/templates/chain_method.tt +8 -0
  415. data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +29 -0
  416. data/lib/tasks/instrumentation_generator/templates/instrumentation.tt +13 -0
  417. data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +3 -0
  418. data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +19 -0
  419. data/lib/tasks/instrumentation_generator/templates/prepend.tt +13 -0
  420. data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +3 -0
  421. data/lib/tasks/instrumentation_generator/templates/test.tt +15 -0
  422. data/lib/tasks/multiverse.rake +4 -0
  423. data/lib/tasks/multiverse.rb +12 -5
  424. data/lib/tasks/newrelic.rb +2 -2
  425. data/lib/tasks/tests.rake +14 -14
  426. data/newrelic.yml +672 -3
  427. data/newrelic_rpm.gemspec +40 -31
  428. data/recipes/newrelic.rb +3 -3
  429. data/test/agent_helper.rb +419 -98
  430. metadata +238 -127
  431. data/.travis.yml +0 -228
  432. data/bin/mongrel_rpm +0 -33
  433. data/cert/cacert.pem +0 -1177
  434. data/lib/new_relic/agent/commands/xray_session.rb +0 -55
  435. data/lib/new_relic/agent/commands/xray_session_collection.rb +0 -161
  436. data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
  437. data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +0 -44
  438. data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +0 -53
  439. data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -41
  440. data/lib/new_relic/agent/distributed_trace_payload.rb +0 -246
  441. data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
  442. data/lib/new_relic/agent/instrumentation/active_record_4.rb +0 -42
  443. data/lib/new_relic/agent/instrumentation/active_record_5.rb +0 -41
  444. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -74
  445. data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -25
  446. data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -202
  447. data/lib/new_relic/agent/instrumentation/evented_subscriber.rb +0 -104
  448. data/lib/new_relic/agent/instrumentation/excon/connection.rb +0 -46
  449. data/lib/new_relic/agent/instrumentation/http.rb +0 -46
  450. data/lib/new_relic/agent/instrumentation/merb/controller.rb +0 -44
  451. data/lib/new_relic/agent/instrumentation/merb/errors.rb +0 -33
  452. data/lib/new_relic/agent/instrumentation/net.rb +0 -50
  453. data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +0 -125
  454. data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +0 -46
  455. data/lib/new_relic/agent/instrumentation/rails4/action_controller.rb +0 -32
  456. data/lib/new_relic/agent/instrumentation/rails4/action_view.rb +0 -27
  457. data/lib/new_relic/agent/instrumentation/rails5/action_cable.rb +0 -36
  458. data/lib/new_relic/agent/instrumentation/rails5/action_controller.rb +0 -33
  459. data/lib/new_relic/agent/instrumentation/rails5/action_view.rb +0 -27
  460. data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +0 -26
  461. data/lib/new_relic/agent/instrumentation/sunspot.rb +0 -33
  462. data/lib/new_relic/agent/supported_versions.rb +0 -275
  463. data/lib/new_relic/agent/transaction/attributes.rb +0 -154
  464. data/lib/new_relic/agent/transaction/xray_sample_buffer.rb +0 -64
  465. data/lib/new_relic/agent/transaction_state.rb +0 -186
  466. data/lib/new_relic/build.rb +0 -2
  467. data/lib/new_relic/control/frameworks/merb.rb +0 -29
  468. data/lib/new_relic/control/frameworks/rails5.rb +0 -14
  469. data/lib/new_relic/metrics.rb +0 -13
  470. data/lib/tasks/config.html.erb +0 -32
  471. data/lib/tasks/versions.html.erb +0 -28
  472. data/lib/tasks/versions.postface.html +0 -8
  473. data/lib/tasks/versions.preface.html +0 -9
  474. data/lib/tasks/versions.rake +0 -65
  475. data/lib/tasks/versions.txt.erb +0 -14
  476. /data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
@@ -0,0 +1,19 @@
1
+ # This file is distributed under New Relic's license terms.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
+
5
+ module NewRelic
6
+ module Agent
7
+ # This class is used for instrumentations that have exceptions or error classes
8
+ # not derived from Ruby's usual Exception or StandardError or in situations
9
+ # where we do not have such Exception object to work with.
10
+ class NoticeableError
11
+ attr_reader :class_name, :message
12
+
13
+ def initialize(class_name, message)
14
+ @class_name = class_name
15
+ @message = message
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  # A stub object that we can use in place of a real Logger instance when
6
6
  # the agent is disabled.
@@ -8,9 +8,13 @@ module NewRelic
8
8
  module Agent
9
9
  class NullLogger
10
10
  def fatal(*args); end
11
+
11
12
  def error(*args); end
12
- def warn(*args); end
13
- def info(*args); end
13
+
14
+ def warn(*args); end
15
+
16
+ def info(*args); end
17
+
14
18
  def debug(*args); end
15
19
 
16
20
  def method_missing(method, *args, &blk)
@@ -1,20 +1,19 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
- #require 'base64'
5
+ # require 'base64'
6
6
 
7
7
  module NewRelic
8
8
  module Agent
9
9
  class Obfuscator
10
-
11
10
  attr_reader :key_bytes
12
11
 
13
12
  EMPTY_KEY_BYTES = [0]
14
13
  PACK_FORMAT = 'm'
15
14
 
16
15
  # RUM uses a shortened key, so just trim it up front
17
- def initialize(key, length=nil)
16
+ def initialize(key, length = nil)
18
17
  if key.nil? || key.empty?
19
18
  @key_bytes = EMPTY_KEY_BYTES
20
19
  else
@@ -24,26 +23,25 @@ module NewRelic
24
23
  end
25
24
 
26
25
  def obfuscate(text)
27
- [ encode(text) ].pack(PACK_FORMAT).gsub(/\n/, '')
26
+ [encode(text)].pack(PACK_FORMAT).delete("\n")
28
27
  end
29
28
 
30
29
  def deobfuscate(text)
31
- encode(text.unpack(PACK_FORMAT).first )
30
+ encode(text.unpack(PACK_FORMAT).first)
32
31
  end
33
32
 
34
33
  def encode(text)
35
34
  return text unless key_bytes
36
35
 
37
- encoded = ""
38
- encoded.force_encoding('binary') if encoded.respond_to?( :force_encoding )
36
+ encoded = String.new('')
37
+ encoded.force_encoding('binary') if encoded.respond_to?(:force_encoding)
39
38
  index = 0
40
39
  text.each_byte do |byte|
41
40
  encoded.concat((byte ^ key_bytes[index % key_bytes.length]))
42
- index+=1
41
+ index += 1
43
42
  end
44
43
  encoded
45
44
  end
46
-
47
45
  end
48
46
  end
49
47
  end
@@ -1,29 +1,50 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  module NewRelic
6
6
  module Agent
7
7
  module ParameterFiltering
8
8
  extend self
9
9
 
10
+ ACTION_DISPATCH_PARAMETER_FILTER ||= "action_dispatch.parameter_filter".freeze
11
+
12
+ if defined?(Rails) && Gem::Version.new(::Rails::VERSION::STRING) >= Gem::Version.new('5.0.0')
13
+ Rails.application.config.to_prepare do
14
+ RAILS_FILTER_CLASS ||= if defined?(ActiveSupport::ParameterFilter)
15
+ ActiveSupport::ParameterFilter
16
+ elsif defined?(ActionDispatch::Http::ParameterFilter)
17
+ ActionDispatch::Http::ParameterFilter
18
+ end
19
+ end
20
+ else
21
+ RAILS_FILTER_CLASS ||= if defined?(ActiveSupport::ParameterFilter)
22
+ ActiveSupport::ParameterFilter
23
+ elsif defined?(ActionDispatch::Http::ParameterFilter)
24
+ ActionDispatch::Http::ParameterFilter
25
+ end
26
+ end
27
+
10
28
  def apply_filters(env, params)
11
- params = filter_using_rails(env, params)
29
+ if filters = env[ACTION_DISPATCH_PARAMETER_FILTER]
30
+ params = filter_using_rails(params, filters)
31
+ end
12
32
  params = filter_rack_file_data(env, params)
13
33
  params
14
34
  end
15
35
 
16
- def filter_using_rails(env, params)
17
- return params unless defined?(ActionDispatch::Http::ParameterFilter) && env.key?("action_dispatch.parameter_filter")
18
- filters = env["action_dispatch.parameter_filter"]
19
- ActionDispatch::Http::ParameterFilter.new(filters).filter(params)
36
+ def filter_using_rails(params, filters)
37
+ return params unless rails_filter_class?
38
+
39
+ pre_filtered_params = filter_rails_request_parameters(params)
40
+ RAILS_FILTER_CLASS.new(filters).filter(pre_filtered_params)
20
41
  end
21
42
 
22
43
  def filter_rack_file_data(env, params)
23
44
  content_type = env["CONTENT_TYPE"]
24
45
  multipart = content_type && content_type.start_with?("multipart")
25
46
 
26
- params.inject({}) do |memo, (k,v)|
47
+ params.inject({}) do |memo, (k, v)|
27
48
  if multipart && v.is_a?(Hash) && v[:tempfile]
28
49
  memo[k] = "[FILE]"
29
50
  else
@@ -39,6 +60,12 @@ module NewRelic
39
60
  result.delete("action")
40
61
  result
41
62
  end
63
+
64
+ private
65
+
66
+ def rails_filter_class?
67
+ defined?(RAILS_FILTER_CLASS) && !RAILS_FILTER_CLASS.nil?
68
+ end
42
69
  end
43
70
  end
44
71
  end
@@ -1,12 +1,11 @@
1
1
  # -*- ruby -*-
2
- # encoding: utf-8
3
2
  # This file is distributed under New Relic's license terms.
4
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
3
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
5
5
 
6
6
  module NewRelic
7
7
  module Agent
8
8
  module PayloadMetricMapping
9
-
10
9
  # this logic was extracted from TransactionEventAggregator for reuse by
11
10
  # the ErrorEventAggregator
12
11
 
@@ -28,7 +27,7 @@ module NewRelic
28
27
 
29
28
  private
30
29
 
31
- def map_metric(metric_name, to_add={})
30
+ def map_metric(metric_name, to_add = {})
32
31
  to_add.values.each(&:freeze)
33
32
 
34
33
  mappings = SPEC_MAPPINGS.fetch(metric_name, {})
@@ -41,18 +40,18 @@ module NewRelic
41
40
  # All Transactions
42
41
  # Don't need to use the transaction-type specific metrics since this is
43
42
  # scoped to just one transaction, so Datastore/all has what we want.
44
- map_metric('Datastore/all', :total_call_time => 'databaseDuration')
45
- map_metric('Datastore/all', :call_count => 'databaseCallCount')
46
- map_metric('GC/Transaction/all', :total_call_time => 'gcCumulative')
43
+ map_metric('Datastore/all', :total_call_time => 'databaseDuration')
44
+ map_metric('Datastore/all', :call_count => 'databaseCallCount')
45
+ map_metric('GC/Transaction/all', :total_call_time => 'gcCumulative')
47
46
 
48
47
  # Web Metrics
49
48
  map_metric('WebFrontend/QueueTime', :total_call_time => 'queueDuration')
50
- map_metric('External/allWeb', :total_call_time => 'externalDuration')
51
- map_metric('External/allWeb', :call_count => 'externalCallCount')
49
+ map_metric('External/allWeb', :total_call_time => 'externalDuration')
50
+ map_metric('External/allWeb', :call_count => 'externalCallCount')
52
51
 
53
52
  # Background Metrics
54
- map_metric('External/allOther', :total_call_time => 'externalDuration')
55
- map_metric('External/allOther', :call_count => 'externalCallCount')
53
+ map_metric('External/allOther', :total_call_time => 'externalDuration')
54
+ map_metric('External/allOther', :call_count => 'externalCallCount')
56
55
  end
57
56
  end
58
57
  end
@@ -1,12 +1,11 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  require 'base64'
6
6
 
7
7
  module NewRelic
8
8
  module Agent
9
-
10
9
  #--
11
10
  # Manages the registering and servicing of pipes used by child
12
11
  # processes to report data to their parent, rather than directly
@@ -67,7 +66,7 @@ module NewRelic
67
66
  if defined?(::Encoding::ASCII_8BIT)
68
67
  @in.set_encoding(::Encoding::ASCII_8BIT)
69
68
  end
70
- @last_read = Time.now
69
+ @last_read = Process.clock_gettime(Process::CLOCK_REALTIME)
71
70
  @parent_pid = $$
72
71
  end
73
72
 
@@ -92,7 +91,7 @@ module NewRelic
92
91
 
93
92
  def read
94
93
  @in.close unless @in.closed?
95
- @last_read = Time.now
94
+ @last_read = Process.clock_gettime(Process::CLOCK_REALTIME)
96
95
  length_bytes = @out.read(NUM_LENGTH_BYTES)
97
96
  if length_bytes
98
97
  message_length = deserialize_message_length(length_bytes)
@@ -128,7 +127,7 @@ module NewRelic
128
127
  end
129
128
 
130
129
  class Listener
131
- attr_reader :thread
130
+ attr_reader :thread
132
131
 
133
132
  # This attr_accessor intentionally provides unsynchronized access to the
134
133
  # @pipes hash. It is used to look up the write end of the pipe from
@@ -161,6 +160,7 @@ module NewRelic
161
160
 
162
161
  def start
163
162
  return if @started == true
163
+
164
164
  @started = true
165
165
  @thread = NewRelic::Agent::Threading::AgentThread.create('Pipe Channel Manager') do
166
166
  now = nil
@@ -168,27 +168,36 @@ module NewRelic
168
168
  clean_up_pipes
169
169
 
170
170
  pipes_to_listen_to = @pipes_lock.synchronize do
171
- @pipes.values.map{|pipe| pipe.out} + [wake.out]
171
+ @pipes.values.map { |pipe| pipe.out } + [wake.out]
172
172
  end
173
173
 
174
- NewRelic::Agent.record_metric('Supportability/Listeners',
175
- (Time.now - now).to_f) if now
174
+ if now
175
+ NewRelic::Agent.record_metric(
176
+ 'Supportability/Listeners',
177
+ Process.clock_gettime(Process::CLOCK_REALTIME) - now
178
+ )
179
+ end
176
180
 
177
181
  if ready = IO.select(pipes_to_listen_to, [], [], @select_timeout)
178
- now = Time.now
182
+ now = Process.clock_gettime(Process::CLOCK_REALTIME)
179
183
 
180
184
  ready_pipes = ready[0]
181
185
  ready_pipes.each do |pipe|
182
186
  merge_data_from_pipe(pipe) unless pipe == wake.out
183
187
  end
184
188
 
185
- wake.out.read(1) if ready_pipes.include?(wake.out)
189
+ begin
190
+ wake.out.read_nonblock(1) if ready_pipes.include?(wake.out)
191
+ rescue IO::WaitReadable
192
+ NewRelic::Agent.logger.error('Issue while reading from the ready pipe')
193
+ NewRelic::Agent.logger.error("Ready pipes: #{ready_pipes.map(&:to_s)}, wake.out pipe: #{wake.out}")
194
+ end
186
195
  end
187
196
 
188
197
  break unless should_keep_listening?
189
198
  end
190
199
  end
191
- sleep 0.001 # give time for the thread to spawn
200
+ sleep(0.001) # give time for the thread to spawn
192
201
  end
193
202
 
194
203
  def stop_listener_thread
@@ -199,6 +208,7 @@ module NewRelic
199
208
 
200
209
  def stop
201
210
  return unless @started == true
211
+
202
212
  stop_listener_thread
203
213
  close_all_pipes
204
214
  @wake.close
@@ -245,29 +255,29 @@ module NewRelic
245
255
  def unmarshal(data)
246
256
  Marshal.load(data)
247
257
  rescue StandardError => e
248
- ::NewRelic::Agent.logger.error "Failure unmarshalling message from Resque child process", e
249
- ::NewRelic::Agent.logger.debug Base64.encode64(data)
258
+ ::NewRelic::Agent.logger.error("Failure unmarshalling message from Resque child process", e)
259
+ ::NewRelic::Agent.logger.debug(Base64.encode64(data))
250
260
  nil
251
261
  end
252
262
 
253
263
  def should_keep_listening?
254
- @started || @pipes_lock.synchronize { @pipes.values.find{|pipe| !pipe.in.closed?} }
264
+ @started || @pipes_lock.synchronize { @pipes.values.find { |pipe| !pipe.in.closed? } }
255
265
  end
256
266
 
257
267
  def clean_up_pipes
258
268
  @pipes_lock.synchronize do
259
269
  @pipes.values.each do |pipe|
260
- if pipe.last_read.to_f + @timeout < Time.now.to_f
270
+ if pipe.last_read + @timeout < Process.clock_gettime(Process::CLOCK_REALTIME)
261
271
  pipe.close unless pipe.closed?
262
272
  end
263
273
  end
264
- @pipes.reject! {|id, pipe| pipe.out.closed? }
274
+ @pipes.reject! { |id, pipe| pipe.out.closed? }
265
275
  end
266
276
  end
267
277
 
268
278
  def find_pipe_for_handle(out_handle)
269
279
  @pipes_lock.synchronize do
270
- @pipes.values.find{|pipe| pipe.out == out_handle }
280
+ @pipes.values.find { |pipe| pipe.out == out_handle }
271
281
  end
272
282
  end
273
283
  end
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  module NewRelic
6
6
  module Agent
@@ -10,8 +10,7 @@ module NewRelic
10
10
 
11
11
  def initialize(channel_id)
12
12
  @channel_id = channel_id
13
- @collector = NewRelic::Control::Server.new(:name => 'parent',
14
- :port => 0)
13
+ @collector = NewRelic::Control::Server.new({name: 'parent', port: 0})
15
14
  @pipe = NewRelic::Agent::PipeChannelManager.channels[@channel_id]
16
15
  if @pipe && @pipe.parent_pid != $$
17
16
  @pipe.after_fork_in_child
@@ -25,7 +24,7 @@ module NewRelic
25
24
  end
26
25
 
27
26
  def get_agent_commands
28
- []
27
+ NewRelic::EMPTY_ARRAY
29
28
  end
30
29
 
31
30
  def analytic_event_data(events)
@@ -61,7 +60,11 @@ module NewRelic
61
60
  write_to_pipe(:sql_trace_data, sql) if sql
62
61
  end
63
62
 
64
- def shutdown(time)
63
+ def log_event_data(logs)
64
+ write_to_pipe(:log_event_data, logs) if logs
65
+ end
66
+
67
+ def shutdown
65
68
  @pipe.close if @pipe
66
69
  end
67
70
 
@@ -1,11 +1,11 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  module NewRelic
6
6
  module Agent
7
7
  module PrependSupportability
8
- def self.record_metrics_for *classes
8
+ def self.record_metrics_for(*classes)
9
9
  classes.each do |klass|
10
10
  count = klass.send(:ancestors).index(klass)
11
11
  ::NewRelic::Agent.record_metric("Supportability/PrependedModules/#{klass}", count) if count > 0
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  require 'new_relic/agent/heap'
6
6
  require 'new_relic/agent/event_buffer'
@@ -15,29 +15,32 @@ module NewRelic
15
15
  def initialize(capacity)
16
16
  super
17
17
  @captured_lifetime = 0
18
- @seen_lifetime = 0
18
+ @seen_lifetime = 0
19
+ end
20
+
21
+ def heapify_items_array
22
+ if @items.is_a?(Array)
23
+ @items = Heap.new(@items) { |x| priority_for(x) }
24
+ end
19
25
  end
20
26
 
21
27
  # expects priority and a block, or an event as a hash with a `priority` key.
22
28
  def append(priority: nil, event: nil, &blk)
23
29
  increment_seen
24
30
 
25
- if @seen == @capacity
26
- @items = Heap.new(@items) { |x| priority_for(x) }
27
- end
31
+ return if @capacity == 0
28
32
 
29
33
  if full?
30
34
  priority ||= priority_for(event)
31
35
  if priority_for(@items[0]) < priority
32
- incoming = event || blk.call
36
+ heapify_items_array
37
+ incoming = event || yield
33
38
  @items[0] = incoming
34
39
  @items.fix(0)
35
40
  incoming
36
- else
37
- nil
38
41
  end
39
42
  else
40
- @items << (event || blk.call)
43
+ @items << (event || yield)
41
44
  @captured_lifetime += 1
42
45
  @items[-1]
43
46
  end
@@ -48,17 +51,17 @@ module NewRelic
48
51
  def capacity=(new_capacity)
49
52
  @capacity = new_capacity
50
53
  old_items = @items.to_a
51
- old_seen = @seen
54
+ old_seen = @seen
52
55
  reset!
53
56
  old_items.each { |i| append(event: i) }
54
- @seen = old_seen
57
+ @seen = old_seen
55
58
  end
56
59
 
57
60
  def to_a
58
61
  @items.to_a.dup
59
62
  end
60
63
 
61
- def decrement_lifetime_counts_by n
64
+ def decrement_lifetime_counts_by(n)
62
65
  @captured_lifetime -= n
63
66
  @seen_lifetime -= n
64
67
  end
@@ -87,4 +90,3 @@ module NewRelic
87
90
  end
88
91
  end
89
92
  end
90
-
@@ -1,45 +1,25 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  module NewRelic
6
6
  module Agent
7
7
  module RangeExtensions
8
8
  module_function
9
9
 
10
- def intersects? r1, r2
11
- r1.include?(r2.begin) || r2.include?(r1.begin)
12
- end
13
-
14
- def merge r1, r2
15
- return unless intersects? r1, r2
16
- range_min = r1.begin < r2.begin ? r1.begin : r2.begin
17
- range_max = r1.end > r2.end ? r1.end : r2.end
18
- range_min..range_max
19
- end
20
-
21
- # Takes an array of ranges and a range which it will
22
- # merge into an existing range if they intersect, otherwise
23
- # it will append this range to the end the array.
24
- def merge_or_append range, ranges
25
- ranges.each_with_index do |r, i|
26
- if merged = merge(r, range)
27
- ranges[i] = merged
28
- return ranges
29
- end
30
- end
31
- ranges.push range
10
+ def intersects?(r1, r2)
11
+ r1.begin > r2.begin ? r2.cover?(r1.begin) : r1.cover?(r2.begin)
32
12
  end
33
13
 
34
14
  # Computes the amount of overlap between range and an array of ranges.
35
15
  # For efficiency, it assumes that range intersects with each of the
36
16
  # ranges in the ranges array.
37
- def compute_overlap range, ranges
17
+ def compute_overlap(range, ranges)
38
18
  ranges.inject(0) do |memo, other|
39
- next memo unless intersects? range, other
40
- lower_bound = range.begin > other.begin ? range.begin : other.begin
41
- upper_bound = range.end < other.end ? range.end : other.end
42
- memo += upper_bound - lower_bound
19
+ next memo unless intersects?(range, other)
20
+
21
+ memo += ([range.end, other.end].min) -
22
+ ([range.begin, other.begin].max)
43
23
  end
44
24
  end
45
25
  end
@@ -1,13 +1,13 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  module NewRelic
6
6
  module Agent
7
7
  class RulesEngine
8
8
  class ReplacementRule
9
9
  attr_reader(:terminate_chain, :each_segment, :ignore, :replace_all, :eval_order,
10
- :match_expression, :replacement)
10
+ :match_expression, :replacement)
11
11
 
12
12
  def initialize(options)
13
13
  if !options['match_expression']
@@ -18,12 +18,12 @@ module NewRelic
18
18
  end
19
19
 
20
20
  @match_expression = Regexp.new(options['match_expression'], Regexp::IGNORECASE)
21
- @replacement = options['replacement']
22
- @ignore = options['ignore'] || false
23
- @eval_order = options['eval_order'] || 0
24
- @replace_all = options['replace_all'] || false
25
- @each_segment = options['each_segment'] || false
26
- @terminate_chain = options['terminate_chain'] || false
21
+ @replacement = options['replacement']
22
+ @ignore = options['ignore'] || false
23
+ @eval_order = options['eval_order'] || 0
24
+ @replace_all = options['replace_all'] || false
25
+ @each_segment = options['each_segment'] || false
26
+ @terminate_chain = options['terminate_chain'] || false
27
27
  end
28
28
 
29
29
  def terminal?
@@ -36,7 +36,7 @@ module NewRelic
36
36
  segment.match(@match_expression)
37
37
  end
38
38
  else
39
- string.match @match_expression
39
+ string.match(@match_expression)
40
40
  end
41
41
  end
42
42
 
@@ -56,9 +56,9 @@ module NewRelic
56
56
  end
57
57
 
58
58
  def apply_to_each_segment(string)
59
- string = string.dup
59
+ string = string.dup
60
60
  leading_slash = string.slice!(LEADING_SLASH_REGEX)
61
- segments = string.split(SEGMENT_SEPARATOR)
61
+ segments = string.split(SEGMENT_SEPARATOR)
62
62
 
63
63
  segments.map! do |segment|
64
64
  apply_replacement(segment)
@@ -1,24 +1,23 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  module NewRelic
6
6
  module Agent
7
7
  class RulesEngine
8
8
  class SegmentTermsRule
9
- PREFIX_KEY = 'prefix'.freeze
10
- TERMS_KEY = 'terms'.freeze
11
- SEGMENT_PLACEHOLDER = '*'.freeze
12
- ADJACENT_PLACEHOLDERS_REGEX = %r{((?:^|/)\*)(?:/\*)*}.freeze
9
+ PREFIX_KEY = 'prefix'.freeze
10
+ TERMS_KEY = 'terms'.freeze
11
+ SEGMENT_PLACEHOLDER = '*'.freeze
12
+ ADJACENT_PLACEHOLDERS_REGEX = %r{((?:^|/)\*)(?:/\*)*}.freeze
13
13
  ADJACENT_PLACEHOLDERS_REPLACEMENT = '\1'.freeze
14
- VALID_PREFIX_SEGMENT_COUNT = 2
15
14
 
16
15
  attr_reader :prefix, :terms
17
16
 
18
17
  def self.valid?(rule_spec)
19
18
  rule_spec[PREFIX_KEY].kind_of?(String) &&
20
- rule_spec[TERMS_KEY].kind_of?(Array) &&
21
- valid_prefix_segment_count?(rule_spec[PREFIX_KEY])
19
+ rule_spec[TERMS_KEY].kind_of?(Array) &&
20
+ valid_prefix_segment_count?(rule_spec[PREFIX_KEY])
22
21
  end
23
22
 
24
23
  def self.valid_prefix_segment_count?(prefix)
@@ -26,13 +25,13 @@ module NewRelic
26
25
  rindex = prefix.rindex(SEGMENT_SEPARATOR)
27
26
 
28
27
  (count == 2 && prefix[rindex + 1].nil?) ||
29
- (count == 1 && !prefix[rindex + 1].nil?)
28
+ (count == 1 && !prefix[rindex + 1].nil?)
30
29
  end
31
30
 
32
31
  def initialize(options)
33
- @prefix = options[PREFIX_KEY]
34
- @terms = options[TERMS_KEY]
35
- @trim_range = (@prefix.size..-1)
32
+ @prefix = options[PREFIX_KEY]
33
+ @terms = options[TERMS_KEY]
34
+ @trim_range = (@prefix.size..-1)
36
35
  end
37
36
 
38
37
  def terminal?
@@ -50,7 +49,7 @@ module NewRelic
50
49
  end
51
50
 
52
51
  def apply(string)
53
- rest = string[@trim_range]
52
+ rest = string[@trim_range]
54
53
  leading_slash = rest.slice!(LEADING_SLASH_REGEX)
55
54
  segments = rest.split(SEGMENT_SEPARATOR, -1)
56
55
  segments.map! { |s| @terms.include?(s) ? s : SEGMENT_PLACEHOLDER }