This repository has been archived on 2025-12-25. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
qmi-cloud/server/routes/api-stats.js
Manuel Romero e3e14d60b5 fix
2025-02-12 15:02:56 +01:00

226 lines
6.4 KiB
JavaScript

const express = require('express')
const router = express.Router()
const db = require('@QMI/qmi-cloud-common/mongo');
const moment = require('moment');
const azurecli = require('@QMI/qmi-cloud-common/azurecli');
const CACHED_PERIOD = 30; //minutes
var cachedTime;
var cachedTimeVms;
var cachedStats;
var cachedVms;
/**
* @swagger
* /stats:
* get:
* description: Get overall stats
* summary: Get overall stats
* produces:
* - application/json
* responses:
* 200:
* description: Stats
* 404:
* description: Not found
*
*/
router.get('/', async (req, res, next) => {
try {
var now = new Date().getTime();
var nowMinus5mins = now - CACHED_PERIOD*60*1000;
if ( (!req.query.disablecache || req.query.disablecache === 'no') && cachedStats && cachedTime && cachedTime > nowMinus5mins ) {
console.log("APIStats# Stats: return cached value");
cachedTime = now;
return res.json(cachedStats);
} else {
console.log("APIStats# Stats: new value");
let filterActiveP = { "isDestroyed": false, "status": "provisioned" };
let filterPRunning = { "isDestroyed": false, "status": "provisioned", "statusVms" : "Running" };
let initCurrentMonth = moment().startOf('month');
let initLastMonth = moment(initCurrentMonth).add(-1, 'months');
let today = moment();
let todayLastMonth = moment().add(-1, "months");
let filterTotalPCurrentMonth = { "status": "provisioned", "created": {
$gte: initCurrentMonth.toISOString(),
$lt: today.toISOString()
} };
let filterTotalPLastMonth = { "status": "provisioned", "created": {
$gte: initLastMonth.toISOString(),
$lt: todayLastMonth.toISOString()
} };
//Counts
let totalActiveP = await db.provision.count(filterActiveP);
let totalCPRunning = await db.provision.count(filterPRunning);
let totalPCurrentmonth = await db.provision.count(filterTotalPCurrentMonth);
let totalPLastmonth = await db.provision.count(filterTotalPLastMonth);
let totalUsers = await db.user.count({});
let totalAuthUsers = await db.user.count({
"lastLogin": {$gte: moment().add(-12, "hours").toISOString()}
});
let totalScenarios = await db.scenario.count({"isDisabled":false, "isAdminOnly": false});
cachedStats = {
provisions: {
active: totalActiveP,
running: totalCPRunning,
totalCurrentMonthPeriod: totalPCurrentmonth,
totalLastMonthPerdiod:totalPLastmonth
},
users: {
total: totalUsers,
activeNow: totalAuthUsers,
active7days: await db.user.count({
"lastLogin": {$gte: moment().add(-7, "days").toISOString()}
}),
active30days: await db.user.count({
"lastLogin": {$gte: moment().add(-30, "days").toISOString()}
})
},
scenarios: {
total: totalScenarios
}
};
cachedTime = now;
return res.json(cachedStats);
}
} catch (error) {
next(error);
}
});
async function appendResult(list, output ){
for await (const v of list) {
if ( v.tags && v.tags["QMI_user"] ) {
if (v.location) {
if ( !output.locations[v.location] ) {
output.locations[v.location] = 0;
}
output.locations[v.location] += 1;
}
if (v.storageProfile && v.storageProfile.osDisk && v.storageProfile.osDisk.osType) {
if ( !output.types[v.storageProfile.osDisk.osType] ) {
output.types[v.storageProfile.osDisk.osType] = 0;
}
output.types[v.storageProfile.osDisk.osType] += 1;
}
output.out.push(v);
}
}
return output;
}
/**
* @swagger
* /stats/vms:
* get:
* description: List azure vms
* summary: List azure vms
* produces:
* - application/json
* responses:
* 200:
* description: Stats
* 404:
* description: Not found
*
*/
router.get('/vms', async (req, res, next) => {
try {
var now = new Date().getTime();
var nowMinus5mins = now - CACHED_PERIOD*60*1000;
if ( (!req.query.disablecache || req.query.disablecache === 'no') && cachedVms && cachedTimeVms && cachedTimeVms > nowMinus5mins ) {
console.log("APIStats# VMs: return cached value");
cachedTimeVms = now;
return res.json(cachedVms);
} else {
console.log("APIStats# VMs: new value");
var output = {
out : [],
locations: {
"eastus": 0,
"westeurope": 0,
"southeastasia": 0
},
types: {
"Windows": 0,
"Linux": 0
}
}
/*var result = await azurecli.getAllVms();
output = await appendResult(result, output);
if ( result.nextLink ) {
console.log("There is a second page");
result = await azurecli.getAllVmsNext(result.nextLink);
output = await appendResult(result, output);
if ( result.nextLink ) {
console.log("There is a third page");
result = await azurecli.getAllVmsNext(result.nextLink);
output = await appendResult(result, output);
if ( result.nextLink ) {
console.log("There is a forth page");
result = await azurecli.getAllVmsNext(result.nextLink);
output = await appendResult(result, output);
if ( result.nextLink ) {
console.log("There is a fifth page");
result = await azurecli.getAllVmsNext(result.nextLink);
output = await appendResult(result, output);
if ( result.nextLink ) {
console.log("There is a sixth page");
result = await azurecli.getAllVmsNext(result.nextLink);
output = await appendResult(result, output);
if ( result.nextLink ) {
console.log("There is a seventh page");
}
}
}
}
}
}
*/
cachedTimeVms = now;
cachedVms = {
total: output.out.length,
locations: output.locations,
types: output.types
};
return res.json(cachedVms);
}
} catch (error) {
next(error);
}
});
module.exports = router;