newrelic_rpm 8.16.0 → 9.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (243) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +3 -41
  4. data/.rubocop_todo.yml +13 -14
  5. data/.simplecov +1 -1
  6. data/CHANGELOG.md +184 -0
  7. data/CONTRIBUTING.md +1 -1
  8. data/Gemfile +1 -1
  9. data/Guardfile +7 -7
  10. data/README.md +3 -2
  11. data/Rakefile +8 -8
  12. data/Thorfile +1 -1
  13. data/bin/nrdebug +36 -36
  14. data/init.rb +1 -1
  15. data/lib/new_relic/agent/agent.rb +3 -16
  16. data/lib/new_relic/agent/agent_helpers/connect.rb +5 -10
  17. data/lib/new_relic/agent/agent_helpers/harvest.rb +4 -4
  18. data/lib/new_relic/agent/agent_helpers/shutdown.rb +5 -5
  19. data/lib/new_relic/agent/agent_helpers/special_startup.rb +3 -4
  20. data/lib/new_relic/agent/agent_helpers/start_worker_thread.rb +47 -39
  21. data/lib/new_relic/agent/agent_helpers/startup.rb +13 -13
  22. data/lib/new_relic/agent/agent_helpers/transmit.rb +6 -6
  23. data/lib/new_relic/agent/agent_logger.rb +9 -9
  24. data/lib/new_relic/agent/attribute_filter.rb +2 -4
  25. data/lib/new_relic/agent/attribute_processing.rb +2 -2
  26. data/lib/new_relic/agent/audit_logger.rb +5 -5
  27. data/lib/new_relic/agent/autostart.rb +1 -1
  28. data/lib/new_relic/agent/commands/agent_command.rb +2 -2
  29. data/lib/new_relic/agent/commands/agent_command_router.rb +5 -4
  30. data/lib/new_relic/agent/commands/thread_profiler_session.rb +8 -8
  31. data/lib/new_relic/agent/configuration/default_source.rb +155 -530
  32. data/lib/new_relic/agent/configuration/environment_source.rb +2 -2
  33. data/lib/new_relic/agent/configuration/high_security_source.rb +3 -5
  34. data/lib/new_relic/agent/configuration/manager.rb +2 -2
  35. data/lib/new_relic/agent/configuration/security_policy_source.rb +10 -26
  36. data/lib/new_relic/agent/configuration/server_source.rb +24 -24
  37. data/lib/new_relic/agent/configuration/yaml_source.rb +4 -4
  38. data/lib/new_relic/agent/connect/request_builder.rb +1 -1
  39. data/lib/new_relic/agent/connect/response_handler.rb +1 -1
  40. data/lib/new_relic/agent/custom_event_aggregator.rb +4 -4
  41. data/lib/new_relic/agent/database/explain_plan_helpers.rb +1 -1
  42. data/lib/new_relic/agent/database/obfuscation_helpers.rb +2 -2
  43. data/lib/new_relic/agent/database/obfuscator.rb +2 -2
  44. data/lib/new_relic/agent/database.rb +4 -18
  45. data/lib/new_relic/agent/datastores/metric_helper.rb +5 -5
  46. data/lib/new_relic/agent/datastores/mongo/metric_translator.rb +11 -11
  47. data/lib/new_relic/agent/datastores/redis.rb +6 -6
  48. data/lib/new_relic/agent/distributed_tracing/cross_app_tracing.rb +8 -10
  49. data/lib/new_relic/agent/distributed_tracing/distributed_trace_attributes.rb +10 -10
  50. data/lib/new_relic/agent/distributed_tracing/distributed_trace_metrics.rb +7 -7
  51. data/lib/new_relic/agent/distributed_tracing/distributed_trace_payload.rb +1 -1
  52. data/lib/new_relic/agent/distributed_tracing/distributed_trace_transport_type.rb +6 -6
  53. data/lib/new_relic/agent/distributed_tracing/trace_context.rb +7 -7
  54. data/lib/new_relic/agent/distributed_tracing/trace_context_payload.rb +4 -4
  55. data/lib/new_relic/agent/distributed_tracing.rb +5 -5
  56. data/lib/new_relic/agent/error_collector.rb +36 -8
  57. data/lib/new_relic/agent/error_filter.rb +5 -5
  58. data/lib/new_relic/agent/error_trace_aggregator.rb +5 -4
  59. data/lib/new_relic/agent/event_loop.rb +3 -3
  60. data/lib/new_relic/agent/external.rb +1 -1
  61. data/lib/new_relic/agent/harvester.rb +1 -3
  62. data/lib/new_relic/agent/heap.rb +2 -1
  63. data/lib/new_relic/agent/hostname.rb +1 -1
  64. data/lib/new_relic/agent/http_clients/abstract.rb +9 -21
  65. data/lib/new_relic/agent/http_clients/curb_wrappers.rb +7 -3
  66. data/lib/new_relic/agent/http_clients/excon_wrappers.rb +7 -5
  67. data/lib/new_relic/agent/http_clients/http_rb_wrappers.rb +4 -0
  68. data/lib/new_relic/agent/http_clients/httpclient_wrappers.rb +6 -2
  69. data/lib/new_relic/agent/http_clients/net_http_wrappers.rb +5 -1
  70. data/lib/new_relic/agent/http_clients/typhoeus_wrappers.rb +8 -5
  71. data/lib/new_relic/agent/http_clients/uri_util.rb +2 -2
  72. data/lib/new_relic/agent/instrumentation/action_controller_other_subscriber.rb +5 -2
  73. data/lib/new_relic/agent/instrumentation/action_controller_subscriber.rb +3 -2
  74. data/lib/new_relic/agent/instrumentation/action_view_subscriber.rb +3 -3
  75. data/lib/new_relic/agent/instrumentation/active_job.rb +2 -2
  76. data/lib/new_relic/agent/instrumentation/active_record.rb +3 -2
  77. data/lib/new_relic/agent/instrumentation/active_record_helper.rb +38 -35
  78. data/lib/new_relic/agent/instrumentation/active_record_notifications.rb +3 -3
  79. data/lib/new_relic/agent/instrumentation/active_record_prepend.rb +2 -2
  80. data/lib/new_relic/agent/instrumentation/active_record_subscriber.rb +3 -2
  81. data/lib/new_relic/agent/instrumentation/bunny/instrumentation.rb +3 -3
  82. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +6 -4
  83. data/lib/new_relic/agent/instrumentation/curb/chain.rb +1 -1
  84. data/lib/new_relic/agent/instrumentation/curb/instrumentation.rb +5 -5
  85. data/lib/new_relic/agent/instrumentation/curb.rb +1 -1
  86. data/lib/new_relic/agent/instrumentation/custom_events_subscriber.rb +2 -1
  87. data/lib/new_relic/agent/instrumentation/delayed_job/instrumentation.rb +1 -1
  88. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +2 -1
  89. data/lib/new_relic/agent/instrumentation/elasticsearch/chain.rb +1 -1
  90. data/lib/new_relic/agent/instrumentation/elasticsearch/instrumentation.rb +3 -3
  91. data/lib/new_relic/agent/instrumentation/elasticsearch.rb +1 -1
  92. data/lib/new_relic/agent/instrumentation/excon/middleware.rb +2 -1
  93. data/lib/new_relic/agent/instrumentation/excon.rb +3 -3
  94. data/lib/new_relic/agent/instrumentation/fiber/chain.rb +20 -0
  95. data/lib/new_relic/agent/instrumentation/fiber/instrumentation.rb +24 -0
  96. data/lib/new_relic/agent/instrumentation/fiber/prepend.rb +18 -0
  97. data/lib/new_relic/agent/instrumentation/fiber.rb +25 -0
  98. data/lib/new_relic/agent/instrumentation/grape/instrumentation.rb +4 -4
  99. data/lib/new_relic/agent/instrumentation/grape.rb +4 -4
  100. data/lib/new_relic/agent/instrumentation/grpc/client/instrumentation.rb +2 -1
  101. data/lib/new_relic/agent/instrumentation/grpc/server/instrumentation.rb +3 -3
  102. data/lib/new_relic/agent/instrumentation/httprb.rb +1 -1
  103. data/lib/new_relic/agent/instrumentation/ignore_actions.rb +1 -1
  104. data/lib/new_relic/agent/instrumentation/logger.rb +1 -1
  105. data/lib/new_relic/agent/instrumentation/memcache/instrumentation.rb +2 -2
  106. data/lib/new_relic/agent/instrumentation/memcache.rb +8 -8
  107. data/lib/new_relic/agent/instrumentation/middleware_proxy.rb +3 -3
  108. data/lib/new_relic/agent/instrumentation/middleware_tracing.rb +1 -1
  109. data/lib/new_relic/agent/instrumentation/mongodb_command_subscriber.rb +5 -5
  110. data/lib/new_relic/agent/instrumentation/net_http.rb +2 -2
  111. data/lib/new_relic/agent/instrumentation/notifications_subscriber.rb +1 -1
  112. data/lib/new_relic/agent/instrumentation/padrino/instrumentation.rb +3 -3
  113. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +2 -2
  114. data/lib/new_relic/agent/instrumentation/rack/instrumentation.rb +1 -1
  115. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +3 -2
  116. data/lib/new_relic/agent/instrumentation/rails_middleware.rb +1 -1
  117. data/lib/new_relic/agent/instrumentation/rake/instrumentation.rb +8 -15
  118. data/lib/new_relic/agent/instrumentation/rake.rb +3 -3
  119. data/lib/new_relic/agent/instrumentation/redis/constants.rb +1 -1
  120. data/lib/new_relic/agent/instrumentation/redis/instrumentation.rb +2 -1
  121. data/lib/new_relic/agent/instrumentation/redis.rb +1 -1
  122. data/lib/new_relic/agent/instrumentation/resque/helper.rb +1 -1
  123. data/lib/new_relic/agent/instrumentation/resque.rb +1 -1
  124. data/lib/new_relic/agent/instrumentation/sequel.rb +8 -9
  125. data/lib/new_relic/agent/instrumentation/sequel_helper.rb +10 -10
  126. data/lib/new_relic/agent/instrumentation/sidekiq/extensions/delayed_class.rb +1 -1
  127. data/lib/new_relic/agent/instrumentation/sidekiq/server.rb +1 -1
  128. data/lib/new_relic/agent/instrumentation/sinatra/ignorer.rb +1 -1
  129. data/lib/new_relic/agent/instrumentation/sinatra/instrumentation.rb +6 -5
  130. data/lib/new_relic/agent/instrumentation/sinatra/transaction_namer.rb +1 -1
  131. data/lib/new_relic/agent/instrumentation/thread/instrumentation.rb +3 -7
  132. data/lib/new_relic/agent/instrumentation/tilt/instrumentation.rb +2 -1
  133. data/lib/new_relic/agent/instrumentation/typhoeus/instrumentation.rb +5 -5
  134. data/lib/new_relic/agent/javascript_instrumentor.rb +29 -24
  135. data/lib/new_relic/agent/linking_metadata.rb +2 -2
  136. data/lib/new_relic/agent/log_event_aggregator.rb +15 -15
  137. data/lib/new_relic/agent/logging.rb +73 -33
  138. data/lib/new_relic/agent/messaging.rb +7 -5
  139. data/lib/new_relic/agent/method_tracer.rb +6 -6
  140. data/lib/new_relic/agent/method_tracer_helpers.rb +1 -1
  141. data/lib/new_relic/agent/monitors/cross_app_monitor.rb +4 -5
  142. data/lib/new_relic/agent/monitors/distributed_tracing_monitor.rb +1 -1
  143. data/lib/new_relic/agent/new_relic_service/encoders.rb +1 -1
  144. data/lib/new_relic/agent/new_relic_service/json_marshaller.rb +2 -2
  145. data/lib/new_relic/agent/new_relic_service/security_policy_settings.rb +0 -1
  146. data/lib/new_relic/agent/new_relic_service.rb +15 -15
  147. data/lib/new_relic/agent/obfuscator.rb +1 -1
  148. data/lib/new_relic/agent/parameter_filtering.rb +6 -6
  149. data/lib/new_relic/agent/pipe_channel_manager.rb +7 -6
  150. data/lib/new_relic/agent/pipe_service.rb +5 -3
  151. data/lib/new_relic/agent/priority_sampled_buffer.rb +1 -1
  152. data/lib/new_relic/agent/rules_engine/segment_terms_rule.rb +0 -1
  153. data/lib/new_relic/agent/sampler.rb +1 -1
  154. data/lib/new_relic/agent/sampler_collection.rb +1 -1
  155. data/lib/new_relic/agent/samplers/cpu_sampler.rb +5 -5
  156. data/lib/new_relic/agent/samplers/delayed_job_sampler.rb +9 -9
  157. data/lib/new_relic/agent/samplers/memory_sampler.rb +9 -9
  158. data/lib/new_relic/agent/samplers/object_sampler.rb +1 -1
  159. data/lib/new_relic/agent/span_event_aggregator.rb +4 -4
  160. data/lib/new_relic/agent/span_event_primitive.rb +2 -2
  161. data/lib/new_relic/agent/sql_sampler.rb +2 -2
  162. data/lib/new_relic/agent/stats.rb +1 -1
  163. data/lib/new_relic/agent/synthetics_event_aggregator.rb +1 -1
  164. data/lib/new_relic/agent/system_info.rb +10 -10
  165. data/lib/new_relic/agent/threading/agent_thread.rb +1 -1
  166. data/lib/new_relic/agent/threading/backtrace_node.rb +3 -3
  167. data/lib/new_relic/agent/threading/backtrace_service.rb +3 -7
  168. data/lib/new_relic/agent/threading/thread_profile.rb +5 -5
  169. data/lib/new_relic/agent/timestamp_sampled_buffer.rb +1 -1
  170. data/lib/new_relic/agent/tracer.rb +18 -8
  171. data/lib/new_relic/agent/transaction/abstract_segment.rb +9 -9
  172. data/lib/new_relic/agent/transaction/datastore_segment.rb +1 -1
  173. data/lib/new_relic/agent/transaction/distributed_tracer.rb +7 -6
  174. data/lib/new_relic/agent/transaction/distributed_tracing.rb +6 -6
  175. data/lib/new_relic/agent/transaction/external_request_segment.rb +11 -11
  176. data/lib/new_relic/agent/transaction/message_broker_segment.rb +1 -1
  177. data/lib/new_relic/agent/transaction/request_attributes.rb +2 -2
  178. data/lib/new_relic/agent/transaction/segment.rb +1 -1
  179. data/lib/new_relic/agent/transaction/synthetics_sample_buffer.rb +1 -1
  180. data/lib/new_relic/agent/transaction/trace.rb +1 -1
  181. data/lib/new_relic/agent/transaction/trace_context.rb +4 -4
  182. data/lib/new_relic/agent/transaction/trace_node.rb +8 -7
  183. data/lib/new_relic/agent/transaction/tracing.rb +4 -4
  184. data/lib/new_relic/agent/transaction/transaction_sample_buffer.rb +1 -1
  185. data/lib/new_relic/agent/transaction.rb +56 -52
  186. data/lib/new_relic/agent/transaction_error_primitive.rb +5 -5
  187. data/lib/new_relic/agent/transaction_event_aggregator.rb +4 -4
  188. data/lib/new_relic/agent/transaction_event_primitive.rb +3 -3
  189. data/lib/new_relic/agent/transaction_sampler.rb +3 -3
  190. data/lib/new_relic/agent/transaction_time_aggregator.rb +7 -3
  191. data/lib/new_relic/agent/utilization/aws.rb +1 -1
  192. data/lib/new_relic/agent/utilization/azure.rb +3 -3
  193. data/lib/new_relic/agent/utilization/gcp.rb +3 -3
  194. data/lib/new_relic/agent/utilization/pcf.rb +1 -1
  195. data/lib/new_relic/agent/utilization/vendor.rb +1 -1
  196. data/lib/new_relic/agent/vm/monotonic_gc_profiler.rb +1 -1
  197. data/lib/new_relic/agent/vm/mri_vm.rb +9 -8
  198. data/lib/new_relic/agent/worker_loop.rb +1 -1
  199. data/lib/new_relic/agent.rb +79 -35
  200. data/lib/new_relic/cli/command.rb +3 -3
  201. data/lib/new_relic/cli/commands/deployments.rb +26 -25
  202. data/lib/new_relic/cli/commands/install.rb +23 -23
  203. data/lib/new_relic/collection_helper.rb +2 -2
  204. data/lib/new_relic/constants.rb +7 -8
  205. data/lib/new_relic/control/class_methods.rb +3 -3
  206. data/lib/new_relic/control/frameworks/rails.rb +30 -18
  207. data/lib/new_relic/control/instance_methods.rb +6 -6
  208. data/lib/new_relic/control/instrumentation.rb +1 -1
  209. data/lib/new_relic/control/private_instance_methods.rb +1 -1
  210. data/lib/new_relic/dependency_detection.rb +4 -17
  211. data/lib/new_relic/environment_report.rb +4 -4
  212. data/lib/new_relic/helper.rb +2 -1
  213. data/lib/new_relic/language_support.rb +1 -1
  214. data/lib/new_relic/latest_changes.rb +5 -5
  215. data/lib/new_relic/local_environment.rb +0 -10
  216. data/lib/new_relic/noticed_error.rb +20 -18
  217. data/lib/new_relic/rack/browser_monitoring.rb +20 -16
  218. data/lib/new_relic/recipes/capistrano3.rb +1 -1
  219. data/lib/new_relic/recipes/capistrano_legacy.rb +6 -6
  220. data/lib/new_relic/recipes/helpers/send_deployment.rb +5 -5
  221. data/lib/new_relic/supportability_helper.rb +2 -1
  222. data/lib/new_relic/version.rb +2 -2
  223. data/lib/newrelic_rpm.rb +4 -4
  224. data/lib/sequel/extensions/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +5 -5
  225. data/lib/sequel/plugins/{newrelic_instrumentation.rb → new_relic_instrumentation.rb} +4 -4
  226. data/lib/tasks/config.rake +12 -12
  227. data/lib/tasks/coverage_report.rake +3 -3
  228. data/lib/tasks/helpers/format.rb +10 -10
  229. data/lib/tasks/helpers/removers.rb +5 -5
  230. data/lib/tasks/install.rake +4 -4
  231. data/lib/tasks/instrumentation_generator/instrumentation.thor +7 -10
  232. data/lib/tasks/instrumentation_generator/templates/Envfile.tt +1 -1
  233. data/lib/tasks/multiverse.rb +12 -6
  234. data/lib/tasks/tests.rake +6 -6
  235. data/newrelic.yml +5 -8
  236. data/newrelic_rpm.gemspec +29 -26
  237. data/test/agent_helper.rb +25 -24
  238. metadata +13 -14
  239. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +0 -83
  240. data/lib/new_relic/agent/instrumentation/authlogic.rb +0 -33
  241. data/lib/new_relic/agent/instrumentation/data_mapper.rb +0 -215
  242. data/lib/new_relic/agent/instrumentation/rainbows_instrumentation.rb +0 -36
  243. data/lib/new_relic/agent/instrumentation/sunspot.rb +0 -41
