newrelic_rpm 6.7.0.359 → 6.12.0.367

Sign up to get free protection for your applications and to get access to all the features.
Files changed (297) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -0
  3. data/.travis.yml +72 -7
  4. data/CHANGELOG.md +306 -4
  5. data/CODE_OF_CONDUCT.md +46 -0
  6. data/CONTRIBUTING.md +56 -12
  7. data/Gemfile +6 -2
  8. data/Guardfile +18 -1
  9. data/LICENSE +208 -38
  10. data/README.md +61 -89
  11. data/Rakefile +2 -0
  12. data/THIRD_PARTY_NOTICES.md +213 -0
  13. data/bin/nrdebug +1 -1
  14. data/init.rb +1 -1
  15. data/install.rb +1 -1
  16. data/lib/new_relic/agent.rb +49 -7
  17. data/lib/new_relic/agent/adaptive_sampler.rb +1 -1
  18. data/lib/new_relic/agent/agent.rb +57 -40
  19. data/lib/new_relic/agent/agent_logger.rb +5 -1
  20. data/lib/new_relic/agent/attribute_filter.rb +8 -8
  21. data/lib/new_relic/agent/attribute_processing.rb +1 -1
  22. data/lib/new_relic/agent/attributes.rb +152 -0
  23. data/lib/new_relic/agent/audit_logger.rb +1 -1
  24. data/lib/new_relic/agent/autostart.rb +20 -15
  25. data/lib/new_relic/agent/chained_call.rb +1 -1
  26. data/lib/new_relic/agent/commands/agent_command.rb +1 -1
  27. data/lib/new_relic/agent/commands/agent_command_router.rb +1 -1
  28. data/lib/new_relic/agent/commands/thread_profiler_session.rb +1 -1
  29. data/lib/new_relic/agent/configuration.rb +1 -1
  30. data/lib/new_relic/agent/configuration/default_source.rb +111 -16
  31. data/lib/new_relic/agent/configuration/dotted_hash.rb +1 -1
  32. data/lib/new_relic/agent/configuration/environment_source.rb +1 -1
  33. data/lib/new_relic/agent/configuration/event_harvest_config.rb +1 -1
  34. data/lib/new_relic/agent/configuration/high_security_source.rb +1 -1
  35. data/lib/new_relic/agent/configuration/manager.rb +1 -1
  36. data/lib/new_relic/agent/configuration/manual_source.rb +1 -1
  37. data/lib/new_relic/agent/configuration/mask_defaults.rb +1 -1
  38. data/lib/new_relic/agent/configuration/security_policy_source.rb +1 -1
  39. data/lib/new_relic/agent/configuration/server_source.rb +2 -2
  40. data/lib/new_relic/agent/configuration/yaml_source.rb +12 -7
  41. data/lib/new_relic/agent/connect/request_builder.rb +4 -12
  42. data/lib/new_relic/agent/connect/response_handler.rb +1 -1
  43. data/lib/new_relic/agent/custom_event_aggregator.rb +1 -1
  44. data/lib/new_relic/agent/database.rb +2 -3
  45. data/lib/new_relic/agent/database/explain_plan_helpers.rb +1 -1
  46. data/lib/new_relic/agent/database/obfuscation_helpers.rb +2 -2
  47. data/lib/new_relic/agent/database/obfuscator.rb +1 -1
  48. data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +1 -1
  49. data/lib/new_relic/agent/datastores.rb +1 -1
  50. data/lib/new_relic/agent/datastores/metric_helper.rb +1 -1
  51. data/lib/new_relic/agent/datastores/mongo.rb +2 -2
  52. data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +3 -3
  53. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +1 -1
  54. data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +9 -9
  55. data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +1 -1
  56. data/lib/new_relic/agent/datastores/redis.rb +1 -1
  57. data/lib/new_relic/agent/deprecator.rb +1 -1
  58. data/lib/new_relic/agent/distributed_tracing.rb +156 -7
  59. data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +3 -2
  60. data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +61 -46
  61. data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +84 -0
  62. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
  63. data/lib/new_relic/agent/{distributed_trace_payload.rb → distributed_tracing/distributed_trace_payload.rb} +25 -102
  64. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +39 -0
  65. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +246 -0
  66. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +126 -0
  67. data/lib/new_relic/agent/encoding_normalizer.rb +1 -1
  68. data/lib/new_relic/agent/error_collector.rb +34 -17
  69. data/lib/new_relic/agent/error_event_aggregator.rb +8 -6
  70. data/lib/new_relic/agent/error_trace_aggregator.rb +1 -1
  71. data/lib/new_relic/agent/event_aggregator.rb +1 -1
  72. data/lib/new_relic/agent/event_buffer.rb +1 -1
  73. data/lib/new_relic/agent/event_listener.rb +1 -1
  74. data/lib/new_relic/agent/event_loop.rb +1 -1
  75. data/lib/new_relic/agent/external.rb +8 -8
  76. data/lib/new_relic/agent/guid_generator.rb +28 -0
  77. data/lib/new_relic/agent/harvester.rb +1 -1
  78. data/lib/new_relic/agent/heap.rb +1 -1
  79. data/lib/new_relic/agent/hostname.rb +8 -2
  80. data/lib/new_relic/agent/http_clients/abstract.rb +82 -0
  81. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +25 -20
  82. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +29 -14
  83. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +18 -22
  84. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +11 -12
  85. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +17 -5
  86. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +5 -7
  87. data/lib/new_relic/agent/http_clients/uri_util.rb +4 -3
  88. data/lib/new_relic/agent/instrumentation.rb +1 -1
  89. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +6 -8
  90. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +5 -1
  91. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +12 -3
  92. data/lib/new_relic/agent/instrumentation/active_job.rb +1 -1
  93. data/lib/new_relic/agent/instrumentation/active_merchant.rb +1 -1
  94. data/lib/new_relic/agent/instrumentation/active_record.rb +85 -38
  95. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +82 -24
  96. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +1 -1
  97. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +92 -34
  98. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +8 -3
  99. data/lib/new_relic/agent/instrumentation/active_storage.rb +1 -1
  100. data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +9 -5
  101. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +24 -8
  102. data/lib/new_relic/agent/instrumentation/authlogic.rb +1 -1
  103. data/lib/new_relic/agent/instrumentation/bunny.rb +115 -52
  104. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +1 -1
  105. data/lib/new_relic/agent/instrumentation/curb.rb +93 -28
  106. data/lib/new_relic/agent/instrumentation/data_mapper.rb +4 -2
  107. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +61 -25
  108. data/lib/new_relic/agent/instrumentation/excon.rb +2 -2
  109. data/lib/new_relic/agent/instrumentation/excon/connection.rb +7 -4
  110. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +3 -2
  111. data/lib/new_relic/agent/instrumentation/grape.rb +6 -11
  112. data/lib/new_relic/agent/instrumentation/http.rb +7 -4
  113. data/lib/new_relic/agent/instrumentation/httpclient.rb +6 -4
  114. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +1 -1
  115. data/lib/new_relic/agent/instrumentation/memcache.rb +4 -2
  116. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +7 -3
  117. data/lib/new_relic/agent/instrumentation/merb/controller.rb +1 -1
  118. data/lib/new_relic/agent/instrumentation/merb/errors.rb +1 -1
  119. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +12 -4
  120. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +9 -7
  121. data/lib/new_relic/agent/instrumentation/mongo.rb +10 -4
  122. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +36 -3
  123. data/lib/new_relic/agent/instrumentation/net.rb +60 -23
  124. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +26 -2
  125. data/lib/new_relic/agent/instrumentation/padrino.rb +40 -16
  126. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +1 -1
  127. data/lib/new_relic/agent/instrumentation/queue_time.rb +1 -1
  128. data/lib/new_relic/agent/instrumentation/rack.rb +36 -13
  129. data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +1 -1
  130. data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +1 -1
  131. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +1 -1
  132. data/lib/new_relic/agent/instrumentation/rails_middleware.rb +1 -1
  133. data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +1 -1
  134. data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +1 -1
  135. data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +1 -1
  136. data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +1 -1
  137. data/lib/new_relic/agent/instrumentation/rake.rb +54 -20
  138. data/lib/new_relic/agent/instrumentation/redis.rb +141 -56
  139. data/lib/new_relic/agent/instrumentation/resque.rb +4 -1
  140. data/lib/new_relic/agent/instrumentation/sequel.rb +1 -1
  141. data/lib/new_relic/agent/instrumentation/sequel_helper.rb +1 -1
  142. data/lib/new_relic/agent/instrumentation/sidekiq.rb +48 -24
  143. data/lib/new_relic/agent/instrumentation/sinatra.rb +62 -23
  144. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +1 -1
  145. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +1 -1
  146. data/lib/new_relic/agent/instrumentation/sunspot.rb +1 -1
  147. data/lib/new_relic/agent/instrumentation/typhoeus.rb +24 -7
  148. data/lib/new_relic/agent/internal_agent_error.rb +1 -1
  149. data/lib/new_relic/agent/javascript_instrumentor.rb +1 -1
  150. data/lib/new_relic/agent/log_once.rb +1 -1
  151. data/lib/new_relic/agent/logging.rb +19 -5
  152. data/lib/new_relic/agent/memory_logger.rb +1 -1
  153. data/lib/new_relic/agent/messaging.rb +6 -74
  154. data/lib/new_relic/agent/method_tracer.rb +19 -7
  155. data/lib/new_relic/agent/method_tracer_helpers.rb +3 -3
  156. data/lib/new_relic/agent/monitors.rb +27 -0
  157. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +110 -0
  158. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +27 -0
  159. data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +2 -2
  160. data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +3 -5
  161. data/lib/new_relic/agent/new_relic_service.rb +8 -7
  162. data/lib/new_relic/agent/new_relic_service/encoders.rb +1 -1
  163. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +1 -1
  164. data/lib/new_relic/agent/new_relic_service/marshaller.rb +1 -1
  165. data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +1 -1
  166. data/lib/new_relic/agent/noticible_error.rb +22 -0
  167. data/lib/new_relic/agent/null_logger.rb +1 -1
  168. data/lib/new_relic/agent/obfuscator.rb +1 -1
  169. data/lib/new_relic/agent/parameter_filtering.rb +1 -1
  170. data/lib/new_relic/agent/payload_metric_mapping.rb +1 -1
  171. data/lib/new_relic/agent/pipe_channel_manager.rb +1 -1
  172. data/lib/new_relic/agent/pipe_service.rb +1 -1
  173. data/lib/new_relic/agent/prepend_supportability.rb +1 -1
  174. data/lib/new_relic/agent/priority_sampled_buffer.rb +8 -5
  175. data/lib/new_relic/agent/range_extensions.rb +1 -1
  176. data/lib/new_relic/agent/rules_engine.rb +1 -1
  177. data/lib/new_relic/agent/rules_engine/replacement_rule.rb +1 -1
  178. data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +1 -1
  179. data/lib/new_relic/agent/sampler.rb +1 -1
  180. data/lib/new_relic/agent/sampler_collection.rb +1 -1
  181. data/lib/new_relic/agent/samplers/cpu_sampler.rb +1 -1
  182. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +1 -1
  183. data/lib/new_relic/agent/samplers/memory_sampler.rb +1 -1
  184. data/lib/new_relic/agent/samplers/object_sampler.rb +1 -1
  185. data/lib/new_relic/agent/samplers/vm_sampler.rb +1 -1
  186. data/lib/new_relic/agent/span_event_aggregator.rb +2 -1
  187. data/lib/new_relic/agent/span_event_primitive.rb +106 -54
  188. data/lib/new_relic/agent/sql_sampler.rb +6 -6
  189. data/lib/new_relic/agent/stats.rb +1 -1
  190. data/lib/new_relic/agent/stats_engine.rb +1 -1
  191. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +1 -1
  192. data/lib/new_relic/agent/stats_engine/stats_hash.rb +1 -1
  193. data/lib/new_relic/agent/supported_versions.rb +3 -3
  194. data/lib/new_relic/agent/synthetics_event_aggregator.rb +1 -1
  195. data/lib/new_relic/agent/system_info.rb +13 -4
  196. data/lib/new_relic/agent/threading/agent_thread.rb +1 -1
  197. data/lib/new_relic/agent/threading/backtrace_node.rb +1 -1
  198. data/lib/new_relic/agent/threading/backtrace_service.rb +1 -1
  199. data/lib/new_relic/agent/threading/thread_profile.rb +1 -1
  200. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +1 -1
  201. data/lib/new_relic/agent/tracer.rb +34 -19
  202. data/lib/new_relic/agent/transaction.rb +104 -82
  203. data/lib/new_relic/agent/transaction/abstract_segment.rb +31 -4
  204. data/lib/new_relic/agent/transaction/datastore_segment.rb +1 -1
  205. data/lib/new_relic/agent/transaction/distributed_tracer.rb +171 -0
  206. data/lib/new_relic/agent/transaction/distributed_tracing.rb +58 -147
  207. data/lib/new_relic/agent/transaction/external_request_segment.rb +30 -37
  208. data/lib/new_relic/agent/transaction/message_broker_segment.rb +4 -12
  209. data/lib/new_relic/agent/transaction/request_attributes.rb +1 -1
  210. data/lib/new_relic/agent/transaction/segment.rb +24 -2
  211. data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +1 -1
  212. data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +1 -1
  213. data/lib/new_relic/agent/transaction/trace.rb +3 -5
  214. data/lib/new_relic/agent/transaction/trace_builder.rb +1 -1
  215. data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
  216. data/lib/new_relic/agent/transaction/trace_node.rb +11 -9
  217. data/lib/new_relic/agent/transaction/tracing.rb +1 -1
  218. data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +1 -1
  219. data/lib/new_relic/agent/transaction_error_primitive.rb +11 -16
  220. data/lib/new_relic/agent/transaction_event_aggregator.rb +1 -1
  221. data/lib/new_relic/agent/transaction_event_primitive.rb +29 -40
  222. data/lib/new_relic/agent/transaction_event_recorder.rb +1 -1
  223. data/lib/new_relic/agent/transaction_metrics.rb +1 -1
  224. data/lib/new_relic/agent/transaction_sampler.rb +1 -1
  225. data/lib/new_relic/agent/transaction_time_aggregator.rb +1 -1
  226. data/lib/new_relic/agent/utilization/aws.rb +1 -1
  227. data/lib/new_relic/agent/utilization/azure.rb +1 -1
  228. data/lib/new_relic/agent/utilization/gcp.rb +1 -1
  229. data/lib/new_relic/agent/utilization/pcf.rb +1 -1
  230. data/lib/new_relic/agent/utilization/vendor.rb +1 -1
  231. data/lib/new_relic/agent/utilization_data.rb +1 -1
  232. data/lib/new_relic/agent/vm.rb +1 -1
  233. data/lib/new_relic/agent/vm/jruby_vm.rb +1 -1
  234. data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +1 -1
  235. data/lib/new_relic/agent/vm/mri_vm.rb +1 -1
  236. data/lib/new_relic/agent/vm/snapshot.rb +1 -1
  237. data/lib/new_relic/agent/worker_loop.rb +1 -1
  238. data/lib/new_relic/cli/command.rb +1 -1
  239. data/lib/new_relic/cli/commands/deployments.rb +1 -1
  240. data/lib/new_relic/cli/commands/install.rb +4 -3
  241. data/lib/new_relic/coerce.rb +32 -7
  242. data/lib/new_relic/collection_helper.rb +1 -1
  243. data/lib/new_relic/constants.rb +38 -0
  244. data/lib/new_relic/control.rb +1 -1
  245. data/lib/new_relic/control/class_methods.rb +1 -1
  246. data/lib/new_relic/control/frameworks.rb +1 -1
  247. data/lib/new_relic/control/frameworks/external.rb +1 -1
  248. data/lib/new_relic/control/frameworks/merb.rb +1 -1
  249. data/lib/new_relic/control/frameworks/rails.rb +1 -1
  250. data/lib/new_relic/control/frameworks/rails3.rb +1 -1
  251. data/lib/new_relic/control/frameworks/rails4.rb +1 -1
  252. data/lib/new_relic/control/frameworks/rails_notifications.rb +1 -1
  253. data/lib/new_relic/control/frameworks/ruby.rb +1 -1
  254. data/lib/new_relic/control/frameworks/sinatra.rb +1 -1
  255. data/lib/new_relic/control/instance_methods.rb +11 -2
  256. data/lib/new_relic/control/instrumentation.rb +1 -1
  257. data/lib/new_relic/control/server_methods.rb +1 -1
  258. data/lib/new_relic/delayed_job_injection.rb +1 -1
  259. data/lib/new_relic/dependency_detection.rb +5 -5
  260. data/lib/new_relic/environment_report.rb +6 -2
  261. data/lib/new_relic/helper.rb +1 -1
  262. data/lib/new_relic/language_support.rb +1 -1
  263. data/lib/new_relic/latest_changes.rb +2 -2
  264. data/lib/new_relic/local_environment.rb +1 -1
  265. data/lib/new_relic/metric_data.rb +1 -1
  266. data/lib/new_relic/metric_spec.rb +1 -1
  267. data/lib/new_relic/metrics.rb +1 -1
  268. data/lib/new_relic/noticed_error.rb +39 -18
  269. data/lib/new_relic/rack.rb +1 -1
  270. data/lib/new_relic/rack/agent_hooks.rb +1 -1
  271. data/lib/new_relic/rack/agent_middleware.rb +1 -1
  272. data/lib/new_relic/rack/browser_monitoring.rb +6 -1
  273. data/lib/new_relic/recipes.rb +1 -1
  274. data/lib/new_relic/recipes/capistrano3.rb +1 -1
  275. data/lib/new_relic/recipes/capistrano_legacy.rb +1 -1
  276. data/lib/new_relic/supportability_helper.rb +15 -1
  277. data/lib/new_relic/version.rb +2 -2
  278. data/lib/newrelic_rpm.rb +1 -1
  279. data/lib/sequel/extensions/newrelic_instrumentation.rb +1 -1
  280. data/lib/sequel/plugins/newrelic_instrumentation.rb +1 -1
  281. data/lib/tasks/all.rb +1 -1
  282. data/lib/tasks/multiverse.rb +26 -1
  283. data/lib/tasks/newrelic.rb +1 -1
  284. data/lib/tasks/tests.rake +6 -1
  285. data/newrelic_rpm.gemspec +19 -13
  286. data/recipes/newrelic.rb +1 -1
  287. data/test/agent_helper.rb +332 -72
  288. metadata +103 -38
  289. data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
  290. data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -40
  291. data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
  292. data/lib/new_relic/agent/transaction/attributes.rb +0 -154
  293. data/lib/tasks/versions.html.erb +0 -28
  294. data/lib/tasks/versions.postface.html +0 -8
  295. data/lib/tasks/versions.preface.html +0 -9
  296. data/lib/tasks/versions.rake +0 -65
  297. 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
  require 'thread'
