newrelic_rpm 6.15.0 → 8.13.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (427) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +7 -1
  3. data/.rubocop.yml +1817 -0
  4. data/.rubocop_todo.yml +59 -0
  5. data/.simplecov +15 -0
  6. data/.snyk +11 -0
  7. data/.yardopts +1 -0
  8. data/Brewfile +12 -0
  9. data/CHANGELOG.md +754 -40
  10. data/CONTRIBUTING.md +32 -5
  11. data/DOCKER.md +167 -0
  12. data/Dockerfile +10 -0
  13. data/Gemfile +0 -1
  14. data/Guardfile +9 -8
  15. data/LICENSE +0 -6
  16. data/README.md +21 -20
  17. data/Rakefile +27 -29
  18. data/THIRD_PARTY_NOTICES.md +14 -199
  19. data/Thorfile +5 -0
  20. data/bin/newrelic +3 -2
  21. data/bin/newrelic_cmd +1 -0
  22. data/bin/nrdebug +76 -53
  23. data/config.dot +5 -5
  24. data/docker-compose.yml +107 -0
  25. data/init.rb +4 -6
  26. data/install.rb +2 -2
  27. data/lefthook.yml +9 -0
  28. data/lib/new_relic/agent/adaptive_sampler.rb +13 -9
  29. data/lib/new_relic/agent/agent/shutdown.rb +35 -0
  30. data/lib/new_relic/agent/agent/special_startup.rb +72 -0
  31. data/lib/new_relic/agent/agent/start_worker_thread.rb +163 -0
  32. data/lib/new_relic/agent/agent/startup.rb +197 -0
  33. data/lib/new_relic/agent/agent.rb +178 -555
  34. data/lib/new_relic/agent/agent_logger.rb +23 -19
  35. data/lib/new_relic/agent/attribute_filter.rb +66 -47
  36. data/lib/new_relic/agent/attribute_processing.rb +7 -7
  37. data/lib/new_relic/agent/attributes.rb +5 -4
  38. data/lib/new_relic/agent/audit_logger.rb +8 -3
  39. data/lib/new_relic/agent/autostart.rb +20 -19
  40. data/lib/new_relic/agent/chained_call.rb +1 -1
  41. data/lib/new_relic/agent/commands/agent_command.rb +3 -3
  42. data/lib/new_relic/agent/commands/agent_command_router.rb +12 -11
  43. data/lib/new_relic/agent/commands/thread_profiler_session.rb +9 -7
  44. data/lib/new_relic/agent/configuration/default_source.rb +1728 -1194
  45. data/lib/new_relic/agent/configuration/dotted_hash.rb +6 -5
  46. data/lib/new_relic/agent/configuration/environment_source.rb +11 -9
  47. data/lib/new_relic/agent/configuration/event_harvest_config.rb +40 -17
  48. data/lib/new_relic/agent/configuration/high_security_source.rb +9 -8
  49. data/lib/new_relic/agent/configuration/manager.rb +82 -69
  50. data/lib/new_relic/agent/configuration/manual_source.rb +1 -1
  51. data/lib/new_relic/agent/configuration/mask_defaults.rb +3 -3
  52. data/lib/new_relic/agent/configuration/security_policy_source.rb +90 -77
  53. data/lib/new_relic/agent/configuration/server_source.rb +21 -19
  54. data/lib/new_relic/agent/configuration/yaml_source.rb +31 -7
  55. data/lib/new_relic/agent/configuration.rb +1 -1
  56. data/lib/new_relic/agent/connect/request_builder.rb +18 -18
  57. data/lib/new_relic/agent/connect/response_handler.rb +5 -8
  58. data/lib/new_relic/agent/custom_event_aggregator.rb +14 -14
  59. data/lib/new_relic/agent/database/explain_plan_helpers.rb +4 -5
  60. data/lib/new_relic/agent/database/obfuscation_helpers.rb +14 -13
  61. data/lib/new_relic/agent/database/obfuscator.rb +2 -2
  62. data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +3 -3
  63. data/lib/new_relic/agent/database.rb +53 -47
  64. data/lib/new_relic/agent/database_adapter.rb +3 -1
  65. data/lib/new_relic/agent/datastores/metric_helper.rb +17 -18
  66. data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +7 -6
  67. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +6 -10
  68. data/lib/new_relic/agent/datastores/mongo.rb +6 -11
  69. data/lib/new_relic/agent/datastores/nosql_obfuscator.rb +41 -0
  70. data/lib/new_relic/agent/datastores/redis.rb +5 -11
  71. data/lib/new_relic/agent/datastores.rb +11 -13
  72. data/lib/new_relic/agent/deprecator.rb +1 -1
  73. data/lib/new_relic/agent/distributed_tracing/cross_app_payload.rb +10 -10
  74. data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +39 -32
  75. data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +22 -22
  76. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +19 -19
  77. data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +50 -52
  78. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +5 -6
  79. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +76 -77
  80. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +39 -38
  81. data/lib/new_relic/agent/distributed_tracing.rb +32 -100
  82. data/lib/new_relic/agent/encoding_normalizer.rb +4 -2
  83. data/lib/new_relic/agent/error_collector.rb +73 -54
  84. data/lib/new_relic/agent/error_event_aggregator.rb +4 -5
  85. data/lib/new_relic/agent/error_filter.rb +174 -0
  86. data/lib/new_relic/agent/error_trace_aggregator.rb +4 -3
  87. data/lib/new_relic/agent/event_aggregator.rb +22 -21
  88. data/lib/new_relic/agent/event_buffer.rb +7 -8
  89. data/lib/new_relic/agent/event_listener.rb +1 -2
  90. data/lib/new_relic/agent/event_loop.rb +25 -23
  91. data/lib/new_relic/agent/external.rb +11 -44
  92. data/lib/new_relic/agent/guid_generator.rb +4 -11
  93. data/lib/new_relic/agent/harvester.rb +4 -5
  94. data/lib/new_relic/agent/heap.rb +6 -8
  95. data/lib/new_relic/agent/hostname.rb +20 -13
  96. data/lib/new_relic/agent/http_clients/abstract.rb +10 -11
  97. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +6 -11
  98. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +8 -9
  99. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +4 -5
  100. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +2 -4
  101. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +8 -4
  102. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +4 -5
  103. data/lib/new_relic/agent/http_clients/uri_util.rb +1 -3
  104. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +8 -8
  105. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +38 -31
  106. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +12 -13
  107. data/lib/new_relic/agent/instrumentation/active_job.rb +14 -7
  108. data/lib/new_relic/agent/instrumentation/active_merchant.rb +20 -6
  109. data/lib/new_relic/agent/instrumentation/active_record.rb +29 -27
  110. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +71 -61
  111. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +31 -44
  112. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +4 -4
  113. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +27 -20
  114. data/lib/new_relic/agent/instrumentation/active_storage.rb +2 -2
  115. data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +18 -15
  116. data/lib/new_relic/agent/instrumentation/active_support_logger/chain.rb +23 -0
  117. data/lib/new_relic/agent/instrumentation/active_support_logger/instrumentation.rb +20 -0
  118. data/lib/new_relic/agent/instrumentation/active_support_logger/prepend.rb +12 -0
  119. data/lib/new_relic/agent/instrumentation/active_support_logger.rb +24 -0
  120. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +18 -10
  121. data/lib/new_relic/agent/instrumentation/authlogic.rb +10 -2
  122. data/lib/new_relic/agent/instrumentation/bunny/chain.rb +45 -0
  123. data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +150 -0
  124. data/lib/new_relic/agent/instrumentation/bunny/prepend.rb +35 -0
  125. data/lib/new_relic/agent/instrumentation/bunny.rb +11 -154
  126. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +68 -58
  127. data/lib/new_relic/agent/instrumentation/curb/chain.rb +91 -0
  128. data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +221 -0
  129. data/lib/new_relic/agent/instrumentation/curb/prepend.rb +61 -0
  130. data/lib/new_relic/agent/instrumentation/curb.rb +11 -243
  131. data/lib/new_relic/agent/instrumentation/data_mapper.rb +65 -54
  132. data/lib/new_relic/agent/instrumentation/delayed_job/chain.rb +35 -0
  133. data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +48 -0
  134. data/lib/new_relic/agent/instrumentation/delayed_job/prepend.rb +33 -0
  135. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +29 -53
  136. data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +29 -0
  137. data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +66 -0
  138. data/lib/new_relic/agent/instrumentation/elasticsearch/prepend.rb +13 -0
  139. data/lib/new_relic/agent/instrumentation/elasticsearch.rb +31 -0
  140. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +5 -5
  141. data/lib/new_relic/agent/instrumentation/excon.rb +22 -24
  142. data/lib/new_relic/agent/instrumentation/grape/chain.rb +24 -0
  143. data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +100 -0
  144. data/lib/new_relic/agent/instrumentation/grape/prepend.rb +17 -0
  145. data/lib/new_relic/agent/instrumentation/grape.rb +11 -112
  146. data/lib/new_relic/agent/instrumentation/grpc/client/chain.rb +97 -0
  147. data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +89 -0
  148. data/lib/new_relic/agent/instrumentation/grpc/client/prepend.rb +111 -0
  149. data/lib/new_relic/agent/instrumentation/grpc/client/request_wrapper.rb +30 -0
  150. data/lib/new_relic/agent/instrumentation/grpc/helper.rb +32 -0
  151. data/lib/new_relic/agent/instrumentation/grpc/server/chain.rb +69 -0
  152. data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +134 -0
  153. data/lib/new_relic/agent/instrumentation/grpc/server/rpc_desc_prepend.rb +35 -0
  154. data/lib/new_relic/agent/instrumentation/grpc/server/rpc_server_prepend.rb +26 -0
  155. data/lib/new_relic/agent/instrumentation/grpc_client.rb +23 -0
  156. data/lib/new_relic/agent/instrumentation/grpc_server.rb +25 -0
  157. data/lib/new_relic/agent/instrumentation/httpclient/chain.rb +24 -0
  158. data/lib/new_relic/agent/instrumentation/httpclient/instrumentation.rb +37 -0
  159. data/lib/new_relic/agent/instrumentation/httpclient/prepend.rb +15 -0
  160. data/lib/new_relic/agent/instrumentation/httpclient.rb +10 -32
  161. data/lib/new_relic/agent/instrumentation/httprb/chain.rb +22 -0
  162. data/lib/new_relic/agent/instrumentation/httprb/instrumentation.rb +30 -0
  163. data/lib/new_relic/agent/instrumentation/httprb/prepend.rb +15 -0
  164. data/lib/new_relic/agent/instrumentation/httprb.rb +29 -0
  165. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +4 -5
  166. data/lib/new_relic/agent/instrumentation/logger/chain.rb +21 -0
  167. data/lib/new_relic/agent/instrumentation/logger/instrumentation.rb +66 -0
  168. data/lib/new_relic/agent/instrumentation/logger/prepend.rb +13 -0
  169. data/lib/new_relic/agent/instrumentation/logger.rb +26 -0
  170. data/lib/new_relic/agent/instrumentation/memcache/chain.rb +15 -0
  171. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +57 -128
  172. data/lib/new_relic/agent/instrumentation/memcache/helper.rb +59 -0
  173. data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +90 -0
  174. data/lib/new_relic/agent/instrumentation/memcache/prepend.rb +101 -0
  175. data/lib/new_relic/agent/instrumentation/memcache.rb +56 -72
  176. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +13 -12
  177. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +5 -7
  178. data/lib/new_relic/agent/instrumentation/mongo.rb +5 -136
  179. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +21 -18
  180. data/lib/new_relic/agent/instrumentation/net_http/chain.rb +24 -0
  181. data/lib/new_relic/agent/instrumentation/{net_prepend.rb → net_http/instrumentation.rb} +13 -13
  182. data/lib/new_relic/agent/instrumentation/net_http/prepend.rb +21 -0
  183. data/lib/new_relic/agent/instrumentation/net_http.rb +44 -0
  184. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +10 -9
  185. data/lib/new_relic/agent/instrumentation/padrino/chain.rb +38 -0
  186. data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +28 -0
  187. data/lib/new_relic/agent/instrumentation/padrino/prepend.rb +20 -0
  188. data/lib/new_relic/agent/instrumentation/padrino.rb +20 -58
  189. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +3 -3
  190. data/lib/new_relic/agent/instrumentation/queue_time.rb +8 -9
  191. data/lib/new_relic/agent/instrumentation/rack/chain.rb +66 -0
  192. data/lib/new_relic/agent/instrumentation/rack/helpers.rb +33 -0
  193. data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +75 -0
  194. data/lib/new_relic/agent/instrumentation/rack/prepend.rb +43 -0
  195. data/lib/new_relic/agent/instrumentation/rack.rb +30 -140
  196. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +16 -52
  197. data/lib/new_relic/agent/instrumentation/rails_middleware.rb +1 -1
  198. data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +5 -4
  199. data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +3 -3
  200. data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +3 -2
  201. data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +13 -3
  202. data/lib/new_relic/agent/instrumentation/rake/chain.rb +20 -0
  203. data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +149 -0
  204. data/lib/new_relic/agent/instrumentation/rake/prepend.rb +14 -0
  205. data/lib/new_relic/agent/instrumentation/rake.rb +16 -157
  206. data/lib/new_relic/agent/instrumentation/redis/chain.rb +45 -0
  207. data/lib/new_relic/agent/instrumentation/redis/constants.rb +17 -0
  208. data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +72 -0
  209. data/lib/new_relic/agent/instrumentation/redis/middleware.rb +16 -0
  210. data/lib/new_relic/agent/instrumentation/redis/prepend.rb +29 -0
  211. data/lib/new_relic/agent/instrumentation/redis.rb +18 -107
  212. data/lib/new_relic/agent/instrumentation/resque/chain.rb +21 -0
  213. data/lib/new_relic/agent/instrumentation/resque/helper.rb +19 -0
  214. data/lib/new_relic/agent/instrumentation/resque/instrumentation.rb +34 -0
  215. data/lib/new_relic/agent/instrumentation/resque/prepend.rb +15 -0
  216. data/lib/new_relic/agent/instrumentation/resque.rb +28 -39
  217. data/lib/new_relic/agent/instrumentation/sequel.rb +14 -16
  218. data/lib/new_relic/agent/instrumentation/sequel_helper.rb +2 -2
  219. data/lib/new_relic/agent/instrumentation/sidekiq/client.rb +20 -0
  220. data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +30 -0
  221. data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +37 -0
  222. data/lib/new_relic/agent/instrumentation/sidekiq.rb +23 -64
  223. data/lib/new_relic/agent/instrumentation/sinatra/chain.rb +55 -0
  224. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +30 -36
  225. data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +125 -0
  226. data/lib/new_relic/agent/instrumentation/sinatra/prepend.rb +33 -0
  227. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +2 -2
  228. data/lib/new_relic/agent/instrumentation/sinatra.rb +34 -163
  229. data/lib/new_relic/agent/instrumentation/sunspot.rb +11 -3
  230. data/lib/new_relic/agent/instrumentation/thread/chain.rb +24 -0
  231. data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +28 -0
  232. data/lib/new_relic/agent/instrumentation/thread/prepend.rb +22 -0
  233. data/lib/new_relic/agent/instrumentation/thread.rb +20 -0
  234. data/lib/new_relic/agent/instrumentation/tilt/chain.rb +24 -0
  235. data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +41 -0
  236. data/lib/new_relic/agent/instrumentation/tilt/prepend.rb +13 -0
  237. data/lib/new_relic/agent/instrumentation/tilt.rb +25 -0
  238. data/lib/new_relic/agent/instrumentation/typhoeus/chain.rb +22 -0
  239. data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +80 -0
  240. data/lib/new_relic/agent/instrumentation/typhoeus/prepend.rb +14 -0
  241. data/lib/new_relic/agent/instrumentation/typhoeus.rb +12 -91
  242. data/lib/new_relic/agent/instrumentation.rb +1 -1
  243. data/lib/new_relic/agent/internal_agent_error.rb +2 -2
  244. data/lib/new_relic/agent/javascript_instrumentor.rb +47 -41
  245. data/lib/new_relic/agent/linking_metadata.rb +44 -0
  246. data/lib/new_relic/agent/local_log_decorator.rb +37 -0
  247. data/lib/new_relic/agent/log_event_aggregator.rb +235 -0
  248. data/lib/new_relic/agent/log_once.rb +1 -1
  249. data/lib/new_relic/agent/log_priority.rb +20 -0
  250. data/lib/new_relic/agent/logging.rb +24 -21
  251. data/lib/new_relic/agent/memory_logger.rb +2 -2
  252. data/lib/new_relic/agent/messaging.rb +65 -81
  253. data/lib/new_relic/agent/method_tracer.rb +154 -149
  254. data/lib/new_relic/agent/method_tracer_helpers.rb +85 -3
  255. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +25 -17
  256. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +5 -4
  257. data/lib/new_relic/agent/monitors/inbound_request_monitor.rb +1 -2
  258. data/lib/new_relic/agent/monitors/synthetics_monitor.rb +6 -9
  259. data/lib/new_relic/agent/monitors.rb +6 -7
  260. data/lib/new_relic/agent/new_relic_service/encoders.rb +6 -6
  261. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +5 -5
  262. data/lib/new_relic/agent/new_relic_service/marshaller.rb +2 -2
  263. data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +5 -4
  264. data/lib/new_relic/agent/new_relic_service.rb +248 -196
  265. data/lib/new_relic/agent/{noticible_error.rb → noticeable_error.rb} +2 -5
  266. data/lib/new_relic/agent/null_logger.rb +7 -3
  267. data/lib/new_relic/agent/obfuscator.rb +8 -10
  268. data/lib/new_relic/agent/parameter_filtering.rb +24 -10
  269. data/lib/new_relic/agent/payload_metric_mapping.rb +9 -10
  270. data/lib/new_relic/agent/pipe_channel_manager.rb +27 -17
  271. data/lib/new_relic/agent/pipe_service.rb +8 -5
  272. data/lib/new_relic/agent/prepend_supportability.rb +2 -2
  273. data/lib/new_relic/agent/priority_sampled_buffer.rb +8 -11
  274. data/lib/new_relic/agent/range_extensions.rb +8 -28
  275. data/lib/new_relic/agent/rules_engine/replacement_rule.rb +11 -11
  276. data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +13 -13
  277. data/lib/new_relic/agent/rules_engine.rb +5 -4
  278. data/lib/new_relic/agent/sampler.rb +3 -4
  279. data/lib/new_relic/agent/sampler_collection.rb +3 -4
  280. data/lib/new_relic/agent/samplers/cpu_sampler.rb +3 -2
  281. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +12 -9
  282. data/lib/new_relic/agent/samplers/memory_sampler.rb +24 -13
  283. data/lib/new_relic/agent/samplers/object_sampler.rb +1 -1
  284. data/lib/new_relic/agent/samplers/vm_sampler.rb +21 -19
  285. data/lib/new_relic/agent/span_event_aggregator.rb +12 -12
  286. data/lib/new_relic/agent/span_event_primitive.rb +62 -56
  287. data/lib/new_relic/agent/sql_sampler.rb +18 -18
  288. data/lib/new_relic/agent/stats.rb +78 -41
  289. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +9 -11
  290. data/lib/new_relic/agent/stats_engine/stats_hash.rb +12 -13
  291. data/lib/new_relic/agent/stats_engine.rb +8 -8
  292. data/lib/new_relic/agent/synthetics_event_aggregator.rb +7 -8
  293. data/lib/new_relic/agent/system_info.rb +85 -65
  294. data/lib/new_relic/agent/threading/agent_thread.rb +18 -14
  295. data/lib/new_relic/agent/threading/backtrace_node.rb +12 -13
  296. data/lib/new_relic/agent/threading/backtrace_service.rb +14 -14
  297. data/lib/new_relic/agent/threading/thread_profile.rb +23 -23
  298. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +1 -1
  299. data/lib/new_relic/agent/tracer.rb +76 -85
  300. data/lib/new_relic/agent/transaction/abstract_segment.rb +103 -40
  301. data/lib/new_relic/agent/transaction/datastore_segment.rb +21 -17
  302. data/lib/new_relic/agent/transaction/distributed_tracer.rb +63 -56
  303. data/lib/new_relic/agent/transaction/distributed_tracing.rb +43 -44
  304. data/lib/new_relic/agent/transaction/external_request_segment.rb +44 -34
  305. data/lib/new_relic/agent/transaction/message_broker_segment.rb +31 -36
  306. data/lib/new_relic/agent/transaction/request_attributes.rb +35 -35
  307. data/lib/new_relic/agent/transaction/segment.rb +14 -10
  308. data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +1 -3
  309. data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +1 -1
  310. data/lib/new_relic/agent/transaction/trace.rb +15 -11
  311. data/lib/new_relic/agent/transaction/trace_builder.rb +10 -10
  312. data/lib/new_relic/agent/transaction/trace_context.rb +35 -35
  313. data/lib/new_relic/agent/transaction/trace_node.rb +25 -24
  314. data/lib/new_relic/agent/transaction/tracing.rb +14 -11
  315. data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +4 -4
  316. data/lib/new_relic/agent/transaction.rb +164 -145
  317. data/lib/new_relic/agent/transaction_error_primitive.rb +27 -25
  318. data/lib/new_relic/agent/transaction_event_aggregator.rb +12 -12
  319. data/lib/new_relic/agent/transaction_event_primitive.rb +32 -33
  320. data/lib/new_relic/agent/transaction_event_recorder.rb +16 -15
  321. data/lib/new_relic/agent/transaction_metrics.rb +10 -9
  322. data/lib/new_relic/agent/transaction_sampler.rb +5 -6
  323. data/lib/new_relic/agent/transaction_time_aggregator.rb +26 -25
  324. data/lib/new_relic/agent/utilization/aws.rb +33 -3
  325. data/lib/new_relic/agent/utilization/azure.rb +3 -3
  326. data/lib/new_relic/agent/utilization/gcp.rb +7 -7
  327. data/lib/new_relic/agent/utilization/pcf.rb +5 -4
  328. data/lib/new_relic/agent/utilization/vendor.rb +43 -28
  329. data/lib/new_relic/agent/utilization_data.rb +7 -5
  330. data/lib/new_relic/agent/vm/jruby_vm.rb +1 -1
  331. data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +2 -2
  332. data/lib/new_relic/agent/vm/mri_vm.rb +40 -15
  333. data/lib/new_relic/agent/vm/snapshot.rb +5 -5
  334. data/lib/new_relic/agent/vm.rb +1 -1
  335. data/lib/new_relic/agent/worker_loop.rb +10 -12
  336. data/lib/new_relic/agent.rb +64 -75
  337. data/lib/new_relic/cli/command.rb +20 -22
  338. data/lib/new_relic/cli/commands/deployments.rb +92 -42
  339. data/lib/new_relic/cli/commands/install.rb +12 -15
  340. data/lib/new_relic/coerce.rb +15 -13
  341. data/lib/new_relic/collection_helper.rb +50 -48
  342. data/lib/new_relic/constants.rb +1 -4
  343. data/lib/new_relic/control/class_methods.rb +3 -3
  344. data/lib/new_relic/control/frameworks/external.rb +2 -2
  345. data/lib/new_relic/control/frameworks/rails.rb +23 -17
  346. data/lib/new_relic/control/frameworks/rails3.rb +3 -4
  347. data/lib/new_relic/control/frameworks/rails4.rb +1 -1
  348. data/lib/new_relic/control/frameworks/rails_notifications.rb +1 -1
  349. data/lib/new_relic/control/frameworks/ruby.rb +3 -3
  350. data/lib/new_relic/control/frameworks/sinatra.rb +7 -1
  351. data/lib/new_relic/control/frameworks.rb +1 -1
  352. data/lib/new_relic/control/instance_methods.rb +23 -45
  353. data/lib/new_relic/control/instrumentation.rb +39 -11
  354. data/lib/new_relic/control/private_instance_methods.rb +48 -0
  355. data/lib/new_relic/control/server_methods.rb +3 -4
  356. data/lib/new_relic/control.rb +1 -2
  357. data/lib/new_relic/delayed_job_injection.rb +1 -1
  358. data/lib/new_relic/dependency_detection.rb +126 -19
  359. data/lib/new_relic/environment_report.rb +40 -32
  360. data/lib/new_relic/helper.rb +48 -7
  361. data/lib/new_relic/language_support.rb +29 -5
  362. data/lib/new_relic/latest_changes.rb +7 -6
  363. data/lib/new_relic/local_environment.rb +24 -18
  364. data/lib/new_relic/metric_data.rb +31 -26
  365. data/lib/new_relic/metric_spec.rb +8 -6
  366. data/lib/new_relic/noticed_error.rb +22 -30
  367. data/lib/new_relic/rack/agent_hooks.rb +1 -1
  368. data/lib/new_relic/rack/agent_middleware.rb +5 -3
  369. data/lib/new_relic/rack/browser_monitoring.rb +133 -123
  370. data/lib/new_relic/rack.rb +1 -1
  371. data/lib/new_relic/recipes/capistrano3.rb +3 -61
  372. data/lib/new_relic/recipes/capistrano_legacy.rb +23 -26
  373. data/lib/new_relic/recipes/helpers/send_deployment.rb +69 -0
  374. data/lib/new_relic/recipes.rb +1 -1
  375. data/lib/new_relic/supportability_helper.rb +9 -10
  376. data/lib/new_relic/traced_thread.rb +35 -0
  377. data/lib/new_relic/version.rb +6 -17
  378. data/lib/newrelic_rpm.rb +11 -35
  379. data/lib/sequel/extensions/newrelic_instrumentation.rb +12 -15
  380. data/lib/sequel/plugins/newrelic_instrumentation.rb +4 -10
  381. data/lib/tasks/all.rb +3 -3
  382. data/lib/tasks/config.rake +22 -117
  383. data/lib/tasks/coverage_report.rake +28 -0
  384. data/lib/tasks/helpers/config.html.erb +21 -0
  385. data/lib/tasks/{config.text.erb → helpers/config.text.erb} +0 -0
  386. data/lib/tasks/helpers/format.rb +123 -0
  387. data/lib/tasks/helpers/matches.rb +12 -0
  388. data/lib/tasks/helpers/prompt.rb +24 -0
  389. data/lib/tasks/helpers/removers.rb +33 -0
  390. data/lib/tasks/install.rake +4 -0
  391. data/lib/tasks/instrumentation_generator/README.md +63 -0
  392. data/lib/tasks/instrumentation_generator/TODO.md +33 -0
  393. data/lib/tasks/instrumentation_generator/instrumentation.thor +124 -0
  394. data/lib/tasks/instrumentation_generator/templates/Envfile.tt +9 -0
  395. data/lib/tasks/instrumentation_generator/templates/chain.tt +22 -0
  396. data/lib/tasks/instrumentation_generator/templates/chain_method.tt +8 -0
  397. data/lib/tasks/instrumentation_generator/templates/dependency_detection.tt +29 -0
  398. data/lib/tasks/instrumentation_generator/templates/instrumentation.tt +13 -0
  399. data/lib/tasks/instrumentation_generator/templates/instrumentation_method.tt +3 -0
  400. data/lib/tasks/instrumentation_generator/templates/newrelic.yml.tt +19 -0
  401. data/lib/tasks/instrumentation_generator/templates/prepend.tt +13 -0
  402. data/lib/tasks/instrumentation_generator/templates/prepend_method.tt +3 -0
  403. data/lib/tasks/instrumentation_generator/templates/test.tt +15 -0
  404. data/lib/tasks/multiverse.rake +4 -0
  405. data/lib/tasks/multiverse.rb +5 -32
  406. data/lib/tasks/newrelic.rb +1 -1
  407. data/lib/tasks/tests.rake +10 -15
  408. data/newrelic.yml +648 -3
  409. data/newrelic_rpm.gemspec +25 -25
  410. data/recipes/newrelic.rb +2 -2
  411. data/test/agent_helper.rb +219 -178
  412. metadata +164 -122
  413. data/ROADMAP.md +0 -24
  414. data/bin/mongrel_rpm +0 -33
  415. data/cert/cacert.pem +0 -1177
  416. data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +0 -44
  417. data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +0 -53
  418. data/lib/new_relic/agent/instrumentation/excon/connection.rb +0 -49
  419. data/lib/new_relic/agent/instrumentation/http.rb +0 -49
  420. data/lib/new_relic/agent/instrumentation/merb/controller.rb +0 -44
  421. data/lib/new_relic/agent/instrumentation/merb/errors.rb +0 -33
  422. data/lib/new_relic/agent/instrumentation/net.rb +0 -70
  423. data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +0 -125
  424. data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +0 -46
  425. data/lib/new_relic/agent/supported_versions.rb +0 -275
  426. data/lib/new_relic/control/frameworks/merb.rb +0 -29
  427. data/lib/tasks/config.html.erb +0 -32
