vmpooler 0.10.3 → 0.11.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.
- 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
|