Added CPU to server graph.
Ylian Saint-Hilaire committed
Jun 22, 2021 at 09:55 UTC
83117f340960b3cf9ba35db9204c2916d83fc4ce
2 files changed
+31
-5
meshcentral.js
+1
-1
@@ -1716,7 +1716,6 @@ function CreateMeshCentralServer(config, args) {
1716
time: new Date(),
1717
expire: expire,
1718
mem: process.memoryUsage(),
1719
- //cpu: process.cpuUsage(),
1719
conn: {
1720
ca: Object.keys(obj.webserver.wsagents).length,
1721
cu: Object.keys(obj.webserver.wssessions).length,
@@ -1725,6 +1724,7 @@ function CreateMeshCentralServer(config, args) {
1724
},
1725
traffic: trafficStats.delta
1726
};
1727
+ try { data.cpu = require('os').loadavg(); } catch (ex) { }
1728
if (obj.mpsserver != null) {
1729
data.conn.am = 0;
1730
for (var i in obj.mpsserver.ciraConnections) { data.conn.am += obj.mpsserver.ciraConnections[i].length; }
views/default.handlebars
+30
-4
@@ -1037,6 +1037,7 @@
1037
<select id=p40type onchange=updateServerTimelineStats()>
1038
<option value=0>Connections</option>
1039
<option value=1>Memory</option>
1040
+ <option value=5>CPU</option>
1041
<option value=3>Inbound Traffic</option>
1042
<option value=4>Outbound Traffic</option>
1043
</select>
@@ -1934,6 +1935,7 @@
1935
if ('{{currentNode}}'.toLowerCase() == '') { meshserver.send({ action: 'files' }); }
1936
if ('{{viewmode}}'.toLowerCase() == '') { go(1); }
1937
authCookieRenewTimer = setInterval(function () { meshserver.send({ action: 'authcookie' }); }, 1800000); // Request a cookie refresh every 30 minutes.
1938
+ if (xxcurrentView == 40) { refreshServerTimelineStats(); }
1939
}
1940
}
1941
@@ -14696,7 +14698,7 @@
14698
}
14699
};
14700
14699
- function refreshServerTimelineStats(stats) { meshserver.send({ action: 'servertimelinestats', hours: 24 * 30 }); }
14701
+ function refreshServerTimelineStats(stats) { if ((meshserver != null) && (meshserver.State == 2)) { meshserver.send({ action: 'servertimelinestats', hours: 24 * 30 }); } }
14702
function pastDate(hours) { var t = new Date(); t.setTime(t.getTime() - (60 * 60 * 1000 * hours)); return t; }
14703
function setServerTimelineStats(stats) { serverTimelineStats = stats; updateServerTimelineStats(); }
14704
function addServerTimelineStats(stats) {
@@ -14712,19 +14714,21 @@
14714
14715
serverTimelineStats.push(stats);
14716
var chartType = Q('p40type').value;
14715
- if (chartType == 0) {
14717
+ if (chartType == 0) { // Connections
14718
serverTimelineConfig.data.datasets[0].data.push({ x: stats.time, y: stats.conn.ca });
14719
serverTimelineConfig.data.datasets[1].data.push({ x: stats.time, y: stats.conn.cu });
14720
serverTimelineConfig.data.datasets[2].data.push({ x: stats.time, y: stats.conn.us });
14721
serverTimelineConfig.data.datasets[3].data.push({ x: stats.time, y: stats.conn.rs });
14722
if (stats.conn.am != null) { serverTimelineConfig.data.datasets[4].data.push({ x: stats.time, y: stats.conn.am }); }
14721
- } else if (chartType == 1) {
14723
+ } else if (chartType == 1) { // Memory
14724
serverTimelineConfig.data.datasets[0].data.push({ x: stats.time, y: stats.mem.external / (1024 * 1024) });
14725
serverTimelineConfig.data.datasets[1].data.push({ x: stats.time, y: stats.mem.heapUsed / (1024 * 1024) });
14726
serverTimelineConfig.data.datasets[2].data.push({ x: stats.time, y: stats.mem.heapTotal / (1024 * 1024) });
14727
serverTimelineConfig.data.datasets[3].data.push({ x: stats.time, y: stats.mem.rss / (1024 * 1024) });
14726
- } else if ((chartType == 3) || (chartType == 4)) {
14728
+ } else if ((chartType == 3) || (chartType == 4)) { // Traffic
14729
updateServerTimelineStats();
14730
+ } else if (chartType == 5) { // CPU
14731
+ if ((typeof stats.cpu == 'object') && (typeof stats.cpu[0] == 'number')) { serverTimelineConfig.data.datasets[0].data.push({ x: stats.time, y: stats.cpu[0] }); }
14732
}
14733
/* else if (chartType == 2) {
14734
serverTimelineConfig.data.datasets[0].data.push({ x: stats.time, y: stats.db.meshes });
@@ -14891,6 +14895,28 @@
14895
if (seriesWithData & 0x0800) { data.datasets[z++].data.push({ x: serverTimelineStats[i].time, y: (serverTimelineStats[i].traffic.desktopMultiplex && serverTimelineStats[i].traffic.desktopMultiplex.out) ? (serverTimelineStats[i].traffic.desktopMultiplex.out / 0x100000) : 0 }); }
14896
}
14897
}
14898
+ } else if (chartType == 5) { // CPU
14899
+ serverTimelineConfig.options.scales.yAxes[0].scaleLabel.labelString = "Usage";
14900
+ data = {
14901
+ labels: [pastDate(0), timeAfter],
14902
+ datasets: [
14903
+ { label: "CPU", data: [], backgroundColor: 'rgba(158, 151, 16, .1)', borderColor: 'rgb(158, 151, 16)', fill: true }
14904
+ ]
14905
+ };
14906
+ for (var i = 0; i < serverTimelineStats.length; i++) {
14907
+ if ((typeof serverTimelineStats[i].cpu == 'object') && (typeof serverTimelineStats[i].cpu[0] == 'number')) {
14908
+ if ((serverTimelineStats[i].s != null) && (servers.indexOf(serverTimelineStats[i].s) == -1)) {
14909
+ servers.push(serverTimelineStats[i].s);
14910
+ if (serverAutoSelect) { selectedServer = serverTimelineStats[i].s; serverAutoSelect = false; }
14911
+ }
14912
+ if (serverTimelineStats[i].s == null) { serverEmptyExists = true; }
14913
+ if (serverTimelineStats[i].s != selectedServer) { continue; }
14914
+ if (serverTimelineStats[i].first == true) {
14915
+ data.datasets[0].data.push({ x: serverTimelineStats[i].time - 1, y: NaN });
14916
+ }
14917
+ data.datasets[0].data.push({ x: serverTimelineStats[i].time, y: serverTimelineStats[i].cpu[0] });
14918
+ }
14919
+ }
14920
}
14921
/*else if (chartType == 2) { // Database
14922
serverTimelineConfig.options.scales.yAxes[0].scaleLabel.labelString = 'Records';