newrelic_rpm 6.9.0.363 → 6.12.0.367

Sign up to get free protection for your applications and to get access to all the features.
Files changed (289) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -0
  3. data/.travis.yml +32 -2
  4. data/CHANGELOG.md +172 -10
  5. data/CODE_OF_CONDUCT.md +46 -0
  6. data/CONTRIBUTING.md +56 -12
  7. data/Gemfile +6 -2
  8. data/LICENSE +208 -38
  9. data/README.md +61 -89
  10. data/Rakefile +2 -0
  11. data/THIRD_PARTY_NOTICES.md +213 -0
  12. data/bin/nrdebug +1 -1
  13. data/init.rb +1 -1
  14. data/install.rb +1 -1
  15. data/lib/new_relic/agent.rb +15 -5
  16. data/lib/new_relic/agent/adaptive_sampler.rb +1 -1
  17. data/lib/new_relic/agent/agent.rb +11 -6
  18. data/lib/new_relic/agent/agent_logger.rb +1 -1
  19. data/lib/new_relic/agent/attribute_filter.rb +1 -1
  20. data/lib/new_relic/agent/attribute_processing.rb +1 -1
  21. data/lib/new_relic/agent/attributes.rb +3 -1
  22. data/lib/new_relic/agent/audit_logger.rb +1 -1
  23. data/lib/new_relic/agent/autostart.rb +1 -1
  24. data/lib/new_relic/agent/chained_call.rb +1 -1
  25. data/lib/new_relic/agent/commands/agent_command.rb +1 -1
  26. data/lib/new_relic/agent/commands/agent_command_router.rb +1 -1
  27. data/lib/new_relic/agent/commands/thread_profiler_session.rb +1 -1
  28. data/lib/new_relic/agent/configuration.rb +1 -1
  29. data/lib/new_relic/agent/configuration/default_source.rb +28 -1
  30. data/lib/new_relic/agent/configuration/dotted_hash.rb +1 -1
  31. data/lib/new_relic/agent/configuration/environment_source.rb +1 -1
  32. data/lib/new_relic/agent/configuration/event_harvest_config.rb +1 -1
  33. data/lib/new_relic/agent/configuration/high_security_source.rb +1 -1
  34. data/lib/new_relic/agent/configuration/manager.rb +1 -1
  35. data/lib/new_relic/agent/configuration/manual_source.rb +1 -1
  36. data/lib/new_relic/agent/configuration/mask_defaults.rb +1 -1
  37. data/lib/new_relic/agent/configuration/security_policy_source.rb +1 -1
  38. data/lib/new_relic/agent/configuration/server_source.rb +1 -1
  39. data/lib/new_relic/agent/configuration/yaml_source.rb +1 -1
  40. data/lib/new_relic/agent/connect/request_builder.rb +1 -1
  41. data/lib/new_relic/agent/connect/response_handler.rb +1 -1
  42. data/lib/new_relic/agent/custom_event_aggregator.rb +1 -1
  43. data/lib/new_relic/agent/database.rb +1 -1
  44. data/lib/new_relic/agent/database/explain_plan_helpers.rb +1 -1
  45. data/lib/new_relic/agent/database/obfuscation_helpers.rb +2 -2
  46. data/lib/new_relic/agent/database/obfuscator.rb +1 -1
  47. data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +1 -1
  48. data/lib/new_relic/agent/datastores.rb +1 -1
  49. data/lib/new_relic/agent/datastores/metric_helper.rb +1 -1
  50. data/lib/new_relic/agent/datastores/mongo.rb +2 -2
  51. data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +1 -1
  52. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +1 -1
  53. data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +1 -1
  54. data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +1 -1
  55. data/lib/new_relic/agent/datastores/redis.rb +1 -1
  56. data/lib/new_relic/agent/deprecator.rb +1 -1
  57. data/lib/new_relic/agent/distributed_tracing.rb +1 -1
  58. data/lib/new_relic/agent/distributed_tracing/cross_app_payload.rb +3 -2
  59. data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +1 -1
  60. data/lib/new_relic/agent/distributed_tracing/{distributed_trace_intrinsics.rb → distributed_trace_attributes.rb} +9 -5
  61. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +1 -1
  62. data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +3 -4
  63. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +1 -1
  64. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +1 -1
  65. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +2 -2
  66. data/lib/new_relic/agent/encoding_normalizer.rb +1 -1
  67. data/lib/new_relic/agent/error_collector.rb +31 -12
  68. data/lib/new_relic/agent/error_event_aggregator.rb +5 -5
  69. data/lib/new_relic/agent/error_trace_aggregator.rb +1 -1
  70. data/lib/new_relic/agent/event_aggregator.rb +1 -1
  71. data/lib/new_relic/agent/event_buffer.rb +1 -1
  72. data/lib/new_relic/agent/event_listener.rb +1 -1
  73. data/lib/new_relic/agent/event_loop.rb +1 -1
  74. data/lib/new_relic/agent/external.rb +1 -1
  75. data/lib/new_relic/agent/guid_generator.rb +1 -1
  76. data/lib/new_relic/agent/harvester.rb +1 -1
  77. data/lib/new_relic/agent/heap.rb +1 -1
  78. data/lib/new_relic/agent/hostname.rb +8 -2
  79. data/lib/new_relic/agent/http_clients/abstract.rb +82 -0
  80. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +25 -20
  81. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +29 -14
  82. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +18 -22
  83. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +11 -12
  84. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +17 -5
  85. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +5 -7
  86. data/lib/new_relic/agent/http_clients/uri_util.rb +4 -3
  87. data/lib/new_relic/agent/instrumentation.rb +1 -1
  88. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +5 -6
  89. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +5 -1
  90. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +12 -3
  91. data/lib/new_relic/agent/instrumentation/active_job.rb +1 -1
  92. data/lib/new_relic/agent/instrumentation/active_merchant.rb +1 -1
  93. data/lib/new_relic/agent/instrumentation/active_record.rb +85 -38
  94. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +82 -24
  95. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +1 -1
  96. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +92 -34
  97. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +8 -3
  98. data/lib/new_relic/agent/instrumentation/active_storage.rb +1 -1
  99. data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +9 -5
  100. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +24 -8
  101. data/lib/new_relic/agent/instrumentation/authlogic.rb +1 -1
  102. data/lib/new_relic/agent/instrumentation/bunny.rb +114 -51
  103. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +1 -1
  104. data/lib/new_relic/agent/instrumentation/curb.rb +92 -27
  105. data/lib/new_relic/agent/instrumentation/data_mapper.rb +4 -2
  106. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +61 -25
  107. data/lib/new_relic/agent/instrumentation/excon.rb +1 -1
  108. data/lib/new_relic/agent/instrumentation/excon/connection.rb +7 -4
  109. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +3 -2
  110. data/lib/new_relic/agent/instrumentation/grape.rb +1 -1
  111. data/lib/new_relic/agent/instrumentation/http.rb +6 -3
  112. data/lib/new_relic/agent/instrumentation/httpclient.rb +5 -3
  113. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +1 -1
  114. data/lib/new_relic/agent/instrumentation/memcache.rb +4 -2
  115. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +7 -3
  116. data/lib/new_relic/agent/instrumentation/merb/controller.rb +1 -1
  117. data/lib/new_relic/agent/instrumentation/merb/errors.rb +1 -1
  118. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +12 -4
  119. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +9 -7
  120. data/lib/new_relic/agent/instrumentation/mongo.rb +10 -4
  121. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +36 -3
  122. data/lib/new_relic/agent/instrumentation/net.rb +59 -22
  123. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +26 -2
  124. data/lib/new_relic/agent/instrumentation/padrino.rb +40 -16
  125. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +1 -1
  126. data/lib/new_relic/agent/instrumentation/queue_time.rb +1 -1
  127. data/lib/new_relic/agent/instrumentation/rack.rb +36 -13
  128. data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +1 -1
  129. data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +1 -1
  130. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +1 -1
  131. data/lib/new_relic/agent/instrumentation/rails_middleware.rb +1 -1
  132. data/lib/new_relic/agent/instrumentation/rails_notifications/action_cable.rb +1 -1
  133. data/lib/new_relic/agent/instrumentation/rails_notifications/action_controller.rb +1 -1
  134. data/lib/new_relic/agent/instrumentation/rails_notifications/action_view.rb +1 -1
  135. data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +1 -1
  136. data/lib/new_relic/agent/instrumentation/rake.rb +54 -20
  137. data/lib/new_relic/agent/instrumentation/redis.rb +141 -56
  138. data/lib/new_relic/agent/instrumentation/resque.rb +1 -1
  139. data/lib/new_relic/agent/instrumentation/sequel.rb +1 -1
  140. data/lib/new_relic/agent/instrumentation/sequel_helper.rb +1 -1
  141. data/lib/new_relic/agent/instrumentation/sidekiq.rb +48 -24
  142. data/lib/new_relic/agent/instrumentation/sinatra.rb +62 -23
  143. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +1 -1
  144. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +1 -1
  145. data/lib/new_relic/agent/instrumentation/sunspot.rb +1 -1
  146. data/lib/new_relic/agent/instrumentation/typhoeus.rb +23 -6
  147. data/lib/new_relic/agent/internal_agent_error.rb +1 -1
  148. data/lib/new_relic/agent/javascript_instrumentor.rb +1 -1
  149. data/lib/new_relic/agent/log_once.rb +1 -1
  150. data/lib/new_relic/agent/logging.rb +2 -2
  151. data/lib/new_relic/agent/memory_logger.rb +1 -1
  152. data/lib/new_relic/agent/messaging.rb +1 -1
  153. data/lib/new_relic/agent/method_tracer.rb +16 -5
  154. data/lib/new_relic/agent/method_tracer_helpers.rb +2 -2
  155. data/lib/new_relic/agent/monitors.rb +1 -1
  156. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +1 -1
  157. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +1 -1
  158. data/lib/new_relic/agent/monitors/inbound_request_monitor.rb +1 -1
  159. data/lib/new_relic/agent/monitors/synthetics_monitor.rb +1 -1
  160. data/lib/new_relic/agent/new_relic_service.rb +1 -2
  161. data/lib/new_relic/agent/new_relic_service/encoders.rb +1 -1
  162. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +1 -1
  163. data/lib/new_relic/agent/new_relic_service/marshaller.rb +1 -1
  164. data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +1 -1
  165. data/lib/new_relic/agent/noticible_error.rb +22 -0
  166. data/lib/new_relic/agent/null_logger.rb +1 -1
  167. data/lib/new_relic/agent/obfuscator.rb +1 -1
  168. data/lib/new_relic/agent/parameter_filtering.rb +1 -1
  169. data/lib/new_relic/agent/payload_metric_mapping.rb +1 -1
  170. data/lib/new_relic/agent/pipe_channel_manager.rb +1 -1
  171. data/lib/new_relic/agent/pipe_service.rb +1 -1
  172. data/lib/new_relic/agent/prepend_supportability.rb +1 -1
  173. data/lib/new_relic/agent/priority_sampled_buffer.rb +8 -5
  174. data/lib/new_relic/agent/range_extensions.rb +1 -1
  175. data/lib/new_relic/agent/rules_engine.rb +1 -1
  176. data/lib/new_relic/agent/rules_engine/replacement_rule.rb +1 -1
  177. data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +1 -1
  178. data/lib/new_relic/agent/sampler.rb +1 -1
  179. data/lib/new_relic/agent/sampler_collection.rb +1 -1
  180. data/lib/new_relic/agent/samplers/cpu_sampler.rb +1 -1
  181. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +1 -1
  182. data/lib/new_relic/agent/samplers/memory_sampler.rb +1 -1
  183. data/lib/new_relic/agent/samplers/object_sampler.rb +1 -1
  184. data/lib/new_relic/agent/samplers/vm_sampler.rb +1 -1
  185. data/lib/new_relic/agent/span_event_aggregator.rb +1 -1
  186. data/lib/new_relic/agent/span_event_primitive.rb +71 -37
  187. data/lib/new_relic/agent/sql_sampler.rb +4 -4
  188. data/lib/new_relic/agent/stats.rb +1 -1
  189. data/lib/new_relic/agent/stats_engine.rb +1 -1
  190. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +1 -1
  191. data/lib/new_relic/agent/stats_engine/stats_hash.rb +1 -1
  192. data/lib/new_relic/agent/supported_versions.rb +1 -1
  193. data/lib/new_relic/agent/synthetics_event_aggregator.rb +1 -1
  194. data/lib/new_relic/agent/system_info.rb +13 -4
  195. data/lib/new_relic/agent/threading/agent_thread.rb +1 -1
  196. data/lib/new_relic/agent/threading/backtrace_node.rb +1 -1
  197. data/lib/new_relic/agent/threading/backtrace_service.rb +1 -1
  198. data/lib/new_relic/agent/threading/thread_profile.rb +1 -1
  199. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +1 -1
  200. data/lib/new_relic/agent/tracer.rb +31 -16
  201. data/lib/new_relic/agent/transaction.rb +67 -46
  202. data/lib/new_relic/agent/transaction/abstract_segment.rb +29 -2
  203. data/lib/new_relic/agent/transaction/datastore_segment.rb +1 -1
  204. data/lib/new_relic/agent/transaction/distributed_tracer.rb +3 -3
  205. data/lib/new_relic/agent/transaction/distributed_tracing.rb +2 -2
  206. data/lib/new_relic/agent/transaction/external_request_segment.rb +26 -10
  207. data/lib/new_relic/agent/transaction/message_broker_segment.rb +1 -1
  208. data/lib/new_relic/agent/transaction/request_attributes.rb +1 -1
  209. data/lib/new_relic/agent/transaction/segment.rb +18 -2
  210. data/lib/new_relic/agent/transaction/slowest_sample_buffer.rb +1 -1
  211. data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +1 -1
  212. data/lib/new_relic/agent/transaction/trace.rb +1 -1
  213. data/lib/new_relic/agent/transaction/trace_builder.rb +1 -1
  214. data/lib/new_relic/agent/transaction/trace_context.rb +1 -1
  215. data/lib/new_relic/agent/transaction/trace_node.rb +1 -1
  216. data/lib/new_relic/agent/transaction/tracing.rb +1 -1
  217. data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +1 -1
  218. data/lib/new_relic/agent/transaction_error_primitive.rb +8 -6
  219. data/lib/new_relic/agent/transaction_event_aggregator.rb +1 -1
  220. data/lib/new_relic/agent/transaction_event_primitive.rb +3 -3
  221. data/lib/new_relic/agent/transaction_event_recorder.rb +1 -1
  222. data/lib/new_relic/agent/transaction_metrics.rb +1 -1
  223. data/lib/new_relic/agent/transaction_sampler.rb +1 -1
  224. data/lib/new_relic/agent/transaction_time_aggregator.rb +1 -1
  225. data/lib/new_relic/agent/utilization/aws.rb +1 -1
  226. data/lib/new_relic/agent/utilization/azure.rb +1 -1
  227. data/lib/new_relic/agent/utilization/gcp.rb +1 -1
  228. data/lib/new_relic/agent/utilization/pcf.rb +1 -1
  229. data/lib/new_relic/agent/utilization/vendor.rb +1 -1
  230. data/lib/new_relic/agent/utilization_data.rb +1 -1
  231. data/lib/new_relic/agent/vm.rb +1 -1
  232. data/lib/new_relic/agent/vm/jruby_vm.rb +1 -1
  233. data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +1 -1
  234. data/lib/new_relic/agent/vm/mri_vm.rb +1 -1
  235. data/lib/new_relic/agent/vm/snapshot.rb +1 -1
  236. data/lib/new_relic/agent/worker_loop.rb +1 -1
  237. data/lib/new_relic/cli/command.rb +1 -1
  238. data/lib/new_relic/cli/commands/deployments.rb +1 -1
  239. data/lib/new_relic/cli/commands/install.rb +4 -3
  240. data/lib/new_relic/coerce.rb +1 -1
  241. data/lib/new_relic/collection_helper.rb +1 -1
  242. data/lib/new_relic/constants.rb +5 -1
  243. data/lib/new_relic/control.rb +1 -1
  244. data/lib/new_relic/control/class_methods.rb +1 -1
  245. data/lib/new_relic/control/frameworks.rb +1 -1
  246. data/lib/new_relic/control/frameworks/external.rb +1 -1
  247. data/lib/new_relic/control/frameworks/merb.rb +1 -1
  248. data/lib/new_relic/control/frameworks/rails.rb +1 -1
  249. data/lib/new_relic/control/frameworks/rails3.rb +1 -1
  250. data/lib/new_relic/control/frameworks/rails4.rb +1 -1
  251. data/lib/new_relic/control/frameworks/rails_notifications.rb +1 -1
  252. data/lib/new_relic/control/frameworks/ruby.rb +1 -1
  253. data/lib/new_relic/control/frameworks/sinatra.rb +1 -1
  254. data/lib/new_relic/control/instance_methods.rb +1 -1
  255. data/lib/new_relic/control/instrumentation.rb +1 -1
  256. data/lib/new_relic/control/server_methods.rb +1 -1
  257. data/lib/new_relic/delayed_job_injection.rb +1 -1
  258. data/lib/new_relic/dependency_detection.rb +1 -1
  259. data/lib/new_relic/environment_report.rb +6 -2
  260. data/lib/new_relic/helper.rb +1 -1
  261. data/lib/new_relic/language_support.rb +1 -1
  262. data/lib/new_relic/latest_changes.rb +2 -2
  263. data/lib/new_relic/local_environment.rb +1 -1
  264. data/lib/new_relic/metric_data.rb +1 -1
  265. data/lib/new_relic/metric_spec.rb +1 -1
  266. data/lib/new_relic/metrics.rb +1 -1
  267. data/lib/new_relic/noticed_error.rb +29 -10
  268. data/lib/new_relic/rack.rb +1 -1
  269. data/lib/new_relic/rack/agent_hooks.rb +1 -1
  270. data/lib/new_relic/rack/agent_middleware.rb +1 -1
  271. data/lib/new_relic/rack/browser_monitoring.rb +3 -2
  272. data/lib/new_relic/recipes.rb +1 -1
  273. data/lib/new_relic/recipes/capistrano3.rb +1 -1
  274. data/lib/new_relic/recipes/capistrano_legacy.rb +1 -1
  275. data/lib/new_relic/supportability_helper.rb +1 -1
  276. data/lib/new_relic/version.rb +2 -2
  277. data/lib/newrelic_rpm.rb +1 -1
  278. data/lib/sequel/extensions/newrelic_instrumentation.rb +1 -1
  279. data/lib/sequel/plugins/newrelic_instrumentation.rb +1 -1
  280. data/lib/tasks/all.rb +1 -1
  281. data/lib/tasks/multiverse.rb +26 -1
  282. data/lib/tasks/newrelic.rb +1 -1
  283. data/lib/tasks/tests.rake +1 -1
  284. data/newrelic_rpm.gemspec +11 -9
  285. data/recipes/newrelic.rb +1 -1
  286. data/test/agent_helper.rb +231 -70
  287. metadata +18 -15
  288. data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
  289. data/true +0 -0
