newrelic_rpm 8.2.0 → 9.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (439) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -2
  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 +1 -0
  8. data/Brewfile +12 -0
  9. data/CHANGELOG.md +3654 -2951
  10. data/CONTRIBUTING.md +21 -6
  11. data/DOCKER.md +167 -0
  12. data/Dockerfile +10 -0
  13. data/Gemfile +0 -1
  14. data/Guardfile +9 -8
  15. data/LICENSE +0 -6
  16. data/README.md +20 -20
  17. data/Rakefile +27 -29
  18. data/THIRD_PARTY_NOTICES.md +14 -199
  19. data/Thorfile +5 -0
  20. data/bin/newrelic +3 -2
  21. data/bin/newrelic_cmd +1 -0
  22. data/bin/nrdebug +76 -53
  23. data/config.dot +5 -5
  24. data/docker-compose.yml +107 -0
  25. data/init.rb +4 -6
  26. data/install.rb +2 -2
  27. data/lefthook.yml +9 -0
  28. data/lib/new_relic/agent/adaptive_sampler.rb +11 -7
  29. data/lib/new_relic/agent/agent.rb +94 -924
  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 +23 -19
  38. data/lib/new_relic/agent/attribute_filter.rb +64 -47
  39. data/lib/new_relic/agent/attribute_processing.rb +7 -7
  40. data/lib/new_relic/agent/attributes.rb +5 -4
  41. data/lib/new_relic/agent/audit_logger.rb +8 -3
  42. data/lib/new_relic/agent/autostart.rb +20 -18
  43. data/lib/new_relic/agent/chained_call.rb +1 -1
  44. data/lib/new_relic/agent/commands/agent_command.rb +3 -3
  45. data/lib/new_relic/agent/commands/agent_command_router.rb +12 -11
  46. data/lib/new_relic/agent/commands/thread_profiler_session.rb +5 -7
  47. data/lib/new_relic/agent/configuration/default_source.rb +1353 -1355
  48. data/lib/new_relic/agent/configuration/dotted_hash.rb +6 -5
  49. data/lib/new_relic/agent/configuration/environment_source.rb +11 -9
  50. data/lib/new_relic/agent/configuration/event_harvest_config.rb +13 -6
  51. data/lib/new_relic/agent/configuration/high_security_source.rb +8 -9
  52. data/lib/new_relic/agent/configuration/manager.rb +82 -68
  53. data/lib/new_relic/agent/configuration/manual_source.rb +1 -1
  54. data/lib/new_relic/agent/configuration/mask_defaults.rb +3 -3
  55. data/lib/new_relic/agent/configuration/security_policy_source.rb +82 -85
  56. data/lib/new_relic/agent/configuration/server_source.rb +19 -18
  57. data/lib/new_relic/agent/configuration/yaml_source.rb +16 -13
  58. data/lib/new_relic/agent/configuration.rb +1 -1
  59. data/lib/new_relic/agent/connect/request_builder.rb +17 -19
  60. data/lib/new_relic/agent/connect/response_handler.rb +5 -8
  61. data/lib/new_relic/agent/custom_event_aggregator.rb +14 -15
  62. data/lib/new_relic/agent/database/explain_plan_helpers.rb +4 -5
  63. data/lib/new_relic/agent/database/obfuscation_helpers.rb +14 -13
  64. data/lib/new_relic/agent/database/obfuscator.rb +2 -2
  65. data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +3 -3
  66. data/lib/new_relic/agent/database.rb +37 -48
  67. data/lib/new_relic/agent/database_adapter.rb +3 -1
  68. data/lib/new_relic/agent/datastores/metric_helper.rb +17 -18
  69. data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +7 -6
  70. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +6 -10
  71. data/lib/new_relic/agent/datastores/mongo.rb +1 -1
  72. data/lib/new_relic/agent/datastores/nosql_obfuscator.rb +41 -0
  73. data/lib/new_relic/agent/datastores/redis.rb +5 -7
  74. data/lib/new_relic/agent/datastores.rb +7 -9
  75. data/lib/new_relic/agent/deprecator.rb +1 -1
  76. data/lib/new_relic/agent/distributed_tracing/cross_app_payload.rb +6 -6
  77. data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +31 -29
  78. data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +22 -21
  79. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +19 -19
  80. data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +49 -51
  81. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +5 -6
  82. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +76 -77
  83. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +37 -36
  84. data/lib/new_relic/agent/distributed_tracing.rb +33 -35
  85. data/lib/new_relic/agent/encoding_normalizer.rb +4 -2
  86. data/lib/new_relic/agent/error_collector.rb +27 -23
  87. data/lib/new_relic/agent/error_event_aggregator.rb +4 -5
  88. data/lib/new_relic/agent/error_filter.rb +15 -16
  89. data/lib/new_relic/agent/error_trace_aggregator.rb +4 -3
  90. data/lib/new_relic/agent/event_aggregator.rb +22 -21
  91. data/lib/new_relic/agent/event_buffer.rb +7 -8
  92. data/lib/new_relic/agent/event_listener.rb +1 -2
  93. data/lib/new_relic/agent/event_loop.rb +22 -20
  94. data/lib/new_relic/agent/external.rb +11 -12
  95. data/lib/new_relic/agent/guid_generator.rb +13 -11
  96. data/lib/new_relic/agent/harvester.rb +4 -5
  97. data/lib/new_relic/agent/heap.rb +7 -9
  98. data/lib/new_relic/agent/hostname.rb +20 -13
  99. data/lib/new_relic/agent/http_clients/abstract.rb +8 -9
  100. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +6 -11
  101. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +8 -9
  102. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +4 -5
  103. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +2 -4
  104. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +2 -4
  105. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +4 -5
  106. data/lib/new_relic/agent/http_clients/uri_util.rb +1 -3
  107. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +9 -22
  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 +37 -30
  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 +18 -19
  117. data/lib/new_relic/agent/instrumentation/active_job.rb +33 -13
  118. data/lib/new_relic/agent/instrumentation/active_job_subscriber.rb +41 -0
  119. data/lib/new_relic/agent/instrumentation/active_merchant.rb +19 -5
  120. data/lib/new_relic/agent/instrumentation/active_record.rb +37 -35
  121. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +71 -61
  122. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +49 -46
  123. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +4 -4
  124. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +26 -17
  125. data/lib/new_relic/agent/instrumentation/active_storage.rb +7 -3
  126. data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +8 -33
  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 +11 -11
  134. data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +20 -22
  135. data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +4 -4
  136. data/lib/new_relic/agent/instrumentation/bunny.rb +4 -5
  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 +67 -58
  142. data/lib/new_relic/agent/instrumentation/curb/chain.rb +41 -43
  143. data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +52 -53
  144. data/lib/new_relic/agent/instrumentation/curb/prepend.rb +12 -14
  145. data/lib/new_relic/agent/instrumentation/curb.rb +7 -7
  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 +6 -9
  149. data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +4 -9
  150. data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +1 -2
  151. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +28 -10
  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 +6 -6
  157. data/lib/new_relic/agent/instrumentation/excon.rb +24 -8
  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 +7 -8
  163. data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +12 -12
  164. data/lib/new_relic/agent/instrumentation/grape/prepend.rb +4 -4
  165. data/lib/new_relic/agent/instrumentation/grape.rb +12 -13
  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 +3 -4
  178. data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +7 -8
  179. data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +1 -3
  180. data/lib/new_relic/agent/instrumentation/httpclient.rb +3 -3
  181. data/lib/new_relic/agent/instrumentation/httprb/chain.rb +3 -3
  182. data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +11 -11
  183. data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +2 -2
  184. data/lib/new_relic/agent/instrumentation/httprb.rb +4 -4
  185. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +4 -5
  186. data/lib/new_relic/agent/instrumentation/logger/chain.rb +2 -2
  187. data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +27 -20
  188. data/lib/new_relic/agent/instrumentation/logger/prepend.rb +1 -1
  189. data/lib/new_relic/agent/instrumentation/logger.rb +7 -6
  190. data/lib/new_relic/agent/instrumentation/memcache/chain.rb +2 -3
  191. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +26 -18
  192. data/lib/new_relic/agent/instrumentation/memcache/helper.rb +8 -10
  193. data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +20 -18
  194. data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +22 -15
  195. data/lib/new_relic/agent/instrumentation/memcache.rb +22 -23
  196. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +11 -12
  197. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +5 -7
  198. data/lib/new_relic/agent/instrumentation/mongo.rb +3 -3
  199. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +21 -18
  200. data/lib/new_relic/agent/instrumentation/net_http/chain.rb +4 -5
  201. data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +10 -10
  202. data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +5 -5
  203. data/lib/new_relic/agent/instrumentation/net_http.rb +8 -8
  204. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +51 -9
  205. data/lib/new_relic/agent/instrumentation/padrino/chain.rb +1 -1
  206. data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +4 -3
  207. data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +2 -2
  208. data/lib/new_relic/agent/instrumentation/padrino.rb +4 -9
  209. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +6 -6
  210. data/lib/new_relic/agent/instrumentation/queue_time.rb +5 -6
  211. data/lib/new_relic/agent/instrumentation/rack/chain.rb +27 -19
  212. data/lib/new_relic/agent/instrumentation/rack/helpers.rb +3 -2
  213. data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +14 -12
  214. data/lib/new_relic/agent/instrumentation/rack/prepend.rb +13 -7
  215. data/lib/new_relic/agent/instrumentation/rack.rb +15 -15
  216. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +15 -15
  217. data/lib/new_relic/agent/instrumentation/rails_middleware.rb +4 -4
  218. data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +9 -8
  219. data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +17 -5
  220. data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +8 -5
  221. data/lib/new_relic/agent/instrumentation/rails_notifications/custom_events.rb +30 -0
  222. data/lib/new_relic/agent/instrumentation/rake/chain.rb +2 -7
  223. data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +14 -16
  224. data/lib/new_relic/agent/instrumentation/rake/prepend.rb +1 -1
  225. data/lib/new_relic/agent/instrumentation/rake.rb +9 -9
  226. data/lib/new_relic/agent/instrumentation/redis/chain.rb +25 -14
  227. data/lib/new_relic/agent/instrumentation/redis/constants.rb +17 -0
  228. data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +53 -25
  229. data/lib/new_relic/agent/instrumentation/redis/middleware.rb +16 -0
  230. data/lib/new_relic/agent/instrumentation/redis/prepend.rb +10 -5
  231. data/lib/new_relic/agent/instrumentation/redis.rb +13 -7
  232. data/lib/new_relic/agent/instrumentation/resque/chain.rb +4 -5
  233. data/lib/new_relic/agent/instrumentation/resque/helper.rb +2 -2
  234. data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +4 -5
  235. data/lib/new_relic/agent/instrumentation/resque/prepend.rb +2 -3
  236. data/lib/new_relic/agent/instrumentation/resque.rb +17 -17
  237. data/lib/new_relic/agent/instrumentation/sequel.rb +16 -19
  238. data/lib/new_relic/agent/instrumentation/sequel_helper.rb +2 -2
  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 +24 -70
  243. data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +1 -1
  244. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +2 -3
  245. data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +5 -4
  246. data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +1 -1
  247. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +2 -2
  248. data/lib/new_relic/agent/instrumentation/sinatra.rb +26 -17
  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 +1 -1
  254. data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +2 -2
  255. data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +1 -1
  256. data/lib/new_relic/agent/instrumentation/tilt.rb +4 -4
  257. data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +5 -5
  258. data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +13 -15
  259. data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +2 -2
  260. data/lib/new_relic/agent/instrumentation/typhoeus.rb +2 -2
  261. data/lib/new_relic/agent/instrumentation.rb +1 -1
  262. data/lib/new_relic/agent/internal_agent_error.rb +2 -2
  263. data/lib/new_relic/agent/javascript_instrumentor.rb +38 -37
  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 +1 -1
  268. data/lib/new_relic/agent/log_priority.rb +20 -0
  269. data/lib/new_relic/agent/logging.rb +21 -17
  270. data/lib/new_relic/agent/memory_logger.rb +2 -2
  271. data/lib/new_relic/agent/messaging.rb +61 -63
  272. data/lib/new_relic/agent/method_tracer.rb +28 -22
  273. data/lib/new_relic/agent/method_tracer_helpers.rb +88 -11
  274. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +16 -16
  275. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +5 -4
  276. data/lib/new_relic/agent/monitors/inbound_request_monitor.rb +1 -2
  277. data/lib/new_relic/agent/monitors/synthetics_monitor.rb +6 -9
  278. data/lib/new_relic/agent/monitors.rb +6 -7
  279. data/lib/new_relic/agent/new_relic_service/encoders.rb +6 -6
  280. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +5 -5
  281. data/lib/new_relic/agent/new_relic_service/marshaller.rb +2 -2
  282. data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +4 -4
  283. data/lib/new_relic/agent/new_relic_service.rb +242 -185
  284. data/lib/new_relic/agent/{noticible_error.rb → noticeable_error.rb} +2 -5
  285. data/lib/new_relic/agent/null_logger.rb +7 -3
  286. data/lib/new_relic/agent/obfuscator.rb +8 -10
  287. data/lib/new_relic/agent/parameter_filtering.rb +24 -10
  288. data/lib/new_relic/agent/payload_metric_mapping.rb +9 -10
  289. data/lib/new_relic/agent/pipe_channel_manager.rb +17 -11
  290. data/lib/new_relic/agent/pipe_service.rb +7 -4
  291. data/lib/new_relic/agent/prepend_supportability.rb +2 -2
  292. data/lib/new_relic/agent/priority_sampled_buffer.rb +8 -11
  293. data/lib/new_relic/agent/range_extensions.rb +8 -28
  294. data/lib/new_relic/agent/rules_engine/replacement_rule.rb +11 -11
  295. data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +12 -13
  296. data/lib/new_relic/agent/rules_engine.rb +5 -4
  297. data/lib/new_relic/agent/sampler.rb +3 -4
  298. data/lib/new_relic/agent/sampler_collection.rb +3 -4
  299. data/lib/new_relic/agent/samplers/cpu_sampler.rb +2 -1
  300. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +6 -6
  301. data/lib/new_relic/agent/samplers/memory_sampler.rb +24 -13
  302. data/lib/new_relic/agent/samplers/object_sampler.rb +1 -1
  303. data/lib/new_relic/agent/samplers/vm_sampler.rb +21 -19
  304. data/lib/new_relic/agent/span_event_aggregator.rb +10 -10
  305. data/lib/new_relic/agent/span_event_primitive.rb +62 -56
  306. data/lib/new_relic/agent/sql_sampler.rb +17 -17
  307. data/lib/new_relic/agent/stats.rb +78 -41
  308. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +9 -11
  309. data/lib/new_relic/agent/stats_engine/stats_hash.rb +12 -13
  310. data/lib/new_relic/agent/stats_engine.rb +7 -7
  311. data/lib/new_relic/agent/synthetics_event_aggregator.rb +7 -8
  312. data/lib/new_relic/agent/system_info.rb +85 -65
  313. data/lib/new_relic/agent/threading/agent_thread.rb +18 -14
  314. data/lib/new_relic/agent/threading/backtrace_node.rb +12 -13
  315. data/lib/new_relic/agent/threading/backtrace_service.rb +10 -9
  316. data/lib/new_relic/agent/threading/thread_profile.rb +22 -22
  317. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +1 -1
  318. data/lib/new_relic/agent/tracer.rb +82 -56
  319. data/lib/new_relic/agent/transaction/abstract_segment.rb +100 -37
  320. data/lib/new_relic/agent/transaction/datastore_segment.rb +19 -18
  321. data/lib/new_relic/agent/transaction/distributed_tracer.rb +62 -56
  322. data/lib/new_relic/agent/transaction/distributed_tracing.rb +43 -44
  323. data/lib/new_relic/agent/transaction/external_request_segment.rb +41 -34
  324. data/lib/new_relic/agent/transaction/message_broker_segment.rb +30 -29
  325. data/lib/new_relic/agent/transaction/request_attributes.rb +35 -35
  326. data/lib/new_relic/agent/transaction/segment.rb +17 -10
  327. data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +1 -3
  328. data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +1 -1
  329. data/lib/new_relic/agent/transaction/trace.rb +15 -11
  330. data/lib/new_relic/agent/transaction/trace_builder.rb +10 -10
  331. data/lib/new_relic/agent/transaction/trace_context.rb +35 -35
  332. data/lib/new_relic/agent/transaction/trace_node.rb +25 -24
  333. data/lib/new_relic/agent/transaction/tracing.rb +14 -11
  334. data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +5 -5
  335. data/lib/new_relic/agent/transaction.rb +169 -125
  336. data/lib/new_relic/agent/transaction_error_primitive.rb +27 -25
  337. data/lib/new_relic/agent/transaction_event_aggregator.rb +12 -12
  338. data/lib/new_relic/agent/transaction_event_primitive.rb +32 -33
  339. data/lib/new_relic/agent/transaction_event_recorder.rb +16 -15
  340. data/lib/new_relic/agent/transaction_metrics.rb +10 -9
  341. data/lib/new_relic/agent/transaction_sampler.rb +5 -6
  342. data/lib/new_relic/agent/transaction_time_aggregator.rb +21 -20
  343. data/lib/new_relic/agent/utilization/aws.rb +33 -3
  344. data/lib/new_relic/agent/utilization/azure.rb +3 -3
  345. data/lib/new_relic/agent/utilization/gcp.rb +7 -7
  346. data/lib/new_relic/agent/utilization/pcf.rb +5 -4
  347. data/lib/new_relic/agent/utilization/vendor.rb +43 -28
  348. data/lib/new_relic/agent/utilization_data.rb +7 -5
  349. data/lib/new_relic/agent/vm/jruby_vm.rb +1 -1
  350. data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +2 -2
  351. data/lib/new_relic/agent/vm/mri_vm.rb +40 -15
  352. data/lib/new_relic/agent/vm/snapshot.rb +4 -4
  353. data/lib/new_relic/agent/vm.rb +1 -1
  354. data/lib/new_relic/agent/worker_loop.rb +5 -7
  355. data/lib/new_relic/agent.rb +62 -81
  356. data/lib/new_relic/cli/command.rb +20 -22
  357. data/lib/new_relic/cli/commands/deployments.rb +91 -41
  358. data/lib/new_relic/cli/commands/install.rb +21 -24
  359. data/lib/new_relic/coerce.rb +15 -13
  360. data/lib/new_relic/collection_helper.rb +50 -48
  361. data/lib/new_relic/constants.rb +2 -1
  362. data/lib/new_relic/control/class_methods.rb +3 -3
  363. data/lib/new_relic/control/frameworks/external.rb +2 -2
  364. data/lib/new_relic/control/frameworks/rails.rb +13 -9
  365. data/lib/new_relic/control/frameworks/rails3.rb +3 -4
  366. data/lib/new_relic/control/frameworks/rails4.rb +1 -1
  367. data/lib/new_relic/control/frameworks/rails_notifications.rb +1 -1
  368. data/lib/new_relic/control/frameworks/ruby.rb +3 -3
  369. data/lib/new_relic/control/frameworks/sinatra.rb +7 -1
  370. data/lib/new_relic/control/frameworks.rb +1 -1
  371. data/lib/new_relic/control/instance_methods.rb +26 -45
  372. data/lib/new_relic/control/instrumentation.rb +39 -11
  373. data/lib/new_relic/control/private_instance_methods.rb +48 -0
  374. data/lib/new_relic/control/server_methods.rb +3 -4
  375. data/lib/new_relic/control.rb +1 -2
  376. data/lib/new_relic/delayed_job_injection.rb +1 -1
  377. data/lib/new_relic/dependency_detection.rb +29 -28
  378. data/lib/new_relic/environment_report.rb +40 -32
  379. data/lib/new_relic/helper.rb +48 -7
  380. data/lib/new_relic/language_support.rb +29 -5
  381. data/lib/new_relic/latest_changes.rb +7 -6
  382. data/lib/new_relic/local_environment.rb +22 -26
  383. data/lib/new_relic/metric_data.rb +31 -26
  384. data/lib/new_relic/metric_spec.rb +8 -6
  385. data/lib/new_relic/noticed_error.rb +17 -21
  386. data/lib/new_relic/rack/agent_hooks.rb +1 -1
  387. data/lib/new_relic/rack/agent_middleware.rb +5 -3
  388. data/lib/new_relic/rack/browser_monitoring.rb +133 -123
  389. data/lib/new_relic/rack.rb +1 -1
  390. data/lib/new_relic/recipes/capistrano3.rb +3 -61
  391. data/lib/new_relic/recipes/capistrano_legacy.rb +23 -26
  392. data/lib/new_relic/recipes/helpers/send_deployment.rb +70 -0
  393. data/lib/new_relic/recipes.rb +1 -1
  394. data/lib/new_relic/supportability_helper.rb +8 -9
  395. data/lib/new_relic/traced_thread.rb +39 -0
  396. data/lib/new_relic/version.rb +6 -17
  397. data/lib/newrelic_rpm.rb +14 -3
  398. data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +15 -18
  399. data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +8 -14
  400. data/lib/tasks/all.rb +2 -2
  401. data/lib/tasks/config.rake +21 -117
  402. data/lib/tasks/coverage_report.rake +28 -0
  403. data/lib/tasks/helpers/format.rb +123 -0
  404. data/lib/tasks/helpers/matches.rb +12 -0
  405. data/lib/tasks/helpers/prompt.rb +24 -0
  406. data/lib/tasks/helpers/removers.rb +33 -0
  407. data/lib/tasks/install.rake +4 -0
  408. data/lib/tasks/instrumentation_generator/README.md +63 -0
  409. data/lib/tasks/instrumentation_generator/TODO.md +33 -0
  410. data/lib/tasks/instrumentation_generator/instrumentation.thor +121 -0
  411. data/lib/tasks/instrumentation_generator/templates/Envfile.tt +9 -0
  412. data/lib/tasks/instrumentation_generator/templates/chain.tt +22 -0
  413. data/lib/tasks/instrumentation_generator/templates/chain_method.tt +8 -0
  414. data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +29 -0
  415. data/lib/tasks/instrumentation_generator/templates/instrumentation.tt +13 -0
  416. data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +3 -0
  417. data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +19 -0
  418. data/lib/tasks/instrumentation_generator/templates/prepend.tt +13 -0
  419. data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +3 -0
  420. data/lib/tasks/instrumentation_generator/templates/test.tt +15 -0
  421. data/lib/tasks/multiverse.rake +4 -0
  422. data/lib/tasks/multiverse.rb +5 -32
  423. data/lib/tasks/newrelic.rb +1 -1
  424. data/lib/tasks/tests.rake +10 -15
  425. data/newrelic.yml +544 -452
  426. data/newrelic_rpm.gemspec +35 -31
  427. data/recipes/newrelic.rb +2 -2
  428. data/test/agent_helper.rb +196 -180
  429. metadata +130 -102
  430. data/ROADMAP.md +0 -24
  431. data/bin/mongrel_rpm +0 -33
  432. data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +0 -44
  433. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -75
  434. data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -25
  435. data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -204
  436. data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +0 -26
  437. data/lib/new_relic/agent/instrumentation/sunspot.rb +0 -33
  438. /data/lib/tasks/{config.html.erb → helpers/config.html.erb} +0 -0
  439. /data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  # 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
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,32 +1,40 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  module NewRelic
6
6
  module Agent
