newrelic_rpm 8.10.0 → 8.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (391) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +32 -190
  4. data/.rubocop_todo.yml +52 -0
  5. data/.simplecov +11 -2
  6. data/CHANGELOG.md +91 -26
  7. data/Gemfile +0 -1
  8. data/README.md +1 -1
  9. data/Rakefile +3 -20
  10. data/Thorfile +5 -0
  11. data/bin/nrdebug +63 -43
  12. data/config.dot +5 -5
  13. data/init.rb +1 -2
  14. data/install.rb +1 -2
  15. data/lib/new_relic/agent/adaptive_sampler.rb +0 -1
  16. data/lib/new_relic/agent/agent/shutdown.rb +0 -1
  17. data/lib/new_relic/agent/agent/special_startup.rb +0 -1
  18. data/lib/new_relic/agent/agent/start_worker_thread.rb +0 -1
  19. data/lib/new_relic/agent/agent/startup.rb +0 -1
  20. data/lib/new_relic/agent/agent.rb +100 -73
  21. data/lib/new_relic/agent/agent_logger.rb +4 -5
  22. data/lib/new_relic/agent/attribute_filter.rb +39 -21
  23. data/lib/new_relic/agent/attribute_processing.rb +3 -4
  24. data/lib/new_relic/agent/attributes.rb +0 -1
  25. data/lib/new_relic/agent/audit_logger.rb +2 -3
  26. data/lib/new_relic/agent/autostart.rb +0 -1
  27. data/lib/new_relic/agent/chained_call.rb +0 -1
  28. data/lib/new_relic/agent/commands/agent_command.rb +0 -1
  29. data/lib/new_relic/agent/commands/agent_command_router.rb +3 -4
  30. data/lib/new_relic/agent/commands/thread_profiler_session.rb +0 -1
  31. data/lib/new_relic/agent/configuration/default_source.rb +56 -27
  32. data/lib/new_relic/agent/configuration/dotted_hash.rb +1 -2
  33. data/lib/new_relic/agent/configuration/environment_source.rb +3 -4
  34. data/lib/new_relic/agent/configuration/event_harvest_config.rb +0 -1
  35. data/lib/new_relic/agent/configuration/high_security_source.rb +0 -1
  36. data/lib/new_relic/agent/configuration/manager.rb +1 -2
  37. data/lib/new_relic/agent/configuration/manual_source.rb +0 -1
  38. data/lib/new_relic/agent/configuration/mask_defaults.rb +2 -3
  39. data/lib/new_relic/agent/configuration/security_policy_source.rb +0 -1
  40. data/lib/new_relic/agent/configuration/server_source.rb +0 -1
  41. data/lib/new_relic/agent/configuration/yaml_source.rb +2 -3
  42. data/lib/new_relic/agent/configuration.rb +0 -1
  43. data/lib/new_relic/agent/connect/request_builder.rb +1 -2
  44. data/lib/new_relic/agent/connect/response_handler.rb +1 -2
  45. data/lib/new_relic/agent/custom_event_aggregator.rb +0 -1
  46. data/lib/new_relic/agent/database/explain_plan_helpers.rb +0 -1
  47. data/lib/new_relic/agent/database/obfuscation_helpers.rb +0 -1
  48. data/lib/new_relic/agent/database/obfuscator.rb +0 -1
  49. data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +0 -1
  50. data/lib/new_relic/agent/database.rb +13 -14
  51. data/lib/new_relic/agent/database_adapter.rb +0 -1
  52. data/lib/new_relic/agent/datastores/metric_helper.rb +0 -4
  53. data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +2 -3
  54. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +1 -4
  55. data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +0 -1
  56. data/lib/new_relic/agent/datastores/mongo.rb +0 -1
  57. data/lib/new_relic/agent/datastores/redis.rb +0 -1
  58. data/lib/new_relic/agent/datastores.rb +0 -1
  59. data/lib/new_relic/agent/deprecator.rb +0 -1
  60. data/lib/new_relic/agent/distributed_tracing/cross_app_payload.rb +0 -1
  61. data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +0 -1
  62. data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +0 -1
  63. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +0 -1
  64. data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +0 -2
  65. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +0 -1
  66. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +0 -1
  67. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +0 -1
  68. data/lib/new_relic/agent/distributed_tracing.rb +0 -1
  69. data/lib/new_relic/agent/encoding_normalizer.rb +0 -1
  70. data/lib/new_relic/agent/error_collector.rb +0 -1
  71. data/lib/new_relic/agent/error_event_aggregator.rb +0 -1
  72. data/lib/new_relic/agent/error_filter.rb +4 -5
  73. data/lib/new_relic/agent/error_trace_aggregator.rb +1 -2
  74. data/lib/new_relic/agent/event_aggregator.rb +0 -1
  75. data/lib/new_relic/agent/event_buffer.rb +0 -1
  76. data/lib/new_relic/agent/event_listener.rb +0 -1
  77. data/lib/new_relic/agent/event_loop.rb +2 -3
  78. data/lib/new_relic/agent/external.rb +1 -2
  79. data/lib/new_relic/agent/guid_generator.rb +0 -1
  80. data/lib/new_relic/agent/harvester.rb +0 -1
  81. data/lib/new_relic/agent/heap.rb +2 -3
  82. data/lib/new_relic/agent/hostname.rb +0 -1
  83. data/lib/new_relic/agent/http_clients/abstract.rb +0 -1
  84. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +0 -1
  85. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +0 -1
  86. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +1 -2
  87. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +1 -2
  88. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +0 -1
  89. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +1 -2
  90. data/lib/new_relic/agent/http_clients/uri_util.rb +0 -1
  91. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +0 -1
  92. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +8 -5
  93. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +1 -2
  94. data/lib/new_relic/agent/instrumentation/active_job.rb +0 -1
  95. data/lib/new_relic/agent/instrumentation/active_merchant.rb +2 -2
  96. data/lib/new_relic/agent/instrumentation/active_record.rb +0 -1
  97. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +0 -1
  98. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +0 -1
  99. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +0 -1
  100. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +0 -1
  101. data/lib/new_relic/agent/instrumentation/active_storage.rb +0 -1
  102. data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +0 -1
  103. data/lib/new_relic/agent/instrumentation/active_support_logger/chain.rb +0 -1
  104. data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +0 -1
  105. data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +0 -1
  106. data/lib/new_relic/agent/instrumentation/active_support_logger.rb +0 -1
  107. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -1
  108. data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -1
  109. data/lib/new_relic/agent/instrumentation/bunny/chain.rb +0 -1
  110. data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +0 -1
  111. data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +0 -1
  112. data/lib/new_relic/agent/instrumentation/bunny.rb +0 -1
  113. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +2 -3
  114. data/lib/new_relic/agent/instrumentation/curb/chain.rb +0 -1
  115. data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +14 -11
  116. data/lib/new_relic/agent/instrumentation/curb/prepend.rb +0 -1
  117. data/lib/new_relic/agent/instrumentation/curb.rb +0 -1
  118. data/lib/new_relic/agent/instrumentation/data_mapper.rb +1 -2
  119. data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +0 -1
  120. data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +0 -1
  121. data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +0 -1
  122. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +0 -1
  123. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +0 -1
  124. data/lib/new_relic/agent/instrumentation/excon.rb +0 -1
  125. data/lib/new_relic/agent/instrumentation/grape/chain.rb +0 -1
  126. data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +0 -1
  127. data/lib/new_relic/agent/instrumentation/grape/prepend.rb +0 -1
  128. data/lib/new_relic/agent/instrumentation/grape.rb +0 -1
  129. data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +0 -9
  130. data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +10 -9
  131. data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +0 -6
  132. data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +0 -1
  133. data/lib/new_relic/agent/instrumentation/grpc/helper.rb +2 -1
  134. data/lib/new_relic/agent/instrumentation/grpc/server/chain.rb +0 -1
  135. data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +0 -1
  136. data/lib/new_relic/agent/instrumentation/grpc/server/rpc_desc_prepend.rb +0 -1
  137. data/lib/new_relic/agent/instrumentation/grpc/server/rpc_server_prepend.rb +0 -1
  138. data/lib/new_relic/agent/instrumentation/grpc_client.rb +0 -1
  139. data/lib/new_relic/agent/instrumentation/grpc_server.rb +0 -1
  140. data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +0 -1
  141. data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +0 -1
  142. data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +0 -1
  143. data/lib/new_relic/agent/instrumentation/httpclient.rb +0 -1
  144. data/lib/new_relic/agent/instrumentation/httprb/chain.rb +0 -1
  145. data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +0 -1
  146. data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +0 -1
  147. data/lib/new_relic/agent/instrumentation/httprb.rb +0 -1
  148. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +0 -1
  149. data/lib/new_relic/agent/instrumentation/logger/chain.rb +0 -1
  150. data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +0 -1
  151. data/lib/new_relic/agent/instrumentation/logger/prepend.rb +0 -1
  152. data/lib/new_relic/agent/instrumentation/logger.rb +0 -1
  153. data/lib/new_relic/agent/instrumentation/memcache/chain.rb +0 -1
  154. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +1 -2
  155. data/lib/new_relic/agent/instrumentation/memcache/helper.rb +0 -1
  156. data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +0 -1
  157. data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +1 -2
  158. data/lib/new_relic/agent/instrumentation/memcache.rb +4 -5
  159. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +1 -2
  160. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +0 -1
  161. data/lib/new_relic/agent/instrumentation/mongo.rb +0 -1
  162. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +1 -2
  163. data/lib/new_relic/agent/instrumentation/net_http/chain.rb +0 -1
  164. data/lib/new_relic/agent/instrumentation/net_http/instrumentation.rb +0 -1
  165. data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +0 -1
  166. data/lib/new_relic/agent/instrumentation/net_http.rb +0 -1
  167. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +2 -3
  168. data/lib/new_relic/agent/instrumentation/padrino/chain.rb +0 -1
  169. data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +0 -1
  170. data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +0 -1
  171. data/lib/new_relic/agent/instrumentation/padrino.rb +0 -1
  172. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +0 -1
  173. data/lib/new_relic/agent/instrumentation/queue_time.rb +0 -2
  174. data/lib/new_relic/agent/instrumentation/rack/chain.rb +0 -1
  175. data/lib/new_relic/agent/instrumentation/rack/helpers.rb +0 -1
  176. data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +0 -1
  177. data/lib/new_relic/agent/instrumentation/rack/prepend.rb +0 -1
  178. data/lib/new_relic/agent/instrumentation/rack.rb +0 -1
  179. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +0 -1
  180. data/lib/new_relic/agent/instrumentation/rails_middleware.rb +0 -1
  181. data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +0 -1
  182. data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +0 -1
  183. data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +0 -1
  184. data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +0 -1
  185. data/lib/new_relic/agent/instrumentation/rake/chain.rb +0 -1
  186. data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +5 -1
  187. data/lib/new_relic/agent/instrumentation/rake/prepend.rb +0 -1
  188. data/lib/new_relic/agent/instrumentation/rake.rb +0 -1
  189. data/lib/new_relic/agent/instrumentation/redis/chain.rb +0 -1
  190. data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +0 -1
  191. data/lib/new_relic/agent/instrumentation/redis/prepend.rb +0 -1
  192. data/lib/new_relic/agent/instrumentation/redis.rb +0 -1
  193. data/lib/new_relic/agent/instrumentation/resque/chain.rb +0 -1
  194. data/lib/new_relic/agent/instrumentation/resque/helper.rb +0 -1
  195. data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +0 -1
  196. data/lib/new_relic/agent/instrumentation/resque/prepend.rb +0 -1
  197. data/lib/new_relic/agent/instrumentation/resque.rb +0 -1
  198. data/lib/new_relic/agent/instrumentation/sequel.rb +0 -1
  199. data/lib/new_relic/agent/instrumentation/sequel_helper.rb +0 -1
  200. data/lib/new_relic/agent/instrumentation/sidekiq.rb +1 -2
  201. data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +0 -1
  202. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +0 -1
  203. data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +0 -1
  204. data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +0 -1
  205. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +0 -1
  206. data/lib/new_relic/agent/instrumentation/sinatra.rb +0 -1
  207. data/lib/new_relic/agent/instrumentation/sunspot.rb +0 -1
  208. data/lib/new_relic/agent/instrumentation/thread/chain.rb +0 -1
  209. data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +0 -1
  210. data/lib/new_relic/agent/instrumentation/thread/prepend.rb +0 -1
  211. data/lib/new_relic/agent/instrumentation/thread.rb +0 -1
  212. data/lib/new_relic/agent/instrumentation/tilt/chain.rb +0 -1
  213. data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +0 -1
  214. data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +0 -1
  215. data/lib/new_relic/agent/instrumentation/tilt.rb +0 -1
  216. data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +0 -1
  217. data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +3 -4
  218. data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +0 -1
  219. data/lib/new_relic/agent/instrumentation/typhoeus.rb +0 -1
  220. data/lib/new_relic/agent/instrumentation.rb +0 -1
  221. data/lib/new_relic/agent/internal_agent_error.rb +0 -1
  222. data/lib/new_relic/agent/javascript_instrumentor.rb +1 -2
  223. data/lib/new_relic/agent/linking_metadata.rb +0 -1
  224. data/lib/new_relic/agent/local_log_decorator.rb +0 -1
  225. data/lib/new_relic/agent/log_event_aggregator.rb +0 -1
  226. data/lib/new_relic/agent/log_once.rb +0 -1
  227. data/lib/new_relic/agent/log_priority.rb +0 -1
  228. data/lib/new_relic/agent/logging.rb +0 -1
  229. data/lib/new_relic/agent/memory_logger.rb +0 -1
  230. data/lib/new_relic/agent/messaging.rb +1 -2
  231. data/lib/new_relic/agent/method_tracer.rb +0 -1
  232. data/lib/new_relic/agent/method_tracer_helpers.rb +1 -2
  233. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +0 -1
  234. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +0 -1
  235. data/lib/new_relic/agent/monitors/inbound_request_monitor.rb +0 -1
  236. data/lib/new_relic/agent/monitors/synthetics_monitor.rb +0 -1
  237. data/lib/new_relic/agent/monitors.rb +0 -1
  238. data/lib/new_relic/agent/new_relic_service/encoders.rb +0 -1
  239. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +0 -1
  240. data/lib/new_relic/agent/new_relic_service/marshaller.rb +0 -1
  241. data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +0 -1
  242. data/lib/new_relic/agent/new_relic_service.rb +193 -142
  243. data/lib/new_relic/agent/{noticible_error.rb → noticeable_error.rb} +1 -2
  244. data/lib/new_relic/agent/null_logger.rb +0 -1
  245. data/lib/new_relic/agent/obfuscator.rb +1 -2
  246. data/lib/new_relic/agent/parameter_filtering.rb +0 -1
  247. data/lib/new_relic/agent/payload_metric_mapping.rb +0 -1
  248. data/lib/new_relic/agent/pipe_channel_manager.rb +0 -1
  249. data/lib/new_relic/agent/pipe_service.rb +0 -1
  250. data/lib/new_relic/agent/prepend_supportability.rb +0 -1
  251. data/lib/new_relic/agent/priority_sampled_buffer.rb +2 -3
  252. data/lib/new_relic/agent/range_extensions.rb +0 -1
  253. data/lib/new_relic/agent/rules_engine/replacement_rule.rb +0 -1
  254. data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +0 -1
  255. data/lib/new_relic/agent/rules_engine.rb +0 -1
  256. data/lib/new_relic/agent/sampler.rb +0 -1
  257. data/lib/new_relic/agent/sampler_collection.rb +0 -1
  258. data/lib/new_relic/agent/samplers/cpu_sampler.rb +0 -1
  259. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +0 -1
  260. data/lib/new_relic/agent/samplers/memory_sampler.rb +5 -6
  261. data/lib/new_relic/agent/samplers/object_sampler.rb +0 -1
  262. data/lib/new_relic/agent/samplers/vm_sampler.rb +2 -1
  263. data/lib/new_relic/agent/span_event_aggregator.rb +0 -1
  264. data/lib/new_relic/agent/span_event_primitive.rb +0 -2
  265. data/lib/new_relic/agent/sql_sampler.rb +0 -1
  266. data/lib/new_relic/agent/stats.rb +12 -3
  267. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +0 -2
  268. data/lib/new_relic/agent/stats_engine/stats_hash.rb +1 -2
  269. data/lib/new_relic/agent/stats_engine.rb +0 -1
  270. data/lib/new_relic/agent/synthetics_event_aggregator.rb +0 -1
  271. data/lib/new_relic/agent/system_info.rb +1 -2
  272. data/lib/new_relic/agent/threading/agent_thread.rb +12 -9
  273. data/lib/new_relic/agent/threading/backtrace_node.rb +0 -1
  274. data/lib/new_relic/agent/threading/backtrace_service.rb +0 -1
  275. data/lib/new_relic/agent/threading/thread_profile.rb +1 -2
  276. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +0 -1
  277. data/lib/new_relic/agent/tracer.rb +7 -6
  278. data/lib/new_relic/agent/transaction/abstract_segment.rb +2 -3
  279. data/lib/new_relic/agent/transaction/datastore_segment.rb +0 -1
  280. data/lib/new_relic/agent/transaction/distributed_tracer.rb +0 -1
  281. data/lib/new_relic/agent/transaction/distributed_tracing.rb +0 -1
  282. data/lib/new_relic/agent/transaction/external_request_segment.rb +1 -2
  283. data/lib/new_relic/agent/transaction/message_broker_segment.rb +0 -1
  284. data/lib/new_relic/agent/transaction/request_attributes.rb +0 -1
  285. data/lib/new_relic/agent/transaction/segment.rb +0 -1
  286. data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +0 -1
  287. data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +0 -1
  288. data/lib/new_relic/agent/transaction/trace.rb +0 -1
  289. data/lib/new_relic/agent/transaction/trace_builder.rb +0 -1
  290. data/lib/new_relic/agent/transaction/trace_context.rb +0 -1
  291. data/lib/new_relic/agent/transaction/trace_node.rb +2 -3
  292. data/lib/new_relic/agent/transaction/tracing.rb +0 -1
  293. data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +0 -2
  294. data/lib/new_relic/agent/transaction.rb +3 -5
  295. data/lib/new_relic/agent/transaction_error_primitive.rb +0 -1
  296. data/lib/new_relic/agent/transaction_event_aggregator.rb +0 -1
  297. data/lib/new_relic/agent/transaction_event_primitive.rb +0 -1
  298. data/lib/new_relic/agent/transaction_event_recorder.rb +1 -2
  299. data/lib/new_relic/agent/transaction_metrics.rb +1 -2
  300. data/lib/new_relic/agent/transaction_sampler.rb +0 -1
  301. data/lib/new_relic/agent/transaction_time_aggregator.rb +1 -2
  302. data/lib/new_relic/agent/utilization/aws.rb +0 -1
  303. data/lib/new_relic/agent/utilization/azure.rb +1 -2
  304. data/lib/new_relic/agent/utilization/gcp.rb +1 -2
  305. data/lib/new_relic/agent/utilization/pcf.rb +1 -2
  306. data/lib/new_relic/agent/utilization/vendor.rb +1 -2
  307. data/lib/new_relic/agent/utilization_data.rb +0 -1
  308. data/lib/new_relic/agent/vm/jruby_vm.rb +0 -1
  309. data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +0 -1
  310. data/lib/new_relic/agent/vm/mri_vm.rb +35 -23
  311. data/lib/new_relic/agent/vm/snapshot.rb +1 -2
  312. data/lib/new_relic/agent/vm.rb +0 -1
  313. data/lib/new_relic/agent/worker_loop.rb +0 -1
  314. data/lib/new_relic/agent.rb +13 -16
  315. data/lib/new_relic/cli/command.rb +1 -2
  316. data/lib/new_relic/cli/commands/deployments.rb +72 -21
  317. data/lib/new_relic/cli/commands/install.rb +0 -1
  318. data/lib/new_relic/coerce.rb +0 -1
  319. data/lib/new_relic/collection_helper.rb +1 -2
  320. data/lib/new_relic/constants.rb +0 -1
  321. data/lib/new_relic/control/class_methods.rb +0 -1
  322. data/lib/new_relic/control/frameworks/external.rb +0 -1
  323. data/lib/new_relic/control/frameworks/rails.rb +0 -1
  324. data/lib/new_relic/control/frameworks/rails3.rb +0 -1
  325. data/lib/new_relic/control/frameworks/rails4.rb +0 -1
  326. data/lib/new_relic/control/frameworks/rails_notifications.rb +0 -1
  327. data/lib/new_relic/control/frameworks/ruby.rb +0 -1
  328. data/lib/new_relic/control/frameworks/sinatra.rb +0 -1
  329. data/lib/new_relic/control/frameworks.rb +0 -1
  330. data/lib/new_relic/control/instance_methods.rb +17 -40
  331. data/lib/new_relic/control/instrumentation.rb +0 -1
  332. data/lib/new_relic/control/private_instance_methods.rb +48 -0
  333. data/lib/new_relic/control/server_methods.rb +0 -1
  334. data/lib/new_relic/control.rb +0 -1
  335. data/lib/new_relic/delayed_job_injection.rb +0 -1
  336. data/lib/new_relic/dependency_detection.rb +3 -4
  337. data/lib/new_relic/environment_report.rb +23 -14
  338. data/lib/new_relic/helper.rb +1 -2
  339. data/lib/new_relic/language_support.rb +7 -3
  340. data/lib/new_relic/latest_changes.rb +3 -4
  341. data/lib/new_relic/local_environment.rb +3 -4
  342. data/lib/new_relic/metric_data.rb +27 -22
  343. data/lib/new_relic/metric_spec.rb +0 -1
  344. data/lib/new_relic/noticed_error.rb +3 -6
  345. data/lib/new_relic/rack/agent_hooks.rb +0 -1
  346. data/lib/new_relic/rack/agent_middleware.rb +0 -1
  347. data/lib/new_relic/rack/browser_monitoring.rb +131 -123
  348. data/lib/new_relic/rack.rb +0 -1
  349. data/lib/new_relic/recipes/capistrano3.rb +2 -59
  350. data/lib/new_relic/recipes/capistrano_legacy.rb +1 -2
  351. data/lib/new_relic/recipes/helpers/send_deployment.rb +69 -0
  352. data/lib/new_relic/recipes.rb +0 -1
  353. data/lib/new_relic/supportability_helper.rb +1 -2
  354. data/lib/new_relic/traced_thread.rb +0 -1
  355. data/lib/new_relic/version.rb +1 -2
  356. data/lib/newrelic_rpm.rb +0 -1
  357. data/lib/sequel/extensions/newrelic_instrumentation.rb +2 -3
  358. data/lib/sequel/plugins/newrelic_instrumentation.rb +0 -1
  359. data/lib/tasks/all.rb +0 -1
  360. data/lib/tasks/config.rake +4 -113
  361. data/lib/tasks/coverage_report.rake +20 -15
  362. data/lib/tasks/{config.html.erb → helpers/config.html.erb} +0 -0
  363. data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
  364. data/lib/tasks/helpers/format.rb +120 -0
  365. data/lib/tasks/helpers/matches.rb +12 -0
  366. data/lib/tasks/helpers/prompt.rb +24 -0
  367. data/lib/tasks/helpers/removers.rb +33 -0
  368. data/lib/tasks/install.rake +0 -1
  369. data/lib/tasks/instrumentation_generator/README.md +63 -0
  370. data/lib/tasks/instrumentation_generator/TODO.md +33 -0
  371. data/lib/tasks/instrumentation_generator/instrumentation.thor +102 -0
  372. data/lib/tasks/instrumentation_generator/templates/Envfile.tt +9 -0
  373. data/lib/tasks/instrumentation_generator/templates/chain.tt +21 -0
  374. data/lib/tasks/instrumentation_generator/templates/chain_method.tt +7 -0
  375. data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +29 -0
  376. data/lib/tasks/instrumentation_generator/templates/instrumentation.tt +12 -0
  377. data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +3 -0
  378. data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +19 -0
  379. data/lib/tasks/instrumentation_generator/templates/prepend.tt +13 -0
  380. data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +3 -0
  381. data/lib/tasks/instrumentation_generator/templates/test.tt +15 -0
  382. data/lib/tasks/multiverse.rake +0 -1
  383. data/lib/tasks/multiverse.rb +3 -29
  384. data/lib/tasks/newrelic.rb +0 -1
  385. data/lib/tasks/tests.rake +3 -8
  386. data/newrelic.yml +10 -1
  387. data/newrelic_rpm.gemspec +14 -19
  388. data/recipes/newrelic.rb +0 -1
  389. data/test/agent_helper.rb +22 -54
  390. metadata +50 -101
  391. data/bin/mongrel_rpm +0 -33
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
3
  # frozen_string_literal: true
