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,12 +1,12 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  module NewRelic
6
6
  module Agent
7
7
  module Configuration
8
8
  class DottedHash < ::Hash
9
- def initialize(hash, keep_nesting=false)
9
+ def initialize(hash, keep_nesting = false)
10
10
  # Add the hash keys to our collection explicitly so they survive the
11
11
  # dot flattening. This is typical for full config source instances,
12
12
  # but not for uses of DottedHash serializing for transmission.
@@ -31,10 +31,12 @@ module NewRelic
31
31
  end
32
32
 
33
33
  protected
34
+
34
35
  # turns {'a' => {'b' => 'c'}} into {'a.b' => 'c'}
35
- def dot_flattened(nested_hash, names=[], result={})
36
+ def dot_flattened(nested_hash, names = [], result = {})
36
37
  nested_hash.each do |key, val|
37
- next if val == nil
38
+ next if val.nil?
39
+
38
40
  if val.respond_to?(:has_key?)
39
41
  dot_flattened(val, names + [key], result)
40
42
  else
@@ -44,7 +46,6 @@ module NewRelic
44
46
  result
45
47
  end
46
48
  end
47
-
48
49
  end
49
50
  end
50
51
  end
@@ -1,15 +1,16 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  module NewRelic
6
6
  module Agent
7
7
  module Configuration
8
8
  class EnvironmentSource < DottedHash
9
9
  SUPPORTED_PREFIXES = /^new_relic_|^newrelic_/i
