-
-
Notifications
You must be signed in to change notification settings - Fork 55
/
Copy pathserver-state.ts
101 lines (83 loc) · 2.79 KB
/
server-state.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import { IServerState } from '@nestcloud/common';
export const PASSING = 'passing';
export const WARNING = 'warning';
export const CRITICAL = 'critical';
export class ServerState implements IServerState {
status: string;
totalRequests: number = 0;
activeRequestsCount: number = 0;
weight: number = -1;
responseTimeAvg: number = 0;
responseTimeMax: number = 0;
activeRequestsCountTimeout: number = 10;
lastActiveRequestsCountChangeTimestamp: number = 0;
firstConnectionTimestamp: number = 0;
lastConnectionFailedTimestamp: number = null;
lastConnectionFailedMessage: string = '';
serverFailureCounts: number = 0;
constructor() {
this.status = CRITICAL;
this.activeRequestsCount = 0;
this.weight = -1;
}
getActiveRequestsCount(currentTime?: number) {
if (!currentTime) {
currentTime = new Date().getTime();
}
const count = this.activeRequestsCount;
if (count === 0) {
return 0;
} else if (
currentTime - this.lastActiveRequestsCountChangeTimestamp > this.activeRequestsCountTimeout * 1000 ||
count < 0
) {
return (this.activeRequestsCount = 0);
} else {
return count;
}
}
isAlive() {
return this.status !== CRITICAL;
}
incrementServerFailureCounts() {
if (!this.serverFailureCounts) {
this.serverFailureCounts = 0;
}
return ++this.serverFailureCounts;
}
incrementTotalRequests() {
if (!this.totalRequests) {
this.totalRequests = 0;
}
return ++this.totalRequests;
}
incrementServerActiveRequests() {
if (!this.activeRequestsCount) {
this.activeRequestsCount = 0;
}
this.lastActiveRequestsCountChangeTimestamp = new Date().getTime();
return ++this.activeRequestsCount;
}
decrementServerActiveRequests() {
if (!this.activeRequestsCount) {
return (this.activeRequestsCount = 0);
}
this.lastActiveRequestsCountChangeTimestamp = new Date().getTime();
return --this.activeRequestsCount;
}
noteConnectionFailedTime(message = '') {
this.lastConnectionFailedTimestamp = new Date().getTime();
this.lastConnectionFailedMessage = message;
this.status = CRITICAL;
}
noteFirstConnectionTime() {
if (!this.firstConnectionTimestamp) {
this.firstConnectionTimestamp = new Date().getTime();
}
}
noteResponseTime(time) {
this.weight = time - this.responseTimeAvg;
this.responseTimeAvg = (this.responseTimeAvg * (this.totalRequests - 1) + time) / this.totalRequests;
this.responseTimeMax = Math.max(this.responseTimeMax, time);
}
}