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,24 +1,24 @@
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/transaction/segment'
6
- require 'new_relic/agent/cross_app_tracing'
6
+ require 'new_relic/agent/distributed_tracing/cross_app_tracing'
7
7
 
8
8
  module NewRelic
9
9
  module Agent
10
10
  class Transaction
11
11
  class MessageBrokerSegment < Segment
12
- CONSUME = 'Consume'.freeze
12
+ CONSUME = 'Consume'.freeze
13
13
  EXCHANGE = 'Exchange'.freeze
14
- NAMED = 'Named/'.freeze
15
- PRODUCE = 'Produce'.freeze
16
- QUEUE = 'Queue'.freeze
17
- PURGE = 'Purge'.freeze
18
- SLASH = '/'.freeze
19
- TEMP = 'Temp'.freeze
20
- TOPIC = 'Topic'.freeze
21
- UNKNOWN = 'Unknown'.freeze
14
+ NAMED = 'Named/'.freeze
15
+ PRODUCE = 'Produce'.freeze
16
+ QUEUE = 'Queue'.freeze
17
+ PURGE = 'Purge'.freeze
18
+ SLASH = '/'.freeze
19
+ TEMP = 'Temp'.freeze
20
+ TOPIC = 'Topic'.freeze
21
+ UNKNOWN = 'Unknown'.freeze
22
22
 
23
23
  DESTINATION_TYPES = [
24
24
  :exchange,
@@ -36,35 +36,29 @@ module NewRelic
36
36
  }
37
37
 
38
38
  TYPES = {
39
- exchange: EXCHANGE,
39
+ exchange: EXCHANGE,
40
40
  temporary_queue: QUEUE,
41
- queue: QUEUE,
41
+ queue: QUEUE,
42
42
  temporary_topic: TOPIC,
43
- topic: TOPIC,
44
- unknown: EXCHANGE
43
+ topic: TOPIC,
44
+ unknown: EXCHANGE
45
45
  }
46
46
 
47
47
  METRIC_PREFIX = 'MessageBroker/'.freeze
48
48
 
49
49
  attr_reader :action,
50
- :destination_name,
51
- :destination_type,
52
- :library,
53
- :headers
54
-
55
- def initialize action: nil,
56
- library: nil,
57
- destination_type: nil,
58
- destination_name: nil,
59
- headers: nil,
60
- parameters: nil,
61
- start_time: nil
62
-
63
- # ruby 2.0.0 does not support required kwargs
64
- raise ArgumentError, 'missing required argument: action' if action.nil?
65
- raise ArgumentError, 'missing required argument: library' if library.nil?
66
- raise ArgumentError, 'missing required argument: destination_type' if destination_type.nil?
67
- raise ArgumentError, 'missing required argument: destination_name' if destination_name.nil?
50
+ :destination_name,
51
+ :destination_type,
52
+ :library,
53
+ :headers
54
+
55
+ def initialize(action:,
56
+ library:,
57
+ destination_type:,
58
+ destination_name:,
59
+ headers: nil,
60
+ parameters: nil,
61
+ start_time: nil)
68
62
 
69
63
  @action = action
70
64
  @library = library
@@ -72,11 +66,12 @@ module NewRelic
72
66
  @destination_name = destination_name
73
67
  @headers = headers
74
68
  super(nil, nil, start_time)
75
- params.merge! parameters if parameters
69
+ params.merge!(parameters) if parameters
76
70
  end
77
71
 
78
72
  def name
79
73
  return @name if @name
74
+
80
75
  @name = METRIC_PREFIX + library
81
76
  @name << SLASH << TYPES[destination_type] << SLASH << ACTIONS[action] << SLASH
82
77
 
@@ -89,21 +84,14 @@ module NewRelic
89
84
  @name
90
85
  end
91
86
 
92
- NEWRELIC_TRACE_KEY = "newrelic".freeze
93
-
94
- def insert_distributed_trace_header
95
- return unless Agent.config[:'distributed_tracing.enabled']
96
- payload = transaction.create_distributed_trace_payload
97
- headers[NEWRELIC_TRACE_KEY] = payload.http_safe if payload
98
- end
99
-
100
87
  def transaction_assigned
101
88
  if headers && transaction && action == :produce && record_metrics?
102
- insert_distributed_trace_header
103
- transaction.add_message_cat_headers headers if CrossAppTracing.cross_app_enabled?
89
+ transaction.distributed_tracer.insert_distributed_trace_header(headers)
90
+ transaction.distributed_tracer.insert_cat_headers(headers)
91
+ transaction.distributed_tracer.log_request_headers(headers)
104
92
  end
