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
@@ -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 Hash-like class for storing metric data.
6
6
  #
@@ -30,13 +30,12 @@ require 'new_relic/agent/internal_agent_error'
30
30
  module NewRelic
31
31
  module Agent
32
32
  class StatsHash
33
-
34
33
  attr_accessor :started_at, :harvested_at
35
34
 
36
- def initialize(started_at=Time.now)
35
+ def initialize(started_at = Process.clock_gettime(Process::CLOCK_REALTIME))
37
36
  @started_at = started_at.to_f
38
- @scoped = Hash.new { |h, k| h[k] = NewRelic::Agent::Stats.new }
39
- @unscoped = Hash.new { |h, k| h[k] = NewRelic::Agent::Stats.new }
37
+ @scoped = Hash.new { |h, k| h[k] = NewRelic::Agent::Stats.new }
38
+ @unscoped = Hash.new { |h, k| h[k] = NewRelic::Agent::Stats.new }
40
39
  end
41
40
 
42
41
  def marshal_dump
@@ -45,7 +44,7 @@ module NewRelic
45
44
 
46
45
  def marshal_load(data)
47
46
  @started_at = data.shift
48
- @scoped = Hash.new { |h, k| h[k] = NewRelic::Agent::Stats.new }
47
+ @scoped = Hash.new { |h, k| h[k] = NewRelic::Agent::Stats.new }
49
48
  @unscoped = Hash.new { |h, k| h[k] = NewRelic::Agent::Stats.new }
50
49
  @scoped.merge!(data.shift)
51
50
  @unscoped.merge!(data.shift)
@@ -57,7 +56,7 @@ module NewRelic
57
56
 
58
57
  def to_h
59
58
  hash = {}
60
- @scoped.each { |k, v| hash[k] = v }
59
+ @scoped.each { |k, v| hash[k] = v }
61
60
  @unscoped.each { |k, v| hash[NewRelic::MetricSpec.new(k)] = v }
62
61
  hash
63
62
  end
@@ -77,11 +76,11 @@ module NewRelic
77
76
 
78
77
  def each
79
78
  @scoped.each do |k, v|
80
- yield k, v
79
+ yield(k, v)
81
80
  end
82
81
  @unscoped.each do |k, v|
83
82
  spec = NewRelic::MetricSpec.new(k)
84
- yield spec, v
83
+ yield(spec, v)
85
84
  end
86
85
  end
87
86
 
@@ -99,7 +98,7 @@ module NewRelic
99
98
  end
100
99
  end
101
100
 
102
- def record(metric_specs, value=nil, aux=nil, &blk)
101
+ def record(metric_specs, value = nil, aux = nil, &blk)
103
102
  Array(metric_specs).each do |metric_spec|
104
103
  if metric_spec.scope.empty?
105
104
  key = metric_spec.name
@@ -122,13 +121,13 @@ module NewRelic
122
121
  def handle_stats_lookup_error(key, hash, error)
123
122
  # This only happen in the case of a corrupted default_proc
124
123
  # Side-step it manually, notice the issue, and carry on....
125
- NewRelic::Agent.instance.error_collector. \
126
- notice_agent_error(StatsHashLookupError.new(error, hash, key))
124
+ NewRelic::Agent.instance.error_collector \
125
+ .notice_agent_error(StatsHashLookupError.new(error, hash, key))
127
126
  stats = NewRelic::Agent::Stats.new
128
127
  hash[key] = stats
129
128
  # Try to restore the default_proc so we won't continually trip the error
130
129
  if hash.respond_to?(:default_proc=)
131
- hash.default_proc = Proc.new { |h, k| h[k] = NewRelic::Agent::Stats.new }
130
+ hash.default_proc = proc { |h, k| h[k] = NewRelic::Agent::Stats.new }
132
131
  end
133
132
  stats
134
133
  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
  require 'new_relic/agent/stats_engine/gc_profiler'
6
6
  require 'new_relic/agent/stats_engine/stats_hash'
@@ -13,8 +13,8 @@ module NewRelic
13
13
  attr_accessor :metric_rules
