oneapm_rpm 1.1.1 → 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5e32427fd3917392d098a61043e2e8ba109be38f
4
- data.tar.gz: 146849355bbd8791205fafccca1cd14a42d93eaa
3
+ metadata.gz: 4759f9e2a49b073a72ef050065da0b3169782a50
4
+ data.tar.gz: e06c21dc7767a5c5ee0b2371eb367cb3286b1231
5
5
  SHA512:
6
- metadata.gz: 75c0d8b2b385925693074ea3c369cf2ec062a7708369f704c8890d7f1d1c549502848bddbb5d8f8ba0503a19056d974baf74427c64e15a436b237876df3bdaab
7
- data.tar.gz: 1e84cb7ff83b77382c7b854b87473dc426a1baff93ccc9c1612d7febbd96aeefa0ab59090160d6090fd90e6fbbce29b0b78a06d28b5661cc27242adf5c203f43
6
+ metadata.gz: 523b7b03147cb529a70bf76da7bdd1761621460169d4eeb74d972db31134eae5ab7d0430d693cd7e51d4699d66b71615de5b9a42b81ca45c8d7d4a23a3d2ddc1
7
+ data.tar.gz: 60387048069ae8167d4f237070131090558fb44104b47af2e5e86597f44eb2dcbef8223da1516fc37c13684e2da1e8a827a86a26765c2ee4ed8c0b9656c39d44
@@ -12,20 +12,18 @@ module OneApm
12
12
  model = parts.first
13
13
  operation = parts.last.downcase
14
14
  case operation
15
- when 'load', 'count', 'exists'
16
- op_name = 'find'
17
- when 'indexes', 'columns'
18
- op_name = nil # fall back to DirectSQL
19
- when 'destroy', 'find', 'save', 'create'
20
- op_name = operation
21
- when 'update'
22
- op_name = 'save'
15
+ when 'find', 'load', 'count', 'exists'
16
+ op_name = 'select'
17
+ when 'destroy'
18
+ op_name = 'delete'
19
+ when 'create'
20
+ op_name = 'insert'
21
+ when 'update', 'save'
22
+ op_name = 'update'
23
23
  else
24
- if model == 'Join'
25
- op_name = operation
26
- end
24
+ op_name = nil
27
25
  end
28
- "ActiveRecord/#{model}/#{op_name}" if op_name
26
+ "Database/#{model}/#{op_name}" if op_name
29
27
  end
30
28
  end
31
29
 
@@ -44,11 +42,11 @@ module OneApm
44
42
  metric
45
43
  end
46
44
 
47
- # Given a metric name such as "ActiveRecord/model/action" this
45
+ # Given a metric name such as "Database/model/action" this
48
46
  # returns an array of rollup metrics:
49
- # [ "Database/all", "ActiveRecord/all", "ActiveRecord/action" ]
50
- # If the metric name is in the form of "ActiveRecord/action"
51
- # this returns merely: [ "Database/all", "ActiveRecord/all" ]
47
+ # [ "Database/all", "Database/all", "Database/action" ]
48
+ # If the metric name is in the form of "Database/action"
49
+ # this returns merely: [ "Database/all", "Database/all" ]
52
50
  def rollup_metrics_for(metric)
53
51
  metrics = ["Database/all"]
54
52
 
@@ -56,11 +54,11 @@ module OneApm
56
54
  # database metrics. This is to prevent metrics from background tasks
57
55
  # from polluting the metrics used to drive overview graphs.
58
56
  if OneApm::Transaction.recording_web_transaction?
59
- metrics << "ActiveRecord/all"
57
+ metrics << "Database/allWeb"
60
58
  else
61
59
  metrics << "Database/allOther"
62
60
  end
63
- metrics << "ActiveRecord/#{$1}" if metric =~ /ActiveRecord\/[\w|\:]+\/(\w+)/
61
+ metrics << "Database/#{$1}" if metric =~ /Database\/[\w|\:]+\/(\w+)/
64
62
 
65
63
  metrics
66
64
  end
@@ -1,58 +1,11 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  require 'thread'
4
+ require 'one_apm/agent/event/timer'
4
5
 
5
6
  module OneApm
6
7
  module Agent
7
8
  class EventLoop
8
- class Timer
9
-
10
- attr_reader :next_fire_time, :event, :interval, :last_fired_at
11
-
12
- def initialize(interval, event, repeat=false)
13
- @interval = interval
14
- @event = event
15
- @repeat = repeat
16
- @started_at = Time.now
17
- @last_fired_at = nil
18
- reschedule
19
- end
20
-
21
- def reschedule
22
- @next_fire_time = calculate_next_fire_time
23
- end
24
-
25
- def advance(amount)
26
- @next_fire_time -= amount
27
- end
28
-
29
- def last_interval_start
30
- @last_fired_at || @started_at
31
- end
32
-
33
- def calculate_next_fire_time
34
- now = Time.now
35
- return now if @interval == 0
36
- fire_time = @last_fired_at || now
37
- while fire_time <= now
38
- fire_time += @interval
39
- end
40
- fire_time
41
- end
42
-
43
- def set_fired_time
44
- @last_fired_at = Time.now
45
- end
46
-
47
- def due?(now=Time.now)
48
- now >= @next_fire_time
49
- end
50
-
51
- def finished?
52
- !@repeat && @last_fired_at
53
- end
54
-
55
- end
56
9
 
57
10
  def initialize
58
11
  @self_pipe_rd, @self_pipe_wr = IO.pipe