105
93
  rescue => e
106
- NewRelic::Agent.logger.error "Error during message header processing", e
94
+ NewRelic::Agent.logger.error("Error during message header processing", e)
107
95
  end
108
96
  end
109
97
  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/http_clients/uri_util'
6
6
 
@@ -9,60 +9,60 @@ module NewRelic
9
9
  class Transaction
10
10
  class RequestAttributes
11
11
  attr_reader :request_path, :referer, :accept, :content_length, :content_type,
12
- :host, :port, :user_agent, :request_method
12
+ :host, :port, :user_agent, :request_method
13
13
 
14
14
  HTTP_ACCEPT_HEADER_KEY = "HTTP_ACCEPT".freeze
15
15
 
16
- def initialize request
17
- @request_path = path_from_request request
18
- @referer = referer_from_request request
19
- @accept = attribute_from_env request, HTTP_ACCEPT_HEADER_KEY
20
- @content_length = content_length_from_request request
21
- @content_type = attribute_from_request request, :content_type
22
- @host = attribute_from_request request, :host
23
- @port = port_from_request request
24
- @user_agent = attribute_from_request request, :user_agent
25
- @request_method = attribute_from_request request, :request_method
16
+ def initialize(request)
17
+ @request_path = path_from_request(request)
18
+ @referer = referer_from_request(request)
19
+ @accept = attribute_from_env(request, HTTP_ACCEPT_HEADER_KEY)
20
+ @content_length = content_length_from_request(request)
21
+ @content_type = attribute_from_request(request, :content_type)
22
+ @host = attribute_from_request(request, :host)
23
+ @port = port_from_request(request)
24
+ @user_agent = attribute_from_request(request, :user_agent)
25
+ @request_method = attribute_from_request(request, :request_method)
26
26
  end
27
27
 
28
- def assign_agent_attributes txn
29
- default_destinations = AttributeFilter::DST_TRANSACTION_TRACER|
30
- AttributeFilter::DST_TRANSACTION_EVENTS|
31
- AttributeFilter::DST_ERROR_COLLECTOR
28
+ def assign_agent_attributes(txn)
29
+ default_destinations = AttributeFilter::DST_TRANSACTION_TRACER |
30
+ AttributeFilter::DST_TRANSACTION_EVENTS |
31
+ AttributeFilter::DST_ERROR_COLLECTOR
32
32
 
33
33
  if referer
34
- txn.add_agent_attribute :'request.headers.referer', referer, AttributeFilter::DST_ERROR_COLLECTOR
34
+ txn.add_agent_attribute(:'request.headers.referer', referer, AttributeFilter::DST_ERROR_COLLECTOR)
35
35
  end
36
36
 
37
37
  if request_path
38
- txn.add_agent_attribute :'request.uri',
39
- request_path,
40
- AttributeFilter::DST_TRANSACTION_TRACER |
41
- AttributeFilter::DST_ERROR_COLLECTOR
38
+ txn.add_agent_attribute(:'request.uri',
39
+ request_path,
40
+ AttributeFilter::DST_TRANSACTION_TRACER |
41
+ AttributeFilter::DST_ERROR_COLLECTOR)
42
42
  end
43
43
 
44
44
  if accept
45
- txn.add_agent_attribute :'request.headers.accept', accept, default_destinations
45
+ txn.add_agent_attribute(:'request.headers.accept', accept, default_destinations)
46
46
  end
47
47
 
48
48
  if content_length
49
- txn.add_agent_attribute :'request.headers.contentLength', content_length, default_destinations
49
+ txn.add_agent_attribute(:'request.headers.contentLength', content_length, default_destinations)
50
50
  end
51
51
 
52
52
  if content_type
53
- txn.add_agent_attribute :'request.headers.contentType', content_type, default_destinations
53
+ txn.add_agent_attribute(:'request.headers.contentType', content_type, default_destinations)
54
54
  end
55
55
 
56
56
  if host
57
- txn.add_agent_attribute :'request.headers.host', host, default_destinations
57
+ txn.add_agent_attribute(:'request.headers.host', host, default_destinations)
58
58
  end
59
59
 
60
60
  if user_agent
61
- txn.add_agent_attribute :'request.headers.userAgent', user_agent, default_destinations
61
+ txn.add_agent_attribute(:'request.headers.userAgent', user_agent, default_destinations)
62
62
  end
63
63
 
64
64
  if request_method
65
- txn.add_agent_attribute :'request.method', request_method, default_destinations
65
+ txn.add_agent_attribute(:'request.method', request_method, default_destinations)
66
66
  end
