newrelic_rpm 4.8.0.341 → 6.13.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (343) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +31 -0
  3. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  4. data/.github/ISSUE_TEMPLATE/feature_request.md +24 -0
  5. data/.github/actions/annotate/README.md +79 -0
  6. data/.github/actions/annotate/action.yml +6 -0
  7. data/.github/actions/annotate/dist/index.js +433 -0
  8. data/.github/actions/annotate/index.js +25 -0
  9. data/.github/actions/annotate/package-lock.json +172 -0
  10. data/.github/actions/annotate/package.json +30 -0
  11. data/.github/actions/annotate/pre-commit +5 -0
  12. data/.github/actions/build-ruby/README.md +79 -0
  13. data/.github/actions/build-ruby/action.yml +15 -0
  14. data/.github/actions/build-ruby/dist/index.js +52683 -0
  15. data/.github/actions/build-ruby/index.js +514 -0
  16. data/.github/actions/build-ruby/package-lock.json +581 -0
  17. data/.github/actions/build-ruby/package.json +32 -0
  18. data/.github/actions/build-ruby/pre-commit +5 -0
  19. data/.github/pull_request_template.md +16 -0
  20. data/.github/workflows/ci.yml +212 -0
  21. data/.github/workflows/pr_review_checklist.yml +22 -0
  22. data/.github/workflows/release.yml +78 -0
  23. data/.github/workflows/scripts/rubygems-authenticate.py +13 -0
  24. data/.github/workflows/scripts/rubygems-publish.rb +32 -0
  25. data/.github/workflows/snyk.yml +27 -0
  26. data/.github/workflows/stale.yml +21 -0
  27. data/.gitignore +9 -0
  28. data/.yardopts +4 -1
  29. data/CHANGELOG.md +868 -3
  30. data/CONTRIBUTING.md +106 -19
  31. data/Gemfile +6 -2
  32. data/Guardfile +18 -1
  33. data/LICENSE +208 -38
  34. data/README.md +81 -88
  35. data/ROADMAP.md +24 -0
  36. data/Rakefile +2 -0
  37. data/THIRD_PARTY_NOTICES.md +213 -0
  38. data/bin/nrdebug +1 -1
  39. data/config.dot +3 -12
  40. data/init.rb +1 -1
  41. data/install.rb +1 -1
  42. data/lib/new_relic/agent.rb +145 -31
  43. data/lib/new_relic/agent/adaptive_sampler.rb +104 -0
  44. data/lib/new_relic/agent/agent.rb +192 -190
  45. data/lib/new_relic/agent/agent_logger.rb +5 -1
  46. data/lib/new_relic/agent/attribute_filter.rb +85 -25
  47. data/lib/new_relic/agent/attribute_processing.rb +1 -1
  48. data/lib/new_relic/agent/attributes.rb +152 -0
  49. data/lib/new_relic/agent/audit_logger.rb +1 -1
  50. data/lib/new_relic/agent/autostart.rb +20 -15
  51. data/lib/new_relic/agent/chained_call.rb +1 -1
  52. data/lib/new_relic/agent/commands/agent_command.rb +1 -1
  53. data/lib/new_relic/agent/commands/agent_command_router.rb +3 -22
  54. data/lib/new_relic/agent/commands/thread_profiler_session.rb +1 -1
  55. data/lib/new_relic/agent/configuration.rb +1 -1
  56. data/lib/new_relic/agent/configuration/default_source.rb +375 -67
  57. data/lib/new_relic/agent/configuration/dotted_hash.rb +1 -1
  58. data/lib/new_relic/agent/configuration/environment_source.rb +5 -3
  59. data/lib/new_relic/agent/configuration/event_harvest_config.rb +45 -0
  60. data/lib/new_relic/agent/configuration/high_security_source.rb +2 -3
  61. data/lib/new_relic/agent/configuration/manager.rb +54 -43
  62. data/lib/new_relic/agent/configuration/manual_source.rb +1 -1
  63. data/lib/new_relic/agent/configuration/mask_defaults.rb +1 -1
  64. data/lib/new_relic/agent/configuration/security_policy_source.rb +238 -0
  65. data/lib/new_relic/agent/configuration/server_source.rb +46 -5
  66. data/lib/new_relic/agent/configuration/yaml_source.rb +12 -7
  67. data/lib/new_relic/agent/connect/request_builder.rb +61 -0
  68. data/lib/new_relic/agent/connect/response_handler.rb +61 -0
  69. data/lib/new_relic/agent/custom_event_aggregator.rb +17 -6
  70. data/lib/new_relic/agent/database.rb +21 -3
  71. data/lib/new_relic/agent/database/explain_plan_helpers.rb +12 -1
  72. data/lib/new_relic/agent/database/obfuscation_helpers.rb +2 -2
  73. data/lib/new_relic/agent/database/obfuscator.rb +1 -1
  74. data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +1 -1
  75. data/lib/new_relic/agent/datastores.rb +12 -11
  76. data/lib/new_relic/agent/datastores/metric_helper.rb +2 -3
  77. data/lib/new_relic/agent/datastores/mongo.rb +2 -2
  78. data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +3 -3
  79. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +1 -1
  80. data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +9 -9
  81. data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +1 -1
  82. data/lib/new_relic/agent/datastores/redis.rb +1 -1
  83. data/lib/new_relic/agent/deprecator.rb +1 -1
  84. data/lib/new_relic/agent/distributed_tracing.rb +216 -0
  85. data/lib/new_relic/agent/distributed_tracing/cross_app_payload.rb +44 -0
  86. data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +248 -0
  87. data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +84 -0
  88. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
  89. data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +165 -0
  90. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +39 -0
  91. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +246 -0
  92. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +126 -0
  93. data/lib/new_relic/agent/encoding_normalizer.rb +1 -1
  94. data/lib/new_relic/agent/error_collector.rb +51 -20
  95. data/lib/new_relic/agent/error_event_aggregator.rb +14 -7
  96. data/lib/new_relic/agent/error_trace_aggregator.rb +2 -1
  97. data/lib/new_relic/agent/event_aggregator.rb +34 -15
  98. data/lib/new_relic/agent/event_buffer.rb +1 -1
  99. data/lib/new_relic/agent/event_listener.rb +1 -1
  100. data/lib/new_relic/agent/event_loop.rb +1 -1
  101. data/lib/new_relic/agent/external.rb +31 -29
  102. data/lib/new_relic/agent/guid_generator.rb +28 -0
  103. data/lib/new_relic/agent/harvester.rb +1 -1
  104. data/lib/new_relic/agent/heap.rb +140 -0
  105. data/lib/new_relic/agent/hostname.rb +16 -2
  106. data/lib/new_relic/agent/http_clients/abstract.rb +82 -0
  107. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +25 -20
  108. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +29 -14
  109. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +18 -22
  110. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +11 -12
  111. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +17 -5
  112. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +5 -7
  113. data/lib/new_relic/agent/http_clients/uri_util.rb +12 -11
  114. data/lib/new_relic/agent/instrumentation.rb +1 -1
  115. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +26 -43
  116. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +56 -74
  117. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +82 -56
  118. data/lib/new_relic/agent/instrumentation/active_job.rb +19 -17
  119. data/lib/new_relic/agent/instrumentation/active_merchant.rb +1 -1
  120. data/lib/new_relic/agent/instrumentation/active_record.rb +85 -38
  121. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +82 -24
  122. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +168 -0
  123. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +102 -31
  124. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +47 -57
  125. data/lib/new_relic/agent/instrumentation/active_storage.rb +23 -0
  126. data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +63 -0
  127. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +24 -8
  128. data/lib/new_relic/agent/instrumentation/authlogic.rb +1 -1
  129. data/lib/new_relic/agent/instrumentation/bunny.rb +115 -44
  130. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +18 -12
  131. data/lib/new_relic/agent/instrumentation/curb.rb +121 -35
  132. data/lib/new_relic/agent/instrumentation/data_mapper.rb +6 -4
  133. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +61 -25
  134. data/lib/new_relic/agent/instrumentation/excon.rb +2 -2
  135. data/lib/new_relic/agent/instrumentation/excon/connection.rb +8 -5
  136. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +4 -3
  137. data/lib/new_relic/agent/instrumentation/grape.rb +46 -35
  138. data/lib/new_relic/agent/instrumentation/http.rb +8 -5
  139. data/lib/new_relic/agent/instrumentation/httpclient.rb +7 -5
  140. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +1 -1
  141. data/lib/new_relic/agent/instrumentation/memcache.rb +5 -3
  142. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +10 -6
  143. data/lib/new_relic/agent/instrumentation/merb/controller.rb +1 -1
  144. data/lib/new_relic/agent/instrumentation/merb/errors.rb +1 -1
  145. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +13 -5
  146. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +20 -11
  147. data/lib/new_relic/agent/instrumentation/mongo.rb +11 -5
  148. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +39 -7
  149. data/lib/new_relic/agent/instrumentation/net.rb +60 -23
  150. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +100 -0
  151. data/lib/new_relic/agent/instrumentation/padrino.rb +40 -16
  152. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +1 -1
  153. data/lib/new_relic/agent/instrumentation/queue_time.rb +1 -1
  154. data/lib/new_relic/agent/instrumentation/rack.rb +36 -13
  155. data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +1 -1
  156. data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +1 -1
  157. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +1 -1
  158. data/lib/new_relic/agent/instrumentation/rails_middleware.rb +1 -1
  159. data/lib/new_relic/agent/instrumentation/{rails5 → rails_notifications}/action_cable.rb +8 -5
  160. data/lib/new_relic/agent/instrumentation/{rails5 → rails_notifications}/action_controller.rb +4 -4
  161. data/lib/new_relic/agent/instrumentation/{rails4 → rails_notifications}/action_view.rb +4 -4
  162. data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +1 -1
  163. data/lib/new_relic/agent/instrumentation/rake.rb +56 -22
  164. data/lib/new_relic/agent/instrumentation/redis.rb +141 -56
  165. data/lib/new_relic/agent/instrumentation/resque.rb +21 -37
  166. data/lib/new_relic/agent/instrumentation/sequel.rb +2 -3
  167. data/lib/new_relic/agent/instrumentation/sequel_helper.rb +1 -1
  168. data/lib/new_relic/agent/instrumentation/sidekiq.rb +48 -24
  169. data/lib/new_relic/agent/instrumentation/sinatra.rb +62 -23
  170. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +1 -1
  171. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +1 -1
  172. data/lib/new_relic/agent/instrumentation/sunspot.rb +1 -1
  173. data/lib/new_relic/agent/instrumentation/typhoeus.rb +27 -10
  174. data/lib/new_relic/agent/internal_agent_error.rb +1 -1
  175. data/lib/new_relic/agent/javascript_instrumentor.rb +19 -16
  176. data/lib/new_relic/agent/log_once.rb +1 -1
  177. data/lib/new_relic/agent/logging.rb +139 -0
  178. data/lib/new_relic/agent/memory_logger.rb +1 -1
  179. data/lib/new_relic/agent/messaging.rb +15 -59
  180. data/lib/new_relic/agent/method_tracer.rb +42 -25
  181. data/lib/new_relic/agent/method_tracer_helpers.rb +5 -5
  182. data/lib/new_relic/agent/monitors.rb +27 -0
  183. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +110 -0
  184. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +27 -0
  185. data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +4 -4
  186. data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +4 -7
  187. data/lib/new_relic/agent/new_relic_service.rb +174 -63
  188. data/lib/new_relic/agent/new_relic_service/encoders.rb +1 -1
  189. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +1 -2
  190. data/lib/new_relic/agent/new_relic_service/marshaller.rb +6 -27
  191. data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +61 -0
  192. data/lib/new_relic/agent/noticible_error.rb +22 -0
  193. data/lib/new_relic/agent/null_logger.rb +1 -1
  194. data/lib/new_relic/agent/obfuscator.rb +1 -1
  195. data/lib/new_relic/agent/parameter_filtering.rb +19 -6
  196. data/lib/new_relic/agent/payload_metric_mapping.rb +1 -1
  197. data/lib/new_relic/agent/pipe_channel_manager.rb +1 -1
  198. data/lib/new_relic/agent/pipe_service.rb +5 -1
  199. data/lib/new_relic/agent/prepend_supportability.rb +1 -1
  200. data/lib/new_relic/agent/priority_sampled_buffer.rb +95 -0
  201. data/lib/new_relic/agent/range_extensions.rb +1 -1
  202. data/lib/new_relic/agent/rules_engine.rb +1 -1
  203. data/lib/new_relic/agent/rules_engine/replacement_rule.rb +1 -1
  204. data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +1 -1
  205. data/lib/new_relic/agent/sampler.rb +1 -1
  206. data/lib/new_relic/agent/sampler_collection.rb +1 -1
  207. data/lib/new_relic/agent/samplers/cpu_sampler.rb +1 -1
  208. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +1 -1
  209. data/lib/new_relic/agent/samplers/memory_sampler.rb +1 -1
  210. data/lib/new_relic/agent/samplers/object_sampler.rb +1 -1
  211. data/lib/new_relic/agent/samplers/vm_sampler.rb +1 -1
  212. data/lib/new_relic/agent/span_event_aggregator.rb +49 -0
  213. data/lib/new_relic/agent/span_event_primitive.rb +206 -0
  214. data/lib/new_relic/agent/sql_sampler.rb +23 -7
  215. data/lib/new_relic/agent/stats.rb +1 -1
  216. data/lib/new_relic/agent/stats_engine.rb +4 -4
  217. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +1 -1
  218. data/lib/new_relic/agent/stats_engine/stats_hash.rb +1 -1
  219. data/lib/new_relic/agent/supported_versions.rb +3 -3
  220. data/lib/new_relic/agent/synthetics_event_aggregator.rb +6 -13
  221. data/lib/new_relic/agent/system_info.rb +18 -8
  222. data/lib/new_relic/agent/threading/agent_thread.rb +6 -4
  223. data/lib/new_relic/agent/threading/backtrace_node.rb +1 -1
  224. data/lib/new_relic/agent/threading/backtrace_service.rb +4 -4
  225. data/lib/new_relic/agent/threading/thread_profile.rb +10 -24
  226. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +19 -0
  227. data/lib/new_relic/agent/tracer.rb +509 -0
  228. data/lib/new_relic/agent/transaction.rb +191 -278
  229. data/lib/new_relic/agent/transaction/abstract_segment.rb +38 -5
  230. data/lib/new_relic/agent/transaction/datastore_segment.rb +30 -5
  231. data/lib/new_relic/agent/transaction/distributed_tracer.rb +171 -0
  232. data/lib/new_relic/agent/transaction/distributed_tracing.rb +123 -71
  233. data/lib/new_relic/agent/transaction/external_request_segment.rb +41 -89
  234. data/lib/new_relic/agent/transaction/message_broker_segment.rb +7 -8
  235. data/lib/new_relic/agent/transaction/request_attributes.rb +1 -1
  236. data/lib/new_relic/agent/transaction/segment.rb +42 -2
  237. data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +1 -1
  238. data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +1 -1
  239. data/lib/new_relic/agent/transaction/trace.rb +7 -23
  240. data/lib/new_relic/agent/transaction/trace_builder.rb +1 -2
  241. data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
  242. data/lib/new_relic/agent/transaction/trace_node.rb +12 -8
  243. data/lib/new_relic/agent/transaction/tracing.rb +2 -100
  244. data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +1 -1
  245. data/lib/new_relic/agent/transaction_error_primitive.rb +13 -22
  246. data/lib/new_relic/agent/transaction_event_aggregator.rb +7 -16
  247. data/lib/new_relic/agent/transaction_event_primitive.rb +31 -42
  248. data/lib/new_relic/agent/transaction_event_recorder.rb +8 -16
  249. data/lib/new_relic/agent/transaction_metrics.rb +1 -1
  250. data/lib/new_relic/agent/transaction_sampler.rb +3 -14
  251. data/lib/new_relic/agent/transaction_time_aggregator.rb +155 -0
  252. data/lib/new_relic/agent/utilization/aws.rb +1 -1
  253. data/lib/new_relic/agent/utilization/azure.rb +1 -1
  254. data/lib/new_relic/agent/utilization/gcp.rb +1 -1
  255. data/lib/new_relic/agent/utilization/pcf.rb +1 -1
  256. data/lib/new_relic/agent/utilization/vendor.rb +1 -1
  257. data/lib/new_relic/agent/utilization_data.rb +37 -2
  258. data/lib/new_relic/agent/vm.rb +1 -1
  259. data/lib/new_relic/agent/vm/jruby_vm.rb +1 -1
  260. data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +1 -1
  261. data/lib/new_relic/agent/vm/mri_vm.rb +1 -1
  262. data/lib/new_relic/agent/vm/snapshot.rb +1 -1
  263. data/lib/new_relic/agent/worker_loop.rb +1 -1
  264. data/lib/new_relic/cli/command.rb +1 -1
  265. data/lib/new_relic/cli/commands/deployments.rb +2 -2
  266. data/lib/new_relic/cli/commands/install.rb +4 -3
  267. data/lib/new_relic/coerce.rb +32 -7
  268. data/lib/new_relic/collection_helper.rb +1 -1
  269. data/lib/new_relic/constants.rb +38 -0
  270. data/lib/new_relic/control.rb +1 -1
  271. data/lib/new_relic/control/class_methods.rb +8 -2
  272. data/lib/new_relic/control/frameworks.rb +1 -1
  273. data/lib/new_relic/control/frameworks/external.rb +1 -1
  274. data/lib/new_relic/control/frameworks/merb.rb +1 -1
  275. data/lib/new_relic/control/frameworks/rails.rb +1 -1
  276. data/lib/new_relic/control/frameworks/rails3.rb +1 -1
  277. data/lib/new_relic/control/frameworks/rails4.rb +1 -1
  278. data/lib/new_relic/control/frameworks/{rails5.rb → rails_notifications.rb} +2 -2
  279. data/lib/new_relic/control/frameworks/ruby.rb +1 -1
  280. data/lib/new_relic/control/frameworks/sinatra.rb +1 -1
  281. data/lib/new_relic/control/instance_methods.rb +30 -4
  282. data/lib/new_relic/control/instrumentation.rb +1 -1
  283. data/lib/new_relic/control/server_methods.rb +1 -1
  284. data/lib/new_relic/delayed_job_injection.rb +1 -1
  285. data/lib/new_relic/dependency_detection.rb +5 -5
  286. data/lib/new_relic/environment_report.rb +6 -2
  287. data/lib/new_relic/helper.rb +1 -1
  288. data/lib/new_relic/language_support.rb +1 -1
  289. data/lib/new_relic/latest_changes.rb +4 -4
  290. data/lib/new_relic/local_environment.rb +1 -1
  291. data/lib/new_relic/metric_data.rb +1 -1
  292. data/lib/new_relic/metric_spec.rb +1 -1
  293. data/lib/new_relic/noticed_error.rb +39 -18
  294. data/lib/new_relic/rack.rb +1 -1
  295. data/lib/new_relic/rack/agent_hooks.rb +1 -1
  296. data/lib/new_relic/rack/agent_middleware.rb +2 -2
  297. data/lib/new_relic/rack/browser_monitoring.rb +16 -9
  298. data/lib/new_relic/recipes.rb +1 -1
  299. data/lib/new_relic/recipes/capistrano3.rb +6 -3
  300. data/lib/new_relic/recipes/capistrano_legacy.rb +1 -1
  301. data/lib/new_relic/supportability_helper.rb +15 -1
  302. data/lib/new_relic/version.rb +4 -4
  303. data/lib/newrelic_rpm.rb +1 -1
  304. data/lib/sequel/extensions/newrelic_instrumentation.rb +3 -3
  305. data/lib/sequel/plugins/newrelic_instrumentation.rb +2 -2
  306. data/lib/tasks/all.rb +1 -1
  307. data/lib/tasks/config.rake +1 -2
  308. data/lib/tasks/multiverse.rb +35 -1
  309. data/lib/tasks/newrelic.rb +1 -1
  310. data/lib/tasks/tests.rake +6 -1
  311. data/newrelic_rpm.gemspec +23 -17
  312. data/recipes/newrelic.rb +1 -1
  313. data/test/agent_helper.rb +357 -78
  314. metadata +154 -60
  315. data/.travis.yml +0 -173
  316. data/lib/new_relic/agent/busy_calculator.rb +0 -117
  317. data/lib/new_relic/agent/commands/xray_session.rb +0 -55
  318. data/lib/new_relic/agent/commands/xray_session_collection.rb +0 -161
  319. data/lib/new_relic/agent/cross_app_monitor.rb +0 -140
  320. data/lib/new_relic/agent/cross_app_tracing.rb +0 -143
  321. data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -29
  322. data/lib/new_relic/agent/distributed_trace_payload.rb +0 -223
  323. data/lib/new_relic/agent/distributed_trace_priority_sampled_buffer.rb +0 -72
  324. data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
  325. data/lib/new_relic/agent/instrumentation/active_record_4.rb +0 -42
  326. data/lib/new_relic/agent/instrumentation/active_record_5.rb +0 -36
  327. data/lib/new_relic/agent/instrumentation/evented_subscriber.rb +0 -104
  328. data/lib/new_relic/agent/instrumentation/rails4/action_controller.rb +0 -32
  329. data/lib/new_relic/agent/instrumentation/rails5/action_view.rb +0 -27
  330. data/lib/new_relic/agent/sampled_buffer.rb +0 -68
  331. data/lib/new_relic/agent/sized_buffer.rb +0 -23
  332. data/lib/new_relic/agent/synthetics_event_buffer.rb +0 -40
  333. data/lib/new_relic/agent/throughput_monitor.rb +0 -59
  334. data/lib/new_relic/agent/transaction/attributes.rb +0 -153
  335. data/lib/new_relic/agent/transaction/xray_sample_buffer.rb +0 -64
  336. data/lib/new_relic/agent/transaction_state.rb +0 -145
  337. data/lib/new_relic/agent/transaction_timings.rb +0 -57
  338. data/lib/new_relic/metrics.rb +0 -13
  339. data/lib/tasks/versions.html.erb +0 -28
  340. data/lib/tasks/versions.postface.html +0 -8
  341. data/lib/tasks/versions.preface.html +0 -9
  342. data/lib/tasks/versions.rake +0 -65
  343. data/lib/tasks/versions.txt.erb +0 -14
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
3
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
4
 