7
7
  module ParameterFiltering
8
8
  extend self
9
9
 
10
- ACTION_DISPATCH_PARAMETER_FILTER = "action_dispatch.parameter_filter".freeze
10
+ ACTION_DISPATCH_PARAMETER_FILTER ||= "action_dispatch.parameter_filter".freeze
11
11
 
12
- RAILS_FILTER_CLASS = if defined?(ActiveSupport::ParameterFilter)
13
- ActiveSupport::ParameterFilter
14
- elsif defined?(ActionDispatch::Http::ParameterFilter)
15
- ActionDispatch::Http::ParameterFilter
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
16
20
  else
17
- nil
21
+ RAILS_FILTER_CLASS ||= if defined?(ActiveSupport::ParameterFilter)
22
+ ActiveSupport::ParameterFilter
23
+ elsif defined?(ActionDispatch::Http::ParameterFilter)
24
+ ActionDispatch::Http::ParameterFilter
25
+ end
18
26
  end
19
27
 
20
28
  def apply_filters(env, params)
21
29
  if filters = env[ACTION_DISPATCH_PARAMETER_FILTER]
22
- params = filter_using_rails(params, filters)
30
+ params = filter_using_rails(params, filters)
23
31
  end
24
32
  params = filter_rack_file_data(env, params)