14
14
 
15
15
  def initialize
16
- @stats_lock = Mutex.new
17
- @stats_hash = StatsHash.new
16
+ @stats_lock = Mutex.new
17
+ @stats_hash = StatsHash.new
18
18
  @metric_rules = RulesEngine.new
19
19
  end
20
20
 
@@ -60,12 +60,12 @@ module NewRelic
60
60
  #
61
61
  # @api private
62
62
  #
63
- def tl_record_unscoped_metrics(metric_names, value=nil, aux=nil, &blk)
64
- state = NewRelic::Agent::TransactionState.tl_get
63
+ def tl_record_unscoped_metrics(metric_names, value = nil, aux = nil, &blk)
64
+ state = NewRelic::Agent::Tracer.state
65
65
  record_unscoped_metrics(state, metric_names, value, aux, &blk)
66
66
  end
67
67
 
68
- def record_unscoped_metrics(state, metric_names, value=nil, aux=nil, &blk)
68
+ def record_unscoped_metrics(state, metric_names, value = nil, aux = nil, &blk)
69
69
  txn = state.current_transaction
70
70
  if txn
71
71
  txn.metrics.record_unscoped(metric_names, value, aux, &blk)
@@ -96,12 +96,12 @@ module NewRelic
96
96
  #
97
97
  # @api private
98
98
  #
99
- def tl_record_scoped_and_unscoped_metrics(scoped_metric, summary_metrics=nil, value=nil, aux=nil, &blk)
100
- state = NewRelic::Agent::TransactionState.tl_get
99
+ def tl_record_scoped_and_unscoped_metrics(scoped_metric, summary_metrics = nil, value = nil, aux = nil, &blk)
100
+ state = NewRelic::Agent::Tracer.state
101
101
  record_scoped_and_unscoped_metrics(state, scoped_metric, summary_metrics, value, aux, &blk)
102
102
  end
103
103
 
104
- def record_scoped_and_unscoped_metrics(state, scoped_metric, summary_metrics=nil, value=nil, aux=nil, &blk)
104
+ def record_scoped_and_unscoped_metrics(state, scoped_metric, summary_metrics = nil, value = nil, aux = nil, &blk)
105
105
  txn = state.current_transaction
106
106
  if txn
107
107
  txn.metrics.record_scoped_and_unscoped(scoped_metric, value, aux, &blk)
@@ -150,7 +150,7 @@ module NewRelic
150
150
  end
151
151
 
152
152
  def harvest!
153
- now = Time.now
153
+ now = Process.clock_gettime(Process::CLOCK_REALTIME)
154
154
  snapshot = reset!
155
155
  snapshot = apply_rules_to_metric_data(@metric_rules, snapshot)
156
156
  snapshot.harvested_at = now
@@ -1,7 +1,7 @@
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
  require 'new_relic/agent/event_aggregator'
7
7
  require 'new_relic/agent/timestamp_sampled_buffer'
@@ -13,24 +13,24 @@ module NewRelic
13
13
 
14
14
  named :SyntheticsEventAggregator
15
15
  capacity_key :'synthetics.events_limit'
16
- enabled_key :'analytics_events.enabled'
16
+ enabled_key :'transaction_events.enabled'
17
17
  buffer_class TimestampSampledBuffer
18
18
 
19
- def record event
19
+ def record(event)
20
20
  return unless enabled?
21
21
 
22
22
  @lock.synchronize do
23
- @buffer.append event: event, priority: -event[0][TIMESTAMP]
23
+ @buffer.append(event: event, priority: -event[0][TIMESTAMP])
24
24
  end
25
25
  end
26
26
 
27
27
  private
28
28
 
29
- def after_harvest metadata
30
- record_dropped_synthetics metadata
29
+ def after_harvest(metadata)
30
+ record_dropped_synthetics(metadata)
31
31
  end
32
32
 
33
- def record_dropped_synthetics metadata
33
+ def record_dropped_synthetics(metadata)
34
34
  num_dropped = metadata[:seen] - metadata[:captured]
