feat(wekan metrics): rename metrics key and add a new one

This commit is contained in:
Emile Ndagijimana 2022-10-21 18:13:53 +02:00
parent d736b920d5
commit eb15751dae

View file

@ -2,24 +2,33 @@ import { Meteor } from 'meteor/meteor';
import Users from '../users'; import Users from '../users';
function acceptedIpAddress(ipAddress) { function acceptedIpAddress(ipAddress) {
//return true if a given ipAddress was setted by an admin user
// console.log('idpAddress', ipAddress);
//Check if ipAddress is accepted
// console.log(
// 'process.env.WEKAN_METRICS_ACCEPTED_IP_ADDRESS',
// process.env.WEKAN_METRICS_ACCEPTED_IP_ADDRESS,
// );
//console.log("process.env", process.env);
const trustedIpAddress = process.env.WEKAN_METRICS_ACCEPTED_IP_ADDRESS; const trustedIpAddress = process.env.WEKAN_METRICS_ACCEPTED_IP_ADDRESS;
//console.log("trustedIpAddress", trustedIpAddress);
//console.log("trustedIpAddress !== undefined && trustedIpAddress.split(",").includes(ipAddress)", trustedIpAddress !== undefined && trustedIpAddress.split(",").includes(ipAddress));
return ( return (
trustedIpAddress !== undefined && trustedIpAddress !== undefined &&
trustedIpAddress.split(',').includes(ipAddress) trustedIpAddress.split(',').includes(ipAddress)
); );
} }
const getBoardIdWithMostActivities = (dateWithXdaysAgo, nbLimit) => {
return Promise.await(
Activities.rawCollection()
.aggregate([
{
$match: {
modifiedAt: { $gte: dateWithXdaysAgo },
},
},
{ $group: { _id: '$boardId', count: { $sum: 1 } } },
{ $sort: { count: -1 } },
])
.limit(nbLimit)
.toArray(),
);
};
const getBoards = (boardIds) => {
return Boards.find({ _id: { $in: boardIds } }).fetch();
};
Meteor.startup(() => { Meteor.startup(() => {
WebApp.connectHandlers.use('/metrics', (req, res, next) => { WebApp.connectHandlers.use('/metrics', (req, res, next) => {
try { try {
@ -39,54 +48,55 @@ Meteor.startup(() => {
//connected users //connected users
metricsRes += '# Number of connected users\n'; metricsRes += '# Number of connected users\n';
// To Do: Get number of connected user by using meteor socketJs // Get number of connected user by using meteor socketJs
const allOpenedSockets = Meteor.server.stream_server.open_sockets; const allOpenedSockets = Meteor.server.stream_server.open_sockets;
let connectedUserIds = []; let connectedUserIds = [];
allOpenedSockets.forEach( allOpenedSockets.forEach(
(socket) => (socket) =>
//console.log('meteor session', socket._meteorSession.userId)
socket._meteorSession.userId !== null && socket._meteorSession.userId !== null &&
connectedUserIds.push(socket._meteorSession.userId), connectedUserIds.push(socket._meteorSession.userId),
); );
resCount = connectedUserIds.length; // KPI 1 resCount = connectedUserIds.length; // KPI 1
metricsRes += 'connectedUsers ' + resCount + '\n'; metricsRes += 'wekan_connectedUsers ' + resCount + '\n';
//registered users //registered users
metricsRes += '# Number of registered users\n'; metricsRes += '# Number of registered users\n';
// To Do: Get number of registered user // Get number of registered user
resCount = Users.find({}).count(); // KPI 2 resCount = Users.find({}).count(); // KPI 2
metricsRes += 'registeredUsers ' + resCount + '\n'; metricsRes += 'wekan_registeredUsers ' + resCount + '\n';
resCount = 0; resCount = 0;
//board numbers //board numbers
metricsRes += '# Number of registered boards\n'; metricsRes += '# Number of registered boards\n';
// To Do: Get number of registered boards // Get number of registered boards
resCount = Boards.find({ archived: false, type: 'board' }).count(); // KPI 3 resCount = Boards.find({ archived: false, type: 'board' }).count(); // KPI 3
metricsRes += 'registeredboards ' + resCount + '\n'; metricsRes += 'wekan_registeredboards ' + resCount + '\n';
resCount = 0; resCount = 0;
//board numbers by registered users //board numbers by registered users
metricsRes += '# Number of registered boards by registered users\n'; metricsRes += '# Number of registered boards by registered users\n';
// To Do: Get number of registered boards by registered users // Get number of registered boards by registered users
resCount = resCount =
Boards.find({ archived: false, type: 'board' }).count() / Boards.find({ archived: false, type: 'board' }).count() /
Users.find({}).count(); // KPI 4 Users.find({}).count(); // KPI 4
metricsRes += 'registeredboardsBysRegisteredUsers ' + resCount + '\n'; metricsRes +=
'wekan_registeredboardsBysRegisteredUsers ' + resCount + '\n';
resCount = 0; resCount = 0;
//board numbers with only one member //board numbers with only one member
metricsRes += '# Number of registered boards\n'; metricsRes += '# Number of registered boards\n';
// To Do: Get board numbers with only one member // Get board numbers with only one member
resCount = Boards.find({ resCount = Boards.find({
archived: false, archived: false,
type: 'board', type: 'board',
members: { $size: 1 }, members: { $size: 1 },
}).count(); // KPI 5 }).count(); // KPI 5
metricsRes += 'registeredboardsWithOnlyOneMember ' + resCount + '\n'; metricsRes +=
'wekan_registeredboardsWithOnlyOneMember ' + resCount + '\n';
resCount = 0; resCount = 0;
// KPI 6 : - store last login date // KPI 6 : - store last login date
@ -97,62 +107,77 @@ Meteor.startup(() => {
metricsRes += metricsRes +=
'# Number of users with last connection dated 5 days ago\n'; '# Number of users with last connection dated 5 days ago\n';
// To Do: Get number of users with last connection dated 5 days ago // Get number of users with last connection dated 5 days ago
let xdays = 5; let xdays = 5;
let dateWithXdaysAgo = new Date( let dateWithXdaysAgo = new Date(
new Date() - xdays * 24 * 60 * 60 * 1000, new Date() - xdays * 24 * 60 * 60 * 1000,
); );
//console.log({ dateWithXdaysAgo });
resCount = Users.find({ resCount = Users.find({
lastConnectionDate: { $gte: dateWithXdaysAgo }, lastConnectionDate: { $gte: dateWithXdaysAgo },
}).count(); // KPI 5 }).count(); // KPI 5
metricsRes += 'usersWithLastConnectionDated5DaysAgo ' + resCount + '\n'; metricsRes +=
'wekan_usersWithLastConnectionDated5DaysAgo ' + resCount + '\n';
resCount = 0; resCount = 0;
metricsRes += metricsRes +=
'# Number of users with last connection dated 10 days ago\n'; '# Number of users with last connection dated 10 days ago\n';
// To Do: Get number of users with last connection dated 10 days ago // Get number of users with last connection dated 10 days ago
xdays = 10; xdays = 10;
dateWithXdaysAgo = new Date(new Date() - xdays * 24 * 60 * 60 * 1000); dateWithXdaysAgo = new Date(new Date() - xdays * 24 * 60 * 60 * 1000);
//console.log({ dateWithXdaysAgo });
resCount = Users.find({ resCount = Users.find({
lastConnectionDate: { $gte: dateWithXdaysAgo }, lastConnectionDate: { $gte: dateWithXdaysAgo },
}).count(); // KPI 5 }).count(); // KPI 5
metricsRes += metricsRes +=
'usersWithLastConnectionDated10DaysAgo ' + resCount + '\n'; 'wekan_usersWithLastConnectionDated10DaysAgo ' + resCount + '\n';
resCount = 0; resCount = 0;
metricsRes += metricsRes +=
'# Number of users with last connection dated 20 days ago\n'; '# Number of users with last connection dated 20 days ago\n';
// To Do: Get number of users with last connection dated 20 days ago // Get number of users with last connection dated 20 days ago
xdays = 20; xdays = 20;
dateWithXdaysAgo = new Date(new Date() - xdays * 24 * 60 * 60 * 1000); dateWithXdaysAgo = new Date(new Date() - xdays * 24 * 60 * 60 * 1000);
//console.log({ dateWithXdaysAgo });
resCount = Users.find({ resCount = Users.find({
lastConnectionDate: { $gte: dateWithXdaysAgo }, lastConnectionDate: { $gte: dateWithXdaysAgo },
}).count(); // KPI 5 }).count(); // KPI 5
metricsRes += metricsRes +=
'usersWithLastConnectionDated20DaysAgo ' + resCount + '\n'; 'wekan_usersWithLastConnectionDated20DaysAgo ' + resCount + '\n';
resCount = 0; resCount = 0;
metricsRes += metricsRes +=
'# Number of users with last connection dated 30 days ago\n'; '# Number of users with last connection dated 30 days ago\n';
// To Do: Get number of users with last connection dated 20 days ago // Get number of users with last connection dated 20 days ago
xdays = 30; xdays = 30;
dateWithXdaysAgo = new Date(new Date() - xdays * 24 * 60 * 60 * 1000); dateWithXdaysAgo = new Date(new Date() - xdays * 24 * 60 * 60 * 1000);
//console.log({ dateWithXdaysAgo });
resCount = Users.find({ resCount = Users.find({
lastConnectionDate: { $gte: dateWithXdaysAgo }, lastConnectionDate: { $gte: dateWithXdaysAgo },
}).count(); // KPI 5 }).count(); // KPI 5
metricsRes += metricsRes +=
'usersWithLastConnectionDated30DaysAgo ' + resCount + '\n'; 'wekan_usersWithLastConnectionDated30DaysAgo ' + resCount + '\n';
resCount = 0; resCount = 0;
// TO DO: // TO DO:
// connection average: ((disconnection date - last connection date) + (last average)) / 2 // connection average: ((disconnection date - last connection date) + (last average)) / 2
// KPI 7 : sum of connection average / number of users (to ignore users with 0 average) // KPI 7 : sum of connection average / number of users (ignore users with 0 average)
metricsRes +=
'# Top 10 boards with most activities dated 30 days ago\n';
//Get top 10 table with most activities in current month
const boardIdWithMostActivities = getBoardIdWithMostActivities(
dateWithXdaysAgo,
xdays,
);
const boardWithMostActivities = boardIdWithMostActivities.map(
(board) => board._id,
);
getBoards(boardWithMostActivities).forEach((board, index) => {
metricsRes +=
`wekan_top10BoardsWithMostActivities{n=${board.title}} ${
index + 1
}` + '\n';
});
res.writeHead(200); // HTTP status res.writeHead(200); // HTTP status
res.end(metricsRes); res.end(metricsRes);