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
  require 'set'
6
6
  require 'new_relic/version'
@@ -26,7 +26,7 @@ module NewRelic
26
26
  #
27
27
  # If the environment can't be determined, it will be set to nil.
28
28
  #
29
- # NewRelic::LocalEnvironment should be accessed through NewRelic::Control#env (via the NewRelic::Control singleton).
29
+ # NewRelic::LocalEnvironment should be accessed through NewRelic::Control#local_env (via the NewRelic::Control singleton).
30
30
  class LocalEnvironment
31
31
  def discovered_dispatcher
32
32
  discover_dispatcher unless @discovered_dispatcher
@@ -34,11 +34,11 @@ module NewRelic
34
34
  end
35
35
 
36
36
  def initialize
37
- # Extend self with any any submodules of LocalEnvironment. These can override
38
- # the discover methods to discover new framworks and dispatchers.
39
- NewRelic::LocalEnvironment.constants.each do | const |
40
- mod = NewRelic::LocalEnvironment.const_get const
41
- self.extend mod if mod.instance_of? Module
37
+ # Extend self with any submodules of LocalEnvironment. These can override
38
+ # the discover methods to discover new frameworks and dispatchers.
39
+ NewRelic::LocalEnvironment.constants.each do |const|
40
+ mod = NewRelic::LocalEnvironment.const_get(const)
41
+ self.extend(mod) if mod.instance_of?(Module)
42
42
  end
43
43
 
44
44
  @discovered_dispatcher = nil
@@ -71,19 +71,19 @@ module NewRelic
71
71
  thin
72
72
  mongrel
73
73
  litespeed
74
+ unicorn
74
75
  webrick
75
76
  fastcgi
76
- rainbows
77
- unicorn
78
77
  ]
79
78
  while dispatchers.any? && @discovered_dispatcher.nil?
80
- send 'check_for_'+(dispatchers.shift)
79
+ send('check_for_' + (dispatchers.shift))
81
80
  end
82
81
  end
83
82
 
84
83
  def check_for_torquebox
85
84
  return unless defined?(::JRuby) &&
86
- ( org.torquebox::TorqueBox rescue nil)
85
+ (org.torquebox::TorqueBox rescue nil)
86
+
87
87
  @discovered_dispatcher = :torquebox
88
88
  end
89
89
 
@@ -92,11 +92,13 @@ module NewRelic
92
92
  (((com.sun.grizzly.jruby.rack.DefaultRackApplicationFactory rescue nil) &&
93
93
  defined?(com::sun::grizzly::jruby::rack::DefaultRackApplicationFactory)) ||
94
94
  (jruby_rack? && defined?(::GlassFish::Server)))
95
+
95
96
  @discovered_dispatcher = :glassfish
96
97
  end
97
98
 
98
99
  def check_for_trinidad
99
100
  return unless defined?(::JRuby) && jruby_rack? && defined?(::Trinidad::Server)
101
+
100
102
  @discovered_dispatcher = :trinidad
101
103
  end
102
104
 
@@ -106,17 +108,20 @@ module NewRelic
106
108
 
107
109
  def check_for_webrick
108
110
  return unless defined?(::WEBrick) && defined?(::WEBrick::VERSION)
111
+
109
112
  @discovered_dispatcher = :webrick
110
113
  end
111
114
 
112
115
  def check_for_fastcgi
113
116
  return unless defined?(::FCGI)
117
+
114
118
  @discovered_dispatcher = :fastcgi
115
119
  end
116
120
 
117
121
  # this case covers starting by mongrel_rails
118
122
  def check_for_mongrel
119
123
  return unless defined?(::Mongrel) && defined?(::Mongrel::HttpServer)
124
+
120
125
  @discovered_dispatcher = :mongrel
121
126
  end
122
127
 
@@ -127,13 +132,6 @@ module NewRelic
127
132
  end
128
133
  end
129
134
 
130
- def check_for_rainbows
131
- if (defined?(::Rainbows) && defined?(::Rainbows::HttpServer)) && NewRelic::LanguageSupport.object_space_usable?
132
- v = find_class_in_object_space(::Rainbows::HttpServer)
133
- @discovered_dispatcher = :rainbows if v
134
- end
135
- end
136
-
137
135
  def check_for_puma
138
136
  if defined?(::Puma) && File.basename($0) == 'puma'
139
137
  @discovered_dispatcher = :puma
