@futdevpro/nts-dynamo 1.15.54 → 1.15.56
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.
- package/__documentations/2026-06-15-fr193-memory-guard.md +73 -0
- package/build/_collections/global-settings.const.d.ts.map +1 -1
- package/build/_collections/global-settings.const.js +11 -0
- package/build/_collections/global-settings.const.js.map +1 -1
- package/build/_models/interfaces/global-log-settings.interface.d.ts +26 -0
- package/build/_models/interfaces/global-log-settings.interface.d.ts.map +1 -1
- package/build/_models/interfaces/global-settings.interface.d.ts +21 -0
- package/build/_models/interfaces/global-settings.interface.d.ts.map +1 -1
- package/build/_services/core/memory-guard.service.d.ts +111 -0
- package/build/_services/core/memory-guard.service.d.ts.map +1 -0
- package/build/_services/core/memory-guard.service.js +198 -0
- package/build/_services/core/memory-guard.service.js.map +1 -0
- package/build/_services/server/app.server.d.ts.map +1 -1
- package/build/_services/server/app.server.js +13 -0
- package/build/_services/server/app.server.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/package.json +1 -1
- package/src/_collections/global-settings.const.ts +12 -0
- package/src/_models/interfaces/global-log-settings.interface.ts +27 -0
- package/src/_models/interfaces/global-settings.interface.ts +23 -1
- package/src/_services/core/memory-guard.service.spec.ts +165 -0
- package/src/_services/core/memory-guard.service.ts +281 -0
- package/src/_services/server/app.server.ts +13 -0
- package/src/index.ts +1 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# FR-193 — `DyNTS_MemoryGuard` (bedrock OOM korai-figyelmeztetés)
|
|
2
|
+
|
|
3
|
+
**Csomag:** `@futdevpro/nts-dynamo` · **Dátum:** 2026-06-15
|
|
4
|
+
|
|
5
|
+
## Probléma
|
|
6
|
+
|
|
7
|
+
A Node heap-OOM (`--max-old-space-size` túllépés — pl. egy óriási `JSON.parse`, mint az
|
|
8
|
+
Overseernél a CCAP több-tíz-MB-os `cdpReport`-ja) a process-t **azonnal megöli**. A
|
|
9
|
+
`process.on('uncaughtException')` NEM kapja el — a crash pillanatában már **nincs mód a
|
|
10
|
+
hibát rögzíteni**. Eredmény: a szerver „csak eltűnik", nyom nélkül, és a kézi diagnózis
|
|
11
|
+
nehéz. Az EGYETLEN megbízható idő a rögzítésre a crash **ELŐTT** van.
|
|
12
|
+
|
|
13
|
+
## Megoldás — `DyNTS_MemoryGuard`
|
|
14
|
+
|
|
15
|
+
Bedrock, self-installing heap-watchdog **minden nts-szerverhez**. Periodikusan figyeli a
|
|
16
|
+
heap-kihasználtságot, és a `--max-old-space-size` plafonhoz közeledve **tartós rekordot**
|
|
17
|
+
hagy — mielőtt a fatal OOM bekövetkezne.
|
|
18
|
+
|
|
19
|
+
- **Megfigyel:** `v8.getHeapStatistics().heap_size_limit` (a valódi plafon) vs
|
|
20
|
+
`process.memoryUsage().heapUsed`, default 10s-enként.
|
|
21
|
+
- **Rögzít:** küszöb-átlépéskor `DyFM_Log` + `DyNTS_GlobalService.globalErrorHandler`
|
|
22
|
+
(az Errors-rendszer + Discord, ha bekötve). `warning` → `DyFM_ErrorLevel.warning`,
|
|
23
|
+
`critical` → `.critical`. Plusz egy in-memory ring-buffer (`getHistory()`) +
|
|
24
|
+
`getStatus()` (állapot + csúcsok) egy esetleges status-endpointhoz.
|
|
25
|
+
- **Hiszterézis:** eseményt CSAK állapot-váltáskor jelez (normal→warning→critical), és a
|
|
26
|
+
`recoveryMargin`-nyit a warning alá esve jelez `recovered`-et → nincs küszöb-körüli spam.
|
|
27
|
+
- **NEM csinál:** nem állítja le/újraindítja a process-t (az a konténer `restart:` policy
|
|
28
|
+
dolga), és nem próbálja elkapni a fatal OOM-ot (nem lehet). Tisztán megfigyelés +
|
|
29
|
+
rögzítés + opcionális `onCritical` hook (amivel a fogyasztó terhet dobhat).
|
|
30
|
+
- **Biztonság:** minden út `try/catch`-elt — egy figyelő-réteg SOHA nem dönthet be egy
|
|
31
|
+
szervert. A timer `unref()`-elt (nem tartja életben a process-t).
|
|
32
|
+
|
|
33
|
+
## Használat
|
|
34
|
+
|
|
35
|
+
**Automatikus (default-on):** a base `App` startup feltelepíti, ha
|
|
36
|
+
`DyNTS_global_settings.memoryGuard.enabled === true` (alapértelmezés szerint igen). Tehát
|
|
37
|
+
**minden nts-szerver megkapja** az nts-dynamo bump után — kód nélkül.
|
|
38
|
+
|
|
39
|
+
**Explicit / testreszabott:**
|
|
40
|
+
```ts
|
|
41
|
+
import { DyNTS_MemoryGuard } from '@futdevpro/nts-dynamo';
|
|
42
|
+
|
|
43
|
+
DyNTS_MemoryGuard.getInstance().install({
|
|
44
|
+
heapWarningThreshold: 80,
|
|
45
|
+
heapCriticalThreshold: 92,
|
|
46
|
+
onCritical: (e) => { /* pl. terhelés-dobás / külső riasztás */ },
|
|
47
|
+
});
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**Konfiguráció** (`DyNTS_global_settings.memoryGuard`, defaultok):
|
|
51
|
+
| mező | default | jelentés |
|
|
52
|
+
|------|---------|----------|
|
|
53
|
+
| `enabled` | `true` | a base App feltelepíti |
|
|
54
|
+
| `pollIntervalMs` | `10000` | poll-gyakoriság |
|
|
55
|
+
| `heapWarningThreshold` | `85` | warning a heap-plafon %-ában |
|
|
56
|
+
| `heapCriticalThreshold` | `95` | critical % |
|
|
57
|
+
| `recoveryMargin` | `10` | a warning alatti margó a `recovered`-hez |
|
|
58
|
+
| `maxHistoryCount` | `100` | megőrzött események |
|
|
59
|
+
|
|
60
|
+
## Az OOM-self-healing nagyobb képe
|
|
61
|
+
|
|
62
|
+
Ez a **„rögzítés" rétege** (record). A **„restart" rétege** a konténer-szintű
|
|
63
|
+
`restart: on-failure:N` + `mem_limit` (compose, fdp-devops) — együtt adják a teljes
|
|
64
|
+
self-healinget: a guard nyomot hagy a near-OOM-ról, a restart-policy auto-helyreállít a
|
|
65
|
+
crash után. A **forrás-prevenció** (a túl nagy payload parse-olásának elkerülése) külön
|
|
66
|
+
réteg (runner-oldali report-cap / body-limit).
|
|
67
|
+
|
|
68
|
+
## Fájlok
|
|
69
|
+
- `src/_services/core/memory-guard.service.ts` + `.spec.ts` (11 spec)
|
|
70
|
+
- `src/_models/interfaces/global-settings.interface.ts` (`memoryGuard` mező)
|
|
71
|
+
- `src/_collections/global-settings.const.ts` (defaultok, enabled:true)
|
|
72
|
+
- `src/_services/server/app.server.ts` (guarded auto-install a startup-ban)
|
|
73
|
+
- `src/index.ts` (fő-export)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-settings.const.d.ts","sourceRoot":"","sources":["../../src/_collections/global-settings.const.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AAIxF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,
|
|
1
|
+
{"version":3,"file":"global-settings.const.d.ts","sourceRoot":"","sources":["../../src/_collections/global-settings.const.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AAIxF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,qBAqEnC,CAAC"}
|
|
@@ -49,5 +49,16 @@ exports.DyNTS_global_settings = {
|
|
|
49
49
|
maxChunkSize: 1000,
|
|
50
50
|
maxChunkCount: 1000,
|
|
51
51
|
},
|
|
52
|
+
// FR-193 — bedrock OOM korai-figyelmeztető heap-watchdog. Default-on: minden nts-szerver
|
|
53
|
+
// megkapja a heap-nyomás-figyelést a base App startup-ban (lásd DyNTS_MemoryGuard). Csak
|
|
54
|
+
// MEGFIGYELÉS + tartós rögzítés a near-OOM küszöböknél — nem változtat a viselkedésen.
|
|
55
|
+
memoryGuard: {
|
|
56
|
+
enabled: true,
|
|
57
|
+
pollIntervalMs: 10000,
|
|
58
|
+
heapWarningThreshold: 85,
|
|
59
|
+
heapCriticalThreshold: 95,
|
|
60
|
+
recoveryMargin: 10,
|
|
61
|
+
maxHistoryCount: 100,
|
|
62
|
+
},
|
|
52
63
|
};
|
|
53
64
|
//# sourceMappingURL=global-settings.const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-settings.const.js","sourceRoot":"","sources":["../../src/_collections/global-settings.const.ts"],"names":[],"mappings":";;;AAEA,uEAAoE;AAEpE,yFAAsF;AACtF,mFAAgF;AAEhF;;;GAGG;AACU,QAAA,qBAAqB,GAA0B;IAC1D,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,iBAAiB;IAChC,oBAAoB,EAAE,yCAAmB,CAAC,IAAI;IAC9C,qBAAqB,EAAE,2CAAoB,CAAC,IAAI;IAEhD,eAAe,EAAE,EAAE;IACnB,gBAAgB,EAAE,GAAG;IACrB,YAAY,EAAE,IAAA,6DAA6B,GAAE;IAE7C,oCAAoC,EAAE,IAAI;IAC1C,oBAAoB,EAAE,IAAI;IAE1B,YAAY,EAAE;QACZ,gBAAgB,EAAE,KAAK;QAEvB,KAAK,EAAE,KAAK;QAEZ,OAAO,EAAE,IAAI;QACb,eAAe,EAAE,KAAK;QACtB,eAAe,EAAE,KAAK;QACtB,oBAAoB,EAAE,KAAK;QAE3B,gBAAgB,EAAE,IAAI;QACtB,iBAAiB,EAAE,IAAI;QACvB,mBAAmB,EAAE,KAAK;QAE1B,UAAU,EAAE,IAAI;QAChB,mBAAmB,EAAE,KAAK;QAC1B,mBAAmB,EAAE,KAAK;QAC1B,oBAAoB,EAAE,KAAK;QAC3B,UAAU,EAAE,IAAI;QAEhB,cAAc,EAAE,KAAK;QAErB,YAAY,EAAE,KAAK;QAEnB,aAAa,EAAE;YACb,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,IAAI;SACjB;KACF;IAED,kBAAkB,EAAE,IAAI;IAExB,YAAY,EAAE,IAAI;IAElB,eAAe,EAAE,IAAI;IAErB,aAAa,EAAE,IAAI;IAEnB,kBAAkB,EAAE,IAAI;IAExB,WAAW,EAAE;QACX,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,IAAI;KACpB;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"global-settings.const.js","sourceRoot":"","sources":["../../src/_collections/global-settings.const.ts"],"names":[],"mappings":";;;AAEA,uEAAoE;AAEpE,yFAAsF;AACtF,mFAAgF;AAEhF;;;GAGG;AACU,QAAA,qBAAqB,GAA0B;IAC1D,OAAO,EAAE,MAAM;IACf,aAAa,EAAE,iBAAiB;IAChC,oBAAoB,EAAE,yCAAmB,CAAC,IAAI;IAC9C,qBAAqB,EAAE,2CAAoB,CAAC,IAAI;IAEhD,eAAe,EAAE,EAAE;IACnB,gBAAgB,EAAE,GAAG;IACrB,YAAY,EAAE,IAAA,6DAA6B,GAAE;IAE7C,oCAAoC,EAAE,IAAI;IAC1C,oBAAoB,EAAE,IAAI;IAE1B,YAAY,EAAE;QACZ,gBAAgB,EAAE,KAAK;QAEvB,KAAK,EAAE,KAAK;QAEZ,OAAO,EAAE,IAAI;QACb,eAAe,EAAE,KAAK;QACtB,eAAe,EAAE,KAAK;QACtB,oBAAoB,EAAE,KAAK;QAE3B,gBAAgB,EAAE,IAAI;QACtB,iBAAiB,EAAE,IAAI;QACvB,mBAAmB,EAAE,KAAK;QAE1B,UAAU,EAAE,IAAI;QAChB,mBAAmB,EAAE,KAAK;QAC1B,mBAAmB,EAAE,KAAK;QAC1B,oBAAoB,EAAE,KAAK;QAC3B,UAAU,EAAE,IAAI;QAEhB,cAAc,EAAE,KAAK;QAErB,YAAY,EAAE,KAAK;QAEnB,aAAa,EAAE;YACb,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,IAAI;SACjB;KACF;IAED,kBAAkB,EAAE,IAAI;IAExB,YAAY,EAAE,IAAI;IAElB,eAAe,EAAE,IAAI;IAErB,aAAa,EAAE,IAAI;IAEnB,kBAAkB,EAAE,IAAI;IAExB,WAAW,EAAE;QACX,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,IAAI;KACpB;IAED,yFAAyF;IACzF,yFAAyF;IACzF,uFAAuF;IACvF,WAAW,EAAE;QACX,OAAO,EAAE,IAAI;QACb,cAAc,EAAE,KAAK;QACrB,oBAAoB,EAAE,EAAE;QACxB,qBAAqB,EAAE,EAAE;QACzB,cAAc,EAAE,EAAE;QAClB,eAAe,EAAE,GAAG;KACrB;CACF,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
1
2
|
export interface DyNTS_GlobalLog_Settings {
|
|
2
3
|
/**
|
|
3
4
|
* this setting will set which logs will be shown
|
|
@@ -80,6 +81,31 @@ export interface DyNTS_GlobalLog_Settings {
|
|
|
80
81
|
enabled: boolean;
|
|
81
82
|
/** Max sorok szama a bufferben. Default: 2000. */
|
|
82
83
|
maxEntries?: number;
|
|
84
|
+
/**
|
|
85
|
+
* Engedelyezi-e a szerver-bootstrap automatikus, env-tudatos /logs
|
|
86
|
+
* mount-jat. Default: true.
|
|
87
|
+
*
|
|
88
|
+
* - TEST env: a `DYNTS_ADMIN_API_KEY` env var-os admin-key auth-tal mount-ol
|
|
89
|
+
* (ha a kulcs nincs beallitva → skip + warn).
|
|
90
|
+
* - PROD env: csak akkor mount-ol, ha a `prodAuthPreProcess` (FDP RBAC) be
|
|
91
|
+
* van allitva (kulonben skip + warn — SOHA nem mount-ol vedetlenul prod-on).
|
|
92
|
+
*
|
|
93
|
+
* Ha false → a bootstrap nem mount-ol semmit (az app sajat kezuleg
|
|
94
|
+
* regisztralhatja a DyNTS_getLogsRoutingModule()-t).
|
|
95
|
+
*
|
|
96
|
+
* Megj.: a tenyleges auto-mount WIRING a logs-endpoint-auto-mount feature-ben
|
|
97
|
+
* landol; ez itt a TIPUS-deklaracio (additive), hogy a consumer-ek (FDP
|
|
98
|
+
* Templates NTS logs-RBAC) tudjak allitani a `prodAuthPreProcess`-t.
|
|
99
|
+
*/
|
|
100
|
+
autoMount?: boolean;
|
|
101
|
+
/**
|
|
102
|
+
* PROD env-en hasznalt auth pre-process (FDP RBAC). A bootstrap auto-mount
|
|
103
|
+
* EZT hasznalja prod-on; ha nincs beallitva, prod-on NEM mount-ol.
|
|
104
|
+
*
|
|
105
|
+
* Tipusa megegyezik a DyNTS_getLogsRoutingModule({ authPreProcess })
|
|
106
|
+
* altal varttal (DyNTS_LogsController_Config.authPreProcess).
|
|
107
|
+
*/
|
|
108
|
+
prodAuthPreProcess?: (req: Request, res: Response) => Promise<void>;
|
|
83
109
|
};
|
|
84
110
|
/**
|
|
85
111
|
* File-based log kiiras konfiguracio (DyNTS_FileLog_Service).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-log-settings.interface.d.ts","sourceRoot":"","sources":["../../../src/_models/interfaces/global-log-settings.interface.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAG/B;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAG9B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,aAAa,CAAC,EAAE;QACd,2DAA2D;QAC3D,OAAO,EAAE,OAAO,CAAC;QACjB,kDAAkD;QAClD,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"global-log-settings.interface.d.ts","sourceRoot":"","sources":["../../../src/_models/interfaces/global-log-settings.interface.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAG/B;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAG9B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,aAAa,CAAC,EAAE;QACd,2DAA2D;QAC3D,OAAO,EAAE,OAAO,CAAC;QACjB,kDAAkD;QAClD,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB;;;;;;;;;;;;;;;WAeG;QACH,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB;;;;;;WAMG;QACH,kBAAkB,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KACrE,CAAC;IAEF;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,EAAE;QACT,+DAA+D;QAC/D,OAAO,EAAE,OAAO,CAAC;QACjB,yEAAyE;QACzE,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,sDAAsD;QACtD,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,4CAA4C;QAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,sEAAsE;QACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,0EAA0E;QAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,mEAAmE;QACnE,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,4CAA4C;QAC5C,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,4CAA4C;QAC5C,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;CACH"}
|
|
@@ -116,5 +116,26 @@ export interface DyNTS_Global_Settings {
|
|
|
116
116
|
* default settings: {@link DyNTS_Msg_global_settings}
|
|
117
117
|
*/
|
|
118
118
|
messaging_settings?: any;
|
|
119
|
+
/**
|
|
120
|
+
* FR-193 — bedrock OOM korai-figyelmeztető heap-watchdog ({@link DyNTS_MemoryGuard}).
|
|
121
|
+
* Ha `enabled`, a base `App` startup automatikusan feltelepíti. Periodikusan figyeli a
|
|
122
|
+
* heap-kihasználtságot, és a `--max-old-space-size` plafonhoz közeledve TARTÓS rekordot
|
|
123
|
+
* hagy az error-sinkbe (Errors-rendszer + Discord) — mielőtt a fatal OOM megölné a
|
|
124
|
+
* process-t. Default: enabled, 10s poll, warn 85% / crit 95%.
|
|
125
|
+
*/
|
|
126
|
+
memoryGuard?: {
|
|
127
|
+
/** Bekapcsolja a heap-watchdogot (a base App startup feltelepíti). Default: true. */
|
|
128
|
+
enabled: boolean;
|
|
129
|
+
/** Poll-intervallum ms-ben. Default: 10000. */
|
|
130
|
+
pollIntervalMs?: number;
|
|
131
|
+
/** Warning küszöb a heap-plafon %-ában. Default: 85. */
|
|
132
|
+
heapWarningThreshold?: number;
|
|
133
|
+
/** Critical küszöb a heap-plafon %-ában. Default: 95. */
|
|
134
|
+
heapCriticalThreshold?: number;
|
|
135
|
+
/** A warning küszöb ALATTI margó %-ban a 'recovered'-hez (hiszterézis). Default: 10. */
|
|
136
|
+
recoveryMargin?: number;
|
|
137
|
+
/** Megőrzött események max száma (ring-buffer). Default: 100. */
|
|
138
|
+
maxHistoryCount?: number;
|
|
139
|
+
};
|
|
119
140
|
}
|
|
120
141
|
//# sourceMappingURL=global-settings.interface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-settings.interface.d.ts","sourceRoot":"","sources":["../../../src/_models/interfaces/global-settings.interface.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AACzF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IAEpC,YAAY,EAAE,0BAA0B,CAAC;IAEzC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,oBAAoB,EAAE,mBAAmB,CAAC;IAC1C;;OAEG;IACH,qBAAqB,EAAE,oBAAoB,CAAC;IAE5C;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC;;OAEG;IACH,oCAAoC,EAAE,OAAO,CAAC;IAE9C;;OAEG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;OAEG;IAGH;;OAEG;IACH,YAAY,EAAE,wBAAwB,CAAC;IAEvC;;OAEG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAE5B;;;;;;OAMG;IACH,YAAY,EAAE,GAAG,CAAC;IAElB;;;;;;OAMG;IACH,eAAe,EAAE,GAAG,CAAC;IAErB;;;;;;;OAOG;IACH,aAAa,EAAE,GAAG,CAAC;IAEnB;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,GAAG,CAAC;IAEzB;;OAEG;IACH,WAAW,EAAE;QACX,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IAEF;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"global-settings.interface.d.ts","sourceRoot":"","sources":["../../../src/_models/interfaces/global-settings.interface.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AACzF,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAE9E;;;;;;;GAOG;AACH,MAAM,WAAW,qBAAqB;IAEpC,YAAY,EAAE,0BAA0B,CAAC;IAEzC;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,oBAAoB,EAAE,mBAAmB,CAAC;IAC1C;;OAEG;IACH,qBAAqB,EAAE,oBAAoB,CAAC;IAE5C;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;IAEjC;;OAEG;IACH,oCAAoC,EAAE,OAAO,CAAC;IAE9C;;OAEG;IACH,oBAAoB,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,gBAAgB,EAAE,MAAM,CAAC;IAEzB;;OAEG;IAGH;;OAEG;IACH,YAAY,EAAE,wBAAwB,CAAC;IAEvC;;OAEG;IACH,kBAAkB,EAAE,OAAO,CAAC;IAE5B;;;;;;OAMG;IACH,YAAY,EAAE,GAAG,CAAC;IAElB;;;;;;OAMG;IACH,eAAe,EAAE,GAAG,CAAC;IAErB;;;;;;;OAOG;IACH,aAAa,EAAE,GAAG,CAAC;IAEnB;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,GAAG,CAAC;IAEzB;;OAEG;IACH,WAAW,EAAE;QACX,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IAEF;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,GAAG,CAAC;IAEzB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE;QACZ,qFAAqF;QACrF,OAAO,EAAE,OAAO,CAAC;QACjB,+CAA+C;QAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,wDAAwD;QACxD,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,yDAAyD;QACzD,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,wFAAwF;QACxF,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,iEAAiE;QACjE,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { DyNTS_SingletonServiceBase } from '../base/singleton.service-base';
|
|
2
|
+
/**
|
|
3
|
+
* FR-193 (2026-06-15) — bedrock OOM korai-figyelmeztető heap-watchdog.
|
|
4
|
+
*
|
|
5
|
+
* MIÉRT: a Node heap-OOM (`--max-old-space-size` túllépés, pl. egy óriási JSON.parse)
|
|
6
|
+
* a process-t AZONNAL megöli — `process.on('uncaughtException')` NEM kapja el, így a
|
|
7
|
+
* crash pillanatában már nincs mód a hibát rögzíteni. Az EGYETLEN megbízható idő a
|
|
8
|
+
* rögzítésre a crash ELŐTT van. E watchdog periodikusan figyeli a heap-kihasználtságot,
|
|
9
|
+
* és amikor egy konfigurálható küszöböt átlép, TARTÓS rekordot hagy (DyFM_Log +
|
|
10
|
+
* `DyNTS_GlobalService.globalErrorHandler` → az Errors-sink, amit minden szerver megkap)
|
|
11
|
+
* — így egy OOM-hajlamos szerver NYOMOT hagy mielőtt elszáll, és a kuszob-atlepés
|
|
12
|
+
* lathato a dashboard-on / Discord-on.
|
|
13
|
+
*
|
|
14
|
+
* MIT NEM csinál: NEM állítja le/újraindítja a process-t (az a konténer-szintű
|
|
15
|
+
* `restart:` policy dolga), és NEM próbálja elkapni a fatal OOM-ot (nem lehet). Tisztán
|
|
16
|
+
* MEGFIGYELÉS + RÖGZÍTÉS + opcionális `onCritical` hook (amivel a fogyasztó terhet dobhat).
|
|
17
|
+
*
|
|
18
|
+
* Hiszterézis: a küszöböket CSAK állapot-VÁLTÁSkor jelzi (normal→warning→critical), és
|
|
19
|
+
* a `recoveryMargin`-nyit a warning ALÁ esve jelez 'recovered'-et — így nem spamel a
|
|
20
|
+
* küszöb körül oszcilláló heap.
|
|
21
|
+
*
|
|
22
|
+
* Használat (opt-in, mint a `DyNTS_Logs_Service`):
|
|
23
|
+
* DyNTS_MemoryGuard.getInstance().install(); // default settings
|
|
24
|
+
* DyNTS_MemoryGuard.getInstance().install({ onCritical }); // custom hook
|
|
25
|
+
* VAGY automatikusan: a base `App` startup feltelepíti, ha
|
|
26
|
+
* `DyNTS_global_settings.memoryGuard.enabled === true` (alapértelmezés szerint igen).
|
|
27
|
+
*/
|
|
28
|
+
/** Egy MemoryGuard esemény — küszöb-átlépés vagy helyreállás. */
|
|
29
|
+
export interface DyNTS_MemoryGuard_Event {
|
|
30
|
+
/** `warning` / `critical` küszöb-átlépés, vagy `recovered` (vissza normal-ba). */
|
|
31
|
+
level: 'warning' | 'critical' | 'recovered';
|
|
32
|
+
/** Heap használat MB-ban (`process.memoryUsage().heapUsed`). */
|
|
33
|
+
heapUsedMb: number;
|
|
34
|
+
/** Heap plafon MB-ban (`v8.getHeapStatistics().heap_size_limit` — a `--max-old-space-size`). */
|
|
35
|
+
heapLimitMb: number;
|
|
36
|
+
/** heapUsed / heapLimit * 100 (egész %-ra kerekítve). */
|
|
37
|
+
heapPct: number;
|
|
38
|
+
/** Resident Set Size MB-ban (teljes process-memória, heap + non-heap). */
|
|
39
|
+
rssMb: number;
|
|
40
|
+
/** External (C++ / Buffer) memória MB-ban. */
|
|
41
|
+
externalMb: number;
|
|
42
|
+
/** Esemény időbélyege (ISO). */
|
|
43
|
+
at: string;
|
|
44
|
+
}
|
|
45
|
+
/** `install()` opcionális override-jai (a `DyNTS_global_settings.memoryGuard` FÖLÉ). */
|
|
46
|
+
export interface DyNTS_MemoryGuard_Config {
|
|
47
|
+
/** Poll-intervallum ms-ben. Default: 10000. */
|
|
48
|
+
pollIntervalMs?: number;
|
|
49
|
+
/** Warning küszöb a heap-plafon %-ában. Default: 85. */
|
|
50
|
+
heapWarningThreshold?: number;
|
|
51
|
+
/** Critical küszöb a heap-plafon %-ában. Default: 95. */
|
|
52
|
+
heapCriticalThreshold?: number;
|
|
53
|
+
/** A warning küszöb ALATTI margó %-ban a 'recovered'-hez (hiszterézis). Default: 10. */
|
|
54
|
+
recoveryMargin?: number;
|
|
55
|
+
/** Megőrzött események max száma (ring-buffer). Default: 100. */
|
|
56
|
+
maxHistoryCount?: number;
|
|
57
|
+
/** Hook, amit a `critical` küszöb átlépésekor hívunk (pl. terhelés-dobás). */
|
|
58
|
+
onCritical?: (event: DyNTS_MemoryGuard_Event) => void;
|
|
59
|
+
}
|
|
60
|
+
type DyNTS_MemoryGuard_State = 'normal' | 'warning' | 'critical';
|
|
61
|
+
export declare class DyNTS_MemoryGuard extends DyNTS_SingletonServiceBase {
|
|
62
|
+
static getInstance(): DyNTS_MemoryGuard;
|
|
63
|
+
private timer;
|
|
64
|
+
private installed;
|
|
65
|
+
private state;
|
|
66
|
+
private pollIntervalMs;
|
|
67
|
+
private warnPct;
|
|
68
|
+
private critPct;
|
|
69
|
+
private recoveryMargin;
|
|
70
|
+
private maxHistoryCount;
|
|
71
|
+
private onCritical?;
|
|
72
|
+
private readonly history;
|
|
73
|
+
private peakHeapPct;
|
|
74
|
+
private peakRssMb;
|
|
75
|
+
protected constructor();
|
|
76
|
+
/**
|
|
77
|
+
* Elindítja a heap-watchdogot. Idempotens (többszöri hívás no-op). A `config`
|
|
78
|
+
* felülírja a `DyNTS_global_settings.memoryGuard` értékeit, ami a beépített
|
|
79
|
+
* defaultokat írja felül. SOHA nem dob — egy figyelő-réteg nem dönthet be egy
|
|
80
|
+
* szervert (minden hiba try/catch-elt + descriptive-en logolt).
|
|
81
|
+
*/
|
|
82
|
+
install(config?: DyNTS_MemoryGuard_Config): void;
|
|
83
|
+
/** A heap-plafon byte-ban (`--max-old-space-size`). Külön metódus a spec-mockoláshoz. */
|
|
84
|
+
private getHeapLimitBytes;
|
|
85
|
+
/**
|
|
86
|
+
* Egy poll-ciklus: kiolvassa a heap-kihasználtságot, frissíti a csúcsokat, és a
|
|
87
|
+
* hiszterézis-állapotgép szerint esemény-átlépéskor rögzít + logol. SOHA nem dob.
|
|
88
|
+
*/
|
|
89
|
+
private poll;
|
|
90
|
+
/** Esemény ring-bufferbe + log + (warning/critical esetén) tartós error-sink. */
|
|
91
|
+
private recordEvent;
|
|
92
|
+
/** A megőrzött események (legrégebbi → legújabb). Csak olvasásra. */
|
|
93
|
+
getHistory(): DyNTS_MemoryGuard_Event[];
|
|
94
|
+
/** Pillanatnyi állapot + csúcsok diagnosztikához (pl. egy status-endpoint). */
|
|
95
|
+
getStatus(): {
|
|
96
|
+
installed: boolean;
|
|
97
|
+
state: DyNTS_MemoryGuard_State;
|
|
98
|
+
peakHeapPct: number;
|
|
99
|
+
peakRssMb: number;
|
|
100
|
+
eventCount: number;
|
|
101
|
+
};
|
|
102
|
+
/** Telepítve van-e a watchdog. */
|
|
103
|
+
isInstalled(): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Leállítja a watchdogot + visszaállítja az állapotot. Graceful shutdown-hoz ÉS a
|
|
106
|
+
* spec-ek `afterEach`-éhez (a singleton-state ne szivárogjon a tesztek közt).
|
|
107
|
+
*/
|
|
108
|
+
_teardownForTesting(): void;
|
|
109
|
+
}
|
|
110
|
+
export {};
|
|
111
|
+
//# sourceMappingURL=memory-guard.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-guard.service.d.ts","sourceRoot":"","sources":["../../../src/_services/core/memory-guard.service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAG5E;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,iEAAiE;AACjE,MAAM,WAAW,uBAAuB;IACtC,kFAAkF;IAClF,KAAK,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IAC5C,gEAAgE;IAChE,UAAU,EAAE,MAAM,CAAC;IACnB,gGAAgG;IAChG,WAAW,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wFAAwF;AACxF,MAAM,WAAW,wBAAwB;IACvC,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,yDAAyD;IACzD,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,wFAAwF;IACxF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iEAAiE;IACjE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,uBAAuB,KAAK,IAAI,CAAC;CACvD;AAED,KAAK,uBAAuB,GAAG,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;AAIjE,qBAAa,iBAAkB,SAAQ,0BAA0B;IAE/D,MAAM,CAAC,WAAW,IAAI,iBAAiB;IAIvC,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,KAAK,CAAqC;IAGlD,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,eAAe,CAAe;IACtC,OAAO,CAAC,UAAU,CAAC,CAA2C;IAE9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiC;IACzD,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,SAAS,CAAa;IAE9B,SAAS;IAIT;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,EAAE,wBAAwB,GAAG,IAAI;IAgChD,yFAAyF;IACzF,OAAO,CAAC,iBAAiB;IAIzB;;;OAGG;IACH,OAAO,CAAC,IAAI;IA6CZ,iFAAiF;IACjF,OAAO,CAAC,WAAW;IA6CnB,qEAAqE;IACrE,UAAU,IAAI,uBAAuB,EAAE;IAIvC,+EAA+E;IAC/E,SAAS,IAAI;QACX,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,EAAE,uBAAuB,CAAC;QAC/B,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,EAAE,MAAM,CAAC;KACpB;IAUD,kCAAkC;IAClC,WAAW,IAAI,OAAO;IAItB;;;OAGG;IACH,mBAAmB,IAAI,IAAI;CAY5B"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DyNTS_MemoryGuard = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const v8 = tslib_1.__importStar(require("v8"));
|
|
6
|
+
const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
|
|
7
|
+
const global_settings_const_1 = require("../../_collections/global-settings.const");
|
|
8
|
+
const singleton_service_base_1 = require("../base/singleton.service-base");
|
|
9
|
+
const global_service_1 = require("./global.service");
|
|
10
|
+
const BYTES_PER_MB = 1024 * 1024;
|
|
11
|
+
class DyNTS_MemoryGuard extends singleton_service_base_1.DyNTS_SingletonServiceBase {
|
|
12
|
+
static getInstance() {
|
|
13
|
+
return DyNTS_MemoryGuard.getSingletonInstance();
|
|
14
|
+
}
|
|
15
|
+
timer = null;
|
|
16
|
+
installed = false;
|
|
17
|
+
state = 'normal';
|
|
18
|
+
// Feloldott (effektív) konfiguráció — install()-kor töltjük.
|
|
19
|
+
pollIntervalMs = 10000;
|
|
20
|
+
warnPct = 85;
|
|
21
|
+
critPct = 95;
|
|
22
|
+
recoveryMargin = 10;
|
|
23
|
+
maxHistoryCount = 100;
|
|
24
|
+
onCritical;
|
|
25
|
+
history = [];
|
|
26
|
+
peakHeapPct = 0;
|
|
27
|
+
peakRssMb = 0;
|
|
28
|
+
constructor() {
|
|
29
|
+
super();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Elindítja a heap-watchdogot. Idempotens (többszöri hívás no-op). A `config`
|
|
33
|
+
* felülírja a `DyNTS_global_settings.memoryGuard` értékeit, ami a beépített
|
|
34
|
+
* defaultokat írja felül. SOHA nem dob — egy figyelő-réteg nem dönthet be egy
|
|
35
|
+
* szervert (minden hiba try/catch-elt + descriptive-en logolt).
|
|
36
|
+
*/
|
|
37
|
+
install(config) {
|
|
38
|
+
if (this.installed) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
const g = global_settings_const_1.DyNTS_global_settings.memoryGuard ?? { enabled: true };
|
|
43
|
+
this.pollIntervalMs = config?.pollIntervalMs ?? g.pollIntervalMs ?? 10000;
|
|
44
|
+
this.warnPct = config?.heapWarningThreshold ?? g.heapWarningThreshold ?? 85;
|
|
45
|
+
this.critPct = config?.heapCriticalThreshold ?? g.heapCriticalThreshold ?? 95;
|
|
46
|
+
this.recoveryMargin = config?.recoveryMargin ?? g.recoveryMargin ?? 10;
|
|
47
|
+
this.maxHistoryCount = config?.maxHistoryCount ?? g.maxHistoryCount ?? 100;
|
|
48
|
+
this.onCritical = config?.onCritical;
|
|
49
|
+
this.installed = true;
|
|
50
|
+
this.timer = setInterval(() => { this.poll(); }, this.pollIntervalMs);
|
|
51
|
+
// unref(): a watchdog-timer NE tartsa életben a process-t önmagában (graceful
|
|
52
|
+
// exit-kor a Node ki tud lépni a függő interval ellenére is).
|
|
53
|
+
if (typeof this.timer.unref === 'function') {
|
|
54
|
+
this.timer.unref();
|
|
55
|
+
}
|
|
56
|
+
fsm_dynamo_1.DyFM_Log.info(`[DyNTS_MemoryGuard] installed — poll ${this.pollIntervalMs}ms, ` +
|
|
57
|
+
`warn ${this.warnPct}%, crit ${this.critPct}% (heap limit ` +
|
|
58
|
+
`${Math.round(this.getHeapLimitBytes() / BYTES_PER_MB)}MB)`);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
// Telepítési hiba SEM lehet fatal — a guard hiánya nem ér annyit, hogy a
|
|
62
|
+
// szerver-indulást megakassza.
|
|
63
|
+
fsm_dynamo_1.DyFM_Log.warn('[DyNTS_MemoryGuard] install failed (non-fatal):', err);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/** A heap-plafon byte-ban (`--max-old-space-size`). Külön metódus a spec-mockoláshoz. */
|
|
67
|
+
getHeapLimitBytes() {
|
|
68
|
+
return v8.getHeapStatistics().heap_size_limit;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Egy poll-ciklus: kiolvassa a heap-kihasználtságot, frissíti a csúcsokat, és a
|
|
72
|
+
* hiszterézis-állapotgép szerint esemény-átlépéskor rögzít + logol. SOHA nem dob.
|
|
73
|
+
*/
|
|
74
|
+
poll() {
|
|
75
|
+
try {
|
|
76
|
+
const limitBytes = this.getHeapLimitBytes();
|
|
77
|
+
if (!limitBytes || limitBytes <= 0) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const mu = process.memoryUsage();
|
|
81
|
+
const pct = (mu.heapUsed / limitBytes) * 100;
|
|
82
|
+
const rssMb = mu.rss / BYTES_PER_MB;
|
|
83
|
+
if (pct > this.peakHeapPct) {
|
|
84
|
+
this.peakHeapPct = pct;
|
|
85
|
+
}
|
|
86
|
+
if (rssMb > this.peakRssMb) {
|
|
87
|
+
this.peakRssMb = rssMb;
|
|
88
|
+
}
|
|
89
|
+
// Hiszterézis-állapotgép — esemény CSAK állapot-váltáskor.
|
|
90
|
+
const prev = this.state;
|
|
91
|
+
let next = prev;
|
|
92
|
+
if (pct >= this.critPct) {
|
|
93
|
+
next = 'critical';
|
|
94
|
+
}
|
|
95
|
+
else if (pct >= this.warnPct && prev === 'normal') {
|
|
96
|
+
next = 'warning';
|
|
97
|
+
}
|
|
98
|
+
else if (pct <= this.warnPct - this.recoveryMargin) {
|
|
99
|
+
next = 'normal';
|
|
100
|
+
}
|
|
101
|
+
// Egyébként marad a jelenlegi állapot (hiszterézis-sáv) — nincs re-emit.
|
|
102
|
+
if (next === prev) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.state = next;
|
|
106
|
+
const event = {
|
|
107
|
+
level: next === 'normal' ? 'recovered' : next,
|
|
108
|
+
heapUsedMb: Math.round(mu.heapUsed / BYTES_PER_MB),
|
|
109
|
+
heapLimitMb: Math.round(limitBytes / BYTES_PER_MB),
|
|
110
|
+
heapPct: Math.round(pct),
|
|
111
|
+
rssMb: Math.round(rssMb),
|
|
112
|
+
externalMb: Math.round((mu.external ?? 0) / BYTES_PER_MB),
|
|
113
|
+
at: new Date().toISOString(),
|
|
114
|
+
};
|
|
115
|
+
this.recordEvent(event);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
// Poll-hiba sosem fatal — a következő tick újrapróbálja.
|
|
119
|
+
fsm_dynamo_1.DyFM_Log.warn('[DyNTS_MemoryGuard] poll error (non-fatal):', err);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Esemény ring-bufferbe + log + (warning/critical esetén) tartós error-sink. */
|
|
123
|
+
recordEvent(event) {
|
|
124
|
+
this.history.push(event);
|
|
125
|
+
while (this.history.length > this.maxHistoryCount) {
|
|
126
|
+
this.history.shift();
|
|
127
|
+
}
|
|
128
|
+
const summary = `heap ${event.heapPct}% (${event.heapUsedMb}/${event.heapLimitMb}MB), rss ${event.rssMb}MB`;
|
|
129
|
+
if (event.level === 'recovered') {
|
|
130
|
+
fsm_dynamo_1.DyFM_Log.success(`[DyNTS_MemoryGuard] RECOVERED — ${summary}`);
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (event.level === 'critical') {
|
|
134
|
+
fsm_dynamo_1.DyFM_Log.H_error(`[DyNTS_MemoryGuard] CRITICAL heap pressure — ${summary} — OOM imminent`);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
fsm_dynamo_1.DyFM_Log.warn(`[DyNTS_MemoryGuard] WARNING heap pressure — ${summary}`);
|
|
138
|
+
}
|
|
139
|
+
// Tartós rögzítés a központi error-sinkbe (Errors-rendszer + Discord, ha bekötve).
|
|
140
|
+
try {
|
|
141
|
+
global_service_1.DyNTS_GlobalService.globalErrorHandler?.(new fsm_dynamo_1.DyFM_Error({
|
|
142
|
+
errorCode: `${global_settings_const_1.DyNTS_global_settings.systemShortCodeName ?? 'DyNTS'}|DyNTS-MG0-HEAP-${event.level.toUpperCase()}`,
|
|
143
|
+
message: `Heap pressure ${event.level.toUpperCase()}: ${summary}. ` +
|
|
144
|
+
`Process approaching the --max-old-space-size ceiling — OOM crash risk.`,
|
|
145
|
+
additionalContent: { memoryGuardEvent: event, peakHeapPct: Math.round(this.peakHeapPct) },
|
|
146
|
+
systemVersion: global_settings_const_1.DyNTS_global_settings.systemVersion,
|
|
147
|
+
level: event.level === 'critical' ? fsm_dynamo_1.DyFM_ErrorLevel.critical : fsm_dynamo_1.DyFM_ErrorLevel.warning,
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
catch (sinkErr) {
|
|
151
|
+
fsm_dynamo_1.DyFM_Log.warn('[DyNTS_MemoryGuard] error-sink record failed (non-fatal):', sinkErr);
|
|
152
|
+
}
|
|
153
|
+
if (event.level === 'critical' && this.onCritical) {
|
|
154
|
+
try {
|
|
155
|
+
this.onCritical(event);
|
|
156
|
+
}
|
|
157
|
+
catch (hookErr) {
|
|
158
|
+
fsm_dynamo_1.DyFM_Log.warn('[DyNTS_MemoryGuard] onCritical hook threw (non-fatal):', hookErr);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/** A megőrzött események (legrégebbi → legújabb). Csak olvasásra. */
|
|
163
|
+
getHistory() {
|
|
164
|
+
return this.history.slice();
|
|
165
|
+
}
|
|
166
|
+
/** Pillanatnyi állapot + csúcsok diagnosztikához (pl. egy status-endpoint). */
|
|
167
|
+
getStatus() {
|
|
168
|
+
return {
|
|
169
|
+
installed: this.installed,
|
|
170
|
+
state: this.state,
|
|
171
|
+
peakHeapPct: Math.round(this.peakHeapPct),
|
|
172
|
+
peakRssMb: Math.round(this.peakRssMb),
|
|
173
|
+
eventCount: this.history.length,
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
/** Telepítve van-e a watchdog. */
|
|
177
|
+
isInstalled() {
|
|
178
|
+
return this.installed;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Leállítja a watchdogot + visszaállítja az állapotot. Graceful shutdown-hoz ÉS a
|
|
182
|
+
* spec-ek `afterEach`-éhez (a singleton-state ne szivárogjon a tesztek közt).
|
|
183
|
+
*/
|
|
184
|
+
_teardownForTesting() {
|
|
185
|
+
if (this.timer) {
|
|
186
|
+
clearInterval(this.timer);
|
|
187
|
+
this.timer = null;
|
|
188
|
+
}
|
|
189
|
+
this.installed = false;
|
|
190
|
+
this.state = 'normal';
|
|
191
|
+
this.history.length = 0;
|
|
192
|
+
this.peakHeapPct = 0;
|
|
193
|
+
this.peakRssMb = 0;
|
|
194
|
+
this.onCritical = undefined;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.DyNTS_MemoryGuard = DyNTS_MemoryGuard;
|
|
198
|
+
//# sourceMappingURL=memory-guard.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-guard.service.js","sourceRoot":"","sources":["../../../src/_services/core/memory-guard.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.server.d.ts","sourceRoot":"","sources":["../../../src/_services/server/app.server.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,GAAG,QAAQ,UAAU,CAAC,CAAC;AACtC,OAAO,OAAO,GAAG,QAAQ,SAAS,CAAC,CAAC;AAMpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAIL,UAAU,EAOX,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uDAAuD,CAAC;AACzF,OAAO,EACL,uBAAuB,EACxB,MAAM,gEAAgE,CAAC;AAIxE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0DAA0D,CAAC;AAC/F,OAAO,EACL,4BAA4B,EAC7B,MAAM,2DAA2D,CAAC;AACnE,OAAO,EACL,4BAA4B,EAC7B,MAAM,4DAA4D,CAAC;AACpE,OAAO,EACL,2BAA2B,EAC5B,MAAM,2DAA2D,CAAC;AACnE,OAAO,EACL,mBAAmB,EACpB,MAAM,kDAAkD,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"app.server.d.ts","sourceRoot":"","sources":["../../../src/_services/server/app.server.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,7 @@ const app_system_controls_control_model_1 = require("../../_models/control-model
|
|
|
20
20
|
const http_settings_control_model_1 = require("../../_models/control-models/http-settings.control-model");
|
|
21
21
|
const singleton_service_1 = require("../base/singleton.service");
|
|
22
22
|
const global_service_1 = require("../core/global.service");
|
|
23
|
+
const memory_guard_service_1 = require("../core/memory-guard.service");
|
|
23
24
|
/**
|
|
24
25
|
*
|
|
25
26
|
* function MyDecorator(config: any) {
|
|
@@ -431,6 +432,18 @@ class DyNTS_App extends singleton_service_1.DyNTS_SingletonService {
|
|
|
431
432
|
global_service_1.DyNTS_GlobalService.globalErrorHandler?.(error);
|
|
432
433
|
});
|
|
433
434
|
}
|
|
435
|
+
// FR-193 — bedrock OOM korai-figyelmeztetés: feltelepítjük a heap-watchdogot, ha
|
|
436
|
+
// engedélyezve (DyNTS_global_settings.memoryGuard.enabled, default true). Biztonságos:
|
|
437
|
+
// a guard egy könnyű setInterval, ami SOHA nem dob; csak near-OOM küszöböknél hagy
|
|
438
|
+
// tartós nyomot az error-sinkbe, mielőtt a fatal heap-OOM megölné a process-t.
|
|
439
|
+
try {
|
|
440
|
+
if (global_settings_const_1.DyNTS_global_settings.memoryGuard?.enabled) {
|
|
441
|
+
memory_guard_service_1.DyNTS_MemoryGuard.getInstance().install();
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
catch (memoryGuardError) {
|
|
445
|
+
fsm_dynamo_1.DyFM_Log.warn('[DyNTS_MemoryGuard] auto-install skipped (non-fatal):', memoryGuardError);
|
|
446
|
+
}
|
|
434
447
|
if (!extended) {
|
|
435
448
|
await this.ready();
|
|
436
449
|
if (this.params.title) {
|