@@ -1,25 +1,14 @@
1
1
  #!/usr/bin/ruby
2
- # encoding: utf-8
3
2
  # This file is distributed under New Relic's license terms.
4
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
5
-
4
+ # frozen_string_literal: true
6
5
 
7
6
  module NewRelic
8
- module VERSION #:nodoc:
9
- def self.build_version_string(*parts)
10
- parts.compact.join('.')
11
- end
12
-
13
- MAJOR = 6
14
- MINOR = 15
15
- TINY = 0
16
-
17
- begin
18
- require File.join(File.dirname(__FILE__), 'build')
19
- rescue LoadError
20
- BUILD = nil
21
- end
7
+ module VERSION # :nodoc:
8
+ MAJOR = 8
9
+ MINOR = 13
10
+ TINY = 1
22
11
 
23
- STRING = build_version_string(MAJOR, MINOR, TINY, BUILD)
12
+ STRING = "#{MAJOR}.#{MINOR}.#{TINY}"
24
13
  end
25
14
  end
data/lib/newrelic_rpm.rb CHANGED
@@ -1,53 +1,29 @@
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.
3
+ # frozen_string_literal: true
4
4
 
5
5
  # == New Relic Initialization
6
6
  #
7
7
  # When installed as a gem, you can activate the New Relic agent one of the following ways:
8
8
  #
9
- # For Rails, add:
10
- # config.gem 'newrelic_rpm'
11
- # to your initialization sequence.
9
+ # For applications using Bundler, add this to the Gemfile:
10
+ # gem 'newrelic_rpm'
12
11
  #
13
- # For merb, do
14
- # dependency 'newrelic_rpm'
15
- # in the Merb config/init.rb
12
+ # You will also need to install the newrelic.yml configuration file
16
13
  #
17
- # For Sinatra, do
18
- # require 'newrelic_rpm'
19
- # after requiring 'sinatra'.
20
- #
21
- # For other frameworks, or to manage the agent manually, invoke NewRelic::Agent#manual_start
22
- # directly.
14
+ # For applications not using Bundler, and for other installation information, visit:
15
+ # https://docs.newrelic.com/docs/agents/ruby-agent/installation/install-new-relic-ruby-agent/
23
16
  #
24
17
 
25
18
  require 'new_relic/control'
26
- if defined?(Merb) && defined?(Merb::BootLoader)
27
- module NewRelic
28
- class MerbBootLoader < Merb::BootLoader
29
- after Merb::BootLoader::ChooseAdapter
30
- def self.run
31
- NewRelic::Control.instance.init_plugin
32
- end
33
- end
34
- end
35
- elsif defined?(Rails::VERSION)
36
- if Rails::VERSION::MAJOR.to_i >= 3
37
- module NewRelic
38
- class Railtie < Rails::Railtie
39
19
 