5
5
  module NewRelic
6
6
  module Agent
@@ -10,6 +10,7 @@ module NewRelic
10
10
  # response, but should still be merged in as config settings to the
11
11
  # main agent configuration.
12
12
  TOP_LEVEL_KEYS = [
13
+ "account_id",
13
14
  "apdex_t",
14
15
  "application_id",
15
16
  "beacon",
@@ -19,12 +20,17 @@ module NewRelic
19
20
  "browser_monitoring.loader_version",
20
21
  "cross_process_id",
21
22
  "data_report_period",
22
- "data_report_periods.analytic_event_data",
23
23
  "encoding_key",
24
+ "entity_guid",
24
25
  "error_beacon",
25
26
  "js_agent_file",
26
27
  "js_agent_loader",
27
- "trusted_account_ids"
28
+ "max_payload_size_in_bytes",
29
+ "primary_application_id",
30
+ "sampling_target",
31
+ "sampling_target_period_in_seconds",
32
+ "trusted_account_ids",
33
+ "trusted_account_key"
28
34
  ]
29
35
 
30
36
  def initialize(connect_reply, existing_config={})
@@ -33,6 +39,7 @@ module NewRelic
33
39
  merge_top_level_keys(merged_settings, connect_reply)
34
40
  merge_agent_config_hash(merged_settings, connect_reply)
