@abyss-project/monitor 2.2.1 → 2.3.0

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.
Files changed (74) hide show
  1. package/README.md +36 -0
  2. package/dist/__tests__/alert-log-url.test.d.ts +1 -0
  3. package/dist/__tests__/alert-log-url.test.js +21 -0
  4. package/dist/__tests__/alert-log-url.test.js.map +1 -0
  5. package/dist/__tests__/application-log-bulk-api.test.d.ts +1 -0
  6. package/dist/__tests__/application-log-bulk-api.test.js +125 -0
  7. package/dist/__tests__/application-log-bulk-api.test.js.map +1 -0
  8. package/dist/__tests__/graceful-shutdown-flush.test.d.ts +1 -0
  9. package/dist/__tests__/graceful-shutdown-flush.test.js +253 -0
  10. package/dist/__tests__/graceful-shutdown-flush.test.js.map +1 -0
  11. package/dist/__tests__/log-queue.test.d.ts +1 -0
  12. package/dist/__tests__/log-queue.test.js +97 -0
  13. package/dist/__tests__/log-queue.test.js.map +1 -0
  14. package/dist/__tests__/log-shipper-preconfig.test.d.ts +1 -0
  15. package/dist/__tests__/log-shipper-preconfig.test.js +54 -0
  16. package/dist/__tests__/log-shipper-preconfig.test.js.map +1 -0
  17. package/dist/__tests__/log-shipper.test.d.ts +1 -0
  18. package/dist/__tests__/log-shipper.test.js +1040 -0
  19. package/dist/__tests__/log-shipper.test.js.map +1 -0
  20. package/dist/__tests__/log-spool.test.d.ts +1 -0
  21. package/dist/__tests__/log-spool.test.js +297 -0
  22. package/dist/__tests__/log-spool.test.js.map +1 -0
  23. package/dist/__tests__/logger-body-size.test.d.ts +1 -0
  24. package/dist/__tests__/logger-body-size.test.js +12 -0
  25. package/dist/__tests__/logger-body-size.test.js.map +1 -0
  26. package/dist/__tests__/logger-enqueues.test.d.ts +1 -0
  27. package/dist/__tests__/logger-enqueues.test.js +276 -0
  28. package/dist/__tests__/logger-enqueues.test.js.map +1 -0
  29. package/dist/__tests__/logger-returns-promise.test.d.ts +1 -0
  30. package/dist/__tests__/logger-returns-promise.test.js +27 -0
  31. package/dist/__tests__/logger-returns-promise.test.js.map +1 -0
  32. package/dist/__tests__/setconfig-keeps-queued-logs.test.d.ts +1 -0
  33. package/dist/__tests__/setconfig-keeps-queued-logs.test.js +59 -0
  34. package/dist/__tests__/setconfig-keeps-queued-logs.test.js.map +1 -0
  35. package/dist/__tests__/shipper-replay-on-config.test.d.ts +1 -0
  36. package/dist/__tests__/shipper-replay-on-config.test.js +59 -0
  37. package/dist/__tests__/shipper-replay-on-config.test.js.map +1 -0
  38. package/dist/__tests__/utils/setup-global.d.ts +1 -0
  39. package/dist/__tests__/utils/setup-global.js +35 -0
  40. package/dist/__tests__/utils/setup-global.js.map +1 -0
  41. package/dist/__tests__/utils/teardown-global.d.ts +1 -0
  42. package/dist/__tests__/utils/teardown-global.js +36 -0
  43. package/dist/__tests__/utils/teardown-global.js.map +1 -0
  44. package/dist/api/application-log.api.d.ts +5 -1
  45. package/dist/api/application-log.api.js +10 -1
  46. package/dist/api/application-log.api.js.map +1 -1
  47. package/dist/index.d.ts +5 -0
  48. package/dist/index.js +22 -0
  49. package/dist/index.js.map +1 -1
  50. package/dist/models/index.d.ts +3 -0
  51. package/dist/models/index.js +3 -0
  52. package/dist/models/index.js.map +1 -1
  53. package/dist/models/log-queue.model.d.ts +25 -0
  54. package/dist/models/log-queue.model.js +68 -0
  55. package/dist/models/log-queue.model.js.map +1 -0
  56. package/dist/models/log-shipper.model.d.ts +75 -0
  57. package/dist/models/log-shipper.model.js +452 -0
  58. package/dist/models/log-shipper.model.js.map +1 -0
  59. package/dist/models/log-spool.model.d.ts +32 -0
  60. package/dist/models/log-spool.model.js +202 -0
  61. package/dist/models/log-spool.model.js.map +1 -0
  62. package/dist/models/logger.model.d.ts +2 -0
  63. package/dist/models/logger.model.js +49 -70
  64. package/dist/models/logger.model.js.map +1 -1
  65. package/dist/types/interface/api/requests/application-log.request.d.ts +10 -0
  66. package/dist/types/interface/api/responses/application-log.response.d.ts +5 -0
  67. package/dist/utils/alert.utils.d.ts +1 -0
  68. package/dist/utils/alert.utils.js +8 -5
  69. package/dist/utils/alert.utils.js.map +1 -1
  70. package/dist/utils/graceful-shutdown.utils.d.ts +1 -0
  71. package/dist/utils/graceful-shutdown.utils.js +53 -8
  72. package/dist/utils/graceful-shutdown.utils.js.map +1 -1
  73. package/jest.config.ts +5 -0
  74. package/package.json +1 -1
