netuitive_rails_agent 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,6 +12,7 @@ NetuitiveRailsAgent::ConfigManager.load_config
12
12
  NetuitiveRailsAgent::NetuitiveLogger.setup
13
13
  NetuitiveRailsAgent::ConfigManager.read_config
14
14
 
15
+ require 'netuitive_rails_agent/error_logger'
15
16
  require 'netuitive_rails_agent/api_interaction'
16
17
  require 'netuitive_rails_agent/controller_utils'
17
18
  require 'netuitive_rails_agent/error_utils'
@@ -28,19 +29,20 @@ require 'netuitive_rails_agent/gc'
28
29
  require 'netuitive_rails_agent/objectspace'
29
30
  require 'netuitive_rails_agent/scheduler'
30
31
 
31
- # subscribe to notifications
32
- interaction = NetuitiveRailsAgent::ApiInteraction.new
33
- NetuitiveRailsAgent::ActionControllerSub.new(interaction).subscribe if NetuitiveRailsAgent::ConfigManager.action_controller_enabled
34
- NetuitiveRailsAgent::ActiveRecordSub.new(interaction).subscribe if NetuitiveRailsAgent::ConfigManager.active_record_enabled
35
- NetuitiveRailsAgent::ActionViewSub.new(interaction).subscribe if NetuitiveRailsAgent::ConfigManager.action_view_enabled
36
- NetuitiveRailsAgent::ActionMailerSub.new(interaction).subscribe if NetuitiveRailsAgent::ConfigManager.action_mailer_enabled
37
- NetuitiveRailsAgent::ActiveSupportSub.new(interaction).subscribe if NetuitiveRailsAgent::ConfigManager.active_support_enabled
38
- NetuitiveRailsAgent::ActiveJobSub.new(interaction).subscribe if NetuitiveRailsAgent::ConfigManager.active_job_enabled
32
+ NetuitiveRailsAgent::ErrorLogger.guard('error during agent installation') do # subscribe to notifications
33
+ interaction = NetuitiveRailsAgent::ApiInteraction.new
34
+ NetuitiveRailsAgent::ActionControllerSub.new(interaction).subscribe if NetuitiveRailsAgent::ConfigManager.action_controller_enabled
35
+ NetuitiveRailsAgent::ActiveRecordSub.new(interaction).subscribe if NetuitiveRailsAgent::ConfigManager.active_record_enabled
36
+ NetuitiveRailsAgent::ActionViewSub.new(interaction).subscribe if NetuitiveRailsAgent::ConfigManager.action_view_enabled
37
+ NetuitiveRailsAgent::ActionMailerSub.new(interaction).subscribe if NetuitiveRailsAgent::ConfigManager.action_mailer_enabled
38
+ NetuitiveRailsAgent::ActiveSupportSub.new(interaction).subscribe if NetuitiveRailsAgent::ConfigManager.active_support_enabled
39
+ NetuitiveRailsAgent::ActiveJobSub.new(interaction).subscribe if NetuitiveRailsAgent::ConfigManager.active_job_enabled
39
40
 
40
- # start metrics that are collected on a schedule
41
- NetuitiveRailsAgent::Scheduler.new(interaction).start_schedule if NetuitiveRailsAgent::ConfigManager.gc_enabled || NetuitiveRailsAgent::ConfigManager.object_space_enabled
41
+ # start metrics that are collected on a schedule
42
+ NetuitiveRailsAgent::Scheduler.new(interaction).start_schedule if NetuitiveRailsAgent::ConfigManager.gc_enabled || NetuitiveRailsAgent::ConfigManager.object_space_enabled
42
43
 
43
- # sidekiq
44
- NetuitiveRailsAgent::SidekiqTracker.new.setup if NetuitiveRailsAgent::ConfigManager.sidekiq_enabled
44
+ # sidekiq
45
+ NetuitiveRailsAgent::SidekiqTracker.new.setup if NetuitiveRailsAgent::ConfigManager.sidekiq_enabled
45
46
 
