vmpooler 0.10.3 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/vmpooler +2 -3
- data/lib/vmpooler/api/dashboard.rb +12 -5
- data/lib/vmpooler/api/helpers.rb +47 -42
- data/lib/vmpooler/api/reroute.rb +2 -0
- data/lib/vmpooler/api/v1.rb +49 -49
- data/lib/vmpooler/api.rb +2 -0
- data/lib/vmpooler/dashboard.rb +2 -1
- data/lib/vmpooler/dummy_statsd.rb +2 -0
- data/lib/vmpooler/generic_connection_pool.rb +8 -6
- data/lib/vmpooler/graphite.rb +5 -5
- data/lib/vmpooler/logger.rb +3 -1
- data/lib/vmpooler/pool_manager.rb +133 -120
- data/lib/vmpooler/providers/base.rb +5 -3
- data/lib/vmpooler/providers/dummy.rb +16 -12
- data/lib/vmpooler/providers/vsphere.rb +114 -95
- data/lib/vmpooler/providers.rb +13 -15
- data/lib/vmpooler/statsd.rb +9 -9
- data/lib/vmpooler/version.rb +3 -1
- data/lib/vmpooler.rb +20 -11
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eb4bf5469c97ce1d8a7a7a68f5241d70ea77f392f389bba5a640de020d9851a8
|
4
|
+
data.tar.gz: 089dd8a8a4369275858f40529a3e669b853ae4ff1fdd65009a7da7051388e9ff
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b094cac19b6a36afb1f1f5c43bf7c000116034169ef9a7d43a821ab595eb7feb6f799673b669f1d1acf19bde2f52b9ae96513a5f0bce96021719a0825a2effc0
|
7
|
+
data.tar.gz: 0b68695a5916fe1a013470f868f1d2cf6955d0f6ad14efb50530d9fb339fae2a488ec756cb2b76d4d81d19401e4f525e9693545b70f36215d2e14515e5b23343
|
data/bin/vmpooler
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Vmpooler
|
2
4
|
class API
|
3
5
|
class Dashboard < Sinatra::Base
|
4
|
-
|
5
6
|
helpers do
|
6
7
|
include Vmpooler::API::Helpers
|
7
8
|
end
|
@@ -21,9 +22,11 @@ module Vmpooler
|
|
21
22
|
|
22
23
|
if config[:graphs]
|
23
24
|
return false unless config[:graphs]['server']
|
25
|
+
|
24
26
|
@graph_server = config[:graphs]['server']
|
25
27
|
elsif config[:graphite]
|
26
28
|
return false unless config[:graphite]['server']
|
29
|
+
|
27
30
|
@graph_server = config[:graphite]['server']
|
28
31
|
else
|
29
32
|
false
|
@@ -36,9 +39,11 @@ module Vmpooler
|
|
36
39
|
|
37
40
|
if config[:graphs]
|
38
41
|
return 'vmpooler' unless config[:graphs]['prefix']
|
42
|
+
|
39
43
|
@graph_prefix = config[:graphs]['prefix']
|
40
44
|
elsif config[:graphite]
|
41
45
|
return false unless config[:graphite]['prefix']
|
46
|
+
|
42
47
|
@graph_prefix = config[:graphite]['prefix']
|
43
48
|
else
|
44
49
|
false
|
@@ -48,12 +53,14 @@ module Vmpooler
|
|
48
53
|
# what is the base URL for viewable graphs?
|
49
54
|
def graph_url
|
50
55
|
return false unless graph_server && graph_prefix
|
56
|
+
|
51
57
|
@graph_url ||= "http://#{graph_server}/render?target=#{graph_prefix}"
|
52
58
|
end
|
53
59
|
|
54
60
|
# return a full URL to a viewable graph for a given metrics target (graphite syntax)
|
55
61
|
def graph_link(target = '')
|
56
62
|
return '' unless graph_url
|
63
|
+
|
57
64
|
graph_url + target
|
58
65
|
end
|
59
66
|
|
@@ -76,7 +83,7 @@ module Vmpooler
|
|
76
83
|
history ||= {}
|
77
84
|
|
78
85
|
begin
|
79
|
-
buffer =
|
86
|
+
buffer = URI.parse(graph_link('.ready.*&from=-1hour&format=json')).read
|
80
87
|
history = JSON.parse(buffer)
|
81
88
|
|
82
89
|
history.each do |pool|
|
@@ -100,7 +107,7 @@ module Vmpooler
|
|
100
107
|
end
|
101
108
|
end
|
102
109
|
end
|
103
|
-
rescue
|
110
|
+
rescue StandardError
|
104
111
|
end
|
105
112
|
else
|
106
113
|
pools.each do |pool|
|
@@ -129,7 +136,7 @@ module Vmpooler
|
|
129
136
|
if params[:history]
|
130
137
|
if graph_url
|
131
138
|
begin
|
132
|
-
buffer =
|
139
|
+
buffer = URI.parse(graph_link('.running.*&from=-1hour&format=json')).read
|
133
140
|
JSON.parse(buffer).each do |pool|
|
134
141
|
if pool['target'] =~ /.*\.(.*)$/
|
135
142
|
pool['name'] = Regexp.last_match[1]
|
@@ -147,7 +154,7 @@ module Vmpooler
|
|
147
154
|
end
|
148
155
|
end
|
149
156
|
end
|
150
|
-
rescue
|
157
|
+
rescue StandardError
|
151
158
|
end
|
152
159
|
end
|
153
160
|
end
|
data/lib/vmpooler/api/helpers.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Vmpooler
|
2
4
|
|
3
5
|
class API
|
@@ -71,43 +73,44 @@ module Vmpooler
|
|
71
73
|
)
|
72
74
|
|
73
75
|
return true if ldap.bind
|
76
|
+
|
74
77
|
return false
|
75
78
|
end
|
76
79
|
|
77
80
|
def authenticate(auth, username_str, password_str)
|
78
81
|
case auth['provider']
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
result = authenticate_ldap(
|
88
|
-
ldap_port,
|
89
|
-
auth[:ldap]['host'],
|
90
|
-
auth[:ldap]['user_object'],
|
91
|
-
search_base,
|
92
|
-
username_str,
|
93
|
-
password_str,
|
94
|
-
)
|
95
|
-
return true if result == true
|
96
|
-
end
|
97
|
-
else
|
82
|
+
when 'dummy'
|
83
|
+
return (username_str != password_str)
|
84
|
+
when 'ldap'
|
85
|
+
ldap_base = auth[:ldap]['base']
|
86
|
+
ldap_port = auth[:ldap]['port'] || 389
|
87
|
+
|
88
|
+
if ldap_base.is_a? Array
|
89
|
+
ldap_base.each do |search_base|
|
98
90
|
result = authenticate_ldap(
|
99
91
|
ldap_port,
|
100
92
|
auth[:ldap]['host'],
|
101
93
|
auth[:ldap]['user_object'],
|
102
|
-
|
94
|
+
search_base,
|
103
95
|
username_str,
|
104
|
-
password_str
|
96
|
+
password_str
|
105
97
|
)
|
106
|
-
return result
|
98
|
+
return true if result == true
|
107
99
|
end
|
108
|
-
|
109
|
-
|
100
|
+
else
|
101
|
+
result = authenticate_ldap(
|
102
|
+
ldap_port,
|
103
|
+
auth[:ldap]['host'],
|
104
|
+
auth[:ldap]['user_object'],
|
105
|
+
ldap_base,
|
106
|
+
username_str,
|
107
|
+
password_str
|
108
|
+
)
|
109
|
+
return result
|
110
110
|
end
|
111
|
+
|
112
|
+
return false
|
113
|
+
end
|
111
114
|
end
|
112
115
|
|
113
116
|
def export_tags(backend, hostname, tags)
|
@@ -124,6 +127,7 @@ module Vmpooler
|
|
124
127
|
|
125
128
|
tags.each_pair do |tag, value|
|
126
129
|
next unless filter = Vmpooler::API.settings.config[:tagfilter][tag]
|
130
|
+
|
127
131
|
tags[tag] = value.match(filter).captures.join if value.match(filter)
|
128
132
|
end
|
129
133
|
|
@@ -161,7 +165,7 @@ module Vmpooler
|
|
161
165
|
backend.scard(key + pool['name'])
|
162
166
|
end
|
163
167
|
end
|
164
|
-
res.inject(0){ |m, x| m+x }.to_i
|
168
|
+
res.inject(0) { |m, x| m + x }.to_i
|
165
169
|
end
|
166
170
|
|
167
171
|
# Takes the pools and a key to run scard on
|
@@ -201,18 +205,18 @@ module Vmpooler
|
|
201
205
|
def get_capacity_metrics(pools, backend)
|
202
206
|
capacity = {
|
203
207
|
current: 0,
|
204
|
-
total:
|
208
|
+
total: 0,
|
205
209
|
percent: 0
|
206
210
|
}
|
207
211
|
|
208
212
|
pools.each do |pool|
|
209
|
-
capacity[:total]
|
213
|
+
capacity[:total] += pool['size'].to_i
|
210
214
|
end
|
211
215
|
|
212
216
|
capacity[:current] = get_total_across_pools_redis_scard(pools, 'vmpooler__ready__', backend)
|
213
217
|
|
214
218
|
if capacity[:total] > 0
|
215
|
-
capacity[:percent] = (
|
219
|
+
capacity[:percent] = (capacity[:current].fdiv(capacity[:total]) * 100.0).round(1)
|
216
220
|
end
|
217
221
|
|
218
222
|
capacity
|
@@ -220,16 +224,16 @@ module Vmpooler
|
|
220
224
|
|
221
225
|
def get_queue_metrics(pools, backend)
|
222
226
|
queue = {
|
223
|
-
pending:
|
224
|
-
cloning:
|
225
|
-
booting:
|
226
|
-
ready:
|
227
|
-
running:
|
227
|
+
pending: 0,
|
228
|
+
cloning: 0,
|
229
|
+
booting: 0,
|
230
|
+
ready: 0,
|
231
|
+
running: 0,
|
228
232
|
completed: 0,
|
229
|
-
total:
|
233
|
+
total: 0
|
230
234
|
}
|
231
235
|
|
232
|
-
queue[:pending] = get_total_across_pools_redis_scard(pools,'vmpooler__pending__', backend)
|
236
|
+
queue[:pending] = get_total_across_pools_redis_scard(pools, 'vmpooler__pending__', backend)
|
233
237
|
queue[:ready] = get_total_across_pools_redis_scard(pools, 'vmpooler__ready__', backend)
|
234
238
|
queue[:running] = get_total_across_pools_redis_scard(pools, 'vmpooler__running__', backend)
|
235
239
|
queue[:completed] = get_total_across_pools_redis_scard(pools, 'vmpooler__completed__', backend)
|
@@ -306,11 +310,11 @@ module Vmpooler
|
|
306
310
|
task = {
|
307
311
|
duration: {
|
308
312
|
average: 0,
|
309
|
-
min:
|
310
|
-
max:
|
311
|
-
total:
|
313
|
+
min: 0,
|
314
|
+
max: 0,
|
315
|
+
total: 0
|
312
316
|
},
|
313
|
-
count:
|
317
|
+
count: {
|
314
318
|
total: 0
|
315
319
|
}
|
316
320
|
}
|
@@ -450,7 +454,7 @@ module Vmpooler
|
|
450
454
|
def pool_index(pools)
|
451
455
|
pools_hash = {}
|
452
456
|
index = 0
|
453
|
-
|
457
|
+
pools.each do |pool|
|
454
458
|
pools_hash[pool['name']] = index
|
455
459
|
index += 1
|
456
460
|
end
|
@@ -461,13 +465,14 @@ module Vmpooler
|
|
461
465
|
prepared_template = backend.hget('vmpooler__template__prepared', pool['name'])
|
462
466
|
return false if prepared_template.nil?
|
463
467
|
return true if pool['template'] == prepared_template
|
468
|
+
|
464
469
|
return false
|
465
470
|
end
|
466
471
|
|
467
472
|
def is_integer?(x)
|
468
473
|
Integer(x)
|
469
474
|
true
|
470
|
-
rescue
|
475
|
+
rescue StandardError
|
471
476
|
false
|
472
477
|
end
|
473
478
|
|
@@ -487,7 +492,7 @@ module Vmpooler
|
|
487
492
|
def vm_ready?(vm_name, domain = nil)
|
488
493
|
begin
|
489
494
|
open_socket(vm_name, domain)
|
490
|
-
rescue =>
|
495
|
+
rescue StandardError => _e
|
491
496
|
return false
|
492
497
|
end
|
493
498
|
|
data/lib/vmpooler/api/reroute.rb
CHANGED
data/lib/vmpooler/api/v1.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Vmpooler
|
2
4
|
class API
|
3
5
|
class V1 < Sinatra::Base
|
@@ -37,22 +39,24 @@ module Vmpooler
|
|
37
39
|
end
|
38
40
|
|
39
41
|
def checkoutlock
|
40
|
-
Vmpooler::API
|
42
|
+
Vmpooler::API.settings.checkoutlock
|
41
43
|
end
|
42
44
|
|
43
45
|
def fetch_single_vm(template)
|
44
46
|
template_backends = [template]
|
45
47
|
aliases = Vmpooler::API.settings.config[:alias]
|
46
48
|
if aliases
|
47
|
-
template_backends
|
49
|
+
template_backends += aliases[template] if aliases[template].is_a?(Array)
|
48
50
|
template_backends << aliases[template] if aliases[template].is_a?(String)
|
49
51
|
pool_index = pool_index(pools)
|
50
52
|
weighted_pools = {}
|
51
53
|
template_backends.each do |t|
|
52
54
|
next unless pool_index.key? t
|
55
|
+
|
53
56
|
index = pool_index[t]
|
54
57
|
clone_target = pools[index]['clone_target'] || config['clone_target']
|
55
58
|
next unless config.key?('backend_weight')
|
59
|
+
|
56
60
|
weight = config['backend_weight'][clone_target]
|
57
61
|
if weight
|
58
62
|
weighted_pools[t] = weight
|
@@ -75,6 +79,7 @@ module Vmpooler
|
|
75
79
|
template_backends.each do |template_backend|
|
76
80
|
vms = backend.smembers("vmpooler__ready__#{template_backend}")
|
77
81
|
next if vms.empty?
|
82
|
+
|
78
83
|
vms.reverse.each do |vm|
|
79
84
|
ready = vm_ready?(vm, config['domain'])
|
80
85
|
if ready
|
@@ -104,7 +109,7 @@ module Vmpooler
|
|
104
109
|
|
105
110
|
backend.hset('vmpooler__vm__' + vm, 'token:token', request.env['HTTP_X_AUTH_TOKEN'])
|
106
111
|
backend.hset('vmpooler__vm__' + vm, 'token:user',
|
107
|
-
|
112
|
+
backend.hget('vmpooler__token__' + request.env['HTTP_X_AUTH_TOKEN'], 'user')
|
108
113
|
)
|
109
114
|
|
110
115
|
if config['vm_lifetime_auth'].to_i > 0
|
@@ -136,14 +141,14 @@ module Vmpooler
|
|
136
141
|
metrics.increment('checkout.empty.' + requested)
|
137
142
|
break
|
138
143
|
else
|
139
|
-
vms << [
|
144
|
+
vms << [vmpool, vmname, vmtemplate]
|
140
145
|
metrics.increment('checkout.success.' + vmtemplate)
|
141
146
|
end
|
142
147
|
end
|
143
148
|
end
|
144
149
|
|
145
150
|
if failed
|
146
|
-
vms.each do |(vmpool, vmname,
|
151
|
+
vms.each do |(vmpool, vmname, _vmtemplate)|
|
147
152
|
return_vm_to_ready_state(vmpool, vmname)
|
148
153
|
end
|
149
154
|
status 503
|
@@ -203,7 +208,7 @@ module Vmpooler
|
|
203
208
|
def reset_pool(payload)
|
204
209
|
result = { 'ok' => false }
|
205
210
|
|
206
|
-
payload.each do |poolname,
|
211
|
+
payload.each do |poolname, _count|
|
207
212
|
backend.sadd('vmpooler__poolreset', poolname)
|
208
213
|
end
|
209
214
|
status 201
|
@@ -220,7 +225,7 @@ module Vmpooler
|
|
220
225
|
|
221
226
|
payload.each do |poolname, clone_target|
|
222
227
|
unless pools[pool_index[poolname]]['clone_target'] == clone_target
|
223
|
-
pools[pool_index[poolname]]['clone_target']
|
228
|
+
pools[pool_index[poolname]]['clone_target'] = clone_target
|
224
229
|
backend.hset('vmpooler__config__clone_target', poolname, clone_target)
|
225
230
|
pools_updated += 1
|
226
231
|
status 201
|
@@ -234,42 +239,36 @@ module Vmpooler
|
|
234
239
|
def sync_pool_templates
|
235
240
|
pool_index = pool_index(pools)
|
236
241
|
template_configs = backend.hgetall('vmpooler__config__template')
|
237
|
-
|
238
|
-
template_configs.each do |poolname, template|
|
242
|
+
template_configs&.each do |poolname, template|
|
239
243
|
if pool_index.include? poolname
|
240
244
|
unless pools[pool_index[poolname]]['template'] == template
|
241
245
|
pools[pool_index[poolname]]['template'] = template
|
242
246
|
end
|
243
247
|
end
|
244
|
-
end
|
245
248
|
end
|
246
249
|
end
|
247
250
|
|
248
251
|
def sync_pool_sizes
|
249
252
|
pool_index = pool_index(pools)
|
250
253
|
poolsize_configs = backend.hgetall('vmpooler__config__poolsize')
|
251
|
-
|
252
|
-
poolsize_configs.each do |poolname, size|
|
254
|
+
poolsize_configs&.each do |poolname, size|
|
253
255
|
if pool_index.include? poolname
|
254
256
|
unless pools[pool_index[poolname]]['size'] == size.to_i
|
255
257
|
pools[pool_index[poolname]]['size'] == size.to_i
|
256
258
|
end
|
257
259
|
end
|
258
|
-
end
|
259
260
|
end
|
260
261
|
end
|
261
262
|
|
262
263
|
def sync_clone_targets
|
263
264
|
pool_index = pool_index(pools)
|
264
265
|
clone_target_configs = backend.hgetall('vmpooler__config__clone_target')
|
265
|
-
|
266
|
-
clone_target_configs.each do |poolname, clone_target|
|
266
|
+
clone_target_configs&.each do |poolname, clone_target|
|
267
267
|
if pool_index.include? poolname
|
268
268
|
unless pools[pool_index[poolname]]['clone_target'] == clone_target
|
269
269
|
pools[pool_index[poolname]]['clone_target'] == clone_target
|
270
|
-
|
270
|
+
end
|
271
271
|
end
|
272
|
-
end
|
273
272
|
end
|
274
273
|
end
|
275
274
|
|
@@ -368,36 +367,38 @@ module Vmpooler
|
|
368
367
|
pending_hash = get_list_across_pools_redis_scard(pools, 'vmpooler__pending__', backend)
|
369
368
|
lastBoot_hash = get_list_across_pools_redis_hget(pools, 'vmpooler__lastboot', backend)
|
370
369
|
|
371
|
-
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
384
|
-
|
385
|
-
|
386
|
-
|
370
|
+
unless views and not views.include?("pools")
|
371
|
+
pools.each do |pool|
|
372
|
+
# REMIND: move this out of the API and into the back-end
|
373
|
+
ready = ready_hash[pool['name']]
|
374
|
+
running = running_hash[pool['name']]
|
375
|
+
pending = pending_hash[pool['name']]
|
376
|
+
max = pool['size']
|
377
|
+
lastBoot = lastBoot_hash[pool['name']]
|
378
|
+
aka = pool['alias']
|
379
|
+
|
380
|
+
result[:pools][pool['name']] = {
|
381
|
+
ready: ready,
|
382
|
+
running: running,
|
383
|
+
pending: pending,
|
384
|
+
max: max,
|
385
|
+
lastBoot: lastBoot
|
386
|
+
}
|
387
387
|
|
388
|
-
|
389
|
-
|
390
|
-
|
388
|
+
if aka
|
389
|
+
result[:pools][pool['name']][:alias] = aka
|
390
|
+
end
|
391
391
|
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
|
392
|
+
# for backwards compatibility, include separate "empty" stats in "status" block
|
393
|
+
if ready == 0
|
394
|
+
result[:status][:empty] ||= []
|
395
|
+
result[:status][:empty].push(pool['name'])
|
396
396
|
|
397
|
-
|
398
|
-
|
397
|
+
result[:status][:ok] = false
|
398
|
+
result[:status][:message] = "Found #{result[:status][:empty].length} empty pools."
|
399
|
+
end
|
399
400
|
end
|
400
|
-
end
|
401
|
+
end
|
401
402
|
|
402
403
|
result[:status][:uptime] = (Time.now - Vmpooler::API.settings.config[:uptime]).round(1) if Vmpooler::API.settings.config[:uptime]
|
403
404
|
|
@@ -442,7 +443,6 @@ module Vmpooler
|
|
442
443
|
if aka
|
443
444
|
result[:pools][pool['name']][:alias] = aka
|
444
445
|
end
|
445
|
-
|
446
446
|
end
|
447
447
|
|
448
448
|
ready_hash = get_list_across_pools_redis_scard(poolscopy, 'vmpooler__ready__', backend)
|
@@ -456,7 +456,7 @@ module Vmpooler
|
|
456
456
|
get "#{api_prefix}/totalrunning/?" do
|
457
457
|
content_type :json
|
458
458
|
queue = {
|
459
|
-
running:
|
459
|
+
running: 0
|
460
460
|
}
|
461
461
|
|
462
462
|
queue[:running] = get_total_across_pools_redis_scard(pools, 'vmpooler__running__', backend)
|
@@ -753,7 +753,7 @@ module Vmpooler
|
|
753
753
|
|
754
754
|
def invalid_pool(payload)
|
755
755
|
invalid = []
|
756
|
-
payload.each do |pool,
|
756
|
+
payload.each do |pool, _clone_target|
|
757
757
|
invalid << pool unless pool_exists?(pool)
|
758
758
|
end
|
759
759
|
invalid
|
@@ -837,7 +837,7 @@ module Vmpooler
|
|
837
837
|
# Look up IP address of the hostname
|
838
838
|
begin
|
839
839
|
ipAddress = TCPSocket.gethostbyname(params[:hostname])[3]
|
840
|
-
rescue
|
840
|
+
rescue StandardError
|
841
841
|
ipAddress = ""
|
842
842
|
end
|
843
843
|
|
@@ -893,7 +893,7 @@ module Vmpooler
|
|
893
893
|
if backend.exists('vmpooler__vm__' + params[:hostname])
|
894
894
|
begin
|
895
895
|
jdata = JSON.parse(request.body.read)
|
896
|
-
rescue
|
896
|
+
rescue StandardError
|
897
897
|
halt 400, JSON.pretty_generate(result)
|
898
898
|
end
|
899
899
|
|
@@ -936,7 +936,7 @@ module Vmpooler
|
|
936
936
|
end
|
937
937
|
end
|
938
938
|
|
939
|
-
if failure.
|
939
|
+
if !failure.empty?
|
940
940
|
status 400
|
941
941
|
result['failure'] = failure
|
942
942
|
else
|
data/lib/vmpooler/api.rb
CHANGED
data/lib/vmpooler/dashboard.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'connection_pool'
|
2
4
|
|
3
5
|
module Vmpooler
|
@@ -20,15 +22,15 @@ module Vmpooler
|
|
20
22
|
start = Time.now
|
21
23
|
conn = checkout(options)
|
22
24
|
timespan_ms = ((Time.now - start) * 1000).to_i
|
23
|
-
@metrics
|
24
|
-
@metrics
|
25
|
+
@metrics&.gauge(@metric_prefix + '.available', @available.length)
|
26
|
+
@metrics&.timing(@metric_prefix + '.waited', timespan_ms)
|
25
27
|
begin
|
26
28
|
Thread.handle_interrupt(Exception => :immediate) do
|
27
29
|
yield conn
|
28
30
|
end
|
29
31
|
ensure
|
30
32
|
checkin
|
31
|
-
@metrics
|
33
|
+
@metrics&.gauge(@metric_prefix + '.available', @available.length)
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
@@ -38,13 +40,13 @@ module Vmpooler
|
|
38
40
|
start = Time.now
|
39
41
|
conn = checkout(options)
|
40
42
|
timespan_ms = ((Time.now - start) * 1000).to_i
|
41
|
-
@metrics
|
42
|
-
@metrics
|
43
|
+
@metrics&.gauge(@metric_prefix + '.available', @available.length)
|
44
|
+
@metrics&.timing(@metric_prefix + '.waited', timespan_ms)
|
43
45
|
begin
|
44
46
|
yield conn
|
45
47
|
ensure
|
46
48
|
checkin
|
47
|
-
@metrics
|
49
|
+
@metrics&.gauge(@metric_prefix + '.available', @available.length)
|
48
50
|
end
|
49
51
|
end
|
50
52
|
end
|
data/lib/vmpooler/graphite.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rubygems' unless defined?(Gem)
|
2
4
|
|
3
5
|
module Vmpooler
|
@@ -5,9 +7,7 @@ module Vmpooler
|
|
5
7
|
attr_reader :server, :port, :prefix
|
6
8
|
|
7
9
|
def initialize(params = {})
|
8
|
-
if params['server'].nil? || params['server'].empty?
|
9
|
-
raise ArgumentError, "Graphite server is required. Config: #{params.inspect}"
|
10
|
-
end
|
10
|
+
raise ArgumentError, "Graphite server is required. Config: #{params.inspect}" if params['server'].nil? || params['server'].empty?
|
11
11
|
|
12
12
|
@server = params['server']
|
13
13
|
@port = params['port'] || 2003
|
@@ -35,8 +35,8 @@ module Vmpooler
|
|
35
35
|
socket.close
|
36
36
|
end
|
37
37
|
end
|
38
|
-
rescue =>
|
39
|
-
|
38
|
+
rescue StandardError => e
|
39
|
+
warn "Failure logging #{path} to graphite server [#{server}:#{port}]: #{e}"
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
data/lib/vmpooler/logger.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rubygems' unless defined?(Gem)
|
2
4
|
|
3
5
|
module Vmpooler
|
@@ -14,7 +16,7 @@ module Vmpooler
|
|
14
16
|
|
15
17
|
puts "[#{stamp}] #{string}" if ENV['VMPOOLER_DEBUG']
|
16
18
|
|
17
|
-
open(@file, 'a') do |f|
|
19
|
+
File.open(@file, 'a') do |f|
|
18
20
|
f.puts "[#{stamp}] #{string}"
|
19
21
|
end
|
20
22
|
end
|