@@ -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 'zlib'
6
6
  require 'base64'
@@ -156,13 +156,13 @@ module NewRelic
156
156
 
157
157
  PRIORITY = "priority".freeze
158
158
 
159
- def distributed_trace_intrinsics(state)
159
+ def distributed_trace_attributes(state)
160
160
  transaction = state.current_transaction
161
161
  params = nil
162
162
  if transaction && transaction.distributed_tracer.distributed_trace_payload
163
163
  params = {}
164
164
  payload = transaction.distributed_tracer.distributed_trace_payload
165
- DistributedTraceIntrinsics.copy_from_transaction transaction, payload, params
165
+ DistributedTraceAttributes.copy_from_transaction transaction, payload, params
166
166
  params[PRIORITY] = transaction.priority
167
167
  end
168
168
  params
@@ -176,7 +176,7 @@ module NewRelic
176
176
  if state.is_sql_recorded?
177
177
  if duration > Agent.config[:'slow_sql.explain_threshold']
178
178
  backtrace = caller.join("\n")
179
- params = distributed_trace_intrinsics state
179
+ params = distributed_trace_attributes state
180
180
  data.sql_data << SlowSql.new(statement, metric_name, duration, backtrace, params)
181
181
  end
182
182
  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
  module NewRelic
5
5
  module Agent
