1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-01-07 17:17:41 +03:00

B #4793: Fix DS VM monitoring

* Merge VM DB monitor information with previous record.
    * DS sends monitor data to monitord socket
    * Fix VM monitor template merging for "local" disks

co-authored-by: Pavel Czerný <pczerny@opennebula.systems>
This commit is contained in:
Ruben S. Montero 2020-05-26 19:21:17 +02:00
parent bf1946fe76
commit 4702edee46
No known key found for this signature in database
GPG Key ID: A0CEA6FA880A1D87
6 changed files with 117 additions and 39 deletions

View File

@ -117,13 +117,19 @@ public:
/**
* Sets the monitor information of the VM.
* @param oid VM id
* @param result
* @param tmpl monitoring template
*/
void monitor_vm(int oid,
const std::string &deploy_id,
const Template &tmpl);
/**
* Sets the monitor information of the VM.
* @param deploy_id Wild VM deploy_id
* @param tmpl monitoring template
*/
void monitor_wild_vm(const std::string &deploy_id,
const Template &tmpl);
/**
* Receive start monitor failure/success from driver
* @param oid host id

View File

@ -53,6 +53,11 @@ public:
*/
int update_monitoring(const VirtualMachineMonitorInfo& vm);
/**
* Read last monitoring from DB
*/
bool get_monitoring(int vmid, VirtualMachineMonitorInfo& vm);
/**
* Gets a VM ID by its deploy_id
* @param deploy_id to search the id for

View File

@ -62,6 +62,38 @@ int VMRPCPool::update_monitoring(const VirtualMachineMonitorInfo& monitoring)
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
bool VMRPCPool::get_monitoring(int vmid, VirtualMachineMonitorInfo& vm)
{
ostringstream cmd;
string monitor_str;
cmd << "SELECT " << one_db::vm_monitor_table << ".body FROM "
<< one_db::vm_monitor_table
<< " WHERE vmid = " << vmid
<< " AND last_poll=(SELECT MAX(last_poll) FROM "
<< one_db::vm_monitor_table
<< " WHERE vmid = " << vmid << ")";
string_cb cb(1);
cb.set_callback(&monitor_str);
int rc = db->exec_rd(cmd, &cb);
cb.unset_callback();
if (rc == 0 && !monitor_str.empty())
{
vm.from_xml(monitor_str);
return true;
}
return false;
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
int VMRPCPool::get_vmid(const string& deploy_id)
{
int rc;

View File

@ -307,7 +307,6 @@ void HostMonitorManager::update_last_monitor(int oid)
/* -------------------------------------------------------------------------- */
void HostMonitorManager::monitor_vm(int oid,
const string& uuid,
const Template &tmpl)
{
if (!is_leader)
@ -315,20 +314,11 @@ void HostMonitorManager::monitor_vm(int oid,
return;
}
if (oid < 0)
{
// Wild VM, check if it is imported to OpenNebula
oid = vmpool->get_vmid(uuid);
if (oid < 0)
{
// Not imported VM, ignore monitoring
return;
}
}
VirtualMachineMonitorInfo monitoring(oid, time(nullptr));
//Get previous monitor info to merge with new data
vmpool->get_monitoring(oid, monitoring);
if (monitoring.from_template(tmpl) != 0)
{
string str;
@ -349,6 +339,29 @@ void HostMonitorManager::monitor_vm(int oid,
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void HostMonitorManager::monitor_wild_vm(const string& deploy_id,
const Template &tmpl)
{
if (!is_leader)
{
return;
}
// Wild VM, check if it is imported to OpenNebula
int oid = vmpool->get_vmid(deploy_id);
if (oid < 0)
{
// Not imported VM, ignore monitoring
return;
}
monitor_vm(oid, tmpl);
}
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
void HostMonitorManager::start_monitor_failure(int oid)
{
if (!is_leader)

View File

@ -68,12 +68,12 @@ void MonitorDriverProtocol::_monitor_vm(message_t msg)
return;
}
map<string, pair<int, Template>> vms_templ;
map<int, Template> vms_templ;
vector<VectorAttribute*> vms;
tmpl.get("VM", vms);
// Merge all attributes by deploy_id
// Merge all attributes by ID
for (const auto& vm : vms)
{
int id = -1;
@ -90,35 +90,47 @@ void MonitorDriverProtocol::_monitor_vm(message_t msg)
auto monitor_plain = one_util::base64_decode(monitor_b64);
if (monitor_plain != nullptr)
if (monitor_plain == nullptr)
{
Template mon_tmpl;
NebulaLog::error("MDP", "Error decoding VM monitor attribute: "
+ monitor_b64);
continue;
}
rc = mon_tmpl.parse(*monitor_plain, &error_msg);
Template mon_tmpl;
if (rc != 0)
{
NebulaLog::error("MDP", "Error parsing VM monitor attribute: "
+ *monitor_plain + ", error: " + error_msg);
rc = mon_tmpl.parse(*monitor_plain, &error_msg);
delete monitor_plain;
free(error_msg);
continue;
}
if (rc != 0)
{
NebulaLog::error("MDP", "Error parsing VM monitor attribute: "
+ *monitor_plain + ", error: " + error_msg);
delete monitor_plain;
auto it = vms_templ.find(deploy_id);
free(error_msg);
continue;
}
delete monitor_plain;
if (id < 0)
{
// Wild VM, no need to merge storage monitor data
hm->monitor_wild_vm(deploy_id, mon_tmpl);
}
else
{
// OpenNebula VM, merge templates with same ID
auto it = vms_templ.find(id);
if (it == vms_templ.end())
{
vms_templ.insert(make_pair(std::move(deploy_id),
make_pair(id, std::move(mon_tmpl))));
vms_templ[id] = std::move(mon_tmpl);
}
else
{
it->second.second.merge(&mon_tmpl);
it->second.merge(&mon_tmpl);
}
}
}
@ -126,7 +138,7 @@ void MonitorDriverProtocol::_monitor_vm(message_t msg)
// Process all monitoring templates
for (const auto& vm : vms_templ)
{
hm->monitor_vm(vm.second.first, vm.first, vm.second.second);
hm->monitor_vm(vm.first, vm.second);
}
}
@ -247,7 +259,7 @@ void MonitorDriverProtocol::_state_vm(message_t msg)
*/
void MonitorDriverProtocol::_start_monitor(message_t msg)
{
NebulaLog::debug("MDP", "Received start monitor for host " +
NebulaLog::ddebug("MDP", "Received start monitor for host " +
to_string(msg->oid()) + ": " + msg->payload());
if (msg->status() != "SUCCESS")

View File

@ -78,13 +78,15 @@ echo "TOTAL_MB=\$TOTAL_MB"
if [ $MONITOR_VM_DISKS -eq 1 ]; then
vms=\$(ls "$BASE_PATH" | grep '^[0-9]\+$')
monitor=""
for vm in \$vms; do
vmdir="${BASE_PATH}/\${vm}"
disks=\$(ls "\$vmdir" 2>/dev/null | grep '^disk\.[0-9]\+$')
[ -z \$disks ] && continue
echo -n "VM=[ID=\$vm,POLL=\""
vm_monitor=""
for disk in \$disks; do
disk_id="\$(echo "\$disk" | cut -d. -f2)"
@ -92,7 +94,8 @@ if [ $MONITOR_VM_DISKS -eq 1 ]; then
snap_dir="\${vmdir}/\${disk}.snap"
[ -z "\$disk_size" ] && continue
echo -n "DISK_SIZE=[ID=\${disk_id},SIZE=\${disk_size}] "
vm_monitor="\${vm_monitor} DISK_SIZE = [ ID=\${disk_id}, SIZE=\${disk_size}]"
if [ -e "\$snap_dir" ]; then
snaps="\$(ls "\$snap_dir" 2>/dev/null | grep '^[0-9]$')"
@ -100,13 +103,20 @@ if [ $MONITOR_VM_DISKS -eq 1 ]; then
for snap in \$snaps; do
snap_size="\$(du -mL "\${snap_dir}/\${snap}" 2>/dev/null | awk '{print \$1}')"
[ -z "\$snap_size" ] && continue
echo -n "SNAPSHOT_SIZE=[ID=\${snap},DISK_ID=\${disk_id},SIZE=\${snap_size}] "
vm_monitor="\${vm_monitor}\nSNAPSHOT_SIZE = "\
"[ ID=\${snap}, DISK_ID=\${disk_id}, SIZE=\${snap_size}]"
done
fi
done
echo "\"]"
vm_monitor_b64="\$(echo \$vm_monitor | base64 -w 0)"
monitor="\${monitor}VM=[ID=\$vm,MONITOR=\"\$vm_monitor_b64\"] "
done
monitor_b64="\$(echo \$monitor | ruby -e "require 'zlib';\
puts Zlib::Deflate.deflate(STDIN.read)" | base64 -w 0)"
echo MONITOR_VM SUCCESS 0 \$monitor_b64 | nc -u -w0 127.0.0.1 4124
fi
EOF