newrelic_rpm 6.8.0.360 → 8.13.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (440) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +14 -1
  3. data/.rubocop.yml +1817 -0
  4. data/.rubocop_todo.yml +59 -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 +1142 -15
  10. data/CONTRIBUTING.md +133 -19
  11. data/DOCKER.md +167 -0
  12. data/Dockerfile +10 -0
  13. data/Gemfile +5 -2
  14. data/Guardfile +18 -6
  15. data/LICENSE +202 -38
  16. data/README.md +84 -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/shutdown.rb +35 -0
  30. data/lib/new_relic/agent/agent/special_startup.rb +72 -0
  31. data/lib/new_relic/agent/agent/start_worker_thread.rb +163 -0
  32. data/lib/new_relic/agent/agent/startup.rb +197 -0
  33. data/lib/new_relic/agent/agent.rb +199 -562
  34. data/lib/new_relic/agent/agent_logger.rb +24 -20
  35. data/lib/new_relic/agent/attribute_filter.rb +67 -48
  36. data/lib/new_relic/agent/attribute_processing.rb +8 -8
  37. data/lib/new_relic/agent/attributes.rb +9 -8
  38. data/lib/new_relic/agent/audit_logger.rb +19 -4
  39. data/lib/new_relic/agent/autostart.rb +21 -20
  40. data/lib/new_relic/agent/chained_call.rb +2 -2
  41. data/lib/new_relic/agent/commands/agent_command.rb +4 -4
  42. data/lib/new_relic/agent/commands/agent_command_router.rb +13 -12
  43. data/lib/new_relic/agent/commands/thread_profiler_session.rb +10 -8
  44. data/lib/new_relic/agent/configuration/default_source.rb +1731 -1143
  45. data/lib/new_relic/agent/configuration/dotted_hash.rb +7 -6
  46. data/lib/new_relic/agent/configuration/environment_source.rb +12 -10
  47. data/lib/new_relic/agent/configuration/event_harvest_config.rb +41 -18
  48. data/lib/new_relic/agent/configuration/high_security_source.rb +10 -9
  49. data/lib/new_relic/agent/configuration/manager.rb +83 -70
  50. data/lib/new_relic/agent/configuration/manual_source.rb +2 -2
  51. data/lib/new_relic/agent/configuration/mask_defaults.rb +4 -4
  52. data/lib/new_relic/agent/configuration/security_policy_source.rb +91 -78
  53. data/lib/new_relic/agent/configuration/server_source.rb +23 -21
  54. data/lib/new_relic/agent/configuration/yaml_source.rb +33 -9
  55. data/lib/new_relic/agent/configuration.rb +2 -2
  56. data/lib/new_relic/agent/connect/request_builder.rb +19 -19
  57. data/lib/new_relic/agent/connect/response_handler.rb +6 -9
  58. data/lib/new_relic/agent/custom_event_aggregator.rb +15 -15
  59. data/lib/new_relic/agent/database/explain_plan_helpers.rb +5 -6
  60. data/lib/new_relic/agent/database/obfuscation_helpers.rb +16 -15
  61. data/lib/new_relic/agent/database/obfuscator.rb +3 -3
  62. data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +4 -4
  63. data/lib/new_relic/agent/database.rb +55 -50
  64. data/lib/new_relic/agent/database_adapter.rb +35 -0
  65. data/lib/new_relic/agent/datastores/metric_helper.rb +18 -19
  66. data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +8 -7
  67. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +7 -11
  68. data/lib/new_relic/agent/datastores/mongo.rb +7 -12
  69. data/lib/new_relic/agent/datastores/nosql_obfuscator.rb +41 -0
  70. data/lib/new_relic/agent/datastores/redis.rb +6 -12
  71. data/lib/new_relic/agent/datastores.rb +12 -14
  72. data/lib/new_relic/agent/deprecator.rb +2 -2
  73. data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +13 -12
  74. data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +86 -64
  75. data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +84 -0
  76. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
  77. data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +163 -0
  78. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +38 -0
  79. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +245 -0
  80. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +127 -0
  81. data/lib/new_relic/agent/distributed_tracing.rb +113 -32
  82. data/lib/new_relic/agent/encoding_normalizer.rb +5 -3
  83. data/lib/new_relic/agent/error_collector.rb +98 -62
  84. data/lib/new_relic/agent/error_event_aggregator.rb +9 -8
  85. data/lib/new_relic/agent/error_filter.rb +174 -0
  86. data/lib/new_relic/agent/error_trace_aggregator.rb +5 -4
  87. data/lib/new_relic/agent/event_aggregator.rb +23 -22
  88. data/lib/new_relic/agent/event_buffer.rb +8 -9
  89. data/lib/new_relic/agent/event_listener.rb +2 -3
  90. data/lib/new_relic/agent/event_loop.rb +26 -24
  91. data/lib/new_relic/agent/external.rb +19 -52
  92. data/lib/new_relic/agent/guid_generator.rb +5 -12
  93. data/lib/new_relic/agent/harvester.rb +5 -6
  94. data/lib/new_relic/agent/heap.rb +7 -9
  95. data/lib/new_relic/agent/hostname.rb +21 -8
  96. data/lib/new_relic/agent/http_clients/abstract.rb +81 -0
  97. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +26 -26
  98. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +31 -17
  99. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +18 -23
  100. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +12 -15
  101. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +24 -8
  102. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +9 -12
  103. data/lib/new_relic/agent/http_clients/uri_util.rb +12 -13
  104. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +12 -14
  105. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +43 -32
  106. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +21 -14
  107. data/lib/new_relic/agent/instrumentation/active_job.rb +15 -8
  108. data/lib/new_relic/agent/instrumentation/active_merchant.rb +21 -7
  109. data/lib/new_relic/agent/instrumentation/active_record.rb +89 -40
  110. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +82 -61
  111. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +32 -45
  112. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +36 -12
  113. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +34 -22
  114. data/lib/new_relic/agent/instrumentation/active_storage.rb +3 -3
  115. data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +25 -18
  116. data/lib/new_relic/agent/instrumentation/active_support_logger/chain.rb +23 -0
  117. data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +20 -0
  118. data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +12 -0
  119. data/lib/new_relic/agent/instrumentation/active_support_logger.rb +24 -0
  120. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +12 -3
  121. data/lib/new_relic/agent/instrumentation/authlogic.rb +11 -3
  122. data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
  123. data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +150 -0
  124. data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
  125. data/lib/new_relic/agent/instrumentation/bunny.rb +14 -138
  126. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +69 -59
  127. data/lib/new_relic/agent/instrumentation/curb/chain.rb +91 -0
  128. data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +221 -0
  129. data/lib/new_relic/agent/instrumentation/curb/prepend.rb +61 -0
  130. data/lib/new_relic/agent/instrumentation/curb.rb +13 -198
  131. data/lib/new_relic/agent/instrumentation/data_mapper.rb +68 -55
  132. data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +35 -0
  133. data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +48 -0
  134. data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +33 -0
  135. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +30 -52
  136. data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +29 -0
  137. data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +66 -0
  138. data/lib/new_relic/agent/instrumentation/elasticsearch/prepend.rb +13 -0
  139. data/lib/new_relic/agent/instrumentation/elasticsearch.rb +31 -0
  140. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +7 -6
  141. data/lib/new_relic/agent/instrumentation/excon.rb +24 -26
  142. data/lib/new_relic/agent/instrumentation/grape/chain.rb +24 -0
  143. data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
  144. data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
  145. data/lib/new_relic/agent/instrumentation/grape.rb +12 -118
  146. data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +97 -0
  147. data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +89 -0
  148. data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +111 -0
  149. data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +30 -0
  150. data/lib/new_relic/agent/instrumentation/grpc/helper.rb +32 -0
  151. data/lib/new_relic/agent/instrumentation/grpc/server/chain.rb +69 -0
  152. data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +134 -0
  153. data/lib/new_relic/agent/instrumentation/grpc/server/rpc_desc_prepend.rb +35 -0
  154. data/lib/new_relic/agent/instrumentation/grpc/server/rpc_server_prepend.rb +26 -0
  155. data/lib/new_relic/agent/instrumentation/grpc_client.rb +23 -0
  156. data/lib/new_relic/agent/instrumentation/grpc_server.rb +25 -0
  157. data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +24 -0
  158. data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +37 -0
  159. data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +15 -0
  160. data/lib/new_relic/agent/instrumentation/httpclient.rb +12 -32
  161. data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
  162. data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
  163. data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
  164. data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
  165. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +5 -6
  166. data/lib/new_relic/agent/instrumentation/logger/chain.rb +21 -0
  167. data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +66 -0
  168. data/lib/new_relic/agent/instrumentation/logger/prepend.rb +13 -0
  169. data/lib/new_relic/agent/instrumentation/logger.rb +26 -0
  170. data/lib/new_relic/agent/instrumentation/memcache/chain.rb +15 -0
  171. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +58 -125
  172. data/lib/new_relic/agent/instrumentation/memcache/helper.rb +59 -0
  173. data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +90 -0
  174. data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +101 -0
  175. data/lib/new_relic/agent/instrumentation/memcache.rb +57 -71
  176. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +14 -13
  177. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +10 -10
  178. data/lib/new_relic/agent/instrumentation/mongo.rb +6 -131
  179. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +49 -13
  180. data/lib/new_relic/agent/instrumentation/net_http/chain.rb +24 -0
  181. data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +40 -0
  182. data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
  183. data/lib/new_relic/agent/instrumentation/net_http.rb +44 -0
  184. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +34 -9
  185. data/lib/new_relic/agent/instrumentation/padrino/chain.rb +38 -0
  186. data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +28 -0
  187. data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
  188. data/lib/new_relic/agent/instrumentation/padrino.rb +22 -58
  189. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +4 -4
  190. data/lib/new_relic/agent/instrumentation/queue_time.rb +9 -10
  191. data/lib/new_relic/agent/instrumentation/rack/chain.rb +66 -0
  192. data/lib/new_relic/agent/instrumentation/rack/helpers.rb +33 -0
  193. data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +75 -0
  194. data/lib/new_relic/agent/instrumentation/rack/prepend.rb +43 -0
  195. data/lib/new_relic/agent/instrumentation/rack.rb +31 -139
  196. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +17 -53
  197. data/lib/new_relic/agent/instrumentation/rails_middleware.rb +2 -2
  198. data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +6 -5
  199. data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +4 -4
  200. data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +4 -3
  201. data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +14 -4
  202. data/lib/new_relic/agent/instrumentation/rake/chain.rb +20 -0
  203. data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +149 -0
  204. data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
  205. data/lib/new_relic/agent/instrumentation/rake.rb +17 -157
  206. data/lib/new_relic/agent/instrumentation/redis/chain.rb +45 -0
  207. data/lib/new_relic/agent/instrumentation/redis/constants.rb +17 -0
  208. data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +72 -0
  209. data/lib/new_relic/agent/instrumentation/redis/middleware.rb +16 -0
  210. data/lib/new_relic/agent/instrumentation/redis/prepend.rb +29 -0
  211. data/lib/new_relic/agent/instrumentation/redis.rb +19 -102
  212. data/lib/new_relic/agent/instrumentation/resque/chain.rb +21 -0
  213. data/lib/new_relic/agent/instrumentation/resque/helper.rb +19 -0
  214. data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +34 -0
  215. data/lib/new_relic/agent/instrumentation/resque/prepend.rb +15 -0
  216. data/lib/new_relic/agent/instrumentation/resque.rb +29 -37
  217. data/lib/new_relic/agent/instrumentation/sequel.rb +15 -17
  218. data/lib/new_relic/agent/instrumentation/sequel_helper.rb +3 -3
  219. data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +20 -0
  220. data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +30 -0
  221. data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +37 -0
  222. data/lib/new_relic/agent/instrumentation/sidekiq.rb +28 -45
  223. data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
  224. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +31 -37
  225. data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +125 -0
  226. data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
  227. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +3 -3
  228. data/lib/new_relic/agent/instrumentation/sinatra.rb +35 -165
  229. data/lib/new_relic/agent/instrumentation/sunspot.rb +12 -4
  230. data/lib/new_relic/agent/instrumentation/thread/chain.rb +24 -0
  231. data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +28 -0
  232. data/lib/new_relic/agent/instrumentation/thread/prepend.rb +22 -0
  233. data/lib/new_relic/agent/instrumentation/thread.rb +20 -0
  234. data/lib/new_relic/agent/instrumentation/tilt/chain.rb +24 -0
  235. data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +41 -0
  236. data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +13 -0
  237. data/lib/new_relic/agent/instrumentation/tilt.rb +25 -0
  238. data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
  239. data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +80 -0
  240. data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
  241. data/lib/new_relic/agent/instrumentation/typhoeus.rb +14 -76
  242. data/lib/new_relic/agent/instrumentation.rb +2 -2
  243. data/lib/new_relic/agent/internal_agent_error.rb +3 -3
  244. data/lib/new_relic/agent/javascript_instrumentor.rb +48 -42
  245. data/lib/new_relic/agent/linking_metadata.rb +44 -0
  246. data/lib/new_relic/agent/local_log_decorator.rb +37 -0
  247. data/lib/new_relic/agent/log_event_aggregator.rb +235 -0
  248. data/lib/new_relic/agent/log_once.rb +2 -2
  249. data/lib/new_relic/agent/log_priority.rb +20 -0
  250. data/lib/new_relic/agent/logging.rb +39 -26
  251. data/lib/new_relic/agent/memory_logger.rb +3 -3
  252. data/lib/new_relic/agent/messaging.rb +70 -154
  253. data/lib/new_relic/agent/method_tracer.rb +152 -145
  254. data/lib/new_relic/agent/method_tracer_helpers.rb +87 -5
  255. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +118 -0
  256. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +28 -0
  257. data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +3 -4
  258. data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +8 -13
  259. data/lib/new_relic/agent/monitors.rb +26 -0
  260. data/lib/new_relic/agent/new_relic_service/encoders.rb +7 -7
  261. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +6 -6
  262. data/lib/new_relic/agent/new_relic_service/marshaller.rb +3 -3
  263. data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +6 -5
  264. data/lib/new_relic/agent/new_relic_service.rb +258 -184
  265. data/lib/new_relic/agent/noticeable_error.rb +19 -0
  266. data/lib/new_relic/agent/null_logger.rb +8 -4
  267. data/lib/new_relic/agent/obfuscator.rb +9 -11
  268. data/lib/new_relic/agent/parameter_filtering.rb +25 -11
  269. data/lib/new_relic/agent/payload_metric_mapping.rb +10 -11
  270. data/lib/new_relic/agent/pipe_channel_manager.rb +28 -18
  271. data/lib/new_relic/agent/pipe_service.rb +9 -6
  272. data/lib/new_relic/agent/prepend_supportability.rb +3 -3
  273. data/lib/new_relic/agent/priority_sampled_buffer.rb +15 -15
  274. data/lib/new_relic/agent/range_extensions.rb +9 -29
  275. data/lib/new_relic/agent/rules_engine/replacement_rule.rb +12 -12
  276. data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +14 -14
  277. data/lib/new_relic/agent/rules_engine.rb +6 -5
  278. data/lib/new_relic/agent/sampler.rb +4 -5
  279. data/lib/new_relic/agent/sampler_collection.rb +4 -5
  280. data/lib/new_relic/agent/samplers/cpu_sampler.rb +4 -3
  281. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +13 -10
  282. data/lib/new_relic/agent/samplers/memory_sampler.rb +26 -15
  283. data/lib/new_relic/agent/samplers/object_sampler.rb +2 -2
  284. data/lib/new_relic/agent/samplers/vm_sampler.rb +22 -20
  285. data/lib/new_relic/agent/span_event_aggregator.rb +13 -13
  286. data/lib/new_relic/agent/span_event_primitive.rb +106 -68
  287. data/lib/new_relic/agent/sql_sampler.rb +22 -22
  288. data/lib/new_relic/agent/stats.rb +79 -42
  289. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +11 -13
  290. data/lib/new_relic/agent/stats_engine/stats_hash.rb +13 -14
  291. data/lib/new_relic/agent/stats_engine.rb +9 -9
  292. data/lib/new_relic/agent/synthetics_event_aggregator.rb +8 -9
  293. data/lib/new_relic/agent/system_info.rb +95 -66
  294. data/lib/new_relic/agent/threading/agent_thread.rb +19 -15
  295. data/lib/new_relic/agent/threading/backtrace_node.rb +13 -14
  296. data/lib/new_relic/agent/threading/backtrace_service.rb +15 -15
  297. data/lib/new_relic/agent/threading/thread_profile.rb +24 -24
  298. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +2 -2
  299. data/lib/new_relic/agent/tracer.rb +107 -101
  300. data/lib/new_relic/agent/transaction/abstract_segment.rb +128 -38
  301. data/lib/new_relic/agent/transaction/datastore_segment.rb +22 -18
  302. data/lib/new_relic/agent/transaction/distributed_tracer.rb +184 -0
  303. data/lib/new_relic/agent/transaction/distributed_tracing.rb +75 -84
  304. data/lib/new_relic/agent/transaction/external_request_segment.rb +66 -76
  305. data/lib/new_relic/agent/transaction/message_broker_segment.rb +34 -46
  306. data/lib/new_relic/agent/transaction/request_attributes.rb +36 -36
  307. data/lib/new_relic/agent/transaction/segment.rb +35 -11
  308. data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +2 -4
  309. data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +2 -2
  310. data/lib/new_relic/agent/transaction/trace.rb +18 -16
  311. data/lib/new_relic/agent/transaction/trace_builder.rb +11 -11
  312. data/lib/new_relic/agent/transaction/trace_context.rb +102 -93
  313. data/lib/new_relic/agent/transaction/trace_node.rb +26 -28
  314. data/lib/new_relic/agent/transaction/tracing.rb +15 -12
  315. data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +5 -5
  316. data/lib/new_relic/agent/transaction.rb +210 -177
  317. data/lib/new_relic/agent/transaction_error_primitive.rb +32 -28
  318. data/lib/new_relic/agent/transaction_event_aggregator.rb +13 -13
  319. data/lib/new_relic/agent/transaction_event_primitive.rb +43 -47
  320. data/lib/new_relic/agent/transaction_event_recorder.rb +17 -16
  321. data/lib/new_relic/agent/transaction_metrics.rb +11 -10
  322. data/lib/new_relic/agent/transaction_sampler.rb +6 -7
  323. data/lib/new_relic/agent/transaction_time_aggregator.rb +27 -26
  324. data/lib/new_relic/agent/utilization/aws.rb +34 -4
  325. data/lib/new_relic/agent/utilization/azure.rb +4 -4
  326. data/lib/new_relic/agent/utilization/gcp.rb +8 -8
  327. data/lib/new_relic/agent/utilization/pcf.rb +6 -5
  328. data/lib/new_relic/agent/utilization/vendor.rb +44 -29
  329. data/lib/new_relic/agent/utilization_data.rb +8 -6
  330. data/lib/new_relic/agent/vm/jruby_vm.rb +2 -2
  331. data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +3 -3
  332. data/lib/new_relic/agent/vm/mri_vm.rb +46 -19
  333. data/lib/new_relic/agent/vm/snapshot.rb +6 -6
  334. data/lib/new_relic/agent/vm.rb +2 -2
  335. data/lib/new_relic/agent/worker_loop.rb +11 -13
  336. data/lib/new_relic/agent.rb +78 -79
  337. data/lib/new_relic/cli/command.rb +21 -23
  338. data/lib/new_relic/cli/commands/deployments.rb +93 -44
  339. data/lib/new_relic/cli/commands/install.rb +15 -17
  340. data/lib/new_relic/coerce.rb +19 -15
  341. data/lib/new_relic/collection_helper.rb +51 -49
  342. data/lib/new_relic/constants.rb +39 -0
  343. data/lib/new_relic/control/class_methods.rb +4 -4
  344. data/lib/new_relic/control/frameworks/external.rb +3 -3
  345. data/lib/new_relic/control/frameworks/rails.rb +24 -18
  346. data/lib/new_relic/control/frameworks/rails3.rb +4 -5
  347. data/lib/new_relic/control/frameworks/rails4.rb +2 -2
  348. data/lib/new_relic/control/frameworks/rails_notifications.rb +2 -2
  349. data/lib/new_relic/control/frameworks/ruby.rb +4 -4
  350. data/lib/new_relic/control/frameworks/sinatra.rb +8 -2
  351. data/lib/new_relic/control/frameworks.rb +2 -2
  352. data/lib/new_relic/control/instance_methods.rb +24 -46
  353. data/lib/new_relic/control/instrumentation.rb +40 -12
  354. data/lib/new_relic/control/private_instance_methods.rb +48 -0
  355. data/lib/new_relic/control/server_methods.rb +4 -5
  356. data/lib/new_relic/control.rb +2 -3
  357. data/lib/new_relic/delayed_job_injection.rb +2 -2
  358. data/lib/new_relic/dependency_detection.rb +129 -18
  359. data/lib/new_relic/environment_report.rb +41 -35
  360. data/lib/new_relic/helper.rb +49 -8
  361. data/lib/new_relic/language_support.rb +30 -6
  362. data/lib/new_relic/latest_changes.rb +9 -8
  363. data/lib/new_relic/local_environment.rb +25 -19
  364. data/lib/new_relic/metric_data.rb +32 -27
  365. data/lib/new_relic/metric_spec.rb +9 -7
  366. data/lib/new_relic/noticed_error.rb +44 -35
  367. data/lib/new_relic/rack/agent_hooks.rb +2 -2
  368. data/lib/new_relic/rack/agent_middleware.rb +6 -4
  369. data/lib/new_relic/rack/browser_monitoring.rb +134 -119
  370. data/lib/new_relic/rack.rb +2 -2
  371. data/lib/new_relic/recipes/capistrano3.rb +4 -62
  372. data/lib/new_relic/recipes/capistrano_legacy.rb +24 -27
  373. data/lib/new_relic/recipes/helpers/send_deployment.rb +69 -0
  374. data/lib/new_relic/recipes.rb +2 -2
  375. data/lib/new_relic/supportability_helper.rb +21 -6
  376. data/lib/new_relic/traced_thread.rb +35 -0
  377. data/lib/new_relic/version.rb +7 -18
  378. data/lib/newrelic_rpm.rb +12 -36
  379. data/lib/sequel/extensions/newrelic_instrumentation.rb +13 -16
  380. data/lib/sequel/plugins/newrelic_instrumentation.rb +5 -11
  381. data/lib/tasks/all.rb +4 -4
  382. data/lib/tasks/config.rake +22 -117
  383. data/lib/tasks/coverage_report.rake +28 -0
  384. data/lib/tasks/helpers/config.html.erb +21 -0
  385. data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
  386. data/lib/tasks/helpers/format.rb +123 -0
  387. data/lib/tasks/helpers/matches.rb +12 -0
  388. data/lib/tasks/helpers/prompt.rb +24 -0
  389. data/lib/tasks/helpers/removers.rb +33 -0
  390. data/lib/tasks/install.rake +4 -0
  391. data/lib/tasks/instrumentation_generator/README.md +63 -0
  392. data/lib/tasks/instrumentation_generator/TODO.md +33 -0
  393. data/lib/tasks/instrumentation_generator/instrumentation.thor +124 -0
  394. data/lib/tasks/instrumentation_generator/templates/Envfile.tt +9 -0
  395. data/lib/tasks/instrumentation_generator/templates/chain.tt +22 -0
  396. data/lib/tasks/instrumentation_generator/templates/chain_method.tt +8 -0
  397. data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +29 -0
  398. data/lib/tasks/instrumentation_generator/templates/instrumentation.tt +13 -0
  399. data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +3 -0
  400. data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +19 -0
  401. data/lib/tasks/instrumentation_generator/templates/prepend.tt +13 -0
  402. data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +3 -0
  403. data/lib/tasks/instrumentation_generator/templates/test.tt +15 -0
  404. data/lib/tasks/multiverse.rake +4 -0
  405. data/lib/tasks/multiverse.rb +12 -5
  406. data/lib/tasks/newrelic.rb +2 -2
  407. data/lib/tasks/tests.rake +14 -14
  408. data/newrelic.yml +648 -3
  409. data/newrelic_rpm.gemspec +28 -25
  410. data/recipes/newrelic.rb +3 -3
  411. data/test/agent_helper.rb +332 -103
  412. metadata +192 -119
  413. data/.travis.yml +0 -210
  414. data/bin/mongrel_rpm +0 -33
  415. data/cert/cacert.pem +0 -1177
  416. data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
  417. data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +0 -44
  418. data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +0 -53
  419. data/lib/new_relic/agent/distributed_trace_intrinsics.rb +0 -90
  420. data/lib/new_relic/agent/distributed_trace_metrics.rb +0 -74
  421. data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -30
  422. data/lib/new_relic/agent/distributed_trace_payload.rb +0 -175
  423. data/lib/new_relic/agent/distributed_trace_transport_type.rb +0 -43
  424. data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
  425. data/lib/new_relic/agent/instrumentation/excon/connection.rb +0 -46
  426. data/lib/new_relic/agent/instrumentation/http.rb +0 -46
  427. data/lib/new_relic/agent/instrumentation/merb/controller.rb +0 -44
  428. data/lib/new_relic/agent/instrumentation/merb/errors.rb +0 -33
  429. data/lib/new_relic/agent/instrumentation/net.rb +0 -50
  430. data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +0 -125
  431. data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +0 -46
  432. data/lib/new_relic/agent/supported_versions.rb +0 -275
  433. data/lib/new_relic/agent/trace_context.rb +0 -244
  434. data/lib/new_relic/agent/trace_context_payload.rb +0 -134
  435. data/lib/new_relic/agent/trace_context_request_monitor.rb +0 -42
  436. data/lib/new_relic/build.rb +0 -2
  437. data/lib/new_relic/control/frameworks/merb.rb +0 -29
  438. data/lib/new_relic/metrics.rb +0 -13
  439. data/lib/tasks/config.html.erb +0 -32
  440. data/true +0 -0
