newrelic_rpm 9.0.0 → 9.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (224) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +6 -16
  4. data/.rubocop_todo.yml +4 -43
  5. data/.simplecov +1 -1
  6. data/CHANGELOG.md +60 -2
  7. data/Gemfile +1 -1
  8. data/Guardfile +7 -7
  9. data/README.md +1 -2
  10. data/Rakefile +8 -8
  11. data/Thorfile +1 -1
  12. data/bin/nrdebug +20 -20
  13. data/init.rb +1 -1
  14. data/lib/new_relic/agent/agent.rb +3 -16
  15. data/lib/new_relic/agent/agent_helpers/connect.rb +4 -9
  16. data/lib/new_relic/agent/agent_helpers/harvest.rb +4 -4
  17. data/lib/new_relic/agent/agent_helpers/shutdown.rb +5 -5
  18. data/lib/new_relic/agent/agent_helpers/special_startup.rb +2 -2
  19. data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +47 -39
  20. data/lib/new_relic/agent/agent_helpers/startup.rb +13 -13
  21. data/lib/new_relic/agent/agent_helpers/transmit.rb +6 -6
  22. data/lib/new_relic/agent/agent_logger.rb +9 -9
  23. data/lib/new_relic/agent/attribute_filter.rb +2 -2
  24. data/lib/new_relic/agent/attribute_processing.rb +2 -2
  25. data/lib/new_relic/agent/audit_logger.rb +5 -5
  26. data/lib/new_relic/agent/autostart.rb +1 -1
  27. data/lib/new_relic/agent/commands/agent_command.rb +2 -2
  28. data/lib/new_relic/agent/commands/agent_command_router.rb +5 -4
  29. data/lib/new_relic/agent/commands/thread_profiler_session.rb +5 -5
  30. data/lib/new_relic/agent/configuration/default_source.rb +57 -56
  31. data/lib/new_relic/agent/configuration/environment_source.rb +2 -2
  32. data/lib/new_relic/agent/configuration/high_security_source.rb +3 -3
  33. data/lib/new_relic/agent/configuration/manager.rb +2 -2
  34. data/lib/new_relic/agent/configuration/security_policy_source.rb +10 -10
  35. data/lib/new_relic/agent/configuration/server_source.rb +24 -24
  36. data/lib/new_relic/agent/configuration/yaml_source.rb +4 -4
  37. data/lib/new_relic/agent/connect/request_builder.rb +1 -1
  38. data/lib/new_relic/agent/connect/response_handler.rb +1 -1
  39. data/lib/new_relic/agent/custom_event_aggregator.rb +4 -4
  40. data/lib/new_relic/agent/database/explain_plan_helpers.rb +1 -1
  41. data/lib/new_relic/agent/database/obfuscation_helpers.rb +2 -2
  42. data/lib/new_relic/agent/database/obfuscator.rb +2 -2
  43. data/lib/new_relic/agent/database.rb +4 -4
  44. data/lib/new_relic/agent/datastores/metric_helper.rb +5 -5
  45. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +11 -11
  46. data/lib/new_relic/agent/datastores/redis.rb +6 -6
  47. data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +7 -8
  48. data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +10 -10
  49. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +7 -7
  50. data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +1 -1
  51. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +6 -6
  52. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +7 -7
  53. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +4 -4
  54. data/lib/new_relic/agent/distributed_tracing.rb +5 -5
  55. data/lib/new_relic/agent/error_collector.rb +35 -7
  56. data/lib/new_relic/agent/error_filter.rb +2 -2
  57. data/lib/new_relic/agent/error_trace_aggregator.rb +5 -4
  58. data/lib/new_relic/agent/event_loop.rb +3 -3
  59. data/lib/new_relic/agent/external.rb +1 -1
  60. data/lib/new_relic/agent/harvester.rb +1 -3
  61. data/lib/new_relic/agent/heap.rb +2 -1
  62. data/lib/new_relic/agent/hostname.rb +1 -1
  63. data/lib/new_relic/agent/http_clients/abstract.rb +9 -21
  64. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +7 -3
  65. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +7 -5
  66. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +4 -0
  67. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +6 -2
  68. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +5 -1
  69. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +8 -5
  70. data/lib/new_relic/agent/http_clients/uri_util.rb +2 -2
  71. data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +5 -2
  72. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +3 -2
  73. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +3 -3
  74. data/lib/new_relic/agent/instrumentation/active_job.rb +1 -1
  75. data/lib/new_relic/agent/instrumentation/active_record.rb +3 -2
  76. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +38 -35
  77. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +3 -3
  78. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +2 -2
  79. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +3 -2
  80. data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +3 -3
  81. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +5 -3
  82. data/lib/new_relic/agent/instrumentation/curb/chain.rb +1 -1
  83. data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +5 -5
  84. data/lib/new_relic/agent/instrumentation/curb.rb +1 -1
  85. data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +2 -1
  86. data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +1 -1
  87. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +2 -1
  88. data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +1 -1
  89. data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +3 -3
  90. data/lib/new_relic/agent/instrumentation/elasticsearch.rb +1 -1
  91. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +2 -1
  92. data/lib/new_relic/agent/instrumentation/excon.rb +3 -3
  93. data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +4 -4
  94. data/lib/new_relic/agent/instrumentation/grape.rb +3 -3
  95. data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +2 -1
  96. data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +3 -3
  97. data/lib/new_relic/agent/instrumentation/httprb.rb +1 -1
  98. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +1 -1
  99. data/lib/new_relic/agent/instrumentation/logger.rb +1 -1
  100. data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +2 -2
  101. data/lib/new_relic/agent/instrumentation/memcache.rb +6 -6
  102. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +3 -3
  103. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +1 -1
  104. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +5 -5
  105. data/lib/new_relic/agent/instrumentation/net_http.rb +1 -1
  106. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +1 -1
  107. data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +3 -3
  108. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +2 -2
  109. data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +1 -1
  110. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +3 -2
  111. data/lib/new_relic/agent/instrumentation/rails_middleware.rb +1 -1
  112. data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +7 -7
  113. data/lib/new_relic/agent/instrumentation/rake.rb +2 -2
  114. data/lib/new_relic/agent/instrumentation/redis/constants.rb +1 -1
  115. data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +2 -1
  116. data/lib/new_relic/agent/instrumentation/resque/helper.rb +1 -1
  117. data/lib/new_relic/agent/instrumentation/sequel.rb +4 -4
  118. data/lib/new_relic/agent/instrumentation/sequel_helper.rb +10 -10
  119. data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +1 -1
  120. data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +1 -1
  121. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +1 -1
  122. data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +6 -5
  123. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +1 -1
  124. data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +2 -1
  125. data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +5 -5
  126. data/lib/new_relic/agent/javascript_instrumentor.rb +29 -24
  127. data/lib/new_relic/agent/linking_metadata.rb +2 -2
  128. data/lib/new_relic/agent/log_event_aggregator.rb +15 -15
  129. data/lib/new_relic/agent/logging.rb +73 -33
  130. data/lib/new_relic/agent/messaging.rb +7 -5
  131. data/lib/new_relic/agent/method_tracer.rb +6 -6
  132. data/lib/new_relic/agent/method_tracer_helpers.rb +1 -1
  133. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +4 -4
  134. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +1 -1
  135. data/lib/new_relic/agent/new_relic_service/encoders.rb +1 -1
  136. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +2 -2
  137. data/lib/new_relic/agent/new_relic_service.rb +14 -14
  138. data/lib/new_relic/agent/obfuscator.rb +1 -1
  139. data/lib/new_relic/agent/parameter_filtering.rb +6 -6
  140. data/lib/new_relic/agent/pipe_channel_manager.rb +7 -6
  141. data/lib/new_relic/agent/pipe_service.rb +5 -3
  142. data/lib/new_relic/agent/priority_sampled_buffer.rb +1 -1
  143. data/lib/new_relic/agent/sampler.rb +1 -1
  144. data/lib/new_relic/agent/sampler_collection.rb +1 -1
  145. data/lib/new_relic/agent/samplers/cpu_sampler.rb +5 -5
  146. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +9 -9
  147. data/lib/new_relic/agent/samplers/memory_sampler.rb +9 -9
  148. data/lib/new_relic/agent/samplers/object_sampler.rb +1 -1
  149. data/lib/new_relic/agent/span_event_aggregator.rb +4 -4
  150. data/lib/new_relic/agent/span_event_primitive.rb +2 -2
  151. data/lib/new_relic/agent/sql_sampler.rb +2 -2
  152. data/lib/new_relic/agent/stats.rb +1 -1
  153. data/lib/new_relic/agent/synthetics_event_aggregator.rb +1 -1
  154. data/lib/new_relic/agent/system_info.rb +10 -10
  155. data/lib/new_relic/agent/threading/agent_thread.rb +1 -1
  156. data/lib/new_relic/agent/threading/backtrace_node.rb +3 -3
  157. data/lib/new_relic/agent/threading/backtrace_service.rb +3 -7
  158. data/lib/new_relic/agent/threading/thread_profile.rb +5 -5
  159. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +1 -1
  160. data/lib/new_relic/agent/tracer.rb +8 -7
  161. data/lib/new_relic/agent/transaction/abstract_segment.rb +7 -7
  162. data/lib/new_relic/agent/transaction/datastore_segment.rb +1 -1
  163. data/lib/new_relic/agent/transaction/distributed_tracer.rb +7 -6
  164. data/lib/new_relic/agent/transaction/distributed_tracing.rb +6 -6
  165. data/lib/new_relic/agent/transaction/external_request_segment.rb +11 -11
  166. data/lib/new_relic/agent/transaction/message_broker_segment.rb +1 -1
  167. data/lib/new_relic/agent/transaction/request_attributes.rb +2 -2
  168. data/lib/new_relic/agent/transaction/segment.rb +1 -1
  169. data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +1 -1
  170. data/lib/new_relic/agent/transaction/trace.rb +1 -1
  171. data/lib/new_relic/agent/transaction/trace_context.rb +4 -4
  172. data/lib/new_relic/agent/transaction/trace_node.rb +8 -7
  173. data/lib/new_relic/agent/transaction/tracing.rb +2 -2
  174. data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +1 -1
  175. data/lib/new_relic/agent/transaction.rb +39 -36
  176. data/lib/new_relic/agent/transaction_error_primitive.rb +5 -5
  177. data/lib/new_relic/agent/transaction_event_aggregator.rb +4 -4
  178. data/lib/new_relic/agent/transaction_event_primitive.rb +3 -3
  179. data/lib/new_relic/agent/transaction_sampler.rb +3 -3
  180. data/lib/new_relic/agent/transaction_time_aggregator.rb +7 -3
  181. data/lib/new_relic/agent/utilization/aws.rb +1 -1
  182. data/lib/new_relic/agent/utilization/azure.rb +3 -3
  183. data/lib/new_relic/agent/utilization/gcp.rb +3 -3
  184. data/lib/new_relic/agent/utilization/pcf.rb +1 -1
  185. data/lib/new_relic/agent/utilization/vendor.rb +1 -1
  186. data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +1 -1
  187. data/lib/new_relic/agent/vm/mri_vm.rb +9 -8
  188. data/lib/new_relic/agent/worker_loop.rb +1 -1
  189. data/lib/new_relic/agent.rb +78 -16
  190. data/lib/new_relic/cli/command.rb +3 -3
  191. data/lib/new_relic/cli/commands/deployments.rb +26 -25
  192. data/lib/new_relic/cli/commands/install.rb +14 -14
  193. data/lib/new_relic/collection_helper.rb +2 -2
  194. data/lib/new_relic/constants.rb +7 -8
  195. data/lib/new_relic/control/class_methods.rb +3 -3
  196. data/lib/new_relic/control/frameworks/rails.rb +30 -18
  197. data/lib/new_relic/control/instance_methods.rb +5 -5
  198. data/lib/new_relic/control/instrumentation.rb +1 -1
  199. data/lib/new_relic/control/private_instance_methods.rb +1 -1
  200. data/lib/new_relic/dependency_detection.rb +4 -17
  201. data/lib/new_relic/environment_report.rb +4 -4
  202. data/lib/new_relic/helper.rb +2 -1
  203. data/lib/new_relic/language_support.rb +1 -1
  204. data/lib/new_relic/latest_changes.rb +5 -5
  205. data/lib/new_relic/noticed_error.rb +20 -18
  206. data/lib/new_relic/rack/browser_monitoring.rb +20 -16
  207. data/lib/new_relic/recipes/capistrano3.rb +1 -1
  208. data/lib/new_relic/recipes/capistrano_legacy.rb +6 -6
  209. data/lib/new_relic/recipes/helpers/send_deployment.rb +5 -5
  210. data/lib/new_relic/supportability_helper.rb +2 -0
  211. data/lib/new_relic/version.rb +1 -1
  212. data/lib/newrelic_rpm.rb +3 -3
  213. data/lib/sequel/extensions/new_relic_instrumentation.rb +3 -3
  214. data/lib/sequel/plugins/new_relic_instrumentation.rb +1 -1
  215. data/lib/tasks/config.rake +12 -12
  216. data/lib/tasks/coverage_report.rake +3 -3
  217. data/lib/tasks/helpers/format.rb +9 -9
  218. data/lib/tasks/helpers/removers.rb +5 -5
  219. data/lib/tasks/install.rake +4 -4
  220. data/lib/tasks/multiverse.rb +12 -6
  221. data/lib/tasks/tests.rake +6 -6
  222. data/newrelic_rpm.gemspec +13 -13
  223. data/test/agent_helper.rb +25 -24
  224. metadata +2 -2