6
6
  class Stats
@@ -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/stats_engine/gc_profiler'
6
6
  require 'new_relic/agent/stats_engine/stats_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
  # -*- coding: utf-8 -*-
6
6
  module NewRelic
@@ -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
  # A Hash-like class for storing metric data.
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
@@ -1,7 +1,7 @@
1
1
  # -*- ruby -*-
2
2
  # encoding: utf-8
3
3
  # This file is distributed under New Relic's license terms.
4
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
+ # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details.
5
5
 
6
6
  require 'new_relic/agent/event_aggregator'
7
7
  require 'new_relic/agent/timestamp_sampled_buffer'
@@ -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 module is intended to provide access to information about the host OS and
6
6
  # [virtual] machine. It intentionally does no caching and maintains no state -
@@ -170,11 +170,20 @@ module NewRelic
170
170
 
171
171
  container_id = case cpu_cgroup
172
172
  # docker native driver w/out systemd (fs)
173
- when /[0-9a-f]{64}/ then $&
173
+ when /[0-9a-f]{64,}/
174
+ if $&.length == 64
175
+ $&
176
+ else # container ID is too long
177
+ ::NewRelic::Agent.logger.debug("Ignoring docker ID of invalid length: '#{cpu_cgroup}'")
178
+ return
179
+ end
174
180
  # docker native driver with systemd