@@ -0,0 +1,56 @@
1
+ # encoding: utf-8
2
+
3
+ module OneApm
4
+ module Agent
5
+ class EventLoop
6
+ class Timer
7
+
8
+ attr_reader :next_fire_time, :event, :interval, :last_fired_at
9
+
10
+ def initialize(interval, event, repeat=false)
11
+ @interval = interval
12
+ @event = event
13
+ @repeat = repeat
14
+ @started_at = Time.now
15
+ @last_fired_at = nil
16
+ reschedule
17
+ end
18
+
19
+ def reschedule
20
+ @next_fire_time = calculate_next_fire_time
21
+ end
22
+
23
+ def advance(amount)
24
+ @next_fire_time -= amount
25
+ end
26
+
27
+ def last_interval_start
28
+ @last_fired_at || @started_at
29
+ end
30
+
31
+ def calculate_next_fire_time
32
+ now = Time.now
33
+ return now if @interval == 0
34
+ fire_time = @last_fired_at || now
35
+ while fire_time <= now
36
+ fire_time += @interval
37
+ end
38
+ fire_time
39
+ end
40
+
41
+ def set_fired_time
42
+ @last_fired_at = Time.now
43
+ end
44
+
45
+ def due?(now=Time.now)
46
+ now >= @next_fire_time
47
+ end
48
+
49
+ def finished?
50
+ !@repeat && @last_fired_at
51
+ end
52
+
53
+ end
54
+ end
55
+ end
56
+ end
@@ -164,13 +164,8 @@ module OneApm
164
164
  data[USER_ATTRIBUTES_KEY] = obfuscator.obfuscate(json)
165
165
  end
166
166
 
167
- # Still support deprecated capture_attributes.page_view_events for
168
- # clients that use it. Could potentially be removed if we don't have
169
- # anymore users with it set according to zeitgeist.
170
167
  def include_custom_parameters?(txn)
171
- has_custom_parameters?(txn) &&
172
- (OneApm::Agent.config[:'browser_monitoring.capture_attributes'] ||
173
- OneApm::Agent.config[:'capture_attributes.page_view_events'])
168
+ has_custom_parameters?(txn) && OneApm::Agent.config[:'browser_monitoring.capture_attributes']
174
169
  end
175
170
 
176
171
  def has_custom_parameters?(txn)
@@ -13,7 +13,7 @@ module OneApm
13
13
  if @pipe && @pipe.parent_pid != $$
14
14
  @pipe.after_fork_in_child
15
15
  else
16
- OneApm::Agent.logger.error("No communication channel to parent process, please see https://oneapm.com/docs/ruby/resque-instrumentation for more information.")
16
+ OneApm::Agent.logger.error("No communication channel to parent process.")
17
17
  end
18
18
  end
19
19
 
data/lib/one_apm/agent.rb CHANGED
@@ -222,14 +222,6 @@ module OneApm
222
222
  end
223
223
  end
224
224
 
225
- def with_database_metric_name(model, method, &block) #THREAD_LOCAL_ACCESS
226
- if txn = Transaction.tl_current
227
- txn.with_database_metric_name(model, method, &block)
228
- else
229
- yield
230
- end
231
- end
232
-
233
225
  def subscribe(event_type, &handler)
234
226
  instance.events.subscribe( event_type, &handler )
235
227
  end
@@ -235,7 +235,7 @@ module OneApm
235
235
  :default => value_of(:enabled),
236
236
  :public => true,
237
237
  :type => Boolean,
238
- :description => 'Enable or disable the transmission of data to the OneApm collector).'
238
+ :description => 'Enable or disable the transmission of data to the OneApm collector.'
239
239
  },
240
240
  :log_level => {
241
241
  :default => 'info',
@@ -296,7 +296,7 @@ module OneApm
296
296
  :default => DefaultSource.config_path,
297
297
  :public => true,
298
298
  :type => String,
299
- :description => 'Path to <b>oneapm.yml</b>. When omitted the agent will check (in order) <b>config/oneapm.yml</b>, <b>oneapm.yml</b>, <b>$HOME/.oneapm/oneapm.yml</b> and <b>$HOME/oneapm.yml</b>.'
299
+ :description => 'Path to <b>oneapm.yml</b>. When omitted the agent will check (in order) <b>config/oneapm.yml</b>.'
300
300
  },
301
301
  :config_search_paths => {
302
302
  :default => DefaultSource.config_search_paths,
@@ -761,13 +761,6 @@ module OneApm
761
761
  :type => Boolean,
762
762
  :description => 'Enable or disable HTTPS instrumentation by JavaScript agent on HTTP pages.'
763
763
  },
764
- :'capture_attributes.page_view_events' => {
765
- :default => false,
766
- :public => false,
767
- :type => Boolean,
768
- :deprecated => true,
769
- :description => 'Correct setting is browser_monitoring.capture_attributes.'
770
- },
771
764
  :js_agent_loader => {
772
765
  :default => '',
773
766
  :public => false,
@@ -1020,6 +1013,12 @@ module OneApm
1020
1013
  :public => true,
1021
1014
  :type => Boolean,
1022
1015
  :description => 'Disables installation of Grape instrumentation.'
1016
+ },
1017
+ :event_machine_standalone => {
1018
+ :default => false,
1019
+ :public => true,
1020
+ :type => Boolean,
1021
+ :description => 'enable standalone mode of event_machine'
1023
1022
  }
1024
1023
  }.freeze
1025
1024
  end
@@ -4,10 +4,10 @@ module OneApm
4
4
  module Configuration
5
5
  class EnvironmentSource < OneApm::Support::DottedHash
6
6
 
