netuitive_ruby_api 1.0.1 → 1.1.0
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/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
|