67
67
  end
68
68
 
@@ -71,9 +71,9 @@ module NewRelic
71
71
  # Make a safe attempt to get the referer from a request object, generally successful when
72
72
  # it's a Rack request.
73
73
 
74
- def referer_from_request request
74
+ def referer_from_request(request)
75
75
  if referer = attribute_from_request(request, :referer)
76
- HTTPClients::URIUtil.strip_query_string referer.to_s
76
+ HTTPClients::URIUtil.strip_query_string(referer.to_s)
77
77
  end
78
78
  end
79
79
 
@@ -87,31 +87,31 @@ module NewRelic
87
87
 
88
88
  ROOT_PATH = "/".freeze
89
89
 
90
- def path_from_request request
90
+ def path_from_request(request)
91
91
  path = attribute_from_request(request, :path) || ''
92
92
  path = HTTPClients::URIUtil.strip_query_string(path)
93
93
  path.empty? ? ROOT_PATH : path
94
94
  end
95
95
 
96
- def content_length_from_request request
96
+ def content_length_from_request(request)
97
97
  if content_length = attribute_from_request(request, :content_length)
98
98
  content_length.to_i
99
99
  end
100
100
  end
101
101
 
102
- def port_from_request request
102
+ def port_from_request(request)
103
103
  if port = attribute_from_request(request, :port)
104
104
  port.to_i
105
105
  end
106
106
  end
107
107
 
108
- def attribute_from_request request, attribute_method
109
- if request.respond_to? attribute_method
108
+ def attribute_from_request(request, attribute_method)
109
+ if request.respond_to?(attribute_method)
110
110
  request.send(attribute_method)
111
111
  end
112
112
  end
113
113
 
114
- def attribute_from_env request, key
114
+ def attribute_from_env(request, key)
115
115
  if env = attribute_from_request(request, :env)
116
116
  env[key]
117
117
  end
@@ -1,9 +1,10 @@
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/transaction/abstract_segment'
6
6
  require 'new_relic/agent/span_event_primitive'
7
+ require 'new_relic/agent/attributes'
7
8
 
8
9
  module NewRelic
9
10
  module Agent
@@ -12,27 +13,59 @@ module NewRelic
12
13
  # unscoped_metrics can be nil, a string, or array. we do this to save
13
14
  # object allocations. if allocations weren't important then we would
14
15
  # initialize it as an array that would be empty, have one item, or many items.
15
- attr_reader :unscoped_metrics
16
+ attr_reader :unscoped_metrics, :custom_transaction_attributes
16
17
 
17
- def initialize name=nil, unscoped_metrics=nil, start_time=nil
18
+ def initialize(name = nil, unscoped_metrics = nil, start_time = nil)
18
19
  @unscoped_metrics = unscoped_metrics
19
- super name, start_time
20
+ super(name, start_time)
21
+ end
22
+
23
+ def attributes
24
+ @attributes ||= Attributes.new(NewRelic::Agent.instance.attribute_filter)
25
+ end
26
+
27
+ def add_agent_attribute(key, value, default_destinations = AttributeFilter::DST_SPAN_EVENTS)
28
+ attributes.add_agent_attribute(key, value, default_destinations)
29
+ end
30
+
31
+ def self.merge_untrusted_agent_attributes(attributes, prefix, default_destinations)
32
+ if segment = NewRelic::Agent::Tracer.current_segment
33
+ segment.merge_untrusted_agent_attributes(attributes, prefix, default_destinations)
34
+ else
35
+ NewRelic::Agent.logger.debug("Attempted to merge untrusted attributes without segment")
36
+ end
37
+ end
38
+
39
+ def merge_untrusted_agent_attributes(agent_attributes, prefix, default_destinations)
40
+ return if agent_attributes.nil?
41
+
42
+ attributes.merge_untrusted_agent_attributes(agent_attributes, prefix, default_destinations)
43
+ end
44
+
45
+ def add_custom_attributes(p)
46
+ attributes.merge_custom_attributes(p)
47
+ end
48
+
49
+ def self.finish(segment)
50
+ return unless segment
51
+
52
+ segment.finish
20
53
  end
21
54
 
22
55
  private
23
56
 
24
57
  def record_metrics
25
58
  if record_scoped_metric?
26
- metric_cache.record_scoped_and_unscoped name, duration, exclusive_duration
59
+ metric_cache.record_scoped_and_unscoped(name, duration, exclusive_duration)
27
60
  else
28
- append_unscoped_metric name
61
+ append_unscoped_metric(name)
29
62
  end