7
- SUPPORTED_PREFIXES = /^one_apm_|^oneapm_/i
7
+ SUPPORTED_PREFIXES = /^oneapm_/i
8
8
  SPECIAL_CASE_KEYS = [
9
- 'ONE_APM_ENV', # read by OneApm::Probe::Frameworks::Ruby
10
- 'ONE_APM_LOG' # read by set_log_file
9
+ 'ONEAPM_ENV', # read by OneApm::Probe::Frameworks::Ruby
10
+ 'ONEAPM_LOG' # read by set_log_file
11
11
  ]
12
12
 
13
13
  attr_accessor :alias_map, :type_map
@@ -46,24 +46,24 @@ module OneApm
46
46
  end
47
47
 
48
48
  def set_log_file
49
- if ENV['ONE_APM_LOG']
50
- if ENV['ONE_APM_LOG'].upcase == 'STDOUT'
49
+ if ENV['ONEAPM_LOG']
50
+ if ENV['ONEAPM_LOG'].upcase == 'STDOUT'
51
51
  self[:log_file_path] = self[:log_file_name] = 'STDOUT'
52
52
  else
53
- self[:log_file_path] = File.dirname(ENV['ONE_APM_LOG'])
54
- self[:log_file_name] = File.basename(ENV['ONE_APM_LOG'])
53
+ self[:log_file_path] = File.dirname(ENV['ONEAPM_LOG'])
54
+ self[:log_file_name] = File.basename(ENV['ONEAPM_LOG'])
55
55
  end
56
56
  end
57
57
  end
58
58
 
59
59
  def set_config_file
60
- self[:config_path] = ENV['OACONFIG'] if ENV['OACONFIG']
60
+ self[:config_path] = ENV['ONEAPM_CONFIG'] if ENV['ONEAPM_CONFIG']
61
61
  end
62
62
 
63
63
  def set_values_from_one_apm_environment_variables
64
- nr_env_var_keys = collect_one_apm_environment_variable_keys
64
+ env_var_keys = collect_one_apm_environment_variable_keys
65
65
 
66
- nr_env_var_keys.each do |key|
66
+ env_var_keys.each do |key|
67
67
  next if SPECIAL_CASE_KEYS.include?(key.upcase)
68
68
  set_value_from_environment_variable(key)
69
69
  end
@@ -93,8 +93,7 @@ module OneApm
93
93
  self[config_key] = true
94
94
  end
95
95
  else
96
- ::OneApm::Agent.logger.info("#{environment_key} does not have a corresponding configuration setting (#{config_key} does not exist).")
97
- ::OneApm::Agent.logger.info("Run `rake oneapm:config:docs` or visit https://oneapm.com/docs/ruby/ruby-agent-configuration to see a list of available configuration settings.")
96
+ OneApm::Agent.logger.info("#{environment_key} does not have a corresponding configuration setting (#{config_key} does not exist).")
98
97
  self[config_key] = value
99
98
  end
100
99
  end
@@ -5,7 +5,7 @@ module OneApm
5
5
  module Frameworks
6
6
  class Ruby < OneApm::Probe
7
7
  def env
8
- @env ||= ENV['ONE_APM_ENV'] || ENV['RUBY_ENV'] ||
8
+ @env ||= ENV['ONEAPM_ENV'] || ENV['RUBY_ENV'] ||
9
9
  ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'development'
10
10
  end
11
11
 
@@ -12,7 +12,7 @@ LibraryDetection.defer do
12
12
  end
13
13
 
14
14
  executes do
15
- ::OneApm::Agent.logger.info 'Installing DelayedJob instrumentation [part 1/2]'
15
+ ::OneApm::Agent.logger.info 'Installing DelayedJob instrumentation'
16
16
  end
17
17
 
18
18
  executes do
@@ -26,7 +26,6 @@ LibraryDetection.defer do
26
26
  OneApm::DelayedJobInjection.worker_name = worker_name
27
27
 
28
28
  if defined?(::Delayed::Job) && ::Delayed::Job.method_defined?(:invoke_job)
29
- ::OneApm::Agent.logger.info 'Installing DelayedJob instrumentation [part 2/2]'
30
29
  install_oneapm_job_tracer
31
30
  OneApm::Probe.instance.init_plugin :dispatcher => :delayed_job
32
31
  else
@@ -0,0 +1,24 @@
1
+ # encoding: utf-8
2
+
3
+ LibraryDetection.defer do
4
+ named :event_machine_standalone
5
+
6
+ depends_on do
7
+ OneApm::Agent.config[:event_machine_standalone] && defined?(::EventMachine)
8
+ end
9
+
10
+ executes do
11
+ OneApm::Agent.logger.info 'Installing EventMachine Standalone Mode instrumentation'
12
+
13
+ module EventMachine
14
+
15
+ PeriodicTimer.class_eval do
16
+ include OneApm::Agent::Instrumentation::TransactionBase
17
+
18
+ add_transaction_tracer "fire", :category => 'OtherTransaction/Background'
19
+ end
20
+
21
+ end
22
+
23
+ end
24
+ end
@@ -25,9 +25,7 @@ LibraryDetection.defer do
25
25
  if Sequel::Database.respond_to?(:extension)
26
26
  Sequel::Database.extension :oneapm_instrumentation
27
27
  else
28
- OneApm::Agent.logger.info "Detected Sequel version %s." % [ Sequel::VERSION ]
29
- OneApm::Agent.logger.info "Please see additional documentation: " +
30
- "https://oneapm.com/docs/ruby/sequel-instrumentation"
28
+ OneApm::Agent.logger.warn("Detected Sequel version #{Sequel::VERSION}.")
31
29
  end
32
30
 
33
31
  Sequel.synchronize{Sequel::DATABASES.dup}.each do |db|
@@ -3,9 +3,6 @@
3
3
  module OneApm
