badmfck-api-server 2.8.5 → 2.8.7
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.
@@ -80,6 +80,7 @@ async function Initializer(services) {
|
|
80
80
|
for (let i of services) {
|
81
81
|
await i.init();
|
82
82
|
activeServices.push(i.getName());
|
83
|
+
MonitorService_1.S_STAT_REGISTRATE_SERVICE.invoke(i.getName());
|
83
84
|
}
|
84
85
|
for (let i of services) {
|
85
86
|
i.applicationReady();
|
@@ -88,7 +89,7 @@ async function Initializer(services) {
|
|
88
89
|
exports.Initializer = Initializer;
|
89
90
|
class APIService extends BaseService_1.BaseService {
|
90
91
|
static nextLogID = 0;
|
91
|
-
version = "2.8.
|
92
|
+
version = "2.8.7";
|
92
93
|
options;
|
93
94
|
monitor = null;
|
94
95
|
monitorIndexFile;
|
@@ -388,6 +389,7 @@ class APIService extends BaseService_1.BaseService {
|
|
388
389
|
log.time = data.responseTime;
|
389
390
|
log.referer = ref;
|
390
391
|
}
|
392
|
+
MonitorService_1.S_STAT_REGISTRATE_REQUEST.invoke(data);
|
391
393
|
if (res.destroyed || res.closed) {
|
392
394
|
if (log)
|
393
395
|
log.error = "Connection already closed, can't send response for: " + data.endpoint;
|
@@ -1,4 +1,28 @@
|
|
1
|
+
import Signal, { Req } from "badmfck-signal";
|
1
2
|
import { BaseService } from "./BaseService";
|
3
|
+
import { TransferPacketVO } from "./structures/Interfaces";
|
4
|
+
export interface IEPStat {
|
5
|
+
success: number;
|
6
|
+
fail: number;
|
7
|
+
}
|
8
|
+
export interface IEPStatReqFilter {
|
9
|
+
range: "minute" | "hour" | "day";
|
10
|
+
from: string;
|
11
|
+
to: string;
|
12
|
+
ep: string;
|
13
|
+
}
|
14
|
+
export interface IEPStatResult {
|
15
|
+
}
|
16
|
+
export declare const S_STAT_REGISTRATE_REQUEST: Signal<TransferPacketVO<any>>;
|
17
|
+
export declare const S_STAT_REGISTRATE_SERVICE: Signal<string>;
|
18
|
+
export declare const REQ_EP_STAT: Req<IEPStatReqFilter, IEPStatResult>;
|
2
19
|
export declare class MonitorService extends BaseService {
|
20
|
+
endpoints: Map<number, Map<string, IEPStat>>;
|
3
21
|
constructor();
|
22
|
+
getEPStat(req: IEPStatReqFilter): Promise<IEPStatResult>;
|
23
|
+
onStatRegistrate(data: TransferPacketVO): void;
|
24
|
+
pad(num: number): string;
|
25
|
+
getMinutes(date: Date): number;
|
26
|
+
getDate(minutes: number): Date;
|
27
|
+
getMinutesInMonth(date: Date): number;
|
4
28
|
}
|
@@ -1,10 +1,138 @@
|
|
1
1
|
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
2
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.MonitorService = void 0;
|
26
|
+
exports.MonitorService = exports.REQ_EP_STAT = exports.S_STAT_REGISTRATE_SERVICE = exports.S_STAT_REGISTRATE_REQUEST = void 0;
|
27
|
+
const badmfck_signal_1 = __importStar(require("badmfck-signal"));
|
4
28
|
const BaseService_1 = require("./BaseService");
|
29
|
+
exports.S_STAT_REGISTRATE_REQUEST = new badmfck_signal_1.default();
|
30
|
+
exports.S_STAT_REGISTRATE_SERVICE = new badmfck_signal_1.default();
|
31
|
+
exports.REQ_EP_STAT = new badmfck_signal_1.Req(undefined, "REQ_EP_STAT");
|
5
32
|
class MonitorService extends BaseService_1.BaseService {
|
33
|
+
endpoints = new Map();
|
6
34
|
constructor() {
|
7
35
|
super("MonitorService");
|
36
|
+
exports.S_STAT_REGISTRATE_REQUEST.subscribe(this.onStatRegistrate);
|
37
|
+
exports.REQ_EP_STAT.listener = async (req) => this.getEPStat(req);
|
38
|
+
}
|
39
|
+
async getEPStat(req) {
|
40
|
+
const result = new Map();
|
41
|
+
if (req.range === "hour") {
|
42
|
+
for (let [minute, minuteSlot] of this.endpoints) {
|
43
|
+
const date = this.getDate(minute);
|
44
|
+
let range = minute + "";
|
45
|
+
if (req.range === "hour")
|
46
|
+
range = this.pad(this.getDate(minute).getHours());
|
47
|
+
else if (req.range === "day")
|
48
|
+
range = this.pad(this.getDate(minute).getDate());
|
49
|
+
if (req.from) {
|
50
|
+
if (range < req.from)
|
51
|
+
continue;
|
52
|
+
}
|
53
|
+
if (req.to) {
|
54
|
+
if (range > req.to)
|
55
|
+
continue;
|
56
|
+
}
|
57
|
+
let resultSlot = result.get(range);
|
58
|
+
if (!resultSlot) {
|
59
|
+
resultSlot = new Map();
|
60
|
+
result.set(range, resultSlot);
|
61
|
+
}
|
62
|
+
let epSlot = resultSlot.get(req.ep);
|
63
|
+
if (!epSlot) {
|
64
|
+
epSlot = { success: 0, fail: 0 };
|
65
|
+
resultSlot.set(req.ep, epSlot);
|
66
|
+
}
|
67
|
+
for (let [ep, stat] of minuteSlot) {
|
68
|
+
epSlot.success += stat.success;
|
69
|
+
epSlot.fail += stat.fail;
|
70
|
+
}
|
71
|
+
}
|
72
|
+
}
|
73
|
+
const endResult = [];
|
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 };
|
86
|
+
}
|
87
|
+
onStatRegistrate(data) {
|
88
|
+
const minute = this.getMinutes(new Date());
|
89
|
+
let minuteSlot = this.endpoints.get(minute);
|
90
|
+
if (!minuteSlot) {
|
91
|
+
minuteSlot = new Map();
|
92
|
+
this.endpoints.set(minute, minuteSlot);
|
93
|
+
}
|
94
|
+
if (!data.endpoint)
|
95
|
+
data.endpoint = "unknown";
|
96
|
+
let epSlot = minuteSlot.get(data.endpoint);
|
97
|
+
if (!epSlot) {
|
98
|
+
epSlot = { success: 0, fail: 0 };
|
99
|
+
minuteSlot.set(data.endpoint, epSlot);
|
100
|
+
}
|
101
|
+
if (data.error) {
|
102
|
+
epSlot.fail++;
|
103
|
+
}
|
104
|
+
else {
|
105
|
+
epSlot.success++;
|
106
|
+
}
|
107
|
+
if (this.endpoints.size > 3000) {
|
108
|
+
const firstItem = this.endpoints.keys().next().value;
|
109
|
+
if (firstItem)
|
110
|
+
this.endpoints.delete(firstItem);
|
111
|
+
}
|
112
|
+
}
|
113
|
+
pad(num) {
|
114
|
+
return num.toString().padStart(2, '0');
|
115
|
+
}
|
116
|
+
getMinutes(date) {
|
117
|
+
const year = date.getFullYear();
|
118
|
+
const month = this.pad(date.getMonth() + 1);
|
119
|
+
const day = this.pad(date.getDate());
|
120
|
+
const hours = this.pad(date.getHours());
|
121
|
+
const minutes = this.pad(date.getMinutes());
|
122
|
+
return parseInt(`${year}${month}${day}${hours}${minutes}`);
|
123
|
+
}
|
124
|
+
getDate(minutes) {
|
125
|
+
const datetime = minutes.toString();
|
126
|
+
const year = parseInt(datetime.slice(0, 4));
|
127
|
+
const month = parseInt(datetime.slice(4, 6)) - 1;
|
128
|
+
const day = parseInt(datetime.slice(6, 8));
|
129
|
+
const hours = parseInt(datetime.slice(8, 10));
|
130
|
+
const min = parseInt(datetime.slice(10, 12));
|
131
|
+
return new Date(year, month, day, hours, min);
|
132
|
+
}
|
133
|
+
getMinutesInMonth(date) {
|
134
|
+
const daysInMonth = date.getDate();
|
135
|
+
return daysInMonth * 1440;
|
8
136
|
}
|
9
137
|
}
|
10
138
|
exports.MonitorService = MonitorService;
|
@@ -15,6 +15,7 @@ export declare class Monitor extends BaseEndpoint {
|
|
15
15
|
ignoreHttpLogging: boolean;
|
16
16
|
users: Map<string, IStatObject>;
|
17
17
|
constructor();
|
18
|
+
controllers(req: HTTPRequestVO): Promise<TransferPacketVO>;
|
18
19
|
logs(req: HTTPRequestVO): Promise<TransferPacketVO>;
|
19
20
|
netlog(req: HTTPRequestVO): Promise<TransferPacketVO>;
|
20
21
|
metrics(req: HTTPRequestVO): Promise<TransferPacketVO>;
|
@@ -11,6 +11,7 @@ const LogService_1 = require("../LogService");
|
|
11
11
|
const crypto_1 = __importDefault(require("crypto"));
|
12
12
|
const os_1 = __importDefault(require("os"));
|
13
13
|
const DefaultErrors_1 = __importDefault(require("../structures/DefaultErrors"));
|
14
|
+
const MonitorService_1 = require("../MonitorService");
|
14
15
|
exports.S_MONITOR_REGISTRATE_ACTION = new badmfck_signal_1.Signal();
|
15
16
|
class Monitor extends BaseEndpoint_1.BaseEndpoint {
|
16
17
|
ignoreHttpLogging = true;
|
@@ -21,9 +22,14 @@ class Monitor extends BaseEndpoint_1.BaseEndpoint {
|
|
21
22
|
{ ignoreInterceptor: true, endpoint: "log", handler: this.logs },
|
22
23
|
{ ignoreInterceptor: true, endpoint: "netlog", handler: this.netlog },
|
23
24
|
{ ignoreInterceptor: true, endpoint: "metrics", handler: this.metrics },
|
24
|
-
{ ignoreInterceptor: true, endpoint: "server", handler: this.serverStat }
|
25
|
+
{ ignoreInterceptor: true, endpoint: "server", handler: this.serverStat },
|
26
|
+
{ ignoreInterceptor: true, endpoint: "controllers", handler: this.controllers }
|
25
27
|
]);
|
26
28
|
}
|
29
|
+
async controllers(req) {
|
30
|
+
this.checkAuthentication(req);
|
31
|
+
return {};
|
32
|
+
}
|
27
33
|
async logs(req) {
|
28
34
|
this.checkAuthentication(req);
|
29
35
|
const services = await LogService_1.REQ_LOG_UNIQUE_SERVICES.request();
|
@@ -39,11 +45,13 @@ class Monitor extends BaseEndpoint_1.BaseEndpoint {
|
|
39
45
|
}
|
40
46
|
async netlog(req) {
|
41
47
|
this.checkAuthentication(req);
|
42
|
-
|
48
|
+
const log = await APIService_1.REQ_HTTP_LOG.request(req.data);
|
49
|
+
return { data: log };
|
43
50
|
}
|
44
51
|
async metrics(req) {
|
45
52
|
this.checkAuthentication(req);
|
46
|
-
|
53
|
+
const result = await MonitorService_1.REQ_EP_STAT.request(req.data);
|
54
|
+
return { data: result };
|
47
55
|
}
|
48
56
|
async serverStat(req) {
|
49
57
|
this.checkAuthentication(req);
|