1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-22 18:50:08 +03:00

bug #716: Fix monitoring information when no resources are present

This commit is contained in:
Daniel Molina 2011-09-14 17:10:49 +02:00
parent 73a6c317fb
commit de0d8cba73
4 changed files with 110 additions and 63 deletions

View File

@ -72,7 +72,7 @@ module OneWatch
# Upate the active VMs
@active_vms = new_active_vms.sort
WatchHelper::Vm.flush(@timestamp)
WatchHelper::Vm.flush
end
private

View File

@ -28,7 +28,7 @@ module OneWatch
}
end
sql_elem.flush(timestamp)
sql_elem.flush
end
private
@ -50,6 +50,11 @@ module OneWatch
WatchHelper::Vm
end
end
def generate_timestamp
ts = super
WatchHelper::VmTimestamp.find_or_create(:id=>ts)
end
end
class HostMonitoring < Monitoring
@ -64,5 +69,10 @@ module OneWatch
WatchHelper::Host
end
end
def generate_timestamp
ts = super
WatchHelper::HostTimestamp.find_or_create(:id=>ts)
end
end
end

View File

@ -97,25 +97,21 @@ module OneWatchClient
# Get the MAX for each VM and last_poll value
max_per_vm =
rsql.
group(:id, :last_poll).
select{[:last_poll, max(mr.to_sym).as(:max_mr)]}
group(:vm_id, :timestamp).
select{[:timestamp, max(mr.to_sym).as(:max_mr)]}
# SUM the monitoring resource for each last_poll value
last_poll_and_sum =
max_per_vm.
from_self.
group(:last_poll).
select{[:last_poll, sum(:max_mr).as(:sum_mr)]}
group(:timestamp).
select{[:timestamp, sum(:max_mr).as(:sum_mr)]}
# Retrieve the information in an Array
a = Array.new
last_poll_and_sum.each do |row|
if row[:last_poll] && row[:last_poll] != 0
a << [row[:last_poll], row[:sum_mr].to_i]
end
end
a
# Add all the existing timestamps
with_ts = timestamps.left_join(last_poll_and_sum, :timestamp=>:id)
with_ts.collect do |row|
[row[:id], row[:sum_mr].to_i]
end
end
def count_monitoring(rsql, opt)
@ -126,13 +122,13 @@ module OneWatchClient
else return nil
end
a = Array.new
count = resources.group_and_count(:timestamp)
resources.group_and_count(:timestamp).all.each { |row|
a << [row[:timestamp], row[:count].to_i]
}
a
# Add all the existing timestamps
with_ts = timestamps.left_join(count, :timestamp=>:id)
with_ts.collect do |row|
[row[:id], row[:count].to_i]
end
end
end
@ -157,6 +153,10 @@ module OneWatchClient
pool.filter(:state=>3)
end
def timestamps
WatchHelper::HostTimestamp
end
def filter_pool(filter)
if filter[:uid]
filter[:uid]==0 ? (hosts = pool) : (return nil)
@ -166,7 +166,7 @@ module OneWatchClient
hosts = pool
end
hosts.join(WatchHelper::HostSample, :host_id=>:id)
WatchHelper::HostSample.join(vms.select(:id.as(:host_id)), [:host_id])
end
def filter_resource(id, filter)
@ -204,6 +204,10 @@ module OneWatchClient
pool.filter(:state=>7)
end
def timestamps
WatchHelper::VmTimestamp
end
def filter_pool(filter)
if filter[:uid]
vms = pool.filter(:uid=>filter[:uid])
@ -213,7 +217,7 @@ module OneWatchClient
vms = pool
end
vms.join(WatchHelper::VmSample, :vm_id=>:id)
WatchHelper::VmSample.join(vms.select(:id.as(:vm_id)), [:vm_id])
end
def filter_resource(id, filter)

View File

