newrelic_rpm 3.1.2 → 3.2.0.beta1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of newrelic_rpm might be problematic. Click here for more details.

Files changed (69) hide show
  1. data/CHANGELOG +9 -0
  2. data/lib/new_relic/agent.rb +12 -3
  3. data/lib/new_relic/agent/agent.rb +99 -97
  4. data/lib/new_relic/agent/database.rb +203 -0
  5. data/lib/new_relic/agent/instrumentation/active_merchant.rb +2 -0
  6. data/lib/new_relic/agent/instrumentation/acts_as_solr.rb +2 -0
  7. data/lib/new_relic/agent/instrumentation/authlogic.rb +2 -0
  8. data/lib/new_relic/agent/instrumentation/data_mapper.rb +2 -0
  9. data/lib/new_relic/agent/instrumentation/delayed_job_instrumentation.rb +2 -0
  10. data/lib/new_relic/agent/instrumentation/memcache.rb +23 -13
  11. data/lib/new_relic/agent/instrumentation/merb/controller.rb +2 -1
  12. data/lib/new_relic/agent/instrumentation/merb/errors.rb +2 -0
  13. data/lib/new_relic/agent/instrumentation/metric_frame.rb +7 -1
  14. data/lib/new_relic/agent/instrumentation/metric_frame/pop.rb +1 -0
  15. data/lib/new_relic/agent/instrumentation/net.rb +2 -0
  16. data/lib/new_relic/agent/instrumentation/passenger_instrumentation.rb +2 -0
  17. data/lib/new_relic/agent/instrumentation/rails/action_controller.rb +63 -36
  18. data/lib/new_relic/agent/instrumentation/rails/action_web_service.rb +2 -0
  19. data/lib/new_relic/agent/instrumentation/rails/active_record_instrumentation.rb +5 -2
  20. data/lib/new_relic/agent/instrumentation/rails/errors.rb +4 -2
  21. data/lib/new_relic/agent/instrumentation/rails3/action_controller.rb +56 -2
  22. data/lib/new_relic/agent/instrumentation/rails3/active_record_instrumentation.rb +5 -2
  23. data/lib/new_relic/agent/instrumentation/rails3/errors.rb +3 -1
  24. data/lib/new_relic/agent/instrumentation/sunspot.rb +2 -0
  25. data/lib/new_relic/agent/instrumentation/unicorn_instrumentation.rb +2 -1
  26. data/lib/new_relic/agent/shim_agent.rb +1 -0
  27. data/lib/new_relic/agent/sql_sampler.rb +230 -0
  28. data/lib/new_relic/agent/stats_engine/transactions.rb +10 -0
  29. data/lib/new_relic/agent/transaction_sampler.rb +11 -6
  30. data/lib/new_relic/collection_helper.rb +7 -4
  31. data/lib/new_relic/commands/deployments.rb +1 -1
  32. data/lib/new_relic/commands/install.rb +2 -13
  33. data/lib/new_relic/control/class_methods.rb +4 -3
  34. data/lib/new_relic/control/configuration.rb +21 -0
  35. data/lib/new_relic/control/frameworks/rails.rb +1 -1
  36. data/lib/new_relic/control/logging_methods.rb +17 -6
  37. data/lib/new_relic/delayed_job_injection.rb +1 -1
  38. data/lib/new_relic/local_environment.rb +8 -14
  39. data/lib/new_relic/rack/developer_mode.rb +1 -0
  40. data/lib/new_relic/stats.rb +1 -0
  41. data/lib/new_relic/transaction_sample.rb +5 -60
  42. data/lib/new_relic/transaction_sample/segment.rb +7 -82
  43. data/lib/new_relic/version.rb +3 -3
  44. data/newrelic_rpm.gemspec +8 -3
  45. data/test/new_relic/agent/agent/connect_test.rb +95 -0
  46. data/test/new_relic/agent/agent/start_test.rb +0 -85
  47. data/test/new_relic/agent/agent/start_worker_thread_test.rb +1 -0
  48. data/test/new_relic/agent/agent_test.rb +0 -73
  49. data/test/new_relic/agent/browser_monitoring_test.rb +1 -1
  50. data/test/new_relic/agent/database_test.rb +160 -0
  51. data/test/new_relic/agent/instrumentation/metric_frame/pop_test.rb +3 -0
  52. data/test/new_relic/agent/memcache_instrumentation_test.rb +14 -15
  53. data/test/new_relic/agent/sql_sampler_test.rb +135 -0
  54. data/test/new_relic/agent/transaction_sampler_test.rb +12 -3
  55. data/test/new_relic/collection_helper_test.rb +4 -4
  56. data/test/new_relic/control/configuration_test.rb +31 -0
  57. data/test/new_relic/control/logging_methods_test.rb +20 -4
  58. data/test/new_relic/delayed_job_injection_test.rb +1 -1
  59. data/test/new_relic/rack/developer_mode_helper_test.rb +141 -0
  60. data/test/new_relic/stats_test.rb +3 -3
  61. data/test/new_relic/transaction_sample/segment_test.rb +4 -92
  62. data/test/new_relic/transaction_sample_test.rb +1 -1
  63. data/test/test_helper.rb +1 -1
  64. data/ui/helpers/developer_mode_helper.rb +14 -8
  65. data/ui/helpers/google_pie_chart.rb +0 -1
  66. data/vendor/gems/dependency_detection-0.0.1.build/lib/dependency_detection.rb +5 -0
  67. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/mem_cache.rb +11 -11
  68. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/view.rb +4 -0
  69. metadata +15 -10