35
41
  fix_transaction_threshold(merged_settings)
42
+ add_event_harvest_config(merged_settings, connect_reply)
36
43
  filter_keys(merged_settings)
37
44
 
38
45
  apply_feature_gates(merged_settings, connect_reply, existing_config)
@@ -63,11 +70,44 @@ module NewRelic
63
70
 
64
71
  def fix_transaction_threshold(merged_settings)
65
72
  # when value is "apdex_f" remove the config and defer to default
66
- if merged_settings['transaction_tracer.transaction_threshold'] =~ /apdex_f/i
73
+ if merged_settings['transaction_tracer.transaction_threshold'].to_s =~ /apdex_f/i
67
74
  merged_settings.delete('transaction_tracer.transaction_threshold')
68
75
  end
69
76
  end
70
77
 
78
+ EVENT_HARVEST_CONFIG_SUPPORTABILITY_METRIC_NAMES = {
79
+ :'analytics_events.max_samples_stored' => 'Supportability/EventHarvest/AnalyticEventData/HarvestLimit',
80
+ :'custom_insights_events.max_samples_stored' => 'Supportability/EventHarvest/CustomEventData/HarvestLimit',
81
+ :'error_collector.max_event_samples_stored'=> 'Supportability/EventHarvest/ErrorEventData/HarvestLimit',
82
+ :'span_events.max_samples_stored'=> 'Supportability/EventHarvest/SpanEventData/HarvestLimit',
83
+ :event_report_period => 'Supportability/EventHarvest/ReportPeriod'
84
+ }
85
+
86
+ def add_event_harvest_config(merged_settings, connect_reply)
87
+ return unless event_harvest_config_is_valid connect_reply
88
+
89
+ event_harvest_config = EventHarvestConfig.to_config_hash(connect_reply)
90
+ EVENT_HARVEST_CONFIG_SUPPORTABILITY_METRIC_NAMES.each do |config_key, metric_name|
91
+ NewRelic::Agent.record_metric metric_name, event_harvest_config[config_key]
92
+ end
93
+
94
+ merged_settings.merge! event_harvest_config
95
+ end
96
+
97
+ def event_harvest_config_is_valid connect_reply
98
+ event_harvest_config = connect_reply['event_harvest_config']
99
+
100
+ if event_harvest_config.nil? \
101
+ || event_harvest_config['harvest_limits'].values.min < 0 \
102
+ || (event_harvest_config['report_period_ms'] / 1000) <= 0
103
+ NewRelic::Agent.logger.warn "Invalid event harvest config found " \
104
+ "in connect response; using default event report period."
105
+ false
106
+ else
107
+ true
108
+ end
109
+ end
110
+
71
111
  def filter_keys(merged_settings)