data/README.md CHANGED
@@ -1,12 +1,17 @@
1
+ [![Blue banner - Community Plus: This code is currently maintained by New Relic engineering teams and delivered here in GitHub. See the README for troubleshooting and defect reporting instructions.](https://github.com/newrelic/opensource-website/raw/main/src/images/categories/Community_Plus.png)](https://opensource.newrelic.com/oss-category/#community-plus)
2
+
1
3
  # New Relic Ruby Agent
2
4
 
3
- New Relic is a performance management system, developed by
4
- New Relic, Inc (http://www.newrelic.com). It provides you with deep
5
- information about the performance of your Rails or Ruby
6
- application as it runs in production and transmits them to
7
- newrelic.com where you can monitor them in real time. The New Relic
8
- Ruby Agent is dual-purposed as a either a Gem or a Rails plugin,
9
- hosted on [github](https://github.com/newrelic/rpm/tree/master).
5
+ The New Relic Ruby agent monitors your applications to help you
6
+ [identify and solve performance issues](https://docs.newrelic.com/docs/agents/ruby-agent/getting-started/introduction-new-relic-ruby#monitor-performance).
7
+ You can also extend the agent's performance monitoring to
8
+ [collect and analyze business data](https://docs.newrelic.com/docs/agents/ruby-agent/getting-started/introduction-new-relic-ruby#business-data)
9
+ to help you improve the customer experience and make data-driven business decisions.
10
+
11
+ The New Relic Ruby agent is dual-purposed as either a Gem or a Rails plugin,
12
+ hosted on [github](https://github.com/newrelic/newrelic-ruby-agent).
13
+
14
+ [![Gem Version](https://badge.fury.io/rb/newrelic_rpm.svg)](https://badge.fury.io/rb/newrelic_rpm)
10
15
 
11
16
  ## Supported Environments
12
17
 
@@ -14,127 +19,119 @@ An up-to-date list of Ruby versions and frameworks for the latest agent
14
19
  can be found on [our docs site](http://docs.newrelic.com/docs/ruby/supported-frameworks).
15
20
 
16
21
  You can also monitor non-web applications. Refer to the "Other
17
- Environments" section under "Getting Started".
22
+ Environments" section below.
18
23
 
19
- ## Contributing Code
24
+ ## Installing and Using
20
25
 
21
- We welcome code contributions (in the form of pull requests) from our user
22
- community. Before submitting a pull request please review
23
- [these guidelines](https://github.com/newrelic/rpm/blob/master/CONTRIBUTING.md).
26
+ The latest released gem for the Ruby agent can be found at [Rubygems.org](https://rubygems.org/gems/newrelic_rpm)
24
27
 
25
- Following these helps us efficiently review and incorporate your contribution
26
- and avoid breaking your code with future changes to the agent.
28
+ ### Quick Start
27
29
 
30
+ #### With Bundler
28
31
 
29
- ## Getting Started
32
+ For using with Bundler, add the Ruby agent to your project's Gemfile.
30
33
 
31
- Add the Ruby Agent to your project's Gemfile.
34
+ ```ruby
35
+ gem 'newrelic_rpm'
36
+ ```
32
37
 
33
- gem 'newrelic_rpm'
38
+ and run `bundle install` to activate the new gem.
34
39
 
35
- To monitor your applications in production, create an account at
36
- http://newrelic.com/ . There you can
37
- sign up for a free Lite account or one of our paid subscriptions.
40
+ #### Without Bundler
38
41
 
39
- Once you receive the welcome email with a license key and
40
- `newrelic.yml` file, you can copy the `newrelic.yml` file into your app config
41
- directory OR can generate the file manually with command:
42
+ If you are not using Bundler, install the gem with:
42
43
 
43
- newrelic install --license_key="YOUR_KEY" "My application"
44
+ ```bash
45
+ gem install newrelic_rpm
46
+ ```
44
47
 
45
- The initial configuration is done in the `newrelic.yml` file. This file
46
- is by default read from the `config` directory of the application root
47
- and is subsequently searched for in the application root directory,
48
- and then in a `~/.newrelic` directory. Once you're up and running you can
49
- enable Server Side Config and manage your newrelic configuration from the web
50
- UI.
48
+ and then require the New Relic Ruby agent in your Ruby start-up sequence:
51
49
 
52
- #### Rails Installation
50
+ ```ruby
51
+ require 'newrelic_rpm'
52
+ ```
53
53
 
54
- You can install the agent as a Gem:
54
+ #### Other Environments
55
55
 
56
- For Bundler:
56
+ Assuming you have installed the agent per above, you may also need to tell the Ruby agent to start for some frameworks and non-framework environments. To do so, add the following to your Ruby start-up sequence start the agent:
57
57
 
58
- Add the following line to your Gemfile:
58
+ ```ruby
59
+ NewRelic::Agent.manual_start
60
+ ```
61
+
62
+ ### Complete Install Instructions
59
63
 
60
- gem 'newrelic_rpm'
64
+ For complete documentation on installing the New Relic Ruby agent, see the following links:
61
65
 
62
- For Rails 2.x without Bundler:
66
+ * [Introduction](https://docs.newrelic.com/docs/agents/ruby-agent/getting-started/introduction-new-relic-ruby)
67
+ * [Install the New Relic Ruby agent](https://docs.newrelic.com/docs/agents/ruby-agent/installation/install-new-relic-ruby-agent)
68
+ * [Configure the agent](https://docs.newrelic.com/docs/agents/ruby-agent/configuration/ruby-agent-configuration)
69
+ * [Update the agent](https://docs.newrelic.com/docs/agents/ruby-agent/installation/update-ruby-agent)
70
+ * [Rails plugin installation](https://docs.newrelic.com/docs/agents/ruby-agent/installation/ruby-agent-installation-rails-plugin)
71
+ * [GAE Flexible Environment](https://docs.newrelic.com/docs/agents/ruby-agent/installation/install-new-relic-ruby-agent-gae-flexible-environment)
72
+ * [Pure Rack Apps](http://docs.newrelic.com/docs/ruby/rack-middlewares)
73
+ * [Ruby agent and Heroku](https://docs.newrelic.com/docs/agents/ruby-agent/installation/ruby-agent-heroku)
74
+ * [Background Jobs](https://docs.newrelic.com/docs/agents/ruby-agent/background-jobs/monitor-ruby-background-processes)
75
+ * [Uninstall the Ruby agent](https://docs.newrelic.com/docs/agents/ruby-agent/installation/uninstall-ruby-agent)
63
76
 
64
- edit `environment.rb` and add to the initalizer block:
77
+ ### Recording Deploys
65
78
 
66
- config.gem "newrelic_rpm"
79
+ The Ruby agent supports recording deployments in New Relic via a command line
80
+ tool or Capistrano recipes. For more information on these features, see
81
+ [our deployment documentation](http://docs.newrelic.com/docs/ruby/recording-deployments-with-the-ruby-agent)
82
+ for more information.
67
83
 
68
- #### Sinatra Installation
69
84
 
70
- To use the Ruby Agent with a Sinatra app, add:
85
+ ## Support
71
86
 
72
- ```ruby
73
- require 'newrelic_rpm'
74
- ```
87
+ Should you need assistance with New Relic products, you are in good hands with several support diagnostic tools and support channels.
75
88
 
76
- in your Sinatra app, below the Sinatra require directive.
89
+ This [troubleshooting framework](https://discuss.newrelic.com/t/ruby-troubleshooting-framework-install/108685) steps you through common troubleshooting questions.
77
90
 
78
- Then make sure you set `RACK_ENV` to the environment corresponding to the
79
- configuration definitions in the newrelic.yml file; e.g., development,
80
- staging, production, etc.
91
+ New Relic offers NRDiag, [a client-side diagnostic utility](https://docs.newrelic.com/docs/using-new-relic/cross-product-functions/troubleshooting/new-relic-diagnostics) that automatically detects common problems with New Relic agents. If NRDiag detects a problem, it suggests troubleshooting steps. NRDiag can also automatically attach troubleshooting data to a New Relic Support ticket.
81
92
 
82
- #### Other Environments
93
+ If the issue has been confirmed as a bug or is a Feature request, please file a GitHub issue.
83
94
 
84
- You can use the Ruby Agent to monitor any Ruby application. Add:
95
+ **Support Channels**
85
96
 
86
- ```ruby
87
- require 'newrelic_rpm'
88
- ```
97
+ * [New Relic Documentation](https://docs.newrelic.com/docs/agents/ruby-agent): Comprehensive guidance for using our platform
98
+ * [New Relic Community](https://discuss.newrelic.com/tags/rubyagent): The best place to engage in troubleshooting questions
99
+ * [New Relic Developer](https://developer.newrelic.com/): Resources for building a custom observability applications
100
+ * [New Relic University](https://learn.newrelic.com/): A range of online training for New Relic users of every level
101
+ * [New Relic Technical Support](https://support.newrelic.com/) 24/7/365 ticketed support. Read more about our [Technical Support Offerings](https://docs.newrelic.com/docs/licenses/license-information/general-usage-licenses/support-plan).
89
102
 
90
- to your startup sequence and then manually start the agent using:
103
+ ## Privacy
91
104
 
92
- ```ruby
93
- NewRelic::Agent.manual_start
94
- ```
105
+ At New Relic we take your privacy and the security of your information seriously, and are committed to protecting your information. We must emphasize the importance of not sharing personal data in public forums, and ask all users to scrub logs and diagnostic information for sensitive information, whether personal, proprietary, or otherwise.
95
106
 
96
- For information about instrumenting pure Rack applications, see our
97
- [Rack middlewares documentation](http://docs.newrelic.com/docs/ruby/rack-middlewares).
107
+ We define “Personal Data” as any information relating to an identified or identifiable individual, including, for example, your name, phone number, post code or zip code, Device ID, IP address, and email address.
98
108
 
99
- Refer to the [New Relic's Docs](http://newrelic.com/docs) for details on how to
100
- monitor other web frameworks, background jobs, and daemons.
109
+ Please review [New Relics General Data Privacy Notice](https://newrelic.com/termsandconditions/privacy) for more information.
101
110
 
102
- The Ruby Agent provides an API that allows custom instrumentation of additional
103
- frameworks. You can find a list of community created intrumentation plugins
104
- (e.g. [newrelic-redis](https://github.com/evanphx/newrelic-redis)) in the
105
- [extends_newrelic_rpm project](https://github.com/newrelic/extends_newrelic_rpm).
111
+ ## Contributing
106
112
 
107
- ## Production Mode
113
+ We encourage contributions to improve the New Relic Ruby agent! Keep in mind when you submit your pull request, you'll need to sign the Contributor License Agreement (CLA) via the click-through using CLA-Assistant. You only have to sign the CLA one time per project.
114
+ If you have any questions, or to execute our corporate CLA (required if your contribution is on behalf of a company), please drop us an email at opensource@newrelic.com.
108
115
 
109
- When your application runs in the production environment, the New
110
- Relic agent runs in production mode. It connects to the New Relic
111
- service and sends deep performance data to the UI for your
112
- analysis. To view this data, log in to http://rpm.newrelic.com.
116
+ **A note about vulnerabilities**
113
117
 
114
- NOTE: You must have a valid account and license key to view this data
115
- online. Refer to instructions in *Getting Started*.
118
+ As noted in our [security policy](https://github.com/newrelic/newrelic-ruby-agent/security/policy), New Relic is committed to the privacy and security of our customers and their data. We believe that providing coordinated disclosure by security researchers and engaging with the security community are important means to achieve our security goals.
116
119
 
117
- ## Recording Deploys
120
+ If you believe you have found a security vulnerability in this project or any of New Relic's products or websites, we welcome and greatly appreciate you reporting it to New Relic through [HackerOne](https://hackerone.com/newrelic).
118
121
 
119
- The Ruby Agent supports recording deployments in New Relic via a command line
120
- tool or Capistrano recipes. For more information on these features see
121
- [our deployment documentation](http://docs.newrelic.com/docs/ruby/recording-deployments-with-the-ruby-agent)
122
- for more information.
122
+ If you would like to contribute to this project, please review [these guidelines](https://github.com/newrelic/newrelic-ruby-agent/blob/main/CONTRIBUTING.md).
123
123
 
124
- ## Support
124
+ To [all contributors](https://github.com/newrelic/newrelic-ruby-agent/graphs/contributors), we thank you! Without your contribution, this project would not be what it is today. We also host a community project page dedicated to
125
+ the [New Relic Ruby agent](https://opensource.newrelic.com/projects/newrelic/newrelic-ruby-agent).
125
126
 
126
- You can find more detailed documentation [on our website](http://newrelic.com/docs),
127
- and specifically in the [Ruby category](http://newrelic.com/docs/ruby).
127
+ ## License
128
128
 
129
- If you can't find what you're looking for there, reach out to us on our [support
130
- site](http://support.newrelic.com/) or our [community forum](https://discuss.newrelic.com/)
131
- and we'll be happy to help you.
129
+ As of version 6.12 (released July 16, 2020), the New Relic Ruby agent is licensed under the Apache License, Version 2.0. See [LICENSE](LICENSE) for a copy of the license. For older agent versions, check the LICENSE file included with the source code.
132
130
 
133
- Find a bug? Contact us via [support.newrelic.com](http://support.newrelic.com/),
134
- or email support@newrelic.com.
131
+ The New Relic Ruby agent may use source code from third-party libraries. When used, these libraries will be outlined in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md).
135
132
 
136
- Thank you, and may your application scale to infinity plus one.
133
+ ## Thank You
137
134
 
138
- Lew Cirne, Founder and CEO
135
+ Thank you,
139
136
 
140
- New Relic, Inc.
137
+ New Relic Ruby agent team
data/Rakefile CHANGED
@@ -1,7 +1,13 @@
1
+ # This file is distributed under New Relic's license terms.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
+
1
5
  require 'rubygems'
2
6
  require 'rake/testtask'
3
7
  require 'yard'
4
8
  require "#{File.dirname(__FILE__)}/lib/tasks/all.rb"
9
+ require_relative 'lib/tasks/helpers/prompt'
10
+ include Prompt
5
11
 
6
12
  YARD::Rake::YardocTask.new
7
13
 
@@ -10,16 +16,7 @@ task :test => ['test:newrelic']
10
16
 
11
17
  namespace :test do
12
18
  desc "Run all tests"
13
- task :all => %w{newrelic multiverse}
14
-
15
- begin
16
- require 'test_bisect'
17
- TestBisect::BisectTask.new do |t|
18
- t.test_task_name = 'test:newrelic'
19
- end
20
- rescue LoadError
21
- end
22
-
19
+ task :all => %w[newrelic multiverse all_compatible_envs]
23
20
  agent_home = File.expand_path(File.dirname(__FILE__))
24
21
 
25
22
  desc "Run agent performance tests"
@@ -27,14 +24,21 @@ namespace :test do
27
24
  require File.expand_path(File.join(File.dirname(__FILE__), 'test', 'performance', 'lib', 'performance'))
28
25
  options = {}
29
26
  options[:suite] = args[:suite] if args[:suite]
30
- options[:name] = args[:name] if args[:name]
27
+ options[:name] = args[:name] if args[:name]
31
28
  Performance::Runner.new(options).run_and_report
32
29
  end
33
30
 
34
- desc "Run agent within existing mini environments"
35
- task :env, [:env1, :env2, :env3, :env4, :env5, :env6] => [] do |t, args|
31
+ desc "Run agent within existing mini environment(s): env[name1,name2,name3,etc.]"
32
+ task :env do |t, args|
36
33
  require File.expand_path(File.join(File.dirname(__FILE__), 'test', 'environments', 'lib', 'environments', 'runner'))
37
- Environments::Runner.new(args.map{|_,v| v}).run_and_report
34
+ Environments::Runner.new(args.to_a).run_and_report
35
+ end
36
+
37
+ desc "Run all mini environment tests known to work with the current Ruby version"
38
+ task :all_compatible_envs do |t, args|
39
+ require File.expand_path(File.join(File.dirname(__FILE__), 'test', 'helpers', 'ruby_rails_mappings'))
40
+ rails_versions = rails_versions_for_ruby_version(RUBY_VERSION)
41
+ Rake::Task['test:env'].invoke(*rails_versions)
38
42
  end
39
43
 
40
44
  Rake::TestTask.new(:intentional_fail) do |t|
@@ -51,15 +55,14 @@ namespace :test do
51
55
 
52
56
  # Note unit testing task is defined in lib/tasks/tests.rake to facilitate
53
57
  # running them in a rails application environment.
54
-
55
58
  end
56
59
 
57
60
  desc 'Record build number and stage'
58
- task :record_build, [ :build_number, :stage ] do |t, args|
61
+ task :record_build, [:build_number, :stage] do |t, args|
59
62
  build_string = args.build_number
60
63
  build_string << ".#{args.stage}" unless args.stage.nil? || args.stage.empty?
61
64
 
62
- gitsha = File.exists?(".git") ? `git rev-parse HEAD` : "Unknown"
65
+ gitsha = File.exist?(".git") ? `git rev-parse HEAD` : "Unknown"
63
66
  gitsha.chomp!
64
67
 
65
68
  File.open("lib/new_relic/build.rb", "w") do |f|
@@ -110,26 +113,23 @@ task :update_ca_bundle do |t|
110
113
  end
111
114
 
112
115
  namespace :cross_agent_tests do
113
- cross_agent_tests_upstream_path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'cross_agent_tests'))
114
- cross_agent_tests_local_path = File.expand_path(File.join(File.dirname(__FILE__), 'test', 'fixtures', 'cross_agent_tests'))
116
+ CROSS_AGENT_TESTS_UPSTREAM_PATH = File.expand_path(File.join('..', 'cross_agent_tests')).freeze
117
+ CROSS_AGENT_TESTS_LOCAL_PATH = File.expand_path(File.join('test', 'fixtures', 'cross_agent_tests')).freeze
115
118
 
116
119
  desc 'Pull latest changes from cross_agent_tests repo'
117
120
  task :pull do
118
- puts "Updating embedded cross_agent_tests from #{cross_agent_tests_upstream_path}..."
119
- cmd = "rsync -avu --exclude .git #{cross_agent_tests_upstream_path}/ #{cross_agent_tests_local_path}/"
120
- puts cmd
121
- system(cmd)
121
+ command = " rsync -av --exclude .git #{CROSS_AGENT_TESTS_UPSTREAM_PATH}/ #{CROSS_AGENT_TESTS_LOCAL_PATH}/"
122
+ prompt_to_continue(command)
122
123
  end
123
124
 
124
125
  desc 'Copy changes from embedded cross_agent_tests to official repo working copy'
125
126
  task :push do
126
- puts "Copying changes from embedded cross_agent_tests to #{cross_agent_tests_upstream_path}..."
127
- cmd = "rsync -avu #{cross_agent_tests_local_path}/ #{cross_agent_tests_upstream_path}/"
128
- puts cmd
129
- system(cmd)
127
+ command = "rsync -av #{CROSS_AGENT_TESTS_LOCAL_PATH}/ #{CROSS_AGENT_TESTS_UPSTREAM_PATH}/"
128
+ prompt_to_continue(command, 'remote (agent spec repo)')
130
129
  end
131
130
  end
132
131
 
132
+ desc 'Start an interactive console session'
133
133
  task :console do
134
134
  require 'pry'
135
135
  require 'newrelic_rpm'
@@ -0,0 +1,28 @@
1
+ # Third Party Notices
2
+
3
+ The New Relic Ruby agent may make use of source code from third party libraries
4
+ which carry their own copyright notices and license terms. Any such content will
5
+ be provided below.
6
+
7
+ In the event that a required notice is missing or incorrect, please notify us
8
+ by e-mailing [open-source@newrelic.com](mailto:open-source@newrelic.com).
9
+
10
+ For any licenses that require the disclosure of source
11
+ code, the source code can be found at:
12
+ [https://github.com/newrelic/newrelic-ruby-agent](https://github.com/newrelic/newrelic-ruby-agent).
13
+
14
+
15
+ ## Current Notices and Terms
16
+
17
+ As of version 7.0 (released April 23, 2021), the New Relic Ruby agent does not
18
+ include any third party software with its distribution.
19
+
20
+ The Ruby agent team leverages a variety of open source third party software for
21
+ the development of the agent but not distributed with the agent. Some of these
22
+ software packages are referenced as development dependencies in the agent's
23
+ [newrelic_rpm.gemspec](newrelic_rpm.gemspec) file. We are grateful
24
+ to the maintainers and contributors for all of these packages.
25
+
26
+ For versions older than 7.0, please consult the `THIRD_PARTY_NOTICES.md`
27
+ document distributed with the agent. Any version of the agent not containing
28
+ that document are not thought to include any third party software.
data/Thorfile ADDED
@@ -0,0 +1,5 @@
1
+ # This file is distributed under New Relic's license terms.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
+
5
+ Dir["./lib/tasks/**/*.thor"].sort.each { |f| load f }
data/bin/newrelic CHANGED
@@ -1,13 +1,14 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
  # executes one of the commands in the new_relic/commands directory
3
4
  # pass the name of the command as an argument
4
5
 
5
- $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..','lib'))
6
+ $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
6
7
  require 'new_relic/cli/command'
7
8
  begin
8
9
  NewRelic::Cli::Command.run
9
10
  rescue NewRelic::Cli::Command::CommandFailure => failure
10
11
  STDERR.puts failure.message
11
12
  STDERR.puts failure.options if failure.options
12
- exit 1
13
+ exit(1)
13
14
  end
data/bin/newrelic_cmd CHANGED
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
  # This command has been renamed "newrelic"
3
4
  # executes one of the commands in the new_relic/commands directory
4
5
  # pass the name of the command as an argument
data/bin/nrdebug CHANGED
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # encoding: utf-8
4
3
  # This file is distributed under New Relic's license terms.
5
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
5
+ # frozen_string_literal: true
6
6
 
7
7
  require 'tempfile'
8
8
  require 'rbconfig'
9
9
 
10
- def fail(msg, opts={})
10
+ def fail(msg, opts = {})
11
11
  $stderr.puts(msg)
12
12
  usage() if opts[:usage]
13
13
  exit(-1)
@@ -84,7 +84,7 @@ class ProcessDataProvider
84
84
 
85
85
  def self.for_process(pid)
86
86
  case RbConfig::CONFIG['target_os']
87
- when /linux/ then LinuxProcessDataProvider.new(pid)
87
+ when /linux/ then LinuxProcessDataProvider.new(pid)
88
88
  when /darwin/ then DarwinProcessDataProvider.new(pid)
89
89
  end
90
90
  end
@@ -96,11 +96,11 @@ class LinuxProcessDataProvider < ProcessDataProvider
96
96
  end
97
97
 
98
98
  def procline
99
- File.read(proc_path('cmdline')).gsub("\000", " ")
99
+ File.read(proc_path('cmdline')).tr("\000", " ")
100
100
  end
101
101
 
102
102
  def environment
103
- File.read(proc_path('environ')).gsub("\000", "\n")
103
+ File.read(proc_path('environ')).tr("\000", "\n")
104
104
  end
105
105
  end
106
106
 
@@ -133,8 +133,29 @@ class RubyProcess
133
133
  backtrace_file = Tempfile.new('nrdebug_ruby_bt')
134
134
  File.chmod(0666, backtrace_file.path)
135
135
 
136
- backtrace_gathering_code = 'Thread.list.each { |t| bt = t.backtrace rescue nil; puts \"#{t.inspect}\n#{bt && bt.join(\"\n\")}\n\n\" }'
137
- gdb_script_body = <<-END
136
+ body = gdb_script_body(backtrace_file)
137
+
138
+ script_file = write_script_file(body)
139
+
140
+ gdb_stderr = Tempfile.new('nrdebug_gdb_stderr')
141
+
142
+ gdb_cmd = "gdb -batch -x #{script_file.path} 2>#{gdb_stderr.path}"
143
+ gdb_output = ShellWrapper.execute(gdb_cmd)
144
+ ruby_backtrace = File.read(backtrace_file.path)
145
+
146
+ script_file.close!
147
+ backtrace_file.close!
148
+ gdb_stderr.close!
149
+
150
+ [gdb_output, ruby_backtrace]
151
+ end
152
+
153
+ private
154
+
155
+ def gdb_script_body(backtrace_file)
156
+ backtrace_gathering_code = 'Thread.list.each { |t| bt = t.backtrace rescue nil; ' \
157
+ 'puts \"#{t.inspect}\n#{bt && bt.join(\"\n\")}\n\n\" }'
158
+ <<-END
138
159
  attach #{pid}
139
160
  t a a bt
140
161
  call (void)close(1)
@@ -147,30 +168,21 @@ class RubyProcess
147
168
  call (void)fflush(0)
148
169
  quit
149
170
  END
150
- Logger.log("Using gdb script:\n#{gdb_script_body}")
171
+ end
151
172
 
173
+ def write_script_file(body)
174
+ Logger.log("Using gdb script:\n#{body}")
152
175
  script_file = Tempfile.new('nrdebug_gdb_script')
153
- script_file.write(gdb_script_body)
176
+ script_file.write(body)
154
177
  script_file.close
155
-
156
- gdb_stderr = Tempfile.new('nrdebug_gdb_stderr')
157
-
158
- gdb_cmd = "gdb -batch -x #{script_file.path} 2>#{gdb_stderr.path}"
159
- gdb_output = ShellWrapper.execute(gdb_cmd)
160
- ruby_backtrace = File.read(backtrace_file.path)
161
-
162
- script_file.close!
163
- backtrace_file.close!
164
- gdb_stderr.close!
165
-
166
- [gdb_output, ruby_backtrace]
178
+ script_file
167
179
  end
168
180
  end
169
181
 
170
182
  class ProcessReport
171
183
  attr_reader :target, :path
172
184
 
173
- def initialize(target, path=nil)
185
+ def initialize(target, path = nil)
174
186
  @target = target
175
187
  @path = path
176
188
  end
@@ -178,14 +190,14 @@ class ProcessReport
178
190
  def open
179
191
  if @path
180
192
  File.open(@path, "w") do |f|
181
- yield f
193
+ yield(f)
182
194
  end
183
195
  else
184
- yield $stdout
196
+ yield($stdout)
185
197
  end
186
198
  end
187
199
 
188
- def section(f, name=nil)
200
+ def section(f, name = nil)
189
201
  content = begin
190
202
  yield
191
203
  rescue StandardError => e
@@ -200,50 +212,59 @@ class ProcessReport
200
212
 
201
213
  def generate
202
214
  open do |f|
203
- section(f, "Time") { Time.now }
204
- section(f, "PID") { @target.pid }
205
- section(f, "Command") { @target.procline }
206
- section(f, "RSS") { @target.rss }
207
- section(f, "CPU") { @target.cpu }
208
- section(f, "Parent PID") { @target.ppid }
209
- section(f, "OS") { ShellWrapper.execute('uname -a') }
210
- section(f, "Environment") { @target.environment }
215
+ add_environment_sections(f)
211
216
 
212
217
  section(f) do
213
218
  c_backtraces, ruby_backtraces = @target.gather_backtraces
214
- if c_backtraces.match(/could not attach/i)
219
+ if c_backtraces =~ /could not attach/i
215
220
  fail("Failed to attach to target process. Please try again with sudo.")
216
221
  end
217
- section(f, "C Backtraces") { c_backtraces }
222
+
223
+ section(f, "C Backtraces") { c_backtraces }
218
224
  section(f, "Ruby Backtrace(s)") { ruby_backtraces }
219
225
  end
220
226
 
221
227
  section(f, "Open files") { @target.open_files }
222
228
  section(f, "Log") do
223
- commands = Logger.messages.map { |(_,msg)| msg }
229
+ commands = Logger.messages.map { |(_, msg)| msg }
224
230
  commands.join("\n")
225
231
  end
226
232
  end
227
233
  end
234
+
235
+ private
236
+
237
+ def add_environment_sections(handle)
238
+ section(handle, "Time") { Time.now }
239
+ section(handle, "PID") { @target.pid }
240
+ section(handle, "Command") { @target.procline }
241
+ section(handle, "RSS") { @target.rss }
242
+ section(handle, "CPU") { @target.cpu }
243
+ section(handle, "Parent PID") { @target.ppid }
244
+ section(handle, "OS") { ShellWrapper.execute('uname -a') }
245
+ section(handle, "Environment") { @target.environment }
246
+ end
228
247
  end
229
248
 
230
249
  def prompt_for_confirmation(target_pid, target_cmd)
231
- puts "Are you sure you want to attach to PID #{target_pid} ('#{target_cmd}')}?"
232
- puts ''
233
- puts '************************** !WARNING! **************************'
234
- puts "Extracting debug information from this process may cause it to CRASH OR HANG."
235
- puts ''
236
- puts "It is highly recommended that you only run this script against processes that"
237
- puts "are already unresponsive."
238
- puts ''
239
- puts "Additionally, the output may contain sensitive information from the program's"
240
- puts "command line arguments, environment, or open file list. Please examine the"
241
- puts "output before sharing it."
242
- puts '************************** !WARNING! **************************'
243
- puts ''
244
- puts "To continue, type 'continue':"
245
-
246
- until ($stdin.gets.strip == 'continue') do
250
+ puts <<-PROMPT
251
+ Are you sure you want to attach to PID #{target_pid} ('#{target_cmd}')}?
252
+
253
+ ************************** !WARNING! **************************
254
+ Extracting debug information from this process may cause it to CRASH OR HANG.
255
+
256
+ It is highly recommended that you only run this script against processes that
257
+ are already unresponsive.
258
+
259
+ Additionally, the output may contain sensitive information from the program's
260
+ command line arguments, environment, or open file list. Please examine the
261
+ output before sharing it.
262
+ ************************** !WARNING! **************************
263
+
264
+ To continue, type 'continue':
265
+ PROMPT
266
+
267
+ until $stdin.gets.strip == 'continue'
247
268
  puts "Please type 'continue' to continue, or ctrl-c to abort."
248
269
  end
249
270
  end
@@ -256,11 +277,13 @@ fail("Could not find gdb, please ensure it is installed and in your PATH") if gd
256
277
 
257
278
  target = RubyProcess.new(target_pid)
258
279
  if !target.attachable?
259
- fail("You do not appear to have permissions to attach to the target process.\nPlease check the process owner and try again with sudo if necessary")
280
+ fail("You do not appear to have permissions to attach to the target process.\nPlease check the process owner " \
281
+ 'and try again with sudo if necessary')
260
282
  end
261
283
  if !target.alive?
262
284
  fail("Could not find process with PID #{target_pid}")
263
285
  end
286
+
264
287
  target_cmd = target.procline
265
288
 
266
289
  prompt_for_confirmation(target_pid, target_cmd)