@@ -343,87 +343,12 @@ class NewRelic::TransactionSample::SegmentTest < Test::Unit::TestCase
343
343
  assert_equal(s, s.find_segment(id_to_find))
344
344
  end
345
345
 
346
- def test_explain_sql_no_sql
347
- s = NewRelic::TransactionSample::Segment.new(Time.now, 'Custom/test/metric', nil)
348
- s.params = {:sql => nil}
349
- assert_equal(nil, s.explain_sql)
350
- end
351
-
352
- def test_explain_sql_no_connection_config
353
- s = NewRelic::TransactionSample::Segment.new(Time.now, 'Custom/test/metric', nil)
354
- s.params = {:sql => 'foo', :connection_config => nil}
355
- assert_equal(nil, s.explain_sql)
356
- end
357
-
358
- def test_explain_sql_non_select
359
- s = NewRelic::TransactionSample::Segment.new(Time.now, 'Custom/test/metric', nil)
360
- s.params = {:sql => 'foo', :connection_config => mock('config')}
361
- assert_equal([], s.explain_sql)
362
- end
363
-
364
- def test_explain_sql_one_select_no_connection
365
- # NB this test raises an error in the log, much as it might if a
366
- # user supplied a config that was not valid. This is generally
367
- # expected behavior - the get_connection method shouldn't allow
368
- # errors to percolate up.
369
- config = mock('config')
370
- config.stubs(:[]).returns(nil)
371
- s = NewRelic::TransactionSample::Segment.new(Time.now, 'Custom/test/metric', nil)
372
- s.params = {:sql => 'SELECT', :connection_config => config}
373
- assert_equal([], s.explain_sql)
374
- end
375
-
376
- def test_explain_sql_one_select_with_mysql_connection
377
- s = NewRelic::TransactionSample::Segment.new(Time.now, 'Custom/test/metric', nil)
378
- config = {:adapter => 'mysql'}
379
- config.default('val')
380
- s.params = {:sql => 'SELECT', :connection_config => config}
381
- connection = mock('connection')
382
- plan = {
383
- "select_type"=>"SIMPLE", "key_len"=>nil, "table"=>"blogs", "id"=>"1",
384
- "possible_keys"=>nil, "type"=>"ALL", "Extra"=>"", "rows"=>"2",
385
- "ref"=>nil, "key"=>nil
386
- }
387
- result = mock('explain plan')
388
- result.expects(:each_hash).yields(plan)
389
- # two rows, two columns
390
- connection.expects(:execute).with('EXPLAIN SELECT').returns(result)
391
- NewRelic::TransactionSample.expects(:get_connection).with(config).returns(connection)
392
-
393
- assert_equal(plan.keys.sort, s.explain_sql[0].sort)
394
- assert_equal(plan.values.compact.sort, s.explain_sql[1][0].compact.sort)
395
- end
396
-
397
- def test_process_resultset
398
- s = NewRelic::TransactionSample::Segment.new(Time.now, 'Custom/test/metric', nil)
399
- resultset = [["column"]]
400
- assert_equal([nil, [["column"]]], s.process_resultset(resultset))
401
- end
402
-
403
- def test_explain_sql_one_select_with_pg_connection
404
- s = NewRelic::TransactionSample::Segment.new(Time.now, 'Custom/test/metric', nil)
405
- config = {:adapter => 'postgresql'}
406
- config.default('val')
407
- s.params = {:sql => "select count(id) from blogs limit 1;", :connection_config => config}
408
- connection = mock('connection')
409
- plan = [{"QUERY PLAN"=>"Limit (cost=11.75..11.76 rows=1 width=4)"},
410
- {"QUERY PLAN"=>" -> Aggregate (cost=11.75..11.76 rows=1 width=4)"},
411
- {"QUERY PLAN"=>" -> Seq Scan on blogs (cost=0.00..11.40 rows=140 width=4)"}]
412
- connection.expects(:execute).returns(plan)
413
- NewRelic::TransactionSample.expects(:get_connection).with(config).returns(connection)
414
- assert_equal([['QUERY PLAN'],
415
- [["Limit (cost=11.75..11.76 rows=1 width=4)"],
416
- [" -> Aggregate (cost=11.75..11.76 rows=1 width=4)"],
417
- [" -> Seq Scan on blogs (cost=0.00..11.40 rows=140 width=4)"]]],
418
- s.explain_sql)
419
- end
420
-
421
346
  def test_explain_sql_raising_an_error
