newrelic_rpm 6.2.0.354 → 6.15.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (310) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +8 -0
  3. data/CHANGELOG.md +646 -6
  4. data/CONTRIBUTING.md +106 -19
  5. data/Gemfile +6 -2
  6. data/Guardfile +18 -1
  7. data/LICENSE +208 -38
  8. data/README.md +81 -85
  9. data/ROADMAP.md +24 -0
  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/adaptive_sampler.rb +1 -1
  16. data/lib/new_relic/agent/agent.rb +168 -185
  17. data/lib/new_relic/agent/agent_logger.rb +5 -1
  18. data/lib/new_relic/agent/attribute_filter.rb +8 -8
  19. data/lib/new_relic/agent/attribute_processing.rb +1 -1
  20. data/lib/new_relic/agent/attributes.rb +152 -0
  21. data/lib/new_relic/agent/audit_logger.rb +11 -1
  22. data/lib/new_relic/agent/autostart.rb +20 -15
  23. data/lib/new_relic/agent/chained_call.rb +1 -1
  24. data/lib/new_relic/agent/commands/agent_command.rb +1 -1
  25. data/lib/new_relic/agent/commands/agent_command_router.rb +3 -22
  26. data/lib/new_relic/agent/commands/thread_profiler_session.rb +1 -1
  27. data/lib/new_relic/agent/configuration/default_source.rb +234 -51
  28. data/lib/new_relic/agent/configuration/dotted_hash.rb +1 -1
  29. data/lib/new_relic/agent/configuration/environment_source.rb +5 -3
  30. data/lib/new_relic/agent/configuration/event_harvest_config.rb +45 -0
  31. data/lib/new_relic/agent/configuration/high_security_source.rb +2 -1
  32. data/lib/new_relic/agent/configuration/manager.rb +14 -10
  33. data/lib/new_relic/agent/configuration/manual_source.rb +1 -1
  34. data/lib/new_relic/agent/configuration/mask_defaults.rb +1 -1
  35. data/lib/new_relic/agent/configuration/security_policy_source.rb +1 -1
  36. data/lib/new_relic/agent/configuration/server_source.rb +37 -3
  37. data/lib/new_relic/agent/configuration/yaml_source.rb +12 -7
  38. data/lib/new_relic/agent/configuration.rb +1 -1
  39. data/lib/new_relic/agent/connect/request_builder.rb +61 -0
  40. data/lib/new_relic/agent/connect/response_handler.rb +61 -0
  41. data/lib/new_relic/agent/custom_event_aggregator.rb +1 -1
  42. data/lib/new_relic/agent/database/explain_plan_helpers.rb +1 -1
  43. data/lib/new_relic/agent/database/obfuscation_helpers.rb +2 -2
  44. data/lib/new_relic/agent/database/obfuscator.rb +1 -1
  45. data/lib/new_relic/agent/database/postgres_explain_obfuscator.rb +1 -1
  46. data/lib/new_relic/agent/database.rb +2 -3
  47. data/lib/new_relic/agent/database_adapter.rb +33 -0
  48. data/lib/new_relic/agent/datastores/metric_helper.rb +1 -1
  49. data/lib/new_relic/agent/datastores/mongo/event_formatter.rb +3 -3
  50. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +1 -1
  51. data/lib/new_relic/agent/datastores/mongo/obfuscator.rb +9 -9
  52. data/lib/new_relic/agent/datastores/mongo/statement_formatter.rb +1 -1
  53. data/lib/new_relic/agent/datastores/mongo.rb +2 -2
  54. data/lib/new_relic/agent/datastores/redis.rb +1 -1
  55. data/lib/new_relic/agent/datastores.rb +1 -1
  56. data/lib/new_relic/agent/deprecator.rb +1 -1
  57. data/lib/new_relic/agent/{cross_app_payload.rb → distributed_tracing/cross_app_payload.rb} +3 -2
  58. data/lib/new_relic/agent/{cross_app_tracing.rb → distributed_tracing/cross_app_tracing.rb} +61 -46
  59. data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +84 -0
  60. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +75 -0
  61. data/lib/new_relic/agent/{distributed_trace_payload.rb → distributed_tracing/distributed_trace_payload.rb} +25 -102
  62. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +39 -0
  63. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +246 -0
  64. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +126 -0
  65. data/lib/new_relic/agent/distributed_tracing.rb +156 -7
  66. data/lib/new_relic/agent/encoding_normalizer.rb +1 -1
  67. data/lib/new_relic/agent/error_collector.rb +36 -19
  68. data/lib/new_relic/agent/error_event_aggregator.rb +10 -7
  69. data/lib/new_relic/agent/error_trace_aggregator.rb +2 -1
  70. data/lib/new_relic/agent/event_aggregator.rb +27 -33
  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 +8 -8
  75. data/lib/new_relic/agent/guid_generator.rb +28 -0
  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 +9 -3
  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 +12 -11
  87. data/lib/new_relic/agent/instrumentation/action_cable_subscriber.rb +26 -46
  88. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +51 -75
  89. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +81 -56
  90. data/lib/new_relic/agent/instrumentation/active_job.rb +1 -1
  91. data/lib/new_relic/agent/instrumentation/active_merchant.rb +1 -1
  92. data/lib/new_relic/agent/instrumentation/active_record.rb +85 -38
  93. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +17 -6
  94. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +168 -0
  95. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +35 -11
  96. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +46 -48
  97. data/lib/new_relic/agent/instrumentation/active_storage.rb +1 -1
  98. data/lib/new_relic/agent/instrumentation/active_storage_subscriber.rb +12 -8
  99. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +10 -9
  100. data/lib/new_relic/agent/instrumentation/authlogic.rb +1 -1
  101. data/lib/new_relic/agent/instrumentation/bunny.rb +48 -29
  102. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +1 -1
  103. data/lib/new_relic/agent/instrumentation/curb.rb +66 -19
  104. data/lib/new_relic/agent/instrumentation/data_mapper.rb +4 -2
  105. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +3 -1
  106. data/lib/new_relic/agent/instrumentation/excon/connection.rb +7 -4
  107. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +3 -2
  108. data/lib/new_relic/agent/instrumentation/excon.rb +2 -2
  109. data/lib/new_relic/agent/instrumentation/grape.rb +8 -14
  110. data/lib/new_relic/agent/instrumentation/http.rb +7 -4
  111. data/lib/new_relic/agent/instrumentation/httpclient.rb +6 -4
  112. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +1 -1
  113. data/lib/new_relic/agent/instrumentation/memcache/dalli.rb +7 -3
  114. data/lib/new_relic/agent/instrumentation/memcache.rb +4 -2
  115. data/lib/new_relic/agent/instrumentation/merb/controller.rb +1 -1
  116. data/lib/new_relic/agent/instrumentation/merb/errors.rb +1 -1
  117. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +1 -1
  118. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +9 -7
  119. data/lib/new_relic/agent/instrumentation/mongo.rb +10 -4
  120. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +36 -3
  121. data/lib/new_relic/agent/instrumentation/net.rb +48 -28
  122. data/lib/new_relic/agent/instrumentation/net_prepend.rb +40 -0
  123. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +100 -0
  124. data/lib/new_relic/agent/instrumentation/padrino.rb +3 -1
  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 +3 -1
  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/{rails5 → rails_notifications}/action_cable.rb +6 -7
  133. data/lib/new_relic/agent/instrumentation/{rails5 → rails_notifications}/action_controller.rb +4 -4
  134. data/lib/new_relic/agent/instrumentation/{rails5 → rails_notifications}/action_view.rb +4 -4
  135. data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +1 -1
  136. data/lib/new_relic/agent/instrumentation/rake.rb +2 -1
  137. data/lib/new_relic/agent/instrumentation/redis.rb +12 -6
  138. data/lib/new_relic/agent/instrumentation/resque.rb +4 -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/ignorer.rb +1 -1
  143. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +1 -1
  144. data/lib/new_relic/agent/instrumentation/sinatra.rb +1 -2
  145. data/lib/new_relic/agent/instrumentation/sunspot.rb +1 -1
  146. data/lib/new_relic/agent/instrumentation/typhoeus.rb +24 -7
  147. data/lib/new_relic/agent/instrumentation.rb +1 -1
  148. data/lib/new_relic/agent/internal_agent_error.rb +1 -1
  149. data/lib/new_relic/agent/javascript_instrumentor.rb +2 -2
  150. data/lib/new_relic/agent/log_once.rb +1 -1
  151. data/lib/new_relic/agent/logging.rb +139 -0
  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 +10 -8
  155. data/lib/new_relic/agent/method_tracer_helpers.rb +3 -3
  156. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +110 -0
  157. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +27 -0
  158. data/lib/new_relic/agent/{inbound_request_monitor.rb → monitors/inbound_request_monitor.rb} +4 -4
  159. data/lib/new_relic/agent/{synthetics_monitor.rb → monitors/synthetics_monitor.rb} +3 -5
  160. data/lib/new_relic/agent/monitors.rb +27 -0
  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/new_relic_service.rb +34 -14
  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 +19 -6
  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 +9 -4
  175. data/lib/new_relic/agent/range_extensions.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/rules_engine.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 +2 -2
  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 +3 -5
  187. data/lib/new_relic/agent/span_event_primitive.rb +108 -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/gc_profiler.rb +2 -2
  191. data/lib/new_relic/agent/stats_engine/stats_hash.rb +1 -1
  192. data/lib/new_relic/agent/stats_engine.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 +4 -4
  199. data/lib/new_relic/agent/threading/thread_profile.rb +10 -24
  200. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +1 -1
  201. data/lib/new_relic/agent/tracer.rb +66 -19
  202. data/lib/new_relic/agent/transaction/abstract_segment.rb +32 -5
  203. data/lib/new_relic/agent/transaction/datastore_segment.rb +1 -1
  204. data/lib/new_relic/agent/transaction/distributed_tracer.rb +177 -0
  205. data/lib/new_relic/agent/transaction/distributed_tracing.rb +58 -147
  206. data/lib/new_relic/agent/transaction/external_request_segment.rb +32 -39
  207. data/lib/new_relic/agent/transaction/message_broker_segment.rb +5 -12
  208. data/lib/new_relic/agent/transaction/request_attributes.rb +1 -1
  209. data/lib/new_relic/agent/transaction/segment.rb +28 -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 +6 -13
  213. data/lib/new_relic/agent/transaction/trace_builder.rb +1 -2
  214. data/lib/new_relic/agent/transaction/trace_context.rb +168 -0
  215. data/lib/new_relic/agent/transaction/trace_node.rb +11 -9
  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.rb +104 -84
  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 +4 -4
  223. data/lib/new_relic/agent/transaction_metrics.rb +1 -1
  224. data/lib/new_relic/agent/transaction_sampler.rb +2 -6
  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/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 +7 -5
  235. data/lib/new_relic/agent/vm/snapshot.rb +1 -1
  236. data/lib/new_relic/agent/vm.rb +1 -1
  237. data/lib/new_relic/agent/worker_loop.rb +1 -1
  238. data/lib/new_relic/agent.rb +98 -8
  239. data/lib/new_relic/cli/command.rb +1 -1
  240. data/lib/new_relic/cli/commands/deployments.rb +2 -3
  241. data/lib/new_relic/cli/commands/install.rb +4 -3
  242. data/lib/new_relic/coerce.rb +32 -7
  243. data/lib/new_relic/collection_helper.rb +1 -1
  244. data/lib/new_relic/constants.rb +42 -0
  245. data/lib/new_relic/control/class_methods.rb +8 -2
  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/{rails5.rb → rails_notifications.rb} +2 -2
  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/frameworks.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/control.rb +1 -1
  259. data/lib/new_relic/delayed_job_injection.rb +1 -1
  260. data/lib/new_relic/dependency_detection.rb +9 -5
  261. data/lib/new_relic/environment_report.rb +2 -4
  262. data/lib/new_relic/helper.rb +1 -1
  263. data/lib/new_relic/language_support.rb +1 -1
  264. data/lib/new_relic/latest_changes.rb +2 -2
  265. data/lib/new_relic/local_environment.rb +1 -1
  266. data/lib/new_relic/metric_data.rb +1 -1
  267. data/lib/new_relic/metric_spec.rb +1 -1
  268. data/lib/new_relic/noticed_error.rb +39 -18
  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 +16 -9
  272. data/lib/new_relic/rack.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/recipes.rb +1 -1
  276. data/lib/new_relic/supportability_helper.rb +17 -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/config.rake +1 -2
  283. data/lib/tasks/multiverse.rb +35 -1
  284. data/lib/tasks/newrelic.rb +1 -1
  285. data/lib/tasks/tests.rake +6 -1
  286. data/newrelic_rpm.gemspec +22 -10
  287. data/recipes/newrelic.rb +1 -1
  288. data/test/agent_helper.rb +356 -76
  289. metadata +116 -52
  290. data/.travis.yml +0 -153
  291. data/lib/new_relic/agent/commands/xray_session.rb +0 -55
  292. data/lib/new_relic/agent/commands/xray_session_collection.rb +0 -161
  293. data/lib/new_relic/agent/cross_app_monitor.rb +0 -110
  294. data/lib/new_relic/agent/distributed_trace_monitor.rb +0 -40
  295. data/lib/new_relic/agent/http_clients/abstract_request.rb +0 -31
  296. data/lib/new_relic/agent/instrumentation/active_record_4.rb +0 -42
  297. data/lib/new_relic/agent/instrumentation/active_record_5.rb +0 -41
  298. data/lib/new_relic/agent/instrumentation/evented_subscriber.rb +0 -104
  299. data/lib/new_relic/agent/instrumentation/rails4/action_controller.rb +0 -32
  300. data/lib/new_relic/agent/instrumentation/rails4/action_view.rb +0 -27
  301. data/lib/new_relic/agent/transaction/attributes.rb +0 -154
  302. data/lib/new_relic/agent/transaction/xray_sample_buffer.rb +0 -64
  303. data/lib/new_relic/build.rb +0 -2
  304. data/lib/new_relic/control/frameworks/rails6.rb +0 -14
  305. data/lib/new_relic/metrics.rb +0 -13
  306. data/lib/tasks/versions.html.erb +0 -28
  307. data/lib/tasks/versions.postface.html +0 -8
  308. data/lib/tasks/versions.preface.html +0 -9
  309. data/lib/tasks/versions.rake +0 -65
  310. data/lib/tasks/versions.txt.erb +0 -14