35
35
  return unless num_dropped > 0
36
36
 
@@ -42,4 +42,3 @@ module NewRelic
42
42
  end
43
43
  end
44
44
  end
45
-
@@ -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
  # This module is intended to provide access to information about the host OS and
6
6
  # [virtual] machine. It intentionally does no caching and maintains no state -
@@ -8,6 +8,7 @@
8
8
  # the requested information is unavailable.
9
9
 
10
10
  require 'rbconfig'
11
+ require 'socket'
11
12
 
12
13
  module NewRelic
13
14
  module Agent
@@ -30,58 +31,77 @@ module NewRelic
30
31
 
31
32
  @processor_info = nil
32
33
 
34
+ def self.ip_addresses
35
+ Socket.ip_address_list.map(&:ip_address)
36
+ end
37
+
33
38
  def self.clear_processor_info
34
39
  @processor_info = nil
35
40
  end
36
41
 
37
- def self.get_processor_info
38
- if @processor_info.nil?
39
- if darwin?
40
- @processor_info = {
41
- :num_physical_packages => sysctl_value('hw.packages').to_i,
42
- :num_physical_cores => sysctl_value('hw.physicalcpu_max').to_i,
43
- :num_logical_processors => sysctl_value('hw.logicalcpu_max').to_i
44
- }
45
- # in case those don't work, try backup values
46
- if @processor_info[:num_physical_cores] <= 0
47
- @processor_info[:num_physical_cores] = sysctl_value('hw.physicalcpu').to_i
48
- end
49
- if @processor_info[:num_logical_processors] <= 0
50
- @processor_info[:num_logical_processors] = sysctl_value('hw.logicalcpu').to_i
51
- end
52
- if @processor_info[:num_logical_processors] <= 0
53
- @processor_info[:num_logical_processors] = sysctl_value('hw.ncpu').to_i
54
- end
42
+ def self.processor_info
43
+ return @processor_info if @processor_info
55
44
 
56
- elsif linux?
57
- cpuinfo = proc_try_read('/proc/cpuinfo')
58
- @processor_info = cpuinfo ? parse_cpuinfo(cpuinfo) : {}
59
-
60
- elsif bsd?
61
- @processor_info = {
62
- :num_physical_packages => nil,
63
- :num_physical_cores => nil,
64
- :num_logical_processors => sysctl_value('hw.ncpu').to_i
65
- }
66
- end
67
-
68
- # give nils for obviously wrong values
69
- @processor_info.keys.each do |key|
70
- value = @processor_info[key]
71
- if value.is_a?(Numeric) && value <= 0
72
- @processor_info[key] = nil
73
- end
74
- end
45
+ if darwin?
46
+ processor_info_darwin
47
+ elsif linux?
48
+ processor_info_linux
49
+ elsif bsd?
50
+ processor_info_bsd
51
+ else
52
+ raise "Couldn't determine OS"
75
53
  end
54
+ remove_bad_values
76
55
 
77
56
  @processor_info
78
57
  rescue
79
- {}
58
+ @processor_info = NewRelic::EMPTY_HASH
59
+ end
60
+
61
+ def self.processor_info_darwin
62
+ @processor_info = {
63
+ num_physical_packages: sysctl_value('hw.packages'),
64
+ num_physical_cores: sysctl_value('hw.physicalcpu_max'),
65
+ num_logical_processors: sysctl_value('hw.logicalcpu_max')
66
+ }
67
+ # in case those don't work, try backup values
68
+ if @processor_info[:num_physical_cores] <= 0
69
+ @processor_info[:num_physical_cores] = sysctl_value('hw.physicalcpu')
70
+ end
71
+ if @processor_info[:num_logical_processors] <= 0
72
+ @processor_info[:num_logical_processors] = sysctl_value('hw.logicalcpu')
73
+ end
74
+ if @processor_info[:num_logical_processors] <= 0
75
+ @processor_info[:num_logical_processors] = sysctl_value('hw.ncpu')
76
+ end
77
+ end
78
+
79
+ def self.processor_info_linux
80
+ cpuinfo = proc_try_read('/proc/cpuinfo')
81
+ @processor_info = cpuinfo ? parse_cpuinfo(cpuinfo) : NewRelic::EMPTY_HASH
82
+ end
83
+
84
+ def self.processor_info_bsd
85
+ @processor_info = {
86
+ num_physical_packages: nil,
87
+ num_physical_cores: nil,
88
+ num_logical_processors: sysctl_value('hw.ncpu')
89
+ }
90
+ end
91
+
92
+ def self.remove_bad_values
93
+ # give nils for obviously wrong values
94
+ @processor_info.keys.each do |key|
95
+ value = @processor_info[key]
96
+ if value.is_a?(Numeric) && value <= 0
97
+ @processor_info[key] = nil
98
+ end
99
+ end
80
100
  end