46
- NetuitiveRailsAgent::NetuitiveLogger.log.info 'Netuitive rails agent installed'
47
+ NetuitiveRailsAgent::NetuitiveLogger.log.info 'Netuitive rails agent installed'
48
+ end
@@ -45,21 +45,23 @@ module NetuitiveRailsAgent
45
45
  end
46
46
 
47
47
  def process_action(*args)
48
- event = ActiveSupport::Notifications::Event.new(*args)
49
- controller = event.payload[:controller].to_s
50
- action = event.payload[:action].to_s
51
- interaction.add_sample("action_controller.#{controller}.#{action}.request.total_duration", event.duration)
52
- interaction.add_sample("action_controller.#{controller}.#{action}.request.query_time", event.payload[:db_runtime])
53
- interaction.add_sample("action_controller.#{controller}.#{action}.request.view_time", event.payload[:view_runtime])
54
- interaction.add_sample("action_controller.#{controller}.request.total_duration", event.duration)
55
- interaction.add_sample("action_controller.#{controller}.request.query_time", event.payload[:db_runtime])
56
- interaction.add_sample("action_controller.#{controller}.request.view_time", event.payload[:view_runtime])
57
- interaction.add_sample('action_controller.request.total_duration', event.duration)
58
- interaction.add_sample('action_controller.request.query_time', event.payload[:db_runtime])
59
- interaction.add_sample('action_controller.request.view_time', event.payload[:view_runtime])
60
- interaction.aggregate_metric("action_controller.#{controller}.#{action}.total_requests", 1)
61
- interaction.aggregate_metric("action_controller.#{controller}.total_requests", 1)
62
- interaction.aggregate_metric('action_controller.total_requests', 1)
48
+ NetuitiveRailsAgent::ErrorLogger.guard('error during process_action') do
49
+ event = ActiveSupport::Notifications::Event.new(*args)
50
+ controller = event.payload[:controller].to_s
51
+ action = event.payload[:action].to_s
52
+ interaction.add_sample("action_controller.#{controller}.#{action}.request.total_duration", event.duration)
53
+ interaction.add_sample("action_controller.#{controller}.#{action}.request.query_time", event.payload[:db_runtime])
54
+ interaction.add_sample("action_controller.#{controller}.#{action}.request.view_time", event.payload[:view_runtime])
55
+ interaction.add_sample("action_controller.#{controller}.request.total_duration", event.duration)
56
+ interaction.add_sample("action_controller.#{controller}.request.query_time", event.payload[:db_runtime])
57
+ interaction.add_sample("action_controller.#{controller}.request.view_time", event.payload[:view_runtime])
58
+ interaction.add_sample('action_controller.request.total_duration', event.duration)
59
+ interaction.add_sample('action_controller.request.query_time', event.payload[:db_runtime])
60
+ interaction.add_sample('action_controller.request.view_time', event.payload[:view_runtime])
61
+ interaction.aggregate_metric("action_controller.#{controller}.#{action}.total_requests", 1)
62
+ interaction.aggregate_metric("action_controller.#{controller}.total_requests", 1)
63
+ interaction.aggregate_metric('action_controller.total_requests', 1)
64
+ end
63
65
  end
64
66
 
65
67
  def write_fragment
@@ -15,15 +15,19 @@ module NetuitiveRailsAgent
15
15
  end
16
16
 
17
17
  def receive(*args)
18
- event = ActiveSupport::Notifications::Event.new(*args)
19
- mailer = event.payload[:mailer].to_s
20
- interaction.aggregate_metric("action_mailer.#{mailer}.receive", 1)
18
+ NetuitiveRailsAgent::ErrorLogger.guard('error during stop_server') do
19
+ event = ActiveSupport::Notifications::Event.new(*args)
20
+ mailer = event.payload[:mailer].to_s
21
+ interaction.aggregate_metric("action_mailer.#{mailer}.receive", 1)
22
+ end
21
23
  end
22
24
 
23
25
  def deliver(*args)