72
112
  merged_settings.delete_if do |key, _|
73
113
  setting_spec = DEFAULTS[key.to_sym]
@@ -97,7 +137,8 @@ module NewRelic
97
137
  'error_collector.enabled' => 'collect_errors',
98
138
  'analytics_events.enabled' => 'collect_analytics_events',
99
139
  'custom_insights_events.enabled' => 'collect_custom_events',
100
- 'error_collector.capture_events' => 'collect_error_events'
140
+ 'error_collector.capture_events' => 'collect_error_events',
141
+ 'span_events.enabled' => 'collect_span_events'
101
142
  }
102
143
  gated_features.each do |config_key, gate_key|
103
144
  if connect_reply.has_key?(gate_key)
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
3
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
4
 
5
5
  require 'new_relic/agent/configuration/dotted_hash'
6
6
 
@@ -12,6 +12,7 @@ module NewRelic
12
12
  attr_reader :generated_for_user, :license_key
13
13
 
14
14
  def initialize(path, env)
15
+ @path = path
15
16
  config = {}
16
17
  @failures = []
17
18
 
@@ -111,30 +112,34 @@ module NewRelic
111
112
 
112
113
  def substitute_transaction_threshold(config)
113
114
  if config['transaction_tracer'] &&
114
- config['transaction_tracer']['transaction_threshold'] =~ /apdex_f/i
115
+ config['transaction_tracer']['transaction_threshold'].to_s =~ /apdex_f/i
115
116
  # when value is "apdex_f" remove the config and defer to default