175
- when '/' then nil
181
+ when '/' then nil
176
182
  # in a cgroup, but we don't recognize its format
177
- when /docker/ then
183
+ when /docker\/.*[^0-9a-f]/ then
184
+ ::NewRelic::Agent.logger.debug("Cgroup indicates docker but container_id has invalid characters: '#{cpu_cgroup}'")
185
+ return
186
+ when /docker/ then
178
187
  ::NewRelic::Agent.logger.debug("Cgroup indicates docker but container_id unrecognized: '#{cpu_cgroup}'")
179
188
  ::NewRelic::Agent.increment_metric "Supportability/utilization/docker/error"
180
189
  return
@@ -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
  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
  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
  require 'set'
6
6
  require 'new_relic/agent/worker_loop'
@@ -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/heap'
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
  require 'new_relic/agent/transaction'
6
6
  require 'new_relic/agent/transaction/segment'
@@ -102,9 +102,9 @@ module NewRelic
102
102
  # only wrap the yield to be absolutely sure we don't report agent
103
103
  # problems as app errors
104
104
  yield
105
- rescue => e
106
- current_transaction.notice_error(e)
107
- raise e
105
+ rescue => exception
106
+ current_transaction.notice_error(exception)
107
+ raise
108
108
  ensure
109
109
  finishable.finish if finishable