24
- event = ActiveSupport::Notifications::Event.new(*args)
25
- mailer = event.payload[:mailer].to_s
26
- interaction.aggregate_metric("action_mailer.#{mailer}.deliver", 1)
26
+ NetuitiveRailsAgent::ErrorLogger.guard('error during deliver') do
27
+ event = ActiveSupport::Notifications::Event.new(*args)
28
+ mailer = event.payload[:mailer].to_s
29
+ interaction.aggregate_metric("action_mailer.#{mailer}.deliver", 1)
30
+ end
27
31
  end
28
32
  end
29
33
  end
@@ -5,39 +5,57 @@ module NetuitiveRailsAgent
5
5
  end
6
6
 
7
7
  def add_sample(metric_id, val)
8
- NetuitiveRubyAPI.add_sample(metric_id, val)
8
+ NetuitiveRailsAgent::ErrorLogger.guard('error during add_sample') do
9
+ NetuitiveRubyAPI.add_sample(metric_id, val)
10
+ end
9
11
  end
10
12
 
11
13
  def add_counter_sample(metric_id, val)
12
- NetuitiveRubyAPI.add_counter_sample(metric_id, val)
14
+ NetuitiveRailsAgent::ErrorLogger.guard('error during add_counter_sample') do
15
+ NetuitiveRubyAPI.add_counter_sample(metric_id, val)
16
+ end
13
17
  end
14
18
 
15
19
  def aggregate_metric(metric_id, val)
16
- NetuitiveRubyAPI.aggregate_metric(metric_id, val)
20
+ NetuitiveRailsAgent::ErrorLogger.guard('error during aggregate_metric') do
21
+ NetuitiveRubyAPI.aggregate_metric(metric_id, val)
22
+ end
17
23
  end
18
24
 
19
25
  def aggregate_counter_metric(metric_id, val)
20
- NetuitiveRubyAPI.aggregate_counter_metric(metric_id, val)
26
+ NetuitiveRailsAgent::ErrorLogger.guard('error during aggregate_counter_metric') do
27
+ NetuitiveRubyAPI.aggregate_counter_metric(metric_id, val)
28
+ end
21
29
  end
22
30
 
23
31
  def clear_metrics
24
- NetuitiveRubyAPI.clear_metrics
32
+ NetuitiveRailsAgent::ErrorLogger.guard('error during clear_metrics') do
33
+ NetuitiveRubyAPI.clear_metrics
34
+ end
25
35
  end
26
36
 
27
37
  def interval
28
- NetuitiveRubyAPI.interval
38
+ NetuitiveRailsAgent::ErrorLogger.guard('error during interval') do
39
+ NetuitiveRubyAPI.interval
40
+ end
29
41
  end
30
42
 
31
43
  def event(message, timestamp = Time.new, title = 'Ruby Event', level = 'Info', source = 'Ruby Agent', type = 'INFO', tags = nil)
32
- NetuitiveRubyAPI.event(message, timestamp, title, level, source, type, tags)
44
+ NetuitiveRailsAgent::ErrorLogger.guard('error during event') do
45
+ NetuitiveRubyAPI.event(message, timestamp, title, level, source, type, tags)
46
+ end
33
47
  end
34
48
 
35
49
  def exception_event(exception, klass = nil, tags = nil)
36
- NetuitiveRubyAPI.exception_event(exception, klass, tags)
50
+ NetuitiveRailsAgent::ErrorLogger.guard('error during exception_event') do
51
+ NetuitiveRubyAPI.exception_event(exception, klass, tags)
52
+ end
37
53
  end
38
54
 
39
55
  def stop_server
40
- NetuitiveRubyAPI.stop_server
56
+ NetuitiveRailsAgent::ErrorLogger.guard('error during stop_server') do
57
+ NetuitiveRubyAPI.stop_server
58
+ end
41
59
  end
42
60
  end
43
61
  end
@@ -1,8 +1,10 @@
1
1
  module NetuitiveRailsAgent
2
2
  module ControllerUtils
3
3
  def netuitive_action_name