@@ -44,26 +44,38 @@ module NewRelic
44
44
  # find a config and use that.
45
45
  def init_config(options = {})
46
46
  @config = options[:config]
47
- # Install the dependency detection,
48
- if rails_config && ::Rails.configuration.respond_to?(:after_initialize)
49
- rails_config.after_initialize do
50
- # This will insure we load all the instrumentation as late as possible. If the agent
51
- # is not enabled, it will load a limited amount of instrumentation.
52
- DependencyDetection.detect!
53
- end
47
+ install_dependency_detection
48
+ install_browser_monitoring_and_agent_hooks
49
+ rescue => e
50
+ ::NewRelic::Agent.logger.error('Failure during init_config for Rails. Is Rails required in a non-Rails ' \
51
+ 'app? Set NEW_RELIC_FRAMEWORK=ruby to avoid this message. The Ruby agent ' \
52
+ 'will continue running, but Rails-specific features may be missing. ' \
53
+ "#{e.class} - #{e.message}")
54
+ end
55
+
56
+ def install_dependency_detection
57
+ return unless rails_config && ::Rails.configuration.respond_to?(:after_initialize)
58
+
59
+ rails_config.after_initialize do
60
+ # This will insure we load all the instrumentation as late as
61
+ # possible. If the agent is not enabled, it will load a limited
62
+ # amount of instrumentation.
63
+ DependencyDetection.detect!
54
64
  end