10
- SPECIAL_CASE_KEYS = [
10
+ SPECIAL_CASE_KEYS = [
11
11
  'NEW_RELIC_ENV', # read by NewRelic::Control::Frameworks::Ruby
12
- 'NEW_RELIC_LOG' # read by set_log_file
12
+ 'NEW_RELIC_LOG', # read by set_log_file
13
+ /^NEW_RELIC_METADATA_/ # read by NewRelic::Agent::Connect::RequestBuilder
13
14
  ]
14
15
 
15
16
  attr_accessor :alias_map, :type_map
@@ -33,6 +34,7 @@ module NewRelic
33
34
  set_dotted_alias(config_setting)
34
35
 
35
36
  return unless value[:aliases]
37
+
36
38
  value[:aliases].each do |config_alias|
37
39
  self.alias_map[config_alias] = config_setting
38
40
  end
@@ -41,16 +43,16 @@ module NewRelic
41
43
  def set_dotted_alias(original_config_setting)
42
44
  config_setting = original_config_setting.to_s
43
45
 
44
- if config_setting.include? '.'
45
- config_alias = config_setting.gsub(/\./,'_').to_sym
46
+ if config_setting.include?('.')
47
+ config_alias = config_setting.tr('.', '_').to_sym
46
48
  self.alias_map[config_alias] = original_config_setting
47
49
  end
48
50
  end
49
51
 
50
52
  def set_log_file
51
53
  if ENV['NEW_RELIC_LOG']
52
- if ENV['NEW_RELIC_LOG'].upcase == 'STDOUT'
53
- self[:log_file_path] = self[:log_file_name] = 'STDOUT'
54
+ if ENV['NEW_RELIC_LOG'].casecmp(NewRelic::STANDARD_OUT) == 0
55
+ self[:log_file_path] = self[:log_file_name] = NewRelic::STANDARD_OUT
54
56
  else
55
57
  self[:log_file_path] = File.dirname(ENV['NEW_RELIC_LOG'])
56
58
  self[:log_file_name] = File.basename(ENV['NEW_RELIC_LOG'])
@@ -66,7 +68,8 @@ module NewRelic
66
68
  nr_env_var_keys = collect_new_relic_environment_variable_keys
67
69
 
68
70
  nr_env_var_keys.each do |key|
69
- next if SPECIAL_CASE_KEYS.include?(key.upcase)
71
+ next if SPECIAL_CASE_KEYS.any? { |pattern| pattern === key.upcase }
72
+
70
73
  set_value_from_environment_variable(key)
71
74
  end
72
75
  end
@@ -88,10 +91,12 @@ module NewRelic
88
91
  self[config_key] = value.to_f
89
92
  elsif type == Symbol
90
93
  self[config_key] = value.to_sym
94
+ elsif type == Array
95
+ self[config_key] = value.split(/\s*,\s*/)
91
96
  elsif type == NewRelic::Agent::Configuration::Boolean
92
97
  if value =~ /false|off|no/i
93
98
  self[config_key] = false
94
- elsif value != nil
99
+ elsif !value.nil?
95
100
  self[config_key] = true
96
101
  end
97
102
  else
@@ -109,7 +114,6 @@ module NewRelic
109
114
  def collect_new_relic_environment_variable_keys
110
115
  ENV.keys.select { |key| key.match(SUPPORTED_PREFIXES) }
111
116
  end
112
-
113
117
  end
114
118
  end
115
119
  end
@@ -0,0 +1,68 @@
1
+ # This file is distributed under New Relic's license terms.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
+
5
+ module NewRelic
6
+ module Agent
7
+ module Configuration
8
+ module EventHarvestConfig
9
+ extend self
10
+
11
+ EVENT_HARVEST_CONFIG_KEY_MAPPING = {
12
+ :analytic_event_data => :'transaction_events.max_samples_stored',
13
+ :custom_event_data => :'custom_insights_events.max_samples_stored',
14
+ :error_event_data => :'error_collector.max_event_samples_stored',
15
+ :log_event_data => :'application_logging.forwarding.max_samples_stored'
16
+ }
17
+
18
+ # not including span_event_data here because spans are handled separately in transform_span_event_harvest_config
19
+ EVENT_HARVEST_EVENT_REPORT_PERIOD_KEY_MAPPING = {
20
+ :analytic_event_data => :'transaction_event_data',
21
+ :custom_event_data => :'custom_event_data',
22
+ :error_event_data => :'error_event_data',
23
+ :log_event_data => :'log_event_data'
24
+ }
25
+
26
+ def from_config(config)
27
+ {:harvest_limits =>
28
+ EVENT_HARVEST_CONFIG_KEY_MAPPING.merge(
29
+ :span_event_data => :'span_events.max_samples_stored'
30
+ ).inject({}) do |connect_payload, (connect_payload_key, config_key)|
31
+ connect_payload[connect_payload_key] = config[config_key]
32
+ connect_payload
33
+ end}
34
+ end
35
+
36
+ def to_config_hash(connect_reply)
37
+ event_harvest_interval = connect_reply['event_harvest_config']['report_period_ms'] / 1000
38
+ config_hash = transform_event_harvest_config_keys(connect_reply, event_harvest_interval)
39
+ config_hash[:event_report_period] = event_harvest_interval
40
+ config_hash = transform_span_event_harvest_config(config_hash, connect_reply)
41
+ config_hash
42
+ end
43
+
44
+ private
45
+
46
+ def transform_event_harvest_config_keys(connect_reply, event_harvest_interval)
47
+ EVENT_HARVEST_CONFIG_KEY_MAPPING.inject({}) do |event_harvest_config, (connect_payload_key, config_key)|
48
+ if harvest_limit = connect_reply['event_harvest_config']['harvest_limits'][connect_payload_key.to_s]
49
+ event_harvest_config[config_key] = harvest_limit
50
+ report_period_key = :"event_report_period.#{EVENT_HARVEST_EVENT_REPORT_PERIOD_KEY_MAPPING[connect_payload_key]}"
51
+ event_harvest_config[report_period_key] = event_harvest_interval
52
+ end
53
+ event_harvest_config
54
+ end
55
+ end
56
+
57
+ def transform_span_event_harvest_config(config_hash, connect_reply)
58
+ if span_harvest = connect_reply['span_event_harvest_config']
59
+ config_hash[:'span_events.max_samples_stored'] = span_harvest['harvest_limit'] if span_harvest['harvest_limit']
60
+ config_hash[:'event_report_period.span_event_data'] = span_harvest['report_period_ms'] if span_harvest['report_period_ms']
61
+ end
62
+
63
+ config_hash
64
+ end
65
+ end
66
+ end
67
+ end
68
+ 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/configuration/dotted_hash'
6
6
 
@@ -10,16 +10,16 @@ module NewRelic
10
10
  class HighSecuritySource < DottedHash
11
11
  def initialize(local_settings)
12
12
  super({
13
- :capture_params => false,
14
- :'resque.capture_params' => false,
15
- :'sidekiq.capture_params' => false,
13
+ :capture_params => false,
14
+ :'attributes.include' => [],
16
15
 
17
16
  :'transaction_tracer.record_sql' => record_sql_setting(local_settings, :'transaction_tracer.record_sql'),
18
- :'slow_sql.record_sql' => record_sql_setting(local_settings, :'slow_sql.record_sql'),
19
- :'mongo.obfuscate_queries' => true,
17
+ :'slow_sql.record_sql' => record_sql_setting(local_settings, :'slow_sql.record_sql'),
18
+ :'mongo.obfuscate_queries' => true,
19
+ :'elasticsearch.obfuscate_queries' => true,
20
20
  :'transaction_tracer.record_redis_arguments' => false,
21
21
 
22
- :'custom_insights_events.enabled' => false,
22
+ :'custom_insights_events.enabled' => false,
23
23
  :'strip_exception_messages.enabled' => true
24
24
  })
25
25
  end
@@ -31,7 +31,7 @@ module NewRelic
31
31
  SET_TO_OBFUSCATED = [RAW, OBFUSCATED]
32
32
 
33
33
  def record_sql_setting(local_settings, key)
34
- original_value = local_settings[key]
34
+ original_value = local_settings[key]
35
35
  result = if SET_TO_OBFUSCATED.include?(original_value)
36
36
  OBFUSCATED
37
37
  else
@@ -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 'forwardable'
6
6
  require 'new_relic/agent/configuration/mask_defaults'
@@ -15,7 +15,6 @@ module NewRelic
15
15
  module Agent
16
16
  module Configuration
17
17
  class Manager
18
-
19
18
  # Defining these explicitly saves object allocations that we incur
20
19
  # if we use Forwardable and def_delegators.
21
20
  def [](key)
@@ -23,7 +22,7 @@ module NewRelic
23
22
  end
24
23
 
25
24
  def has_key?(key)
26
- @cache.has_key?[key]
25
+ @cache.has_key?(key)
27
26
  end
28
27
 
29
28
  def keys
@@ -32,11 +31,12 @@ module NewRelic
32
31
 
33
32
  def initialize
34
33
  reset_to_defaults
35
- @callbacks = Hash.new {|hash,key| hash[key] = [] }
34
+ @callbacks = Hash.new { |hash, key| hash[key] = [] }
36
35
  end
37
36
 
38
- def add_config_for_testing(source, level=0)
37
+ def add_config_for_testing(source, level = 0)
39
38
  raise 'Invalid config type for testing' unless [Hash, DottedHash].include?(source.class)
39
+
40
40
  invoke_callbacks(:add, source)
41
41
  @configs_for_testing << [source.freeze, level]
42
42
  reset_cache
@@ -46,12 +46,12 @@ module NewRelic
46
46
  def remove_config_type(sym)
47
47
  source = case sym
48
48
  when :security_policy then @security_policy_source
49
- when :high_security then @high_security_source
50
- when :environment then @environment_source
51
- when :server then @server_source
52
- when :manual then @manual_source
53
- when :yaml then @yaml_source
54
- when :default then @default_source
49
+ when :high_security then @high_security_source
50
+ when :environment then @environment_source
51
+ when :server then @server_source
52
+ when :manual then @manual_source
53
+ when :yaml then @yaml_source
54
+ when :default then @default_source
55
55
  end
56
56
 
57
57
  remove_config(source)
@@ -60,14 +60,14 @@ module NewRelic
60
60
  def remove_config(source)
61
61
  case source
62
62
  when SecurityPolicySource then @security_policy_source = nil
63
- when HighSecuritySource then @high_security_source = nil
64
- when EnvironmentSource then @environment_source = nil
65
- when ServerSource then @server_source = nil
66
- when ManualSource then @manual_source = nil
67
- when YamlSource then @yaml_source = nil
68
- when DefaultSource then @default_source = nil
63
+ when HighSecuritySource then @high_security_source = nil
64
+ when EnvironmentSource then @environment_source = nil
65
+ when ServerSource then @server_source = nil
66
+ when ManualSource then @manual_source = nil
67
+ when YamlSource then @yaml_source = nil
68
+ when DefaultSource then @default_source = nil
69
69
  else
70
- @configs_for_testing.delete_if {|src,lvl| src == source}
70
+ @configs_for_testing.delete_if { |src, lvl| src == source }
71
71
  end
72
72
 
73
73
  reset_cache
@@ -80,14 +80,15 @@ module NewRelic
80
80
  was_finished = finished_configuring?
81
81
 
82
82
  invoke_callbacks(:add, source)
83
+
83
84
  case source
84
85
  when SecurityPolicySource then @security_policy_source = source
85
- when HighSecuritySource then @high_security_source = source
86
- when EnvironmentSource then @environment_source = source
87
- when ServerSource then @server_source = source
88
- when ManualSource then @manual_source = source
89
- when YamlSource then @yaml_source = source
90
- when DefaultSource then @default_source = source
86
+ when HighSecuritySource then @high_security_source = source
87
+ when EnvironmentSource then @environment_source = source
88
+ when ServerSource then @server_source = source
89
+ when ManualSource then @manual_source = source
90
+ when YamlSource then @yaml_source = source
91
+ when DefaultSource then @default_source = source
91
92
  else
92
93
  NewRelic::Agent.logger.warn("Invalid config format; config will be ignored: #{source}")
93
94
  end
@@ -95,6 +96,7 @@ module NewRelic
95
96
  reset_cache
96
97
  log_config(:add, source)
97
98
 
99
+ notify_server_source_added if ServerSource === source
98
100
  notify_finished_configuring if !was_finished && finished_configuring?
99
101
  end
100
102
 
@@ -109,13 +111,12 @@ module NewRelic
109
111
  def fetch(key)
110
112
  config_stack.each do |config|
111
113
  next unless config
114
+
112
115
  accessor = key.to_sym
113
116
 
114
117
  if config.has_key?(accessor)
115
- evaluated = evaluate_procs(config[accessor])
116
-
117
118
  begin
118
- return apply_transformations(accessor, evaluated)
119
+ return evaluate_and_apply_transformations(accessor, config[accessor])
119
120
  rescue
120
121
  next
121
122
  end
@@ -133,6 +134,10 @@ module NewRelic
133
134
  end
134
135
  end
135
136
 
137
+ def evaluate_and_apply_transformations(key, value)
138
+ apply_transformations(key, evaluate_procs(value))
139
+ end
140
+
136
141
  def apply_transformations(key, value)
137
142
  if transform = transform_from_default(key)
138
143
  begin
@@ -152,27 +157,47 @@ module NewRelic
152
157
 
153
158
  def register_callback(key, &proc)
154
159
  @callbacks[key] << proc
155
- proc.call(@cache[key])
160
+ yield(@cache[key])
156
161
  end
157
162
 
158
163
  def invoke_callbacks(direction, source)
159
164
  return unless source
165
+
160
166
  source.keys.each do |key|
167
+ begin
168
+ # we need to evaluate and apply transformations for the value to deal with procs as values
169
+ # this is usually done by the fetch method when accessing config, however the callbacks bypass that
170
+ evaluated_cache = evaluate_and_apply_transformations(key, @cache[key])
171
+ evaluated_source = evaluate_and_apply_transformations(key, source[key])
172
+ rescue
173
+ next
174
+ end
161
175
 
162
- if @cache[key] != source[key]
176
+ if evaluated_cache != evaluated_source
163
177
  @callbacks[key].each do |proc|
164
178
  if direction == :add
165
- proc.call(source[key])
179
+ proc.call(evaluated_source)
166
180
  else
167
- proc.call(@cache[key])
181
+ proc.call(evaluated_cache)
168
182
  end
169
183
  end
170
184
  end
171
185
  end
172
186
  end
173
187
 
188
+ # This event is intended to be fired every time the server source is
189
+ # applied. This happens after the agent's initial connect, and again
190
+ # on every forced reconnect.
191
+ def notify_server_source_added
192
+ NewRelic::Agent.instance.events.notify(:server_source_configuration_added)
193
+ end
194
+
195
+ # This event is intended to be fired once during the entire lifespan of
196
+ # an agent run, after the server source has been applied for the first
197
+ # time. This should indicate that all configuration has been applied,
198
+ # and the main functions of the agent are safe to start.
174
199
  def notify_finished_configuring
175
- NewRelic::Agent.instance.events.notify(:finished_configuring)
200
+ NewRelic::Agent.instance.events.notify(:initial_configuration_complete)
176
201
  end
177
202
 
178
203
  def finished_configuring?
@@ -180,9 +205,9 @@ module NewRelic
180
205
  end
181
206
 
182
207
  def flattened
183
- config_stack.reverse.inject({}) do |flat,layer|
208
+ config_stack.reverse.inject({}) do |flat, layer|
184
209
  thawed_layer = layer.to_hash.dup
185
- thawed_layer.each do |k,v|
210
+ thawed_layer.each do |k, v|
186
211
  begin
187
212
  thawed_layer[k] = instance_eval(&v) if v.respond_to?(:call)
188
213
  rescue => e
@@ -196,9 +221,9 @@ module NewRelic
196
221
  end
197
222
 
198
223
  def apply_mask(hash)
199
- MASK_DEFAULTS. \
200
- select {|_, proc| proc.call}. \
201
- each {|key, _| hash.delete(key) }
224
+ MASK_DEFAULTS \
225
+ .select { |_, proc| proc.call } \
226
+ .each { |key, _| hash.delete(key) }
202
227
  hash
203
228
  end
204
229
 
@@ -216,18 +241,10 @@ module NewRelic
216
241
  end
217
242
  end
218
243
 
219
- def app_names
220
- case NewRelic::Agent.config[:app_name]
221
- when Array then NewRelic::Agent.config[:app_name]
222
- when String then NewRelic::Agent.config[:app_name].split(';')
223
- else []
224
- end
225
- end
226
-
227
244
  MALFORMED_LABELS_WARNING = "Skipping malformed labels configuration"
228
- PARSING_LABELS_FAILURE = "Failure during parsing labels. Ignoring and carrying on with connect."
245
+ PARSING_LABELS_FAILURE = "Failure during parsing labels. Ignoring and carrying on with connect."
229
246
 
230
- MAX_LABEL_COUNT = 64
247
+ MAX_LABEL_COUNT = 64
231
248
  MAX_LABEL_LENGTH = 255
232
249
 
233
250
  def parsed_labels
@@ -239,7 +256,7 @@ module NewRelic
239
256
  end
240
257
  rescue => e
241
258
  NewRelic::Agent.logger.error(PARSING_LABELS_FAILURE, e)
242
- []
259
+ NewRelic::EMPTY_ARRAY
243
260
  end
244
261
 
245
262
  def parse_labels_from_string
@@ -249,7 +266,7 @@ module NewRelic
249
266
  end
250
267
 
251
268
  def break_label_string_into_pairs(labels)
252
- stripped_labels = labels.strip.sub(/^;*/,'').sub(/;*$/,'')
269
+ stripped_labels = labels.strip.sub(/^;*/, '').sub(/;*$/, '')
253
270
  stripped_labels.split(';').map do |pair|
254
271
  pair.split(':').map(&:strip)
255
272
  end
@@ -265,10 +282,10 @@ module NewRelic
265
282
 
266
283
  def valid_label_item?(item)
267
284
  case item
268
- when String then !item.empty?
285
+ when String then !item.empty?
269
286
  when Numeric then true
270
- when true then true
271
- when false then true
287
+ when true then true
288
+ when false then true
272
289
  else false
273
290
  end
274
291
  end
@@ -278,21 +295,21 @@ module NewRelic
278
295
  pairs = Array(pairs)
279
296
 
280
297
  unless valid_label_pairs?(pairs)
281
- NewRelic::Agent.logger.warn("#{MALFORMED_LABELS_WARNING}: #{labels||pairs}")
282
- return []
298
+ NewRelic::Agent.logger.warn("#{MALFORMED_LABELS_WARNING}: #{labels || pairs}")
299
+ return NewRelic::EMPTY_ARRAY
283
300
  end
284
301
 
285
302
  pairs = limit_number_of_labels(pairs)
286
303
  pairs = remove_duplicates(pairs)
287
304
  pairs.map do |key, value|
288
305
  {
289
- 'label_type' => truncate(key),
306
+ 'label_type' => truncate(key),
290
307
  'label_value' => truncate(value.to_s, key)
291
308
  }
292
309
  end
293
310
  end
294
311
 
295
- def truncate(text, key=nil)
312
+ def truncate(text, key = nil)
296
313
  if text.length > MAX_LABEL_LENGTH
297
314
  if key
298
315
  msg = "The value for the label '#{key}' is longer than the allowed #{MAX_LABEL_LENGTH} and will be truncated. Value = '#{text}'"
@@ -300,7 +317,7 @@ module NewRelic
300
317
  msg = "Label name longer than the allowed #{MAX_LABEL_LENGTH} will be truncated. Name = '#{text}'"
301
318
  end
302
319
  NewRelic::Agent.logger.warn(msg)
303
- text[0..MAX_LABEL_LENGTH-1]
320
+ text[0..MAX_LABEL_LENGTH - 1]
304
321
  else
305
322
  text
306
323
  end
@@ -328,20 +345,20 @@ module NewRelic
328
345
  # Generally only useful during initial construction and tests
329
346
  def reset_to_defaults
330
347
  @security_policy_source = nil
331
- @high_security_source = nil
332
- @environment_source = EnvironmentSource.new
333
- @server_source = nil
334
- @manual_source = nil
335
- @yaml_source = nil
336
- @default_source = DefaultSource.new
348
+ @high_security_source = nil
349
+ @environment_source = EnvironmentSource.new
350
+ @server_source = nil
351
+ @manual_source = nil
352
+ @yaml_source = nil
353
+ @default_source = DefaultSource.new
337
354
 
338
- @configs_for_testing = []
355
+ @configs_for_testing = []
339
356
 
340
357
  reset_cache
341
358
  end
342
359
 
343
360
  def reset_cache
344
- @cache = Hash.new {|hash,key| hash[key] = self.fetch(key) }
361
+ @cache = Hash.new { |hash, key| hash[key] = self.fetch(key) }
345
362
  end
346
363
 
347
364
  def log_config(direction, source)
@@ -356,13 +373,13 @@ module NewRelic
356
373
 
357
374
  def delete_all_configs_for_testing
358
375
  @security_policy_source = nil
359
- @high_security_source = nil
360
- @environment_source = nil
361
- @server_source = nil
362
- @manual_source = nil
363
- @yaml_source = nil
364
- @default_source = nil
365
- @configs_for_testing = []
376
+ @high_security_source = nil
377
+ @environment_source = nil
378
+ @server_source = nil
379
+ @manual_source = nil
380
+ @yaml_source = nil
381
+ @default_source = nil
382
+ @configs_for_testing = []
366
383
  end
367
384
 
368
385
  def num_configs_for_testing
@@ -377,12 +394,12 @@ module NewRelic
377
394
 
378
395
  def config_stack
379
396
  stack = [@security_policy_source,
380
- @high_security_source,
381
- @environment_source,
382
- @server_source,
383
- @manual_source,
384
- @yaml_source,
385
- @default_source]
397
+ @high_security_source,
398
+ @environment_source,
399
+ @server_source,
400
+ @manual_source,
401
+ @yaml_source,
402
+ @default_source]
386
403
 
387
404
  stack.compact!
388
405
 
@@ -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/configuration/dotted_hash'
6
6
 
@@ -1,13 +1,13 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
4
 
5
5
  module NewRelic
6
6
  module Agent
7
7
  module Configuration
8
8
  MASK_DEFAULTS = {
9
- :'thread_profiler' => Proc.new { !NewRelic::Agent::Threading::BacktraceService.is_supported? },
10
- :'thread_profiler.enabled' => Proc.new { !NewRelic::Agent::Threading::BacktraceService.is_supported? }
9
+ :'thread_profiler' => proc { !NewRelic::Agent::Threading::BacktraceService.is_supported? },
10
+ :'thread_profiler.enabled' => proc { !NewRelic::Agent::Threading::BacktraceService.is_supported? }
11
11
  }
12
12
  end
13
13
  end