25
33
  params
26
34
  end
27
35
 
28
36
  def filter_using_rails(params, filters)
29
- return params if RAILS_FILTER_CLASS.nil?
37
+ return params unless rails_filter_class?
30
38
 
31
39
  pre_filtered_params = filter_rails_request_parameters(params)
32
40
  RAILS_FILTER_CLASS.new(filters).filter(pre_filtered_params)
@@ -36,7 +44,7 @@ module NewRelic
36
44
  content_type = env["CONTENT_TYPE"]
37
45
  multipart = content_type && content_type.start_with?("multipart")
38
46
 
39
- params.inject({}) do |memo, (k,v)|
47
+ params.inject({}) do |memo, (k, v)|
40
48
  if multipart && v.is_a?(Hash) && v[:tempfile]
41
49
  memo[k] = "[FILE]"
42
50
  else
@@ -52,6 +60,12 @@ module NewRelic
52
60
  result.delete("action")
53
61
  result
54
62
  end
63
+
64
+ private
65
+
66
+ def rails_filter_class?
67
+ defined?(RAILS_FILTER_CLASS) && !RAILS_FILTER_CLASS.nil?
68
+ end
55
69
  end
56
70
  end
57
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
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
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
@@ -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,7 +168,7 @@ 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
174
  if now
