badmfck-api-server 2.8.7 → 2.8.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -89,7 +89,7 @@ async function Initializer(services) {
|
|
89
89
|
exports.Initializer = Initializer;
|
90
90
|
class APIService extends BaseService_1.BaseService {
|
91
91
|
static nextLogID = 0;
|
92
|
-
version = "2.8.
|
92
|
+
version = "2.8.9";
|
93
93
|
options;
|
94
94
|
monitor = null;
|
95
95
|
monitorIndexFile;
|
@@ -108,6 +108,7 @@ class APIService extends BaseService_1.BaseService {
|
|
108
108
|
if (this.options.monitor && this.options.monitor.length > 0) {
|
109
109
|
exports.REQ_MONITOR_USERS.listener = async () => this.options.monitor ?? [];
|
110
110
|
this.monitor = new MonitorService_1.MonitorService();
|
111
|
+
this.monitor.init();
|
111
112
|
this.options.endpoints.push(new Monitor_1.Monitor());
|
112
113
|
}
|
113
114
|
this.options.endpoints.push(new ExternalServiceEndpoint_1.ExternalServiceEndpoint());
|
@@ -238,7 +239,7 @@ class APIService extends BaseService_1.BaseService {
|
|
238
239
|
files: req.files ?? null,
|
239
240
|
referer: req.get("Referer"),
|
240
241
|
};
|
241
|
-
if (this.options.preproducer) {
|
242
|
+
if (this.options.preproducer && ep !== "--sys-monitor") {
|
242
243
|
try {
|
243
244
|
const preproducerResult = await this.options.preproducer(httpRequest);
|
244
245
|
if (preproducerResult)
|
@@ -5,20 +5,29 @@ export interface IEPStat {
|
|
5
5
|
success: number;
|
6
6
|
fail: number;
|
7
7
|
}
|
8
|
+
export interface ICustomEvent {
|
9
|
+
event: string;
|
10
|
+
data?: any;
|
11
|
+
project?: string;
|
12
|
+
}
|
8
13
|
export interface IEPStatReqFilter {
|
9
|
-
range
|
10
|
-
from
|
11
|
-
to
|
12
|
-
ep
|
14
|
+
range?: "minute" | "hour" | "day";
|
15
|
+
from?: string;
|
16
|
+
to?: string;
|
17
|
+
ep?: string;
|
18
|
+
project?: string;
|
19
|
+
event?: string;
|
13
20
|
}
|
14
21
|
export interface IEPStatResult {
|
15
22
|
}
|
16
23
|
export declare const S_STAT_REGISTRATE_REQUEST: Signal<TransferPacketVO<any>>;
|
24
|
+
export declare const S_STAT_REGISTRATE_CUSTOM_EVENT: Signal<ICustomEvent>;
|
17
25
|
export declare const S_STAT_REGISTRATE_SERVICE: Signal<string>;
|
18
26
|
export declare const REQ_EP_STAT: Req<IEPStatReqFilter, IEPStatResult>;
|
19
27
|
export declare class MonitorService extends BaseService {
|
20
|
-
|
28
|
+
projects: Map<string, Map<number, Map<string, IEPStat>>>;
|
21
29
|
constructor();
|
30
|
+
init(): Promise<void>;
|
22
31
|
getEPStat(req: IEPStatReqFilter): Promise<IEPStatResult>;
|
23
32
|
onStatRegistrate(data: TransferPacketVO): void;
|
24
33
|
pad(num: number): string;
|
@@ -23,24 +23,34 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
23
23
|
return result;
|
24
24
|
};
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
26
|
-
exports.MonitorService = exports.REQ_EP_STAT = exports.S_STAT_REGISTRATE_SERVICE = exports.S_STAT_REGISTRATE_REQUEST = void 0;
|
26
|
+
exports.MonitorService = exports.REQ_EP_STAT = exports.S_STAT_REGISTRATE_SERVICE = exports.S_STAT_REGISTRATE_CUSTOM_EVENT = exports.S_STAT_REGISTRATE_REQUEST = void 0;
|
27
27
|
const badmfck_signal_1 = __importStar(require("badmfck-signal"));
|
28
28
|
const BaseService_1 = require("./BaseService");
|
29
29
|
exports.S_STAT_REGISTRATE_REQUEST = new badmfck_signal_1.default();
|
30
|
+
exports.S_STAT_REGISTRATE_CUSTOM_EVENT = new badmfck_signal_1.default();
|
30
31
|
exports.S_STAT_REGISTRATE_SERVICE = new badmfck_signal_1.default();
|
31
32
|
exports.REQ_EP_STAT = new badmfck_signal_1.Req(undefined, "REQ_EP_STAT");
|
32
33
|
class MonitorService extends BaseService_1.BaseService {
|
33
|
-
|
34
|
+
projects = new Map();
|
34
35
|
constructor() {
|
35
36
|
super("MonitorService");
|
36
|
-
exports.S_STAT_REGISTRATE_REQUEST.subscribe(this.onStatRegistrate);
|
37
|
+
exports.S_STAT_REGISTRATE_REQUEST.subscribe(req => this.onStatRegistrate(req));
|
37
38
|
exports.REQ_EP_STAT.listener = async (req) => this.getEPStat(req);
|
38
39
|
}
|
40
|
+
async init() {
|
41
|
+
super.init();
|
42
|
+
}
|
39
43
|
async getEPStat(req) {
|
40
|
-
const result =
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
+
const result = [];
|
45
|
+
for (let [project, projectSlot] of this.projects) {
|
46
|
+
if (req.project && req.project !== project)
|
47
|
+
continue;
|
48
|
+
let p = result.find(p => p.project === project);
|
49
|
+
if (!p) {
|
50
|
+
p = { project, dates: [] };
|
51
|
+
result.push(p);
|
52
|
+
}
|
53
|
+
for (let [minute, minuteSlot] of projectSlot) {
|
44
54
|
let range = minute + "";
|
45
55
|
if (req.range === "hour")
|
46
56
|
range = this.pad(this.getDate(minute).getHours());
|
@@ -54,42 +64,43 @@ class MonitorService extends BaseService_1.BaseService {
|
|
54
64
|
if (range > req.to)
|
55
65
|
continue;
|
56
66
|
}
|
57
|
-
let
|
58
|
-
if (!
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
epSlot = { success: 0, fail: 0 };
|
65
|
-
resultSlot.set(req.ep, epSlot);
|
67
|
+
let dateSlot = p.dates.find(p => p.date === range);
|
68
|
+
if (!dateSlot) {
|
69
|
+
dateSlot = {
|
70
|
+
date: range,
|
71
|
+
endpoints: []
|
72
|
+
};
|
73
|
+
p.dates.push(dateSlot);
|
66
74
|
}
|
67
|
-
for (let [
|
68
|
-
epSlot.
|
69
|
-
epSlot
|
75
|
+
for (let [epName, epStatSlot] of minuteSlot) {
|
76
|
+
let epSlot = dateSlot.endpoints.find(p => p.ep === epName);
|
77
|
+
if (!epSlot) {
|
78
|
+
epSlot = {
|
79
|
+
ep: epName,
|
80
|
+
success: 0,
|
81
|
+
fail: 0
|
82
|
+
};
|
83
|
+
dateSlot.endpoints.push(epSlot);
|
84
|
+
}
|
85
|
+
epSlot.fail += epStatSlot.fail;
|
86
|
+
epSlot.success += epStatSlot.success;
|
70
87
|
}
|
71
88
|
}
|
72
89
|
}
|
73
|
-
|
74
|
-
for (let [date, obj] of result) {
|
75
|
-
const stat = {
|
76
|
-
date,
|
77
|
-
data: []
|
78
|
-
};
|
79
|
-
for (let [ep, s] of obj) {
|
80
|
-
const r = { ep, ...s };
|
81
|
-
stat.data.push(r);
|
82
|
-
}
|
83
|
-
endResult.push(stat);
|
84
|
-
}
|
85
|
-
return { filter: req, result: endResult, overallcount: this.endpoints.size };
|
90
|
+
return { filter: req, result: result };
|
86
91
|
}
|
87
92
|
onStatRegistrate(data) {
|
88
93
|
const minute = this.getMinutes(new Date());
|
89
|
-
|
94
|
+
const project = data.project ?? "unknown";
|
95
|
+
let projectSlot = this.projects.get(project);
|
96
|
+
if (!projectSlot) {
|
97
|
+
projectSlot = new Map();
|
98
|
+
this.projects.set(project, projectSlot);
|
99
|
+
}
|
100
|
+
let minuteSlot = projectSlot.get(minute);
|
90
101
|
if (!minuteSlot) {
|
91
102
|
minuteSlot = new Map();
|
92
|
-
|
103
|
+
projectSlot.set(minute, minuteSlot);
|
93
104
|
}
|
94
105
|
if (!data.endpoint)
|
95
106
|
data.endpoint = "unknown";
|
@@ -104,10 +115,10 @@ class MonitorService extends BaseService_1.BaseService {
|
|
104
115
|
else {
|
105
116
|
epSlot.success++;
|
106
117
|
}
|
107
|
-
if (
|
108
|
-
const firstItem =
|
118
|
+
if (projectSlot.size > 3000) {
|
119
|
+
const firstItem = projectSlot.keys().next().value;
|
109
120
|
if (firstItem)
|
110
|
-
|
121
|
+
projectSlot.delete(firstItem);
|
111
122
|
}
|
112
123
|
}
|
113
124
|
pad(num) {
|