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.
- data/lib/netuitive_rails_agent.rb +15 -13
- data/lib/netuitive_rails_agent/action_controller.rb +17 -15
- data/lib/netuitive_rails_agent/action_mailer.rb +10 -6
- data/lib/netuitive_rails_agent/api_interaction.rb +27 -9
- data/lib/netuitive_rails_agent/controller_utils.rb +8 -4
- data/lib/netuitive_rails_agent/error_logger.rb +21 -0
- data/lib/netuitive_rails_agent/error_tracker.rb +1 -3
- data/lib/netuitive_rails_agent/error_utils.rb +25 -23
- data/lib/netuitive_rails_agent/gc.rb +13 -15
- data/lib/netuitive_rails_agent/objectspace.rb +5 -5
- data/lib/netuitive_rails_agent/request_data.rb +18 -18
- data/lib/netuitive_rails_agent/scheduler.rb +4 -7
- data/lib/netuitive_rails_agent/sidekiq.rb +27 -27
- metadata +3 -2
@@ -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
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
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
|
-
|
19
|
-
|
20
|
-
|
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
|
-
|
25
|
-
|
26
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
5
|
-
|
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
|
-
|
14
|
-
|
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
|
-
|
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
|
-
|
7
|
-
NetuitiveRailsAgent::ConfigManager.ignored_errors.
|
8
|
-
|
9
|
-
name.
|
10
|
-
|
11
|
-
|
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::
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
NetuitiveRailsAgent::
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
-
|
11
|
-
|
12
|
-
|
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
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
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
|
-
|
23
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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
|
-
|
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::
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
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
|
-
|
62
|
-
|
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.
|
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-
|
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
|