81
101
 
82
102
  def self.sysctl_value(name)
83
103
  # make sure to redirect stderr so we don't spew if the name is unknown
84
- `sysctl -n #{name} 2>/dev/null`
104
+ `sysctl -n #{name} 2>/dev/null`.to_i
85
105
  end
86
106
 
87
107
  def self.parse_cpuinfo(cpuinfo)
@@ -106,9 +126,9 @@ module NewRelic
106
126
  end
107
127
  cores[[phys_id, core_id]] += 1 if phys_id && core_id
108
128
 
109
- num_physical_packages = cores.keys.map(&:first).uniq.size
110
- num_physical_cores = cores.size
111
- num_logical_processors = cores.values.reduce(0,:+)
129
+ num_physical_packages = cores.keys.map(&:first).uniq.size
130
+ num_physical_cores = cores.size
131
+ num_logical_processors = cores.values.reduce(0, :+)
112
132
 
113
133
  if num_physical_cores == 0
114
134
  num_logical_processors = total_processors
@@ -122,25 +142,27 @@ module NewRelic
122
142
  # Some older, single-core processors might not list ids,
123
143
  # so we'll just mark them all 1.
124
144
  num_physical_packages = 1
125
- num_physical_cores = 1
145
+ num_physical_cores = 1
126
146
  else
127
147
  # We have no way of knowing how many packages or cores
128
148
  # we have, even though we know how many processors there are.
129
149
  num_physical_packages = nil
130
- num_physical_cores = nil
150
+ num_physical_cores = nil
131
151
  end
132
152
  end
133
153
 
134
154
  {
135
- :num_physical_packages => num_physical_packages,
136
- :num_physical_cores => num_physical_cores,
155
+ :num_physical_packages => num_physical_packages,
156
+ :num_physical_cores => num_physical_cores,
137
157
  :num_logical_processors => num_logical_processors
138
158
  }
139
159
  end
140
160
 
141
- def self.num_physical_packages ; get_processor_info[:num_physical_packages ] end
142
- def self.num_physical_cores ; get_processor_info[:num_physical_cores ] end
143
- def self.num_logical_processors; get_processor_info[:num_logical_processors] end
161
+ def self.num_physical_packages; processor_info[:num_physical_packages] end
162
+
163
+ def self.num_physical_cores; processor_info[:num_physical_cores] end
164
+
165
+ def self.num_logical_processors; processor_info[:num_logical_processors] end
144
166
 
145
167
  def self.processor_arch
146
168
  RbConfig::CONFIG['target_cpu']
@@ -151,7 +173,7 @@ module NewRelic
151
173
  end
152
174
 
153
175
  def self.docker_container_id
154
- return unless ruby_os_identifier =~ /linux/
176
+ return unless ruby_os_identifier.include?('linux')
155
177
 
156
178
  cgroup_info = proc_try_read('/proc/self/cgroup')
157
179
  return unless cgroup_info
@@ -165,13 +187,22 @@ module NewRelic
165
187
 
166
188
  container_id = case cpu_cgroup
167
189
  # docker native driver w/out systemd (fs)