@@ -186,13 +186,18 @@ module NewRelic
186
186
  merge_data_from_pipe(pipe) unless pipe == wake.out
187
187
  end
188
188
 
189
- 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
190
195
  end
191
196
 
192
197
  break unless should_keep_listening?
193
198
  end
194
199
  end
195
- sleep 0.001 # give time for the thread to spawn
200
+ sleep(0.001) # give time for the thread to spawn
196
201
  end
197
202
 
198
203
  def stop_listener_thread
@@ -203,6 +208,7 @@ module NewRelic
203
208
 
204
209
  def stop
205
210
  return unless @started == true
211
+
206
212
  stop_listener_thread
207
213
  close_all_pipes
208
214
  @wake.close
@@ -249,13 +255,13 @@ module NewRelic
249
255
  def unmarshal(data)
250
256
  Marshal.load(data)
251
257
  rescue StandardError => e
252
- ::NewRelic::Agent.logger.error "Failure unmarshalling message from Resque child process", e
253
- ::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))
254
260
  nil
255
261
  end
256
262
 
257
263
  def should_keep_listening?
258
- @started || @pipes_lock.synchronize { @pipes.values.find{|pipe| !pipe.in.closed?} }
264
+ @started || @pipes_lock.synchronize { @pipes.values.find { |pipe| !pipe.in.closed? } }
259
265
  end