110
110
  end
@@ -157,8 +157,8 @@ module NewRelic
157
157
 
158
158
  rescue ArgumentError
159
159
  raise
160
- rescue => e
161
- log_error('start_transaction_or_segment', e)
160
+ rescue => exception
161
+ log_error('start_transaction_or_segment', exception)
162
162
  end
163
163
 
164
164
  # Takes name or partial_name and a category.
@@ -190,8 +190,8 @@ module NewRelic
190
190
  options)
191
191
  rescue ArgumentError
192
192
  raise
193
- rescue => e
194
- log_error('start_transaction', e)
193
+ rescue => exception
194
+ log_error('start_transaction', exception)
195
195
  end
196
196
 
197
197
  def create_distributed_trace_payload
@@ -251,8 +251,8 @@ module NewRelic
251
251
 
252
252
  rescue ArgumentError
253
253
  raise
254
- rescue => e
255
- log_error('start_segment', e)
254
+ rescue => exception
255
+ log_error('start_segment', exception)
256
256
  end
257
257
 
258
258
  UNKNOWN = "Unknown".freeze
@@ -310,8 +310,8 @@ module NewRelic
310
310
 
311
311
  rescue ArgumentError
312
312
  raise
313
- rescue => e
314
- log_error('start_datastore_segment', e)
313
+ rescue => exception
314
+ log_error('start_datastore_segment', exception)
315
315
  end