168
- when /[0-9a-f]{64}/ then $&
190
+ when /[0-9a-f]{64,}/
191
+ if $&.length == 64
192
+ $&
193
+ else # container ID is too long
194
+ ::NewRelic::Agent.logger.debug("Ignoring docker ID of invalid length: '#{cpu_cgroup}'")
195
+ return
196
+ end
169
197
  # docker native driver with systemd
170
- when '/' then nil
198
+ when '/' then nil
171
199
  # in a cgroup, but we don't recognize its format
172
- when /docker/ then
200
+ when /docker\/.*[^0-9a-f]/
201
+ ::NewRelic::Agent.logger.debug("Cgroup indicates docker but container_id has invalid characters: '#{cpu_cgroup}'")
202
+ return
203
+ when /docker/
173
204
  ::NewRelic::Agent.logger.debug("Cgroup indicates docker but container_id unrecognized: '#{cpu_cgroup}'")
174
- ::NewRelic::Agent.increment_metric "Supportability/utilization/docker/error"
205
+ ::NewRelic::Agent.increment_metric("Supportability/utilization/docker/error")
175
206
  return
176
207
  else
177
208
  ::NewRelic::Agent.logger.debug("Ignoring unrecognized cgroup ID format: '#{cpu_cgroup}'")
@@ -180,7 +211,7 @@ module NewRelic
180
211
 
181
212
  if container_id && container_id.size != 64
182
213
  ::NewRelic::Agent.logger.debug("Found docker container_id with invalid length: #{container_id}")
183
- ::NewRelic::Agent.increment_metric "Supportability/utilization/docker/error"
214
+ ::NewRelic::Agent.increment_metric("Supportability/utilization/docker/error")
184
215
  nil
185
216
  else
186
217
  container_id
@@ -193,6 +224,7 @@ module NewRelic
193
224
  cgroup_info.split("\n").each do |line|
194
225
  parts = line.split(':')
195
226
  next unless parts.size == 3
227
+
196
228
  _, subsystems, cgroup_id = parts
197
229
  subsystems = subsystems.split(',')
198
230
  subsystems.each do |subsystem|
@@ -209,7 +241,8 @@ module NewRelic
209
241
  # for details on why we do it this way.
210
242
  def self.proc_try_read(path)
211
243
  return nil unless File.exist?(path)
212
- content = ''
244
+
245
+ content = String.new('')
213
246
  File.open(path) do |f|
214
247
  loop do
215
248
  begin
@@ -227,12 +260,12 @@ module NewRelic
227
260
 
228
261
  def self.ram_in_mib
229
262
  if darwin?
230
- (sysctl_value('hw.memsize').to_i / (1024 ** 2)).to_i
263
+ (sysctl_value('hw.memsize') / (1024**2))
231
264
  elsif linux?
232
265
  meminfo = proc_try_read('/proc/meminfo')
233
266
  parse_linux_meminfo_in_mib(meminfo)
234
267
  elsif bsd?
235
- (sysctl_value('hw.realmem').to_i / (1024 ** 2)).to_i
268
+ (sysctl_value('hw.realmem') / (1024**2))
236
269
  else
237
270
  ::NewRelic::Agent.logger.debug("Unable to determine ram_in_mib for host os: #{ruby_os_identifier}")
238
271
  nil
@@ -240,7 +273,7 @@ module NewRelic
240
273
  end
241
274
 
242
275
  def self.parse_linux_meminfo_in_mib(meminfo)
243
- if meminfo && mem_total = meminfo[/MemTotal:\s*(\d*)\skB/,1]
276
+ if meminfo && mem_total = meminfo[/MemTotal:\s*(\d*)\skB/, 1]
244
277
  (mem_total.to_i / 1024).to_i
245
278
  else
246
279
  ::NewRelic::Agent.logger.debug("Failed to parse MemTotal from /proc/meminfo: #{meminfo}")
@@ -250,13 +283,14 @@ module NewRelic
250
283
 
251
284
  def self.boot_id
252
285
  return nil unless linux?
286
+
253
287
  if bid = proc_try_read('/proc/sys/kernel/random/boot_id')