6
6
  require 'logger'
@@ -173,6 +173,10 @@ module NewRelic
173
173
  StartupLogger.instance.dump(self)
174
174
  end
175
175
 
176
+ def self.format_fatal_error message
177
+ "** [NewRelic] FATAL : #{message}\n"
178
+ end
179
+
176
180
  end
177
181
 
178
182
  # In an effort to not lose messages during startup, we trap them in memory
@@ -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
  # This class applies filtering rules as specified in the Agent Attributes
6
6
  # cross-agent spec.
@@ -121,7 +121,7 @@ module NewRelic
121
121
  @high_security = config[:high_security]
122
122
 
123
123
  setup_key_cache
124
- cache_prefix_blacklist
124
+ cache_prefix_denylist
125
125
  end
126
126
 
127
127
  # Note the key_cache is a global cache, accessible by multiple threads,
@@ -222,16 +222,16 @@ module NewRelic
222
222
  # arguments for Sidekiq and Resque in the common case, since none of
223
223
  # these attributes are captured by default.
224
224
  #
225
- def cache_prefix_blacklist
226
- @prefix_blacklist = {}
227
- @prefix_blacklist[:'request.parameters'] = true unless might_allow_prefix_uncached?(:'request.parameters')
228
- @prefix_blacklist[:'job.sidekiq.args'] = true unless might_allow_prefix_uncached?(:'job.sidekiq.args')
229
- @prefix_blacklist[:'job.resque.args'] = true unless might_allow_prefix_uncached?(:'job.resque.args')
225
+ def cache_prefix_denylist
226
+ @prefix_denylist = {}
227
+ @prefix_denylist[:'request.parameters'] = true unless might_allow_prefix_uncached?(:'request.parameters')
228
+ @prefix_denylist[:'job.sidekiq.args'] = true unless might_allow_prefix_uncached?(:'job.sidekiq.args')
229
+ @prefix_denylist[:'job.resque.args'] = true unless might_allow_prefix_uncached?(:'job.resque.args')
230
230
  end
