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>&nbsp;
@@ -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';