@@ -10,7 +9,7 @@ module NewRelic
10
9
  @@forkable = nil
11
10
  def can_fork?
12
11
  # this is expensive to check, so we should only check once
13
- return @@forkable if @@forkable != nil
12
+ return @@forkable if !@@forkable.nil?
14
13
  @@forkable = Process.respond_to?(:fork)
15
14
  end
16
15
 
@@ -57,7 +56,7 @@ module NewRelic
57
56
  begin
58
57
  result = namespace.const_get(name)
59
58
 
60
- # const_get looks up the inheritence chain, so if it's a class
59
+ # const_get looks up the inheritance chain, so if it's a class
61
60
  # in the constant make sure we found the one in our namespace.
62
61
  #
63
62
  # Can't help if the constant isn't a class...
@@ -73,6 +72,11 @@ module NewRelic
73
72
  end
74
73
  end
75
74
 
75
+ def camelize(string)
76
+ camelized = string.downcase
77
+ camelized.split(/\-|\_/).map(&:capitalize).join
78
+ end
79
+
76
80
  def bundled_gem?(gem_name)
77
81
  defined?(Bundler) && Bundler.rubygems.all_specs.map(&:name).include?(gem_name)
78
82
  rescue => e
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
3
  # frozen_string_literal: true
@@ -31,8 +30,8 @@ EOS
31
30
 