4
- return controller.action_name if defined? controller # rails 3.1.X
5
- action_name # rails 4.X
4
+ NetuitiveRailsAgent::ErrorLogger.guard('error during netuitive_action_name') do
5
+ return controller.action_name if defined? controller # rails 3.1.X
6
+ action_name # rails 4.X
7
+ end
6
8
  end
7
9
 
8
10
  def netuitive_controller_name
@@ -10,8 +12,10 @@ module NetuitiveRailsAgent
10
12
  end
11
13
 
12
14
  def netuitive_request_uri
13
- return request.fullpath if defined? request.fullpath # rails 3
14
- request.original_fullpath # rails >3.2
15
+ NetuitiveRailsAgent::ErrorLogger.guard('error during netuitive_request_uri') do
16
+ return request.fullpath if defined? request.fullpath # rails 3
17
+ request.original_fullpath # rails >3.2
18
+ end
15
19
  end
16
20
  end
17
21
  end
@@ -0,0 +1,21 @@
1
+ # Important! ruby rescue logic is expensive.
2
+ # This class is *intended* to be used as a catch all, because we don't want any errors to not be logged
3
+ # or worse to bubble up to the host application.
4
+ # That *doesn't* mean we should be throwing exceptions rather than guarding against them
5
+ # From the benchmarks I've read it seems like rescues are free if no exception is thrown
6
+ module NetuitiveRailsAgent
7
+ class ErrorLogger
8
+ class << self
9
+ def guard(message)
10
+ yield
11
+ rescue => e
12
+ NetuitiveRailsAgent::NetuitiveLogger.log.error format_exception(e, message)
13
+ end
14
+
15
+ def format_exception(exception, *message)
16
+ message = '' unless defined? message || message.nil?
17
+ "#{message} \n\tException message: #{exception.message}\n\t Backtrace: #{exception.backtrace.join("\n\t")}"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -9,7 +9,7 @@ module NetuitiveRailsAgent
9
9
  included do
10
10
  NetuitiveRailsAgent::NetuitiveLogger.log.debug 'ErrorTracker included'
11
11
  rescue_from Exception do |exception|
