mirror of
https://github.com/puppetlabs/vmpooler.git
synced 2026-01-26 10:08:40 -05:00
Previously VMPooler had no concept of a connection pooler. While there is an up to date connection pooler Gem (connection_pool), that supports MRI and jRuby, it lacked metrics which are useful to diagnose errors and judge pool size. This commit: - Brings in the connection_pool gem - Creates a new class called generic_connection_pool which inherits from the ConnectionPool class in the connection_pool gem. - Extends the connection pool object with a new function called `with_metrics` This copies the code from the original `with` method but emits metrics for how long it took to get an object from the pool, and then how many objects are left in the pool. This is sent using VMPooler's metrics object. Extending the object was used instead of overriding as it was not possible to inject into the existing function and monkey patching did not seem the correct way. In order use the metics, the GenericConnectionPool object modifies the initialize method to use :metrics and :metrics_prefix options - Also added tests for the GenericConnectionPool class to ensure the new functions are tested. Note that the functionality that was not extended is not tested in VMPooler.
107 lines
2.9 KiB
Ruby
107 lines
2.9 KiB
Ruby
require 'rubygems' unless defined?(Gem)
|
|
|
|
module Vmpooler
|
|
require 'date'
|
|
require 'json'
|
|
require 'open-uri'
|
|
require 'rbvmomi'
|
|
require 'redis'
|
|
require 'sinatra/base'
|
|
require 'time'
|
|
require 'timeout'
|
|
require 'yaml'
|
|
require 'set'
|
|
|
|
%w[api graphite logger pool_manager statsd dummy_statsd generic_connection_pool providers].each do |lib|
|
|
begin
|
|
require "vmpooler/#{lib}"
|
|
rescue LoadError
|
|
require File.expand_path(File.join(File.dirname(__FILE__), 'vmpooler', lib))
|
|
end
|
|
end
|
|
|
|
def self.config(filepath = 'vmpooler.yaml')
|
|
parsed_config = {}
|
|
|
|
if ENV['VMPOOLER_CONFIG']
|
|
# Load configuration from ENV
|
|
parsed_config = YAML.safe_load(ENV['VMPOOLER_CONFIG'])
|
|
else
|
|
# Load the configuration file from disk
|
|
config_file = File.expand_path(filepath)
|
|
parsed_config = YAML.load_file(config_file)
|
|
end
|
|
|
|
# Bail out if someone attempts to start vmpooler with dummy authentication
|
|
# without enbaling debug mode.
|
|
if parsed_config[:auth]['provider'] == 'dummy'
|
|
unless ENV['VMPOOLER_DEBUG']
|
|
warning = [
|
|
'Dummy authentication should not be used outside of debug mode',
|
|
'please set environment variable VMPOOLER_DEBUG to \'true\' if you want to use dummy authentication'
|
|
]
|
|
|
|
raise warning.join(";\s")
|
|
end
|
|
end
|
|
|
|
# Set some configuration defaults
|
|
parsed_config[:redis] ||= {}
|
|
parsed_config[:redis]['server'] ||= 'localhost'
|
|
parsed_config[:redis]['data_ttl'] ||= 168
|
|
|
|
parsed_config[:config]['task_limit'] ||= 10
|
|
parsed_config[:config]['vm_checktime'] ||= 15
|
|
parsed_config[:config]['vm_lifetime'] ||= 24
|
|
parsed_config[:config]['prefix'] ||= ''
|
|
|
|
# Create an index of pool aliases
|
|
parsed_config[:pool_names] = Set.new
|
|
parsed_config[:pools].each do |pool|
|
|
parsed_config[:pool_names] << pool['name']
|
|
if pool['alias']
|
|
if pool['alias'].is_a?(Array)
|
|
pool['alias'].each do |a|
|
|
parsed_config[:alias] ||= {}
|
|
parsed_config[:alias][a] = pool['name']
|
|
parsed_config[:pool_names] << a
|
|
end
|
|
elsif pool['alias'].is_a?(String)
|
|
parsed_config[:alias][pool['alias']] = pool['name']
|
|
parsed_config[:pool_names] << pool['alias']
|
|
end
|
|
end
|
|
end
|
|
|
|
if parsed_config[:tagfilter]
|
|
parsed_config[:tagfilter].keys.each do |tag|
|
|
parsed_config[:tagfilter][tag] = Regexp.new(parsed_config[:tagfilter][tag])
|
|
end
|
|
end
|
|
|
|
parsed_config[:uptime] = Time.now
|
|
parsed_config
|
|
end
|
|
|
|
def self.new_redis(host = 'localhost')
|
|
Redis.new(host: host)
|
|
end
|
|
|
|
def self.new_logger(logfile)
|
|
Vmpooler::Logger.new logfile
|
|
end
|
|
|
|
def self.new_metrics(params)
|
|
if params[:statsd]
|
|
Vmpooler::Statsd.new(params[:statsd])
|
|
elsif params[:graphite]
|
|
Vmpooler::Graphite.new(params[:graphite])
|
|
else
|
|
Vmpooler::DummyStatsd.new
|
|
end
|
|
end
|
|
|
|
def self.pools(conf)
|
|
conf[:pools]
|
|
end
|
|
end
|