231
231
 
232
232
  # Note that the given prefix *must* be a Symbol
233
233
  def might_allow_prefix?(prefix)
234
- !@prefix_blacklist.include?(prefix)
234
+ !@prefix_denylist.include?(prefix)
235
235
  end
236
236
 
237
237
  def might_allow_prefix_uncached?(prefix)
@@ -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
@@ -0,0 +1,152 @@
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/agent/attribute_processing'
6
+
7
+ module NewRelic
8
+ module Agent
9
+ class Attributes
10
+ KEY_LIMIT = 255
11
+ VALUE_LIMIT = 255
12
+ COUNT_LIMIT = 64
13
+
14
+ attr_reader :custom_attributes
15
+
16
+ def initialize(filter)
17
+ @filter = filter
18
+
19
+ @custom_attributes = {}
20
+ @agent_attributes = {}
21
+ @intrinsic_attributes = {}
22
+
23
+ @custom_destinations = {}
24
+ @agent_destinations = {}
25
+ @already_warned_count_limit = nil
26
+ end
27
+
28
+ def add_agent_attribute(key, value, default_destinations)
29
+ destinations = @filter.apply(key, default_destinations)
30
+ return if destinations == AttributeFilter::DST_NONE
31
+
32
+ @agent_destinations[key] = destinations
33
+ add(@agent_attributes, key, value)
34
+ end
35
+
36
+ def add_agent_attribute_with_key_check(key, value, default_destinations)
37
+ if exceeds_bytesize_limit? key, KEY_LIMIT
38
+ NewRelic::Agent.logger.debug("Agent attribute #{key} was dropped for exceeding key length limit #{KEY_LIMIT}")
39
+ return
40
+ end
41
+
42
+ add_agent_attribute(key, value, default_destinations)
43
+ end
44
+
45
+ def add_intrinsic_attribute(key, value)
46
+ add(@intrinsic_attributes, key, value)
47
+ end
48
+
49
+ def merge_untrusted_agent_attributes(attributes, prefix, default_destinations)
50
+ return if @filter.high_security?
51
+ return if !@filter.might_allow_prefix?(prefix)
52
+
53
+ AttributeProcessing.flatten_and_coerce(attributes, prefix) do |k, v|
54
+ add_agent_attribute_with_key_check(k, v, AttributeFilter::DST_NONE)
55
+ end
56
+ end
57
+
58
+ def merge_custom_attributes(other)
59
+ return unless Agent.config[:'custom_attributes.enabled']
60
+ return if other.empty?
61
+ AttributeProcessing.flatten_and_coerce(other) do |k, v|
62
+ add_custom_attribute(k, v)
63
+ end
64
+ end
65
+
66
+ def custom_attributes_for(destination)
67
+ for_destination(@custom_attributes, @custom_destinations, destination)
68
+ end
69
+
70
+ def agent_attributes_for(destination)
71
+ for_destination(@agent_attributes, @agent_destinations, destination)
72
+ end
73
+
74
+ def intrinsic_attributes_for(destination)
75
+ if destination == NewRelic::Agent::AttributeFilter::DST_TRANSACTION_TRACER ||
76
+ destination == NewRelic::Agent::AttributeFilter::DST_ERROR_COLLECTOR
77
+ @intrinsic_attributes
78
+ else
79
+ NewRelic::EMPTY_HASH
80
+ end
81
+ end
82
+
83
+ private
84
+
85
+ def add_custom_attribute(key, value)
86
+ if @custom_attributes.size >= COUNT_LIMIT
87
+ unless @already_warned_count_limit
88
+ NewRelic::Agent.logger.warn("Custom attributes count exceeded limit of #{COUNT_LIMIT}. Any additional custom attributes during this transaction will be dropped.")
89
+ @already_warned_count_limit = true
90
+ end
91
+ return
92
+ end
93
+
94
+ if @filter.high_security?
95
+ NewRelic::Agent.logger.debug("Unable to add custom attribute #{key} while in high security mode.")
96
+ return
97
+ end
98
+
99
+ if exceeds_bytesize_limit?(key, KEY_LIMIT)
100
+ NewRelic::Agent.logger.warn("Custom attribute key '#{key}' was longer than limit of #{KEY_LIMIT} bytes. This attribute will be dropped.")
101
+ return
102
+ end
103
+
104
+ destinations = @filter.apply(key, AttributeFilter::DST_ALL)
105
+ return if destinations == AttributeFilter::DST_NONE
106
+
107
+ @custom_destinations[key] = destinations
108
+ add(@custom_attributes, key, value)
109
+ end
110
+
111
+ def add(attributes, key, value)
112
+ return if value.nil?
113
+
114
+ if exceeds_bytesize_limit?(value, VALUE_LIMIT)
115
+ value = slice(value)
116
+ end
117
+
118
+ attributes[key] = value
119
+ end
120
+
121
+ def for_destination(attributes, calculated_destinations, destination)
122
+ # Avoid allocating anything if there are no attrs at all
123
+ return NewRelic::EMPTY_HASH if attributes.empty?
124
+
125
+ attributes.inject({}) do |memo, (key, value)|
126
+ if @filter.allows?(calculated_destinations[key], destination)
127
+ memo[key] = value
128
+ end
129
+ memo
130
+ end
131
+ end
132
+
133
+ def exceeds_bytesize_limit?(value, limit)
134
+ if value.respond_to?(:bytesize)
135
+ value.bytesize > limit
136
+ elsif value.is_a?(Symbol)
137
+ value.to_s.bytesize > limit
138
+ else
139
+ false
140
+ end
141
+ end
142
+
143
+ # Take one byte past our limit. Why? This lets us unconditionally chop!
144
+ # the end. It'll either remove the one-character-too-many we have, or
145
+ # peel off the partial, mangled character left by the byteslice.
146
+ def slice(incoming)
147
+ result = incoming.to_s.byteslice(0, VALUE_LIMIT + 1)
148
+ result.chop!
149
+ end
150
+ end
151
+ end
152
+ 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 'logger'
6
6
  require 'fileutils'