@ -140,7 +140,7 @@ module WatchHelper
Integer :uid
Integer :gid
Integer :mem
Integer :cpu
Float :cpu
Integer :vcpu
Integer :stime
Integer :etime
@ -154,12 +154,16 @@ module WatchHelper
String :tm_mad
end
DB.create_table? :vm_timestamps do
Integer :id, :primary_key=>true
end
DB.create_table? :vm_samples do
foreign_key :vm_id, :vms, :key=>:id
foreign_key :timestamp, :vm_timestamps, :key=>:id
Integer :state
Integer :lcm_state
Integer :last_poll
Integer :timestamp
VM_SAMPLE.each { |key,value|
column key, value[:type]
@ -168,10 +172,14 @@ module WatchHelper
primary_key [:vm_id, :timestamp]
end
DB.create_table? :host_timestamps do
Integer :id, :primary_key=>true
end
DB.create_table? :host_samples do
foreign_key :host_id, :hosts, :key=>:id
foreign_key :timestamp, :host_timestamps, :key=>:id
Integer :last_poll
Integer :timestamp
Integer :state
HOST_SAMPLE.each { |key,value|
@ -216,12 +224,62 @@ module WatchHelper
unrestrict_primary_key
many_to_one :vm
many_to_one :timestamp,
:class=>"WatchHelper::VmTimestamp",
:key=>:id
end
class VmTimestamp < Sequel::Model
unrestrict_primary_key
one_to_many :samples,
:order=>:timestamp,
:class=>"WatchHelper::VmSample",
:key=>:timestamp
@@window_size = WatchHelper::get_config(
:VM_MONITORING,
:WINDOW_SIZE
)
def self.fix_size
if self.count > @@window_size
last_timestamp = self.all.first
last_timestamp.samples_dataset.destroy
last_timestamp.destroy
end
end
end
class HostSample < Sequel::Model
unrestrict_primary_key
many_to_one :host
many_to_one :timestamp,
:class=>"WatchHelper::HostTimestamp",
:key=>:id
end
class HostTimestamp < Sequel::Model
unrestrict_primary_key
one_to_many :samples,
:order=>:timestamp,
:class=>"WatchHelper::HostSample",
:key=>:timestamp
@@window_size = WatchHelper::get_config(
:HOST_MONITORING,
:WINDOW_SIZE
)
def self.fix_size
if self.count > @@window_size
last_timestamp = self.all.first
last_timestamp.remove_all_samples
last_timestamp.destroy
end
end
end
class Register < Sequel::Model
@ -256,26 +314,21 @@ module WatchHelper
# Accounting
one_to_many :registers, :order=>:seq
one_to_many :deltas, :order=>:timestamp, :class=>VmDelta
one_to_many :deltas, :order=>:timestamp, :class=>"WatchHelper::VmDelta"
# Monitoring
one_to_many :samples, :order=>:timestamp, :class=>VmSample
one_to_many :samples, :order=>:timestamp, :class=>"WatchHelper::VmSample"
@@samples_cache = []
@@deltas_cache = []
@@vm_window_size = WatchHelper::get_config(
:VM_MONITORING,
:WINDOW_SIZE
)
def self.info(vm)
Vm.find_or_create(:id=>vm['ID']) { |v|
v.name = vm['NAME']
v.uid = vm['UID'].to_i
v.gid = vm['GID'].to_i
v.mem = vm['TEMPLATE/MEMORY'].to_i
v.cpu = vm['TEMPLATE/CPU'].to_i
v.cpu = vm['TEMPLATE/CPU'].to_f
v.vcpu = vm['TEMPLATE/VCPU'].to_i
v.stime = vm['STIME'].to_i
v.etime = vm['ETIME'].to_i
@ -300,7 +353,7 @@ module WatchHelper
def add_sample_from_resource(vm, timestamp)
hash = {
:vm_id => vm['ID'],
:timestamp => timestamp,
:timestamp => timestamp.id,
:last_poll => vm['LAST_POLL'],
:state => vm['STATE'],
:lcm_state => vm['LCM_STATE']
@ -343,21 +396,14 @@ module WatchHelper
@@deltas_cache << hash
end
def self.flush(timestamp)
def self.flush
DB.transaction do
VmDelta.multi_insert(@@deltas_cache)
VmSample.multi_insert(@@samples_cache)
VmTimestamp.fix_size
end
step = WatchHelper::get_config(:STEP)
ws = WatchHelper::get_config(:VM_MONITORING,:WINDOW_SIZE)
vm_s = WatchHelper::get_config(:VM_MONITORING,:STEPS)
t = step*ws*vm_s
tl = timestamp - t
VmSample.filter('timestamp < ?', tl).destroy
@@samples_cache = []
@@deltas_cache = []
end
@ -367,16 +413,10 @@ module WatchHelper
unrestrict_primary_key
# Monitoring
one_to_many :samples, :order=>:timestamp, :class=>HostSample
one_to_many :samples, :order=>:timestamp, :class=>:HostSample
@@samples_cache = []
@@host_window_size = WatchHelper::get_config(
:HOST_MONITORING,
:WINDOW_SIZE
)
def self.info(host)
Host.find_or_create(:id=>host['ID']) { |h|
h.name = host['NAME']
@ -389,7 +429,7 @@ module WatchHelper
def add_sample_from_resource(host, timestamp)
hash = {
:host_id => host['ID'],
:timestamp => timestamp,
:timestamp => timestamp.id,
:last_poll => host['LAST_MON_TIME'],
:state => host['STATE'],
}
@ -402,20 +442,13 @@ module WatchHelper
@@samples_cache << hash
end
def self.flush(timestamp)
def self.flush
DB.transaction do
HostSample.multi_insert(@@samples_cache)
HostTimestamp.fix_size
end
step = WatchHelper::get_config(:STEP)
ws = WatchHelper::get_config(:HOST_MONITORING,:WINDOW_SIZE)
vm_s = WatchHelper::get_config(:HOST_MONITORING,:STEPS)
t = step*ws*vm_s
tl = timestamp - t
HostSample.filter('timestamp < ?', tl).destroy
@@samples_cache = []
end
end