Recommend imports sorting code extension.
[e-mobility-charging-stations-simulator.git] / src / utils / Statistics.ts
CommitLineData
6af9012e 1import Configuration from './Configuration';
7f134aca 2import Constants from './Constants';
6af9012e
JB
3import Utils from './Utils';
4import logger from './Logger';
7dde0b73 5
3f40bc9c 6export default class Statistics {
6af9012e
JB
7 private static instance: Statistics;
8 private _statistics;
9 private _objName: string;
560bcf5b 10
6af9012e 11 private constructor() {
7dde0b73
JB
12 this._statistics = {};
13 }
14
6af9012e 15 set objName(objName: string) {
560bcf5b
JB
16 this._objName = objName;
17 }
18
6af9012e 19 static getInstance(): Statistics {
560bcf5b
JB
20 if (!Statistics.instance) {
21 Statistics.instance = new Statistics();
22 }
23 return Statistics.instance;
24 }
25
7f134aca
JB
26 addMessage(command: string, messageType: number): void {
27 switch (messageType) {
28 case Constants.OCPP_JSON_CALL_MESSAGE:
29 if (this._statistics[command] && this._statistics[command].count) {
30 this._statistics[command].countRequest++;
7dde0b73 31 } else {
7f134aca
JB
32 this._statistics[command] = {};
33 this._statistics[command].countRequest = 1;
34 }
35 break;
36 case Constants.OCPP_JSON_CALL_RESULT_MESSAGE:
37 if (this._statistics[command]) {
38 if (this._statistics[command].countResponse) {
39 this._statistics[command].countResponse++;
40 } else {
41 this._statistics[command].countResponse = 1;
42 }
43 } else {
44 this._statistics[command] = {};
7dde0b73
JB
45 this._statistics[command].countResponse = 1;
46 }
7f134aca
JB
47 break;
48 case Constants.OCPP_JSON_CALL_ERROR_MESSAGE:
49 if (this._statistics[command]) {
50 if (this._statistics[command].countError) {
51 this._statistics[command].countError++;
52 } else {
53 this._statistics[command].countError = 1;
54 }
55 } else {
56 this._statistics[command] = {};
57 this._statistics[command].countError = 1;
58 }
59 break;
60 default:
61 logger.error(`${this._logPrefix()} Wrong message type ${messageType}`);
62 break;
7dde0b73
JB
63 }
64 }
65
66 addPerformanceTimer(command, duration) {
67 let currentStatistics;
68 // Map to proper command name
69 const MAPCOMMAND = {
70 sendMeterValues: 'MeterValues',
71 startTransaction: 'StartTransaction',
72 stopTransaction: 'StopTransaction',
73 };
2e6f5966
JB
74 // Get current command statistics
75 if (MAPCOMMAND[command]) {
7dde0b73
JB
76 currentStatistics = this._statistics[MAPCOMMAND[command]];
77 } else if (this._statistics[command]) {
78 currentStatistics = this._statistics[command];
79 } else {
80 this._statistics[command] = {};
81 currentStatistics = this._statistics[command];
82 }
83
84 if (currentStatistics) {
85 // Update current statistics timers
72766a82
JB
86 currentStatistics.countTime = currentStatistics.countTime ? currentStatistics.countTime + 1 : 1;
87 currentStatistics.minTime = currentStatistics.minTime ? (currentStatistics.minTime > duration ? duration : currentStatistics.minTime) : duration;
88 currentStatistics.maxTime = currentStatistics.maxTime ? (currentStatistics.maxTime < duration ? duration : currentStatistics.maxTime) : duration;
89 currentStatistics.totalTime = currentStatistics.totalTime ? currentStatistics.totalTime + duration : duration;
7dde0b73
JB
90 currentStatistics.avgTime = currentStatistics.totalTime / currentStatistics.countTime;
91 }
92 }
93
6af9012e 94 logPerformance(entry, className: string): void {
7dde0b73 95 this.addPerformanceTimer(entry.name, entry.duration);
ead548f2 96 logger.info(`${this._logPrefix()} class->${className}, method->${entry.name}, duration->${entry.duration}`);
7dde0b73
JB
97 }
98
6af9012e 99 _display(): void {
ead548f2 100 logger.info(this._logPrefix() + ' %j', this._statistics);
7dde0b73
JB
101 }
102
6af9012e 103 _displayInterval(): void {
c6b89400 104 if (Configuration.getStatisticsDisplayInterval() > 0) {
7dde0b73
JB
105 setInterval(() => {
106 this._display();
107 }, Configuration.getStatisticsDisplayInterval() * 1000);
ead548f2 108 logger.info(this._logPrefix() + ' displayed every ' + Configuration.getStatisticsDisplayInterval() + 's');
7dde0b73
JB
109 }
110 }
111
6af9012e 112 start(): void {
7dde0b73
JB
113 this._displayInterval();
114 }
6af9012e
JB
115
116 private _logPrefix(): string {
117 return Utils.logPrefix(` ${this._objName} Statistics:`);
118 }
7dde0b73 119}