32
31
  current_item = nil
33
32
  latest.each do |line|
34
- if line.match(/^\s*\*.*/)
35
- if line.match(/\(#{patch_level}\)/)
33
+ if line =~ /^\s*\*.*/
34
+ if line =~ /\(#{patch_level}\)/
36
35
  # Found a patch level item, so start tracking the lines!
37
36
  current_item = line
38
37
  else
@@ -53,7 +52,7 @@ EOS
53
52
  changes = []
54
53
  version_count = 0
55
54
  contents.each_line do |line|
56
- if line.match(/##\s+v[\d.]+/)
55
+ if line =~ /##\s+v[\d.]+/
57
56
  version_count += 1
58
57
  end
59
58
  break if version_count >= 2
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
3
  # frozen_string_literal: true
@@ -35,8 +34,8 @@ module NewRelic
35
34
  end
36
35
 
37
36
  def initialize
38
- # Extend self with any any submodules of LocalEnvironment. These can override
39
- # the discover methods to discover new framworks and dispatchers.
37
+ # Extend self with any submodules of LocalEnvironment. These can override
38
+ # the discover methods to discover new frameworks and dispatchers.
40
39
  NewRelic::LocalEnvironment.constants.each do |const|
41
40
  mod = NewRelic::LocalEnvironment.const_get(const)
42
41
  self.extend(mod) if mod.instance_of?(Module)
@@ -183,7 +182,7 @@ module NewRelic
183
182
  end
184
183
 
185
184
  def check_for_litespeed
186
- if caller.pop =~ /fcgi-bin\/RailsRunner\.rb/
185
+ if caller.pop.include?('fcgi-bin/RailsRunner.rb')
187
186
  @discovered_dispatcher = :litespeed
188
187
  end
189
188
  end
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
3
  # frozen_string_literal: true
@@ -9,9 +8,11 @@ module NewRelic
9
8
  class MetricData
10
9
  # a NewRelic::MetricSpec object
11
10
  attr_reader :metric_spec
12
- # the actual statistics object
11
+ # a NewRelic::Agent::Stats object
13
12
  attr_accessor :stats
14
13
 
14
+ include NewRelic::Coerce
15
+
15
16
  def initialize(metric_spec, stats)
16
17
  @original_spec = nil
17
18
  @metric_spec = metric_spec
@@ -22,8 +23,12 @@ module NewRelic
22
23
  (metric_spec.eql?(o.metric_spec)) && (stats.eql?(o.stats))
23
24
  end
24
25
 
25
- def original_spec
26
- @original_spec || @metric_spec
26
+ def hash
27
+ [metric_spec, stats].hash
28
+ end
29
+
30
+ def inspect
31
+ "#<MetricData metric_spec:#{metric_spec.inspect}, stats:#{stats.inspect}>"
27
32
  end
28
33
 
29
34
  # assigns a new metric spec, and retains the old metric spec as
@@ -33,8 +38,13 @@ module NewRelic
33
38
  @metric_spec = new_spec
34
39
  end
35
40
 
36
- def hash
37
- [metric_spec, stats].hash
41
+ def original_spec
42
+ @original_spec || @metric_spec
43
+ end
44
+
45
+ def to_collector_array(encoder = nil)
46
+ stat_key = {'name' => metric_spec.name, 'scope' => metric_spec.scope}
47
+ [stat_key, stats_collector_array(stat_key)]
38
48
  end
39
49
 
40
50
  def to_json(*a)
@@ -45,23 +55,18 @@ module NewRelic
45
55
  "#{metric_spec.name}(#{metric_spec.scope}): #{stats}"
46
56
  end
47
57
 
48
- def inspect
49
- "#<MetricData metric_spec:#{metric_spec.inspect}, stats:#{stats.inspect}>"
50
- end
51
-
52
- include NewRelic::Coerce
58
+ private
53
59
 
54
- def to_collector_array(encoder = nil)
55
- stat_key = {'name' => metric_spec.name, 'scope' => metric_spec.scope}
56
- [stat_key,
57
- [
58
- int(stats.call_count, stat_key),
59
- float(stats.total_call_time, stat_key),
60
- float(stats.total_exclusive_time, stat_key),
61
- float(stats.min_call_time, stat_key),
62
- float(stats.max_call_time, stat_key),
63
- float(stats.sum_of_squares, stat_key)
64
- ]]
60
+ def stats_collector_array(stat_key)
61
+ [[:call_count, Integer], [:total_call_time, Float],
62
+ [:total_exclusive_time, Float], [:min_call_time, Float],
63
+ [:max_call_time, Float], [:sum_of_squares, Float]].map do |attr_types|
64
+ if attr_types[1].eql?(Integer)
65
+ int(stats.send(attr_types[0]), stat_key)
66
+ elsif attr_types[1].eql?(Float)
67
+ float(stats.send(attr_types[0]), stat_key)
68
+ end
69
+ end
65
70
  end
66
71
  end
67
72
  end
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
3
  # frozen_string_literal: true
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
3
  # frozen_string_literal: true
@@ -135,10 +134,8 @@ class NewRelic::NoticedError
135
134
 
136
135
  def build_error_attributes
137
136
  @attributes_from_notice_error ||= {}
138
- @attributes_from_notice_error.merge!({
139
- ERROR_MESSAGE_KEY => string(message),
140
- ERROR_CLASS_KEY => string(exception_class_name)
141
- })
137
+ @attributes_from_notice_error[ERROR_MESSAGE_KEY] = string(message)
138
+ @attributes_from_notice_error[ERROR_CLASS_KEY] = string(exception_class_name)
142
139
 
143
140
  @attributes_from_notice_error[ERROR_EXPECTED_KEY] = true if expected
144
141
  end
@@ -189,7 +186,7 @@ class NewRelic::NoticedError
189
186
  if exception.nil?
190
187
  @exception_class_name = UNKNOWN_ERROR_CLASS_NAME
191
188
  @message = NIL_ERROR_MESSAGE
192
- elsif exception.is_a?(NewRelic::Agent::NoticibleError)
189
+ elsif exception.is_a?(NewRelic::Agent::NoticeableError)
193
190
  @exception_class_name = exception.class_name
194
191
  @message = exception.message
195
192
  else
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
3
  # frozen_string_literal: true
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
3
  # frozen_string_literal: true
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
3
  # frozen_string_literal: true
@@ -7,152 +6,161 @@ require 'rack'
7
6
  require 'new_relic/rack/agent_middleware'
8
7
  require 'new_relic/agent/instrumentation/middleware_proxy'
9
8
 
10
- module NewRelic::Rack
11
- # This middleware is used by the agent for the Real user monitoring (RUM)
12
- # feature, and will usually be automatically injected in the middleware chain.
13
- # If automatic injection is not working, you may manually use it in your
14
- # middleware chain instead.
15
- #
16
- # @api public
17
- #
18
- class BrowserMonitoring < AgentMiddleware
19
- # The maximum number of bytes of the response body that we will
20
- # examine in order to look for a RUM insertion point.
21
- SCAN_LIMIT = 50_000
22
-
23
- CONTENT_TYPE = 'Content-Type'.freeze
24
- CONTENT_DISPOSITION = 'Content-Disposition'.freeze
25
- CONTENT_LENGTH = 'Content-Length'.freeze
26
- ATTACHMENT = 'attachment'.freeze
27
- TEXT_HTML = 'text/html'.freeze
28
-
29
- BODY_START = "<body".freeze
30
- HEAD_START = "<head".freeze
31
- GT = ">".freeze
32
-
33
- def traced_call(env)
34
- result = @app.call(env)
35
- (status, headers, response) = result
36
-
37
- js_to_inject = NewRelic::Agent.browser_timing_header
38
- if (js_to_inject != NewRelic::EMPTY_STR) && should_instrument?(env, status, headers)
39
- response_string = autoinstrument_source(response, headers, js_to_inject)
40
- if headers.key?(CONTENT_LENGTH)
41
- content_length = response_string ? response_string.bytesize : 0
42
- headers[CONTENT_LENGTH] = content_length.to_s
43
- end
44
-
45
- env[ALREADY_INSTRUMENTED_KEY] = true
46
- if response_string
47
- response = Rack::Response.new(response_string, status, headers)
48
- response.finish
9
+ module NewRelic
10
+ module Rack
11
+ # This middleware is used by the agent for the Real user monitoring (RUM)
12
+ # feature, and will usually be automatically injected in the middleware chain.
13
+ # If automatic injection is not working, you may manually use it in your
14
+ # middleware chain instead.
15
+ #
16
+ # @api public
17
+ #
18
+ class BrowserMonitoring < AgentMiddleware
19
+ # The maximum number of bytes of the response body that we will
20
+ # examine in order to look for a RUM insertion point.
21
+ SCAN_LIMIT = 50_000
22
+
23
+ CONTENT_TYPE = 'Content-Type'.freeze
24
+ CONTENT_DISPOSITION = 'Content-Disposition'.freeze
25
+ CONTENT_LENGTH = 'Content-Length'.freeze
26
+ ATTACHMENT = 'attachment'.freeze
27
+ TEXT_HTML = 'text/html'.freeze
28
+
29
+ BODY_START = "<body".freeze
30
+ HEAD_START = "<head".freeze
31
+ GT = ">".freeze
32
+
33
+ ALREADY_INSTRUMENTED_KEY = "newrelic.browser_monitoring_already_instrumented"
34
+ CHARSET_RE = /<\s*meta[^>]+charset\s*=[^>]*>/im.freeze
35
+ X_UA_COMPATIBLE_RE = /<\s*meta[^>]+http-equiv\s*=\s*['"]x-ua-compatible['"][^>]*>/im.freeze
36
+
37
+ def traced_call(env)
38
+ result = @app.call(env)
39
+ (status, headers, response) = result
40
+
41
+ js_to_inject = NewRelic::Agent.browser_timing_header
42
+ if (js_to_inject != NewRelic::EMPTY_STR) && should_instrument?(env, status, headers)
43
+ response_string = autoinstrument_source(response, headers, js_to_inject)
44
+ if headers.key?(CONTENT_LENGTH)
45
+ content_length = response_string ? response_string.bytesize : 0
46
+ headers[CONTENT_LENGTH] = content_length.to_s
47
+ end
48
+
49
+ env[ALREADY_INSTRUMENTED_KEY] = true
50
+ if response_string
51
+ response = ::Rack::Response.new(response_string, status, headers)
52
+ response.finish
53
+ else
54
+ result
55
+ end
49
56
  else
50
57
  result
51
58
  end
52
- else
53
- result
54
59
  end
55
- end
56
60
 
57
- ALREADY_INSTRUMENTED_KEY = "newrelic.browser_monitoring_already_instrumented"
58
-
59
- def should_instrument?(env, status, headers)
60
- NewRelic::Agent.config[:'browser_monitoring.auto_instrument'] &&
61
- status == 200 &&
62
- !env[ALREADY_INSTRUMENTED_KEY] &&
63
- is_html?(headers) &&
64
- !is_attachment?(headers) &&
65
- !is_streaming?(env, headers)
66
- end
67
-
68
- def is_html?(headers)
69
- headers[CONTENT_TYPE] && headers[CONTENT_TYPE].include?(TEXT_HTML)
70
- end
71
-
72
- def is_attachment?(headers)
73
- headers[CONTENT_DISPOSITION] && headers[CONTENT_DISPOSITION].include?(ATTACHMENT)
74
- end
61
+ def should_instrument?(env, status, headers)
62
+ NewRelic::Agent.config[:'browser_monitoring.auto_instrument'] &&
63
+ status == 200 &&
64
+ !env[ALREADY_INSTRUMENTED_KEY] &&
65
+ html?(headers) &&
66
+ !attachment?(headers) &&
67
+ !streaming?(env, headers)
68
+ end
75
69
 
76
- def is_streaming?(env, headers)
77
- return true if headers && headers['Transfer-Encoding'] == 'chunked'
70
+ private
71
+
72
+ def autoinstrument_source(response, headers, js_to_inject)
73
+ source = gather_source(response)
74
+ close_old_response(response)
75
+ return nil unless source
76
+
77
+ # Only scan the first 50k (roughly) then give up.
78
+ beginning_of_source = source[0..SCAN_LIMIT]
79
+ meta_tag_positions = find_meta_tag_positions(beginning_of_source)
80
+ if body_start = find_body_start(beginning_of_source)
81
+ if insertion_index = find_insertion_index(meta_tag_positions, beginning_of_source, body_start)
82
+ source = source_injection(source, insertion_index, js_to_inject)
83
+ else
84
+ NewRelic::Agent.logger.debug("Skipping RUM instrumentation. Could not properly determine location to inject script.")
85
+ end
86
+ else
87
+ msg = "Skipping RUM instrumentation. Unable to find <body> tag in first #{SCAN_LIMIT} bytes of document."
88
+ NewRelic::Agent.logger.log_once(:warn, :rum_insertion_failure, msg)
89
+ NewRelic::Agent.logger.debug(msg)
90
+ end
78
91
 
79
- defined?(ActionController::Live) &&
80
- env['action_controller.instance'].class.included_modules.include?(ActionController::Live)
81
- end
92
+ source
93
+ rescue => e
94
+ NewRelic::Agent.logger.debug("Skipping RUM instrumentation on exception.", e)
95
+ nil
96
+ end
82
97
 
83
- CHARSET_RE = /<\s*meta[^>]+charset\s*=[^>]*>/im.freeze
84
- X_UA_COMPATIBLE_RE = /<\s*meta[^>]+http-equiv\s*=\s*['"]x-ua-compatible['"][^>]*>/im.freeze
98
+ def html?(headers)
99
+ headers[CONTENT_TYPE] && headers[CONTENT_TYPE].include?(TEXT_HTML)
100
+ end
85
101
 
86
- def autoinstrument_source(response, headers, js_to_inject)
87
- source = gather_source(response)
88
- close_old_response(response)
89
- return nil unless source
102
+ def attachment?(headers)
103
+ headers[CONTENT_DISPOSITION] && headers[CONTENT_DISPOSITION].include?(ATTACHMENT)
104
+ end
90
105
 
91
- # Only scan the first 50k (roughly) then give up.
92
- beginning_of_source = source[0..SCAN_LIMIT]
106
+ def streaming?(env, headers)
107
+ return true if headers && headers['Transfer-Encoding'] == 'chunked'
93
108
 
94
- if body_start = find_body_start(beginning_of_source)
95
- meta_tag_positions = [
96
- find_x_ua_compatible_position(beginning_of_source),
97
- find_charset_position(beginning_of_source)
98
- ].compact
109
+ defined?(ActionController::Live) &&
110
+ env['action_controller.instance'].class.included_modules.include?(ActionController::Live)
111
+ end
99
112
 
100
- if !meta_tag_positions.empty?
101
- insertion_index = meta_tag_positions.max
102
- else
103
- insertion_index = find_end_of_head_open(beginning_of_source) || body_start
104
- end
113
+ def source_injection(source, insertion_index, js_to_inject)
114
+ source[0...insertion_index] <<
115
+ js_to_inject <<
116
+ source[insertion_index..-1]
117
+ end
105
118
 
106
- if insertion_index
107
- source = source[0...insertion_index] <<
108
- js_to_inject <<
109
- source[insertion_index..-1]
119
+ def find_insertion_index(tag_positions, source_beginning, body_start)
120
+ if !tag_positions.empty?
121
+ tag_positions.max
110
122
  else
111
- NewRelic::Agent.logger.debug("Skipping RUM instrumentation. Could not properly determine location to inject script.")
123
+ find_end_of_head_open(source_beginning) || body_start
112
124
  end
113
- else
114
- msg = "Skipping RUM instrumentation. Unable to find <body> tag in first #{SCAN_LIMIT} bytes of document."
115
- NewRelic::Agent.logger.log_once(:warn, :rum_insertion_failure, msg)
116
- NewRelic::Agent.logger.debug(msg)
117
125
  end
118
126
 
119
- source
120
- rescue => e
121
- NewRelic::Agent.logger.debug("Skipping RUM instrumentation on exception.", e)
122
- nil
123
- end
127
+ def find_meta_tag_positions(source_beginning)
128
+ [
129
+ find_x_ua_compatible_position(source_beginning),
130
+ find_charset_position(source_beginning)
131
+ ].compact
132
+ end
124
133
 
125
- def gather_source(response)
126
- source = nil
127
- response.each { |fragment| source ? (source << fragment.to_s) : (source = fragment.to_s) }
128
- source
129
- end
134
+ def gather_source(response)
135
+ source = nil
136
+ response.each { |fragment| source ? (source << fragment.to_s) : (source = fragment.to_s) }
137
+ source
138
+ end
130
139
 
131
- # Per "The Response > The Body" section of Rack spec, we should close
132
- # if our response is able. http://rack.rubyforge.org/doc/SPEC.html
133
- def close_old_response(response)
134
- if response.respond_to?(:close)
135
- response.close
140
+ # Per "The Response > The Body" section of Rack spec, we should close
141
+ # if our response is able. http://rack.rubyforge.org/doc/SPEC.html
142
+ def close_old_response(response)
143
+ response.close if response.respond_to?(:close)
136
144
  end
137
- end
138
145
 
139
- def find_body_start(beginning_of_source)
140
- beginning_of_source.index(BODY_START)
141
- end
146
+ def find_body_start(beginning_of_source)
147
+ beginning_of_source.index(BODY_START)
148
+ end
142
149
 
143
- def find_x_ua_compatible_position(beginning_of_source)
144
- match = X_UA_COMPATIBLE_RE.match(beginning_of_source)
145
- match.end(0) if match
146
- end
150
+ def find_x_ua_compatible_position(beginning_of_source)
151
+ match = X_UA_COMPATIBLE_RE.match(beginning_of_source)
152
+ match.end(0) if match
153
+ end
147
154
 
148
- def find_charset_position(beginning_of_source)
149
- match = CHARSET_RE.match(beginning_of_source)
150
- match.end(0) if match
151
- end
155
+ def find_charset_position(beginning_of_source)
156
+ match = CHARSET_RE.match(beginning_of_source)
157
+ match.end(0) if match
158
+ end
152
159
 
153
- def find_end_of_head_open(beginning_of_source)
154
- head_open = beginning_of_source.index(HEAD_START)
155
- beginning_of_source.index(GT, head_open) + 1 if head_open
160
+ def find_end_of_head_open(beginning_of_source)
161
+ head_open = beginning_of_source.index(HEAD_START)
162
+ beginning_of_source.index(GT, head_open) + 1 if head_open
163
+ end
156
164
  end
157
165
  end
158
166
  end
@@ -1,4 +1,3 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
3
  # frozen_string_literal: true
@@ -1,11 +1,12 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
3
  # frozen_string_literal: true
5
4
 
6
5
  require 'capistrano/framework'
6
+ require_relative 'helpers/send_deployment'
7
7
 
8
8
  namespace :newrelic do
9
+ include SendDeployment
9
10
  # notifies New Relic of a deployment
10
11
  desc "Record a deployment in New Relic (newrelic.com)"
11
12
  task :notice_deployment do
@@ -19,62 +20,4 @@ namespace :newrelic do
19
20
  end
20
21
  end
21
22
  end
22
-
23
- def send_deployment_notification_to_newrelic
24
- environment = fetch(:newrelic_rails_env, fetch(:rack_env, fetch(:rails_env, fetch(:stage, "production"))))
25
-
26
- require 'new_relic/cli/command'
27
-
28
- begin
29
- # allow overrides to be defined for revision, description, changelog, appname, and user
30
- rev = fetch(:newrelic_revision)
31
- description = fetch(:newrelic_desc)
32
- changelog = fetch(:newrelic_changelog)
33
- appname = fetch(:newrelic_appname)
34
- user = fetch(:newrelic_user)
35
- license_key = fetch(:newrelic_license_key)
36
-
37
- has_scm_from_plugin = respond_to?(:scm_plugin_installed?) && scm_plugin_installed?
38
- has_scm_from_config = defined?(scm) && !scm.nil? && scm != :none
39
-
40
- if has_scm_from_plugin || has_scm_from_config
41
- changelog ||= lookup_changelog
42
- rev ||= fetch(:current_revision)
43
- end
44
-
45
- new_revision = rev
46
- deploy_options = {
47
- :environment => environment,
48
- :revision => new_revision,
49
- :changelog => changelog,
50
- :description => description,
51
- :appname => appname,
52
- :user => user,
53
- :license_key => license_key
54
- }
55
-
56
- debug("Uploading deployment to New Relic")
57
- deployment = NewRelic::Cli::Deployments.new(deploy_options)
58
- deployment.run
59
- info("Uploaded deployment information to New Relic")
60
- rescue NewRelic::Cli::Command::CommandFailure => e
61
- info(e.message)
62
- rescue => e
63
- info("Error creating New Relic deployment (#{e})\n#{e.backtrace.join("\n")}")
64
- end
65
- end
66
-
67
- def lookup_changelog
68
- previous_revision = fetch(:previous_revision)
69
- current_revision = fetch(:current_revision)
70
- return unless current_revision && previous_revision
71
-
72
- debug("Retrieving changelog for New Relic Deployment details")
73
-
74
- if Rake::Task.task_defined?("git:check")
75
- log_command = "git --no-pager log --no-color --pretty=format:' * %an: %s' " +
76
- "--abbrev-commit --no-merges #{previous_revision}..#{current_revision}"
77
- `#{log_command}`
78
- end
79
- end
80
23
  end
@@ -1,9 +1,8 @@
1
- # encoding: utf-8
2
1
  # This file is distributed under New Relic's license terms.
3
2
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
3
  # frozen_string_literal: true
5
4
 
6
- make_notify_task = Proc.new do
5
+ make_notify_task = proc do
7
6
  namespace(:newrelic) do
8
7
  # on all deployments, notify New Relic
9
8
  desc("Record a deployment in New Relic (newrelic.com)")
@@ -0,0 +1,69 @@
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 SendDeployment
6
+ def send_deployment_notification_to_newrelic
7
+ require 'new_relic/cli/command'
8
+ debug("Uploading deployment to New Relic")
9
+ NewRelic::Cli::Deployments.new(deploy_options).run
10
+ info("Uploaded deployment information to New Relic")
11
+ rescue NewRelic::Cli::Command::CommandFailure => e
12
+ info(e.message)
13
+ rescue => e
14
+ info("Error creating New Relic deployment (#{e})\n#{e.backtrace.join("\n")}")
15
+ end
16
+
17
+ private
18
+
19
+ def deploy_options
20
+ {
21
+ :environment => fetch_environment,
22
+ :revision => fetch_rev,
23
+ :changelog => fetch_changelog,
24
+ :description => fetch(:newrelic_desc),
25
+ :appname => fetch(:newrelic_appname),
26
+ :user => fetch(:newrelic_user),
27
+ :license_key => fetch(:newrelic_license_key)
28
+ }
29
+ end
30
+
31
+ def fetch_changelog
32
+ has_scm? ? fetch(:newrelic_changelog) : lookup_changelog
33
+ end
34
+
35
+ def fetch_environment
36
+ fetch(:newrelic_rails_env, fetch(:rack_env, fetch(:rails_env, fetch(:stage, "production"))))
37
+ end
38
+
39
+ def fetch_rev
40
+ newrelic_rev = fetch(:newrelic_revision)
41
+ has_scm? && !newrelic_rev ? fetch(:current_revision) : newrelic_rev
42
+ end
43
+
44
+ def has_scm?
45
+ has_scm_from_plugin? || has_scm_from_config?
46
+ end
47
+
48
+ def has_scm_from_config?
49
+ defined?(scm) && !scm.nil? && scm != :none
50
+ end
51
+
52
+ def has_scm_from_plugin?
53
+ respond_to?(:scm_plugin_installed?) && scm_plugin_installed?
54
+ end
55
+
56
+ def lookup_changelog
57
+ previous_revision = fetch(:previous_revision)
58
+ current_revision = fetch(:current_revision)
59
+ return unless current_revision && previous_revision
60
+
61
+ debug("Retrieving changelog for New Relic Deployment details")
62
+
63
+ if Rake::Task.task_defined?("git:check")
64
+ log_command = "git --no-pager log --no-color --pretty=format:' * %an: %s' " +
65
+ "--abbrev-commit --no-merges #{previous_revision}..#{current_revision}"
66
+ `#{log_command}`
67
+ end
68
+ end
69
+ end