4
4
  module Agent
5
5
  module Instrumentation
6
- # https://oneapm.com/docs/features/tracking-front-end-time
7
- # Record queue time metrics based on any of three headers
8
- # which can be set on the request.
9
6
  module QueueTime
10
7
  unless defined?(REQUEST_START_HEADER)
11
8
  REQUEST_START_HEADER = 'HTTP_X_REQUEST_START'.freeze
@@ -17,7 +17,7 @@ module OneApm
17
17
  # into the same log, it's useful to be able to identify what kind of
18
18
  # process a given PID mapped to.
19
19
  #
20
- # Overriding the dispatcher is possible via the ONE_APM_DISPATCHER
20
+ # Overriding the dispatcher is possible via the ONEAPM_DISPATCHER
21
21
  # environment variable, but this should not generally be necessary unless
22
22
  # you're on a dispatcher that falls into category 1 above, and our detection
23
23
  # logic isn't working correctly.
@@ -72,6 +72,7 @@ module OneApm
72
72
  unicorn
73
73
  goliath
74
74
  webrick
75
+ event_machine
75
76
  ]
76
77
  while dispatchers.any? && @discovered_dispatcher.nil?
77
78
  send 'check_for_'+(dispatchers.shift)
@@ -180,6 +181,12 @@ module OneApm
180
181
  end
181
182
  end
182
183
 
184
+ def check_for_event_machine
185
+ if defined?(::EventMachine)
186
+ @discovered_dispatcher = :event_machine
187
+ end
188
+ end
189
+
183
190
  public
184
191
  # outputs a human-readable description
185
192
  def to_s
@@ -8,8 +8,17 @@ module OneApm
8
8
 
9
9
  extend self
10
10
 
11
- # helper for logging errors to the oneapm_agent.log
12
- # properly. Logs the error at error level
11
+ def record_metrics(state, first_name, other_names, duration, exclusive, options)
12
+ record_scoped_metric = options.has_key?(:scoped_metric) ? options[:scoped_metric] : true
13
+ stats_engine = OneApm::Agent.instance.stats_engine
14
+ if record_scoped_metric
15
+ stats_engine.record_scoped_and_unscoped_metrics(state, first_name, other_names, duration, exclusive)
16
+ else
17
+ metrics = [first_name].concat(other_names)
18
+ stats_engine.record_unscoped_metrics(state, metrics, duration, exclusive)
19
+ end
20
+ end
21
+
13
22
  def log_errors(code_area)
14
23
  yield
15
24
  rescue => e
@@ -23,45 +32,35 @@ module OneApm
23
32
  end
24
33
  end
25
34
 
26
- def record_metrics(state, first_name, other_names, duration, exclusive, options)
27
- record_scoped_metric = options.has_key?(:scoped_metric) ? options[:scoped_metric] : true
28
- stat_engine = OneApm::Agent.instance.stats_engine
29
- if record_scoped_metric
30
- stat_engine.record_scoped_and_unscoped_metrics(state, first_name, other_names, duration, exclusive)
31
- else
32
- metrics = [first_name].concat(other_names)
33
- stat_engine.record_unscoped_metrics(state, metrics, duration, exclusive)
34
- end
35
- end
36
-
37
- def trace_execution_scoped_footer(state, t0, first_name, metric_names, expected_frame, options, t1=Time.now.to_f)
35
+ def trace_execution_scoped_footer(state, t0, first_name, metric_names, expected_frame, options, t1 = Time.now.to_f)
38
36
  log_errors(:trace_method_execution_footer) do
39
- if expected_frame
40
- stack = state.traced_method_stack
41
- create_metrics = options.has_key?(:metric) ? options[:metric] : true
42
- frame = stack.pop_frame(state, expected_frame, first_name, t1, create_metrics)
43
- if create_metrics
44
- duration = t1 - t0
45
- exclusive = duration - frame.children_time
46
-
47
- if duration < MAX_ALLOWED_METRIC_DURATION
48
- if duration < 0
49
- ::OneApm::Agent.logger.log_once(:warn, "metric_duration_negative:#{first_name}",
50
- "Metric #{first_name} has negative duration: #{duration} s")
51
- end
52
-
53
- if exclusive < 0
54
- ::OneApm::Agent.logger.log_once(:warn, "metric_exclusive_negative:#{first_name}",
55
- "Metric #{first_name} has negative exclusive time: duration = #{duration} s, child_time = #{frame.children_time}")
56
- end
57
-
58
- record_metrics(state, first_name, metric_names, duration, exclusive, options)
59
- else
60
- ::OneApm::Agent.logger.log_once(:warn, "too_huge_metric:#{first_name}",
61
- "Ignoring metric #{first_name} with unacceptably large duration: #{duration} s")
62
- end
63
- end
37
+ return unless expected_frame
38
+
39
+ stack = state.traced_method_stack
40
+ create_metrics = options.has_key?(:metric) ? options[:metric] : true
41
+ frame = stack.pop_frame(state, expected_frame, first_name, t1, create_metrics)
42
+ return unless create_metrics
43
+
44
+ duration = t1 - t0
45
+ exclusive = duration - frame.children_time
46
+
47
+ if duration >= MAX_ALLOWED_METRIC_DURATION
48
+ ::OneApm::Agent.logger.log_once(:warn, "too_huge_metric:#{first_name}",
49
+ "Ignoring metric #{first_name} with unacceptably large duration: #{duration} s")
50
+ return
51
+ end
52
+
53
+ if duration < 0
54
+ ::OneApm::Agent.logger.log_once(:warn, "metric_duration_negative:#{first_name}",
55
+ "Metric #{first_name} has negative duration: #{duration} s")
64
56
  end
