add some metrics to the od request generation

This commit is contained in:
Samuel Beaulieu 2020-06-11 11:05:43 -05:00
parent dce2a96b68
commit f59b87a7ff
4 changed files with 20 additions and 9 deletions

View file

@ -5,6 +5,7 @@ require 'vmpooler/util/parsing'
module Vmpooler module Vmpooler
class API class API
class V1 < Sinatra::Base class V1 < Sinatra::Base
api_version = '1' api_version = '1'
api_prefix = "/api/v#{api_version}" api_prefix = "/api/v#{api_version}"
@ -336,9 +337,9 @@ module Vmpooler
end end
def too_many_requested?(payload) def too_many_requested?(payload)
payload&.each do |_poolname, count| payload&.each do |poolname, count|
next unless count.to_i > config['max_ondemand_instances_per_request'] next unless count.to_i > config['max_ondemand_instances_per_request']
metrics.increment('ondemandrequest.toomanyrequests.' + poolname)
return true return true
end end
false false
@ -362,6 +363,7 @@ module Vmpooler
if backend.exists("vmpooler__odrequest__#{request_id}") if backend.exists("vmpooler__odrequest__#{request_id}")
result['message'] = "request_id '#{request_id}' has already been created" result['message'] = "request_id '#{request_id}' has already been created"
status 409 status 409
metrics.increment('ondemandrequest.generate.duplicaterequests')
return result return result
end end
@ -385,6 +387,7 @@ module Vmpooler
result['domain'] = config['domain'] if config['domain'] result['domain'] = config['domain'] if config['domain']
result[:ok] = true result[:ok] = true
metrics.increment('ondemandrequest.generate.success')
result result
end end
@ -976,7 +979,7 @@ module Vmpooler
if request_hash['status'] == 'ready' if request_hash['status'] == 'ready'
result['ready'] = true result['ready'] = true
get_platform_pool_count(request_hash['requested']) do |platform_alias,pool,_count| Parsing.get_platform_pool_count(request_hash['requested']) do |platform_alias,pool,_count|
instances = backend.smembers("vmpooler__#{request_id}__#{platform_alias}__#{pool}") instances = backend.smembers("vmpooler__#{request_id}__#{platform_alias}__#{pool}")
result[platform_alias] = { 'hostname': instances } result[platform_alias] = { 'hostname': instances }
end end
@ -989,7 +992,7 @@ module Vmpooler
result['message'] = 'The request has been deleted' result['message'] = 'The request has been deleted'
status 200 status 200
else else
get_platform_pool_count(request_hash['requested']) do |platform_alias,pool,count| Parsing.get_platform_pool_count(request_hash['requested']) do |platform_alias,pool,count|
instance_count = backend.scard("vmpooler__#{request_id}__#{platform_alias}__#{pool}") instance_count = backend.scard("vmpooler__#{request_id}__#{platform_alias}__#{pool}")
result[platform_alias] = { result[platform_alias] = {
'ready': instance_count.to_s, 'ready': instance_count.to_s,
@ -1015,7 +1018,7 @@ module Vmpooler
else else
backend.hset("vmpooler__odrequest__#{request_id}", 'status', 'deleted') backend.hset("vmpooler__odrequest__#{request_id}", 'status', 'deleted')
get_platform_pool_count(platforms) do |platform_alias,pool,_count| Parsing.get_platform_pool_count(platforms) do |platform_alias,pool,_count|
backend.smembers("vmpooler__#{request_id}__#{platform_alias}__#{pool}")&.each do |vm| backend.smembers("vmpooler__#{request_id}__#{platform_alias}__#{pool}")&.each do |vm|
backend.smove("vmpooler__running__#{pool}", "vmpooler__completed__#{pool}", vm) backend.smove("vmpooler__running__#{pool}", "vmpooler__completed__#{pool}", vm)
end end

View file

@ -1501,7 +1501,7 @@ module Vmpooler
def vms_ready?(request_id, redis) def vms_ready?(request_id, redis)
catch :request_not_ready do catch :request_not_ready do
request_hash = redis.hgetall("vmpooler__odrequest__#{request_id}") request_hash = redis.hgetall("vmpooler__odrequest__#{request_id}")
get_platform_pool_count(request_hash['requested']) do |platform_alias,pool,count| Parsing.get_platform_pool_count(request_hash['requested']) do |platform_alias,pool,count|
pools_filled = redis.scard("vmpooler__#{request_id}__#{platform_alias}__#{pool}") pools_filled = redis.scard("vmpooler__#{request_id}__#{platform_alias}__#{pool}")
throw :request_not_ready unless pools_filled.to_i == count.to_i throw :request_not_ready unless pools_filled.to_i == count.to_i
end end
@ -1553,7 +1553,7 @@ module Vmpooler
def remove_vms_for_failed_request(request_id, expiration_ttl, redis) def remove_vms_for_failed_request(request_id, expiration_ttl, redis)
request_hash = redis.hgetall("vmpooler__odrequest__#{request_id}") request_hash = redis.hgetall("vmpooler__odrequest__#{request_id}")
get_platform_pool_count(request_hash['requested']) do |platform_alias,pool,_count| Parsing.get_platform_pool_count(request_hash['requested']) do |platform_alias,pool,_count|
pools_filled = redis.smembers("vmpooler__#{request_id}__#{platform_alias}__#{pool}") pools_filled = redis.smembers("vmpooler__#{request_id}__#{platform_alias}__#{pool}")
redis.pipelined do redis.pipelined do
pools_filled&.each do |vm| pools_filled&.each do |vm|

View file

@ -1,11 +1,11 @@
# utility class shared between apps # utility class shared between apps
module Vmpooler module Vmpooler
class Parsing class Parsing
def get_platform_pool_count(requested, &block) def self.get_platform_pool_count(requested, &block)
requested_platforms = requested.split(',') requested_platforms = requested.split(',')
requested_platforms.each do |platform| requested_platforms.each do |platform|
platform_alias, pool, count = platform.split(':') platform_alias, pool, count = platform.split(':')
#raise ArgumentError if platform_alias.nil? || pool.nil? || count.nil? raise ArgumentError if platform_alias.nil? || pool.nil? || count.nil?
yield platform_alias, pool, count yield platform_alias, pool, count
end end
end end

View file

@ -4872,6 +4872,14 @@ EOT
end end
end end
it 'fails if the request is not valid' do
redis_connection_pool.with do |redis|
request_id = "#{request_id}-wrong"
create_ondemand_request_for_test(request_id, current_time.to_i, "#{pool}:5", redis)
expect{subject.vms_ready?(request_id, redis)}.to raise_error(ArgumentError)
end
end
it 'returns false when vms for request_id are not ready' do it 'returns false when vms for request_id are not ready' do
redis_connection_pool.with do |redis| redis_connection_pool.with do |redis|
result = subject.vms_ready?(request_id, redis) result = subject.vms_ready?(request_id, redis)