40
- initializer "newrelic_rpm.start_plugin", before: :load_config_initializers do |app|
41
- NewRelic::Control.instance.init_plugin(:config => app.config)
42
- end
20
+ if defined?(Rails::VERSION)
21
+ module NewRelic
22
+ class Railtie < Rails::Railtie
23
+ initializer "newrelic_rpm.start_plugin", before: :load_config_initializers do |app|
24
+ NewRelic::Control.instance.init_plugin(config: app.config)
43
25
  end
44
26
  end
45
- else
46
- # After version 2.0 of Rails we can access the configuration directly.
47
- # We need it to add dev mode routes after initialization finished.
48
- config = nil
49
- config = Rails.configuration if Rails.respond_to?(:configuration)
50
- NewRelic::Control.instance.init_plugin :config => config
51
27
  end
52
28
  else
53
29
  NewRelic::Control.instance.init_plugin
@@ -1,15 +1,14 @@
1
1
  # -*- ruby -*-
2
- # encoding: utf-8
3
2
  # This file is distributed under New Relic's license terms.
4
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
5
5
 
6
- require 'sequel' unless defined?( Sequel )
7
- require 'newrelic_rpm' unless defined?( NewRelic )
6
+ require 'sequel' unless defined?(Sequel)
7
+ require 'newrelic_rpm' unless defined?(NewRelic)
8
8
  require 'new_relic/agent/instrumentation/sequel_helper'
