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.
- 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
|