57
+
58
+ if exclusive < 0
59
+ ::OneApm::Agent.logger.log_once(:warn, "metric_exclusive_negative:#{first_name}",
60
+ "Metric #{first_name} has negative exclusive time: duration = #{duration} s, child_time = #{frame.children_time}")
61
+ end
62
+
63
+ record_metrics(state, first_name, metric_names, duration, exclusive, options)
65
64
  end
66
65
  end
67
66
 
@@ -241,25 +241,33 @@ module OneApm
241
241
  #
242
242
  # If not provided, the metric name will be <tt>Custom/ClassName/method_name</tt>.
243
243
  #
244
- # @param [Symbol] method_name the name of the method to trace
245
- # @param [String] metric_name_code the metric name to record calls to
246
- # the traced method under. This may be either a static string, or Ruby
247
- # code to be evaluated at call-time in order to determine the metric
248
- # name dynamically.
249
- # @param [Hash] options additional options controlling how the method is
250
- # traced.
251
- # @option options [Boolean] :push_scope (true) If false, the traced method will
252
- # not appear in transaction traces or breakdown charts, and it will
253
- # only be visible in custom dashboards.
254
- # @option options [Boolean] :metric (true) If false, the traced method will
255
- # only appear in transaction traces, but no metrics will be recorded
256
- # for it.
257
- # @option options [String] :code_header ('') Ruby code to be inserted and run
258
- # before the tracer begins timing.
259
- # @option options [String] :code_footer ('') Ruby code to be inserted and run
260
- # after the tracer stops timing.
244
+ # @param [Symbol] method_name
245
+ # the name of the method to trace
246
+ #
247
+ # @param [String] metric_name_code
248
+ # the metric name to record calls to the traced method under. This may
249
+ # be either a static string, or Ruby code to be evaluated at call-time
250
+ # in order to determine the metric name dynamically.
251
+ #
252
+ # @param [Hash] options
253
+ # additional options controlling how the method is traced.
254
+ #
255
+ # @option options [Boolean] :push_scope (true)
256
+ # If false, the traced method will not appear in transaction traces or
257
+ # breakdown charts, and it will only be visible in custom dashboards.
258
+ #
259
+ # @option options [Boolean] :metric (true)
260
+ # If false, the traced method will only appear in transaction traces,
261
+ # but no metrics will be recorded for it.
262
+ #
263
+ # @option options [String] :code_header ('')
264
+ # Ruby code to be inserted and run before the tracer begins timing.
265
+ #
266
+ # @option options [String] :code_footer ('')
267
+ # Ruby code to be inserted and run after the tracer stops timing.
261
268
  #
262
269
  # @example
270
+ #
263
271
  # add_method_tracer :foo
264
272
  #
265
273
  # # With a custom metric name
@@ -274,7 +282,7 @@ module OneApm
274
282
  #
275
283
  # @api public
276
284
  #
277
- def add_method_tracer(method_name, metric_name_code=nil, options = {})
285
+ def add_method_tracer(method_name, metric_name_code = nil, options = {})
278
286
  return unless oneapm_method_exists?(method_name)
279
287
  metric_name_code ||= default_metric_name_code(method_name)
280
288
  return if traced_method_exists?(method_name, metric_name_code)
@@ -1,5 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require 'forwardable'
3
4
  require 'one_apm/support/rules_engine/replacement_rule'
4
5
  require 'one_apm/support/rules_engine/segment_terms_rule'
5
6
 
@@ -209,9 +209,7 @@ module OneApm
209
209
  {
210
210
  :type => :http,
211
211
  :name => "Net::HTTP",
212
- :notes => [
213
- "Supported for all agent-supported versions of Ruby.",
214
- "For more information on supported HTTP clients see http://docs.oneapm.com/docs/ruby/ruby-http-clients."]
212
+ :notes => [ "Supported for all agent-supported versions of Ruby." ]
215
213
  },
216
214
 
217
215
  # Other
@@ -1,6 +1,6 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'one_apm/support/method_tracer/traced_method_stack'
3
+ require 'one_apm/support/traced_method_stack'
4
4
 
5
5
  module OneApm
6
6
 
@@ -222,22 +222,6 @@ module OneApm
222
222
  @instrumentation_state ||= {}
223
223
  end
224
224
 
225
- def with_database_metric_name(model, method)
226
- previous = self.instrumentation_state[:datastore_override]
227
- model_name = case model
228
- when Class
229
- model.name
230
- when String
231
- model
232
- else
233
- model.to_s
234
- end
235
- self.instrumentation_state[:datastore_override] = [method, model_name]
236
- yield
237
- ensure
238
- self.instrumentation_state[:datastore_override] = previous
239
- end
240
-
241
225
  def noticed_error_ids
242
226
  @noticed_error_ids ||= []
243
227
  end
@@ -310,27 +294,5 @@ module OneApm
310
294
  end
311
295
  end
312
296
 
313
- # Yield to a block that is run with a database metric name context. This means
314
- # the Database instrumentation will use this for the metric name if it does not
315
- # otherwise know about a model. This is re-entrant.
316
- #
317
- # * <tt>model</tt> is the DB model class
318
- # * <tt>method</tt> is the name of the finder method or other method to identify the operation with.
319
- #
320
- def with_database_metric_name(model, method)
321
- previous = @database_metric_name
322
- model_name = case model
323
- when Class
324
- model.name
325
- when String
326
- model
327
- else
328
- model.to_s
329
- end
330
- @database_metric_name = "ActiveRecord/#{model_name}/#{method}"
331
- yield
332
- ensure
333
- @database_metric_name = previous
334
- end
335
297
  end