@@ -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
@@ -20,23 +20,28 @@ module NewRelic
20
20
 
21
21
 
22
22
  # The constants, executables (i.e. $0) and rake tasks used can be
23
- # configured with the config keys 'autostart.blacklisted_constants',
24
- # 'autostart.blacklisted_executables' and
25
- # 'autostart.blacklisted_rake_tasks'
23
+ # configured with the config keys 'autostart.denylisted_constants',
24
+ # 'autostart.denylisted_executables' and
25
+ # 'autostart.denylisted_rake_tasks'
26
26
  def agent_should_start?
27
- !blacklisted_constants? &&
28
- !blacklisted_executables? &&
29
- !in_blacklisted_rake_task?
27
+ !denylisted_constants? &&
28
+ !denylisted_executables? &&
29
+ !in_denylisted_rake_task?
30
30
  end
31
31
 
32
- def blacklisted_constants?
33
- blacklisted?(NewRelic::Agent.config[:'autostart.blacklisted_constants']) do |name|
32
+ COMMA = ",".freeze
33
+
34
+ def denylisted_constants?
35
+ # For backwards compatibility until :'autostart_blacklisted_constants' config option is removed
36
+ constants = NewRelic::Agent.config[:'autostart.denylisted_constants'] << COMMA << NewRelic::Agent.config[:'autostart.blacklisted_constants']
37
+
38
+ denylisted?(constants) do |name|
34
39
  constant_is_defined?(name)
