123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- import { Meteor } from 'meteor/meteor';
- import Users from '../users';
- 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;
- //console.log("trustedIpAddress", trustedIpAddress);
- //console.log("trustedIpAddress !== undefined && trustedIpAddress.split(",").includes(ipAddress)", trustedIpAddress !== undefined && trustedIpAddress.split(",").includes(ipAddress));
- return (
- trustedIpAddress !== undefined &&
- trustedIpAddress.split(',').includes(ipAddress)
- );
- }
- Meteor.startup(() => {
- WebApp.connectHandlers.use('/metrics', (req, res, next) => {
- try {
- const ipAddress =
- req.headers['x-forwarded-for'] || req.socket.remoteAddress;
- // if(process.env.TRUST_PROXY_FORXARD)
- // {
- // const ipAddress = req.headers['x-forwarded-for'] || req.socket.remoteAddress
- // }else{
- // const ipAddress = req.socket.remoteAddress
- // }
- // List of trusted ip adress will be found in environment variable "WEKAN_METRICS_ACCEPTED_IP_ADDRESS" (separeted with commas)
- if (acceptedIpAddress(ipAddress)) {
- let metricsRes = '';
- let resCount = 0;
- //connected users
- metricsRes += '# Number of connected users\n';
- // To Do: Get number of connected user by using meteor socketJs
- const allOpenedSockets = Meteor.server.stream_server.open_sockets;
- let connectedUserIds = [];
- allOpenedSockets.forEach(
- (socket) =>
- //console.log('meteor session', socket._meteorSession.userId)
- socket._meteorSession.userId !== null &&
- connectedUserIds.push(socket._meteorSession.userId),
- );
- resCount = connectedUserIds.length; // KPI 1
- metricsRes += 'connectedUsers ' + resCount + '\n';
- //registered users
- metricsRes += '# Number of registered users\n';
- // To Do: Get number of registered user
- resCount = Users.find({}).count(); // KPI 2
- metricsRes += 'registeredUsers ' + resCount + '\n';
- resCount = 0;
- //board numbers
- metricsRes += '# Number of registered boards\n';
- // To Do: Get number of registered boards
- resCount = Boards.find({ archived: false, type: 'board' }).count(); // KPI 3
- metricsRes += 'registeredboards ' + resCount + '\n';
- resCount = 0;
- //board numbers by registered users
- metricsRes += '# Number of registered boards by registered users\n';
- // To Do: Get number of registered boards by registered users
- resCount =
- Boards.find({ archived: false, type: 'board' }).count() /
- Users.find({}).count(); // KPI 4
- metricsRes += 'registeredboardsBysRegisteredUsers ' + resCount + '\n';
- resCount = 0;
- //board numbers with only one member
- metricsRes += '# Number of registered boards\n';
- // To Do: Get board numbers with only one member
- resCount = Boards.find({
- archived: false,
- type: 'board',
- members: { $size: 1 },
- }).count(); // KPI 5
- metricsRes += 'registeredboardsWithOnlyOneMember ' + resCount + '\n';
- resCount = 0;
- // KPI 6 : - store last login date
- // KPI 6 = count where date of last connection > x days
- // Cutting in label since 5 days / 10 days / 20 days / 30 days
- //Number of users with last connection dated 5 days ago
- metricsRes +=
- '# Number of users with last connection dated 5 days ago\n';
- // To Do: Get number of users with last connection dated 5 days ago
- let xdays = 5;
- let dateWithXdaysAgo = new Date(
- new Date() - xdays * 24 * 60 * 60 * 1000,
- );
- //console.log({ dateWithXdaysAgo });
- resCount = Users.find({
- lastConnectionDate: { $gte: dateWithXdaysAgo },
- }).count(); // KPI 5
- metricsRes += 'usersWithLastConnectionDated5DaysAgo ' + resCount + '\n';
- resCount = 0;
- metricsRes +=
- '# Number of users with last connection dated 10 days ago\n';
- // To Do: Get number of users with last connection dated 10 days ago
- xdays = 10;
- dateWithXdaysAgo = new Date(new Date() - xdays * 24 * 60 * 60 * 1000);
- //console.log({ dateWithXdaysAgo });
- resCount = Users.find({
- lastConnectionDate: { $gte: dateWithXdaysAgo },
- }).count(); // KPI 5
- metricsRes +=
- 'usersWithLastConnectionDated10DaysAgo ' + resCount + '\n';
- resCount = 0;
- metricsRes +=
- '# Number of users with last connection dated 20 days ago\n';
- // To Do: Get number of users with last connection dated 20 days ago
- xdays = 20;
- dateWithXdaysAgo = new Date(new Date() - xdays * 24 * 60 * 60 * 1000);
- //console.log({ dateWithXdaysAgo });
- resCount = Users.find({
- lastConnectionDate: { $gte: dateWithXdaysAgo },
- }).count(); // KPI 5
- metricsRes +=
- 'usersWithLastConnectionDated20DaysAgo ' + resCount + '\n';
- resCount = 0;
- metricsRes +=
- '# Number of users with last connection dated 30 days ago\n';
- // To Do: Get number of users with last connection dated 20 days ago
- xdays = 30;
- dateWithXdaysAgo = new Date(new Date() - xdays * 24 * 60 * 60 * 1000);
- //console.log({ dateWithXdaysAgo });
- resCount = Users.find({
- lastConnectionDate: { $gte: dateWithXdaysAgo },
- }).count(); // KPI 5
- metricsRes +=
- 'usersWithLastConnectionDated30DaysAgo ' + resCount + '\n';
- resCount = 0;
- // TO DO:
- // 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)
- res.writeHead(200); // HTTP status
- res.end(metricsRes);
- } else {
- res.writeHead(401); // HTTP status
- res.end(
- 'IpAddress: ' +
- ipAddress +
- ' is not authorized to perform this action !!\n',
- );
- }
- } catch (e) {
- res.writeHead(500); // HTTP status
- res.end(e.toString());
- }
- });
- });
|