65
+ end
66
+
67
+ def install_browser_monitoring_and_agent_hooks
68
+ return unless rails_config
69
+
55
70
  if !Agent.config[:agent_enabled]
56
- # Might not be running if it does not think mongrel, thin, passenger, etc
57
- # is running, if it thinks it's a rake task, or if the agent_enabled is false.
58
- ::NewRelic::Agent.logger.info("New Relic Agent not running.")
71
+ # Might not be running if it does not think mongrel, thin,
72
+ # passenger, etc. is running, if it thinks it's a rake task, or
73
+ # if the agent_enabled is false.
74
+ ::NewRelic::Agent.logger.info('New Relic Agent not running. Skipping browser monitoring and agent hooks.')
59
75
  else
60
76
  install_browser_monitoring(rails_config)
61
77
  install_agent_hooks(rails_config)
62
78
  end
63
- rescue => e
64
- ::NewRelic::Agent.logger.error("Failure during init_config for Rails. Is Rails required in a non-Rails app? Set NEW_RELIC_FRAMEWORK=ruby to avoid this message.",
65
- "The Ruby agent will continue running, but Rails-specific features may be missing.",
66
- e)
67
79
  end
68
80
 
69
81
  def install_agent_hooks(config)
@@ -77,9 +89,9 @@ module NewRelic
77
89
  return unless NewRelic::Rack::AgentHooks.needed?
78
90
 
79
91
  config.middleware.use(NewRelic::Rack::AgentHooks)
80
- ::NewRelic::Agent.logger.debug("Installed New Relic Agent Hooks middleware")
92
+ ::NewRelic::Agent.logger.debug('Installed New Relic Agent Hooks middleware')
81
93
  rescue => e
82
- ::NewRelic::Agent.logger.warn("Error installing New Relic Agent Hooks middleware", e)
94
+ ::NewRelic::Agent.logger.warn('Error installing New Relic Agent Hooks middleware', e)
83
95
  end
84
96
  end
85
97
 
@@ -93,9 +105,9 @@ module NewRelic
93
105
  begin
94
106
  require 'new_relic/rack/browser_monitoring'
95
107
  config.middleware.use(NewRelic::Rack::BrowserMonitoring)
96
- ::NewRelic::Agent.logger.debug("Installed New Relic Browser Monitoring middleware")
108
+ ::NewRelic::Agent.logger.debug('Installed New Relic Browser Monitoring middleware')
97
109
  rescue => e
98
- ::NewRelic::Agent.logger.warn("Error installing New Relic Browser Monitoring middleware", e)
110
+ ::NewRelic::Agent.logger.warn('Error installing New Relic Browser Monitoring middleware', e)
99
111
  end
100
112
  end
101
113
  end
@@ -82,10 +82,10 @@ module NewRelic
82
82
  if @started_in_env && @started_in_env != env