116
117
  config['transaction_tracer'].delete('transaction_threshold')
117
118
  end
118
119
  end
119
120
 
120
121
  def booleanify_values(config, *keys)
121
- # auto means defer ro default
122
+ # auto means defer to default
122
123
  keys.each do |option|
123
- if config[option] == 'auto'
124
+ if 'auto' == config[option]
124
125
  config.delete(option)
125
126
  elsif !config[option].nil? && !is_boolean?(config[option])
126
- config[option] = !!(config[option] =~ /yes|on|true/i)
127
+ coerced_value = !!(config[option].to_s =~ /yes|on|true/i)
128
+ if !coerced_value
129
+ log_failure "Unexpected value (#{config[option]}) for '#{option}' in #{@path}"
130
+ end
131
+ config[option] = coerced_value
127
132
  end
128
133
  end
129
134
  end
130
135
 
131
136
  def is_boolean?(value)
132
- value == !!value
137
+ !!value == value
133
138
  end
134
139
 
135
140
  def log_failure(*messages)
136
141
  ::NewRelic::Agent.logger.error(*messages)
137
- @failures << messages
142
+ messages.each { |message| @failures << message }
138
143
  end
139
144
  end
140
145
  end
@@ -0,0 +1,61 @@
1
+ # encoding: utf-8
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
+ require 'new_relic/environment_report'
6
+ require 'new_relic/agent/configuration/event_harvest_config'
7
+
8
+ module NewRelic
9
+ module Agent
10
+ module Connect
11
+
12
+ class RequestBuilder
13
+
14
+ def initialize(new_relic_service, config, event_harvest_config, environment_report)
15
+ @service = new_relic_service
16
+ @config = config
17
+ @event_harvest_config = event_harvest_config
18
+ @environment_report = sanitize_environment_report(environment_report)
19
+ end
20
+
21
+
22
+ # Initializes the hash of settings that we send to the
23
+ # server. Returns a literal hash containing the options
24
+ def connect_payload
25
+ {
26
+ :pid => $$,
27
+ :host => local_host,
28
+ :display_host => Agent.config[:'process_host.display_name'],
29
+ :app_name => Agent.config[:app_name],
30
+ :language => 'ruby',
31
+ :labels => Agent.config.parsed_labels,
32
+ :agent_version => NewRelic::VERSION::STRING,
33
+ :environment => @environment_report,
34
+ :metadata => environment_metadata,
35
+ :settings => Agent.config.to_collector_hash,
36
+ :high_security => Agent.config[:high_security],
37
+ :utilization => UtilizationData.new.to_collector_hash,
38
+ :identifier => "ruby:#{local_host}:#{Agent.config[:app_name].sort.join(',')}",
39
+ :event_harvest_config => @event_harvest_config
40
+ }
41
+ end
42
+
43
+ # We've seen objects in the environment report (Rails.env in
44
+ # particular) that can't seralize to JSON. Cope with that here and
45
+ # clear out so downstream code doesn't have to check again.
46
+ def sanitize_environment_report(environment_report)
47
+ return [] unless @service.valid_to_marshal?(environment_report)
48
+ environment_report
49
+ end
50
+
51
+ def environment_metadata
52
+ ENV.select {|k, v| k =~ /^NEW_RELIC_METADATA_/}
53
+ end
54
+
55
+ def local_host
56
+ NewRelic::Agent::Hostname.get
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,61 @@
1
+ # encoding: utf-8
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
+
6
+ module NewRelic
7
+ module Agent
8
+ module Connect
9
+
10
+ class ResponseHandler
11
+
12
+ def initialize(agent, config)
13
+ @agent = agent
14
+ @config = config
15
+ end
16
+
17
+ # Takes a hash of configuration data returned from the
18
+ # server and uses it to set local variables and to
19
+ # initialize various parts of the agent that are configured
20
+ # separately.
21
+ #
22
+ # Can accommodate most arbitrary data - anything extra is
23
+ # ignored unless we say to do something with it here.
24
+ def configure_agent(config_data)
25
+ return if config_data == nil
26
+
27
+ @agent.agent_id = config_data['agent_run_id']
28
+
29
+ security_policies = config_data.delete('security_policies')
30
+
31
+ add_server_side_config(config_data)
32
+ add_security_policy_config(security_policies) if security_policies
33
+
34
+ @agent.transaction_rules = RulesEngine.create_transaction_rules(config_data)
35
+ @agent.stats_engine.metric_rules = RulesEngine.create_metric_rules(config_data)
36
+
37
+ # If you're adding something else here to respond to the server-side config,
38
+ # use Agent.instance.events.subscribe(:initial_configuration_complete) callback instead!
39
+ end
40
+
41
+ def add_server_side_config(config_data)
42
+ if config_data['agent_config']
43
+ ::NewRelic::Agent.logger.debug "Using config from server"
44
+ end
45
+
46
+ ::NewRelic::Agent.logger.debug "Server provided config: #{config_data.inspect}"
47
+ server_config = NewRelic::Agent::Configuration::ServerSource.new(config_data, @config)
48
+ @config.replace_or_add_config(server_config)
49
+ end
50
+
51
+ def add_security_policy_config(security_policies)
52
+ ::NewRelic::Agent.logger.info 'Installing security policies'
53
+ security_policy_source = NewRelic::Agent::Configuration::SecurityPolicySource.new(security_policies)
54
+ @config.replace_or_add_config(security_policy_source)
55
+ # drop data collected before applying security policies
56
+ @agent.drop_buffered_data
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
3
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
4
 