35
40
  end
36
41
  end
37
42
 
38
- def blacklisted_executables?
39
- blacklisted?(NewRelic::Agent.config[:'autostart.blacklisted_executables']) do |bin|
43
+ def denylisted_executables?
44
+ denylisted?(NewRelic::Agent.config[:'autostart.denylisted_executables']) do |bin|
40
45
  File.basename($0) == bin
41
46
  end
42
47
  end
@@ -47,18 +52,18 @@ module NewRelic
47
52
  !!::NewRelic::LanguageSupport.constantize(const_name)
48
53
  end
49
54
 
50
- def blacklisted?(value, &block)
55
+ def denylisted?(value, &block)
51
56
  value.split(/\s*,\s*/).any?(&block)
52
57
  end
53
58
 
54
- def in_blacklisted_rake_task?
59
+ def in_denylisted_rake_task?
55
60
  tasks = begin
56
61
  ::Rake.application.top_level_tasks
57
62
  rescue => e
58
- ::NewRelic::Agent.logger.debug("Not in Rake environment so skipping blacklisted_rake_tasks check: #{e}")
63
+ ::NewRelic::Agent.logger.debug("Not in Rake environment so skipping denylisted_rake_tasks check: #{e}")
59
64
  []
60
65
  end
61
- !(tasks & ::NewRelic::Agent.config[:'autostart.blacklisted_rake_tasks'].split(/\s*,\s*/)).empty?
66
+ !(tasks & ::NewRelic::Agent.config[:'autostart.denylisted_rake_tasks'].split(/\s*,\s*/)).empty?
62
67
  end