9
9
  require 'new_relic/agent/datastores/metric_helper'
10
10
 
11
11
  module Sequel
12
-
13
12
  # New Relic's Sequel instrumentation is implemented via a plugin for
14
13
  # Sequel::Models, and an extension for Sequel::Databases. Every database
15
14
  # handle that Sequel knows about when New Relic is loaded will automatically
@@ -31,7 +30,6 @@ module Sequel
31
30
  # `disable_activerecord_instrumentation` setting.
32
31
  #
33
32
  module NewRelicInstrumentation
34
-
35
33
  module Naming
36
34
  def self.query_method_name
37
35
  if Sequel::VERSION >= "4.35.0"
@@ -42,7 +40,7 @@ module Sequel
42
40
  end
43
41
  end
44
42
 
45
- define_method Naming.query_method_name do |*args, &blk| #THREAD_LOCAL_ACCESS
43
+ define_method Naming.query_method_name do |*args, &blk| # THREAD_LOCAL_ACCESS
46
44
  sql = args.first
47
45
 
48
46
  product = NewRelic::Agent::Instrumentation::SequelHelper.product_name_from_adapter(self.class.adapter_scheme)
@@ -64,18 +62,18 @@ module Sequel
64
62
  # block in the sequel Plugin instrumentation. A simple ORM operation from the Plugin
65
63
  # instrumentation may trigger a number of calls to this method. We want to append
66
64
  # the statements that come from the disable_all_tracing block into this node's
67
- # statement, otherwise we would end up ovewriting the sql statement with the
65
+ # statement, otherwise we would end up overwriting the sql statement with the
68
66
  # last one executed.
69
- def notice_sql sql
67
+ def notice_sql(sql)
70
68
  return unless txn = NewRelic::Agent::Tracer.current_transaction
71
69
 
72
70
  current_segment = txn.current_segment
73
71
  return unless current_segment.is_a?(NewRelic::Agent::Transaction::DatastoreSegment)
74
72
 