316
316
 
317
317
  # Creates and starts an external request segment using the
@@ -357,8 +357,23 @@ module NewRelic
357
357
 
358
358
  rescue ArgumentError
359
359
  raise
360
- rescue => e
361
- log_error('start_external_request_segment', e)
360
+ rescue => exception
361
+ log_error('start_external_request_segment', exception)
362
+ end
363
+
364
+ # Will potentially capture and notice an error at the
365
+ # segment that was executing when error occurred.
366
+ # if passed +segment+ is something that doesn't
367
+ # respond to +notice_segment_error+ then this method
368
+ # is effectively just a yield to the given &block
369
+ def capture_segment_error segment
370
+ return unless block_given?
371
+ yield
372
+ rescue => exception
373
+ if segment && segment.is_a?(Transaction::AbstractSegment)
374
+ segment.notice_error exception
375
+ end
376
+ raise
362
377
  end
363
378
 
364
379
  # For New Relic internal use only.
@@ -390,8 +405,8 @@ module NewRelic
390
405
 
391
406
  rescue ArgumentError
392
407
  raise
393
- rescue => e
394
- log_error('start_datastore_segment', e)
408
+ rescue => exception
409
+ log_error('start_datastore_segment', exception)
395
410
  end
396
411
 
397
412
  # This method should only be used by Tracer for access to the
@@ -1,6 +1,7 @@
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
+ # frozen_string_literal: true
4
5
 
5
6
  require 'new_relic/agent/instrumentation/queue_time'
6
7
  require 'new_relic/agent/transaction_metrics'
@@ -23,22 +24,36 @@ module NewRelic
23
24
  include Tracing
24
25
 
25
26
  # for nested transactions
26
- SUBTRANSACTION_PREFIX = 'Nested/'.freeze
27
- CONTROLLER_PREFIX = 'Controller/'.freeze
28
- MIDDLEWARE_PREFIX = 'Middleware/Rack/'.freeze
29
- TASK_PREFIX = 'OtherTransaction/Background/'.freeze
30
- RAKE_PREFIX = 'OtherTransaction/Rake/'.freeze
31
- MESSAGE_PREFIX = 'OtherTransaction/Message/'.freeze
32
- RACK_PREFIX = 'Controller/Rack/'.freeze
33
- SINATRA_PREFIX = 'Controller/Sinatra/'.freeze
34
- GRAPE_PREFIX = 'Controller/Grape/'.freeze
35
- ACTION_CABLE_PREFIX = 'Controller/ActionCable/'.freeze
36
- OTHER_TRANSACTION_PREFIX = 'OtherTransaction/'.freeze
27
+ NESTED_TRANSACTION_PREFIX = "Nested/"
28
+ CONTROLLER_PREFIX = "Controller/"
29
+ MIDDLEWARE_PREFIX = "Middleware/Rack/"
30
+ OTHER_TRANSACTION_PREFIX = "OtherTransaction/"
31
+ TASK_PREFIX = "#{OTHER_TRANSACTION_PREFIX}Background/"
32
+ RAKE_PREFIX = "#{OTHER_TRANSACTION_PREFIX}Rake/"
33
+ MESSAGE_PREFIX = "#{OTHER_TRANSACTION_PREFIX}Message/"
34
+ RACK_PREFIX = "#{CONTROLLER_PREFIX}Rack/"
35
+ SINATRA_PREFIX = "#{CONTROLLER_PREFIX}Sinatra/"
36
+ GRAPE_PREFIX = "#{CONTROLLER_PREFIX}Grape/"
37
+ ACTION_CABLE_PREFIX = "#{CONTROLLER_PREFIX}ActionCable/"
37
38
 
38
39
  WEB_TRANSACTION_CATEGORIES = [:web, :controller, :uri, :rack, :sinatra, :grape, :middleware, :action_cable].freeze
39
40
  TRANSACTION_NAMING_SOURCES = [:child, :api].freeze
40
41
 
