newrelic_rpm 3.4.0.1 → 3.4.1.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.

data/CHANGELOG CHANGED
@@ -1,3 +1,18 @@
1
+
2
+ v3.4.1.beta1
3
+ * Fix edge case in RUM auto instrumentation where X-UA-Compatible meta tag is
4
+ present but </head> tag is missing.
5
+ * Fixed reference to @service.request_timeout to @request_timeout in
6
+ new_relic_service.rb. (Thanks to Matthew Savage)
7
+ * preserve visibility on traced methods. Aliased methods now have the same
8
+ visibility as the original traced method. A couple
9
+ of the esoteric methods created in the process weren't getting the visibility
10
+ set properly. fixed.
11
+ * Agent service does not connect to directed shard collector after connecting
12
+ to proxy
13
+ * corrupt marshal data from pipe children crashing agent
14
+ * should reset RubyBench GC counter between polls
15
+
1
16
  v3.4.0.1
2
17
  * Prevent the agent from resolving the collector address when disabled.
3
18
  * Fix for error collector configuration that was introduced during beta.
@@ -139,6 +139,7 @@ module NewRelic
139
139
  options_arg << %Q[:#{key} => #{valuestr}]
140
140
  end
141
141
  traced_method, punctuation = method.to_s.sub(/([?!=])$/, ''), $1
142
+ visibility = NewRelic::Helper.instance_method_visibility self, method
142
143
 
143
144
  class_eval <<-EOC
144
145
  def #{traced_method.to_s}_with_newrelic_transaction_trace#{punctuation}(*args, &block)
@@ -147,8 +148,12 @@ module NewRelic
147
148
  end
148
149
  end
149
150
  EOC
150
- alias_method "#{traced_method.to_s}_without_newrelic_transaction_trace#{punctuation}", method.to_s
151
- alias_method method.to_s, "#{traced_method.to_s}_with_newrelic_transaction_trace#{punctuation}"
151
+ without_method_name = "#{traced_method.to_s}_without_newrelic_transaction_trace#{punctuation}"
152
+ with_method_name = "#{traced_method.to_s}_with_newrelic_transaction_trace#{punctuation}"
153
+ alias_method without_method_name, method.to_s
154
+ alias_method method.to_s, with_method_name
155
+ send visibility, method
156
+ send visibility, with_method_name
152
157
  NewRelic::Control.instance.log.debug("Traced transaction: class = #{self.name}, method = #{method.to_s}, options = #{options.inspect}")
153
158
  end
154
159
  end
@@ -481,9 +481,13 @@ module NewRelic
481
481
 
482
482
  traced_method = code_to_eval(method_name, metric_name_code, options)
483
483
 
484
+ visibility = NewRelic::Helper.instance_method_visibility self, method_name
485
+
484
486
  class_eval traced_method, __FILE__, __LINE__
485
487
  alias_method _untraced_method_name(method_name, metric_name_code), method_name
486
488
  alias_method method_name, _traced_method_name(method_name, metric_name_code)
489
+ send visibility, method_name
490
+ send visibility, _traced_method_name(method_name, metric_name_code)
487
491
  NewRelic::Control.instance.log.debug("Traced method: class = #{self.name},"+
488
492
  "method = #{method_name}, "+
489
493
  "metric = '#{metric_name_code}'")
@@ -24,8 +24,9 @@ module NewRelic
24
24
  end
25
25
 
26
26
  def connect(settings={})
27
- host = get_redirect_host
28
- @collector.name = host if host
27
+ if host = get_redirect_host
28
+ @collector = NewRelic::Control.instance.server_from_host(host)
29
+ end
29
30
  response = invoke_remote(:connect, settings)
30
31
  @agent_id = response['agent_run_id']
31
32
  response
@@ -167,7 +168,7 @@ module NewRelic
167
168
  response = http.request(request)
168
169
  end
169
170
  rescue Timeout::Error
170
- log.warn "Timed out trying to post data to New Relic (timeout = #{@request_timeout} seconds)" unless @service.request_timeout < 30
171
+ log.warn "Timed out trying to post data to New Relic (timeout = #{@request_timeout} seconds)" unless @request_timeout < 30
171
172
  raise
172
173
  end
173
174
  if response.is_a? Net::HTTPServiceUnavailable
@@ -1,8 +1,15 @@
1
+ require 'base64'
2
+
1
3
  module NewRelic
2
4
  module Agent
5
+
6
+ #--
7
+ # Manages the registering and servicing of pipes used by child
8
+ # processes to report data to their parent, rather than directly
9
+ # to the collector.
3
10
  module PipeChannelManager
4
11
  extend self
5
-
12
+
6
13
  def register_report_channel(id)
7
14
  listener.register_pipe(id)
8
15
  end
@@ -121,7 +128,7 @@ module NewRelic
121
128
  payload = unmarshal(got)
122
129
  if payload == 'EOF'
123
130
  pipe.close
124
- else
131
+ elsif payload
125
132
  NewRelic::Agent.agent.merge_data_from([payload[:stats],
126
133
  payload[:transaction_traces],
127
134
  payload[:error_traces]])
@@ -137,8 +144,12 @@ module NewRelic
137
144
  else
138
145
  Marshal.load(data)
139
146
  end
147
+ rescue StandardError => e
148
+ msg = "#{e.class.name} '#{e.message}' trying to load #{Base64.encode64(data)}"
149
+ NewRelic::Control.instance.log.debug(msg)
150
+ nil
140
151
  end
141
-
152
+
142
153
  def should_keep_listening?
143
154
  @started || @pipes.values.find{|pipe| !pipe.in.closed?}
144
155
  end
@@ -72,6 +72,10 @@ module NewRelic
72
72
  def call_count
73
73
  ::GC.collections
74
74
  end
75
+
76
+ def reset
77
+ ::GC.clear_stats
78
+ end
75
79
  end
76
80
 
77
81
  class Ruby19 < Profiler
@@ -31,7 +31,10 @@ module NewRelic
31
31
  # information pulled from the config file
32
32
  def proxy_server
33
33
  @proxy_server ||=
34
- NewRelic::Control::ProxyServer.new self['proxy_host'], self['proxy_port'], self['proxy_user'], self['proxy_pass']
34
+ NewRelic::Control::ProxyServer.new(self['proxy_host'],
35
+ self['proxy_port'],
36
+ self['proxy_user'],
37
+ self['proxy_pass'])
35
38
  end
36
39
 
37
40
  # turns a hostname into an ip address and returns a
@@ -40,7 +43,9 @@ module NewRelic
40
43
  host = hostname || self['host'] || 'collector.newrelic.com'
41
44
 
42
45
  # if the host is not an IP address, turn it into one
43
- NewRelic::Control::Server.new host, (self['port'] || (use_ssl? ? 443 : 80)).to_i, convert_to_ip_address(host)
46
+ NewRelic::Control::Server.new(host,
47
+ (self['port'] || (use_ssl? ? 443 : 80)).to_i,
48
+ convert_to_ip_address(host))
44
49
  end
45
50
 
46
51
  # Check to see if we need to look up the IP address
@@ -17,5 +17,15 @@ module NewRelic
17
17
  end
18
18
  end
19
19
 
20
+ def instance_method_visibility(klass, method_name)
21
+ if klass.private_instance_methods.map{|s|s.to_sym}.include? method_name.to_sym
22
+ :private
23
+ elsif klass.protected_instance_methods.map{|s|s.to_sym}.include? method_name.to_sym
24
+ :protected
25
+ else
26
+ :public
27
+ end
28
+ end
29
+
20
30
  end
21
31
  end
@@ -69,9 +69,13 @@ module NewRelic::LanguageSupport
69
69
 
70
70
  def with_disabled_gc
71
71
  if defined?(::GC) && ::GC.respond_to?(:disable)
72
- ::GC.disable
73
- val = yield
74
- ::GC.enable
72
+ val = nil
73
+ begin
74
+ ::GC.disable
75
+ val = yield
76
+ ensure
77
+ ::GC.enable
78
+ end
75
79
  val
76
80
  else
77
81
  yield
@@ -44,22 +44,28 @@ module NewRelic::Rack
44
44
  footer = NewRelic::Agent.browser_timing_footer
45
45
  header = NewRelic::Agent.browser_timing_header
46
46
 
47
- if beginning_of_source.include?('X-UA-Compatible')
47
+ head_pos = if beginning_of_source.include?('X-UA-Compatible')
48
48
  # put at end of header if UA-Compatible meta tag found
49
- head_pos = beginning_of_source.index("</head>")
50
- elsif head_open = beginning_of_source.index("<head")
49
+ beginning_of_source.index("</head>")
50
+ elsif head_open = beginning_of_source.index("<head")
51
51
  # put at the beginning of the header
52
- head_pos = beginning_of_source.index(">", head_open) + 1
53
- else
54
- # put the header right above body start
55
- head_pos = body_start
52
+ beginning_of_source.index(">", head_open) + 1
56
53
  end
54
+ # otherwise put the header right above body start
55
+ head_pos ||= body_start
57
56
 
58
- source = source[0..(head_pos-1)] + header + source[head_pos..(body_close-1)] + footer + source[body_close..-1]
59
-
60
- headers['Content-Length'] = source.length.to_s if headers['Content-Length']
57
+ # check that head_pos is less than body close. If it's not something
58
+ # is really weird and we should punt.
59
+ if head_pos < body_close
60
+ # rebuild the source
61
+ source = source[0..(head_pos-1)] <<
62
+ header <<
63
+ source[head_pos..(body_close-1)] <<
64
+ footer <<
65
+ source[body_close..-1]
66
+ end
61
67
  end
62
-
68
+ headers['Content-Length'] = source.length.to_s if headers['Content-Length']
63
69
  source
64
70
  end
65
71
  end
@@ -3,8 +3,8 @@ module NewRelic
3
3
  module VERSION #:nodoc:
4
4
  MAJOR = 3
5
5
  MINOR = 4
6
- TINY = 0
7
- BUILD = 1 # Set to nil for a release, 'beta1', 'alpha', etc for prerelease builds
6
+ TINY = 1
7
+ BUILD = 'beta1' # Set to nil for a release, 'beta1', 'alpha', etc for prerelease builds
8
8
  STRING = [MAJOR, MINOR, TINY, BUILD].compact.join('.')
9
9
  end
10
10
 
data/newrelic_rpm.gemspec CHANGED
@@ -1,18 +1,17 @@
1
1
  # Generated by jeweler
2
2
  # DO NOT EDIT THIS FILE DIRECTLY
3
- # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
4
  # -*- encoding: utf-8 -*-
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "newrelic_rpm"
8
- s.version = "3.4.0.1"
8
+ s.version = "3.4.1.beta1"
9
9
 
10
- s.required_rubygems_version = Gem::Requirement.new("> 1.3.1") if s.respond_to? :required_rubygems_version=
11
10
  s.authors = ["Bill Kayser", "Jon Guymon", "Justin George", "Darin Swanson"]
12
- s.date = "2012-06-25"
11
+ s.date = "2012-07-24"
13
12
  s.description = "New Relic is a performance management system, developed by New Relic,\nInc (http://www.newrelic.com). New Relic provides you with deep\ninformation about the performance of your web application as it runs\nin production. The New Relic Ruby Agent is dual-purposed as a either a\nGem or plugin, hosted on\nhttp://github.com/newrelic/rpm/\n"
14
13
  s.email = "support@newrelic.com"
15
- s.executables = ["mongrel_rpm", "newrelic", "newrelic_cmd"]
14
+ s.executables = ["newrelic_cmd", "newrelic", "mongrel_rpm"]
16
15
  s.extra_rdoc_files = [
17
16
  "CHANGELOG",
18
17
  "LICENSE",
@@ -191,6 +190,7 @@ Gem::Specification.new do |s|
191
190
  "test/new_relic/delayed_job_injection_test.rb",
192
191
  "test/new_relic/fake_collector.rb",
193
192
  "test/new_relic/fake_service.rb",
193
+ "test/new_relic/load_test.rb",
194
194
  "test/new_relic/local_environment_test.rb",
195
195
  "test/new_relic/metric_data_test.rb",
196
196
  "test/new_relic/metric_parser/metric_parser_test.rb",
@@ -2,7 +2,8 @@ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'test_hel
2
2
 
3
3
  class NewRelicServiceTest < Test::Unit::TestCase
4
4
  def setup
5
- @server = NewRelic::Control::Server.new('127.0.0.1', 30303)
5
+ @server = NewRelic::Control::Server.new('somewhere.example.com',
6
+ 30303, '10.10.10.10')
6
7
  @service = NewRelic::Agent::NewRelicService.new('license-key', @server)
7
8
  @http_handle = HTTPHandle.new
8
9
  NewRelic::Control.instance.stubs(:http_connection).returns(@http_handle)
@@ -21,18 +22,24 @@ class NewRelicServiceTest < Test::Unit::TestCase
21
22
  end
22
23
 
23
24
  def test_connect_sets_redirect_host
24
- assert_equal '127.0.0.1', @service.collector.name
25
+ assert_equal 'somewhere.example.com', @service.collector.name
25
26
  @service.connect
26
27
  assert_equal 'localhost', @service.collector.name
27
28
  end
28
-
29
+
30
+ def test_connect_resets_cached_ip_address
31
+ assert_equal '10.10.10.10', @service.collector.ip
32
+ @service.connect
33
+ assert_nil @service.collector.ip # 'localhost' resolves to nil
34
+ end
35
+
29
36
  def test_connect_uses_proxy_collector_if_no_redirect_host
30
37
  @http_handle.reset
31
38
  @http_handle.respond_to(:get_redirect_host, nil)
32
39
  @http_handle.respond_to(:connect, {'agent_run_id' => 1})
33
40
 
34
41
  @service.connect
35
- assert_equal '127.0.0.1', @service.collector.name
42
+ assert_equal 'somewhere.example.com', @service.collector.name
36
43
  end
37
44
 
38
45
  def test_connect_sets_agent_id
@@ -97,7 +104,21 @@ class NewRelicServiceTest < Test::Unit::TestCase
97
104
  @service.send(:invoke_remote, :bogus_method)
98
105
  end
99
106
  end
107
+
108
+ def test_should_connect_to_proxy_only_once_per_run
109
+ @service.expects(:get_redirect_host).once
100
110
 
111
+ @service.connect
112
+ @http_handle.respond_to(:metric_data, '0')
113
+ @service.metric_data(Time.now - 60, Time.now, {})
114
+
115
+ @http_handle.respond_to(:transaction_sample_data, '1')
116
+ @service.transaction_sample_data([])
117
+
118
+ @http_handle.respond_to(:sql_trace_data, '2')
119
+ @service.sql_trace_data([])
120
+ end
121
+
101
122
  class HTTPHandle
102
123
  attr_accessor :read_timeout, :route_table
103
124
 
@@ -103,6 +103,17 @@ class NewRelic::Agent::PipeChannelManagerTest < Test::Unit::TestCase
103
103
  assert(!NewRelic::Agent::PipeChannelManager.channels[669] ||
104
104
  NewRelic::Agent::PipeChannelManager.channels[669].closed?)
105
105
  end
106
+
107
+ def test_manager_does_not_crash_when_given_bad_data
108
+ listener = start_listener_with_pipe(670)
109
+ assert_nothing_raised do
110
+ pid = Process.fork do
111
+ listener.pipes[670].in << 'some unloadable garbage'
112
+ end
113
+ Process.wait(pid)
114
+ listener.stop
115
+ end
116
+ end
106
117
  end
107
118
 
108
119
  def start_listener_with_pipe(pipe_id)
@@ -195,9 +195,12 @@ class NewRelic::Agent::StatsEngineTest < Test::Unit::TestCase
195
195
  ::GC::Profiler.stubs(:enabled?).returns(true)
196
196
  ::GC::Profiler.stubs(:total_time).returns(1.0, 4.0)
197
197
  ::GC.stubs(:count).returns(1, 3)
198
- elsif NewRelic::LanguageSupport.using_version?('1.8')
198
+ elsif NewRelic::LanguageSupport.using_version?('1.8.7') &&
199
+ RUBY_DESCRIPTION =~ /Ruby Enterprise Edition/
199
200
  ::GC.stubs(:time).returns(1000000, 4000000)
200
201
  ::GC.stubs(:collections).returns(1, 3)
202
+ else
203
+ return true # no need to test if we're not collecting GC metrics
201
204
  end
202
205
 
203
206
  engine = NewRelic::Agent.instance.stats_engine
@@ -0,0 +1,13 @@
1
+ # require File.expand_path(File.join(File.dirname(__FILE__),'..','test_helper'))
2
+ require 'test/unit'
3
+ require 'resolv'
4
+ require 'mocha'
5
+
6
+ class LoadTest < Test::Unit::TestCase
7
+ def test_loading_agent_when_disabled_does_not_resolv_addresses
8
+ ::Resolv.expects(:getaddress).never
9
+ ::IPSocket.expects(:getaddress).never
10
+
11
+ require File.expand_path(File.join(File.dirname(__FILE__),'..','test_helper'))
12
+ end
13
+ end
data/test/script/ci.sh CHANGED
@@ -127,4 +127,14 @@ fi
127
127
 
128
128
  export RAILS_ENV=test
129
129
  bundle
130
- bundle exec rake --trace db:create:all ci:setup:testunit test:newrelic
130
+
131
+ # FIXME: Here we actually trigger the tests. Since the agent deals so heavily
132
+ # in units of time we have many tests that assert that durations are measured
133
+ # correctly. These almost always pass, but as the CI machine has come under
134
+ # heavier load there tend to be discrepencies between the duration measured in
135
+ # the test and the duration the agent measures. This is due to lags in CPU
136
+ # scheduling since many processes are running on the box simultaneously.
137
+ # To reduce the noise from these sporardic failures we rerun the test suite if
138
+ # there are failures to see if they are transient (instead of re-running it by
139
+ # hand). Ultimately we'll move towards a more elegant solution.
140
+ bundle exec rake --trace db:create:all test:newrelic || bundle exec rake --trace test:newrelic || bundle exec rake --trace test:newrelic
metadata CHANGED
@@ -1,10 +1,17 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: newrelic_rpm
3
- version: !ruby/object:Gem::Version
4
- version: 3.4.0.1
5
- prerelease:
3
+ version: !ruby/object:Gem::Version
4
+ hash: -2372133300
5
+ prerelease: 6
6
+ segments:
7
+ - 3
8
+ - 4
9
+ - 1
10
+ - beta
11
+ - 1
12
+ version: 3.4.1.beta1
6
13
  platform: ruby
7
- authors:
14
+ authors:
8
15
  - Bill Kayser
9
16
  - Jon Guymon
10
17
  - Justin George
@@ -12,66 +19,72 @@ authors:
12
19
  autorequire:
13
20
  bindir: bin
14
21
  cert_chain: []
15
- date: 2012-06-25 00:00:00.000000000 Z
16
- dependencies:
17
- - !ruby/object:Gem::Dependency
22
+
23
+ date: 2012-07-24 00:00:00 Z
24
+ dependencies:
25
+ - !ruby/object:Gem::Dependency
18
26
  name: jeweler
19
- requirement: &2158373720 !ruby/object:Gem::Requirement
27
+ prerelease: false
28
+ requirement: &id001 !ruby/object:Gem::Requirement
20
29
  none: false
21
- requirements:
22
- - - ! '>='
23
- - !ruby/object:Gem::Version
24
- version: '0'
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ hash: 3
34
+ segments:
35
+ - 0
36
+ version: "0"
25
37
  type: :development
26
- prerelease: false
27
- version_requirements: *2158373720
28
- - !ruby/object:Gem::Dependency
38
+ version_requirements: *id001
39
+ - !ruby/object:Gem::Dependency
29
40
  name: mocha
30
- requirement: &2158373160 !ruby/object:Gem::Requirement
41
+ prerelease: false
42
+ requirement: &id002 !ruby/object:Gem::Requirement
31
43
  none: false
32
- requirements:
33
- - - ! '>='
34
- - !ruby/object:Gem::Version
35
- version: '0'
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ hash: 3
48
+ segments:
49
+ - 0
50
+ version: "0"
36
51
  type: :development
37
- prerelease: false
38
- version_requirements: *2158373160
39
- - !ruby/object:Gem::Dependency
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
40
54
  name: shoulda
41
- requirement: &2158372660 !ruby/object:Gem::Requirement
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
42
57
  none: false
43
- requirements:
44
- - - ! '>='
45
- - !ruby/object:Gem::Version
46
- version: '0'
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 3
62
+ segments:
63
+ - 0
64
+ version: "0"
47
65
  type: :development
48
- prerelease: false
49
- version_requirements: *2158372660
50
- description: ! 'New Relic is a performance management system, developed by New Relic,
51
-
66
+ version_requirements: *id003
67
+ description: |
68
+ New Relic is a performance management system, developed by New Relic,
52
69
  Inc (http://www.newrelic.com). New Relic provides you with deep
53
-
54
70
  information about the performance of your web application as it runs
55
-
56
71
  in production. The New Relic Ruby Agent is dual-purposed as a either a
57
-
58
72
  Gem or plugin, hosted on
59
-
60
73
  http://github.com/newrelic/rpm/
61
74
 
62
- '
63
75
  email: support@newrelic.com
64
- executables:
65
- - mongrel_rpm
66
- - newrelic
76
+ executables:
67
77
  - newrelic_cmd
78
+ - newrelic
79
+ - mongrel_rpm
68
80
  extensions: []
69
- extra_rdoc_files:
81
+
82
+ extra_rdoc_files:
70
83
  - CHANGELOG
71
84
  - LICENSE
72
85
  - README.rdoc
73
86
  - newrelic.yml
74
- files:
87
+ files:
75
88
  - CHANGELOG
76
89
  - LICENSE
77
90
  - README.rdoc
@@ -243,6 +256,7 @@ files:
243
256
  - test/new_relic/delayed_job_injection_test.rb
244
257
  - test/new_relic/fake_collector.rb
245
258
  - test/new_relic/fake_service.rb
259
+ - test/new_relic/load_test.rb
246
260
  - test/new_relic/local_environment_test.rb
247
261
  - test/new_relic/metric_data_test.rb
248
262
  - test/new_relic/metric_parser/metric_parser_test.rb
@@ -347,39 +361,63 @@ files:
347
361
  - vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/web_transaction.rb
348
362
  homepage: http://www.github.com/newrelic/rpm
349
363
  licenses: []
350
- post_install_message: ! "\nPLEASE NOTE:\n\nDeveloper Mode is now a Rack middleware.\n\nDeveloper
351
- Mode is no longer available in Rails 2.1 and earlier.\nHowever, starting in version
352
- 2.12 you can use Developer Mode in any\nRack based framework, in addition to Rails.
353
- \ To install developer mode\nin a non-Rails application, just add NewRelic::Rack::DeveloperMode
354
- to\nyour middleware stack.\n\nIf you are using JRuby, we recommend using at least
355
- version 1.4 or \nlater because of issues with the implementation of the timeout
356
- library.\n\nRefer to the README.md file for more information.\n\nPlease see http://github.com/newrelic/rpm/blob/master/CHANGELOG\nfor
357
- a complete description of the features and enhancements available\nin version 3.4
358
- of the Ruby Agent.\n \n"
359
- rdoc_options:
364
+
365
+ post_install_message: |
366
+
367
+ PLEASE NOTE:
368
+
369
+ Developer Mode is now a Rack middleware.
370
+
371
+ Developer Mode is no longer available in Rails 2.1 and earlier.
372
+ However, starting in version 2.12 you can use Developer Mode in any
373
+ Rack based framework, in addition to Rails. To install developer mode
374
+ in a non-Rails application, just add NewRelic::Rack::DeveloperMode to
375
+ your middleware stack.
376
+
377
+ If you are using JRuby, we recommend using at least version 1.4 or
378
+ later because of issues with the implementation of the timeout library.
379
+
380
+ Refer to the README.md file for more information.
381
+
382
+ Please see http://github.com/newrelic/rpm/blob/master/CHANGELOG
383
+ for a complete description of the features and enhancements available
384
+ in version 3.4 of the Ruby Agent.
385
+
386
+
387
+ rdoc_options:
360
388
  - --charset=UTF-8
361
389
  - --line-numbers
362
390
  - --inline-source
363
391
  - --title
364
392
  - New Relic Ruby Agent
365
- require_paths:
393
+ require_paths:
366
394
  - lib
367
- required_ruby_version: !ruby/object:Gem::Requirement
395
+ required_ruby_version: !ruby/object:Gem::Requirement
368
396
  none: false
369
- requirements:
370
- - - ! '>='
371
- - !ruby/object:Gem::Version
372
- version: '0'
373
- required_rubygems_version: !ruby/object:Gem::Requirement
397
+ requirements:
398
+ - - ">="
399
+ - !ruby/object:Gem::Version
400
+ hash: 3
401
+ segments:
402
+ - 0
403
+ version: "0"
404
+ required_rubygems_version: !ruby/object:Gem::Requirement
374
405
  none: false
375
- requirements:
376
- - - ! '>'
377
- - !ruby/object:Gem::Version
406
+ requirements:
407
+ - - ">"
408
+ - !ruby/object:Gem::Version
409
+ hash: 25
410
+ segments:
411
+ - 1
412
+ - 3
413
+ - 1
378
414
  version: 1.3.1
379
415
  requirements: []
416
+
380
417
  rubyforge_project:
381
- rubygems_version: 1.8.11
418
+ rubygems_version: 1.8.24
382
419
  signing_key:
383
420
  specification_version: 3
384
421
  summary: New Relic Ruby Agent
385
422
  test_files: []
423
+