meter.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. // handles custom metering / monitoring values in pm2
  2. const io = require("@pm2/io");
  3. const fs = require("fs-extra");
  4. const debug = require("./verboseLogging");
  5. const settings = require("../settings");
  6. var req1mMeter = null;
  7. var req10mMeter = null;
  8. var req1hMeter = null;
  9. var reqtotalMeter = null;
  10. var submissionMeter = null;
  11. var m1 = 0;
  12. var m10 = 0;
  13. var h1 = 0;
  14. var tot = 0;
  15. var subms = 0;
  16. /**
  17. * Initializes the meter module
  18. * @returns {Promise}
  19. */
  20. function init()
  21. {
  22. return new Promise((resolve, reject) => {
  23. try
  24. {
  25. req1mMeter = io.metric({
  26. name: "Reqs / 1m",
  27. unit: "req"
  28. });
  29. req1mMeter.set(-1);
  30. setInterval(() => {
  31. req1mMeter.set(m1);
  32. m1 = 0;
  33. }, 1000 * 60);
  34. req10mMeter = io.metric({
  35. name: "Reqs / 10m",
  36. unit: "req"
  37. });
  38. req10mMeter.set(-1);
  39. setInterval(() => {
  40. req10mMeter.set(m10);
  41. m10 = 0;
  42. }, 1000 * 60 * 10);
  43. req1hMeter = io.metric({
  44. name: "Reqs / 1h",
  45. unit: "req"
  46. });
  47. req1hMeter.set(-1);
  48. setInterval(() => {
  49. req1hMeter.set(h1);
  50. h1 = 0;
  51. }, 1000 * 60 * 60);
  52. reqtotalMeter = io.metric({
  53. name: "Total Reqs",
  54. unit: "req"
  55. });
  56. reqtotalMeter.set(-1);
  57. submissionMeter = io.metric({
  58. name: "Submissions",
  59. unit: "sub"
  60. });
  61. subms = fs.readdirSync(settings.jokes.jokeSubmissionPath).length;
  62. submissionMeter.set(subms);
  63. setInterval(() => {
  64. subms = fs.readdirSync(settings.jokes.jokeSubmissionPath).length;
  65. submissionMeter.set(subms);
  66. }, 1000 * 60 * 10);
  67. }
  68. catch(err)
  69. {
  70. return reject(err);
  71. }
  72. return resolve();
  73. });
  74. }
  75. /**
  76. * Adds a number to a meter
  77. * @param {"req1min"|"req10mins"|"req1hour"|"reqtotal"|"submission"} meterName
  78. * @param {Number|undefined} addValue
  79. */
  80. function update(meterName, addValue)
  81. {
  82. if(typeof addValue == "undefined")
  83. addValue = 1;
  84. debug("Meter", `Updating meter ${meterName} - adding value ${addValue}`);
  85. if(typeof addValue != "number")
  86. throw new TypeError(`meter.update(): "addValue" has wrong type "${typeof addValue}" - expected "number"`);
  87. switch(meterName)
  88. {
  89. case "req1min":
  90. m1 += addValue;
  91. break;
  92. case "req10min":
  93. m10 += addValue;
  94. break;
  95. case "req1hour":
  96. h1 += addValue;
  97. break;
  98. case "reqtotal":
  99. tot += addValue;
  100. reqtotalMeter.set(tot);
  101. break;
  102. case "submission":
  103. subms += addValue;
  104. submissionMeter.set(subms);
  105. break;
  106. default:
  107. throw new Error(`meter.update(): "meterName" has incorrect value`);
  108. }
  109. return;
  110. }
  111. module.exports = { init, update };