perus 0.1.13 → 0.1.14
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.
- checksums.yaml +4 -4
- data/lib/perus/server/app.rb +16 -16
- data/lib/perus/server/db.rb +32 -11
- data/lib/perus/server/migrations/001_create_systems.rb +0 -1
- data/lib/perus/server/public/css/style.css +1 -0
- data/lib/perus/server/server.rb +17 -11
- data/lib/perus/server/views/stats.erb +2 -0
- data/lib/perus/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3df40bd6deb3e165e357bb4227dbe0b834d33bf5
|
4
|
+
data.tar.gz: 4c31499544a9d3e97bd3fb7e99308df0cbe4776f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44f0105e7f52fb732e0effef6635ba31150af32db4daecee4e2e54b9618e2bec66c4ebd94a9854a32de21154b0b83342b54133698165ee0401e061482c28b56d
|
7
|
+
data.tar.gz: e08dce48e0555f801f3646b67de6489a0f44024409440e2f7a0bae229de4a7a304b644988104a2049fde254e3415948e123fb775442ab7d6041f867e746769c4
|
data/lib/perus/server/app.rb
CHANGED
@@ -104,6 +104,7 @@ module Perus::Server
|
|
104
104
|
|
105
105
|
get '/admin/stats' do
|
106
106
|
@stats = Stats.new
|
107
|
+
@queue_length = Server.ping_queue.length
|
107
108
|
erb :stats
|
108
109
|
end
|
109
110
|
|
@@ -147,31 +148,30 @@ module Perus::Server
|
|
147
148
|
|
148
149
|
# receive data from a client
|
149
150
|
post '/systems/:id/ping' do
|
150
|
-
|
151
|
-
|
151
|
+
timestamp = Time.now.to_i
|
152
|
+
ping_params = params.dup
|
152
153
|
|
154
|
+
if request.ip == '127.0.0.1' && ENV['RACK_ENV'] == 'production'
|
155
|
+
system_ip = request.env['HTTP_X_FORWARDED_FOR']
|
156
|
+
else
|
157
|
+
system_ip = request.ip
|
158
|
+
end
|
159
|
+
|
160
|
+
Server.ping_queue << Proc.new do
|
153
161
|
# update the system with its last known ip and update time
|
154
|
-
system = System.with_pk!(
|
162
|
+
system = System.with_pk!(ping_params['id'])
|
155
163
|
system.last_updated = timestamp
|
156
|
-
|
157
|
-
|
158
|
-
system.ip = request.env['HTTP_X_FORWARDED_FOR']
|
159
|
-
else
|
160
|
-
system.ip = request.ip
|
161
|
-
end
|
164
|
+
system.ip = system_ip
|
165
|
+
system.save
|
162
166
|
|
163
167
|
# errors is either nil or a hash of the format - module: [err, ...]
|
164
|
-
system.save_metric_errors(
|
168
|
+
system.save_metric_errors(ping_params, timestamp)
|
165
169
|
|
166
170
|
# add each new value, a later process cleans up old values
|
167
|
-
system.save_values(
|
171
|
+
system.save_values(ping_params, timestamp)
|
168
172
|
|
169
173
|
# save action return values and prevent them from running again
|
170
|
-
system.save_actions(
|
171
|
-
|
172
|
-
# ip, last updated, uploads and metrics are now updated. these are
|
173
|
-
# stored on the system.
|
174
|
-
system.save
|
174
|
+
system.save_actions(ping_params, timestamp)
|
175
175
|
end
|
176
176
|
|
177
177
|
content_type :json
|
data/lib/perus/server/db.rb
CHANGED
@@ -5,6 +5,7 @@ require 'concurrent'
|
|
5
5
|
module Perus::Server
|
6
6
|
module DB
|
7
7
|
MAX_VACUUM_ATTEMPTS = 5
|
8
|
+
MAX_CLEAN_ATTEMPTS = 5
|
8
9
|
|
9
10
|
def self.db
|
10
11
|
@db
|
@@ -80,11 +81,29 @@ module Perus::Server
|
|
80
81
|
# are removed from a system, the accompanying metric record is also
|
81
82
|
# removed.
|
82
83
|
cleanup_task = Concurrent::TimerTask.new do
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
84
|
+
attempts = 0
|
85
|
+
complete = false
|
86
|
+
|
87
|
+
while !complete && attempts < MAX_CLEAN_ATTEMPTS
|
88
|
+
begin
|
89
|
+
puts "Cleaning, attempt #{attempts + 1}"
|
90
|
+
start = Time.now
|
91
|
+
Perus::Server::DB.cleanup
|
92
|
+
Stats.cleaned!(Time.now - start)
|
93
|
+
complete = true
|
94
|
+
puts "Cleaning complete"
|
95
|
+
|
96
|
+
rescue
|
97
|
+
attempts += 1
|
98
|
+
if attempts < MAX_CLEAN_ATTEMPTS
|
99
|
+
puts "Clean failed, will reattempt after short sleep"
|
100
|
+
sleep(5)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
if !complete
|
106
|
+
puts "Clean failed more than MAX_CLEAN_ATTEMPTS"
|
88
107
|
Stats.cleaned!('failed')
|
89
108
|
end
|
90
109
|
end
|
@@ -98,12 +117,14 @@ module Perus::Server
|
|
98
117
|
# cached so lookups can be done against the db, rather than running
|
99
118
|
# each alert for each system on a page load.
|
100
119
|
cache_alerts_task = Concurrent::TimerTask.new do
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
120
|
+
if Server.ping_queue.empty?
|
121
|
+
begin
|
122
|
+
start = Time.now
|
123
|
+
Perus::Server::Alert.cache_active_alerts
|
124
|
+
Stats.alerts_cached!(Time.now - start)
|
125
|
+
rescue
|
126
|
+
Stats.alerts_cached!('failed')
|
127
|
+
end
|
107
128
|
end
|
108
129
|
end
|
109
130
|
|
data/lib/perus/server/server.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'thread'
|
2
2
|
require 'thin'
|
3
3
|
|
4
4
|
DEFAULT_SERVER_OPTIONS = {
|
@@ -25,6 +25,21 @@ module Perus::Server
|
|
25
25
|
# initialise/migrate the db and start cleanup/caching timers
|
26
26
|
DB.start
|
27
27
|
DB.start_timers
|
28
|
+
|
29
|
+
# ping data is processed in a thread pool
|
30
|
+
Thread.new do
|
31
|
+
while true
|
32
|
+
ping = Server.ping_queue.pop
|
33
|
+
begin
|
34
|
+
ping.call
|
35
|
+
rescue => e
|
36
|
+
puts e.inspect
|
37
|
+
if e.backtrace.is_a?(Array)
|
38
|
+
puts e.backtrace.join("\n") + "\n"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
28
43
|
end
|
29
44
|
|
30
45
|
def run
|
@@ -36,16 +51,7 @@ module Perus::Server
|
|
36
51
|
end
|
37
52
|
|
38
53
|
def self.ping_queue
|
39
|
-
|
40
|
-
@ping_queue ||= Concurrent::ThreadPoolExecutor.new(
|
41
|
-
min_threads: 2,
|
42
|
-
max_threads: 2,
|
43
|
-
max_queue: 0
|
44
|
-
)
|
45
|
-
end
|
46
|
-
|
47
|
-
def self.shutdown
|
48
|
-
@ping_queue.shutdown
|
54
|
+
@ping_queue ||= Queue.new
|
49
55
|
end
|
50
56
|
|
51
57
|
def self.options
|
data/lib/perus/version.rb
CHANGED