41
- MIDDLEWARE_SUMMARY_METRICS = ['Middleware/all'.freeze].freeze
42
+ MIDDLEWARE_SUMMARY_METRICS = ["Middleware/all"].freeze
43
+ WEB_SUMMARY_METRIC = "HttpDispatcher"
44
+ OTHER_SUMMARY_METRIC = "#{OTHER_TRANSACTION_PREFIX}all"
45
+ QUEUE_TIME_METRIC = "WebFrontend/QueueTime"
46
+
47
+ APDEX_S = "S"
48
+ APDEX_T = "T"
49
+ APDEX_F = "F"
50
+ APDEX_ALL_METRIC = "ApdexAll"
51
+ APDEX_METRIC = "Apdex"
52
+ APDEX_OTHER_METRIC = "ApdexOther"
53
+ APDEX_TXN_METRIC_PREFIX = "Apdex/"
54
+ APDEX_OTHER_TXN_METRIC_PREFIX = "ApdexOther/Transaction/"
55
+
56
+ JRUBY_CPU_TIME_ERROR = "Error calculating JRuby CPU Time"
42
57
 
43
58
  # reference to the transaction state managing this transaction
44
59
  attr_accessor :state
@@ -136,23 +151,22 @@ module NewRelic
136
151
 
137
152
  def self.nested_transaction_name(name)
138
153
  if name.start_with?(CONTROLLER_PREFIX) || name.start_with?(OTHER_TRANSACTION_PREFIX)
139
- "#{SUBTRANSACTION_PREFIX}#{name}"
154
+ "#{NESTED_TRANSACTION_PREFIX}#{name}"
140
155
  else
141
156
  name
142
157
  end
143
158
  end
144
159
 
145
- # Indicate that you don't want to keep the currently saved transaction
146
- # information
147
- def self.abort_transaction! #THREAD_LOCAL_ACCESS
148
- txn = Tracer.current_transaction
149
- txn.abort_transaction! if txn
160
+ # discards the currently saved transaction information
161
+ def self.abort_transaction!
162
+ if txn = Tracer.current_transaction
163
+ txn.abort_transaction!
164
+ end
150
165
  end
151
166
 
152
167
  # See NewRelic::Agent.notice_error for options and commentary
153
- def self.notice_error(e, options={}) #THREAD_LOCAL_ACCESS
154
- txn = Tracer.current_transaction
155
- if txn
168
+ def self.notice_error(e, options={})
169
+ if txn = Tracer.current_transaction
156
170
  txn.notice_error(e, options)
157
171
  elsif NewRelic::Agent.instance
158
172
  NewRelic::Agent.instance.error_collector.notice_error(e, options)
@@ -194,6 +208,7 @@ module NewRelic
194
208
 
195
209
  def add_agent_attribute(key, value, default_destinations)
196
210
  @attributes.add_agent_attribute(key, value, default_destinations)
211
+ current_segment.add_agent_attribute(key, value) if current_segment
197
212
  end
198
213
 
199
214
  def self.merge_untrusted_agent_attributes(attributes, prefix, default_destinations)
@@ -206,6 +221,7 @@ module NewRelic
206
221
 
207
222
  def merge_untrusted_agent_attributes(attributes, prefix, default_destinations)
208
223
  @attributes.merge_untrusted_agent_attributes(attributes, prefix, default_destinations)
224
+ current_segment.merge_untrusted_agent_attributes(attributes, prefix, default_destinations) if current_segment
209
225
  end
210
226
 
211
227
  @@java_classes_loaded = false
@@ -407,6 +423,10 @@ module NewRelic
407
423
  ignore! if user_defined_rules_ignore?
408
424
 
409
425
  create_initial_segment
426
+ Segment.merge_untrusted_agent_attributes \
427
+ @filtered_params,
428
+ :'request.parameters',
429
+ AttributeFilter::DST_SPAN_EVENTS
410
430
  end
411
431
 
412
432
  def initial_segment
@@ -446,9 +466,9 @@ module NewRelic
446
466
 
447
467
  nest_initial_segment if nesting_max_depth == 1
448
468
  nested_name = self.class.nested_transaction_name options[:transaction_name]
449
- result = create_segment nested_name
469
+ segment = create_segment nested_name
450
470
  set_default_transaction_name(options[:transaction_name], category)
451
- result
471
+ segment
452
472
  end
453
473
 
454
474
  def nest_initial_segment
@@ -462,9 +482,6 @@ module NewRelic
462
482
  @ignore_trace = true
463
483
  end
464
484
 
465
- WEB_SUMMARY_METRIC = 'HttpDispatcher'.freeze
466
- OTHER_SUMMARY_METRIC = 'OtherTransaction/all'.freeze
467
-
468
485
  def summary_metrics
469
486
  if @frozen_name.start_with?(CONTROLLER_PREFIX)
470
487
  [WEB_SUMMARY_METRIC]
@@ -496,6 +513,9 @@ module NewRelic
496
513
  initial_segment.name = @frozen_name
497
514
  end
498
515
 
516
+ initial_segment.transaction_name = @frozen_name
517
+ assign_segment_dt_attributes
518
+ assign_agent_attributes
499
519
  initial_segment.finish