75
73
  if current_segment.sql_statement
76
- current_segment.sql_statement.append_sql sql
74
+ current_segment.sql_statement.append_sql(sql)
77
75
  else
78
- current_segment._notice_sql sql, self.opts, explainer_for(sql)
76
+ current_segment._notice_sql(sql, self.opts, explainer_for(sql))
79
77
  end
80
78
  end
81
79
 
@@ -83,10 +81,10 @@ module Sequel
83
81
  (defined?(::Sequel::ThreadedConnectionPool) && ::Sequel::ThreadedConnectionPool)
84
82
  ].freeze
85
83
 
86
- def explainer_for sql
87
- Proc.new do |*|
84
+ def explainer_for(sql)
85
+ proc do |*|
88
86
  if THREAD_SAFE_CONNECTION_POOL_CLASSES.include?(self.pool.class)
89
- self[ sql ].explain
87
+ self[sql].explain
90
88
  else
91
89
  NewRelic::Agent.logger.log_once(:info, :sequel_explain_skipped, "Not running SQL explains because Sequel is not in recognized multi-threaded mode")
92
90
  nil
@@ -95,7 +93,6 @@ module Sequel
95
93
  end
96
94
  end # module NewRelicInstrumentation
97
95
 
98
- NewRelic::Agent.logger.debug "Registering the :newrelic_instrumentation extension."
96
+ NewRelic::Agent.logger.debug("Registering the :newrelic_instrumentation extension.")
99
97
  Database.register_extension(:newrelic_instrumentation, NewRelicInstrumentation)
100
-
101
98
  end # module Sequel
@@ -1,25 +1,23 @@
1
1
  # -*- ruby -*-
2
- # encoding: utf-8
3
2
  # This file is distributed under New Relic's license terms.
4
3
  # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+ # frozen_string_literal: true
5
5
 
6
- require 'sequel' unless defined?( Sequel )
7
- require 'newrelic_rpm' unless defined?( NewRelic )
6
+ require 'sequel' unless defined?(Sequel)
7
+ require 'newrelic_rpm' unless defined?(NewRelic)
8
8
  require 'new_relic/agent/instrumentation/sequel_helper'
9
9
  require 'new_relic/agent/datastores/metric_helper'
10
10
 
11
11
  module Sequel
12
12
  module Plugins
13
-
14
13
  # Sequel::Model instrumentation for the New Relic agent.
15
14
  module NewrelicInstrumentation
16
-
17
15
  # Meta-programming for creating method tracers for the Sequel::Model plugin.
18
16
  module MethodWrapping
19
17
  # Install a method named +method_name+ that will trace execution
20
18
  # with a metric name derived from +operation_name+ (or +method_name+ if +operation_name+
21
19
  # isn't specified).
22
- def wrap_sequel_method(method_name, operation_name=method_name)
20
+ def wrap_sequel_method(method_name, operation_name = method_name)
23
21
  define_method(method_name) do |*args, &block|
24
22
  klass = self.is_a?(Class) ? self : self.class
25
23
  product = NewRelic::Agent::Instrumentation::SequelHelper.product_name_from_adapter(db.adapter_scheme)
@@ -36,7 +34,6 @@ module Sequel
36
34
  end
37
35
  end
38
36
  end
39
-
40
37
  end # module MethodTracer
41
38
 
42
39
  # Methods to be added to Sequel::Model instances.
@@ -51,10 +48,8 @@ module Sequel
51
48
  wrap_sequel_method :update_fields
52
49
  wrap_sequel_method :update_only
53
50
  wrap_sequel_method :save
54
-
55
51
  end # module InstanceMethods
56
52
 
57
-
58
53
  # Methods to be added to Sequel::Model classes.
59
54
  module ClassMethods
60
55
  extend Sequel::Plugins::NewrelicInstrumentation::MethodWrapping
@@ -64,7 +59,6 @@ module Sequel
64
59
  wrap_sequel_method :first
65
60
  wrap_sequel_method :create
66
61
  end # module ClassMethods
67
-
68
62
  end # module NewRelicInstrumentation
69
63
  end # module Plugins
70
64
  end # module Sequel
data/lib/tasks/all.rb CHANGED
@@ -1,8 +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.
3
+ # frozen_string_literal: true
4
4
 
5
- # This is required to load in task definitions from merb
6
- Dir.glob(File.join(File.dirname(__FILE__),'*.rake')) do |file|
5
+ # This is required to load in task definitions
6
+ Dir.glob(File.join(File.dirname(__FILE__), '*.rake')) do |file|
7
7
  load file
8
8
  end
@@ -1,130 +1,35 @@
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
+ require_relative 'helpers/format'
6
+ include Format
7
+
1
8
  namespace :newrelic do
2
9
  namespace :config do
3
- desc "Describe available New Relic configuration settings."
4
-
5
- GENERAL = "general"
6
- DISABLING = "disabling"
10
+ GENERAL = "general"
11
+ DISABLING = "disabling"
7
12
  ATTRIBUTES = "attributes"
8
13
 
14
+ # these configuration options are not able to be set using environment variables
15
+ NON_ENV_CONFIGS = ['error_collector.ignore_classes', 'error_collector.ignore_messages', 'error_collector.expected_classes', 'error_collector.expected_messages']
16
+
9
17
  SECTION_DESCRIPTIONS = {
10
- GENERAL => 'These settings are available for agent configuration. Some settings depend on your New Relic subscription level.',
11
- DISABLING => 'Use these settings to toggle instrumentation types during agent startup.',
12
- ATTRIBUTES => '<a href="https://docs.newrelic.com/docs/features/agent-attributes">Attributes</a> are key-value pairs containing information that determines the properties of an event or transaction. These key-value pairs can be viewed within transaction traces in New Relic APM, traced errors in New Relic APM, transaction events in Insights, and page views in Insights. You can customize exactly which attributes will be sent to each of these destinations.',
13
- "transaction_tracer" => 'The <a href="/docs/apm/traces/transaction-traces/transaction-traces">transaction traces</a> feature collects detailed information from a selection of transactions, including a summary of the calling sequence, a breakdown of time spent, and a list of SQL queries and their query plans (on mysql and postgresql). Available features depend on your New Relic subscription level.',
14
- "error_collector" => 'The agent collects and reports all uncaught exceptions by default. These configuration options allow you to customize the error collection.',
15
- "browser_monitoring" => 'New Relic Browser\'s <a href="/docs/browser/new-relic-browser/page-load-timing/page-load-timing-process">page load timing</a> feature (sometimes referred to as real user monitoring or RUM) gives you insight into the performance real users are experiencing with your website. This is accomplished by measuring the time it takes for your users\' browsers to download and render your web pages by injecting a small amount of JavaScript code into the header and footer of each page.',
16
- "analytics_events" => '<a href="/docs/insights/new-relic-insights/understanding-insights/new-relic-insights">New Relic Insights</a> is a software analytics resource to gather and visualize data about your software and what it says about your business. With it you can quickly and easily create real-time dashboards to get immediate answers about end-user experiences, clickstreams, mobile activities, and server transactions.'
18
+ GENERAL => 'These settings are available for agent configuration. Some settings depend on your New Relic subscription level.',
19
+ DISABLING => 'Use these settings to toggle instrumentation types during agent startup.',
20
+ ATTRIBUTES => '[Attributes](/docs/features/agent-attributes) are key-value pairs containing information that determines the properties of an event or transaction. These key-value pairs can be viewed within transaction traces in APM, traced errors in APM, transaction events in dashboards, and page views in dashboards. You can customize exactly which attributes will be sent to each of these destinations',
21
+ "transaction_tracer" => 'The [transaction traces](/docs/apm/traces/transaction-traces/transaction-traces) feature collects detailed information from a selection of transactions, including a summary of the calling sequence, a breakdown of time spent, and a list of SQL queries and their query plans (on mysql and postgresql). Available features depend on your New Relic subscription level.',
22
+ "error_collector" => "The agent collects and reports all uncaught exceptions by default. These configuration options allow you to customize the error collection.\n\nFor information on ignored and expected errors, [see this page on Error Analytics in APM](/docs/agents/manage-apm-agents/agent-data/manage-errors-apm-collect-ignore-or-mark-expected/). To set expected errors via the `NewRelic::Agent.notice_error` Ruby method, [consult the Ruby Agent API](/docs/agents/ruby-agent/api-guides/sending-handled-errors-new-relic/).",
23
+ "browser_monitoring" => "The browser monitoring [page load timing](/docs/browser/new-relic-browser/page-load-timing/page-load-timing-process) feature (sometimes referred to as real user monitoring or RUM) gives you insight into the performance real users are experiencing with your website. This is accomplished by measuring the time it takes for your users' browsers to download and render your web pages by injecting a small amount of JavaScript code into the header and footer of each page.",
24
+ "analytics_events" => '[New Relic dashboards](/docs/query-your-data/explore-query-data/dashboards/introduction-new-relic-one-dashboards) is a resource to gather and visualize data about your software and what it says about your business. With it you can quickly and easily create real-time dashboards to get immediate answers about end-user experiences, clickstreams, mobile activities, and server transactions.'
17
25
  }