30
63
  if unscoped_metrics
31
- metric_cache.record_unscoped unscoped_metrics, duration, exclusive_duration
64
+ metric_cache.record_unscoped(unscoped_metrics, duration, exclusive_duration)
32
65
  end
33
66
  end
34
67
 
35
- def append_unscoped_metric metric
68
+ def append_unscoped_metric(metric)
36
69
  if @unscoped_metrics
37
70
  if Array === @unscoped_metrics
38
71
  if unscoped_metrics.frozen?
@@ -53,8 +86,11 @@ module NewRelic
53
86
  end
54
87
 
55
88
  def record_span_event
89
+ # don't record a span event if the transaction is ignored
90
+ return if transaction.ignore?
91
+
56
92
  aggregator = ::NewRelic::Agent.agent.span_event_aggregator
57
- priority = transaction.priority
93
+ priority = transaction.priority
58
94
 
59
95
  aggregator.record(priority: priority) do
60
96
  SpanEventPrimitive.for_segment(self)
@@ -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/transaction/transaction_sample_buffer'
6
6
 
@@ -8,7 +8,6 @@ module NewRelic
8
8
  module Agent
9
9
  class Transaction
10
10
  class SlowestSampleBuffer < TransactionSampleBuffer
11
-
12
11
  CAPACITY = 1
13
12
 
14
13
  def capacity
@@ -18,7 +17,6 @@ module NewRelic
18
17
  def allow_sample?(sample)
19
18
  sample.threshold && sample.duration >= sample.threshold
20
19
  end
21
-
22
20
  end
23
21
  end
24
22
  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/transaction/transaction_sample_buffer'
6
6
 
@@ -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/transaction/trace_node'
6
6
 
@@ -11,8 +11,8 @@ module NewRelic
11
11
  class FinishedTraceError < StandardError; end
12
12
 
13
13
  attr_reader :start_time, :root_node
14
- attr_accessor :transaction_name, :guid, :xray_session_id, :attributes,
15
- :node_count, :finished, :threshold, :profile
14
+ attr_accessor :transaction_name, :guid, :attributes,
15
+ :node_count, :finished, :threshold, :profile
16
16
 
17
17
  ROOT = "ROOT".freeze
18
18
 
@@ -31,7 +31,8 @@ module NewRelic
31
31
  node_count = 0
32
32
  each_node do |node|
33
33
  next if node == root_node
34
- node_count +=1
34
+
35
+ node_count += 1
35
36
  end
36
37
  node_count
37
38
  end
@@ -40,11 +41,6 @@ module NewRelic
40
41
  self.root_node.duration
41
42
  end
42
43
 
43
- def forced?
44
- return true if NewRelic::Coerce.int_or_nil(xray_session_id)
45
- false
46
- end
47
-
48
44
  def synthetics_resource_id
49
45
  intrinsic_attributes = attributes.intrinsic_attributes_for(NewRelic::Agent::AttributeFilter::DST_TRANSACTION_TRACER)
50
46
  intrinsic_attributes[:synthetics_resource_id]
@@ -55,7 +51,8 @@ module NewRelic
55
51
  end
56
52
 
57
53
  def create_node(time_since_start, metric_name = nil)
58
- raise FinishedTraceError.new "Can't create additional node for finished trace." if self.finished
54
+ raise FinishedTraceError.new("Can't create additional node for finished trace.") if self.finished
55
+
59
56
  self.node_count += 1
60
57
  NewRelic::Agent::Transaction::TraceNode.new(metric_name, time_since_start)
61
58
  end
@@ -80,6 +77,7 @@ module NewRelic
80
77
 
81
78
  def collect_explain_plans!
82
79
  return unless NewRelic::Agent::Database.should_collect_explain_plans?
80
+
83
81
  threshold = NewRelic::Agent.config[:'transaction_tracer.explain_threshold']
84
82
 
85
83
  each_node do |node|
@@ -92,6 +90,7 @@ module NewRelic
92
90
  def prepare_sql_for_transmission!
93
91
  each_node do |node|
94
92
  next unless node[:sql]
93
+
95
94
  node[:sql] = node[:sql].safe_sql
96
95
  end
97
96
  end
@@ -108,31 +107,29 @@ module NewRelic
108
107
  @root_node.each_node_with_nest_tracking(&block)
109
108
  end
110
109
 
111
- AGENT_ATTRIBUTES_KEY = 'agentAttributes'.freeze
112
- USER_ATTRIBUTES_KEY = 'userAttributes'.freeze
110
+ AGENT_ATTRIBUTES_KEY = 'agentAttributes'.freeze
111
+ USER_ATTRIBUTES_KEY = 'userAttributes'.freeze
113
112
  INTRINSIC_ATTRIBUTES_KEY = 'intrinsics'.freeze