@@ -147,9 +145,9 @@ module NewRelic
147
145
  end
148
146
 
149
147
  def check_for_resque
150
- has_queue = ENV['QUEUE'] || ENV['QUEUES']
151
- resque_rake = executable == 'rake' && ARGV.include?('resque:work')
152
- resque_pool_rake = executable == 'rake' && ARGV.include?('resque:pool')
148
+ has_queue = ENV['QUEUE'] || ENV['QUEUES']
149
+ resque_rake = executable == 'rake' && ARGV.include?('resque:work')
150
+ resque_pool_rake = executable == 'rake' && ARGV.include?('resque:pool')
153
151
  resque_pool_executable = executable == 'resque-pool' && defined?(::Resque::Pool)
154
152
 
155
153
  using_resque = defined?(::Resque) &&
@@ -180,7 +178,7 @@ module NewRelic
180
178
  end
181
179
 
182
180
  def check_for_litespeed
183
- if caller.pop =~ /fcgi-bin\/RailsRunner\.rb/
181
+ if caller.pop.include?('fcgi-bin/RailsRunner.rb')
184
182
  @discovered_dispatcher = :litespeed
185
183
  end
186
184
  end
@@ -192,16 +190,14 @@ module NewRelic
192
190
  end
193
191
 
194
192
  public
193
+
195
194
  # outputs a human-readable description
196
195
  def to_s