500
520
 
501
521
  NewRelic::Agent::TransactionTimeAggregator.transaction_stop(@end_time, @starting_thread_id)
@@ -519,8 +539,6 @@ module NewRelic
519
539
 
520
540
  def commit!(outermost_node_name)
521
541
  generate_payload
522
-
523
- assign_agent_attributes
524
542
  assign_intrinsics
525
543
 
526
544
  finalize_segments
@@ -540,6 +558,13 @@ module NewRelic
540
558
  send_transaction_finished_event
541
559
  end
542
560
 
561
+ def assign_segment_dt_attributes
562
+ dt_payload = distributed_tracer.trace_state_payload || distributed_tracer.distributed_trace_payload
563
+ parent_attributes = {}
564
+ DistributedTraceAttributes.copy_parent_attributes self, dt_payload, parent_attributes
565
+ parent_attributes.each { |k, v| initial_segment.add_agent_attribute k, v }
566
+ end
567
+
543
568
  def assign_agent_attributes
544
569
  default_destinations = AttributeFilter::DST_TRANSACTION_TRACER |
545
570
  AttributeFilter::DST_TRANSACTION_EVENTS |
@@ -547,6 +572,9 @@ module NewRelic
547
572
 
548
573
  if http_response_code
549
574
  add_agent_attribute(:httpResponseCode, http_response_code.to_s, default_destinations)
575
+ # Sending status code as an int with http.statusCode key is correct
576
+ # The above attribute is deprecated and should be removed in agent version 7.0.0
577
+ add_agent_attribute(:'http.statusCode', http_response_code, default_destinations)
550
578
  end
551
579
 
552
580
  if response_content_length
@@ -666,10 +694,6 @@ module NewRelic
666
694
  info[4]
667
695
  end
668
696
 
669
- APDEX_S = 'S'.freeze
670
- APDEX_T = 'T'.freeze
671
- APDEX_F = 'F'.freeze
672
-
673
697
  def append_apdex_perf_zone(payload)
674
698
  if recording_web_transaction?
675
699
  bucket = apdex_bucket(duration, apdex_t)
@@ -708,13 +732,21 @@ module NewRelic
708
732
  options[:metric] = best_name
709
733
  options[:attributes] = @attributes
710
734
 
711
- error_recorded = !!agent.error_collector.notice_error(exception, options) || error_recorded
735
+ span_id = options.delete :span_id
736
+ error_recorded = !!agent.error_collector.notice_error(exception, options, span_id) || error_recorded
712
737
  end
713
738
  payload[:error] = error_recorded if payload
714
739
  end
715
740
 
716
741
  # Do not call this. Invoke the class method instead.
717
742
  def notice_error(error, options={}) # :nodoc:
743
+
744
+ # Only the last error is kept
745
+ if @current_segment
746
+ @current_segment.notice_error error, expected: options[:expected]
747
+ options[:span_id] = @current_segment.guid
748
+ end
749
+
718
750
  if @exceptions[error]
719
751
  @exceptions[error].merge! options
720
752
  else
@@ -726,8 +758,6 @@ module NewRelic
726
758
  agent.transaction_event_recorder.record payload
727
759
  end
728
760
 
729
- QUEUE_TIME_METRIC = 'WebFrontend/QueueTime'.freeze
730
-
731
761
  def queue_time
732
762
  @apdex_start ? @start_time - @apdex_start : 0
733
763
  end
@@ -743,17 +773,9 @@ module NewRelic
743
773
  end
744
774
  end
745
775
 
746
- APDEX_ALL_METRIC = 'ApdexAll'.freeze
747
-
748
- APDEX_METRIC = 'Apdex'.freeze
749
- APDEX_OTHER_METRIC = 'ApdexOther'.freeze
750
-
751
- APDEX_TXN_METRIC_PREFIX = 'Apdex/'.freeze
752
- APDEX_OTHER_TXN_METRIC_PREFIX = 'ApdexOther/Transaction/'.freeze
753
-
754
776
  def had_error_affecting_apdex?
755
777
  @exceptions.each do |exception, options|
756
- ignored = NewRelic::Agent.instance.error_collector.error_is_ignored?(exception)
778
+ ignored = NewRelic::Agent.instance.error_collector.error_is_ignored?(exception)
757
779
  expected = options[:expected]
758
780
 
759
781
  return true unless ignored || expected
@@ -892,7 +914,6 @@ module NewRelic
892
914
  p.stime + p.utime
893
915
  end
894
916
 
895
- JRUBY_CPU_TIME_ERROR = "Error calculating JRuby CPU Time".freeze
896
917
  def jruby_cpu_time
897
918
  return nil unless @@java_classes_loaded
898
919
  threadMBean = Java::JavaLangManagement::ManagementFactory.getThreadMXBean()