netuitive_ruby_api 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/config/agent.yml +18 -6
- data/lib/netuitive_ruby_api.rb +56 -33
- data/lib/netuitive_ruby_api/config_manager.rb +26 -11
- data/lib/netuitive_ruby_api/data_cache.rb +104 -0
- data/lib/netuitive_ruby_api/data_manager.rb +142 -0
- data/lib/netuitive_ruby_api/error_logger.rb +21 -0
- data/lib/netuitive_ruby_api/event_schedule.rb +22 -0
- data/lib/netuitive_ruby_api/netuitive_logger.rb +1 -1
- data/lib/netuitive_ruby_api/sample_schedule.rb +22 -0
- metadata +24 -3
data/config/agent.yml
CHANGED
@@ -1,7 +1,19 @@
|
|
1
1
|
#all are configurable using environment variables
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
2
|
+
#log properties
|
3
|
+
logLocation: #NETUITIVE_RUBY_LOG_LOCATION absolute path of log file. leave blank for default location in the gem directory.
|
4
|
+
logAge: daily #NETUITIVE_RUBY_LOG_AGE Number of old log files to keep, or frequency of rotation (daily, weekly or monthly).
|
5
|
+
logSize: #NETUITIVE_RUBY_LOG_SIZE Maximum logfile size in bytes (only applies when shift_age is a number).
|
6
|
+
debugLevel: error #NETUITIVE_RUBY_DEBUG_LEVEL options (in ascending order of debugness) are: error, info, debug.
|
7
|
+
|
8
|
+
#netuitived connection properties
|
9
|
+
netuitivedAddr: localhost #NETUITIVE_RUBY_NETUITIVED_ADDR
|
10
|
+
netuitivedPort: 8875 #NETUITIVE_RUBY_NETUITIVED_PORT
|
11
|
+
|
12
|
+
#cache properties
|
13
|
+
#the point of the cache is to be as *small* as possible while still avoiding excessive delivery thread growth.
|
14
|
+
sampleCacheEnabled: true #NETUITIVE_RUBY_SAMPLE_CACHE_ENABLED
|
15
|
+
sampleCacheSize: 50 #NETUITIVE_RUBY_SAMPLE_CACHE_SIZE maximum number of samples to be cached before being sent to netuitived
|
16
|
+
sampleCacheInterval: 10 #NETUITIVE_RUBY_SAMPLE_CACHE_INTERVAL interval (in seconds) to send cached samples to netuitived
|
17
|
+
eventCacheEnabled: false #NETUITIVE_RUBY_EVENT_CACHE_ENABLED
|
18
|
+
eventCacheSize: 50 #NETUITIVE_RUBY_SAMPLE_CACHE_SIZE maximum number of events to be cached before being sent to netuitived
|
19
|
+
eventCacheInterval: 10 #NETUITIVE_RUBY_SAMPLE_CACHE_INTERVAL interval (in seconds) to send cached events to netuitived
|
data/lib/netuitive_ruby_api.rb
CHANGED
@@ -3,39 +3,81 @@ require 'logger'
|
|
3
3
|
require 'drb/drb'
|
4
4
|
require 'netuitive_ruby_api/config_manager'
|
5
5
|
require 'netuitive_ruby_api/netuitive_logger'
|
6
|
+
require 'netuitive_ruby_api/error_logger'
|
7
|
+
require 'netuitive_ruby_api/data_cache'
|
8
|
+
require 'netuitive_ruby_api/data_manager'
|
9
|
+
require 'netuitive_ruby_api/event_schedule'
|
10
|
+
require 'netuitive_ruby_api/sample_schedule'
|
6
11
|
|
7
12
|
class NetuitiveRubyAPI
|
8
13
|
class << self
|
9
|
-
|
10
|
-
|
14
|
+
attr_accessor :data_manager
|
15
|
+
attr_accessor :netuitivedServer
|
16
|
+
attr_reader :pid
|
17
|
+
def setup
|
18
|
+
@pid = Process.pid
|
19
|
+
NetuitiveRubyApi::ConfigManager.load_config
|
20
|
+
NetuitiveRubyApi::NetuitiveLogger.setup
|
21
|
+
NetuitiveRubyApi::ConfigManager.read_config
|
22
|
+
NetuitiveRubyApi::ErrorLogger.guard('error during api setup') do
|
23
|
+
server_uri = "druby://#{NetuitiveRubyApi::ConfigManager.netuitivedAddr}:#{NetuitiveRubyApi::ConfigManager.netuitivedPort}".freeze
|
24
|
+
DRb.start_service
|
25
|
+
drb_server = DRbObject.new_with_uri(server_uri)
|
26
|
+
data_manager = NetuitiveRubyApi::DataManager.new
|
27
|
+
data_manager.data_cache = NetuitiveRubyApi::DataCache.new
|
28
|
+
data_manager.sample_cache_enabled = NetuitiveRubyApi::ConfigManager.sample_cache_enabled
|
29
|
+
data_manager.sample_cache_size = NetuitiveRubyApi::ConfigManager.sample_cache_size
|
30
|
+
data_manager.sample_cache_interval = NetuitiveRubyApi::ConfigManager.sample_cache_interval
|
31
|
+
data_manager.event_cache_enabled = NetuitiveRubyApi::ConfigManager.event_cache_enabled
|
32
|
+
data_manager.event_cache_size = NetuitiveRubyApi::ConfigManager.event_cache_size
|
33
|
+
data_manager.event_cache_interval = NetuitiveRubyApi::ConfigManager.event_cache_interval
|
34
|
+
data_manager.netuitived_server = drb_server
|
35
|
+
@netuitivedServer = drb_server
|
36
|
+
@data_manager = data_manager
|
37
|
+
NetuitiveRubyApi::SampleSchedule.stop
|
38
|
+
NetuitiveRubyApi::EventSchedule.stop
|
39
|
+
NetuitiveRubyApi::SampleSchedule.start(NetuitiveRubyApi::ConfigManager.sample_cache_interval) if NetuitiveRubyApi::ConfigManager.sample_cache_enabled
|
40
|
+
NetuitiveRubyApi::EventSchedule.start(NetuitiveRubyApi::ConfigManager.event_cache_interval) if NetuitiveRubyApi::ConfigManager.event_cache_enabled
|
41
|
+
NetuitiveRubyApi::NetuitiveLogger.log.info 'netuitive_ruby_api finished setup'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def flush_samples
|
46
|
+
@data_manager.flush_samples
|
47
|
+
end
|
48
|
+
|
49
|
+
def check_restart
|
50
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug "stored pid: #{@pid}, process pid: #{Process.pid}"
|
51
|
+
return if @pid == Process.pid
|
52
|
+
Thread.new { NetuitiveRubyAPI.setup }
|
11
53
|
end
|
12
54
|
|
13
|
-
def
|
14
|
-
|
55
|
+
def flush_events
|
56
|
+
@data_manager.flush_events
|
15
57
|
end
|
16
58
|
|
17
59
|
def send_metrics
|
18
|
-
|
60
|
+
netuitivedServer.sendMetrics
|
19
61
|
end
|
20
62
|
|
21
63
|
def add_sample(metric_id, val)
|
22
|
-
|
64
|
+
@data_manager.add_sample(metric_id, val)
|
23
65
|
end
|
24
66
|
|
25
67
|
def add_counter_sample(metric_id, val)
|
26
|
-
|
68
|
+
@data_manager.add_counter_sample(metric_id, val)
|
27
69
|
end
|
28
70
|
|
29
71
|
def aggregate_metric(metric_id, val)
|
30
|
-
|
72
|
+
@data_manager.aggregate_metric(metric_id, val)
|
31
73
|
end
|
32
74
|
|
33
75
|
def aggregate_counter_metric(metric_id, val)
|
34
|
-
|
76
|
+
@data_manager.aggregate_counter_metric(metric_id, val)
|
35
77
|
end
|
36
78
|
|
37
79
|
def clear_metrics
|
38
|
-
|
80
|
+
netuitivedServer.clearMetrics
|
39
81
|
end
|
40
82
|
|
41
83
|
def interval
|
@@ -43,36 +85,17 @@ class NetuitiveRubyAPI
|
|
43
85
|
end
|
44
86
|
|
45
87
|
def event(message, timestamp = Time.new, title = 'Ruby Event', level = 'Info', source = 'Ruby Agent', type = 'INFO', tags = nil)
|
46
|
-
|
88
|
+
@data_manager.event(message, timestamp, title, level, source, type, tags)
|
47
89
|
end
|
48
90
|
|
49
91
|
def exception_event(exception, klass = nil, tags = nil)
|
50
|
-
|
51
|
-
hash = { message: exception.message }
|
52
|
-
hash[:backtrace] = exception.backtrace.join("\n\t") if (defined? exception.backtrace) && !exception.backtrace.nil?
|
53
|
-
netuitivedServer.exceptionEvent(hash, klass, tags)
|
54
|
-
end
|
92
|
+
@data_manager.exception_event(exception, klass, tags)
|
55
93
|
end
|
56
94
|
|
57
95
|
def stop_server
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
|
-
def server_interaction
|
62
|
-
Thread.new do
|
63
|
-
begin
|
64
|
-
yield
|
65
|
-
rescue => e
|
66
|
-
NetuitiveRubyApi::NetuitiveLogger.log.error "unable to connect to netuitived: message:#{e.message} backtrace:#{e.backtrace}"
|
67
|
-
end
|
68
|
-
end
|
96
|
+
netuitivedServer.stopServer
|
69
97
|
end
|
70
98
|
end
|
71
99
|
end
|
72
100
|
|
73
|
-
|
74
|
-
NetuitiveRubyApi::NetuitiveLogger.setup
|
75
|
-
NetuitiveRubyApi::ConfigManager.read_config
|
76
|
-
SERVER_URI = "druby://#{NetuitiveRubyApi::ConfigManager.netuitivedAddr}:#{NetuitiveRubyApi::ConfigManager.netuitivedPort}".freeze
|
77
|
-
DRb.start_service
|
78
|
-
NetuitiveRubyAPI.setup(DRbObject.new_with_uri(SERVER_URI))
|
101
|
+
NetuitiveRubyAPI.setup
|
@@ -2,10 +2,14 @@ module NetuitiveRubyApi
|
|
2
2
|
class ConfigManager
|
3
3
|
class << self
|
4
4
|
attr_reader :netuitivedAddr
|
5
|
-
|
6
5
|
attr_reader :netuitivedPort
|
7
|
-
|
8
6
|
attr_reader :data
|
7
|
+
attr_reader :sample_cache_enabled
|
8
|
+
attr_reader :sample_cache_size
|
9
|
+
attr_reader :sample_cache_interval
|
10
|
+
attr_reader :event_cache_enabled
|
11
|
+
attr_reader :event_cache_size
|
12
|
+
attr_reader :event_cache_interval
|
9
13
|
|
10
14
|
def property(name, var, default = nil)
|
11
15
|
prop = ENV[var]
|
@@ -26,12 +30,11 @@ module NetuitiveRubyApi
|
|
26
30
|
end
|
27
31
|
|
28
32
|
def float_property(name, var)
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
end
|
33
|
+
property(name, var).to_f
|
34
|
+
end
|
35
|
+
|
36
|
+
def int_property(name, var)
|
37
|
+
property(name, var).to_i
|
35
38
|
end
|
36
39
|
|
37
40
|
def string_list_property(name, var)
|
@@ -52,6 +55,12 @@ module NetuitiveRubyApi
|
|
52
55
|
end
|
53
56
|
|
54
57
|
def read_config
|
58
|
+
@sample_cache_enabled = boolean_property('sampleCacheEnabled', 'NETUITIVE_RUBY_SAMPLE_CACHE_ENABLED')
|
59
|
+
@sample_cache_size = int_property('sampleCacheSize', 'NETUITIVE_RUBY_SAMPLE_CACHE_SIZE')
|
60
|
+
@sample_cache_interval = int_property('sampleCacheInterval', 'NETUITIVE_RUBY_SAMPLE_CACHE_INTERVAL')
|
61
|
+
@event_cache_enabled = boolean_property('eventCacheEnabled', 'NETUITIVE_RUBY_EVENT_CACHE_ENABLED')
|
62
|
+
@event_cache_size = int_property('eventCacheSize', 'NETUITIVE_RUBY_SAMPLE_CACHE_SIZE')
|
63
|
+
@event_cache_interval = int_property('eventCacheInterval', 'NETUITIVE_RUBY_SAMPLE_CACHE_INTERVAL')
|
55
64
|
@netuitivedAddr = property('netuitivedAddr', 'NETUITIVE_RUBY_NETUITIVED_ADDR')
|
56
65
|
@netuitivedPort = property('netuitivedPort', 'NETUITIVE_RUBY_NETUITIVED_PORT')
|
57
66
|
debugLevelString = property('debugLevel', 'NETUITIVE_RUBY_DEBUG_LEVEL')
|
@@ -64,12 +73,18 @@ module NetuitiveRubyApi
|
|
64
73
|
else
|
65
74
|
Logger::ERROR
|
66
75
|
end
|
67
|
-
NetuitiveRubyApi::NetuitiveLogger.log.info "port: #{@netuitivedPort}"
|
68
|
-
NetuitiveRubyApi::NetuitiveLogger.log.info "addr: #{@netuitivedAddr}"
|
76
|
+
NetuitiveRubyApi::NetuitiveLogger.log.info "netuitived port: #{@netuitivedPort}"
|
77
|
+
NetuitiveRubyApi::NetuitiveLogger.log.info "netuitived addr: #{@netuitivedAddr}"
|
69
78
|
NetuitiveRubyApi::NetuitiveLogger.log.debug "read config file. Results:
|
70
79
|
netuitivedAddr: #{@netuitivedAddr}
|
71
80
|
netuitivedPort: #{@netuitivedPort}
|
72
|
-
debugLevel: #{debugLevelString}
|
81
|
+
debugLevel: #{debugLevelString}
|
82
|
+
sample_cache_enabled: #{@sample_cache_enabled}
|
83
|
+
sample_cache_size: #{@sample_cache_size}
|
84
|
+
sample_cache_interval: #{@sample_cache_interval}
|
85
|
+
event_cache_enabled: #{@event_cache_enabled}
|
86
|
+
event_cache_size: #{@event_cache_size}
|
87
|
+
event_cache_interval: #{@event_cache_interval}"
|
73
88
|
end
|
74
89
|
end
|
75
90
|
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module NetuitiveRubyApi
|
2
|
+
class DataCache
|
3
|
+
def initialize
|
4
|
+
@sample_count_mutex = Mutex.new
|
5
|
+
@event_count_mutex = Mutex.new
|
6
|
+
reset_samples
|
7
|
+
reset_events
|
8
|
+
end
|
9
|
+
|
10
|
+
def sample_added
|
11
|
+
@sample_count += 1
|
12
|
+
end
|
13
|
+
|
14
|
+
def event_added
|
15
|
+
@event_count += 1
|
16
|
+
end
|
17
|
+
|
18
|
+
def add_sample(value)
|
19
|
+
@sample_count_mutex.synchronize do
|
20
|
+
@samples.push(value)
|
21
|
+
sample_added
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_counter_sample(value)
|
26
|
+
@sample_count_mutex.synchronize do
|
27
|
+
@counter_samples.push(value)
|
28
|
+
sample_added
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def add_aggregate_metric(value)
|
33
|
+
@sample_count_mutex.synchronize do
|
34
|
+
@aggregate_metrics.push(value)
|
35
|
+
sample_added
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def add_aggregate_counter_metric(value)
|
40
|
+
@sample_count_mutex.synchronize do
|
41
|
+
@aggregate_counter_metrics.push(value)
|
42
|
+
sample_added
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def add_event(value)
|
47
|
+
@event_count_mutex.synchronize do
|
48
|
+
@events.push(value)
|
49
|
+
event_added
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_exception_event(value)
|
54
|
+
@event_count_mutex.synchronize do
|
55
|
+
@exception_events.push(value)
|
56
|
+
event_added
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def clear_sample_cache
|
61
|
+
NetuitiveRubyApi::ErrorLogger.guard('error during clear_sample_cache') do
|
62
|
+
@sample_count_mutex.synchronize do
|
63
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug 'clearing sample cache'
|
64
|
+
ret = {
|
65
|
+
samples: @samples.dup,
|
66
|
+
counter_samples: @counter_samples.dup,
|
67
|
+
aggregate_metrics: @aggregate_metrics.dup,
|
68
|
+
aggregate_counter_metrics: @aggregate_counter_metrics.dup
|
69
|
+
}
|
70
|
+
reset_samples
|
71
|
+
ret
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def clear_event_cache
|
77
|
+
NetuitiveRubyApi::ErrorLogger.guard('error during clear_event_cache') do
|
78
|
+
@event_count_mutex.synchronize do
|
79
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug 'clearing event cache'
|
80
|
+
ret = {
|
81
|
+
events: @events.dup,
|
82
|
+
exception_events: @exception_events.dup
|
83
|
+
}
|
84
|
+
reset_events
|
85
|
+
ret
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def reset_samples
|
91
|
+
@samples = []
|
92
|
+
@counter_samples = []
|
93
|
+
@aggregate_metrics = []
|
94
|
+
@aggregate_counter_metrics = []
|
95
|
+
@sample_count = 0
|
96
|
+
end
|
97
|
+
|
98
|
+
def reset_events
|
99
|
+
@events = []
|
100
|
+
@exception_events = []
|
101
|
+
@event_count = 0
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
module NetuitiveRubyApi
|
2
|
+
class DataManager
|
3
|
+
attr_accessor :data_cache
|
4
|
+
attr_accessor :sample_cache_enabled
|
5
|
+
attr_accessor :sample_cache_size
|
6
|
+
attr_accessor :sample_cache_interval
|
7
|
+
attr_accessor :event_cache_enabled
|
8
|
+
attr_accessor :event_cache_size
|
9
|
+
attr_accessor :event_cache_interval
|
10
|
+
attr_accessor :netuitived_server
|
11
|
+
|
12
|
+
def add_sample(metric_id, val)
|
13
|
+
if @sample_cache_enabled
|
14
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug "adding sample to cache: #{metric_id}"
|
15
|
+
sample_cache_addition { data_cache.add_sample(metric_id: metric_id, val: val) }
|
16
|
+
else
|
17
|
+
server_interaction { netuitived_server.addSample(metric_id, val) }
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def add_counter_sample(metric_id, val)
|
22
|
+
if @sample_cache_enabled
|
23
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug "adding sample to cache: #{metric_id}"
|
24
|
+
sample_cache_addition { data_cache.add_counter_sample(metric_id: metric_id, val: val) }
|
25
|
+
else
|
26
|
+
server_interaction { netuitived_server.addCounterSample(metric_id, val) }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def aggregate_metric(metric_id, val)
|
31
|
+
if @sample_cache_enabled
|
32
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug "adding sample to cache: #{metric_id}"
|
33
|
+
sample_cache_addition { data_cache.add_aggregate_metric(metric_id: metric_id, val: val) }
|
34
|
+
else
|
35
|
+
server_interaction { netuitived_server.aggregateMetric(metric_id, val) }
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def aggregate_counter_metric(metric_id, val)
|
40
|
+
if @sample_cache_enabled
|
41
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug "adding sample to cache: #{metric_id}"
|
42
|
+
sample_cache_addition { data_cache.add_aggregate_counter_metric(metric_id: metric_id, val: val) }
|
43
|
+
else
|
44
|
+
server_interaction { netuitived_server.aggregateCounterMetric(metric_id, val) }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def event(message, timestamp, title, level, source, type, tags)
|
49
|
+
if @event_cache_enabled
|
50
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug "adding event to cache: #{message}"
|
51
|
+
event_cache_addition do
|
52
|
+
data_cache.add_event(message: message,
|
53
|
+
timestamp: timestamp,
|
54
|
+
title: title,
|
55
|
+
level: level,
|
56
|
+
source: source,
|
57
|
+
type: type,
|
58
|
+
tags: tags)
|
59
|
+
end
|
60
|
+
else
|
61
|
+
server_interaction { netuitived_server.event(message, timestamp, title, level, source, type, tags) }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def exception_event(exception, klass, tags)
|
66
|
+
NetuitiveRubyApi::ErrorLogger.guard('error during exception_event') do
|
67
|
+
hash = { message: exception.message }
|
68
|
+
hash[:backtrace] = exception.backtrace.join("\n\t") if (defined? exception.backtrace) && !exception.backtrace.nil?
|
69
|
+
if @event_cache_enabled
|
70
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug "adding exception event to cache: #{hash[:message]}"
|
71
|
+
event_cache_addition do
|
72
|
+
data_cache.add_exception_event(exception: hash,
|
73
|
+
klass: klass,
|
74
|
+
tags: tags)
|
75
|
+
end
|
76
|
+
else
|
77
|
+
server_interaction { netuitived_server.exceptionEvent(hash, klass, tags) }
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def flush_samples
|
83
|
+
NetuitiveRubyApi::ErrorLogger.guard('error during flush_samples') do
|
84
|
+
sample = data_cache.clear_sample_cache
|
85
|
+
num = sample[:samples].size + sample[:counter_samples].size + sample[:aggregate_metrics].size + sample[:aggregate_counter_metrics].size
|
86
|
+
NetuitiveRubyApi::NetuitiveLogger.log.info "sending #{num} samples" if num > 0
|
87
|
+
threads = []
|
88
|
+
threads << server_interaction do
|
89
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug "sending samples: #{sample[:samples]} "
|
90
|
+
netuitived_server.add_samples sample[:samples]
|
91
|
+
end unless sample[:samples].empty?
|
92
|
+
threads << server_interaction do
|
93
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug "sending counter_samples: #{sample[:counter_samples]} "
|
94
|
+
netuitived_server.add_counter_samples sample[:counter_samples]
|
95
|
+
end unless sample[:counter_samples].empty?
|
96
|
+
threads << server_interaction do
|
97
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug "sending aggregate_metrics: #{sample[:aggregate_metrics]} "
|
98
|
+
netuitived_server.add_aggregate_metrics sample[:aggregate_metrics]
|
99
|
+
end unless sample[:aggregate_metrics].empty?
|
100
|
+
threads << server_interaction do
|
101
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug "sending aggregate_counter_metrics: #{sample[:aggregate_counter_metrics]} "
|
102
|
+
netuitived_server.add_aggregate_counter_metrics sample[:aggregate_counter_metrics]
|
103
|
+
end unless sample[:aggregate_counter_metrics].empty?
|
104
|
+
threads
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def flush_events
|
109
|
+
NetuitiveRubyApi::ErrorLogger.guard('error during flush_events') do
|
110
|
+
event_cache = data_cache.clear_event_cache
|
111
|
+
num = event_cache[:events].size + event_cache[:exception_events].size
|
112
|
+
NetuitiveRubyApi::NetuitiveLogger.log.info "sending #{num} events" if num > 0
|
113
|
+
threads = []
|
114
|
+
threads << server_interaction do
|
115
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug "sending events: #{event_cache[:events]} "
|
116
|
+
netuitived_server.add_events(event_cache[:events])
|
117
|
+
end unless event_cache[:events].empty?
|
118
|
+
threads << server_interaction do
|
119
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug "sending exception_events: #{event_cache[:exception_events]} "
|
120
|
+
netuitived_server.add_exception_events(event_cache[:exception_events])
|
121
|
+
end unless event_cache[:exception_events].empty?
|
122
|
+
threads
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def sample_cache_addition
|
127
|
+
NetuitiveRubyAPI.check_restart
|
128
|
+
flush_samples if yield >= @sample_cache_size
|
129
|
+
end
|
130
|
+
|
131
|
+
def event_cache_addition
|
132
|
+
NetuitiveRubyAPI.check_restart
|
133
|
+
flush_events if yield >= @event_cache_size
|
134
|
+
end
|
135
|
+
|
136
|
+
def server_interaction
|
137
|
+
Thread.new do
|
138
|
+
NetuitiveRubyApi::ErrorLogger.guard('error during server interaction') { yield }
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
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 NetuitiveRubyApi
|
7
|
+
class ErrorLogger
|
8
|
+
class << self
|
9
|
+
def guard(message)
|
10
|
+
yield
|
11
|
+
rescue => e
|
12
|
+
NetuitiveRubyApi::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
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module NetuitiveRubyApi
|
2
|
+
class EventSchedule
|
3
|
+
def self.start(interval)
|
4
|
+
@@thread = Thread.new do
|
5
|
+
loop do
|
6
|
+
sleep(interval)
|
7
|
+
Thread.new do
|
8
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug 'started event job'
|
9
|
+
NetuitiveRubyApi::ErrorLogger.guard('error during event job') do
|
10
|
+
NetuitiveRubyAPI.flush_events
|
11
|
+
end
|
12
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug 'finished event job'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.stop
|
19
|
+
@@thread.kill if defined? @@thread
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -14,7 +14,7 @@ module NetuitiveRubyApi
|
|
14
14
|
|
15
15
|
class NetuitiveLogger
|
16
16
|
class << self
|
17
|
-
|
17
|
+
attr_accessor :log
|
18
18
|
def setup
|
19
19
|
file = NetuitiveRubyApi::ConfigManager.property('logLocation', 'NETUITIVE_RUBY_LOG_LOCATION', "#{File.expand_path('../../..', __FILE__)}/log/netuitive.log")
|
20
20
|
age = NetuitiveRubyApi::ConfigManager.property('logAge', 'NETUITIVE_RUBY_LOG_AGE', 'daily')
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module NetuitiveRubyApi
|
2
|
+
class SampleSchedule
|
3
|
+
def self.start(interval)
|
4
|
+
@@thread = Thread.new do
|
5
|
+
loop do
|
6
|
+
sleep(interval)
|
7
|
+
Thread.new do
|
8
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug 'started sample job'
|
9
|
+
NetuitiveRubyApi::ErrorLogger.guard('error during sample job') do
|
10
|
+
NetuitiveRubyAPI.flush_samples
|
11
|
+
end
|
12
|
+
NetuitiveRubyApi::NetuitiveLogger.log.debug 'finished sample job'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.stop
|
19
|
+
@@thread.kill if defined? @@thread
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netuitive_ruby_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,16 +9,37 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2016-10-
|
13
|
-
dependencies:
|
12
|
+
date: 2016-10-21 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: netuitived
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.1.0
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.1.0
|
14
30
|
description: Allows for easy submittion of metrics to Netuitive
|
15
31
|
email: jking@netuitive.com
|
16
32
|
executables: []
|
17
33
|
extensions: []
|
18
34
|
extra_rdoc_files: []
|
19
35
|
files:
|
36
|
+
- lib/netuitive_ruby_api/sample_schedule.rb
|
20
37
|
- lib/netuitive_ruby_api/netuitive_logger.rb
|
38
|
+
- lib/netuitive_ruby_api/data_manager.rb
|
39
|
+
- lib/netuitive_ruby_api/data_cache.rb
|
21
40
|
- lib/netuitive_ruby_api/config_manager.rb
|
41
|
+
- lib/netuitive_ruby_api/event_schedule.rb
|
42
|
+
- lib/netuitive_ruby_api/error_logger.rb
|
22
43
|
- lib/netuitive_ruby_api.rb
|
23
44
|
- config/agent.yml
|
24
45
|
- ./LICENSE
|