5
5
  require 'new_relic/agent/event_aggregator'
6
6
  require 'new_relic/agent/attribute_processing'
@@ -12,6 +12,7 @@ module NewRelic
12
12
 
13
13
  TYPE = 'type'.freeze
14
14
  TIMESTAMP = 'timestamp'.freeze
15
+ PRIORITY = 'priority'.freeze
15
16
  EVENT_TYPE_REGEX = /^[a-zA-Z0-9:_ ]+$/.freeze
16
17
 
17
18
  named :CustomEventAggregator
@@ -23,25 +24,35 @@ module NewRelic
23
24
  raise ArgumentError, "Expected Hash but got #{attributes.class}"
24
25
  end
25
26
 
27
+ return unless enabled?
28
+
26
29
  type = @type_strings[type]
27
30
  unless type =~ EVENT_TYPE_REGEX
28
31
  note_dropped_event(type)
29
32
  return false
30
33
  end
31
34
 
32
- event = [
33
- { TYPE => type, TIMESTAMP => Time.now.to_i },
34
- AttributeProcessing.flatten_and_coerce(attributes)
35
- ]
35
+ priority = attributes[:priority] || rand
36
36
 
37
37
  stored = @lock.synchronize do
38
- @buffer.append(event)
38
+ @buffer.append(priority: priority) do
39
+ create_event(type, priority, attributes)
40
+ end
39
41
  end