@@ -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
@@ -74,9 +74,7 @@ module NewRelic
74
74
  unicorn
75
75
  webrick
76
76
  fastcgi
77
- rainbows
78
77
  ]
79
- # TODO: MAJOR VERSION - remove rainbows
80
78
  while dispatchers.any? && @discovered_dispatcher.nil?
81
79
  send('check_for_' + (dispatchers.shift))
82
80
  end
@@ -134,14 +132,6 @@ module NewRelic
134
132
  end
135
133
  end
136
134
 
137
- # TODO: MAJOR VERSION - remove this method
138
- def check_for_rainbows
139
- if (defined?(::Rainbows) && defined?(::Rainbows::HttpServer)) && NewRelic::LanguageSupport.object_space_usable?
140
- v = find_class_in_object_space(::Rainbows::HttpServer)
141
- @discovered_dispatcher = :rainbows if v
142
- end
143
- end
144
-
145
135
  def check_for_puma
146
136
  if defined?(::Puma) && File.basename($0) == 'puma'
147
137
  @discovered_dispatcher = :puma
@@ -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}`
@@ -21,7 +21,6 @@ module NewRelic
21
21
  :browser_timing_header,
22
22
  :disable_all_tracing,
23
23
  :disable_sql_recording,
24
- :disable_transaction_tracing,
25
24
  :drop_buffered_data,
26
25
  :get_request_metadata,
27
26
  :get_response_metadata,
@@ -45,8 +44,10 @@ module NewRelic
45
44
  :record_metric,
46
45
  :recording_web_transaction?,
47
46
  :require_test_helper,
47
+ :set_error_group_callback,
48
48
  :set_sql_obfuscator,
49
49
  :set_transaction_name,
50
+ :set_user_id,
50
51
  :shutdown,
51
52
  :start_segment,
52
53
  :trace,
@@ -5,8 +5,8 @@
5
5
 
6
6
  module NewRelic
7
7
  module VERSION # :nodoc:
8
- MAJOR = 8
9
- MINOR = 16
8
+ MAJOR = 9
9
+ MINOR = 1
10
10
  TINY = 0
11
11
 
12
12
  STRING = "#{MAJOR}.#{MINOR}.#{TINY}"
data/lib/newrelic_rpm.rb CHANGED
@@ -20,17 +20,17 @@ require 'new_relic/control'
20
20
  if defined?(Rails::VERSION)
21
21
  module NewRelic
22
22
  class Railtie < Rails::Railtie
23
- if NewRelic::Agent.config[:defer_rails_initialization]
24
- initializer "newrelic_rpm.include_method_tracers", before: :load_config_initializers do |app|
23
+ if ENV['NEW_RELIC_DEFER_RAILS_INITIALIZATION']
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
@@ -17,7 +17,7 @@ module Sequel
17
17
  # instrumentation is loaded:
18
18
  #
19
19
  # db = Sequel.connect( ... )
20
- # db.extension :newrelic_instrumentation
20
+ # db.extension :new_relic_instrumentation
21
21
  #
22
22
  # Versions 3.47.0 and later use `Database.extension` to automatically
23
23
  # install the extension for new connections.
@@ -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 :newrelic_instrumentation extension.")
97
- Database.register_extension(:newrelic_instrumentation, NewRelicInstrumentation)
96
+ NewRelic::Agent.logger.debug('Registering the :new_relic_instrumentation extension.')
97
+ Database.register_extension(:new_relic_instrumentation, NewRelicInstrumentation)
98
98
  end # module Sequel
@@ -11,7 +11,7 @@ require 'new_relic/agent/datastores/metric_helper'
11
11
  module Sequel
12
12
  module Plugins
13
13
  # Sequel::Model instrumentation for the New Relic agent.
14
- module NewrelicInstrumentation
14
+ module NewRelicInstrumentation
15
15
  # Meta-programming for creating method tracers for the Sequel::Model plugin.
16
16
  module MethodWrapping
17
17
  # Install a method named +method_name+ that will trace execution
@@ -38,7 +38,7 @@ module Sequel
38
38
 
39
39
  # Methods to be added to Sequel::Model instances.
40
40
  module InstanceMethods
41
- extend Sequel::Plugins::NewrelicInstrumentation::MethodWrapping
41
+ extend Sequel::Plugins::NewRelicInstrumentation::MethodWrapping
42
42
 
43
43
  wrap_sequel_method :delete
44
44
  wrap_sequel_method :destroy
@@ -52,9 +52,9 @@ module Sequel
52
52
 
53
53
  # Methods to be added to Sequel::Model classes.
54
54
  module ClassMethods
55
- extend Sequel::Plugins::NewrelicInstrumentation::MethodWrapping
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
@@ -4,7 +4,7 @@
4
4
 
5
5
  if ENV['CI']
6
6
  namespace :coverage do
7
- desc "Collates all result sets generated by the different test runners"
7
+ desc 'Collates all result sets generated by the different test runners'
8
8
  task :report do
9
9
  require 'simplecov'
10
10
  require 'fileutils'
@@ -19,10 +19,10 @@ if ENV['CI']
19
19
  Dir['lib/coverage_{[!r][!e][!s][!u][!l][!t][!s]}*'].each { |dir| FileUtils.rm_rf(dir) }
20
20
  end
21
21
 
22
- desc "Removes all coverage_* directories"
22
+ desc 'Removes all coverage_* directories'
23
23
  task :clear do
24
24
  require 'fileutils'
25
- Dir["lib/coverage_*"].each { |dir| FileUtils.rm_rf(dir) }
25
+ Dir['lib/coverage_*'].each { |dir| FileUtils.rm_rf(dir) }
26
26
  end
27
27
  end
28
28
  end