netuitived 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/lib/netuitived.rb +1 -0
- data/lib/netuitived/api_emissary.rb +30 -32
- data/lib/netuitived/error_logger.rb +20 -0
- data/lib/netuitived/event_handler.rb +37 -26
- data/lib/netuitived/metric_aggregator.rb +111 -83
- data/lib/netuitived/netuitived_server.rb +24 -0
- data/lib/netuitived/scheduler.rb +5 -3
- metadata +3 -2
data/lib/netuitived.rb
CHANGED
@@ -13,39 +13,37 @@ module NetuitiveD
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def send(uri, body)
|
16
|
-
NetuitiveD::
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
16
|
+
NetuitiveD::ErrorLogger.guard('exception during send') do
|
17
|
+
NetuitiveD::NetuitiveLogger.log.debug "post body: #{body}"
|
18
|
+
req = Net::HTTP::Post.new(uri.to_s, 'Content-Type' => 'application/json')
|
19
|
+
req.body = body
|
20
|
+
NetuitiveD::NetuitiveLogger.log.debug 'starting post'
|
21
|
+
port = if NetuitiveD::ConfigManager.port =~ /(.*)nil(.*)/
|
22
|
+
nil
|
23
|
+
else
|
24
|
+
NetuitiveD::ConfigManager.port.to_int
|
25
|
+
end
|
26
|
+
NetuitiveD::NetuitiveLogger.log.debug "port: #{port}"
|
27
|
+
NetuitiveD::NetuitiveLogger.log.debug "path: #{req.path}"
|
28
|
+
NetuitiveD::NetuitiveLogger.log.debug "addr: #{NetuitiveD::ConfigManager.baseAddr}"
|
29
|
+
response = Net::HTTP.start(NetuitiveD::ConfigManager.baseAddr.to_s, port, use_ssl: true, read_timeout: 30, open_timeout: 30) do |http|
|
30
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
31
|
+
http.ssl_version = :SSLv3
|
32
|
+
http.request req
|
33
|
+
end
|
34
|
+
NetuitiveD::NetuitiveLogger.log.debug 'post finished'
|
35
|
+
if response.code.to_s != '202' && response.code.to_s != '200'
|
36
|
+
NetuitiveD::NetuitiveLogger.log.error "Response from submitting netuitive metrics to api
|
37
|
+
code: #{response.code}
|
38
|
+
message: #{response.message}
|
39
|
+
body: #{response.body}"
|
40
|
+
else
|
41
|
+
NetuitiveD::NetuitiveLogger.log.info "Response from submitting netuitive metrics to api
|
42
|
+
code: #{response.code}
|
43
|
+
message: #{response.message}
|
44
|
+
body: #{response.body}"
|
45
|
+
end
|
32
46
|
end
|
33
|
-
NetuitiveD::NetuitiveLogger.log.debug 'post finished'
|
34
|
-
if response.code.to_s != '202' && response.code.to_s != '200'
|
35
|
-
NetuitiveD::NetuitiveLogger.log.error "Response from submitting netuitive metrics to api
|
36
|
-
code: #{response.code}
|
37
|
-
message: #{response.message}
|
38
|
-
body: #{response.body}"
|
39
|
-
else
|
40
|
-
NetuitiveD::NetuitiveLogger.log.info "Response from submitting netuitive metrics to api
|
41
|
-
code: #{response.code}
|
42
|
-
message: #{response.message}
|
43
|
-
body: #{response.body}"
|
44
|
-
end
|
45
|
-
rescue => exception
|
46
|
-
NetuitiveD::NetuitiveLogger.log.error 'error with http post: '
|
47
|
-
NetuitiveD::NetuitiveLogger.log.error exception.message
|
48
|
-
NetuitiveD::NetuitiveLogger.log.error exception.backtrace
|
49
47
|
end
|
50
48
|
end
|
51
49
|
end
|
@@ -0,0 +1,20 @@
|
|
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
|
+
# That *doesn't* mean we should be throwing exceptions rather than guarding against them
|
4
|
+
# From the benchmarks I've read it seems like rescues are free if no exception is thrown
|
5
|
+
module NetuitiveD
|
6
|
+
class ErrorLogger
|
7
|
+
class << self
|
8
|
+
def guard(message)
|
9
|
+
yield
|
10
|
+
rescue => e
|
11
|
+
NetuitiveD::NetuitiveLogger.log.error format_exception(e, message)
|
12
|
+
end
|
13
|
+
|
14
|
+
def format_exception(exception, *message)
|
15
|
+
message = '' unless defined? message || message.nil?
|
16
|
+
"#{message} \n\tException message: #{exception.message}\n\t Backtrace: #{exception.backtrace.join("\n\t")}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -4,37 +4,48 @@ module NetuitiveD
|
|
4
4
|
@apiEmissary = apiEmissary
|
5
5
|
end
|
6
6
|
|
7
|
+
def handle_events(events)
|
8
|
+
return unless events && !events.nil?
|
9
|
+
events.each { |event| handleEvent(event[:message], event[:timestamp], event[:title], event[:level], event[:source], event[:type], event[:tags]) }
|
10
|
+
end
|
11
|
+
|
12
|
+
def handle_exception_events(events)
|
13
|
+
return unless events && !events.nil?
|
14
|
+
events.each { |event| handleExceptionEvent(event[:exception], event[:klass], event[:tags]) }
|
15
|
+
end
|
16
|
+
|
7
17
|
def handleEvent(message, timestamp, title, level, source, type, tags)
|
8
|
-
NetuitiveD::
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
18
|
+
NetuitiveD::ErrorLogger.guard('exception during handleEvent') do
|
19
|
+
NetuitiveD::NetuitiveLogger.log.debug "self: #{object_id}"
|
20
|
+
NetuitiveD::NetuitiveLogger.log.debug "Thread: #{Thread.current.object_id}"
|
21
|
+
NetuitiveD::NetuitiveLogger.log.debug "Received event: message:#{message}, timestamp:#{timestamp}, title:#{title}, level:#{level}, source:#{source}, type:#{type}, tags:#{tags}"
|
22
|
+
event = NetuitiveD::IngestEvent.new(NetuitiveD::ConfigManager.elementName, message, timestamp, title, level, source, type, tags)
|
23
|
+
events = [event]
|
24
|
+
eventString = events.to_json
|
25
|
+
@apiEmissary.sendEvents(eventString)
|
26
|
+
end
|
17
27
|
end
|
18
28
|
|
19
29
|
def handleExceptionEvent(exception, klass, tags = {})
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
30
|
+
NetuitiveD::ErrorLogger.guard('exception during handleExceptionEvent') do
|
31
|
+
message = "Exception Message: #{exception[:message]}\n" if (defined? exception[:message]) && !exception[:message].nil?
|
32
|
+
message ||= ''
|
33
|
+
timestamp = Time.new
|
34
|
+
title = 'Ruby Exception'
|
35
|
+
level = 'Warning'
|
36
|
+
source = 'Ruby Agent'
|
37
|
+
type = 'INFO'
|
38
|
+
ingest_tags = []
|
39
|
+
tags ||= {}
|
40
|
+
tags [:Exception] = klass unless klass.nil?
|
41
|
+
tags.each do |key, value|
|
42
|
+
next if !(defined? value) || value.nil? || value == ''
|
43
|
+
ingest_tags << NetuitiveD::IngestTag.new(key, value)
|
44
|
+
message += "#{key}: #{value}\n"
|
45
|
+
end
|
46
|
+
message += "Backtrace:\n\t#{exception[:backtrace]}" if (defined? exception[:backtrace]) && !exception[:backtrace].nil?
|
47
|
+
handleEvent(message, timestamp, title, level, source, type, ingest_tags)
|
33
48
|
end
|
34
|
-
message += "Backtrace:\n\t#{exception[:backtrace]}" if (defined? exception[:backtrace]) && !exception[:backtrace].nil?
|
35
|
-
handleEvent(message, timestamp, title, level, source, type, ingest_tags)
|
36
|
-
rescue => e
|
37
|
-
NetuitiveD::NetuitiveLogger.log.error "error in exception event: #{e.message}, backtrace: #{e.backtrace}"
|
38
49
|
end
|
39
50
|
end
|
40
51
|
end
|
@@ -12,32 +12,54 @@ module NetuitiveD
|
|
12
12
|
@apiEmissary = apiEmissary
|
13
13
|
end
|
14
14
|
|
15
|
+
def add_samples(samples)
|
16
|
+
return unless samples && !samples.nil?
|
17
|
+
samples.each { |sample| addSample(sample[:metric_id], sample[:val]) }
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_counter_samples(samples)
|
21
|
+
return unless samples && !samples.nil?
|
22
|
+
samples.each { |sample| addCounterSample(sample[:metric_id], sample[:val]) }
|
23
|
+
end
|
24
|
+
|
25
|
+
def add_aggregate_metrics(samples)
|
26
|
+
return unless samples && !samples.nil?
|
27
|
+
samples.each { |sample| aggregateMetric(sample[:metric_id], sample[:val]) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def add_aggregate_counter_metrics(samples)
|
31
|
+
return unless samples && !samples.nil?
|
32
|
+
samples.each { |sample| aggregateCounterMetric(sample[:metric_id], sample[:val]) }
|
33
|
+
end
|
34
|
+
|
15
35
|
def sendMetrics
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
36
|
+
NetuitiveD::ErrorLogger.guard('exception during sendMetrics') do
|
37
|
+
elementString = nil
|
38
|
+
addSample('netuitive.collection_interval', NetuitiveD::ConfigManager.interval)
|
39
|
+
@metricMutex.synchronize do
|
40
|
+
NetuitiveD::NetuitiveLogger.log.debug "self: #{object_id}"
|
41
|
+
NetuitiveD::NetuitiveLogger.log.debug "Thread: #{Thread.current.object_id}"
|
42
|
+
NetuitiveD::NetuitiveLogger.log.debug "metrics id: #{@metrics.object_id}"
|
43
|
+
NetuitiveD::NetuitiveLogger.log.debug "samples id: #{@samples.object_id}"
|
44
|
+
NetuitiveD::NetuitiveLogger.log.debug "aggregatedSamples id: #{@aggregatedSamples.object_id}"
|
45
|
+
NetuitiveD::NetuitiveLogger.log.debug "metrics before send: #{@metrics.count}"
|
46
|
+
NetuitiveD::NetuitiveLogger.log.debug "samples before send: #{@aggregatedSamples.count + @samples.count}"
|
26
47
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
48
|
+
if @metrics.empty?
|
49
|
+
NetuitiveD::NetuitiveLogger.log.info 'no netuitive metrics to report'
|
50
|
+
return
|
51
|
+
end
|
52
|
+
aggregatedSamplesArray = @aggregatedSamples.values
|
53
|
+
aggregatedSamplesArray.each do |sample|
|
54
|
+
sample.timestamp = Time.new
|
55
|
+
end
|
56
|
+
element = NetuitiveD::IngestElement.new(NetuitiveD::ConfigManager.elementName, NetuitiveD::ConfigManager.elementName, 'Ruby', nil, @metrics, @samples + aggregatedSamplesArray, nil, nil)
|
57
|
+
elements = [element]
|
58
|
+
elementString = elements.to_json
|
59
|
+
clearMetrics
|
34
60
|
end
|
35
|
-
|
36
|
-
elements = [element]
|
37
|
-
elementString = elements.to_json
|
38
|
-
clearMetrics
|
61
|
+
@apiEmissary.sendElements(elementString)
|
39
62
|
end
|
40
|
-
@apiEmissary.sendElements(elementString)
|
41
63
|
end
|
42
64
|
|
43
65
|
def addSample(metricId, val)
|
@@ -49,32 +71,34 @@ module NetuitiveD
|
|
49
71
|
end
|
50
72
|
|
51
73
|
def addSampleWithType(metricId, val, type)
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
74
|
+
NetuitiveD::ErrorLogger.guard('exception during addSampleWithType') do
|
75
|
+
@metricMutex.synchronize do
|
76
|
+
NetuitiveD::NetuitiveLogger.log.debug 'start addSample method'
|
77
|
+
NetuitiveD::NetuitiveLogger.log.debug "Thread: #{Thread.current.object_id}"
|
78
|
+
NetuitiveD::NetuitiveLogger.log.debug "self: #{object_id}"
|
79
|
+
NetuitiveD::NetuitiveLogger.log.debug "metrics id: #{@metrics.object_id}"
|
80
|
+
NetuitiveD::NetuitiveLogger.log.debug "samples id: #{@samples.object_id}"
|
81
|
+
NetuitiveD::NetuitiveLogger.log.debug "aggregatedSamples id: #{@aggregatedSamples.object_id}"
|
82
|
+
NetuitiveD::NetuitiveLogger.log.debug "metrics before add: #{@metrics.count}"
|
83
|
+
NetuitiveD::NetuitiveLogger.log.debug "samples before add: #{@aggregatedSamples.count + @samples.count}"
|
84
|
+
if metricId.nil?
|
85
|
+
NetuitiveD::NetuitiveLogger.log.info 'null metricId for addSample'
|
86
|
+
return false
|
87
|
+
end
|
88
|
+
if val.nil?
|
89
|
+
NetuitiveD::NetuitiveLogger.log.info "null value for addSample for metricId #{metricId}"
|
90
|
+
return false
|
91
|
+
end
|
92
|
+
unless metricExists metricId
|
93
|
+
NetuitiveD::NetuitiveLogger.log.info "adding new metric: #{metricId}"
|
94
|
+
@metrics.push(NetuitiveD::IngestMetric.new(metricId, metricId, nil, type, nil, false))
|
95
|
+
end
|
96
|
+
@samples.push(NetuitiveD::IngestSample.new(metricId, Time.new, val, nil, nil, nil, nil, nil))
|
97
|
+
NetuitiveD::NetuitiveLogger.log.info "netuitive sample added #{metricId} val: #{val}"
|
98
|
+
NetuitiveD::NetuitiveLogger.log.debug "metrics after add: #{@metrics.count}"
|
99
|
+
NetuitiveD::NetuitiveLogger.log.debug "samples after add: #{@aggregatedSamples.count + @samples.count}"
|
100
|
+
NetuitiveD::NetuitiveLogger.log.debug 'end addSample method'
|
72
101
|
end
|
73
|
-
@samples.push(NetuitiveD::IngestSample.new(metricId, Time.new, val, nil, nil, nil, nil, nil))
|
74
|
-
NetuitiveD::NetuitiveLogger.log.info "netuitive sample added #{metricId} val: #{val}"
|
75
|
-
NetuitiveD::NetuitiveLogger.log.debug "metrics after add: #{@metrics.count}"
|
76
|
-
NetuitiveD::NetuitiveLogger.log.debug "samples after add: #{@aggregatedSamples.count + @samples.count}"
|
77
|
-
NetuitiveD::NetuitiveLogger.log.debug 'end addSample method'
|
78
102
|
end
|
79
103
|
end
|
80
104
|
|
@@ -94,49 +118,53 @@ module NetuitiveD
|
|
94
118
|
end
|
95
119
|
|
96
120
|
def aggregateMetricWithType(metricId, val, type)
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
end
|
110
|
-
if val.nil?
|
111
|
-
NetuitiveD::NetuitiveLogger.log.info "null value for aggregateMetric for metricId #{metricId}"
|
112
|
-
return false
|
113
|
-
end
|
114
|
-
if !metricExists metricId
|
115
|
-
NetuitiveD::NetuitiveLogger.log.info "adding new metric: #{metricId}"
|
116
|
-
@metrics.push(NetuitiveD::IngestMetric.new(metricId, metricId, nil, type, nil, false))
|
117
|
-
@aggregatedSamples[metricId.to_s] = NetuitiveD::IngestSample.new(metricId, Time.new, val, nil, nil, nil, nil, nil)
|
118
|
-
else
|
119
|
-
if @aggregatedSamples[metricId.to_s].nil?
|
120
|
-
NetuitiveD::NetuitiveLogger.log.info "cannot aggregate metric #{metricId} that already has samples for this interval"
|
121
|
+
NetuitiveD::ErrorLogger.guard('exception during aggregateMetricWithType') do
|
122
|
+
@metricMutex.synchronize do
|
123
|
+
NetuitiveD::NetuitiveLogger.log.debug 'start addSample method'
|
124
|
+
NetuitiveD::NetuitiveLogger.log.debug "Thread: #{Thread.current.object_id}"
|
125
|
+
NetuitiveD::NetuitiveLogger.log.debug "self: #{object_id}"
|
126
|
+
NetuitiveD::NetuitiveLogger.log.debug "metrics id: #{@metrics.object_id}"
|
127
|
+
NetuitiveD::NetuitiveLogger.log.debug "samples id: #{@samples.object_id}"
|
128
|
+
NetuitiveD::NetuitiveLogger.log.debug "aggregatedSamples id: #{@aggregatedSamples.object_id}"
|
129
|
+
NetuitiveD::NetuitiveLogger.log.debug "metrics before aggregate: #{@metrics.count}"
|
130
|
+
NetuitiveD::NetuitiveLogger.log.debug "samples before aggregate: #{@aggregatedSamples.count + @samples.count}"
|
131
|
+
if metricId.nil?
|
132
|
+
NetuitiveD::NetuitiveLogger.log.info 'null metricId for aggregateMetric'
|
121
133
|
return false
|
122
134
|
end
|
123
|
-
|
124
|
-
|
125
|
-
|
135
|
+
if val.nil?
|
136
|
+
NetuitiveD::NetuitiveLogger.log.info "null value for aggregateMetric for metricId #{metricId}"
|
137
|
+
return false
|
138
|
+
end
|
139
|
+
if !metricExists metricId
|
140
|
+
NetuitiveD::NetuitiveLogger.log.info "adding new metric: #{metricId}"
|
141
|
+
@metrics.push(NetuitiveD::IngestMetric.new(metricId, metricId, nil, type, nil, false))
|
142
|
+
@aggregatedSamples[metricId.to_s] = NetuitiveD::IngestSample.new(metricId, Time.new, val, nil, nil, nil, nil, nil)
|
143
|
+
else
|
144
|
+
if @aggregatedSamples[metricId.to_s].nil?
|
145
|
+
NetuitiveD::NetuitiveLogger.log.info "cannot aggregate metric #{metricId} that already has samples for this interval"
|
146
|
+
return false
|
147
|
+
end
|
148
|
+
previousVal = @aggregatedSamples[metricId.to_s].val
|
149
|
+
@aggregatedSamples[metricId.to_s].val += val
|
150
|
+
NetuitiveD::NetuitiveLogger.log.info "netuitive sample aggregated #{metricId} old val: #{previousVal} new val: #{@aggregatedSamples[metricId.to_s].val}"
|
151
|
+
end
|
152
|
+
NetuitiveD::NetuitiveLogger.log.debug "metrics after aggregate: #{@metrics.count}"
|
153
|
+
NetuitiveD::NetuitiveLogger.log.debug "samples after aggregate: #{@aggregatedSamples.count + @samples.count}"
|
154
|
+
NetuitiveD::NetuitiveLogger.log.debug 'end addSample method'
|
126
155
|
end
|
127
|
-
NetuitiveD::NetuitiveLogger.log.debug "metrics after aggregate: #{@metrics.count}"
|
128
|
-
NetuitiveD::NetuitiveLogger.log.debug "samples after aggregate: #{@aggregatedSamples.count + @samples.count}"
|
129
|
-
NetuitiveD::NetuitiveLogger.log.debug 'end addSample method'
|
130
156
|
end
|
131
157
|
end
|
132
158
|
|
133
159
|
def clearMetrics
|
134
|
-
NetuitiveD::
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
160
|
+
NetuitiveD::ErrorLogger.guard('exception during clearMetrics') do
|
161
|
+
NetuitiveD::NetuitiveLogger.log.debug 'start clearMetrics method'
|
162
|
+
@metrics = []
|
163
|
+
@samples = []
|
164
|
+
@aggregatedSamples = {}
|
165
|
+
NetuitiveD::NetuitiveLogger.log.info 'netuitive metrics cleared'
|
166
|
+
NetuitiveD::NetuitiveLogger.log.debug 'end clearMetrics method'
|
167
|
+
end
|
140
168
|
end
|
141
169
|
end
|
142
170
|
end
|
@@ -13,6 +13,30 @@ module NetuitiveD
|
|
13
13
|
@metricAggregator.addSample(metricId, val)
|
14
14
|
end
|
15
15
|
|
16
|
+
def add_samples(samples)
|
17
|
+
@metricAggregator.add_samples(samples)
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_counter_samples(samples)
|
21
|
+
@metricAggregator.add_counter_samples(samples)
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_aggregate_metrics(samples)
|
25
|
+
@metricAggregator.add_aggregate_metrics(samples)
|
26
|
+
end
|
27
|
+
|
28
|
+
def add_aggregate_counter_metrics(samples)
|
29
|
+
@metricAggregator.add_aggregate_counter_metrics(samples)
|
30
|
+
end
|
31
|
+
|
32
|
+
def add_events(events)
|
33
|
+
@eventHandler.handle_events(events)
|
34
|
+
end
|
35
|
+
|
36
|
+
def add_exception_events(events)
|
37
|
+
@eventHandler.handle_exception_events(events)
|
38
|
+
end
|
39
|
+
|
16
40
|
def addCounterSample(metricId, val)
|
17
41
|
@metricAggregator.addCounterSample(metricId, val)
|
18
42
|
end
|
data/lib/netuitived/scheduler.rb
CHANGED
@@ -6,9 +6,11 @@ module NetuitiveD
|
|
6
6
|
NetuitiveD::NetuitiveLogger.log.debug "scheduler sleeping for: #{NetuitiveD::ConfigManager.interval}"
|
7
7
|
sleep(NetuitiveD::ConfigManager.interval)
|
8
8
|
Thread.new do
|
9
|
-
NetuitiveD::
|
10
|
-
|
11
|
-
|
9
|
+
NetuitiveD::ErrorLogger.guard('exception during schedule') do
|
10
|
+
NetuitiveD::NetuitiveLogger.log.debug 'scheduler sending metrics'
|
11
|
+
Netuitived.front_object.sendMetrics
|
12
|
+
NetuitiveD::NetuitiveLogger.log.debug 'scheduler sent metrics'
|
13
|
+
end
|
12
14
|
end
|
13
15
|
end
|
14
16
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: netuitived
|
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,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
|
description: Collects metrics over a certain interval and then sends them to Netuitive
|
15
15
|
email: jking@netuitive.com
|
@@ -31,6 +31,7 @@ files:
|
|
31
31
|
- lib/netuitived/config_manager.rb
|
32
32
|
- lib/netuitived/ingest_sample.rb
|
33
33
|
- lib/netuitived/ingest_metric.rb
|
34
|
+
- lib/netuitived/error_logger.rb
|
34
35
|
- lib/netuitived/event_handler.rb
|
35
36
|
- config/agent.yml
|
36
37
|
- ./LICENSE
|