12
- begin
12
+ NetuitiveRailsAgent::ErrorLogger.guard('error during ErrorTrackerHook') do
13
13
  tags = {
14
14
  URI: netuitive_request_uri,
15
15
  Controller: netuitive_controller_name,
@@ -23,8 +23,6 @@ module NetuitiveRailsAgent
23
23
  end
24
24
  end
25
25
  handle_error(exception, metrics, tags)
26
- rescue => e
27
- NetuitiveRailsAgent::NetuitiveLogger.log.error "exception during controller error tracking: message:#{e.message} backtrace:#{e.backtrace}"
28
26
  end
29
27
  raise exception
30
28
  end
@@ -3,15 +3,17 @@ module NetuitiveRailsAgent
3
3
  attr_accessor :interaction
4
4
 
5
5
  def ignored_error?(exception)
6
- unless NetuitiveRailsAgent::ConfigManager.ignored_errors.empty?
7
- NetuitiveRailsAgent::ConfigManager.ignored_errors.each do |name|
8
- if name.include? '^'
9
- name.tr!('^', '')
10
- exception.class.ancestors.each do |ancestor|
11
- return true if name.casecmp(ancestor.name).zero?
6
+ NetuitiveRailsAgent::ErrorLogger.guard('error during ignored_error?') do
7
+ unless NetuitiveRailsAgent::ConfigManager.ignored_errors.empty?
8
+ NetuitiveRailsAgent::ConfigManager.ignored_errors.each do |name|
9
+ if name.include? '^'
10
+ name.tr!('^', '')
11
+ exception.class.ancestors.each do |ancestor|
12
+ return true if name.casecmp(ancestor.name).zero?
13
+ end
14
+ elsif name.casecmp(exception.class.name).zero?
15
+ return true
12
16
  end
13
- elsif name.casecmp(exception.class.name).zero?
14
- return true
15
17
  end
16
18
  end
17
19
  end
@@ -19,23 +21,23 @@ module NetuitiveRailsAgent
19
21
  end
20
22
 
21
23
  def handle_error(exception, metrics = [], tags = {})
22
- NetuitiveRailsAgent::NetuitiveLogger.log.debug "received error: #{exception}"
23
- unless ignored_error?(exception)
24
- @interaction = NetuitiveRailsAgent::ApiInteraction.new unless @interaction
25
- NetuitiveRailsAgent::NetuitiveLogger.log.debug "#{exception} wasn't ignored"
26
- if NetuitiveRailsAgent::ConfigManager.capture_errors
27
- NetuitiveRailsAgent::NetuitiveLogger.log.debug "sending error: #{exception}"
28
- @interaction.exception_event(exception, exception.class, tags)
29
- NetuitiveRailsAgent::NetuitiveLogger.log.debug 'sent error'
30
- end
31
- NetuitiveRailsAgent::NetuitiveLogger.log.debug 'sending error metrics'
32
- metrics.each do |metric|
33
- @interaction.aggregate_metric(metric.to_s, 1)
34
- NetuitiveRailsAgent::NetuitiveLogger.log.debug "sent error metric with name: #{metric}"
24
+ NetuitiveRailsAgent::ErrorLogger.guard('error during handle_error') do
25
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug "received error: #{exception}"
26
+ unless ignored_error?(exception)
27
+ @interaction = NetuitiveRailsAgent::ApiInteraction.new unless @interaction
28
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug "#{exception} wasn't ignored"
29
+ if NetuitiveRailsAgent::ConfigManager.capture_errors
30
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug "sending error: #{exception}"
31
+ @interaction.exception_event(exception, exception.class, tags)
32
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug 'sent error'
33
+ end
34
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug 'sending error metrics'
35
+ metrics.each do |metric|
36
+ @interaction.aggregate_metric(metric.to_s, 1)
37
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug "sent error metric with name: #{metric}"
38
+ end
35
39
  end
36
40
  end
37
- rescue => e
38
- NetuitiveRailsAgent::NetuitiveLogger.log.error "exception during error tracking: message:#{e.message} backtrace:#{e.backtrace}"
39
41
  end
40
42
  end
41
43
  end
@@ -10,23 +10,21 @@ module NetuitiveRailsAgent
10
10
  NetuitiveRailsAgent::NetuitiveLogger.log.warn 'gc profiler not enabled'
11
11
  return
12
12
  end
13
- begin
14
- NetuitiveRailsAgent::NetuitiveLogger.log.debug 'collecting gc metrics'
15
- GC.stat.each do |key, value|
16
- NetuitiveRailsAgent::NetuitiveLogger.log.debug "GC stat key: #{key}"
17
- if (key.to_s == 'total_allocated_object') || (key.to_s == 'total_freed_object') || (key.to_s == 'count')
18
- NetuitiveRailsAgent::NetuitiveLogger.log.debug "sending aggregateCounterMetric GC.stat.#{key}"
19
- interaction.aggregate_counter_metric("GC.stat.#{key}", value)
20
- else
21
- NetuitiveRailsAgent::NetuitiveLogger.log.debug "sending aggregateMetric GC.stat.#{key}"
22
- interaction.aggregate_metric("GC.stat.#{key}", value)
23
- end
13
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug 'collecting gc metrics'
14
+ NetuitiveRailsAgent::ErrorLogger.guard('error during collecting gc metrics') do
15
+ GC.stat.each do |key, value|
16
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug "GC stat key: #{key}"
17
+ if (key.to_s == 'total_allocated_object') || (key.to_s == 'total_freed_object') || (key.to_s == 'count')
18
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug "sending aggregateCounterMetric GC.stat.#{key}"
19
+ interaction.aggregate_counter_metric("GC.stat.#{key}", value)
20
+ else
21
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug "sending aggregateMetric GC.stat.#{key}"
22
+ interaction.aggregate_metric("GC.stat.#{key}", value)
24
23
  end
25
- NetuitiveRailsAgent::NetuitiveLogger.log.debug 'sending aggregateCounterMetric GC.profiler.total_time'
26
- interaction.aggregate_counter_metric('GC.profiler.total_time', GC::Profiler.total_time)
27
- rescue => e
28
- NetuitiveRailsAgent::NetuitiveLogger.log.error "exception during gc collection: message:#{e.message} backtrace:#{e.backtrace}"
29
24
  end
25
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug 'sending aggregateCounterMetric GC.profiler.total_time'
26
+ interaction.aggregate_counter_metric('GC.profiler.total_time', GC::Profiler.total_time)
27
+ end
30
28
  NetuitiveRailsAgent::NetuitiveLogger.log.debug 'finished collecting gc metrics'
31
29
  end
32
30
  end
@@ -7,13 +7,13 @@ module NetuitiveRailsAgent
7
7
 
8
8
  def collect
9
9
  NetuitiveRailsAgent::NetuitiveLogger.log.debug 'collecting object space metrics'
10
- ObjectSpace.count_objects.each do |key, value|
11
- NetuitiveRailsAgent::NetuitiveLogger.log.debug "ObjectSpace.count_objects.#{key}"
12
- interaction.aggregate_metric("ObjectSpace.count_objects.#{key}", value)
10
+ NetuitiveRailsAgent::ErrorLogger.guard('error during collecting object space metrics') do
11
+ ObjectSpace.count_objects.each do |key, value|
12
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug "ObjectSpace.count_objects.#{key}"
13
+ interaction.aggregate_metric("ObjectSpace.count_objects.#{key}", value)
14
+ end
13
15
  end
14
16
  NetuitiveRailsAgent::NetuitiveLogger.log.debug 'finished collecting object space metrics'
15
- rescue => e
16
- NetuitiveRailsAgent::NetuitiveLogger.log.error "exception during object space collection: message:#{e.message} backtrace:#{e.backtrace}"
17
17
  end
18
18
  end
19
19
  end
@@ -9,30 +9,32 @@ module NetuitiveRailsAgent
9
9
  ].freeze
