netuitive_rails_agent 1.0.2 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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