422
347
  s = NewRelic::TransactionSample::Segment.new(Time.now, 'Custom/test/metric', nil)
423
348
  config = mock('config')
424
349
  s.params = {:sql => 'SELECT', :connection_config => config}
425
350
  connection = mock('connection')
426
- NewRelic::TransactionSample.expects(:get_connection).with(config).raises(RuntimeError.new("whee"))
351
+ NewRelic::Agent::Database.expects(:get_connection).with(config).raises(RuntimeError.new("whee"))
427
352
  assert_nothing_raised do
428
353
  s.explain_sql
429
354
  end
@@ -438,25 +363,12 @@ class NewRelic::TransactionSample::SegmentTest < Test::Unit::TestCase
438
363
  s.params = params
439
364
  assert_equal(params, s.instance_eval { @params })
440
365
  end
441
-
442
- def test_handle_exception_in_explain
443
- s = NewRelic::TransactionSample::Segment.new(Time.now, 'Custom/test/metric', nil)
444
- fake_error = Exception.new
445
- fake_error.expects(:message).returns('a message')
446
- NewRelic::Control.instance.log.expects(:error).with('Error getting query plan: a message')
447
- # backtrace can be basically any string, just should get logged
448
- NewRelic::Control.instance.log.expects(:debug).with(instance_of(String))
449
- s.handle_exception_in_explain do
450
- raise(fake_error)
451
- end
452
- end
453
-
366
+
454
367
  def test_obfuscated_sql
455
- sql = 'some sql'
368
+ sql = 'select * from table where id = 1'
456
369
  s = NewRelic::TransactionSample::Segment.new(Time.now, 'Custom/test/metric', nil)
457
370
  s[:sql] = sql
458
- NewRelic::TransactionSample.expects(:obfuscate_sql).with(sql)
459
- s.obfuscated_sql
371
+ assert_equal('select * from table where id = ?', s.obfuscated_sql)
460
372
  end
461
373
 
462
374
  def test_called_segments_equals
@@ -8,7 +8,7 @@ class NewRelic::TransactionSampleTest < Test::Unit::TestCase
8
8
  @connection_stub = Mocha::Mockery.instance.named_mock('connection')
9
9
  @connection_stub.stubs(:execute).returns([['QUERY RESULT']])
10
10
 
11
- NewRelic::TransactionSample.stubs(:get_connection).returns @connection_stub
11
+ NewRelic::Agent::Database.stubs(:get_connection).returns @connection_stub
12
12
  @t = make_sql_transaction(::SQL_STATEMENT, ::SQL_STATEMENT)