40
42
  stored
41
43
  end
42
44
 
43
45
  private
44
46
 
47
+ def create_event(type, priority, attributes)
48
+ [
49
+ { TYPE => type, TIMESTAMP => Time.now.to_i,
50
+ PRIORITY => priority
51
+ },
52
+ AttributeProcessing.flatten_and_coerce(attributes)
53
+ ]
54
+ end
55
+
45
56
  def after_initialize
46
57
  @type_strings = Hash.new { |hash, key| hash[key] = key.to_s.freeze }
47
58
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
3
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
4
 
5
5
  require 'singleton'
6
6
  require 'new_relic/agent/database/explain_plan_helpers'
@@ -133,10 +133,9 @@ module NewRelic
133
133
  ]
134
134
 
135
135
  SQL_COMMENT_REGEX = Regexp.new('/\*.*?\*/', Regexp::MULTILINE).freeze
136
- EMPTY_STRING = ''.freeze
137
136
 
138
137
  def parse_operation_from_query(sql)
139
- sql = Helper.correctly_encoded(sql).gsub(SQL_COMMENT_REGEX, EMPTY_STRING)
138
+ sql = Helper.correctly_encoded(sql).gsub(SQL_COMMENT_REGEX, NewRelic::EMPTY_STR)
140
139
  if sql =~ /(\w+)/
