Ver Fonte

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

Emile Ndagijimana há 2 anos atrás
pai
commit
eb15751dae
1 ficheiros alterados com 60 adições e 35 exclusões
  1. 60 35
      models/server/metrics.js

+ 60 - 35
models/server/metrics.js

@@ -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);