metrics.js 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import { Meteor } from 'meteor/meteor';
  2. import Users from '../users';
  3. function acceptedIpAddress(ipAddress) {
  4. //return true if a given ipAddress was setted by an admin user
  5. // console.log('idpAddress', ipAddress);
  6. //Check if ipAddress is accepted
  7. // console.log(
  8. // 'process.env.WEKAN_METRICS_ACCEPTED_IP_ADDRESS',
  9. // process.env.WEKAN_METRICS_ACCEPTED_IP_ADDRESS,
  10. // );
  11. //console.log("process.env", process.env);
  12. const trustedIpAddress = process.env.WEKAN_METRICS_ACCEPTED_IP_ADDRESS;
  13. //console.log("trustedIpAddress", trustedIpAddress);
  14. //console.log("trustedIpAddress !== undefined && trustedIpAddress.split(",").includes(ipAddress)", trustedIpAddress !== undefined && trustedIpAddress.split(",").includes(ipAddress));
  15. return (
  16. trustedIpAddress !== undefined &&
  17. trustedIpAddress.split(',').includes(ipAddress)
  18. );
  19. }
  20. Meteor.startup(() => {
  21. WebApp.connectHandlers.use('/metrics', (req, res, next) => {
  22. try {
  23. const ipAddress =
  24. req.headers['x-forwarded-for'] || req.socket.remoteAddress;
  25. // if(process.env.TRUST_PROXY_FORXARD)
  26. // {
  27. // const ipAddress = req.headers['x-forwarded-for'] || req.socket.remoteAddress
  28. // }else{
  29. // const ipAddress = req.socket.remoteAddress
  30. // }
  31. // List of trusted ip adress will be found in environment variable "WEKAN_METRICS_ACCEPTED_IP_ADDRESS" (separeted with commas)
  32. if (acceptedIpAddress(ipAddress)) {
  33. let metricsRes = '';
  34. let resCount = 0;
  35. //connected users
  36. metricsRes += '# Number of connected users\n';
  37. // To Do: Get number of connected user by using meteor socketJs
  38. const allOpenedSockets = Meteor.server.stream_server.open_sockets;
  39. let connectedUserIds = [];
  40. allOpenedSockets.forEach(
  41. (socket) =>
  42. //console.log('meteor session', socket._meteorSession.userId)
  43. socket._meteorSession.userId !== null &&
  44. connectedUserIds.push(socket._meteorSession.userId),
  45. );
  46. resCount = connectedUserIds.length; // KPI 1
  47. metricsRes += 'connectedUsers ' + resCount + '\n';
  48. //registered users
  49. metricsRes += '# Number of registered users\n';
  50. // To Do: Get number of registered user
  51. resCount = Users.find({}).count(); // KPI 2
  52. metricsRes += 'registeredUsers ' + resCount + '\n';
  53. resCount = 0;
  54. //board numbers
  55. metricsRes += '# Number of registered boards\n';
  56. // To Do: Get number of registered boards
  57. resCount = Boards.find({ archived: false, type: 'board' }).count(); // KPI 3
  58. metricsRes += 'registeredboards ' + resCount + '\n';
  59. resCount = 0;
  60. //board numbers by registered users
  61. metricsRes += '# Number of registered boards by registered users\n';
  62. // To Do: Get number of registered boards by registered users
  63. resCount =
  64. Boards.find({ archived: false, type: 'board' }).count() /
  65. Users.find({}).count(); // KPI 4
  66. metricsRes += 'registeredboardsBysRegisteredUsers ' + resCount + '\n';
  67. resCount = 0;
  68. //board numbers with only one member
  69. metricsRes += '# Number of registered boards\n';
  70. // To Do: Get board numbers with only one member
  71. resCount = Boards.find({
  72. archived: false,
  73. type: 'board',
  74. members: { $size: 1 },
  75. }).count(); // KPI 5
  76. metricsRes += 'registeredboardsWithOnlyOneMember ' + resCount + '\n';
  77. resCount = 0;
  78. // KPI 6 : - store last login date
  79. // KPI 6 = count where date of last connection > x days
  80. // Cutting in label since 5 days / 10 days / 20 days / 30 days
  81. //Number of users with last connection dated 5 days ago
  82. metricsRes +=
  83. '# Number of users with last connection dated 5 days ago\n';
  84. // To Do: Get number of users with last connection dated 5 days ago
  85. let xdays = 5;
  86. let dateWithXdaysAgo = new Date(
  87. new Date() - xdays * 24 * 60 * 60 * 1000,
  88. );
  89. //console.log({ dateWithXdaysAgo });
  90. resCount = Users.find({
  91. lastConnectionDate: { $gte: dateWithXdaysAgo },
  92. }).count(); // KPI 5
  93. metricsRes += 'usersWithLastConnectionDated5DaysAgo ' + resCount + '\n';
  94. resCount = 0;
  95. metricsRes +=
  96. '# Number of users with last connection dated 10 days ago\n';
  97. // To Do: Get number of users with last connection dated 10 days ago
  98. xdays = 10;
  99. dateWithXdaysAgo = new Date(new Date() - xdays * 24 * 60 * 60 * 1000);
  100. //console.log({ dateWithXdaysAgo });
  101. resCount = Users.find({
  102. lastConnectionDate: { $gte: dateWithXdaysAgo },
  103. }).count(); // KPI 5
  104. metricsRes +=
  105. 'usersWithLastConnectionDated10DaysAgo ' + resCount + '\n';
  106. resCount = 0;
  107. metricsRes +=
  108. '# Number of users with last connection dated 20 days ago\n';
  109. // To Do: Get number of users with last connection dated 20 days ago
  110. xdays = 20;
  111. dateWithXdaysAgo = new Date(new Date() - xdays * 24 * 60 * 60 * 1000);
  112. //console.log({ dateWithXdaysAgo });
  113. resCount = Users.find({
  114. lastConnectionDate: { $gte: dateWithXdaysAgo },
  115. }).count(); // KPI 5
  116. metricsRes +=
  117. 'usersWithLastConnectionDated20DaysAgo ' + resCount + '\n';
  118. resCount = 0;
  119. metricsRes +=
  120. '# Number of users with last connection dated 30 days ago\n';
  121. // To Do: Get number of users with last connection dated 20 days ago
  122. xdays = 30;
  123. dateWithXdaysAgo = new Date(new Date() - xdays * 24 * 60 * 60 * 1000);
  124. //console.log({ dateWithXdaysAgo });
  125. resCount = Users.find({
  126. lastConnectionDate: { $gte: dateWithXdaysAgo },
  127. }).count(); // KPI 5
  128. metricsRes +=
  129. 'usersWithLastConnectionDated30DaysAgo ' + resCount + '\n';
  130. resCount = 0;
  131. // TO DO:
  132. // connection average: ((disconnection date - last connection date) + (last average)) / 2
  133. // KPI 7 : sum of connection average / number of users (to ignore users with 0 average)
  134. res.writeHead(200); // HTTP status
  135. res.end(metricsRes);
  136. } else {
  137. res.writeHead(401); // HTTP status
  138. res.end(
  139. 'IpAddress: ' +
  140. ipAddress +
  141. ' is not authorized to perform this action !!\n',
  142. );
  143. }
  144. } catch (e) {
  145. res.writeHead(500); // HTTP status
  146. res.end(e.toString());
  147. }
  148. });
  149. });