336
298
  end
@@ -5,7 +5,7 @@ module OneApm
5
5
 
6
6
  MAJOR = 1
7
7
  MINOR = 1
8
- TINY = 1
8
+ TINY = 2
9
9
 
10
10
  STRING = [MAJOR, MINOR, TINY].compact.join('.')
11
11
 
@@ -12,7 +12,7 @@ module Sequel
12
12
  def make_tracer_method( opname, options )
13
13
  body = Proc.new do |*args, &block|
14
14
  classname = self.is_a?( Class ) ? self.name : self.class.name
15
- metric = "ActiveRecord/%s/%s" % [ classname, opname ]
15
+ metric = "Database/%s/%s" % [ classname, opname ]
16
16
  trace_execution_scoped( metric, options ) do
17
17
  super( *args, &block )
18
18
  end
@@ -41,13 +41,13 @@ module Sequel
41
41
  extend Sequel::Plugins::OneapmInstrumentation::MethodTracer
42
42
 
43
43
  add_method_tracer :delete
44
- add_method_tracer :destroy
44
+ add_method_tracer :destroy, :delete
45
45
  add_method_tracer :update
46
- add_method_tracer :update_all
47
- add_method_tracer :update_except
48
- add_method_tracer :update_fields
49
- add_method_tracer :update_only
50
- add_method_tracer :save
46
+ add_method_tracer :update_all, :update
47
+ add_method_tracer :update_except, :update
48
+ add_method_tracer :update_fields, :update
49
+ add_method_tracer :update_only, :update
50
+ add_method_tracer :save, :insert
51
51
 
52
52
  end
53
53
 
data/oneapm.yml CHANGED
@@ -2,116 +2,24 @@
2
2
  # OneApm RubyAgent Configuration
3
3
  #
4
4
 
5
- # Here are the settings that are common to all environments
6
5
  common: &default_settings
7
- # ============================== LICENSE KEY ===============================
8
6
 
9
- #
10
- # Get your license key from oneapm.com
11
- #
12
7
  license_key: 'please-paste-your-license-key-here'
13
8
 
14
- # Agent Enabled (Ruby/Rails Only)
15
- # Valid values are true, false and auto.
16
- #
17
- # agent_enabled: auto
18
-
19
9
  # This app_name will be the application name in oneapm.com in your account.
20
10
  #
21
- # Caution: If you change this name, a new application will appear in the OneApm
22
- # user interface with the new name, and data will stop reporting to the
23
- # app with the old name.
11
+ # If you change this name, a new application will appear in your account with
12
+ # the new name. and data will stop reporting to the app with the old name.
24
13
  #
25
14
  app_name: My Application
26
15
 
27
- # When "true", the agent collects performance data about your
28
- # application and reports this data to the OneApm service at
29
- # oneapm.com. This global switch is normally overridden for each
30
- # environment below. (formerly called 'enabled')
31
- monitor_mode: true
32
-
33
- # Specify its log level here.
34
- log_level: info
35
-
36
- # log_file_path: 'log'
37
- # log_file_name: 'oneapm_agent.log'
38
-
39
- # The oneapm agent communicates with the service via https by default.
40
- # ssl: true
41
-
42
- # ======================== Browser Monitoring =============================
43
- browser_monitoring:
44
- # By default the agent automatically injects the monitoring JavaScript
45
- # into web pages. Set this attribute to false to turn off this behavior.
46
- auto_instrument: true
47
-
48
- # Proxy settings for connecting to the OneApm server.
49
- #
50
- # proxy_host: hostname
51
- # proxy_port: 8080
52
- # proxy_user:
53
- # proxy_pass:
54
-
55
- # Tells transaction tracer and error collector (when enabled)
56
- # whether or not to capture HTTP params. When true, frameworks can
57
- # exclude HTTP parameters from being captured.
58
- # Rails: the RoR filter_parameter_logging excludes parameters
59
- capture_params: false
60
-
61
- # Transaction tracer captures deep information about slow
62
- # transactions and sends this to the OneApm service once a
63
- # minute. Included in the transaction is the exact call sequence of
64
- # the transactions including any SQL statements issued.
65
- transaction_tracer:
66
-
67
- # Transaction tracer is enabled by default.
68
- enabled: true
69
-
70
- # Threshold in seconds for when to collect a transaction
71
- # trace. When the response time of a controller action exceeds
72
- # this threshold, a transaction trace will be recorded and sent to
73
- # OneApm. Valid values are any float value, or (default) "apdex_f",
74
- # which will use the threshold for an dissatisfying Apdex
75
- # controller action - four times the Apdex T value.
76
- transaction_threshold: apdex_f
77
-
78
- # When transaction tracer is on, SQL statements can optionally be
79
- # recorded. The recorder has three modes, "off" which sends no
80
- # SQL, "raw" which sends the SQL statement in its original form,
81
- # and "obfuscated", which strips out numeric and string literals.
82
- record_sql: obfuscated
83
-
84
- # Threshold in seconds for when to collect stack trace for a SQL
85
- # call. In other words, when SQL statements exceed this threshold,
86
- # then capture and send to OneApm the current stack trace. This is
87
- # helpful for pinpointing where long SQL calls originate from.
88
- stack_trace_threshold: 0.500
89
-
90
- # Determines whether the agent will capture query plans for slow
91
- # SQL queries. Only supported in mysql and postgres. Should be
92
- # set to false when using other adapters.
93
- # explain_enabled: true
94
-
95
- # Threshold for query execution time below which query plans will
96
- # not be captured. Relevant only when `explain_enabled` is true.
97
- # explain_threshold: 0.5
98
-
99
- # Error collector captures information about uncaught exceptions and
100
- # sends them to OneApm for viewing
101
- error_collector:
102
-
103
- # Error collector is enabled by default.
104
- enabled: true
105
-
106
- # Ignore the following errors, add your own.
107
- ignore_errors: "ActionController::RoutingError,Sinatra::NotFound"
108
-
109
- # ===================== Application Environments ========================
110
- # Environment-specific settings are in this section.
111
- # For Rails applications, RAILS_ENV is used to determine the environment.
16
+ #
17
+ # Environment-specific settings
18
+ #
112
19
 