141
140
  op = $1.downcase
142
141
  return op if KNOWN_OPERATIONS.include?(op)
@@ -195,6 +194,20 @@ module NewRelic
195
194
  @host = host
196
195
  @port_path_or_id = port_path_or_id
197
196
  @database_name = database_name
197
+ @safe_sql = nil
198
+ end
199
+
200
+ # Returns an sql statement that will be in the form most permissable by
201
+ # the config. The format will be safe for transmission to New Relic.
202
+ def safe_sql
203
+ @safe_sql ||= case Database.record_sql_method
204
+ when :obfuscated
205
+ Database.obfuscate_sql(self)
206
+ when :raw
207
+ sql.to_s
208
+ else
209
+ nil
210
+ end
198
211
  end
199
212
 
200
213
  # This takes a connection config hash from ActiveRecord or Sequel and
@@ -271,6 +284,11 @@ module NewRelic
271
284
  return false
272
285
  end
273
286
 
287
+ if multiple_queries?(@sql)
288
+ NewRelic::Agent.logger.debug('Unable to collect explain plan for multiple queries.')
289
+ return false
290
+ end
291
+
274
292
  true
275
293
  end
276
294
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
3
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
4
 
5
5
  require 'new_relic/agent/database/obfuscator'
6
6
  require 'new_relic/agent/database/postgres_explain_obfuscator'
@@ -21,6 +21,17 @@ module NewRelic
21
21
  Obfuscator.instance.obfuscate_single_quote_literals(sql) =~ /\$\d+/
22
22
  end
23
23
 
24
+ # SQL containing a semicolon in the middle (with something
25
+ # other than whitespace after it) may contain two or more
26
+ # queries. It's not safe to EXPLAIN this kind of expression,
27
+ # since it could lead to executing unwanted SQL.
28
+ #
29
+ MULTIPLE_QUERIES = Regexp.new(';\s*\S+')
30
+
31
+ def multiple_queries?(sql)
32
+ sql =~ MULTIPLE_QUERIES
33
+ end
34
+
24
35
  def handle_exception_in_explain
25
36
  yield
26
37
  rescue => e
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
3
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
4
 
5
5
  module NewRelic
6
6
  module Agent
@@ -11,7 +11,7 @@ module NewRelic
11
11
  :double_quotes => /"(?:[^"]|"")*?(?:\\".*|"(?!"))/,
12
12
  :dollar_quotes => /(\$(?!\d)[^$]*?\$).*?(?:\1|$)/,
13
13
  :uuids => /\{?(?:[0-9a-fA-F]\-*){32}\}?/,
14
- :numeric_literals => /\b-?(?:[0-9]+\.)?[0-9]+([eE][+-]?[0-9]+)?\b/,
14
+ :numeric_literals => /-?\b(?:[0-9]+\.)?[0-9]+([eE][+-]?[0-9]+)?\b/,
15
15
  :boolean_literals => /\b(?:true|false|null)\b/i,
16
16
  :hexadecimal_literals => /0x[0-9a-fA-F]+/,
17
17
  :comments => /(?:#|--).*?(?=\r|\n|$)/i,
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
3
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
4
 
5
5
  require 'new_relic/agent/database/obfuscation_helpers'
6
6
 
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
  # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
3
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
4
4
 
5
5
  module NewRelic
6
6
  module Agent