260
266
 
261
267
  def clean_up_pipes
@@ -265,13 +271,13 @@ module NewRelic
265
271
  pipe.close unless pipe.closed?
266
272
  end
267
273
  end
268
- @pipes.reject! {|id, pipe| pipe.out.closed? }
274
+ @pipes.reject! { |id, pipe| pipe.out.closed? }
269
275
  end
270
276
  end
271
277
 
272
278
  def find_pipe_for_handle(out_handle)
273
279
  @pipes_lock.synchronize do
274
- @pipes.values.find{|pipe| pipe.out == out_handle }
280
+ @pipes.values.find { |pipe| pipe.out == out_handle }
275
281
  end
276
282
  end
277
283
  end
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  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,6 +60,10 @@ module NewRelic
61
60
  write_to_pipe(:sql_trace_data, sql) if sql
62
61
  end
63
62
 
63
+ def log_event_data(logs)
64
+ write_to_pipe(:log_event_data, logs) if logs
65
+ end
66
+
64
67
  def shutdown
65
68
  @pipe.close if @pipe
66
69
  end
@@ -1,11 +1,11 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  module NewRelic
6
6
  module Agent
7
7
  module 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
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,12 +15,12 @@ module NewRelic
15
15
  def initialize(capacity)
16
16
  super