18
26
 
19
27
  NAME_OVERRIDES = {
20
- "slow_sql" => "Slow SQL"
28
+ "slow_sql" => "Slow SQL",
29
+ "custom_insights_events" => "Custom Events"
21
30
  }
22
31
 
23
- def output(format)
24
- config_hash = build_config_hash
25
- sections = flatten_config_hash(config_hash)
26
-
27
- puts build_erb(format).result(binding)
28
- sections # silences unused warning to return this
29
- end
30
-
31
- def build_config_hash
32
- sections = Hash.new {|hash, key| hash[key] = []}
33
- NewRelic::Agent::Configuration::DEFAULTS.each do |key, value|
34
- next unless value[:public]
35
-
36
- section_key = GENERAL
37
- key = key.to_s
38
- components = key.split(".")
39
-
40
- if key.match(/^disable_/) # "disable_httpclient"
41
- section_key = DISABLING
42
- elsif components.length == 2 # "analytics_events.enabled"
43
- section_key = components.first
44
- elsif components[1] == "attributes" # "transaction_tracer.attributes.enabled"
45
- section_key = ATTRIBUTES
46
- end
47
-
48
- sections[section_key] << {
49
- :key => key,
50
- :type => format_type(value[:type]),
51
- :description => format_description(value),
52
- :default => format_default_value(value),
53
- :env_var => format_env_var(key)
54
- }
55
- end
56
- sections
57
- end
58
-
59
- def flatten_config_hash(config_hash)
60
- sections = []
61
- sections << pluck(GENERAL, config_hash)
62
- sections << pluck("transaction_tracer", config_hash)
63
- sections << pluck("error_collector", config_hash)
64
- sections << pluck("browser_monitoring", config_hash)
65
- sections << pluck("analytics_events", config_hash)
66
- sections.concat(config_hash.to_a.sort_by { |a| a.first})
67
-
68
- add_data_to_sections(sections)
69
-
70
- sections
71
- end
72
-
73
- def add_data_to_sections(sections)
74
- sections.each do |section|
75
- section_key = section[0]
76
- section.insert(1, format_name(section_key))
77
- section.insert(2, SECTION_DESCRIPTIONS[section_key])
78
- end
79
- end
80
-
81
- def format_name(key)
82
- name = NAME_OVERRIDES[key]
83
- return name if name
84
-
85
- key.split("_").
86
- each { |fragment| fragment[0] = fragment[0].upcase }.
87
- join(" ")
88
- end
89
-
90
- def format_type(type)
91
- if type == NewRelic::Agent::Configuration::Boolean
92
- "Boolean"
93
- else
94
- type
95
- end
96
- end
97
-
98
- def format_description(value)
99
- description = value[:description]
100
- description = "<b>DEPRECATED</b> #{description}" if value[:deprecated]
101
- description
102
- end
103
-
104
- def format_default_value(spec)
105
- if spec[:default].is_a?(Proc)
106
- '(Dynamic)'
107
- else
108
- "<code>#{spec[:default].inspect}</code>"
109
- end
110
- end
111
-
112
- def format_env_var(key)
113
- "NEW_RELIC_#{key.gsub(".", "_").upcase}"
114
- end
115
-
116
- def pluck(key, config_hash)
117
- value = config_hash.delete(key)
118
- [key, value]
119
- end
120
-
121
- def build_erb(format)
122
- require 'erb'
123
- path = File.join(File.dirname(__FILE__), "config.#{format}.erb")
124
- template = File.read(File.expand_path(path))
125
- ERB.new(template)
126
- end
127
-
32
+ desc "Describe available New Relic configuration settings"
128
33
  task :docs, [:format] => [] do |t, args|
129
34
  require File.expand_path(File.join(File.dirname(__FILE__), "..", "new_relic", "agent", "configuration", "default_source.rb"))
