mirror of
https://github.com/mclueppers/xo-server.git
synced 2025-04-08 20:55:02 +02:00
Stats are now generated only when needed and at most every 10s.
This commit is contained in:
parent
9eb3973131
commit
e703824198
54
src/api.js
54
src/api.js
@ -531,59 +531,7 @@ Api.fn.server = {
|
||||
// Extra methods not really bound to an object.
|
||||
Api.fn.xo = {
|
||||
'getStats': function () {
|
||||
// @todo Keep up-to-date stats in this.xo to avoid unecessary
|
||||
// (and possibly heavy) computing.
|
||||
|
||||
var xo = this.xo;
|
||||
var xobjs = xo.xobjs;
|
||||
return Q.all([
|
||||
xobjs.host.get(),
|
||||
xobjs.host_metrics.get().then(function (metrics) {
|
||||
return _.indexBy(metrics, 'id');
|
||||
}),
|
||||
xobjs.VM.get({
|
||||
'is_a_template': false,
|
||||
'is_control_domain': false,
|
||||
}),
|
||||
xobjs.VM_metrics.get().then(function (metrics) {
|
||||
return _.indexBy(metrics, 'id');
|
||||
}),
|
||||
xobjs.SR.count(),
|
||||
]).spread(function (hosts, host_metrics, vms, vms_metrics, n_srs) {
|
||||
var running_vms = _.where(vms, {
|
||||
'power_state': 'Running',
|
||||
});
|
||||
|
||||
var n_cpus = 0;
|
||||
var total_memory = 0;
|
||||
_.each(hosts, function (host) {
|
||||
n_cpus += host.host_CPUs.length;
|
||||
total_memory += +host_metrics[host.metrics].memory_total;
|
||||
});
|
||||
|
||||
var n_vifs = 0;
|
||||
var n_vcpus = 0;
|
||||
var used_memory = 0;
|
||||
_.each(vms, function (vm) {
|
||||
var metrics = vms_metrics[vm.metrics];
|
||||
|
||||
n_vifs += vm.VIFs.length;
|
||||
n_vcpus += +metrics.VCPUs_number;
|
||||
used_memory += +metrics.memory_actual;
|
||||
});
|
||||
|
||||
return {
|
||||
'hosts': hosts.length,
|
||||
'vms': vms.length,
|
||||
'running_vms': running_vms.length,
|
||||
'used_memory': used_memory,
|
||||
'total_memory': total_memory,
|
||||
'vcpus': n_vcpus,
|
||||
'cpus': n_cpus,
|
||||
'vifs': n_vifs,
|
||||
'srs': n_srs,
|
||||
};
|
||||
});
|
||||
return this.xo.stats;
|
||||
},
|
||||
|
||||
'getSessionId': function (req) {
|
||||
|
62
src/xo.js
62
src/xo.js
@ -165,10 +165,67 @@ function Xo()
|
||||
}
|
||||
|
||||
// Connections to Xen pools/servers.
|
||||
this.connections = {};
|
||||
//this.connections = {};
|
||||
|
||||
// We will keep up-to-date stats in this object
|
||||
this.stats = {};
|
||||
}
|
||||
require('util').inherits(Xo, require('events').EventEmitter);
|
||||
|
||||
Xo.prototype.computeStats = _.throttle(function () {
|
||||
var xo = this;
|
||||
var xobjs = xo.xobjs;
|
||||
|
||||
return Q.all([
|
||||
xobjs.host.get(),
|
||||
xobjs.host_metrics.get().then(function (metrics) {
|
||||
return _.indexBy(metrics, 'id');
|
||||
}),
|
||||
xobjs.VM.get({
|
||||
'is_a_template': false,
|
||||
'is_control_domain': false,
|
||||
}),
|
||||
xobjs.VM_metrics.get().then(function (metrics) {
|
||||
return _.indexBy(metrics, 'id');
|
||||
}),
|
||||
xobjs.SR.count(),
|
||||
]).spread(function (hosts, host_metrics, vms, vms_metrics, n_srs) {
|
||||
var running_vms = _.where(vms, {
|
||||
'power_state': 'Running',
|
||||
});
|
||||
|
||||
var n_cpus = 0;
|
||||
var total_memory = 0;
|
||||
_.each(hosts, function (host) {
|
||||
n_cpus += host.host_CPUs.length;
|
||||
total_memory += +host_metrics[host.metrics].memory_total;
|
||||
});
|
||||
|
||||
var n_vifs = 0;
|
||||
var n_vcpus = 0;
|
||||
var used_memory = 0;
|
||||
_.each(vms, function (vm) {
|
||||
var metrics = vms_metrics[vm.metrics];
|
||||
|
||||
n_vifs += vm.VIFs.length;
|
||||
n_vcpus += +metrics.VCPUs_number;
|
||||
used_memory += +metrics.memory_actual;
|
||||
});
|
||||
|
||||
xo.stats = {
|
||||
'hosts': hosts.length,
|
||||
'vms': vms.length,
|
||||
'running_vms': running_vms.length,
|
||||
'used_memory': used_memory,
|
||||
'total_memory': total_memory,
|
||||
'vcpus': n_vcpus,
|
||||
'cpus': n_cpus,
|
||||
'vifs': n_vifs,
|
||||
'srs': n_srs,
|
||||
};
|
||||
});
|
||||
}, 5000);
|
||||
|
||||
Xo.prototype.start = function (cfg) {
|
||||
var xo = this;
|
||||
var redis = require('then-redis').createClient(cfg.get('redis', 'uri'));
|
||||
@ -255,6 +312,7 @@ Xo.prototype.start = function (cfg) {
|
||||
});
|
||||
});
|
||||
})).then(function () {
|
||||
xo.computeStats();
|
||||
return xapi.call('event.register', ['*']);
|
||||
}).then(function () {
|
||||
return function loop() {
|
||||
@ -270,6 +328,8 @@ Xo.prototype.start = function (cfg) {
|
||||
|
||||
// @todo Handle operation types.
|
||||
collection.add(event.snapshot, {'replace': true});
|
||||
|
||||
xo.computeStats();
|
||||
}
|
||||
|
||||
return loop();
|
||||
|
Loading…
x
Reference in New Issue
Block a user