17
17
  @captured_lifetime = 0
18
- @seen_lifetime = 0
18
+ @seen_lifetime = 0
19
19
  end
20
20
 
21
21
  def heapify_items_array
22
22
  if @items.is_a?(Array)
23
- @items = Heap.new(@items) { |x| priority_for(x) }
23
+ @items = Heap.new(@items) { |x| priority_for(x) }
24
24
  end
25
25
  end
26
26
 
@@ -34,15 +34,13 @@ module NewRelic
34
34
  priority ||= priority_for(event)
35
35
  if priority_for(@items[0]) < priority
36
36
  heapify_items_array
37
- incoming = event || blk.call
37
+ incoming = event || yield
38
38
  @items[0] = incoming
39
39
  @items.fix(0)
40
40
  incoming
41
- else
42
- nil
43
41
  end
44
42
  else
45
- @items << (event || blk.call)
43
+ @items << (event || yield)
46
44
  @captured_lifetime += 1
47
45
  @items[-1]
48
46
  end
@@ -53,17 +51,17 @@ module NewRelic
53
51
  def capacity=(new_capacity)
54
52
  @capacity = new_capacity
55
53
  old_items = @items.to_a
56
- old_seen = @seen
54
+ old_seen = @seen
57
55
  reset!
58
56
  old_items.each { |i| append(event: i) }