113
- # NOTE if your application has other named environments, you should
114
- # provide oneapm configuration settings for these environments here.
20
+ production:
21
+ <<: *default_settings
22
+ monitor_mode: true
115
23
 
116
24
  development:
117
25
  <<: *default_settings
@@ -123,11 +31,6 @@ test:
123
31
  <<: *default_settings
124
32
  monitor_mode: false
125
33
 
126
- # Turn on the agent in production for 24x7 monitoring.
127
- production:
128
- <<: *default_settings
129
- monitor_mode: true
130
-
131
34
  # Staging environment which behaves identically to production.
132
35
  staging:
133
36
  <<: *default_settings
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oneapm_rpm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 1.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - oneapm
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-01 00:00:00.000000000 Z
11
+ date: 2015-06-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -247,6 +247,7 @@ files:
247
247
  - lib/one_apm/agent/datastores/mongo/statement_formatter.rb
248
248
  - lib/one_apm/agent/event/event_listener.rb
249
249
  - lib/one_apm/agent/event/event_loop.rb
250
+ - lib/one_apm/agent/event/timer.rb
250
251
  - lib/one_apm/agent/event/worker_loop.rb
251
252
  - lib/one_apm/agent/harvester.rb
252
253
  - lib/one_apm/agent/inbound_request_monitor.rb
@@ -308,6 +309,7 @@ files:
308
309
  - lib/one_apm/inst/background_job/active_job.rb
309
310
  - lib/one_apm/inst/background_job/delayed_job.rb
310
311
  - lib/one_apm/inst/background_job/delayed_job_injection.rb
312
+ - lib/one_apm/inst/background_job/event_machine_standalone.rb
311
313
  - lib/one_apm/inst/background_job/resque.rb
312
314
  - lib/one_apm/inst/background_job/sidekiq.rb
313
315
  - lib/one_apm/inst/dispatcher/passenger.rb
@@ -330,7 +332,6 @@ files:
330
332
  - lib/one_apm/inst/nosql/redis.rb
331
333
  - lib/one_apm/inst/orm/active_record.rb
332
334
  - lib/one_apm/inst/orm/active_record_4.rb
333
- - lib/one_apm/inst/orm/data_mapper.rb
334
335
  - lib/one_apm/inst/orm/sequel.rb
335
336
  - lib/one_apm/inst/rack.rb
336
337
  - lib/one_apm/inst/rack/rack.rb
@@ -393,7 +394,6 @@ files:
393
394
  - lib/one_apm/support/marshaller.rb
394
395
  - lib/one_apm/support/method_tracer.rb
395
396
  - lib/one_apm/support/method_tracer/helpers.rb
396
- - lib/one_apm/support/method_tracer/traced_method_stack.rb
397
397
  - lib/one_apm/support/obfuscator.rb
398
398
  - lib/one_apm/support/okjson.rb
399
399
  - lib/one_apm/support/parameter_filtering.rb
@@ -404,6 +404,7 @@ files:
404
404
  - lib/one_apm/support/supported_versions.rb
405
405
  - lib/one_apm/support/system_info.rb
406
406
  - lib/one_apm/support/timer_lib.rb
407
+ - lib/one_apm/support/traced_method_stack.rb
407
408
  - lib/one_apm/support/version_number.rb
408
409
  - lib/one_apm/support/vm.rb
409
410
  - lib/one_apm/support/vm/jruby_vm.rb
