netuitived 1.0.1 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|