130
35
  format = args[:format] || "text"
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ # This file is distributed under New Relic's license terms.
3
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
+
5
+ if ENV['CI']
6
+ namespace :coverage do
7
+ desc "Collates all result sets generated by the different test runners"
8
+ task :report do
9
+ require 'simplecov'
10
+ require 'fileutils'
11
+
12
+ SimpleCov.coverage_dir('coverage_results')
13
+
14
+ SimpleCov.collate(Dir['*/coverage_*/.resultset.json']) do
15
+ formatter SimpleCov::Formatter::HTMLFormatter
16
+ refuse_coverage_drop
17
+ end
18
+
19
+ Dir['lib/coverage_{[!r][!e][!s][!u][!l][!t][!s]}*'].each { |dir| FileUtils.rm_rf(dir) }
20
+ end
21
+
22
+ desc "Removes all coverage_* directories"
23
+ task :clear do
24
+ require 'fileutils'
25
+ Dir["lib/coverage_*"].each { |dir| FileUtils.rm_rf(dir) }
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,21 @@
1
+ <% sections.each do |(section_key, section_name, section_description, configs)| %>
2
+ ## <%=section_name%>
3
+
4
+ <%= "#{section_description}" unless section_description.nil? %>
5
+
6
+ <CollapserGroup>
7
+ <% configs.each do |config|%>
8
+ <Collapser id="<%= config[:key].gsub('.', '-') %>" title="<%=config[:key]%>">
9
+ <table>
10
+ <tbody>
11
+ <tr><th>Type</th><td><%=config[:type]%></td></tr>
12
+ <tr><th>Default</th><td>`<%=config[:default]%>`</td></tr>
13
+ <tr><th>Environ variable</th><td>`<%=config[:env_var]%>`</td></tr>
14
+ </tbody>
15
+ </table>
16
+
17
+ <%=config[:description]%>
18
+ </Collapser>
19
+ <% end %>
20
+ </CollapserGroup>
21
+ <% end %>
@@ -0,0 +1,123 @@
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 Format
6
+ def output(format)
7
+ config_hash = build_config_hash
8
+ sections = flatten_config_hash(config_hash)
9
+
10
+ puts build_erb(format).result(binding).split("\n").map(&:rstrip).join("\n").gsub('. ', '. ')
11
+ sections # silences unused warning to return this
12
+ end
13
+
14
+ private
15
+
16
+ def add_data_to_sections(sections)
17
+ sections.each do |section|
18
+ section_key = section[0]
19
+ section.insert(1, format_name(section_key))
20
+ section.insert(2, SECTION_DESCRIPTIONS[section_key])
21
+ end
22
+ end
23
+
24
+ def build_config_hash
25
+ sections = Hash.new { |hash, key| hash[key] = [] }
26
+ NewRelic::Agent::Configuration::DEFAULTS.each do |key, value|
27
+ next unless value[:public]
28
+
29
+ key = key.to_s
30
+ section_key = section_key(key, key.split('.'))
31
+ sections[section_key] << format_sections(key, value)
32
+ end
33
+ sections
34
+ end
35
+
36
+ def build_erb(format)
37
+ require 'erb'
38
+ path = File.join(File.dirname(__FILE__), "config.#{format}.erb")
39
+ template = File.read(File.expand_path(path))
40
+ ERB.new(template)
41
+ end
42
+
43
+ def flatten_config_hash(config_hash)
44
+ sections = []
45
+ config = [GENERAL, 'transaction_tracer', 'error_collector',
46
+ 'browser_monitoring', 'analytics_events', 'transaction_events',
47
+ 'application_logging']
48
+
49
+ config.each { |config| sections << pluck(config, config_hash) }
50
+
51
+ sections.concat(config_hash.to_a.sort_by { |a| a.first })
52
+ add_data_to_sections(sections)
53
+
54
+ sections
55
+ end
56
+
57
+ def format_default_value(spec)
58
+ return spec[:documentation_default] if !spec[:documentation_default].nil?
59
+
60
+ if spec[:default].is_a?(Proc)
61
+ '(Dynamic)'
62
+ else
63
+ "#{spec[:default].inspect}"
64
+ end
65
+ end
66
+
67
+ def format_description(value)
68
+ description = ''
69
+ description += "<b>DEPRECATED</b> " if value[:deprecated]
70
+ description += value[:description]
71
+ description
72
+ end
73
+
74
+ def format_env_var(key)
75
+ return "None" if NON_ENV_CONFIGS.include?(key)
76
+
77
+ "NEW_RELIC_#{key.tr(".", "_").upcase}"
78
+ end
79
+
80
+ def format_name(key)
81
+ name = NAME_OVERRIDES[key]
82
+ return name if name
83
+
84
+ key.split("_")
85
+ .each { |fragment| fragment[0] = fragment[0].upcase }
86
+ .join(" ")
87
+ end
88
+
89
+ def format_sections(key, value)
90
+ {
91
+ :key => key,
92
+ :type => format_type(value[:type]),
93
+ :description => format_description(value),
94
+ :default => format_default_value(value),
95
+ :env_var => format_env_var(key)
96
+ }
97
+ end
98
+
99
+ def format_type(type)
100
+ if type == NewRelic::Agent::Configuration::Boolean
101
+ "Boolean"
102
+ else
103
+ type
104
+ end
105
+ end
106
+
107
+ def pluck(key, config_hash)
108
+ value = config_hash.delete(key)
109
+ [key, value]
110
+ end
111
+
112
+ def section_key(key, components)
113
+ if key =~ /^disable_/ # "disable_httpclient"
114
+ DISABLING
115
+ elsif components.length >= 2 && !(components[1] == "attributes") # "analytics_events.enabled"
116
+ components.first
117
+ elsif components[1] == "attributes" # "transaction_tracer.attributes.enabled"
118
+ ATTRIBUTES
119
+ else
120
+ GENERAL
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,12 @@
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 Matches
6
+ def look_for_seed(tasks)
7
+ matches = tasks.map { |t| /(seed=.*?)[,\]]/.match(t) }.compact
8
+ if matches.any?
9
+ matches.first[1]
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,24 @@
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 Prompt
6
+ def prompt_to_continue(command, destination = 'local')
7
+ puts "The following rsync command will be executed to update the #{destination} copy of the specs:"
8
+ puts
9
+ puts command
10
+ puts
11
+ puts "CAUTION: Any unsaved changes that exist within the #{destination} content will be OVERWRITTEN!"
12
+ if destination.eql?('local')
13
+ puts 'CAUTION 2: Before continuing, make sure your local repo is on the correct, synced branch!'
14
+ end
15
+ puts
16
+ print "Do you wish to continue? ('y' to continue, return to cancel) [n] "
17
+ continue = STDIN.gets.chomp
18
+ if continue.casecmp('y') == 0
19
+ system(command)
20
+ else
21
+ puts 'Cancelled'
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,33 @@
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 Removers
6
+ def remove_local_multiverse_databases
7
+ list_databases_command = %(echo "show databases" | mysql -u root)
8
+ databases = `#{list_databases_command}`.chomp!.split("\n").select { |s| s.include?('multiverse') }
9
+ databases.each do |database|
10
+ puts "Dropping #{database}"
11
+ `echo "drop database #{database}" | mysql -u root`
12
+ end
13
+ rescue => error
14
+ puts "ERROR: Cannot get MySQL databases..."
15
+ puts error.message
16
+ end
17
+
18
+ def remove_generated_gemfiles
19
+ file_path = File.expand_path("test/multiverse/suites")
20
+ Dir.glob(File.join(file_path, "**", "Gemfile*")).each do |fn|
21
+ puts "Removing #{fn.gsub(file_path, '.../suites')}"
22
+ FileUtils.rm(fn)
23
+ end
24
+ end
25
+
26
+ def remove_generated_gemfile_lockfiles
27
+ file_path = File.expand_path("test/environments")
28
+ Dir.glob(File.join(file_path, "**", "Gemfile.lock")).each do |fn|
29
+ puts "Removing #{fn.gsub(file_path, '.../environments')}"
30
+ FileUtils.rm(fn)
31
+ end
32
+ end
33
+ end
@@ -1,3 +1,7 @@
1
+ # This file is distributed under New Relic's license terms.
2
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
3
+ # frozen_string_literal: true
4
+
1
5
  namespace :newrelic do
2
6
  desc "Install a default config/newrelic.yml file"
3
7
  task :install do