10
10
 
11
11
  def self.header_start_time(headers)
12
- if headers
13
- start_time = nil
14
- HEADERS_NAMES.each do |header_name|
15
- header = headers[header_name]
16
- next if header.nil?
17
- match = /\d+(\.\d{1,2})?/.match(header)
18
- if match.nil?
19
- NetuitiveRailsAgent::NetuitiveLogger.log.error "queue time header value #{header} is not recognized"
20
- next
12
+ NetuitiveRailsAgent::ErrorLogger.guard('error during header_start_time') do
13
+ if headers
14
+ start_time = nil
15
+ HEADERS_NAMES.each do |header_name|
16
+ header = headers[header_name]
17
+ next if header.nil?
18
+ match = /\d+(\.\d{1,2})?/.match(header)
19
+ if match.nil?
20
+ NetuitiveRailsAgent::NetuitiveLogger.log.error "queue time header value #{header} is not recognized"
21
+ next
22
+ end
23
+ header_time = match.to_s.to_f / NetuitiveRailsAgent::ConfigManager.queue_time_divisor
24
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug "queue header_time: #{header_time}"
25
+ start_time = start_time.nil? || header_time < start_time ? header_time : start_time
26
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug "queue start_time: #{start_time}"
21
27
  end
22
- header_time = match.to_s.to_f / NetuitiveRailsAgent::ConfigManager.queue_time_divisor
23
- NetuitiveRailsAgent::NetuitiveLogger.log.debug "queue header_time: #{header_time}"
24
- start_time = start_time.nil? || header_time < start_time ? header_time : start_time
25
- NetuitiveRailsAgent::NetuitiveLogger.log.debug "queue start_time: #{start_time}"
28
+ return nil if start_time.nil?
29
+ return (Time.now.to_f - start_time) * 1000.0
26
30
  end
27
- return nil if start_time.nil?
28
- return (Time.now.to_f - start_time) * 1000.0
29
31
  end
30
32
  nil
31
33
  end
32
34
 