13
13
  end
14
14
 
data/test/test_helper.rb CHANGED
@@ -46,7 +46,7 @@ require 'mocha/integration/test_unit/assertion_counter'
46
46
  class Test::Unit::TestCase
47
47
  include Mocha::API
48
48
 
49
- # FIXME delete this trick when we stop supporting rails2.0.x
49
+ # we can delete this trick when we stop supporting rails2.0.x
50
50
  if ENV['BRANCH'] != 'rails20'
51
51
  # a hack because rails2.0.2 does not like double teardowns
52
52
  def teardown
@@ -27,8 +27,8 @@ module NewRelic::DeveloperModeHelper
27
27
  def application_caller(trace)
28
28
  trace = strip_nr_from_backtrace(trace) unless params[:show_nr]
29
29
  trace.each do |trace_line|
30
- file = file_and_line(trace_line).first
31
- unless exclude_file_from_stack_trace?(file, false)
30
+ file, line, gem = file_and_line(trace_line)
31
+ unless file && exclude_file_from_stack_trace?(file, false, gem)
32
32
  return trace_line
33
33
  end
34
34
  end
@@ -38,8 +38,8 @@ module NewRelic::DeveloperModeHelper
38
38
  def application_stack_trace(trace, include_rails = false)
39
39
  trace = strip_nr_from_backtrace(trace) unless params[:show_nr]
40
40
  trace.reject do |trace_line|
41
- file = file_and_line(trace_line).first
42
- exclude_file_from_stack_trace?(file, include_rails)
41
+ file, line, gem = file_and_line(trace_line)
42
+ file && exclude_file_from_stack_trace?(file, include_rails, gem)
43
43
  end
44
44
  end
45
45
 
@@ -60,7 +60,7 @@ module NewRelic::DeveloperModeHelper
60
60
 
61
61
  def url_for_source(trace_line)
62
62
  file, line = file_and_line(trace_line)
63
-
63
+ return "#" if file.nil?
64
64
  begin
65
65
  file = Pathname.new(file).realpath
66
66
  rescue Errno::ENOENT
@@ -70,7 +70,6 @@ module NewRelic::DeveloperModeHelper
70
70
  rescue
71
71
  # catch all other exceptions. We're going to create an invalid link below, but that's okay.
72
72
  end
73
-
74
73
  if using_textmate?
75
74
  "txmt://open?url=file://#{file}&line=#{line}"
76
75
  else
@@ -230,8 +229,14 @@ module NewRelic::DeveloperModeHelper
230
229
  end
231
230
 
232
231
  private
232
+ # return three objects, the file path, the line in the file, and the gem the file belongs to
233
+ # if found
233
234
  def file_and_line(stack_trace_line)
234
- stack_trace_line.match(/(.*):(\d+)/)[1..2]
235
+ if stack_trace_line =~ /^(?:(\w+) \([\d.]*\) )?(.*):(\d+)/
236
+ return $2, $3, $1
237
+ else
238
+ return nil
239
+ end
235
240
  end
236
241
 
237
242
  def using_textmate?
@@ -262,9 +267,10 @@ module NewRelic::DeveloperModeHelper
262
267
  html
263
268
  end
264
269
 
265
- def exclude_file_from_stack_trace?(file, include_rails)
270
+ def exclude_file_from_stack_trace?(file, include_rails, gem=nil)
266
271
  return false if include_rails
267
272
  return true if file !~ /\.(rb|java)/