59
- @seen = old_seen
57
+ @seen = old_seen
60
58
  end
61
59
 
62
60
  def to_a
63
61
  @items.to_a.dup
64
62
  end
65
63
 
66
- def decrement_lifetime_counts_by n
64
+ def decrement_lifetime_counts_by(n)
67
65
  @captured_lifetime -= n
68
66
  @seen_lifetime -= n
69
67
  end
@@ -92,4 +90,3 @@ module NewRelic
92
90
  end
93
91
  end
94
92
  end
95
-
@@ -1,45 +1,25 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  module NewRelic
6
6
  module Agent
7
7
  module 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
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
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 }
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  require 'new_relic/agent/rules_engine/replacement_rule'
6
6
  require 'new_relic/agent/rules_engine/segment_terms_rule'
@@ -24,7 +24,7 @@ module NewRelic
24
24
  end
25
25
 
26
26
  def self.create_transaction_rules(connect_response)
27
- txn_name_specs = connect_response['transaction_name_rules'] || []
27
+ txn_name_specs = connect_response['transaction_name_rules'] || []
28
28
  segment_rule_specs = connect_response['transaction_segment_terms'] || []
29
29
 
30
30
  txn_name_rules = txn_name_specs.map { |s| ReplacementRule.new(s) }
@@ -36,7 +36,7 @@ module NewRelic
36
36
  # Build segment_rules in reverse order from which they're provided,