83
83
  Agent.logger.error("Attempted to start agent in #{env.inspect} environment, but agent was already running " \
84
84
  "in #{@started_in_env.inspect}", "The agent will continue running in #{@started_in_env.inspect}. To " \
85
- "alter this, ensure the desired environment is set before the agent starts.")
85
+ 'alter this, ensure the desired environment is set before the agent starts.')
86
86
  else
87
87
  Agent.logger.info("Starting the New Relic agent version #{NewRelic::VERSION::STRING} in #{env.inspect} " \
88
- "environment.", "To prevent agent startup add a NEW_RELIC_AGENT_ENABLED=false environment variable or " \
88
+ 'environment.', 'To prevent agent startup add a NEW_RELIC_AGENT_ENABLED=false environment variable or ' \
89
89
  "modify the #{env.inspect} section of your newrelic.yml.")
90
90
  end
91
91
 
@@ -106,9 +106,9 @@ module NewRelic
106
106
  end
107
107
 
108
108
  def handle_invalid_security_settings
109
- NewRelic::Agent.logger.error("Security Policies and High Security Mode cannot both be present in the agent " \
110
- "configuration. If Security Policies have been set for your account, please ensure the " \
111
- "security_policies_token is set but high_security is disabled (default).")
109
+ NewRelic::Agent.logger.error('Security Policies and High Security Mode cannot both be present in the agent ' \
110
+ 'configuration. If Security Policies have been set for your account, please ensure the ' \
111
+ 'security_policies_token is set but high_security is disabled (default).')
112
112
  install_shim
113
113
  end
114
114
 
@@ -64,7 +64,7 @@ module NewRelic
64
64
  DependencyDetection.detect!
65
65
  ruby_deprecation
66
66
  rails_32_deprecation
67
- ::NewRelic::Agent.logger.info("Finished instrumentation")
67
+ ::NewRelic::Agent.logger.info('Finished instrumentation')
68
68
  end
69
69
  end
70
70
 
@@ -12,7 +12,7 @@ module NewRelic
12
12
 
13
13
  def configure_high_security
14
14
  if security_settings_valid? && Agent.config[:high_security]
15
- Agent.logger.info("Installing high security configuration based on local configuration")
15
+ Agent.logger.info('Installing high security configuration based on local configuration')
16
16
  Agent.config.replace_or_add_config(Agent::Configuration::HighSecuritySource.new(Agent.config))
17
17
  end
18
18
  end
@@ -35,19 +35,6 @@ module DependencyDetection
35
35
  @items.find { |i| i.name == name }
36
36
  end
37
37
 
38
- def installed?(name)
39
- item = dependency_by_name(name)
40
- item && item.executed
41
- end
42
-
43
- def items
44
- @items
45
- end
46
-
47
- def items=(new_items)
48
- @items = new_items
49
- end
50
-
51
38
  class Dependent
52
39
  attr_reader :executed
53
40
  attr_accessor :name
@@ -83,7 +70,7 @@ module DependencyDetection
83
70
  # Given "NewRelic::Agent::Instrumentation::NetHTTP::Prepend"
84
71
  # Will extract "NetHTTP" which is in the 2nd to last spot
85
72
  def extract_supportability_name(instrumenting_module)
86
- instrumenting_module.to_s.split("::")[-2]
73
+ instrumenting_module.to_s.split('::')[-2]
87
74
  end
88
75
 
89
76
  def log_and_instrument(method, instrumenting_module, supportability_name)
@@ -94,20 +81,20 @@ module DependencyDetection
94
81
  end
95
82
 
96
83
  def prepend_instrument(target_class, instrumenting_module, supportability_name = nil)
97
- log_and_instrument("Prepend", instrumenting_module, supportability_name) do
84
+ log_and_instrument('Prepend', instrumenting_module, supportability_name) do
98
85
  target_class.send(:prepend, instrumenting_module)
99
86
  end
100
87
  end
101
88
 
102
89
  def chain_instrument(instrumenting_module, supportability_name = nil)
103
- log_and_instrument("MethodChaining", instrumenting_module, supportability_name) do
90
+ log_and_instrument('MethodChaining', instrumenting_module, supportability_name) do
104
91
  instrumenting_module.instrument!
105
92
  end
106
93
  end
107
94
 
108
95
  def chain_instrument_target(target, instrumenting_module, supportability_name = nil)
109
96
  NewRelic::Agent.logger.info("Installing deferred #{target} instrumentation")
110
- log_and_instrument("MethodChaining", instrumenting_module, supportability_name) do
97
+ log_and_instrument('MethodChaining', instrumenting_module, supportability_name) do
111
98
  instrumenting_module.instrument!(target)
112
99
  end
113
100
  end
@@ -52,7 +52,7 @@ module NewRelic
52
52
  # though so try it if the above fails.
53
53
  Bundler.load.specs.map do |spec|
54
54
  version = (spec.respond_to?(:version) && spec.version)
55
- spec.name + (version ? "(#{version})" : "")
55
+ spec.name + (version ? "(#{version})" : '')
56
56
  end
57
57
  end
58
58
  end
@@ -118,19 +118,19 @@ module NewRelic
118
118
  def record_value(data, key, value)
119
119
  data[key] = value
120
120
 
121
- Agent.record_metric("Supportability/EnvironmentReport/success", 0.0)
121
+ Agent.record_metric('Supportability/EnvironmentReport/success', 0.0)
122
122
  Agent.record_metric("Supportability/EnvironmentReport/success/#{key}", 0.0)
123
123
  end
124
124
 
125
125
  def record_empty_value(key, value)
126
126
  Agent.logger.debug("EnvironmentReport ignoring value for #{key.inspect} which came back falsey: #{value.inspect}")
127
- Agent.record_metric("Supportability/EnvironmentReport/empty", 0.0)
127
+ Agent.record_metric('Supportability/EnvironmentReport/empty', 0.0)
128
128
  Agent.record_metric("Supportability/EnvironmentReport/empty/#{key}", 0.0)
129
129
  end
130
130
 