33
35
  def netuitive_request_hook
34
36
  return unless request
35
- begin
37
+ NetuitiveRailsAgent::ErrorLogger.guard('error during netuitive_request_hook') do
36
38
  queue_time = NetuitiveRailsAgent::RequestDataHook.header_start_time(request.headers)
37
39
  if queue_time.nil?
38
40
  NetuitiveRailsAgent::NetuitiveLogger.log.info 'no queue time header found for request'
@@ -47,8 +49,6 @@ module NetuitiveRailsAgent
47
49
  return unless netuitive_action_name
48
50
  NetuitiveRailsAgent::NetuitiveLogger.log.debug "sending queue_time metrics with netuitive_action_name #{netuitive_action_name}"
49
51
  NetuitiveRubyAPI.add_sample("action_controller.#{netuitive_controller_name}.#{netuitive_action_name}.request.queue_time", queue_time)
50
- rescue => e
51
- NetuitiveRailsAgent::NetuitiveLogger.log.error "exception during request tracking: message:#{e.message} backtrace:#{e.backtrace}"
52
52
  end
53
53
  end
54
54
  end
@@ -13,13 +13,11 @@ module NetuitiveRailsAgent
13
13
  NetuitiveRailsAgent::NetuitiveLogger.log.debug 'starting schedule'
14
14
  Thread.new do
15
15
  loop do
16
- begin
16
+ NetuitiveRailsAgent::ErrorLogger.guard('error during schedule') do
17
17
  collect_metrics
18
18
  sleep_time = interval
19
19
  NetuitiveRailsAgent::NetuitiveLogger.log.debug "scheduler sleeping for: #{sleep_time}"
20
20
  sleep(sleep_time)
21
- rescue => e
22
- NetuitiveRailsAgent::NetuitiveLogger.log.error "error during schedule: #{e.message}, backtrace: #{e.backtrace}"
23
21
  end
24
22
  end
25
23
  end
@@ -32,13 +30,12 @@ module NetuitiveRailsAgent
32
30
  end
33
31
 
34
32
  def collect_metrics
35
- NetuitiveRailsAgent::NetuitiveLogger.log.debug 'collecting schedule metrics'
36
- begin
33
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug 'start collecting schedule metrics'
34
+ NetuitiveRailsAgent::ErrorLogger.guard('error during collect_metrics') do
37
35
  gc_stats_collector.collect if NetuitiveRailsAgent::ConfigManager.gc_enabled
38
36
  object_space_collector.collect if NetuitiveRailsAgent::ConfigManager.object_space_enabled
39
- rescue => e
40
- NetuitiveRailsAgent::NetuitiveLogger.log.error "unable to collect schedule metrics: message:#{e.message} backtrace:#{e.backtrace}"
41
37
  end
38
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug 'finshed collecting schedule metrics'
42
39
  end
43
40
  end
44
41
  end
@@ -2,14 +2,16 @@ module NetuitiveRailsAgent
2
2
  class SidekiqTracker
3
3
  def setup
4
4
  NetuitiveRailsAgent::NetuitiveLogger.log.debug 'turning on sidekiq tracking'
5
- require 'sidekiq'
6
- Sidekiq.configure_server do |config|
7
- config.error_handlers << proc { |ex, ctx_hash| NetuitiveRailsAgent::SidekiqTracker::ErrorTracker.new.call(ex, ctx_hash) }
8
- config.server_middleware do |chain|
9
- chain.add NetuitiveRailsAgent::SidekiqTracker::ChainTracker
5
+ NetuitiveRailsAgent::ErrorLogger.guard('error during sidekiq tracking installation') do
6
+ require 'sidekiq'
7
+ Sidekiq.configure_server do |config|
8
+ config.error_handlers << proc { |ex, ctx_hash| NetuitiveRailsAgent::SidekiqTracker::ErrorTracker.new.call(ex, ctx_hash) }
9
+ config.server_middleware do |chain|
10
+ chain.add NetuitiveRailsAgent::SidekiqTracker::ChainTracker
11
+ end
10
12
  end