37
37
  # so that when we eliminate duplicates with #uniq!, we retain the last
38
38
  # instances of repeated rules.
39
- segment_rules.unshift SegmentTermsRule.new(spec)
39
+ segment_rules.unshift(SegmentTermsRule.new(spec))
40
40
  end
41
41
  end
42
42
 
@@ -54,7 +54,7 @@ module NewRelic
54
54
  rules.uniq! { |rule| rule.prefix }
55
55
  end
56
56
 
57
- def initialize(rules=[], segment_term_rules=[])
57
+ def initialize(rules = [], segment_term_rules = [])
58
58
  @rules = rules.sort
59
59
  @segment_term_rules = segment_term_rules
60
60
  end
@@ -72,6 +72,7 @@ module NewRelic
72
72
  def rename(original_string)
73
73
  renamed = apply_rules(@rules, original_string)
74
74
  return nil unless renamed
75
+
75
76
  renamed = apply_rules(@segment_term_rules, renamed)
76
77
  renamed
77
78
  end
@@ -1,6 +1,6 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
  #
5
5
  # A Sampler is used to capture meaningful metrics in a background thread
6
6
  # periodically. They will be invoked about once a minute, each time the agent
@@ -12,9 +12,8 @@
12
12
  module NewRelic
13
13
  module Agent
14
14
  class Sampler
15
-
16
15
  # Exception denotes a sampler is not available and it will not be registered.
17
- class Unsupported < StandardError; end
16
+ class Unsupported < StandardError; end
18
17
 
19
18
  attr_reader :id
20
19
  @sampler_classes = []
@@ -52,7 +51,7 @@ module NewRelic
52
51
  # The ID passed in here is unused by our code, but is preserved in case
53
52
  # we have clients who are defining their own subclasses of this class, and
54
53
  # expecting to be able to call super with an ID.
55
- def initialize(id=nil)
54
+ def initialize(id = nil)
56
55
  @id = id || self.class.shorthand_name
57
56
  end
58
57