131
131
  def rescue_initialize(key, exception)
132
132
  Agent.logger.debug("EnvironmentReport failed to retrieve value for #{key.inspect}: #{exception}")
133
- Agent.record_metric("Supportability/EnvironmentReport/error", 0.0)
133
+ Agent.record_metric('Supportability/EnvironmentReport/error', 0.0)
134
134
  Agent.record_metric("Supportability/EnvironmentReport/error/#{key}", 0.0)
135
135
  end
136
136
  end
@@ -63,7 +63,8 @@ module NewRelic
63
63
  raise NewRelic::CommandRunFailedError.new("Failed to run command '#{command}': #{message}")
64
64
  end
65
65
 
66
- output.chomp if output
66
+ # needs else branch coverage
67
+ output.chomp if output # rubocop:disable Style/SafeNavigation
67
68
  end
68
69
 
69
70
  # TODO: Open3 defers the actual execution of a binary to Process.spawn,
@@ -62,7 +62,7 @@ module NewRelic
62
62
  #
63
63
  # Can't help if the constant isn't a class...
64
64
  if result.is_a?(Module)
65
- expected_name = "#{namespace}::#{name}".gsub(/^Object::/, "")
65
+ expected_name = "#{namespace}::#{name}".gsub(/^Object::/, '')
66
66
  return unless expected_name == result.to_s
67
67
  end
68
68
 
@@ -26,12 +26,12 @@ EOS
26
26
  # * This is a patch item (3.7.1.188)
27
27
  def self.read_patch(patch_level, changelog = default_changelog)
28
28
  latest = extract_latest_changes(File.read(changelog))
29
- changes = ["## v#{patch_level}", ""]
29
+ changes = ["## v#{patch_level}", '']
30
30
 
31
31
  current_item = nil
32
32
  latest.each do |line|