13
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug 'sidekiq tracking installed'
11
14
  end
12
- NetuitiveRailsAgent::NetuitiveLogger.log.debug 'sidekiq tracking installed'
13
15
  end
14
16
 
15
17
  class ChainTracker
@@ -19,15 +21,13 @@ module NetuitiveRailsAgent
19
21
  end
20
22
 
21
23
  def call(worker, item, queue)
22
- begin
24
+ NetuitiveRailsAgent::ErrorLogger.guard('error during sidekiq ChainTracker') do
23
25
  klass = item['wrapped'.freeze] || worker.class.to_s
24
26
  queue = item['queue']
25
27
  NetuitiveRailsAgent::NetuitiveLogger.log.debug "sidekiq job tracked. queue: #{queue}, class: #{klass}"
26
28
  interaction.aggregate_metric("sidekiq.#{klass}.job.count", 1)
27
29
  interaction.aggregate_metric("sidekiq.#{queue}.job.count", 1)
28
30
  interaction.aggregate_metric("sidekiq.#{queue}.#{klass}.job.count", 1)
29
- rescue => e
30
- NetuitiveRailsAgent::NetuitiveLogger.log.error "exception during sidekiq chain tracking: message:#{e.message} backtrace:#{e.backtrace}"
31
31
  end
32
32
  yield
33
33
  end
@@ -41,26 +41,26 @@ module NetuitiveRailsAgent
41
41
  end
42
42
 
43
43
  def call(exception, ctx_hash)
44
- NetuitiveRailsAgent::NetuitiveLogger.log.debug "sidekiq error tracked. context: #{ctx_hash[:context]}"
45
- tags = {
46
- sidekiq: 'true',
47
- context: ctx_hash[:context]
48
- }
49
- metrics = ['sidekiq.errors']
50
- job = ctx_hash[:job]
51
- unless job.nil?
52
- if defined? job.item
53
- item = job.item
54
- klass = item['wrapped'.freeze] || worker.class.to_s
55
- queue = item['queue']
56
- metrics << "sidekiq.#{queue}.#{klass}.error.count"
57
- metrics << "sidekiq.#{queue}.error.count"
44
+ NetuitiveRailsAgent::ErrorLogger.guard('error during sidekiq ErrorTracker') do
45
+ NetuitiveRailsAgent::NetuitiveLogger.log.debug "sidekiq error tracked. context: #{ctx_hash[:context]}"
46
+ tags = {
47
+ sidekiq: 'true',
48
+ context: ctx_hash[:context]
49
+ }
50
+ metrics = ['sidekiq.errors']
51
+ job = ctx_hash[:job]
52
+ unless job.nil?
53
+ if defined? job.item
54
+ item = job.item
55
+ klass = item['wrapped'.freeze] || worker.class.to_s
56
+ queue = item['queue']
57
+ metrics << "sidekiq.#{queue}.#{klass}.error.count"
58
+ metrics << "sidekiq.#{queue}.error.count"
59
+ end
58
60
  end
59
- end
60
61
 
61
- handle_error(exception, metrics, tags)
62
- rescue => e
63
- NetuitiveRailsAgent::NetuitiveLogger.log.error "exception during sidekiq error tracking: message:#{e.message} backtrace:#{e.backtrace}"
62
+ handle_error(exception, metrics, tags)
63
+ end
64
64
  end
65
65
  end
66
66
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: netuitive_rails_agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.2
4
+ version: 1.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-10-17 00:00:00.000000000 Z
12
+ date: 2016-10-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: netuitive_ruby_api
@@ -66,6 +66,7 @@ files:
66
66
  - lib/netuitive_rails_agent/sidekiq.rb
67
67
  - lib/netuitive_rails_agent/error_tracker.rb
68
68
  - lib/netuitive_rails_agent/active_support.rb
69
+ - lib/netuitive_rails_agent/error_logger.rb
69
70
  - lib/netuitive_rails_agent/api_interaction.rb
70
71
  - config/agent.yml
71
72
  - ./LICENSE