@@ -1,104 +0,0 @@
1
- # encoding: utf-8
2
- # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
-
5
- module NewRelic
6
- module Agent
7
- module Instrumentation
8
- class EventedSubscriber
9
- def initialize
10
- @queue_key = ['NewRelic', self.class.name, object_id].join('-')
11
- end
12
-
13
- def self.subscribed?
14
- # TODO: need to talk to Rails core about an API for this,
15
- # rather than digging through Listener ivars
16
- ActiveSupport::Notifications.notifier.instance_variable_get(:@subscribers) \
17
- .find{|s| s.instance_variable_get(:@delegate).class == self }
18
- end
19
-
20
- def self.subscribe(pattern)
21
- if !subscribed?
22
- ActiveSupport::Notifications.subscribe(pattern, new)
23
- end
24
- end
25
-
26
- def start(name, id, payload)
27
- event = ActiveSupport::Notifications::Event.new(name, Time.now, nil, id, payload)
28
- push_event(event)
29
- return event
30
- end
31
-
32
- def finish(name, id, payload)
33
- pop_event(id)
34
- end
35
-
36
- def log_notification_error(error, name, event_type)
37
- # These are important enough failures that we want the backtraces
38
- # logged at error level, hence the explicit log_exception call.
39
- NewRelic::Agent.logger.error("Error during #{event_type} callback for event '#{name}':")
40
- NewRelic::Agent.logger.log_exception(:error, error)
41
- end
42
-
43
- def push_event(event)
44
- parent = event_stack[event.transaction_id].last
45
- if parent && event.respond_to?(:parent=)
46
- event.parent = parent
47
- parent << event
48
- end
49
- event_stack[event.transaction_id].push event
50
- end
51
-
52
- def pop_event(transaction_id)
53
- event = event_stack[transaction_id].pop
54
- event.end = Time.now
55
- return event
56
- end
57
-
58
- def event_stack
59
- Thread.current[@queue_key] ||= Hash.new {|h,id| h[id] = [] }
60
- end
61
-
62
- def state
63
- NewRelic::Agent::Tracer.state
64
- end
65
- end
66
-
67
- # Taken from ActiveSupport::Notifications::Event, pasted here
68
- # with a couple minor additions so we don't have a hard
69
- # dependency on ActiveSupport::Notifications.
70
- #
71
- # Represents an instrumentation event, provides timing and metric
72
- # name information useful when recording metrics.
73
- class Event
74
- attr_reader :name, :time, :transaction_id, :payload, :children
75
- attr_accessor :end, :parent, :frame
76
-
77
- def initialize(name, start, ending, transaction_id, payload)
78
- @name = name
79
- @payload = payload.dup
80
- @time = start
81
- @transaction_id = transaction_id
82
- @end = ending
83
- @children = []
84
- end
85
-
86
- def metric_name
87
- raise NotImplementedError
88
- end
89
-
90
- def duration
91
- self.end - time
92
- end
93
-
94
- def <<(event)
95
- @children << event
96
- end
97
-
98
- def parent_of?(event)
99
- @children.include? event
100
- end
101
- end
102
- end
103
- end
104
- end
@@ -1,32 +0,0 @@
1
- # encoding: utf-8
2
- # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
- require 'new_relic/agent/instrumentation/action_controller_subscriber'
5
- require 'new_relic/agent/prepend_supportability'
6
-
7
-
8
- DependencyDetection.defer do
9
- @name = :rails4_controller
10
-
11
- depends_on do
12
- defined?(::Rails::VERSION::MAJOR) && ::Rails::VERSION::MAJOR.to_i == 4
13
- end
14
-
15
- depends_on do
16
- defined?(ActionController) && defined?(ActionController::Base)
17
- end
18
-
19
- executes do
20
- ::NewRelic::Agent.logger.info 'Installing Rails 4 Controller instrumentation'
21
- end
22
-
23
- executes do
24
- class ActionController::Base
25
- include NewRelic::Agent::Instrumentation::ControllerInstrumentation
26
- end
27
- NewRelic::Agent::Instrumentation::ActionControllerSubscriber \
28
- .subscribe(/^process_action.action_controller$/)
29
-
30
- ::NewRelic::Agent::PrependSupportability.record_metrics_for(::ActionController::Base)
31
- end
32
- end
@@ -1,27 +0,0 @@
1
- # encoding: utf-8
2
- # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
- require 'new_relic/agent/instrumentation/action_view_subscriber'
5
- require 'new_relic/agent/prepend_supportability'
6
-
7
- DependencyDetection.defer do
8
- @name = :rails4_view
9
-
10
- depends_on do
11
- defined?(::Rails::VERSION::MAJOR) && ::Rails::VERSION::MAJOR.to_i == 4
12
- end
13
-
14
- depends_on do
15
- !NewRelic::Agent.config[:disable_view_instrumentation] &&
16
- !NewRelic::Agent::Instrumentation::ActionViewSubscriber.subscribed?
17
- end
18
-
19
- executes do
20
- ::NewRelic::Agent.logger.info 'Installing Rails 4 view instrumentation'
21
- end
22
-
23
- executes do
24
- NewRelic::Agent::Instrumentation::ActionViewSubscriber.subscribe(/render_.+\.action_view$/)
25
- NewRelic::Agent::PrependSupportability.record_metrics_for(::ActionView::Base, ::ActionView::Template, ::ActionView::Renderer)
26
- end
27
- end
@@ -1,154 +0,0 @@
1
- # encoding: utf-8
2
- # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
-
5
- require 'new_relic/agent/attribute_processing'
6
-
7
- module NewRelic
8
- module Agent
9
- class Transaction
10
- class Attributes
11
- KEY_LIMIT = 255
12
- VALUE_LIMIT = 255
13
- COUNT_LIMIT = 64
14
-
15
- EMPTY_HASH = {}.freeze
16
-
17
- def initialize(filter)
18
- @filter = filter
19
-
20
- @custom_attributes = {}
21
- @agent_attributes = {}
22
- @intrinsic_attributes = {}
23
-
24
- @custom_destinations = {}
25
- @agent_destinations = {}
26
- @already_warned_count_limit = nil
27
- end
28
-
29
- def add_agent_attribute(key, value, default_destinations)
30
- destinations = @filter.apply(key, default_destinations)
31
- return if destinations == AttributeFilter::DST_NONE
32
-
33
- @agent_destinations[key] = destinations
34
- add(@agent_attributes, key, value)
35
- end
36
-
37
- def add_agent_attribute_with_key_check(key, value, default_destinations)
38
- if exceeds_bytesize_limit? key, KEY_LIMIT
39
- NewRelic::Agent.logger.debug("Agent attribute #{key} was dropped for exceeding key length limit #{KEY_LIMIT}")
40
- return
41
- end
42
-
43
- add_agent_attribute(key, value, default_destinations)
44
- end
45
-
46
- def add_intrinsic_attribute(key, value)
47
- add(@intrinsic_attributes, key, value)
48
- end
49
-
50
- def merge_untrusted_agent_attributes(attributes, prefix, default_destinations)
51
- return if @filter.high_security?
52
- return if !@filter.might_allow_prefix?(prefix)
53
-
54
- AttributeProcessing.flatten_and_coerce(attributes, prefix) do |k, v|
55
- add_agent_attribute_with_key_check(k, v, AttributeFilter::DST_NONE)
56
- end
57
- end
58
-
59
- def merge_custom_attributes(other)
60
- return unless Agent.config[:'custom_attributes.enabled']
61
- return if other.empty?
62
- AttributeProcessing.flatten_and_coerce(other) do |k, v|
63
- add_custom_attribute(k, v)
64
- end
65
- end
66
-
67
- def custom_attributes_for(destination)
68
- for_destination(@custom_attributes, @custom_destinations, destination)
69
- end
70
-
71
- def agent_attributes_for(destination)
72
- for_destination(@agent_attributes, @agent_destinations, destination)
73
- end
74
-
75
- def intrinsic_attributes_for(destination)
76
- if destination == NewRelic::Agent::AttributeFilter::DST_TRANSACTION_TRACER ||
77
- destination == NewRelic::Agent::AttributeFilter::DST_ERROR_COLLECTOR
78
- @intrinsic_attributes
79
- else
80
- EMPTY_HASH
81
- end
82
- end
83
-
84
- private
85
-
86
- def add_custom_attribute(key, value)
87
- if @custom_attributes.size >= COUNT_LIMIT
88
- unless @already_warned_count_limit
89
- NewRelic::Agent.logger.warn("Custom attributes count exceeded limit of #{COUNT_LIMIT}. Any additional custom attributes during this transaction will be dropped.")
90
- @already_warned_count_limit = true
91
- end
92
- return
93
- end
94
-
95
- if @filter.high_security?
96
- NewRelic::Agent.logger.debug("Unable to add custom attribute #{key} while in high security mode.")
97
- return
98
- end
99
-
100
- if exceeds_bytesize_limit?(key, KEY_LIMIT)
101
- NewRelic::Agent.logger.warn("Custom attribute key '#{key}' was longer than limit of #{KEY_LIMIT} bytes. This attribute will be dropped.")
102
- return
103
- end
104
-
105
- destinations = @filter.apply(key, AttributeFilter::DST_ALL)
106
- return if destinations == AttributeFilter::DST_NONE
107
-
108
- @custom_destinations[key] = destinations
109
- add(@custom_attributes, key, value)
110
- end
111
-
112
- def add(attributes, key, value)
113
- return if value.nil?
114
-
115
- if exceeds_bytesize_limit?(value, VALUE_LIMIT)
116
- value = slice(value)
117
- end
118
-
119
- attributes[key] = value
120
- end
121
-
122
- def for_destination(attributes, calculated_destinations, destination)
123
- # Avoid allocating anything if there are no attrs at all
124
- return EMPTY_HASH if attributes.empty?
125
-
126
- attributes.inject({}) do |memo, (key, value)|
127
- if @filter.allows?(calculated_destinations[key], destination)
128
- memo[key] = value
129
- end
130
- memo
131
- end
132
- end
133
-
134
- def exceeds_bytesize_limit?(value, limit)
135
- if value.respond_to?(:bytesize)
136
- value.bytesize > limit
137
- elsif value.is_a?(Symbol)
138
- value.to_s.bytesize > limit
139
- else
140
- false
141
- end
142
- end
143
-
144
- # Take one byte past our limit. Why? This lets us unconditionally chop!
145
- # the end. It'll either remove the one-character-too-many we have, or
146
- # peel off the partial, mangled character left by the byteslice.
147
- def slice(incoming)
148
- result = incoming.to_s.byteslice(0, VALUE_LIMIT + 1)
149
- result.chop!
150
- end
151
- end
152
- end
153
- end
154
- end
@@ -1,64 +0,0 @@
1
- # encoding: utf-8
2
- # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
-
5
- require 'new_relic/agent/transaction/transaction_sample_buffer'
6
-
7
- module NewRelic
8
- module Agent
9
- class Transaction
10
- class XraySampleBuffer < TransactionSampleBuffer
11
-
12
- attr_writer :xray_session_collection
13
-
14
- def initialize
15
- super
16
-
17
- # Memoize the config setting since this happens per request
18
- @enabled = NewRelic::Agent.config[:'xray_session.allow_traces']
19
- NewRelic::Agent.config.register_callback(:'xray_session.allow_traces') do |new_value|
20
- @enabled = new_value
21
- end
22
-
23
- @capacity = NewRelic::Agent.config[:'xray_session.max_samples']
24
- NewRelic::Agent.config.register_callback(:'xray_session.max_samples') do |new_value|
25
- @capacity = new_value
26
- end
27
- end
28
-
29
- def xray_session_collection
30
- @xray_session_collection ||= NewRelic::Agent.instance.agent_command_router.xray_session_collection
31
- end
32
-
33
- def capacity
34
- @capacity
35
- end
36
-
37
- def truncate_samples
38
- # First in wins, so stop on allow_sample? instead of truncating
39
- end
40
-
41
- def allow_sample?(sample)
42
- !full? && !lookup_session_id(sample).nil?
43
- end
44
-
45
- def enabled?
46
- @enabled
47
- end
48
-
49
-
50
- private
51
-
52
- def add_sample(sample)
53
- super(sample)
54
- sample.xray_session_id = lookup_session_id(sample)
55
- end
56
-
57
- def lookup_session_id(sample)
58
- xray_session_collection.session_id_for_transaction_name(sample.transaction_name)
59
- end
60
-
61
- end
62
- end
63
- end
64
- end
@@ -1,2 +0,0 @@
1
- # GITSHA: aa8729185abae27cfa81e0e908b89b5572b8d365
2
- module NewRelic; module VERSION; BUILD='354'; end; end
@@ -1,14 +0,0 @@
1
- # encoding: utf-8
2
- # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
-
5
- require 'new_relic/control/frameworks/rails4'
6
-
7
- module NewRelic
8
- class Control
9
- module Frameworks
10
- class Rails6 < NewRelic::Control::Frameworks::Rails4
11
- end
12
- end
13
- end
14
- end
@@ -1,13 +0,0 @@
1
- # encoding: utf-8
2
- # This file is distributed under New Relic's license terms.
3
- # See https://github.com/newrelic/rpm/blob/master/LICENSE for complete details.
4
-
5
- module NewRelic
6
- module Metrics
7
- CONTROLLER = "Controller"
8
- DISPATCHER = "HttpDispatcher"
9
- ACTIVE_RECORD = "ActiveRecord"
10
- USER_TIME = "CPU/User Time"
11
- MEMORY = "Memory/Physical"
12
- end
13
- end
@@ -1,28 +0,0 @@
1
- <h2 id="<%= anchor %>"><%= title %></h2>
2
- <table>
3
- <thead>
4
- <tr>
5
- <th>Name</th>
6
- <th>Supported</th>
7
- <th>Deprecated</th>
8
- <th>Experimental</th>
9
- </tr>
10
- </thead>
11
- <tbody>
12
- <% for version in versions %>
13
- <tr>
14
- <td rowspan=<%= if version.notes; 2; else; 1; end %>><b><%= version.name %></b></td>
15
- <td><%= CGI.escapeHTML(version_list(version.supported)) %></td>
16
- <td><%= CGI.escapeHTML(version_list(version.deprecated)) %></td>
17
- <td><%= CGI.escapeHTML(version_list(version.experimental)) %></td>
18
- </tr>
19
- <% if version.notes %>
20
- <tr>
21
- <td colspan="3">
22
- <%= version.notes.join("<br />") %>
23
- </td>
24
- </tr>
25
- <% end %>
26
- <% end %>
27
- </tbody>
28
- </table>