63
68
  end
64
69
  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
  # This class is used by NewRelic::Agent.set_sql_obfuscator to chain multiple
6
6
  # obfuscation blocks when not using the default :replace action
@@ -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
@@ -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
  # This class is the central point for dispatching get_agent_commands messages
6
6
  # to the various components that actually process them.
@@ -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/threading/agent_thread'
6
6
  require 'new_relic/agent/threading/backtrace_service'
@@ -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/manager'
6
6
  require 'new_relic/agent/configuration/dotted_hash'
@@ -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 'forwardable'
6
6
 
@@ -218,9 +218,19 @@ module NewRelic
218
218
  end
219
219
  const_names.compact
220
220
  end
221
+
222
+ def self.enforce_fallback(allowed_values: nil, fallback: nil)
223
+ Proc.new do |configured_value|
224
+ if allowed_values.any? { |v| v =~ /#{configured_value}/i }
225
+ configured_value
226
+ else
227
+ fallback
228
+ end
229
+ end
230
+ end
221
231
  end
222
232
 
223
- AUTOSTART_BLACKLISTED_RAKE_TASKS = [
233
+ AUTOSTART_DENYLISTED_RAKE_TASKS = [
224
234
  'about',
225
235
  'assets:clean',
226
236
  'assets:clobber',
@@ -385,7 +395,21 @@ module NewRelic
385
395
  :public => true,
386
396
  :type => Boolean,
387
397
  :allowed_from_server => false,
388
- :description => 'When <code>true</code>, the agent captures HTTP request parameters and attaches them to transaction traces, traced errors, and <a href="https://docs.newrelic.com/docs/insights/new-relic-insights/decorating-events/error-event-default-attributes-insights">TransactionError events</a>.'
398
+ :description => 'When <code>true</code>, the agent captures HTTP request parameters ' \
399
+ 'and attaches them to transaction traces, traced errors, and ' \
400
+ '<a href="https://docs.newrelic.com/attribute-dictionary?attribute_name=&events_tids%5B%5D=8241">'\
401
+ '<code>TransactionError</code> events.' \
402
+ "\n" \
403
+ '<div class="callout-warning">' \
404
+ "\n" \
405
+ '<p>When using the <code>capture_params</code> setting, the Ruby agent will not attempt ' \
406
+ 'to filter secret information. <b>Recommendation:</b> To filter secret information from ' \
407
+ 'request parameters, use the <a href="/docs/agents/ruby-agent/attributes/enable-disable-attributes-ruby">' \
408
+ '<code>attributes.include</code> setting</a> instead. For more information, see the ' \
409
+ '<a href="/docs/agents/ruby-agent/attributes/ruby-attribute-examples#ex_req_params">' \
410
+ 'Ruby attribute examples</a>.' \
411
+ "</p>\n" \
412
+ '</div>'
389
413
  },
390
414
  :config_path => {
391
415
  :default => DefaultSource.config_path,
@@ -416,6 +440,17 @@ module NewRelic
416
440
  :description => 'Autodetected application framework used to enable framework-specific functionality.'
417
441
  },
418
442
  :'autostart.blacklisted_constants' => {
443
+ :default => 'Rails::Console',
444
+ :public => true,
445
+ :type => String,
446
+ :allowed_from_server => false,
447
+ :description => 'Deprecated. ' \
448
+ 'For agent versions 6.8.0 or higher, ' \
449
+ 'use <a href="#autostart-denylisted_constants"><code>' \
450
+ 'autostart.denylisted_constants' \
451
+ '</code></a> instead.'
452
+ },
453
+ :'autostart.denylisted_constants' => {
419
454
  :default => 'Rails::Console',
420
455
  :public => true,
421
456
  :type => String,
@@ -427,10 +462,32 @@ module NewRelic
427
462
  :public => true,
428
463
  :type => String,
429
464
  :allowed_from_server => false,
465
+ :description => 'Deprecated. ' \
466
+ 'For agent versions 6.8.0 or higher, ' \
467
+ 'use <a href="#autostart-denylisted_executables"><code>' \
468
+ 'autostart.denylisted_executables' \
469
+ '</code></a> instead.'
470
+ },
471
+ :'autostart.denylisted_executables' => {
472
+ :default => value_of(:'autostart.blacklisted_executables'),
473
+ :public => true,
474
+ :type => String,
475
+ :allowed_from_server => false,
430
476
  :description => 'Defines a comma-delimited list of executables that the agent should not instrument. For example, <code>rake,my_ruby_script.rb</code>.'
431
477
  },
432
478
  :'autostart.blacklisted_rake_tasks' => {
433
- :default => AUTOSTART_BLACKLISTED_RAKE_TASKS,
479
+ :default => AUTOSTART_DENYLISTED_RAKE_TASKS,
480
+ :public => true,
481
+ :type => String,
482
+ :allowed_from_server => false,
483
+ :description => 'Deprecated. ' \
484
+ 'For agent versions 6.8.0 or higher, ' \
485
+ 'use <a href="#autostart-denylisted_rake_tasks"><code>' \
486
+ 'autostart.denylisted_rake_tasks' \
487
+ '</code></a> instead.'
488
+ },
489
+ :'autostart.denylisted_rake_tasks' => {
490
+ :default => value_of(:'autostart.blacklisted_rake_tasks'),
434
491
  :public => true,
435
492
  :type => String,
436
493
  :allowed_from_server => false,
@@ -478,15 +535,28 @@ module NewRelic
478
535
  :public => true,
479
536
  :type => Boolean,
480
537
  :allowed_from_server => false,
481
- :description => 'If true, the agent strips messages from all exceptions except those in the <a href="#strip_exception_messages-whitelist">whitelist</a>. Enabled automatically in <a href="https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security">high security mode</a>.'
538
+ :description => 'If true, the agent strips messages from all exceptions except those in the <a href="#strip_exception_messages-allowlist">allowlist</a>. Enabled automatically in <a href="https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security">high security mode</a>.'
482
539
  },
483
540
  :'strip_exception_messages.whitelist' => {
484
541
  :default => '',
485
542
  :public => true,
486
543
  :type => String,
544
+ :deprecated => true,
487
545
  :allowed_from_server => false,
488
546
  :transform => DefaultSource.method(:convert_to_constant_list),
489
- :description => 'Specify a whitelist of exceptions you do not want the agent to strip when <a href="#strip_exception_messages-enabled">strip_exception_messages</a> is <code>true</code>. Separate exceptions with a comma. For example, <code>"ImportantException,PreserveMessageException"</code>.'
547
+ :description => 'Deprecated. ' \
548
+ 'For agent versions 6.8.0 or higher, ' \
549
+ 'use <a href="#strip_exception_messages.allowed_classes"><code>' \
550
+ 'strip_exception_messages.allowed_classes' \
551
+ '</code></a> instead.'
552
+ },
553
+ :'strip_exception_messages.allowed_classes' => {
554
+ :default => '',
555
+ :public => true,
556
+ :type => String,
557
+ :allowed_from_server => false,
558
+ :transform => DefaultSource.method(:convert_to_constant_list),
559
+ :description => 'Specify a list of exceptions you do not want the agent to strip when <a href="#strip_exception_messages-enabled">strip_exception_messages</a> is <code>true</code>. Separate exceptions with a comma. For example, <code>"ImportantException,PreserveMessageException"</code>.'
490
560
  },
491
561
  :host => {
492
562
  :default => DefaultSource.host,
@@ -545,7 +615,7 @@ module NewRelic
545
615
  :description => 'Use HTTP PUT requests instead of POST.'
546
616
  },
547
617
  :compressed_content_encoding => {
548
- :default => 'deflate',
618
+ :default => 'gzip',
549
619
  :public => false,
550
620
  :type => String,
551
621
  :allowed_from_server => false,
@@ -618,15 +688,6 @@ module NewRelic
618
688
  :allowed_from_server => true,
619
689
  :description => 'Number of seconds betwixt connections to the New Relic span event collection services.'
620
690
  },
621
- :'data_report_periods.analytic_event_data' => {
622
- :default => 60,
623
- :public => false,
624
- :type => Integer,
625
- :deprecated => true,
626
- :dynamic_name => true,
627
- :allowed_from_server => true,
628
- :description => 'Number of seconds between connections to the New Relic data collection service for sending transaction event data.'
629
- },
630
691
  :keep_retrying => {
631
692
  :default => true,
632
693
  :public => false,
@@ -1860,12 +1921,46 @@ module NewRelic
1860
1921
  :allowed_from_server => true,
1861
1922
  :description => 'If <code>true</code>, enables span event sampling.'
1862
1923
  },
1924
+ :'span_events.queue_size' => {
1925
+ :default => 10_000,
1926
+ :public => true,
1927
+ :type => Integer,
1928
+ :allowed_from_server => false,
1929
+ :external => :infinite_tracing,
1930
+ :description => "Sets the maximum number of span events to buffer when streaming to the trace observer."
1931
+ },
1863
1932
  :'span_events.max_samples_stored' => {
1864
1933
  :default => 1000,
1865
1934
  :public => true,
1866
1935
  :type => Integer,
1867
1936
  :allowed_from_server => true,
1868
1937
  :description => 'Defines the maximum number of span events reported from a single harvest.'
1938
+ },
1939
+ :'exclude_newrelic_header' => {
1940
+ :default => false,
1941
+ :public => true,
1942
+ :type => Boolean,
1943
+ :allowed_from_server => true,
1944
+ :description => "Allows newrelic distributed tracing headers to be suppressed on outbound requests."
1945
+ },
1946
+ :'infinite_tracing.trace_observer.host' => {
1947
+ :default => '',
1948
+ :public => true,
1949
+ :type => String,
1950
+ :allowed_from_server => false,
1951
+ :external => :infinite_tracing,
1952
+ :description => "Configures the hostname for the Trace Observer Host. " \
1953
+ "When configured, enables tail-based sampling by sending all recorded spans " \
1954
+ "to a Trace Observer for further sampling decisions, irrespective of any usual " \
1955
+ "agent sampling decision."
1956
+ },
1957
+ :'infinite_tracing.trace_observer.port' => {
1958
+ :default => 443,
1959
+ :public => true,
1960
+ :type => Integer,
1961
+ :allowed_from_server => false,
1962
+ :external => :infinite_tracing,
1963
+ :description => "Configures the TCP/IP port for the Trace Observer Host"
1869
1964
  }
1870
1965
  }.freeze
1871
1966
  end