newrelic_rpm 3.2.0.1 → 3.3.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 (38) hide show
  1. data/CHANGELOG +7 -3
  2. data/LICENSE +2 -29
  3. data/README.rdoc +2 -2
  4. data/lib/new_relic/agent.rb +14 -0
  5. data/lib/new_relic/agent/agent.rb +19 -9
  6. data/lib/new_relic/agent/beacon_configuration.rb +11 -0
  7. data/lib/new_relic/agent/browser_monitoring.rb +53 -13
  8. data/lib/new_relic/agent/database.rb +11 -1
  9. data/lib/new_relic/agent/instrumentation/active_merchant.rb +3 -1
  10. data/lib/new_relic/agent/instrumentation/controller_instrumentation.rb +3 -2
  11. data/lib/new_relic/agent/instrumentation/metric_frame.rb +23 -2
  12. data/lib/new_relic/agent/instrumentation/rails/active_record_instrumentation.rb +15 -12
  13. data/lib/new_relic/agent/instrumentation/rails3/active_record_instrumentation.rb +11 -8
  14. data/lib/new_relic/agent/sql_sampler.rb +19 -7
  15. data/lib/new_relic/agent/stats_engine.rb +1 -0
  16. data/lib/new_relic/agent/stats_engine/gc_profiler.rb +120 -0
  17. data/lib/new_relic/agent/stats_engine/transactions.rb +2 -85
  18. data/lib/new_relic/agent/transaction_info.rb +49 -0
  19. data/lib/new_relic/agent/transaction_sample_builder.rb +2 -0
  20. data/lib/new_relic/agent/transaction_sampler.rb +65 -7
  21. data/lib/new_relic/rack/browser_monitoring.rb +38 -8
  22. data/lib/new_relic/transaction_sample.rb +8 -6
  23. data/lib/new_relic/version.rb +2 -2
  24. data/newrelic.yml +1 -1
  25. data/newrelic_rpm.gemspec +6 -3
  26. data/test/new_relic/agent/agent/connect_test.rb +4 -11
  27. data/test/new_relic/agent/beacon_configuration_test.rb +10 -7
  28. data/test/new_relic/agent/browser_monitoring_test.rb +69 -44
  29. data/test/new_relic/agent/instrumentation/active_record_instrumentation_test.rb +12 -8
  30. data/test/new_relic/agent/instrumentation/controller_instrumentation_test.rb +0 -2
  31. data/test/new_relic/agent/instrumentation/metric_frame/pop_test.rb +0 -1
  32. data/test/new_relic/agent/instrumentation/net_instrumentation_test.rb +3 -3
  33. data/test/new_relic/agent/sql_sampler_test.rb +25 -10
  34. data/test/new_relic/agent/stats_engine_test.rb +41 -6
  35. data/test/new_relic/agent/transaction_sampler_test.rb +22 -12
  36. data/test/new_relic/metric_parser/metric_parser_test.rb +11 -0
  37. data/vendor/gems/metric_parser-0.1.0.pre1/lib/new_relic/metric_parser/metric_parser.rb +7 -1
  38. metadata +321 -337
data/CHANGELOG CHANGED
@@ -1,6 +1,10 @@
1
- v3.2.0.1
2
- * Updated LICENSE
3
- * Updated links to support docs
1
+ v3.3.0
2
+ * fix for GC instrumentation when using Ruby 1.9
3
+ * new feature to correlate browser and server transaction traces
4
+ * new feature to trace slow sql statements
5
+ * fix to help cope with malformed rack responses
6
+ * do not try to instrument versions of ActiveMerchant that are too old
7
+
4
8
  v3.2.0
5
9
  * Fix over-detection of mongrel and unicorn and only start the agent when
6
10
  actual server is running
data/LICENSE CHANGED
@@ -1,31 +1,4 @@
1
- This product includes jquery written by John Resig
2
- and distributed under an MIT license.
3
- See https://github.com/jquery/jquery/blob/master/MIT-LICENSE.txt
4
-
5
- Copyright (c) 2011 John Resig, http://jquery.com/
6
-
7
- Permission is hereby granted, free of charge, to any person obtaining
8
- a copy of this software and associated documentation files (the
9
- "Software"), to deal in the Software without restriction, including
10
- without limitation the rights to use, copy, modify, merge, publish,
11
- distribute, sublicense, and/or sell copies of the Software, and to
12
- permit persons to whom the Software is furnished to do so, subject to
13
- the following conditions:
14
-
15
- The above copyright notice and this permission notice shall be
16
- included in all copies or substantial portions of the Software.
17
-
18
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
-
26
-
27
- All other components of this product are
28
- Copyright (c) 2008-2011 New Relic, Inc. All rights reserved.
1
+ Copyright (c) 2008-2010 New Relic, Inc. All rights reserved.
29
2
 