197
- s = "LocalEnvironment["
198
- s << ";dispatcher=#{@discovered_dispatcher}" if @discovered_dispatcher
199
- s << "]"
196
+ %Q(LocalEnvironment[#{";dispatcher=#{@discovered_dispatcher}" if @discovered_dispatcher}])
200
197
  end
201
198
 
202
199
  def executable
203
200
  File.basename($0)
204
201
  end
205
-
206
202
  end
207
203
  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/coerce'
6
6
 
@@ -8,9 +8,11 @@ module NewRelic
8
8
  class MetricData
9
9
  # a NewRelic::MetricSpec object
10
10
  attr_reader :metric_spec
11
- # the actual statistics object
11
+ # a NewRelic::Agent::Stats object
12
12
  attr_accessor :stats
13
13
 
14
+ include NewRelic::Coerce
15
+
14
16
  def initialize(metric_spec, stats)
15
17
  @original_spec = nil
16
18
  @metric_spec = metric_spec
@@ -18,50 +20,53 @@ module NewRelic
18
20
  end
19
21
 
20
22
  def eql?(o)
21
- (metric_spec.eql? o.metric_spec) && (stats.eql? o.stats)
23
+ (metric_spec.eql?(o.metric_spec)) && (stats.eql?(o.stats))
22
24
  end
23
25
 
24
- def original_spec
25
- @original_spec || @metric_spec
26
+ def hash
27
+ [metric_spec, stats].hash
28
+ end
29
+
30
+ def inspect
31
+ "#<MetricData metric_spec:#{metric_spec.inspect}, stats:#{stats.inspect}>"
26
32
  end
27
33
 
28
34
  # assigns a new metric spec, and retains the old metric spec as
29
35
  # @original_spec if it exists currently
30
- def metric_spec= new_spec
36
+ def metric_spec=(new_spec)
31
37
  @original_spec = @metric_spec if @metric_spec
32
38
  @metric_spec = new_spec
33
39
  end
34
40
 
35
- def hash
36
- metric_spec.hash ^ stats.hash
41
+ def original_spec
42
+ @original_spec || @metric_spec
43
+ end
44
+
45
+ def to_collector_array(encoder = nil)
46
+ stat_key = {'name' => metric_spec.name, 'scope' => metric_spec.scope}
47
+ [stat_key, stats_collector_array(stat_key)]
37
48
  end
38
49
 
39
50
  def to_json(*a)
40
- %Q[{"metric_spec":#{metric_spec.to_json},"stats":{"total_exclusive_time":#{stats.total_exclusive_time},"min_call_time":#{stats.min_call_time},"call_count":#{stats.call_count},"sum_of_squares":#{stats.sum_of_squares},"total_call_time":#{stats.total_call_time},"max_call_time":#{stats.max_call_time}}}]
51
+ %Q({"metric_spec":#{metric_spec.to_json},"stats":{"total_exclusive_time":#{stats.total_exclusive_time},"min_call_time":#{stats.min_call_time},"call_count":#{stats.call_count},"sum_of_squares":#{stats.sum_of_squares},"total_call_time":#{stats.total_call_time},"max_call_time":#{stats.max_call_time}}})
41
52
  end
42
53
 
43
54
  def to_s
44
55
  "#{metric_spec.name}(#{metric_spec.scope}): #{stats}"
45
56
  end
46
57
 
47
- def inspect
48
- "#<MetricData metric_spec:#{metric_spec.inspect}, stats:#{stats.inspect}>"
49
- end
50
-
51
- include NewRelic::Coerce
58
+ private
52
59
 
53
- def to_collector_array(encoder=nil)
54
- stat_key = { 'name' => metric_spec.name, 'scope' => metric_spec.scope }
55
- [ stat_key,
56
- [
57
- int(stats.call_count, stat_key),
58
- float(stats.total_call_time, stat_key),
59
- float(stats.total_exclusive_time, stat_key),
60
- float(stats.min_call_time, stat_key),
61
- float(stats.max_call_time, stat_key),
62
- float(stats.sum_of_squares, stat_key)
63
- ]
64
- ]
60
+ def stats_collector_array(stat_key)
61
+ [[:call_count, Integer], [:total_call_time, Float],
62
+ [:total_exclusive_time, Float], [:min_call_time, Float],
63
+ [:max_call_time, Float], [:sum_of_squares, Float]].map do |attr_types|
64
+ if attr_types[1].eql?(Integer)
65
+ int(stats.send(attr_types[0]), stat_key)
66
+ elsif attr_types[1].eql?(Float)
67
+ float(stats.send(attr_types[0]), stat_key)
68
+ end
69
+ end
65
70
  end
66
71
  end
67
72
  end
@@ -1,18 +1,18 @@
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 struct uniquely defines a metric, optionally inside
6
6
  # the call scope of another metric
7
7
  class NewRelic::MetricSpec
8
- attr_reader :name, :scope
8
+ attr_reader :name, :scope
9
9
 
10
10
  # the maximum length of a metric name or metric scope
11
11
  MAX_LENGTH = 255
12
12
  LENGTH_RANGE = (0...MAX_LENGTH)
13
13
  EMPTY_SCOPE = ''.freeze
14
14
 
15
- def initialize(metric_name='', metric_scope=nil)
15
+ def initialize(metric_name = '', metric_scope = nil)
16
16
  if metric_name.to_s.length > MAX_LENGTH
17
17
  @name = metric_name.to_s[LENGTH_RANGE]
18
18
  else
@@ -34,16 +34,17 @@ class NewRelic::MetricSpec
34
34
  self.eql?(o)
35
35
  end
36
36
 
37
- def eql? o
37
+ def eql?(o)
38
38
  @name == o.name && @scope == o.scope
39
39
  end
40
40
 
41
41
  def hash
42
- @name.hash ^ @scope.hash
42
+ [@name, @scope].hash
43
43
  end
44
44
 
45
45
  def to_s
46
46
  return name if scope.empty?
47
+
47
48
  "#{name}:#{scope}"
48
49
  end
49
50
 
@@ -53,12 +54,13 @@ class NewRelic::MetricSpec
53
54
 
54
55
  def to_json(*a)
55
56
  {'name' => name,
56
- 'scope' => scope}.to_json(*a)
57
+ 'scope' => scope}.to_json(*a)
57
58
  end
58
59
 
59
60
  def <=>(o)
60
61
  namecmp = self.name <=> o.name
61
62
  return namecmp if namecmp != 0
63
+
62
64
  return (self.scope || '') <=> (o.scope || '')
63
65
  end
64
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
  require 'new_relic/helper'
6
6
  require 'new_relic/agent/attribute_filter'
@@ -11,17 +11,28 @@ class NewRelic::NoticedError
11
11
  extend NewRelic::CollectionHelper
12
12
 
13
13
  attr_accessor :path, :timestamp, :message, :exception_class_name,
14
- :request_uri, :request_port, :file_name, :line_number,
15
- :stack_trace, :attributes_from_notice_error, :attributes,
16
- :expected
14
+ :request_uri, :request_port, :file_name, :line_number,
15
+ :stack_trace, :attributes_from_notice_error, :attributes,
16
+ :expected
17
17
 
18
- attr_reader :exception_id, :is_internal
18
+ attr_reader :exception_id, :is_internal
19
19
 
20
- STRIPPED_EXCEPTION_REPLACEMENT_MESSAGE = "Message removed by New Relic 'strip_exception_messages' setting".freeze
21
- UNKNOWN_ERROR_CLASS_NAME = 'Error'.freeze
22
- NIL_ERROR_MESSAGE = '<no message>'.freeze
20
+ STRIPPED_EXCEPTION_REPLACEMENT_MESSAGE = "Message removed by New Relic 'strip_exception_messages' setting"
21
+ UNKNOWN_ERROR_CLASS_NAME = 'Error'
22
+ NIL_ERROR_MESSAGE = '<no message>'
23
23
 
24
- def initialize(path, exception, timestamp = Time.now)
24
+ USER_ATTRIBUTES = "userAttributes"
25
+ AGENT_ATTRIBUTES = "agentAttributes"
26
+ INTRINSIC_ATTRIBUTES = "intrinsics"
27
+
28
+ DESTINATION = NewRelic::Agent::AttributeFilter::DST_ERROR_COLLECTOR
29
+
30
+ ERROR_PREFIX_KEY = 'error'
31
+ ERROR_MESSAGE_KEY = "#{ERROR_PREFIX_KEY}.message"
32
+ ERROR_CLASS_KEY = "#{ERROR_PREFIX_KEY}.class"
33
+ ERROR_EXPECTED_KEY = "#{ERROR_PREFIX_KEY}.expected"
34
+
35
+ def initialize(path, exception, timestamp = Process.clock_gettime(Process::CLOCK_REALTIME), expected = false)
25
36
  @exception_id = exception.object_id
26
37
  @path = path
27
38
 
@@ -39,14 +50,14 @@ class NewRelic::NoticedError
39
50
 
40
51
  # replace error message if enabled
41
52
  if NewRelic::Agent.config[:'strip_exception_messages.enabled'] &&
42
- !self.class.passes_message_whitelist(exception.class)
53
+ !self.class.passes_message_allowlist(exception.class)
43
54
  @message = STRIPPED_EXCEPTION_REPLACEMENT_MESSAGE
44
55
  end
45
56
 
46
57
  @attributes_from_notice_error = nil
47
58
  @attributes = nil
48
59
  @timestamp = timestamp
49
- @expected = false
60
+ @expected = expected
50
61
  end
51
62
 
52
63
  def ==(other)
@@ -57,37 +68,29 @@ class NewRelic::NoticedError
57
68
  end
58
69
  end
59
70
 
60
- def self.passes_message_whitelist(exception_class)
61
- NewRelic::Agent.config[:'strip_exception_messages.whitelist'].any? do |klass|
71
+ def self.passes_message_allowlist(exception_class)
72
+ NewRelic::Agent.config[:'strip_exception_messages.allowed_classes'].any? do |klass|
62
73
  exception_class <= klass
63
74
  end
64
75
  end
65
76
 
66
77
  include NewRelic::Coerce
67
78
 
68
- def to_collector_array(encoder=nil)
69
- [ NewRelic::Helper.time_to_millis(timestamp),
79
+ def to_collector_array(encoder = nil)
80
+ [NewRelic::Helper.time_to_millis(timestamp),
70
81
  string(path),
71
82
  string(message),
72
83
  string(exception_class_name),
73
- processed_attributes ]
84
+ processed_attributes]
74
85
  end
75
86
 
76
- USER_ATTRIBUTES = "userAttributes".freeze
77
- AGENT_ATTRIBUTES = "agentAttributes".freeze
78
- INTRINSIC_ATTRIBUTES = "intrinsics".freeze
79
-
80
- EMPTY_HASH = {}.freeze
81
-
82
- DESTINATION = NewRelic::Agent::AttributeFilter::DST_ERROR_COLLECTOR
83
-
84
87
  # Note that we process attributes lazily and store the result. This is because
85
88
  # there is a possibility that a noticed error will be discarded and not sent back
86
89
  # as a traced error or TransactionError.
87
90
  def processed_attributes
88
91
  @processed_attributes ||= begin
89
92
  attributes = base_parameters
90
- merged_attributes = NewRelic::Agent::Transaction::Attributes.new(NewRelic::Agent.instance.attribute_filter)
93
+ merged_attributes = NewRelic::Agent::Attributes.new(NewRelic::Agent.instance.attribute_filter)
91
94
  append_attributes(attributes, USER_ATTRIBUTES, merged_custom_attributes(merged_attributes))
92
95
  append_attributes(attributes, AGENT_ATTRIBUTES, build_agent_attributes(merged_attributes))
93
96
  append_attributes(attributes, INTRINSIC_ATTRIBUTES, build_intrinsic_attributes)
@@ -97,10 +100,10 @@ class NewRelic::NoticedError
97
100
 
98
101
  def base_parameters
99
102
  params = {}
100
- params[:file_name] = file_name if file_name
101
- params[:line_number] = line_number if line_number
102
- params[:stack_trace] = stack_trace if stack_trace
103
- params[:'error.expected'] = expected
103
+ params[:file_name] = file_name if file_name
104
+ params[:line_number] = line_number if line_number
105
+ params[:stack_trace] = stack_trace if stack_trace
106
+ params[ERROR_EXPECTED_KEY.to_sym] = expected
104
107
  params
105
108
  end
106
109
 
@@ -129,11 +132,19 @@ class NewRelic::NoticedError
129
132
  end
130
133
  end
131
134
 
135
+ def build_error_attributes
136
+ @attributes_from_notice_error ||= {}
137
+ @attributes_from_notice_error[ERROR_MESSAGE_KEY] = string(message)
138
+ @attributes_from_notice_error[ERROR_CLASS_KEY] = string(exception_class_name)
139
+
140
+ @attributes_from_notice_error[ERROR_EXPECTED_KEY] = true if expected
141
+ end
142
+
132
143
  def build_agent_attributes(merged_attributes)
133
144
  agent_attributes = if @attributes
134
145
  @attributes.agent_attributes_for(DESTINATION)
135
146
  else
136
- EMPTY_HASH
147
+ NewRelic::EMPTY_HASH
137
148
  end
138
149
 
139
150
  # It's possible to override the request_uri from the transaction attributes
@@ -151,7 +162,7 @@ class NewRelic::NoticedError
151
162
  if @attributes
152
163
  @attributes.intrinsic_attributes_for(DESTINATION)
153
164
  else
154
- EMPTY_HASH
165
+ NewRelic::EMPTY_HASH
155
166
  end
156
167
  end
157
168
 
@@ -175,6 +186,9 @@ class NewRelic::NoticedError
175
186
  if exception.nil?
176
187
  @exception_class_name = UNKNOWN_ERROR_CLASS_NAME
177
188
  @message = NIL_ERROR_MESSAGE
189
+ elsif exception.is_a?(NewRelic::Agent::NoticeableError)
190
+ @exception_class_name = exception.class_name
191
+ @message = exception.message
178
192
  else
179
193
  if defined?(Rails::VERSION::MAJOR) && Rails::VERSION::MAJOR < 5 && exception.respond_to?(:original_exception)
180
194
  exception = exception.original_exception || exception
@@ -183,5 +197,4 @@ class NewRelic::NoticedError
183
197
  @message = exception.to_s
184
198
  end
185
199
  end
186
-
187
200
  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/event_listener'
6
6
  require 'new_relic/rack/agent_middleware'
@@ -1,8 +1,8 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
- require 'new_relic/agent/transaction_state'
5
+ require 'new_relic/agent/tracer'
6
6
  require 'new_relic/agent/instrumentation/controller_instrumentation'
7
7
  require 'new_relic/agent/instrumentation/middleware_tracing'
8
8
 
@@ -13,10 +13,10 @@ module NewRelic
13
13
 
14
14
  attr_reader :transaction_options, :category, :target
15
15
 
16
- def initialize(app, options={})
16
+ def initialize(app, options = {})
17
17
  @app = app
18
18
  @category = :middleware
19
- @target = self
19
+ @target = self
20
20
  @transaction_options = {
21
21
  :transaction_name => build_transaction_name
22
22
  }
@@ -33,11 +33,13 @@ module NewRelic
33
33
  # response code before it goes back to the client.
34
34
  def capture_http_response_code(state, result)
35
35
  return if NewRelic::Agent.config[:disable_middleware_instrumentation]
36
+
36
37
  super
37
38
  end
38
39
 
39
40
  def capture_response_content_type(state, result)
40
41
  return if NewRelic::Agent.config[:disable_middleware_instrumentation]
42
+
41
43
  super
42
44
  end
43
45
  end