114
113
 
115
114
  def attributes_for_tracer_destination
116
115
  destination = NewRelic::Agent::AttributeFilter::DST_TRANSACTION_TRACER
117
116
 
118
- agent_attributes = self.attributes.agent_attributes_for(destination)
119
- custom_attributes = self.attributes.custom_attributes_for(destination)
117
+ agent_attributes = self.attributes.agent_attributes_for(destination)
118
+ custom_attributes = self.attributes.custom_attributes_for(destination)
120
119
  intrinsic_attributes = self.attributes.intrinsic_attributes_for(destination)
121
120
 
122
121
  {
123
- AGENT_ATTRIBUTES_KEY => agent_attributes,
124
- USER_ATTRIBUTES_KEY => custom_attributes,
122
+ AGENT_ATTRIBUTES_KEY => agent_attributes,
123
+ USER_ATTRIBUTES_KEY => custom_attributes,
125
124
  INTRINSIC_ATTRIBUTES_KEY => intrinsic_attributes
126
125
  }
127
126
  end
128
127
 
129
- EMPTY_HASH = {}.freeze
130
-
131
- def trace_tree attributes_hash
128
+ def trace_tree(attributes_hash)
132
129
  [
133
130
  NewRelic::Coerce.float(self.start_time),
134
- EMPTY_HASH,
135
- EMPTY_HASH,
131
+ NewRelic::EMPTY_HASH,
132
+ NewRelic::EMPTY_HASH,
136
133
  self.root_node.to_array,
137
134
  attributes_hash
138
135
  ]
@@ -148,8 +145,8 @@ module NewRelic
148
145
  encoder.encode(trace_tree(attributes_hash)),
149
146
  NewRelic::Coerce.string(self.guid),
150
147
  nil,
151
- forced?,
152
- NewRelic::Coerce.int_or_nil(xray_session_id),
148
+ false, # forced?,
149
+ nil, # NewRelic::Coerce.int_or_nil(xray_session_id),
153
150
  NewRelic::Coerce.string(self.synthetics_resource_id)
154
151
  ]
155
152
  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/transaction/trace'
@@ -12,10 +12,10 @@ module NewRelic
12
12
  module TraceBuilder
13
13
  extend self
14
14
 
15
- def build_trace transaction
16
- trace = Trace.new transaction.start_time
15
+ def build_trace(transaction)
16
+ trace = Trace.new(transaction.start_time)
17
17
  trace.root_node.exit_timestamp = transaction.end_time - transaction.start_time
18
- copy_attributes transaction, trace
18
+ copy_attributes(transaction, trace)
19
19
  first, *rest = transaction.segments
20
20
  relationship_map = rest.group_by { |s| s.parent }
21
21
  trace.root_node.children << process_segments(transaction, first, trace.root_node, relationship_map)
@@ -25,30 +25,29 @@ module NewRelic
25
25
  private
26
26
 
27
27
  # recursively builds a transaction trace from the flat list of segments
28
- def process_segments transaction, segment, parent, relationship_map
29
- current = create_trace_node transaction, segment, parent
28
+ def process_segments(transaction, segment, parent, relationship_map)
29
+ current = create_trace_node(transaction, segment, parent)
30
30
 
31
31
  if children = relationship_map[segment]
32
32
  current.children = children.map! do |child|
33
- process_segments transaction, child, current, relationship_map
33
+ process_segments(transaction, child, current, relationship_map)
34
34
  end
35
35
  end
36
36
 
37
37
  current
38
38
  end
39
39
 
40
- def create_trace_node transaction, segment, parent
40
+ def create_trace_node(transaction, segment, parent)
41
41
  relative_start = segment.start_time - transaction.start_time
42
42
  relative_end = segment.end_time - transaction.start_time
43
- TraceNode.new segment.name, relative_start, relative_end, segment.params, parent
43
+ TraceNode.new(segment.name, relative_start, relative_end, segment.params, parent)
44
44
  end
45
45
 
46
- def copy_attributes transaction, trace
46
+ def copy_attributes(transaction, trace)
47
47
  trace.transaction_name = transaction.best_name
48
48
  trace.guid = transaction.guid
49
49
  trace.attributes = transaction.attributes
50
50
  trace.threshold = transaction.threshold
51
- trace.xray_session_id = transaction.xray_session_id
52
51
  trace.finished = true
53
52
  end
54
53
  end