254
288
  bid.chomp!
255
289
 
256
290
  if bid.ascii_only?
257
291
  if bid.empty?
258
292
  ::NewRelic::Agent.logger.debug("boot_id not found in /proc/sys/kernel/random/boot_id")
259
- ::NewRelic::Agent.increment_metric "Supportability/utilization/boot_id/error"
293
+ ::NewRelic::Agent.increment_metric("Supportability/utilization/boot_id/error")
260
294
  nil
261
295
 
262
296
  elsif bid.bytesize == 36
@@ -264,19 +298,19 @@ module NewRelic
264
298
 
265
299
  else
266
300
  ::NewRelic::Agent.logger.debug("Found boot_id with invalid length: #{bid}")
267
- ::NewRelic::Agent.increment_metric "Supportability/utilization/boot_id/error"
268
- bid[0,128]
301
+ ::NewRelic::Agent.increment_metric("Supportability/utilization/boot_id/error")
302
+ bid[0, 128]
269
303
 
270
304
  end
271
305
  else
272
306
  ::NewRelic::Agent.logger.debug("Found boot_id with non-ASCII characters: #{bid}")
273
- ::NewRelic::Agent.increment_metric "Supportability/utilization/boot_id/error"
307
+ ::NewRelic::Agent.increment_metric("Supportability/utilization/boot_id/error")
274
308
  nil
275
309
 
276
310
  end
277
311
  else
278
312
  ::NewRelic::Agent.logger.debug("boot_id not found in /proc/sys/kernel/random/boot_id")
279
- ::NewRelic::Agent.increment_metric "Supportability/utilization/boot_id/error"
313
+ ::NewRelic::Agent.increment_metric("Supportability/utilization/boot_id/error")
280
314
  nil
281
315
 
282
316
  end
@@ -1,28 +1,31 @@
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 Threading
8
8
  class AgentThread
9
-
10
9
  def self.create(label, &blk)
11
- ::NewRelic::Agent.logger.debug("Creating New Relic thread: #{label}")
12
- wrapped_blk = Proc.new do
10
+ ::NewRelic::Agent.logger.debug("Creating AgentThread: #{label}")
11
+ wrapped_blk = proc do
12
+ if ::Thread.current[:newrelic_tracer_state] && Thread.current[:newrelic_tracer_state].current_transaction
13
+ txn = ::Thread.current[:newrelic_tracer_state].current_transaction
14
+ ::NewRelic::Agent.logger.warn("AgentThread created with current transaction #{txn.best_name}")
15
+ end
13
16
  begin
14
- blk.call
17
+ yield
15
18
  rescue => e
16
- ::NewRelic::Agent.logger.error("Thread #{label} exited with error", e)
19
+ ::NewRelic::Agent.logger.error("AgentThread #{label} exited with error", e)
17
20
  rescue Exception => e
18
- ::NewRelic::Agent.logger.error("Thread #{label} exited with exception. Re-raising in case of interrupt.", e)
21
+ ::NewRelic::Agent.logger.error("AgentThread #{label} exited with exception. Re-raising in case of interrupt.", e)
19
22
  raise
20
23
  ensure
21
- ::NewRelic::Agent.logger.debug("Exiting New Relic thread: #{label}")
24
+ ::NewRelic::Agent.logger.debug("Exiting AgentThread: #{label}")
22
25
  end
23
26
  end
24
-
25
- thread = backing_thread_class.new(&wrapped_blk)
27
+ thread = nil
28
+ NewRelic::Agent.disable_all_tracing { thread = backing_thread_class.new(&wrapped_blk) }
26
29
  thread[:newrelic_label] = label
27
30
  thread
28
31
  end
@@ -33,16 +36,16 @@ module NewRelic
33
36
  backing_thread_class.list
34
37
  end
35
38
 
36
- def self.bucket_thread(thread, profile_agent_code) #THREAD_LOCAL_ACCESS
39
+ def self.bucket_thread(thread, profile_agent_code) # THREAD_LOCAL_ACCESS
37
40
  if thread.key?(:newrelic_label)