33
- if line =~ /^\s*\*.*/
34
- if line =~ /\(#{patch_level}\)/
33
+ if /^\s*\*.*/.match?(line)
34
+ if /\(#{patch_level}\)/.match?(line)
35
35
  # Found a patch level item, so start tracking the lines!
36
36
  current_item = line
37
37
  else
@@ -52,12 +52,12 @@ EOS
52
52
  changes = []
53
53
  version_count = 0
54
54
  contents.each_line do |line|
55
- if line =~ /##\s+v[\d.]+/
55
+ if /##\s+v[\d.]+/.match?(line)
56
56
  version_count += 1
57
57
  end
58
58
  break if version_count >= 2
59
59
 
60
- changes << line.sub(/^ \* /, "* ").chomp
60
+ changes << line.sub(/^ \* /, '* ').chomp
61
61
  end
62
62
  changes
63
63
  end
@@ -15,18 +15,20 @@ class NewRelic::NoticedError
15
15
  :stack_trace, :attributes_from_notice_error, :attributes,
16
16
  :expected
17
17
 
18
- attr_reader :exception_id, :is_internal
18
+ attr_reader :error_group, :exception_id, :is_internal
19
19
 
20
20
  STRIPPED_EXCEPTION_REPLACEMENT_MESSAGE = "Message removed by New Relic 'strip_exception_messages' setting"
21
21
  UNKNOWN_ERROR_CLASS_NAME = 'Error'
22
22
  NIL_ERROR_MESSAGE = '<no message>'
23
23
 
24
- USER_ATTRIBUTES = "userAttributes"
25
- AGENT_ATTRIBUTES = "agentAttributes"
26
- INTRINSIC_ATTRIBUTES = "intrinsics"
24
+ USER_ATTRIBUTES = 'userAttributes'
25
+ AGENT_ATTRIBUTES = 'agentAttributes'
26
+ INTRINSIC_ATTRIBUTES = 'intrinsics'
27
27
 
28
28
  DESTINATION = NewRelic::Agent::AttributeFilter::DST_ERROR_COLLECTOR
29
29
 
30
+ AGENT_ATTRIBUTE_ERROR_GROUP = :'error.group.name'
31
+
30
32
  ERROR_PREFIX_KEY = 'error'
31
33
  ERROR_MESSAGE_KEY = "#{ERROR_PREFIX_KEY}.message"
32
34
  ERROR_CLASS_KEY = "#{ERROR_PREFIX_KEY}.class"
@@ -141,21 +143,9 @@ class NewRelic::NoticedError
141
143
  end
142
144
 
143
145
  def build_agent_attributes(merged_attributes)
144
- agent_attributes = if @attributes
145
- @attributes.agent_attributes_for(DESTINATION)
146
- else
147
- NewRelic::EMPTY_HASH
148
- end
149
-
150
- # It's possible to override the request_uri from the transaction attributes
151
- # with a uri passed to notice_error. Add it to merged_attributes filter and
152
- # merge with the transaction attributes, possibly overriding the request_uri
153
- if request_uri
154
- merged_attributes.add_agent_attribute(:'request.uri', request_uri, DESTINATION)
155
- agent_attributes.merge(merged_attributes.agent_attributes_for(DESTINATION))
156
- end
146
+ return NewRelic::EMPTY_HASH unless @attributes
157
147
 
158
- agent_attributes
148
+ @attributes.agent_attributes_for(DESTINATION)
159
149
  end
160
150
 
161
151
  def build_intrinsic_attributes
@@ -197,4 +187,16 @@ class NewRelic::NoticedError
197
187
  @message = exception.to_s
198
188
  end
199
189
  end
190
+
191
+ def error_group=(name)
192
+ return if name.nil? || name.empty?
193
+
194
+ if agent_attributes.frozen?
195
+ processed_attributes[AGENT_ATTRIBUTES] = agent_attributes.merge(AGENT_ATTRIBUTE_ERROR_GROUP => name)
196
+ else
197
+ agent_attributes[AGENT_ATTRIBUTE_ERROR_GROUP] = name
198
+ end
199
+
200
+ @error_group = name
201
+ end
200
202
  end
@@ -26,11 +26,11 @@ module NewRelic
26
26
  ATTACHMENT = 'attachment'.freeze
27
27
  TEXT_HTML = 'text/html'.freeze
28
28
 
29
- BODY_START = "<body".freeze
30
- HEAD_START = "<head".freeze
31
- GT = ">".freeze
29
+ BODY_START = '<body'.freeze
30
+ HEAD_START = '<head'.freeze
31
+ GT = '>'.freeze
32
32
 
33
- ALREADY_INSTRUMENTED_KEY = "newrelic.browser_monitoring_already_instrumented"
33
+ ALREADY_INSTRUMENTED_KEY = 'newrelic.browser_monitoring_already_instrumented'
34
34
  CHARSET_RE = /<\s*meta[^>]+charset\s*=[^>]*>/im.freeze
35
35
  X_UA_COMPATIBLE_RE = /<\s*meta[^>]+http-equiv\s*=\s*['"]x-ua-compatible['"][^>]*>/im.freeze
36
36
 
@@ -40,7 +40,7 @@ module NewRelic
40
40
 
41
41
  js_to_inject = NewRelic::Agent.browser_timing_header
42
42
  if (js_to_inject != NewRelic::EMPTY_STR) && should_instrument?(env, status, headers)
43
- response_string = autoinstrument_source(response, headers, js_to_inject)
43
+ response_string = autoinstrument_source(response, js_to_inject)
44
44
  if headers.key?(CONTENT_LENGTH)
45
45
  content_length = response_string ? response_string.bytesize : 0
46
46
  headers[CONTENT_LENGTH] = content_length.to_s
@@ -69,11 +69,17 @@ module NewRelic
69
69
 
70
70
  private
71
71
 
72
- def autoinstrument_source(response, headers, js_to_inject)
72
+ def autoinstrument_source(response, js_to_inject)
73
73
  source = gather_source(response)
74
74
  close_old_response(response)
75
- return nil unless source
75
+ return unless source
76
76
 
77
+ modify_source(source, js_to_inject)
78
+ rescue => e
79
+ NewRelic::Agent.logger.debug("Skipping RUM instrumentation on exception: #{e.class} - #{e.message}")
80
+ end
81
+
82
+ def modify_source(source, js_to_inject)
77
83
  # Only scan the first 50k (roughly) then give up.
78
84
  beginning_of_source = source[0..SCAN_LIMIT]
79
85
  meta_tag_positions = find_meta_tag_positions(beginning_of_source)
@@ -81,26 +87,24 @@ module NewRelic
81
87
  if insertion_index = find_insertion_index(meta_tag_positions, beginning_of_source, body_start)
82
88
  source = source_injection(source, insertion_index, js_to_inject)
83
89
  else
84
- NewRelic::Agent.logger.debug("Skipping RUM instrumentation. Could not properly determine location to inject script.")
90
+ NewRelic::Agent.logger.debug('Skipping RUM instrumentation. Could not properly determine location to ' \
91
+ 'inject script.')
85
92
  end
86
93
  else
87
94
  msg = "Skipping RUM instrumentation. Unable to find <body> tag in first #{SCAN_LIMIT} bytes of document."
88
95
  NewRelic::Agent.logger.log_once(:warn, :rum_insertion_failure, msg)
89
96
  NewRelic::Agent.logger.debug(msg)
90
97
  end
91
-
92
98
  source
93
- rescue => e
94
- NewRelic::Agent.logger.debug("Skipping RUM instrumentation on exception.", e)
95
- nil
96
99
  end
97
100
 
98
101
  def html?(headers)
99
- headers[CONTENT_TYPE] && headers[CONTENT_TYPE].include?(TEXT_HTML)
102
+ # needs else branch coverage
103
+ headers[CONTENT_TYPE] && headers[CONTENT_TYPE].include?(TEXT_HTML) # rubocop:disable Style/SafeNavigation
100
104
  end
101
105
 
102
106
  def attachment?(headers)
103
- headers[CONTENT_DISPOSITION] && headers[CONTENT_DISPOSITION].include?(ATTACHMENT)
107
+ headers[CONTENT_DISPOSITION]&.include?(ATTACHMENT)
104
108
  end
105
109
 
106
110
  def streaming?(env, headers)
@@ -150,12 +154,12 @@ module NewRelic
150
154
 
151
155
  def find_x_ua_compatible_position(beginning_of_source)
152
156
  match = X_UA_COMPATIBLE_RE.match(beginning_of_source)
153
- match.end(0) if match
157
+ match&.end(0)
154
158
  end
155
159
 
156
160
  def find_charset_position(beginning_of_source)
157
161
  match = CHARSET_RE.match(beginning_of_source)
158
- match.end(0) if match
162
+ match&.end(0)
159
163
  end
160
164
 
161
165
  def find_end_of_head_open(beginning_of_source)
@@ -8,7 +8,7 @@ require_relative 'helpers/send_deployment'
8
8
  namespace :newrelic do
9
9
  include SendDeployment
10
10
  # notifies New Relic of a deployment
11
- desc "Record a deployment in New Relic (newrelic.com)"
11
+ desc 'Record a deployment in New Relic (newrelic.com)'
12
12
  task :notice_deployment do
13
13
  if fetch(:newrelic_role)
14
14
  on roles(fetch(:newrelic_role)) do
@@ -5,9 +5,9 @@
5
5
  make_notify_task = proc do
6
6
  namespace(:newrelic) do
7
7
  # on all deployments, notify New Relic
8
- desc("Record a deployment in New Relic (newrelic.com)")
8
+ desc('Record a deployment in New Relic (newrelic.com)')
9
9
  task(:notice_deployment, :roles => :app, :except => {:no_release => true}) do
10
- rails_env = fetch(:newrelic_rails_env, fetch(:rails_env, "production"))
10
+ rails_env = fetch(:newrelic_rails_env, fetch(:rails_env, 'production'))
11
11
 
12
12
  require 'new_relic/cli/command'
13
13
 
@@ -36,14 +36,14 @@ make_notify_task = proc do
36
36
  :license_key => license_key
37
37
  }
38
38
 
39
- logger.debug("Uploading deployment to New Relic")
39
+ logger.debug('Uploading deployment to New Relic')
40
40
  deployment = NewRelic::Cli::Deployments.new(deploy_options)
41
41
  deployment.run
42
- logger.info("Uploaded deployment information to New Relic")
42
+ logger.info('Uploaded deployment information to New Relic')
43
43
  rescue NewRelic::Cli::Command::CommandFailure => e
44
44
  logger.info(e.message)
45
45
  rescue Capistrano::CommandError
46
- logger.info("Unable to notify New Relic of the deployment... skipping")
46
+ logger.info('Unable to notify New Relic of the deployment... skipping')
47
47
  rescue => e
48
48
  logger.info("Error creating New Relic deployment (#{e})\n#{e.backtrace.join("\n")}")
49
49
  end
@@ -51,7 +51,7 @@ make_notify_task = proc do
51
51
 
52
52
  def lookup_changelog(changelog)
53
53
  if !changelog
54
- logger.debug("Getting log of changes for New Relic Deployment details")
54
+ logger.debug('Getting log of changes for New Relic Deployment details')
55
55
  from_revision = source.next_revision(current_revision)
56
56
 
57
57
  if scm == :git
@@ -5,9 +5,9 @@
5
5
  module SendDeployment
6
6
  def send_deployment_notification_to_newrelic
7
7
  require 'new_relic/cli/command'
8
- debug("Uploading deployment to New Relic")
8
+ debug('Uploading deployment to New Relic')
9
9
  NewRelic::Cli::Deployments.new(deploy_options).run
10
- info("Uploaded deployment information to New Relic")
10
+ info('Uploaded deployment information to New Relic')
11
11
  rescue NewRelic::Cli::Command::CommandFailure => e
12
12
  info(e.message)
13
13
  rescue => e
@@ -34,7 +34,7 @@ module SendDeployment
34
34
  end
35
35
 
36
36
  def fetch_environment
37
- fetch(:newrelic_rails_env, fetch(:rack_env, fetch(:rails_env, fetch(:stage, "production"))))
37
+ fetch(:newrelic_rails_env, fetch(:rack_env, fetch(:rails_env, fetch(:stage, 'production'))))
38
38
  end
39
39
 
40
40
  def fetch_rev
@@ -59,9 +59,9 @@ module SendDeployment
59
59
  current_revision = fetch(:current_revision)
60
60
  return unless current_revision && previous_revision
61
61
 
62
- debug("Retrieving changelog for New Relic Deployment details")
62
+ debug('Retrieving changelog for New Relic Deployment details')
63
63
 
64
- if Rake::Task.task_defined?("git:check")
64
+ if Rake::Task.task_defined?('git:check')
65
65
  log_command = "git --no-pager log --no-color --pretty=format:' * %an: %s' " +
66
66
  "--abbrev-commit --no-merges #{previous_revision}..#{current_revision}"
67
67
  `#{log_command}`
@@ -44,8 +44,10 @@ module NewRelic
44
44
  :record_metric,
45
45
  :recording_web_transaction?,
46
46
  :require_test_helper,
47
+ :set_error_group_callback,
47
48
  :set_sql_obfuscator,
48
49
  :set_transaction_name,
50
+ :set_user_id,
49
51
  :shutdown,
50
52
  :start_segment,
51
53
  :trace,
@@ -6,7 +6,7 @@
6
6
  module NewRelic
7
7
  module VERSION # :nodoc:
8
8
  MAJOR = 9
9
- MINOR = 0
9
+ MINOR = 1
10
10
  TINY = 0
11
11
 
12
12
  STRING = "#{MAJOR}.#{MINOR}.#{TINY}"
data/lib/newrelic_rpm.rb CHANGED
@@ -21,16 +21,16 @@ if defined?(Rails::VERSION)
21
21
  module NewRelic
22
22
  class Railtie < Rails::Railtie
23
23
  if ENV['NEW_RELIC_DEFER_RAILS_INITIALIZATION']
24
- initializer "newrelic_rpm.include_method_tracers", before: :load_config_initializers do |app|
24
+ initializer 'newrelic_rpm.include_method_tracers', before: :load_config_initializers do |app|
25
25
  Module.send(:include, NewRelic::Agent::MethodTracer::ClassMethods)
26
26
  Module.send(:include, NewRelic::Agent::MethodTracer)
27
27
  end
28
28
 
29
- initializer "newrelic_rpm.start_plugin", after: :load_config_initializers do |app|
29
+ initializer 'newrelic_rpm.start_plugin', after: :load_config_initializers do |app|
30
30
  NewRelic::Control.instance.init_plugin(config: app.config)
31
31
  end
32
32
  else
33
- initializer "newrelic_rpm.start_plugin", before: :load_config_initializers do |app|
33
+ initializer 'newrelic_rpm.start_plugin', before: :load_config_initializers do |app|
34
34
  NewRelic::Control.instance.init_plugin(config: app.config)
35
35
  end
36
36
  end
@@ -32,7 +32,7 @@ module Sequel
32
32
  module NewRelicInstrumentation
33
33
  module Naming
34
34
  def self.query_method_name
35
- if Sequel::VERSION >= "4.35.0"
35
+ if Sequel::VERSION >= '4.35.0'
36
36
  :log_connection_yield
37
37
  else
38
38
  :log_yield
@@ -86,13 +86,13 @@ module Sequel
86
86
  if THREAD_SAFE_CONNECTION_POOL_CLASSES.include?(self.pool.class)
87
87
  self[sql].explain
88
88
  else
89
- NewRelic::Agent.logger.log_once(:info, :sequel_explain_skipped, "Not running SQL explains because Sequel is not in recognized multi-threaded mode")
89
+ NewRelic::Agent.logger.log_once(:info, :sequel_explain_skipped, 'Not running SQL explains because Sequel is not in recognized multi-threaded mode')
90
90
  nil
91
91
  end
92
92
  end
93
93
  end
94
94
  end # module NewRelicInstrumentation
95
95
 
96
- NewRelic::Agent.logger.debug("Registering the :new_relic_instrumentation extension.")
96
+ NewRelic::Agent.logger.debug('Registering the :new_relic_instrumentation extension.')
97
97
  Database.register_extension(:new_relic_instrumentation, NewRelicInstrumentation)
98
98
  end # module Sequel
@@ -54,7 +54,7 @@ module Sequel
54
54
  module ClassMethods
55
55
  extend Sequel::Plugins::NewRelicInstrumentation::MethodWrapping
56
56
 
57
- wrap_sequel_method :[], "get"
57
+ wrap_sequel_method :[], 'get'
58
58
  wrap_sequel_method :all
59
59
  wrap_sequel_method :first
60
60
  wrap_sequel_method :create
@@ -7,9 +7,9 @@ include Format
7
7
 
8
8
  namespace :newrelic do
9
9
  namespace :config do
10
- GENERAL = "general"
11
- DISABLING = "disabling"
12
- ATTRIBUTES = "attributes"
10
+ GENERAL = 'general'
11
+ DISABLING = 'disabling'
12
+ ATTRIBUTES = 'attributes'
13
13
 
14
14
  # these configuration options are not able to be set using environment variables
15
15
  NON_ENV_CONFIGS = ['error_collector.ignore_classes', 'error_collector.ignore_messages', 'error_collector.expected_classes', 'error_collector.expected_messages']
@@ -18,21 +18,21 @@ namespace :newrelic do
18
18
  GENERAL => 'These settings are available for agent configuration. Some settings depend on your New Relic subscription level.',
19
19
  DISABLING => 'Use these settings to toggle instrumentation types during agent startup.',
20
20
  ATTRIBUTES => '[Attributes](/docs/features/agent-attributes) are key-value pairs containing information that determines the properties of an event or transaction. These key-value pairs can be viewed within transaction traces in APM, traced errors in APM, transaction events in dashboards, and page views in dashboards. You can customize exactly which attributes will be sent to each of these destinations',
21
- "transaction_tracer" => 'The [transaction traces](/docs/apm/traces/transaction-traces/transaction-traces) feature collects detailed information from a selection of transactions, including a summary of the calling sequence, a breakdown of time spent, and a list of SQL queries and their query plans (on mysql and postgresql). Available features depend on your New Relic subscription level.',
22
- "error_collector" => "The agent collects and reports all uncaught exceptions by default. These configuration options allow you to customize the error collection.\n\nFor information on ignored and expected errors, [see this page on Error Analytics in APM](/docs/agents/manage-apm-agents/agent-data/manage-errors-apm-collect-ignore-or-mark-expected/). To set expected errors via the `NewRelic::Agent.notice_error` Ruby method, [consult the Ruby Agent API](/docs/agents/ruby-agent/api-guides/sending-handled-errors-new-relic/).",
23
- "browser_monitoring" => "The browser monitoring [page load timing](/docs/browser/new-relic-browser/page-load-timing/page-load-timing-process) feature (sometimes referred to as real user monitoring or RUM) gives you insight into the performance real users are experiencing with your website. This is accomplished by measuring the time it takes for your users' browsers to download and render your web pages by injecting a small amount of JavaScript code into the header and footer of each page.",
24
- "analytics_events" => '[New Relic dashboards](/docs/query-your-data/explore-query-data/dashboards/introduction-new-relic-one-dashboards) is a resource to gather and visualize data about your software and what it says about your business. With it you can quickly and easily create real-time dashboards to get immediate answers about end-user experiences, clickstreams, mobile activities, and server transactions.'
21
+ 'transaction_tracer' => 'The [transaction traces](/docs/apm/traces/transaction-traces/transaction-traces) feature collects detailed information from a selection of transactions, including a summary of the calling sequence, a breakdown of time spent, and a list of SQL queries and their query plans (on mysql and postgresql). Available features depend on your New Relic subscription level.',
22
+ 'error_collector' => "The agent collects and reports all uncaught exceptions by default. These configuration options allow you to customize the error collection.\n\nFor information on ignored and expected errors, [see this page on Error Analytics in APM](/docs/agents/manage-apm-agents/agent-data/manage-errors-apm-collect-ignore-or-mark-expected/). To set expected errors via the `NewRelic::Agent.notice_error` Ruby method, [consult the Ruby Agent API](/docs/agents/ruby-agent/api-guides/sending-handled-errors-new-relic/).",
23
+ 'browser_monitoring' => "The browser monitoring [page load timing](/docs/browser/new-relic-browser/page-load-timing/page-load-timing-process) feature (sometimes referred to as real user monitoring or RUM) gives you insight into the performance real users are experiencing with your website. This is accomplished by measuring the time it takes for your users' browsers to download and render your web pages by injecting a small amount of JavaScript code into the header and footer of each page.",
24
+ 'analytics_events' => '[New Relic dashboards](/docs/query-your-data/explore-query-data/dashboards/introduction-new-relic-one-dashboards) is a resource to gather and visualize data about your software and what it says about your business. With it you can quickly and easily create real-time dashboards to get immediate answers about end-user experiences, clickstreams, mobile activities, and server transactions.'
25
25
  }
26
26
 
27
27
  NAME_OVERRIDES = {
28
- "slow_sql" => "Slow SQL",
29
- "custom_insights_events" => "Custom Events"
28
+ 'slow_sql' => 'Slow SQL',
29
+ 'custom_insights_events' => 'Custom Events'
30
30
  }
31
31
 
32
- desc "Describe available New Relic configuration settings"
32
+ desc 'Describe available New Relic configuration settings'
33
33
  task :docs, [:format] => [] do |t, args|
34
- require File.expand_path(File.join(File.dirname(__FILE__), "..", "new_relic", "agent", "configuration", "default_source.rb"))
35
- format = args[:format] || "text"
34
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'new_relic', 'agent', 'configuration', 'default_source.rb'))
35
+ format = args[:format] || 'text'
36
36
  output(format)
37
37
  end
38
38
  end