273
+ return true if %w[rack activerecord activeresource activesupport actionpack railties].include? gem
268
274
  %w[/actionmailer/
269
275
  /activerecord
270
276
  /activeresource
@@ -1,6 +1,5 @@
1
1
 
2
2
  # A wrapper around the google charts service.
3
- # TODO consider making generic and open sourcing
4
3
  class GooglePieChart
5
4
  attr_accessor :width, :height, :color
6
5
 
@@ -17,8 +17,13 @@ module DependencyDetection
17
17
  end
18
18
  end
19
19
 
20
+ def dependency_by_name(name)
21
+ @@items.find {|i| i.name == name }
22
+ end
23
+
20
24
  class Dependent
21
25
  attr_reader :executed
26
+ attr_reader :name
22
27
  def executed!
23
28
  @executed = true
24
29
  end
@@ -4,13 +4,13 @@ module NewRelic
4
4
  class MemCache < NewRelic::MetricParser::MetricParser
5
5
  def is_memcache?; true; end
6
6
 
7
- # for MemCache metrics, the short name is actually
7
+ # for Memcache metrics, the short name is actually
8
8
  # the full name
9
9
  def short_name
10
- name
10
+ 'Memcache'
11
11
  end
12
12
  def developer_name
13
- "MemCache #{segments[1..-1].join '/'}"
13
+ "Memcache #{segments[1..-1].join '/'}"
14
14
  end
15
15
 
16
16
  def all?
@@ -22,19 +22,19 @@ module NewRelic
22
22
  def legend_name
23
23
  case segments[1]
24
24
  when 'allWeb'
25
- "MemCache"
25
+ "Memcache"
26
26
  when 'allOther'
27
- "Non-web MemCache"
27
+ "Non-web Memcache"
28
28
  else
29
- "MemCache #{operation} operations"
29
+ "Memcache #{operation} operations"
30
30
  end
31
31
  end
32
32
  def tooltip_name
33
33
  case segments[1]
34
34
  when 'allWeb'
35
- "MemCache calls from web transactions"
35
+ "Memcache calls from web transactions"
36
36
  when 'allOther'
37
- "MemCache calls from non-web transactions"
37
+ "Memcache calls from non-web transactions"
38
38
  else
39
39
  "MemCache #{operation} operations"
40
40
  end
@@ -43,11 +43,11 @@ module NewRelic
43
43
  def developer_name
44
44
  case segments[1]
45
45
  when 'allWeb'
46
- "Web MemCache"
46
+ "Web Memcache"
47
47
  when 'allOther'
48
- "Non-web MemCache"
48
+ "Non-web Memcache"
49
49
  else
50
- "MemCache #{operation}"
50
+ "Memcache #{operation}"
51
51
  end
52
52
  end
53
53
  end
@@ -16,6 +16,8 @@ module NewRelic
16
16
  "#{file_name(segments[-2])} Template"
17
17
  when "Partial"
18
18
  "#{file_name(segments[-2])} Partial"
19
+ when "Collection"
20
+ "#{file_name(segments[-2])} Collection"
19
21
  when ".rhtml Processing"
20
22
  "ERB compilation"
21
23
  else
@@ -28,6 +30,8 @@ module NewRelic
28
30
  "#{file_name(segments[1..-2].join(NewRelic::MetricParser::MetricParser::SEPARATOR))} Template"
29
31
  when "Partial"
30
32
  "#{file_name(segments[1..-2].join(NewRelic::MetricParser::MetricParser::SEPARATOR))} Partial"
33
+ when "Collection"
34
+ "#{file_name(segments[1..-2].join(NewRelic::MetricParser::MetricParser::SEPARATOR))} Collection"
31
35
  when ".rhtml Processing"
32
36
  "ERB compilation"
33
37
  else
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: newrelic_rpm
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.2
5
- prerelease:
4
+ version: 3.2.0.beta1
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Bill Kayser
@@ -12,12 +12,12 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2011-09-07 00:00:00.000000000 -07:00
15
+ date: 2011-09-23 00:00:00.000000000 -07:00
16
16
  default_executable:
17
17
  dependencies:
18
18
  - !ruby/object:Gem::Dependency
19
19
  name: jeweler
20
- requirement: &2156970120 !ruby/object:Gem::Requirement
20
+ requirement: &2173242300 !ruby/object:Gem::Requirement
21
21
  none: false
22
22
  requirements:
23
23
  - - ! '>='
@@ -25,10 +25,10 @@ dependencies:
25
25
  version: '0'
26
26
  type: :development
27
27
  prerelease: false
28
- version_requirements: *2156970120
28
+ version_requirements: *2173242300
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: mocha
31
- requirement: &2156969640 !ruby/object:Gem::Requirement
31
+ requirement: &2173241580 !ruby/object:Gem::Requirement
32
32
  none: false
33
33
  requirements:
34
34
  - - ! '>='
@@ -36,10 +36,10 @@ dependencies:
36
36
  version: '0'
37
37
  type: :development
38
38
  prerelease: false
39
- version_requirements: *2156969640
39
+ version_requirements: *2173241580
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: shoulda
42
- requirement: &2156969160 !ruby/object:Gem::Requirement
42
+ requirement: &2173239980 !ruby/object:Gem::Requirement
43
43
  none: false
44
44
  requirements:
45
45
  - - ! '>='
@@ -47,7 +47,7 @@ dependencies:
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
- version_requirements: *2156969160
50
+ version_requirements: *2173239980
51
51
  description: ! 'New Relic is a performance management system, developed by New Relic,
52
52
 
53
53
  Inc (http://www.newrelic.com). New Relic provides you with deep
@@ -91,6 +91,7 @@ files:
91
91
  - lib/new_relic/agent/browser_monitoring.rb
92
92
  - lib/new_relic/agent/busy_calculator.rb
93
93
  - lib/new_relic/agent/chained_call.rb
94
+ - lib/new_relic/agent/database.rb
94
95
  - lib/new_relic/agent/error_collector.rb
95
96
  - lib/new_relic/agent/instrumentation.rb
96
97
  - lib/new_relic/agent/instrumentation/active_merchant.rb
@@ -125,6 +126,7 @@ files:
125
126
  - lib/new_relic/agent/samplers/memory_sampler.rb
126
127
  - lib/new_relic/agent/samplers/object_sampler.rb
127
128
  - lib/new_relic/agent/shim_agent.rb
129
+ - lib/new_relic/agent/sql_sampler.rb
128
130
  - lib/new_relic/agent/stats_engine.rb
129
131
  - lib/new_relic/agent/stats_engine/metric_stats.rb
130
132
  - lib/new_relic/agent/stats_engine/samplers.rb
@@ -194,6 +196,7 @@ files:
194
196
  - test/new_relic/agent/beacon_configuration_test.rb
195
197
  - test/new_relic/agent/browser_monitoring_test.rb
196
198
  - test/new_relic/agent/busy_calculator_test.rb
199
+ - test/new_relic/agent/database_test.rb
197
200
  - test/new_relic/agent/error_collector/notice_error_test.rb
198
201
  - test/new_relic/agent/error_collector_test.rb
199
202
  - test/new_relic/agent/instrumentation/active_record_instrumentation_test.rb
@@ -213,6 +216,7 @@ files:
213
216
  - test/new_relic/agent/rpm_agent_test.rb
214
217
  - test/new_relic/agent/sampler_test.rb
215
218
  - test/new_relic/agent/shim_agent_test.rb
219
+ - test/new_relic/agent/sql_sampler_test.rb
216
220
  - test/new_relic/agent/stats_engine/metric_stats/harvest_test.rb
217
221
  - test/new_relic/agent/stats_engine/metric_stats_test.rb
218
222
  - test/new_relic/agent/stats_engine/samplers_test.rb
@@ -234,6 +238,7 @@ files:
234
238
  - test/new_relic/metric_spec_test.rb
235
239
  - test/new_relic/rack/all_test.rb
236
240
  - test/new_relic/rack/browser_monitoring_test.rb
241
+ - test/new_relic/rack/developer_mode_helper_test.rb
237
242
  - test/new_relic/rack/developer_mode_test.rb
238
243
  - test/new_relic/stats_test.rb
239
244
  - test/new_relic/transaction_analysis/segment_summary_test.rb
@@ -334,7 +339,7 @@ post_install_message: ! "\nPLEASE NOTE:\n\nDeveloper Mode is now a Rack middlewa
334
339
  to\nyour middleware stack.\n\nIf you are using JRuby, we recommend using at least
335
340
  version 1.4 or \nlater because of issues with the implementation of the timeout
336
341
  library.\n\nRefer to the README.md file for more information.\n\nPlease see http://github.com/newrelic/rpm/blob/master/CHANGELOG\nfor
337
- a complete description of the features and enhancements available\nin version 3.1
342
+ a complete description of the features and enhancements available\nin version 3.2
338
343
  of the Ruby Agent.\n \n"
339
344
  rdoc_options:
340
345
  - --line-numbers