30
3
  Certain inventions disclosed in this file may be claimed within
31
4
  patents owned or patent applications filed by New Relic, Inc. or third
@@ -61,4 +34,4 @@ FITNESS FOR A PARTICULAR PURPOSE, TITLE, or NON-INFRINGEMENT. As a
61
34
  condition to your use of these files, you are solely responsible for
62
35
  such use. New Relic will have no liability to you for direct,
63
36
  indirect, consequential, incidental, special, or punitive damages or
64
- for lost profits or data.
37
+ for lost profits or data.
data/README.rdoc CHANGED
@@ -163,7 +163,7 @@ online. Refer to instructions in *Getting Started*, below.
163
163
  = Support
164
164
 
165
165
  Reach out to us--and to fellow users--at
166
- support.newrelic.com[http://support.newrelic.com/].
166
+ support.newrelic.com[http://support.newrelic.com/discussions/support].
167
167
  There you'll find documentation, FAQs, and forums where you can submit
168
168
  suggestions and discuss New Relic with staff and other users.
169
169
 
@@ -171,7 +171,7 @@ Also available is community support on IRC: we generally use #newrelic
171
171
  on irc.freenode.net
172
172
 
173
173
  Find a bug? E-mail support@newrelic.com, or post it to
174
- support.newrelic.com[http://support.newrelic.com/].
174
+ support.newrelic.com[http://support.newrelic.com/discussions/support].
175
175
 
176
176
  Thank you, and may your application scale to infinity plus one.
177
177
 
@@ -86,6 +86,7 @@ module NewRelic
86
86
  require 'new_relic/agent/busy_calculator'
87
87
  require 'new_relic/agent/sampler'
88
88
  require 'new_relic/agent/database'
89
+ require 'new_relic/agent/transaction_info'
89
90
 
90
91
  require 'new_relic/agent/instrumentation/controller_instrumentation'
91
92
 
@@ -387,6 +388,19 @@ module NewRelic
387
388
  def add_custom_parameters(params)
388
389
  NewRelic::Agent::Instrumentation::MetricFrame.add_custom_parameters(params)
389
390
  end
391
+
392
+ # Set attributes about the user making this request. These attributes will be automatically
393
+ # appended to any Transaction Trace or Error that is collected. These attributes
394
+ # will also be collected for RUM requests.
395
+ #
396
+ # Attributes (hash)
397
+ # * <tt>:user</tt> => user name or ID
398
+ # * <tt>:account</tt> => account name or ID
399
+ # * <tt>:product</tt> => product name or level
400
+ #
401
+ def set_user_attributes(attributes)
402
+ NewRelic::Agent::Instrumentation::MetricFrame.set_user_attributes(attributes)
403
+ end
390
404
 
391
405
  # The #add_request_parameters method is aliased to #add_custom_parameters
392
406
  # and is now deprecated.
@@ -37,7 +37,6 @@ module NewRelic
37
37
  @transaction_sampler = NewRelic::Agent::TransactionSampler.new
38
38
  @sql_sampler = NewRelic::Agent::SqlSampler.new
39
39
  @stats_engine.transaction_sampler = @transaction_sampler
40
- @stats_engine.sql_sampler = @sql_sampler
41
40
  @error_collector = NewRelic::Agent::ErrorCollector.new
42
41
  @connect_attempts = 0
43
42
 
@@ -775,13 +774,15 @@ module NewRelic
775
774
  # Ask the server for permission to send transaction samples.
776
775
  # determined by subscription license.
777
776
  @transaction_sampler.config['enabled'] = server_enabled
778
- @sql_sampler.disable unless @transaction_sampler.config['enabled']
779
-
777
+ @sql_sampler.configure!
780
778
  @should_send_samples = @config_should_send_samples && server_enabled
781
-
779
+
782
780
  if @should_send_samples
783
781
  # I don't think this is ever true, but...
784
782
  enable_random_samples!(sample_rate) if @should_send_random_samples
783
+
784
+ @transaction_sampler.slow_capture_threshold = @slowest_transaction_threshold
785
+
785
786
  log.debug "Transaction tracing threshold is #{@slowest_transaction_threshold} seconds."
786
787
  else
787
788
  log.debug "Transaction traces will not be sent to the New Relic service."
@@ -862,6 +863,11 @@ module NewRelic
862
863
  @beacon_configuration = BeaconConfiguration.new(config_data)
863
864
  @server_side_config_enabled = config_data['listen_to_server_config']
864
865
 
866
+ if @server_side_config_enabled
867
+ log.info "Using config from server"
868
+ log.debug "Server provided config: #{config_data.inspect}"
869
+ end
870
+
865
871
  control.merge_server_side_config(config_data) if @server_side_config_enabled
866
872
  config_transaction_tracer
867
873
  log_connection!(config_data)
@@ -1063,6 +1069,10 @@ module NewRelic
1063
1069
  unless @traces.empty?
1064
1070
  now = Time.now
1065
1071
  log.debug "Sending (#{@traces.length}) transaction traces"
1072
+
1073
+ # REMOVE THIS BEFORE SHIPPING
1074
+ log.info "Sending tts with GUIDS #{@traces.collect{|t| t.guid}.join(",")}"
1075
+
1066
1076
  begin
1067
1077
  options = { :keep_backtraces => true }
1068
1078
  options[:record_sql] = @record_sql unless @record_sql == :off
@@ -1134,16 +1144,16 @@ module NewRelic
1134
1144
  def compress_data(object)
1135
1145
  dump = Marshal.dump(object)
1136
1146
 
1137
- # this checks to make sure mongrel won't choke on big uploads
1138
- check_post_size(dump)
1139
-
1140
1147
  dump_size = dump.size
1141
1148
 
1142
1149
  return [dump, 'identity'] if dump_size < (64*1024)
1143
1150
 
1144
- compression = dump_size < 2000000 ? Zlib::BEST_SPEED : Zlib::BEST_COMPRESSION
1151
+ compressed_dump = Zlib::Deflate.deflate(dump, Zlib::DEFAULT_COMPRESSION)
1152
+
1153
+ # this checks to make sure mongrel won't choke on big uploads
1154
+ check_post_size(compressed_dump)
1145
1155
 
1146
- [Zlib::Deflate.deflate(dump, compression), 'deflate']
1156
+ [compressed_dump, 'deflate']
1147
1157
  end
1148
1158
 
1149
1159
  # Raises a PostTooBigException if the post_string is longer
@@ -28,6 +28,13 @@ module NewRelic
28
28
  # local config
29
29
  attr_reader :rum_enabled
30
30
 
31
+ # whether JSONP is used to communicate with the Beacon or not
32
+ attr_reader :rum_jsonp
33
+
34
+ # RUM footer command used for 'finish' - based on whether JSONP is
35
+ # being used. 'nrfj' for JSONP, otherwise 'nrf2'
36
+ attr_reader :finish_command
37
+
31
38
  # A static javascript header that is identical for every account
32
39
  # and application
33
40
  JS_HEADER = "<script type=\"text/javascript\">var NREUMQ=NREUMQ||[];NREUMQ.push([\"mark\",\"firstbyte\",new Date().getTime()]);</script>"
@@ -45,6 +52,10 @@ module NewRelic
45
52
  NewRelic::Control.instance.log.debug("Browser timing header: #{@browser_timing_header.inspect}")
46
53
  @browser_timing_static_footer = build_load_file_js(connect_data)
47
54
  NewRelic::Control.instance.log.debug("Browser timing static footer: #{@browser_timing_static_footer.inspect}")
55
+ @rum_jsonp = connect_data['rum.jsonp']
56
+ @rum_jsonp = true if @rum_jsonp.nil?
57
+ NewRelic::Control.instance.log.debug("Real User Monitoring is using JSONP protocol") if @rum_jsonp
58
+ @finish_command = @rum_jsonp ? 'nrfj' : 'nrf2'
48
59
  end
49
60
 
50
61
  # returns a memoized version of the bytes in the license key for
@@ -6,6 +6,24 @@ module NewRelic
6
6
  # javascript generation and configuration
7
7
  module BrowserMonitoring
8
8
 
9
+
10
+ class DummyMetricFrame
11
+ def initialize
12
+ @attributes = {}
13
+ end
14
+
15
+ def user_attributes
16
+ @attributes
17
+ end
18
+
19
+ def queue_time
20
+ 0.0
21
+ end
22
+ end
23
+
24
+ @@dummy_metric_frame = DummyMetricFrame.new
25
+
26
+
9
27
  # This method returns a string suitable for inclusion in a page
10
28
  # - known as 'manual instrumentation' for Real User
11
29
  # Monitoring. Can return either a script tag with associated
@@ -34,32 +52,49 @@ module NewRelic
34
52
  config = NewRelic::Agent.instance.beacon_configuration
35
53
  return "" if config.nil? || !config.rum_enabled || config.browser_monitoring_key.nil?
36
54
  return "" if !NewRelic::Agent.is_transaction_traced? || !NewRelic::Agent.is_execution_traced?
37
- generate_footer_js
55
+ generate_footer_js(config)
38
56
  end
39
57
 
40
58
  private
41
59
 
42
- def generate_footer_js
60
+ def generate_footer_js(config)
43
61
  if browser_monitoring_start_time
44
- config = NewRelic::Agent.instance.beacon_configuration
45
62
  application_id = config.application_id
46
63
  beacon = config.beacon
47
64
  license_key = config.browser_monitoring_key
48
65
 
49
- footer_js_string(beacon, license_key, application_id)
66
+ footer_js_string(config, beacon, license_key, application_id)
50
67
  else
51
68
  ''
52
69
  end
53
70
  end
54
71
 
55
72
  def browser_monitoring_transaction_name
56
- Thread.current[:newrelic_most_recent_transaction] || "<unknown>"
73
+ NewRelic::Agent::TransactionInfo.get.transaction_name
57
74
  end
58
75
 
59
76
  def browser_monitoring_start_time
60
- Thread.current[:newrelic_start_time]
77
+ NewRelic::Agent::TransactionInfo.get.start_time
61
78
  end
62
-
79
+
80
+ def metric_frame_attribute(key)
81
+ current_metric_frame.user_attributes[key] || ""
82
+ end
83
+
84
+ def current_metric_frame
85
+ Thread.current[:last_metric_frame] || @@dummy_metric_frame
86
+ end
87
+
88
+ def tt_guid
89
+ txn = NewRelic::Agent::TransactionInfo.get
90
+ return txn.guid if txn.include_guid?
91
+ ""
92
+ end
93
+
94
+ def tt_token
95
+ return NewRelic::Agent::TransactionInfo.get.token
96
+ end
97
+
63
98
  def clamp_to_positive(value)
64
99
  return 0.0 if value < 0
65
100
  value
@@ -70,12 +105,17 @@ module NewRelic
70
105
  end
71
106
 
72
107
  def browser_monitoring_queue_time
73
- clamp_to_positive((Thread.current[:newrelic_queue_time].to_f * 1000.0).round)
108
+ clamp_to_positive((current_metric_frame.queue_time.to_f * 1000.0).round)
74
109
  end
75
110
 
76
- def footer_js_string(beacon, license_key, application_id)
77
- obfuscated_transaction_name = obfuscate(browser_monitoring_transaction_name)
78
- html_safe_if_needed("<script type=\"text/javascript\">#{NewRelic::Agent.instance.beacon_configuration.browser_timing_static_footer}NREUMQ.push([\"nrf2\",\"#{beacon}\",\"#{license_key}\",#{application_id},\"#{obfuscated_transaction_name}\",#{browser_monitoring_queue_time},#{browser_monitoring_app_time},new Date().getTime()])</script>")
111
+ def footer_js_string(config, beacon, license_key, application_id)
112
+ obfuscated_transaction_name = obfuscate(config, browser_monitoring_transaction_name)
113
+
114
+ user = obfuscate(config, metric_frame_attribute(:user))
115
+ account = obfuscate(config, metric_frame_attribute(:account))
116
+ product = obfuscate(config, metric_frame_attribute(:product))
117
+
118
+ html_safe_if_needed("<script type=\"text/javascript\">#{config.browser_timing_static_footer}NREUMQ.push([\"#{config.finish_command}\",\"#{beacon}\",\"#{license_key}\",#{application_id},\"#{obfuscated_transaction_name}\",#{browser_monitoring_queue_time},#{browser_monitoring_app_time},new Date().getTime(),\"#{tt_guid}\",\"#{tt_token}\",\"#{user}\",\"#{account}\",\"#{product}\"])</script>")
79
119
  end
80
120
 
81
121
  def html_safe_if_needed(string)
@@ -86,9 +126,9 @@ module NewRelic
86
126
  end
87
127
  end
88
128
 
89
- def obfuscate(text)
129
+ def obfuscate(config, text)
90
130
  obfuscated = ""
91
- key_bytes = NewRelic::Agent.instance.beacon_configuration.license_bytes
131
+ key_bytes = config.license_bytes
92
132
  index = 0
93
133
  text.each_byte{|byte|
94
134
  obfuscated.concat((byte ^ key_bytes[index % 13].to_i))
@@ -30,11 +30,19 @@ module NewRelic
30
30
  def get_connection(config)
31
31
  ConnectionManager.instance.get_connection(config)
32
32
  end
33
-
33
+
34
34
  def close_connections
35
35
  ConnectionManager.instance.close_connections
36
36
  end
37
37
 
38
+ def config
39
+ ConnectionManager.instance.config
40
+ end
41
+
42
+ def config=(other)
43
+ ConnectionManager.instance.config = other
44
+ end
45
+
38
46
  # Perform this in the runtime environment of a managed
39
47
  # application, to explain the sql statement executed within a
40
48
  # segment of a transaction sample. Returns an array of
@@ -114,6 +122,8 @@ module NewRelic
114
122
 
115
123
  class ConnectionManager
116
124
  include Singleton
125
+
126
+ attr_accessor :config
117
127
 
118
128
  # Returns a cached connection for a given ActiveRecord
119
129
  # configuration - these are stored or reopened as needed, and if
@@ -2,7 +2,9 @@ DependencyDetection.defer do
2
2
  @name = :active_merchant
3
3
 
4
4
  depends_on do
5
- defined?(ActiveMerchant) && defined?(ActiveMerchant::Billing)
5
+ defined?(ActiveMerchant) && defined?(ActiveMerchant::Billing) &&
6
+ defined?(ActiveMerchant::Billing::Gateway) &&
7
+ ActiveMerchant::Billing::Gateway.respond_to?(:implementations)
6
8
  end
7
9
 
8
10
  executes do
@@ -340,7 +340,9 @@ module NewRelic
340
340
  available_params = self.respond_to?(:params) ? self.params : {}
341
341
  end
342
342
  frame_data.request ||= self.request if self.respond_to? :request
343
- frame_data.push(category + '/'+ path)
343
+ transaction_name = category + '/' + path
344
+ frame_data.push(transaction_name)
345
+ NewRelic::Agent::TransactionInfo.get.transaction_name = transaction_name
344
346
  frame_data.filtered_params = (respond_to? :filter_parameters) ? filter_parameters(available_params) : available_params
345
347
  frame_data
346
348
  end
@@ -403,7 +405,6 @@ module NewRelic
403
405
  queue_start = nil
404
406
  if newrelic_request_headers
405
407
  queue_start = parse_frontend_headers(newrelic_request_headers)
406
- Thread.current[:newrelic_queue_time] = (now.to_f - queue_start.to_f) if queue_start
407
408
  end
408
409
  queue_start || now
409
410
  rescue Exception => e
@@ -74,10 +74,11 @@ module NewRelic
74
74
  attr_reader :depth
75
75
 
76
76
  def initialize
77
- Thread.current[:newrelic_start_time] = @start = Time.now
77
+ @start = Time.now
78
78
  @path_stack = [] # stack of [controller, path] elements
79
79
  @jruby_cpu_start = jruby_cpu_time
80
80
  @process_cpu_start = process_cpu
81
+ Thread.current[:last_metric_frame] = self
81
82
  end
82
83
 
83
84
  def agent
@@ -199,11 +200,19 @@ module NewRelic
199
200
  def self.add_custom_parameters(p)
200
201
  current.add_custom_parameters(p) if current
201
202
  end
202
-
203
+
203
204
  def self.custom_parameters
204
205
  (current && current.custom_parameters) ? current.custom_parameters : {}
205
206
  end
206
207
 
208
+ def self.set_user_attributes(attributes)
209
+ current.set_user_attributes(attributes) if current
210
+ end
211
+
212
+ def self.user_attributes
213
+ (current) ? current.user_attributes : {}
214
+ end
215
+
207
216
  def record_apdex()
208
217
  return unless recording_web_transaction? && NewRelic::Agent.is_execution_traced?
209
218
  t = Time.now
@@ -248,10 +257,22 @@ module NewRelic
248
257
  def custom_parameters
249
258
  @custom_parameters ||= {}
250
259
  end
260
+
261
+ def user_attributes
262
+ @user_atrributes ||= {}
263
+ end
264
+
265
+ def queue_time
266
+ apdex_start - start
267
+ end
251
268
 
252
269
  def add_custom_parameters(p)
253
270
  custom_parameters.merge!(p)
254
271
  end
272
+
273
+ def set_user_attributes(attributes)
274
+ user_attributes.merge!(attributes)
275
+ end
255
276
 
256
277
  def self.recording_web_transaction?
257
278
  c = Thread.current[:newrelic_metric_frame]
@@ -8,19 +8,12 @@ module NewRelic
8
8
  alias_method :log_without_newrelic_instrumentation, :log
9
9
  alias_method :log, :log_with_newrelic_instrumentation
10
10
  protected :log
11
- end
11
+ end
12
12
  end
13
-
13
+
14
14
  def log_with_newrelic_instrumentation(sql, name, &block)
15
-
16
15
  return log_without_newrelic_instrumentation(sql, name, &block) unless NewRelic::Agent.is_execution_traced?
17
-
18
- # Capture db config if we are going to try to get the explain plans
19
- if (defined?(ActiveRecord::ConnectionAdapters::MysqlAdapter) && self.is_a?(ActiveRecord::ConnectionAdapters::MysqlAdapter)) ||
20
- (defined?(ActiveRecord::ConnectionAdapters::Mysql2Adapter) && self.is_a?(ActiveRecord::ConnectionAdapters::Mysql2Adapter)) ||
21
- (defined?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter) && self.is_a?(ActiveRecord::ConnectionAdapters::PostgreSQLAdapter))
22
- supported_config = @config
23
- end
16
+
24
17
  if name && (parts = name.split " ") && parts.size == 2
25
18
  model = parts.first
26
19
  operation = parts.last.downcase
@@ -56,13 +49,22 @@ module NewRelic
56
49
  else
57
50
  metrics = [metric, "ActiveRecord/all"]
58
51
  metrics << "ActiveRecord/#{metric_name}" if metric_name
52
+ if NewRelic::Agent::Database.config && NewRelic::Agent::Database.config[:adapter]
53
+ type = NewRelic::Agent::Database.config[:adapter].sub(/\d*/, '')
54
+ host = NewRelic::Agent::Database.config[:host] || 'localhost'
55
+ metrics << "RemoteService/sql/#{type}/#{host}"
56
+ end
57
+
59
58
  self.class.trace_execution_scoped(metrics) do
60
59
  t0 = Time.now
61
60
  begin
62
61
  log_without_newrelic_instrumentation(sql, name, &block)
63
62
  ensure
64
- NewRelic::Agent.instance.transaction_sampler.notice_sql(sql, supported_config, (Time.now - t0).to_f)
65
- NewRelic::Agent.instance.sql_sampler.notice_sql(sql, metric, supported_config, (Time.now - t0).to_f)
63
+ elapsed_time = (Time.now - t0).to_f
64
+ NewRelic::Agent.instance.transaction_sampler.notice_sql(sql, NewRelic::Agent::Database.config,
65
+ elapsed_time)
66
+ NewRelic::Agent.instance.sql_sampler.notice_sql(sql, metric, NewRelic::Agent::Database.config,
67
+ elapsed_time)
66
68
  end
67
69
  end
68
70
  end
@@ -104,6 +106,7 @@ DependencyDetection.defer do
104
106
 
105
107
  executes do
106
108
  ActiveRecord::Base.class_eval do
109
+ NewRelic::Agent::Database::ConnectionManager.instance.config = connection.instance_eval{ @config }
107
110
  class << self
108
111
  add_method_tracer :find_by_sql, 'ActiveRecord/#{self.name}/find_by_sql', :metric => false
109
112
  add_method_tracer :transaction, 'ActiveRecord/#{self.name}/transaction', :metric => false