38
41
  profile_agent_code ? :agent : :ignore
39
42
  else
40
- state = TransactionState.tl_state_for(thread)
41
- txn = state.current_transaction
43
+ state = Tracer.state_for(thread)
44
+ txn = state.current_transaction
42
45
 
43
- if txn && !txn.recording_web_transaction?
46
+ if txn && !txn.recording_web_transaction?
44
47
  :background
45
- elsif txn && txn.recording_web_transaction?
48
+ elsif txn && txn.recording_web_transaction?
46
49
  :request
47
50
  else
48
51
  :other
@@ -57,6 +60,7 @@ module NewRelic
57
60
  ::NewRelic::Agent.logger.debug("Failed to backtrace #{thread.inspect}: #{e.class.name}: #{e.to_s}")
58
61
  end
59
62
  return nil unless bt
63
+
60
64
  bt.reject! { |t| t.include?('/newrelic_rpm-') } unless profile_agent_code
61
65
  bt
62
66
  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
@@ -13,12 +13,12 @@ module NewRelic
13
13
 
14
14
  def initialize
15
15
  @children = []
16
- @depth = 0
16
+ @depth = 0
17
17
  end
18
18
 
19
19
  def add_child_unless_present(child)
20
20
  child.depth = @depth + 1
21
- @children << child unless @children.include? child
21
+ @children << child unless @children.include?(child)
22
22
  end
23
23
 
24
24
  def add_child(child)
@@ -31,7 +31,6 @@ module NewRelic
31
31
  end
32
32
  end
33
33
 
34
-
35
34
  class BacktraceRoot < BacktraceBase
36
35
  attr_reader :flattened
37
36
 
@@ -71,16 +70,15 @@ module NewRelic
71
70
  end
72
71
 
73
72
  def dump_string
74
- result = "#<BacktraceRoot:#{object_id}>"
73
+ result = String.new("#<BacktraceRoot:#{object_id}>")
75
74
  child_results = @children.map { |c| c.dump_string(2) }.join("\n")
76
75
  result << "\n" unless child_results.empty?
77
76
  result << child_results
78
77
  end
79
78
  end
80
79
 
81
-
82
80
  class BacktraceNode < BacktraceBase
83
- attr_reader :file, :method, :line_no, :raw_line, :as_array
81
+ attr_reader :file, :method, :line_no, :raw_line, :as_array
84
82
  attr_accessor :runnable_count, :depth
85
83
 
86
84
  def initialize(line)
@@ -92,8 +90,8 @@ module NewRelic
92
90
 
93
91
  def ==(other)
94
92
  (
95
- @raw_line == other.raw_line &&
96
- @depth == other.depth &&
93
+ @raw_line == other.raw_line &&
94
+ @depth == other.depth &&
97
95
  @runnable_count == other.runnable_count
98
96
  )
99
97
  end
@@ -115,10 +113,12 @@ module NewRelic
115
113
  @as_array << child_arrays
116
114
  end
117
115
 
118
- def dump_string(indent=0)
116
+ def dump_string(indent = 0)
119
117
  @file, @method, @line_no = parse_backtrace_frame(@raw_line)
120
- result = "#{" " * indent}#<BacktraceNode:#{object_id} [#{@runnable_count}] #{@file}:#{@line_no} in #{@method}>"
121
- child_results = @children.map { |c| c.dump_string(indent+2) }.join("\n")
118
+ indentation = ' ' * indent
119
+ result = String.new("#{indentation}#<BacktraceNode:#{object_id} ) + \
120
+ [#{@runnable_count}] #{@file}:#{@line_no} in #{@method}>")
121
+ child_results = @children.map { |c| c.dump_string(indent + 2) }.join("\n")
122
122
  result << "\n" unless child_results.empty?
123
123
  result << child_results
124
124
  end
@@ -129,7 +129,6 @@ module NewRelic
129
129
  [$1, $4, $3] # sic
130
130
  end
131
131
  end
132
-
133
132
  end
134
133
  end
135
134
  end