@@ -1,180 +0,0 @@
1
- # encoding: utf-8
2
-
3
- LibraryDetection.defer do
4
- @name = :data_mapper
5
-
6
- depends_on do
7
- defined?(::DataMapper)
8
- end
9
-
10
- depends_on do
11
- defined?(DataMapper::Model)
12
- end
13
-
14
- depends_on do
15
- defined?(DataMapper::Resource)
16
- end
17
-
18
- depends_on do
19
- defined?(DataMapper::Collection)
20
- end
21
-
22
- executes do
23
- ::OneApm::Agent.logger.info 'Installing DataMapper instrumentation'
24
- end
25
-
26
- executes do
27
- DataMapper::Model.class_eval do
28
- add_method_tracer :get, 'ActiveRecord/#{self.name}/get'
29
- add_method_tracer :first, 'ActiveRecord/#{self.name}/first'
30
- add_method_tracer :last, 'ActiveRecord/#{self.name}/last'
31
- add_method_tracer :all, 'ActiveRecord/#{self.name}/all'
32
-
33
- add_method_tracer :create, 'ActiveRecord/#{self.name}/create'
34
- add_method_tracer :create!, 'ActiveRecord/#{self.name}/create'
35
- add_method_tracer :update, 'ActiveRecord/#{self.name}/update'
36
- add_method_tracer :update!, 'ActiveRecord/#{self.name}/update'
37
- add_method_tracer :destroy, 'ActiveRecord/#{self.name}/destroy'
38
- add_method_tracer :destroy!, 'ActiveRecord/#{self.name}/destroy'
39
-
40
- # For dm-aggregates and partial dm-ar-finders support:
41
- for method in [ :aggregate, :find, :find_by_sql ] do
42
- next unless method_defined? method
43
- add_method_tracer(method, 'ActiveRecord/#{self.name}/' + method.to_s)
44
- end
45
-
46
- end
47
- end
48
-
49
- executes do
50
- DataMapper::Resource.class_eval do
51
- add_method_tracer :update, 'ActiveRecord/#{self.class.name[/[^:]*$/]}/update'
52
- add_method_tracer :update!, 'ActiveRecord/#{self.class.name[/[^:]*$/]}/update'
53
- add_method_tracer :save, 'ActiveRecord/#{self.class.name[/[^:]*$/]}/save'
54
- add_method_tracer :save!, 'ActiveRecord/#{self.class.name[/[^:]*$/]}/save'
55
- add_method_tracer :destroy, 'ActiveRecord/#{self.class.name[/[^:]*$/]}/destroy'
56
- add_method_tracer :destroy!, 'ActiveRecord/#{self.class.name[/[^:]*$/]}/destroy'
57
-
58
- end
59
- end
60
-
61
- executes do
62
- DataMapper::Collection.class_eval do
63
- # DM's Collection instance methods
64
- add_method_tracer :get, 'ActiveRecord/#{self.name}/get'
65
- add_method_tracer :first, 'ActiveRecord/#{self.name}/first'
66
- add_method_tracer :last, 'ActiveRecord/#{self.name}/last'
67
- add_method_tracer :all, 'ActiveRecord/#{self.name}/all'
68
-
69
- add_method_tracer :lazy_load, 'ActiveRecord/#{self.name}/lazy_load'
70
-
71
- add_method_tracer :create, 'ActiveRecord/#{self.name}/create'
72
- add_method_tracer :create!, 'ActiveRecord/#{self.name}/create'
73
- add_method_tracer :update, 'ActiveRecord/#{self.name}/update'
74
- add_method_tracer :update!, 'ActiveRecord/#{self.name}/update'
75
- add_method_tracer :destroy, 'ActiveRecord/#{self.name}/destroy'
76
- add_method_tracer :destroy!, 'ActiveRecord/#{self.name}/destroy'
77
-
78
- # For dm-aggregates support:
79
- for method in [ :aggregate ] do
80
- next unless method_defined? method
81
- add_method_tracer(method, 'ActiveRecord/#{self.name}/' + method.to_s)
82
- end
83
-
84
- end
85
- end
86
- end
87
-
88
- LibraryDetection.defer do
89
-
90
- depends_on do
91
- defined?(DataMapper) && defined?(DataMapper::Adapters) && defined?(DataMapper::Adapters::DataObjectsAdapter)
92
- end
93
-
94
- executes do
95
-
96
- DataMapper::Adapters::DataObjectsAdapter.class_eval do
97
-
98
- add_method_tracer :select, 'ActiveRecord/#{self.class.name[/[^:]*$/]}/select'
99
- add_method_tracer :execute, 'ActiveRecord/#{self.class.name[/[^:]*$/]}/execute'
100
-
101
- end
102
- end
103
- end
104
-
105
- LibraryDetection.defer do
106
-
107
- depends_on do
108
- defined?(DataMapper) && defined?(DataMapper::Validations) && defined?(DataMapper::Validations::ClassMethods)
109
- end
110
-
111
- executes do
112
- DataMapper::Validations::ClassMethods.class_eval do
113
- next unless method_defined? :create
114
- add_method_tracer :create, 'ActiveRecord/#{self.name}/create'
115
- end
116
- end
117
- end
118
-
119
- LibraryDetection.defer do
120
-
121
- depends_on do
122
- defined?(DataMapper) && defined?(DataMapper::Transaction)
123
- end
124
-
125
- executes do
126
- DataMapper::Transaction.module_eval do
127
- add_method_tracer :commit, 'ActiveRecord/#{self.class.name[/[^:]*$/]}/commit'
128
- end
129
- end
130
-
131
- end
132
-
133
- module OneApm
134
- module Agent
135
- module Instrumentation
136
- module DataMapperInstrumentation
137
-
138
- def log(msg) #THREAD_LOCAL_ACCESS
139
- state = OneApm::TransactionState.tl_get
140
- return unless state.is_execution_traced?
141
- return unless operation = case OneApm::Helper.correctly_encoded(msg.query)
142
- when /^\s*select/i then 'find'
143
- when /^\s*(update|insert)/i then 'save'
144
- when /^\s*delete/i then 'destroy'
145
- else nil
146
- end
147
-
148
- # FYI: self.to_s will yield connection URI string.
149
- duration = msg.duration / 1000000.0
150
-
151
- # Attach SQL to current segment/scope.
152
- OneApm::Agent.instance.transaction_sampler.notice_sql(msg.query, nil, duration, state)
153
-
154
- # Record query duration associated with each of the desired metrics.
155
- metric = "ActiveRecord/#{operation}"
156
- rollup_metrics = ActiveRecordHelper.rollup_metrics_for(metric)
157
- metrics = [metric] + rollup_metrics
158
- OneApm::Agent.instance.stats_engine.tl_record_unscoped_metrics(metrics, duration)
159
- ensure
160
- super
161
- end
162
-
163
- end
164
- end
165
- end
166
- end
167
-
168
- LibraryDetection.defer do
169
-
170
- depends_on do
171
- defined?(DataObjects) && defined?(DataObjects::Connection)
172
- end
173
-
174
- executes do
175
- DataObjects::Connection.class_eval do
176
- include ::OneApm::Agent::Instrumentation::DataMapperInstrumentation
177
- end
178
- end
179
-
180
- end