package/README.md CHANGED
@@ -28,6 +28,42 @@ pnpm add @abyss-project/monitor
28
28
 
29
29
  Voir la [documentation produit](https://docs.abyss-project.fr/monitor) pour les guides d'utilisation, la configuration du Core, les exemples d'appel et la référence des permissions.
30
30
 
31
+ ## Livraison fiable des logs
32
+
33
+ Depuis la version portant le pipeline de logs fiable (SP-1), le `Logger` n'envoie plus un `POST` par
34
+ ligne : les logs sont mis en file, regroupés en lots (100 lignes ou 1 Mo, toutes les 500 ms) puis
35
+ envoyés à `POST /application-log/:applicationId/bulk`. En cas de coupure réseau ou de crash du process,
36
+ les lots en attente sont conservés sur disque et rejoués, et un lot rejoué est dédupliqué côté serveur
37
+ par `clientLogId`. Ce qui peut encore se perdre est borné : les lignes jetées par une file saturée
38
+ (10 000 lignes ou 32 Mo en mémoire), évincées d'un spool plein (64 Mo) ou refusées définitivement par
39
+ le serveur sont comptées, et ce nombre est remonté au serveur avec le lot suivant ; les lignes encore en
40
+ mémoire quand le process est tué sans arrêt propre (SIGKILL, OOM) — celles émises depuis le dernier
41
+ flush, 500 ms d'ordinaire, davantage pendant un envoi en cours — meurent avec lui sans être comptées.
42
+
43
+ ```typescript
44
+ AbyssMonitorCore.setConfig({
45
+ // ... vos options habituelles
46
+ shipper: {
47
+ spoolDirectory: '/var/lib/my-app/abyss-monitor-spool', // ou ABYSS_MONITOR_SPOOL_DIR
48
+ },
49
+ });
50
+ ```
51
+
52
+ Sur Kubernetes/k3s, le répertoire par défaut (le répertoire temporaire du système) ne survit pas à un
53
+ redémarrage de conteneur : montez un volume sur le chemin donné à `ABYSS_MONITOR_SPOOL_DIR` pour que les
54
+ logs en attente survivent au redémarrage. Un `emptyDir` survit au redémarrage d'un conteneur, pas au
55
+ remplacement du pod (déploiement, drain d'un nœud) : seul un volume persistant couvre ce cas. Chaque
56
+ application écrit dans son propre sous-dossier, `<ABYSS_MONITOR_SPOOL_DIR>/<applicationId>/`.
57
+
58
+ **Dans les tests d'un service consommateur**, désactivez le spool — `shipper: { spoolDirectory: null }`
59
+ — ou pointez `ABYSS_MONITOR_SPOOL_DIR` vers un répertoire temporaire propre au run : sinon les tests
60
+ écrivent dans le spool réel de la machine. Un process qui n'appelle jamais `setConfig` avec un
61
+ `applicationId` et un `secretPublishToken` garde ses logs en mémoire, jusqu'à 10 000 lignes ou 32 Mo,
62
+ en attendant une identité qui ne vient pas.
63
+
64
+ Détails complets — options du `shipper`, contrat de l'endpoint `bulk`, ce que la fiabilisation garantit
65
+ et ne garantit pas — dans la [documentation du Logger](https://docs.abyss-project.fr/monitor/setup/logger).
66
+
31
67
  ## Support
32
68
 
33
69
  Pour toute demande, ouvrir un ticket depuis [l'application Abyss](https://app.abyss-project.fr/dashboard/my-account/ticket/create).
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const alert_utils_1 = require("../utils/alert.utils");
4
+ describe('D2 : lien du tableau de bord sans identifiant serveur', () => {
5
+ it("ne contient pas application_log_id= quand l'identifiant est absent (null)", () => {
6
+ const url = (0, alert_utils_1.buildDashboardLogUrl)(null);
7
+ expect(url).not.toContain('application_log_id=');
8
+ expect(url.endsWith('/monitor/log')).toBe(true);
9
+ });
10
+ it("ne contient pas application_log_id= quand l'identifiant est absent (undefined)", () => {
11
+ const url = (0, alert_utils_1.buildDashboardLogUrl)(undefined);
12
+ expect(url).not.toContain('application_log_id=');
13
+ expect(url.endsWith('/monitor/log')).toBe(true);
14
+ });
15
+ it("ajoute application_log_id= quand l'identifiant est connu", () => {
16
+ const url = (0, alert_utils_1.buildDashboardLogUrl)('log-123');
17
+ expect(url).toContain('application_log_id=log-123');
18
+ expect(url).not.toMatch(/application_log_id=$/);
19
+ });
20
+ });
21
+ //# sourceMappingURL=alert-log-url.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alert-log-url.test.js","sourceRoot":"","sources":["../../src/__tests__/alert-log-url.test.ts"],"names":[],"mappings":";;AAAA,sDAA4D;AAE5D,QAAQ,CAAC,uDAAuD,EAAE,GAAG,EAAE;IACrE,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,GAAG,GAAG,IAAA,kCAAoB,EAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,GAAG,GAAG,IAAA,kCAAoB,EAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,GAAG,GAAG,IAAA,kCAAoB,EAAC,SAAS,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,125 @@
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
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const net = __importStar(require("net"));
27
+ const axios_1 = require("axios");
28
+ const __1 = require("..");
29
+ const application_log_api_1 = require("../api/application-log.api");
30
+ const log_shipper_model_1 = require("../models/log-shipper.model");
31
+ const types_1 = require("../types");
32
+ describe('createBulkApplicationLog', () => {
33
+ afterEach(() => {
34
+ jest.restoreAllMocks();
35
+ });
36
+ it('POST sur /application-log/:applicationId/bulk avec le token en query', async () => {
37
+ const post = jest
38
+ .spyOn(__1.AbyssMonitorCore.axios, 'post')
39
+ .mockResolvedValue({ data: { data: { created: 2, deduped: 0 } } });
40
+ const body = {
41
+ logs: [
42
+ { message: 'a', level: types_1.LogLevel.LOG, processId: '1', dateValue: new Date() },
43
+ { message: 'b', level: types_1.LogLevel.LOG, processId: '1', dateValue: new Date() },
44
+ ],
45
+ droppedCount: 3,
46
+ };
47
+ const response = await (0, application_log_api_1.createBulkApplicationLog)({ applicationId: 'app-1' }, { token: 'secret' }, body);
48
+ expect(post).toHaveBeenCalledWith('application-log/app-1/bulk', body, {
49
+ params: { token: 'secret' },
50
+ timeout: application_log_api_1.BULK_REQUEST_TIMEOUT_MS,
51
+ 'axios-retry': { retries: 0 },
52
+ });
53
+ expect(response.data.created).toBe(2);
54
+ });
55
+ it("prend le délai de la requête dans timeoutMs quand l'appelant en donne un", async () => {
56
+ const post = jest
57
+ .spyOn(__1.AbyssMonitorCore.axios, 'post')
58
+ .mockResolvedValue({ data: { data: { created: 0, deduped: 0 } } });
59
+ await (0, application_log_api_1.createBulkApplicationLog)({ applicationId: 'app-1' }, { token: 'secret' }, {
60
+ logs: [],
61
+ }, { timeoutMs: 1_234 });
62
+ expect(post.mock.calls[0][2]).toMatchObject({ timeout: 1_234 });
63
+ });
64
+ describe('timeout', () => {
65
+ it('abandonne une requête restée sans réponse, et le shipper la garde pour plus tard', async () => {
66
+ const sockets = [];
67
+ const server = net.createServer((socket) => {
68
+ sockets.push(socket);
69
+ });
70
+ await new Promise((resolve) => server.listen(0, '127.0.0.1', resolve));
71
+ const { port } = server.address();
72
+ const originalBaseURL = __1.AbyssMonitorCore.axios.defaults.baseURL;
73
+ __1.AbyssMonitorCore.axios.defaults.baseURL = `http://127.0.0.1:${port}/`;
74
+ let requestedTimeout;
75
+ const interceptor = __1.AbyssMonitorCore.axios.interceptors.request.use((config) => {
76
+ requestedTimeout = config.timeout;
77
+ config.timeout = 50;
78
+ return config;
79
+ });
80
+ try {
81
+ const startedAt = Date.now();
82
+ const error = await (0, application_log_api_1.createBulkApplicationLog)({ applicationId: 'app-1' }, { token: 'secret' }, { logs: [] }).then(() => null, (rejection) => rejection);
83
+ expect(application_log_api_1.BULK_REQUEST_TIMEOUT_MS).toBe(10_000);
84
+ expect(requestedTimeout).toBe(application_log_api_1.BULK_REQUEST_TIMEOUT_MS);
85
+ expect(Date.now() - startedAt).toBeLessThan(2_000);
86
+ expect(error?.code).toMatch(/^(ECONNABORTED|ETIMEDOUT)$/);
87
+ expect(error?.response).toBeUndefined();
88
+ expect((0, log_shipper_model_1.classifySendError)(error)).toBe(log_shipper_model_1.SendOutcome.RETRY);
89
+ }
90
+ finally {
91
+ __1.AbyssMonitorCore.axios.interceptors.request.eject(interceptor);
92
+ __1.AbyssMonitorCore.axios.defaults.baseURL = originalBaseURL;
93
+ sockets.forEach((socket) => socket.destroy());
94
+ await new Promise((resolve) => server.close(resolve));
95
+ }
96
+ });
97
+ });
98
+ describe('axios-retry override', () => {
99
+ const originalAdapter = __1.AbyssMonitorCore.axios.defaults.adapter;
100
+ afterEach(() => {
101
+ __1.AbyssMonitorCore.axios.defaults.adapter = originalAdapter;
102
+ });
103
+ const rejectWith503Adapter = (attempts) => (config) => {
104
+ attempts.count += 1;
105
+ const response = {
106
+ status: 503,
107
+ statusText: 'Service Unavailable',
108
+ headers: {},
109
+ config,
110
+ data: {},
111
+ };
112
+ return Promise.reject(new axios_1.AxiosError('Service Unavailable', axios_1.AxiosError.ERR_BAD_RESPONSE, config, null, response));
113
+ };
114
+ it('rejects after exactly one attempt even though the shared axios-retry config is enabled', async () => {
115
+ __1.AbyssMonitorCore.enableAxiosRetry({ retryDelay: () => 0 });
116
+ const attempts = { count: 0 };
117
+ __1.AbyssMonitorCore.axios.defaults.adapter = rejectWith503Adapter(attempts);
118
+ await expect((0, application_log_api_1.createBulkApplicationLog)({ applicationId: 'app-1' }, { token: 'secret' }, {
119
+ logs: [],
120
+ })).rejects.toMatchObject({ response: { status: 503 } });
121
+ expect(attempts.count).toBe(1);
122
+ });
123
+ });
124
+ });
125
+ //# sourceMappingURL=application-log-bulk-api.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-log-bulk-api.test.js","sourceRoot":"","sources":["../../src/__tests__/application-log-bulk-api.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,253 @@
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
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ const graceful_shutdown_utils_1 = require("../utils/graceful-shutdown.utils");
27
+ const logger_model_1 = require("../models/logger.model");
28
+ const __1 = require("..");
29
+ const request_tracker_utils_1 = require("../utils/request-tracker.utils");
30
+ const applicationLogApi = __importStar(require("../api/application-log.api"));
31
+ const types_1 = require("../types");
32
+ const ACK = { data: { created: 1, deduped: 0 } };
33
+ const messagesSent = (spy) => spy.mock.calls.flatMap((call) => call[2].logs.map((log) => log.message));
34
+ class DelayedErrorLogger extends logger_model_1.Logger {
35
+ async error(message, payload, options) {
36
+ await new Promise((resolve) => setImmediate(resolve));
37
+ return super.error(message, payload, options);
38
+ }
39
+ }
40
+ class HangingErrorLogger extends logger_model_1.Logger {
41
+ async error() {
42
+ return new Promise(() => undefined);
43
+ }
44
+ }
45
+ const httpError = (status) => Object.assign(new Error(`HTTP ${status}`), { response: { status } });
46
+ const removeAllShutdownListeners = () => {
47
+ process.removeAllListeners('SIGTERM');
48
+ process.removeAllListeners('SIGINT');
49
+ process.removeAllListeners('uncaughtException');
50
+ process.removeAllListeners('unhandledRejection');
51
+ };
52
+ describe('setupGracefulShutdown — flush avant process.exit', () => {
53
+ afterEach(() => {
54
+ removeAllShutdownListeners();
55
+ (0, request_tracker_utils_1.setIsShuttingDown)(false);
56
+ __1.AbyssMonitorCore.getShipper().stop();
57
+ jest.restoreAllMocks();
58
+ jest.useRealTimers();
59
+ });
60
+ it('vide le shipper AVANT process.exit (succès)', async () => {
61
+ const order = [];
62
+ jest.spyOn(__1.AbyssMonitorCore.getShipper(), 'flush').mockImplementation(async () => {
63
+ order.push('flush');
64
+ });
65
+ const exit = jest.spyOn(process, 'exit').mockImplementation((() => {
66
+ order.push('exit');
67
+ return undefined;
68
+ }));
69
+ (0, graceful_shutdown_utils_1.setupGracefulShutdown)({ logger: new logger_model_1.Logger({ shouldDisableConsoleLogging: true }) });
70
+ process.emit('SIGTERM');
71
+ await new Promise((resolve) => setTimeout(resolve, 50));
72
+ expect(order).toEqual(['flush', 'exit']);
73
+ expect(exit).toHaveBeenCalledWith(0);
74
+ });
75
+ it('vide le shipper AVANT process.exit (erreur pendant le shutdown)', async () => {
76
+ const order = [];
77
+ jest.spyOn(__1.AbyssMonitorCore.getShipper(), 'flush').mockImplementation(async () => {
78
+ order.push('flush');
79
+ });
80
+ const exit = jest.spyOn(process, 'exit').mockImplementation((() => {
81
+ order.push('exit');
82
+ return undefined;
83
+ }));
84
+ (0, graceful_shutdown_utils_1.setupGracefulShutdown)({
85
+ logger: new logger_model_1.Logger({ shouldDisableConsoleLogging: true }),
86
+ httpServer: {
87
+ close: (callback) => callback(new Error('close failed')),
88
+ },
89
+ });
90
+ process.emit('SIGTERM');
91
+ await new Promise((resolve) => setTimeout(resolve, 50));
92
+ expect(order).toEqual(['flush', 'exit']);
93
+ expect(exit).toHaveBeenCalledWith(1);
94
+ });
95
+ it("le timeout de shutdown vide la file sur disque (flush(0)) avant de forcer l'exit", async () => {
96
+ const order = [];
97
+ const flush = jest
98
+ .spyOn(__1.AbyssMonitorCore.getShipper(), 'flush')
99
+ .mockImplementation(async () => {
100
+ order.push('flush');
101
+ });
102
+ const exit = jest.spyOn(process, 'exit').mockImplementation((() => {
103
+ order.push('exit');
104
+ return undefined;
105
+ }));
106
+ (0, graceful_shutdown_utils_1.setupGracefulShutdown)({
107
+ logger: new logger_model_1.Logger({ shouldDisableConsoleLogging: true }),
108
+ shutdownTimeout: 20,
109
+ otherResources: [{ close: () => new Promise(() => { }) }],
110
+ });
111
+ process.emit('SIGTERM');
112
+ await new Promise((resolve) => setTimeout(resolve, 100));
113
+ expect(order).toEqual(['flush', 'exit']);
114
+ expect(flush).toHaveBeenCalledWith(0, { ignoreBackoff: true });
115
+ expect(exit).toHaveBeenCalledWith(1);
116
+ });
117
+ it('appelle stop() sur le shipper AVANT le flush', async () => {
118
+ const order = [];
119
+ const shipper = __1.AbyssMonitorCore.getShipper();
120
+ jest.spyOn(shipper, 'stop').mockImplementation(() => {
121
+ order.push('stop');
122
+ });
123
+ jest.spyOn(shipper, 'flush').mockImplementation(async () => {
124
+ order.push('flush');
125
+ });
126
+ jest.spyOn(process, 'exit').mockImplementation((() => undefined));
127
+ (0, graceful_shutdown_utils_1.setupGracefulShutdown)({ logger: new logger_model_1.Logger({ shouldDisableConsoleLogging: true }) });
128
+ process.emit('SIGTERM');
129
+ await new Promise((resolve) => setTimeout(resolve, 50));
130
+ expect(order).toEqual(['stop', 'flush']);
131
+ });
132
+ it('borne un flush qui ne se termine jamais : exit survient quand même après le délai + marge', async () => {
133
+ jest.useFakeTimers({ doNotFake: ['nextTick', 'setImmediate', 'queueMicrotask'] });
134
+ jest.spyOn(__1.AbyssMonitorCore.getShipper(), 'flush').mockImplementation(() => new Promise(() => {
135
+ }));
136
+ const exit = jest.spyOn(process, 'exit').mockImplementation((() => undefined));
137
+ (0, graceful_shutdown_utils_1.setupGracefulShutdown)({ logger: new logger_model_1.Logger({ shouldDisableConsoleLogging: true }) });
138
+ process.emit('SIGTERM');
139
+ await jest.advanceTimersByTimeAsync(2_000);
140
+ expect(exit).not.toHaveBeenCalled();
141
+ await jest.advanceTimersByTimeAsync(1_500);
142
+ expect(exit).toHaveBeenCalledWith(0);
143
+ });
144
+ it('envoie malgré un recul actif (503 puis SIGTERM) — amendement A3', async () => {
145
+ const order = [];
146
+ __1.AbyssMonitorCore.setConfig({
147
+ applicationId: 'app-flush-backoff',
148
+ secretPublishToken: 'secret',
149
+ shipper: { spoolDirectory: null, flushIntervalMs: 60_000 },
150
+ });
151
+ const shipper = __1.AbyssMonitorCore.getShipper();
152
+ const post = jest
153
+ .spyOn(applicationLogApi, 'createBulkApplicationLog')
154
+ .mockRejectedValueOnce(httpError(503))
155
+ .mockResolvedValue({ data: { created: 1, deduped: 0 } });
156
+ shipper.enqueue({
157
+ message: 'en attente de recul',
158
+ level: types_1.LogLevel.LOG,
159
+ processId: '1',
160
+ dateValue: new Date(),
161
+ clientLogId: 'flush-backoff-1',
162
+ });
163
+ await shipper.flush(3_000);
164
+ expect(post).toHaveBeenCalledTimes(1);
165
+ jest.spyOn(process, 'exit').mockImplementation((() => {
166
+ order.push('exit');
167
+ return undefined;
168
+ }));
169
+ const flushSpy = jest.spyOn(shipper, 'flush');
170
+ (0, graceful_shutdown_utils_1.setupGracefulShutdown)({ logger: new logger_model_1.Logger({ shouldDisableConsoleLogging: true }) });
171
+ process.emit('SIGTERM');
172
+ await new Promise((resolve) => setTimeout(resolve, 50));
173
+ expect(post).toHaveBeenCalledTimes(2);
174
+ expect(flushSpy).toHaveBeenCalledWith(3_000, { ignoreBackoff: true });
175
+ expect(order).toEqual(['exit']);
176
+ });
177
+ });
178
+ describe.each([
179
+ ['uncaughtException', () => process.emit('uncaughtException', new Error('boom'))],
180
+ [
181
+ 'unhandledRejection',
182
+ () => process.emit('unhandledRejection', new Error('boom'), Promise.resolve()),
183
+ ],
184
+ ])('setupGracefulShutdown — %s : un seul flush par sortie', (eventName, emitCrash) => {
185
+ afterEach(() => {
186
+ removeAllShutdownListeners();
187
+ (0, request_tracker_utils_1.setIsShuttingDown)(false);
188
+ __1.AbyssMonitorCore.getShipper().stop();
189
+ jest.restoreAllMocks();
190
+ jest.useRealTimers();
191
+ });
192
+ it('pas de shutdown en cours : un seul flush, celui de gracefulShutdown — le log de crash y figure', async () => {
193
+ __1.AbyssMonitorCore.setConfig({
194
+ applicationId: `app-crash-a-${eventName}`,
195
+ secretPublishToken: 'secret',
196
+ shipper: { spoolDirectory: null, flushIntervalMs: 60_000 },
197
+ });
198
+ const shipper = __1.AbyssMonitorCore.getShipper();
199
+ const post = jest
200
+ .spyOn(applicationLogApi, 'createBulkApplicationLog')
201
+ .mockResolvedValue(ACK);
202
+ const flushSpy = jest.spyOn(shipper, 'flush');
203
+ const exit = jest.spyOn(process, 'exit').mockImplementation((() => undefined));
204
+ (0, graceful_shutdown_utils_1.setupGracefulShutdown)({
205
+ logger: new DelayedErrorLogger({ shouldDisableConsoleLogging: true }),
206
+ });
207
+ emitCrash();
208
+ await new Promise((resolve) => setTimeout(resolve, 100));
209
+ expect(flushSpy).toHaveBeenCalledTimes(1);
210
+ expect(exit).toHaveBeenCalledWith(0);
211
+ expect(messagesSent(post)).toContain(eventName === 'uncaughtException' ? 'Uncaught Exception' : 'Unhandled Rejection');
212
+ });
213
+ it(`un log de crash qui ne rend jamais la main ne retient l'arrêt que ${graceful_shutdown_utils_1.CRASH_LOG_TIMEOUT_MS} ms`, async () => {
214
+ jest.useFakeTimers({ doNotFake: ['nextTick', 'setImmediate', 'queueMicrotask'] });
215
+ const flush = jest
216
+ .spyOn(__1.AbyssMonitorCore.getShipper(), 'flush')
217
+ .mockImplementation(async () => undefined);
218
+ const exit = jest.spyOn(process, 'exit').mockImplementation((() => undefined));
219
+ (0, graceful_shutdown_utils_1.setupGracefulShutdown)({
220
+ logger: new HangingErrorLogger({ shouldDisableConsoleLogging: true }),
221
+ });
222
+ emitCrash();
223
+ await jest.advanceTimersByTimeAsync(graceful_shutdown_utils_1.CRASH_LOG_TIMEOUT_MS - 1);
224
+ expect(flush).not.toHaveBeenCalled();
225
+ expect(exit).not.toHaveBeenCalled();
226
+ await jest.advanceTimersByTimeAsync(1);
227
+ expect(flush).toHaveBeenCalledTimes(1);
228
+ expect(exit).toHaveBeenCalledWith(0);
229
+ });
230
+ it('shutdown déjà en cours : le flush du handler tourne seul, le log y figure, gracefulShutdown ne reflushe pas', async () => {
231
+ __1.AbyssMonitorCore.setConfig({
232
+ applicationId: `app-crash-b-${eventName}`,
233
+ secretPublishToken: 'secret',
234
+ shipper: { spoolDirectory: null, flushIntervalMs: 60_000 },
235
+ });
236
+ const shipper = __1.AbyssMonitorCore.getShipper();
237
+ const post = jest
238
+ .spyOn(applicationLogApi, 'createBulkApplicationLog')
239
+ .mockResolvedValue(ACK);
240
+ const flushSpy = jest.spyOn(shipper, 'flush');
241
+ const exit = jest.spyOn(process, 'exit').mockImplementation((() => undefined));
242
+ (0, graceful_shutdown_utils_1.setupGracefulShutdown)({
243
+ logger: new DelayedErrorLogger({ shouldDisableConsoleLogging: true }),
244
+ });
245
+ (0, request_tracker_utils_1.setIsShuttingDown)(true);
246
+ emitCrash();
247
+ await new Promise((resolve) => setTimeout(resolve, 100));
248
+ expect(flushSpy).toHaveBeenCalledTimes(1);
249
+ expect(exit).not.toHaveBeenCalled();
250
+ expect(messagesSent(post)).toContain(eventName === 'uncaughtException' ? 'Uncaught Exception' : 'Unhandled Rejection');
251
+ });
252
+ });
253
+ //# sourceMappingURL=graceful-shutdown-flush.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graceful-shutdown-flush.test.js","sourceRoot":"","sources":["../../src/__tests__/graceful-shutdown-flush.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const log_queue_model_1 = require("../models/log-queue.model");
4
+ const types_1 = require("../types");
5
+ const makeLog = (message) => ({ message, level: types_1.LogLevel.LOG, processId: '1', dateValue: new Date() });
6
+ describe('LogQueue', () => {
7
+ it('empile et rend les entrées dans l ordre', () => {
8
+ const queue = new log_queue_model_1.LogQueue({ maxEntries: 10, maxBytes: 1000 });
9
+ queue.push(makeLog('a'), 10);
10
+ queue.push(makeLog('b'), 10);
11
+ const drained = queue.drain(10, 1000);
12
+ expect(drained.map((entry) => entry.log.message)).toEqual(['a', 'b']);
13
+ expect(queue.entryCount).toBe(0);
14
+ expect(queue.byteCount).toBe(0);
15
+ });
16
+ it('jette les plus VIEUX au dépassement du nombre d entrées', () => {
17
+ const queue = new log_queue_model_1.LogQueue({ maxEntries: 2, maxBytes: 1000 });
18
+ queue.push(makeLog('a'), 10);
19
+ queue.push(makeLog('b'), 10);
20
+ queue.push(makeLog('c'), 10);
21
+ expect(queue.drain(10, 1000).map((entry) => entry.log.message)).toEqual(['b', 'c']);
22
+ expect(queue.takeDroppedCount()).toBe(1);
23
+ });
24
+ it('jette les plus VIEUX au dépassement de la taille en octets', () => {
25
+ const queue = new log_queue_model_1.LogQueue({ maxEntries: 100, maxBytes: 25 });
26
+ queue.push(makeLog('a'), 10);
27
+ queue.push(makeLog('b'), 10);
28
+ queue.push(makeLog('c'), 10);
29
+ expect(queue.drain(100, 1000).map((entry) => entry.log.message)).toEqual(['b', 'c']);
30
+ expect(queue.takeDroppedCount()).toBe(1);
31
+ });
32
+ it('drain respecte les plafonds demandés et laisse le reste', () => {
33
+ const queue = new log_queue_model_1.LogQueue({ maxEntries: 100, maxBytes: 10_000 });
34
+ queue.push(makeLog('a'), 10);
35
+ queue.push(makeLog('b'), 10);
36
+ queue.push(makeLog('c'), 10);
37
+ expect(queue.drain(2, 10_000).map((entry) => entry.log.message)).toEqual(['a', 'b']);
38
+ expect(queue.entryCount).toBe(1);
39
+ expect(queue.drain(100, 15).map((entry) => entry.log.message)).toEqual(['c']);
40
+ });
41
+ it('drain rend toujours au moins une entrée même si elle dépasse le plafond d octets', () => {
42
+ const queue = new log_queue_model_1.LogQueue({ maxEntries: 10, maxBytes: 10_000 });
43
+ queue.push(makeLog('enorme'), 5_000);
44
+ expect(queue.drain(10, 100)).toHaveLength(1);
45
+ });
46
+ it('ne jette jamais l unique entrée même si elle dépasse le plafond en octets', () => {
47
+ const queue = new log_queue_model_1.LogQueue({ maxEntries: 10, maxBytes: 100 });
48
+ queue.push(makeLog('oversized'), 200);
49
+ expect(queue.entryCount).toBe(1);
50
+ expect(queue.byteCount).toBe(200);
51
+ expect(queue.takeDroppedCount()).toBe(0);
52
+ });
53
+ it('takeDroppedCount remet le compteur à zéro', () => {
54
+ const queue = new log_queue_model_1.LogQueue({ maxEntries: 1, maxBytes: 1000 });
55
+ queue.push(makeLog('a'), 10);
56
+ queue.push(makeLog('b'), 10);
57
+ expect(queue.takeDroppedCount()).toBe(1);
58
+ expect(queue.takeDroppedCount()).toBe(0);
59
+ });
60
+ it('remet des entrées en tête, dans leur ordre', () => {
61
+ const queue = new log_queue_model_1.LogQueue({ maxEntries: 10, maxBytes: 10_000 });
62
+ queue.push(makeLog('a'), 10);
63
+ queue.push(makeLog('b'), 10);
64
+ const drained = queue.drain(2, 10_000);
65
+ queue.push(makeLog('c'), 10);
66
+ queue.requeueFront(drained);
67
+ expect(queue.drain(10, 10_000).map((e) => e.log.message)).toEqual(['a', 'b', 'c']);
68
+ });
69
+ it('applique les plafonds à une remise en tête et compte ce qu elle jette', () => {
70
+ const queue = new log_queue_model_1.LogQueue({ maxEntries: 2, maxBytes: 10_000 });
71
+ queue.push(makeLog('a'), 10);
72
+ const drained = queue.drain(1, 10_000);
73
+ queue.push(makeLog('b'), 10);
74
+ queue.push(makeLog('c'), 10);
75
+ queue.requeueFront(drained);
76
+ expect(queue.drain(10, 10_000).map((e) => e.log.message)).toEqual(['b', 'c']);
77
+ expect(queue.takeDroppedCount()).toBe(1);
78
+ });
79
+ it('resize garde les entrées déjà en file sous des plafonds plus larges', () => {
80
+ const queue = new log_queue_model_1.LogQueue({ maxEntries: 2, maxBytes: 10_000 });
81
+ queue.push(makeLog('a'), 10);
82
+ queue.push(makeLog('b'), 10);
83
+ queue.resize({ maxEntries: 3, maxBytes: 10_000 });
84
+ queue.push(makeLog('c'), 10);
85
+ expect(queue.drain(10, 10_000).map((e) => e.log.message)).toEqual(['a', 'b', 'c']);
86
+ expect(queue.takeDroppedCount()).toBe(0);
87
+ });
88
+ it('resize applique tout de suite des plafonds plus serrés, en comptant ce qu il jette', () => {
89
+ const queue = new log_queue_model_1.LogQueue({ maxEntries: 10, maxBytes: 10_000 });
90
+ ['a', 'b', 'c'].forEach((message) => queue.push(makeLog(message), 10));
91
+ queue.resize({ maxEntries: 1, maxBytes: 10_000 });
92
+ expect(queue.entryCount).toBe(1);
93
+ expect(queue.takeDroppedCount()).toBe(2);
94
+ expect(queue.drain(10, 10_000).map((e) => e.log.message)).toEqual(['c']);
95
+ });
96
+ });
97
+ //# sourceMappingURL=log-queue.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-queue.test.js","sourceRoot":"","sources":["../../src/__tests__/log-queue.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};