JobStatistics.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. export enum JobStatisticsType {
  2. SUCCESSFUL = "successful",
  3. FAILED = "failed",
  4. TOTAL = "total",
  5. CONSTRUCTED = "constructed",
  6. QUEUED = "queued",
  7. DURATION = "duration"
  8. }
  9. export class JobStatistics {
  10. private _stats: Record<
  11. string,
  12. Record<
  13. | Exclude<JobStatisticsType, "duration">
  14. | "averageTime"
  15. | "totalTime",
  16. number
  17. >
  18. >;
  19. public constructor() {
  20. this._stats = {};
  21. }
  22. /**
  23. * getStats - Get statistics of job queue
  24. *
  25. * @returns Job queue statistics
  26. */
  27. public getStats() {
  28. const total = Object.values(this._stats).reduce(
  29. (a, b) => ({
  30. successful: a.successful + b.successful,
  31. failed: a.failed + b.failed,
  32. total: a.total + b.total,
  33. constructed: a.constructed + b.constructed,
  34. queued: a.queued + b.queued,
  35. averageTime: -1,
  36. totalTime: a.totalTime + b.totalTime
  37. }),
  38. {
  39. successful: 0,
  40. failed: 0,
  41. total: 0,
  42. constructed: 0,
  43. queued: 0,
  44. averageTime: -1,
  45. totalTime: 0
  46. }
  47. );
  48. total.averageTime = total.totalTime / total.total;
  49. return {
  50. ...this._stats,
  51. total
  52. };
  53. }
  54. /**
  55. * updateStats - Update job statistics
  56. *
  57. * @param jobName - Job name
  58. * @param type - Stats type
  59. * @param duration - Duration of job, for average time stats
  60. */
  61. public updateStats(
  62. jobName: string,
  63. type: JobStatisticsType,
  64. duration?: number
  65. ) {
  66. if (!this._stats[jobName])
  67. this._stats[jobName] = {
  68. successful: 0,
  69. failed: 0,
  70. total: 0,
  71. constructed: 0,
  72. queued: 0,
  73. averageTime: 0,
  74. totalTime: 0
  75. };
  76. if (type === "duration") {
  77. if (!duration) throw new Error("No duration specified");
  78. this._stats[jobName].totalTime += duration;
  79. this._stats[jobName].averageTime =
  80. this._stats[jobName].totalTime / this._stats[jobName].total;
  81. } else this._stats[jobName][type] += 1;
  82. }
  83. }
  84. export default new JobStatistics();