@abyss-project/monitor 2.2.1 → 2.4.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.
- package/README.md +36 -0
- package/dist/__tests__/alert-log-url.test.d.ts +1 -0
- package/dist/__tests__/alert-log-url.test.js +21 -0
- package/dist/__tests__/alert-log-url.test.js.map +1 -0
- package/dist/__tests__/application-log-bulk-api.test.d.ts +1 -0
- package/dist/__tests__/application-log-bulk-api.test.js +125 -0
- package/dist/__tests__/application-log-bulk-api.test.js.map +1 -0
- package/dist/__tests__/body-redaction.test.d.ts +1 -0
- package/dist/__tests__/body-redaction.test.js +104 -0
- package/dist/__tests__/body-redaction.test.js.map +1 -0
- package/dist/__tests__/graceful-shutdown-flush.test.d.ts +1 -0
- package/dist/__tests__/graceful-shutdown-flush.test.js +253 -0
- package/dist/__tests__/graceful-shutdown-flush.test.js.map +1 -0
- package/dist/__tests__/header-pattern.test.js +3 -0
- package/dist/__tests__/header-pattern.test.js.map +1 -1
- package/dist/__tests__/log-queue.test.d.ts +1 -0
- package/dist/__tests__/log-queue.test.js +97 -0
- package/dist/__tests__/log-queue.test.js.map +1 -0
- package/dist/__tests__/log-shipper-preconfig.test.d.ts +1 -0
- package/dist/__tests__/log-shipper-preconfig.test.js +54 -0
- package/dist/__tests__/log-shipper-preconfig.test.js.map +1 -0
- package/dist/__tests__/log-shipper.test.d.ts +1 -0
- package/dist/__tests__/log-shipper.test.js +1040 -0
- package/dist/__tests__/log-shipper.test.js.map +1 -0
- package/dist/__tests__/log-spool.test.d.ts +1 -0
- package/dist/__tests__/log-spool.test.js +297 -0
- package/dist/__tests__/log-spool.test.js.map +1 -0
- package/dist/__tests__/logger-body-size.test.d.ts +1 -0
- package/dist/__tests__/logger-body-size.test.js +12 -0
- package/dist/__tests__/logger-body-size.test.js.map +1 -0
- package/dist/__tests__/logger-enqueues.test.d.ts +1 -0
- package/dist/__tests__/logger-enqueues.test.js +276 -0
- package/dist/__tests__/logger-enqueues.test.js.map +1 -0
- package/dist/__tests__/logger-returns-promise.test.d.ts +1 -0
- package/dist/__tests__/logger-returns-promise.test.js +27 -0
- package/dist/__tests__/logger-returns-promise.test.js.map +1 -0
- package/dist/__tests__/route-decorator-body-flags.test.d.ts +1 -0
- package/dist/__tests__/route-decorator-body-flags.test.js +117 -0
- package/dist/__tests__/route-decorator-body-flags.test.js.map +1 -0
- package/dist/__tests__/route-flags-loader.test.d.ts +1 -0
- package/dist/__tests__/route-flags-loader.test.js +153 -0
- package/dist/__tests__/route-flags-loader.test.js.map +1 -0
- package/dist/__tests__/setconfig-keeps-queued-logs.test.d.ts +1 -0
- package/dist/__tests__/setconfig-keeps-queued-logs.test.js +59 -0
- package/dist/__tests__/setconfig-keeps-queued-logs.test.js.map +1 -0
- package/dist/__tests__/shipper-replay-on-config.test.d.ts +1 -0
- package/dist/__tests__/shipper-replay-on-config.test.js +59 -0
- package/dist/__tests__/shipper-replay-on-config.test.js.map +1 -0
- package/dist/__tests__/utils/setup-global.d.ts +1 -0
- package/dist/__tests__/utils/setup-global.js +35 -0
- package/dist/__tests__/utils/setup-global.js.map +1 -0
- package/dist/__tests__/utils/teardown-global.d.ts +1 -0
- package/dist/__tests__/utils/teardown-global.js +36 -0
- package/dist/__tests__/utils/teardown-global.js.map +1 -0
- package/dist/api/application-log.api.d.ts +5 -1
- package/dist/api/application-log.api.js +10 -1
- package/dist/api/application-log.api.js.map +1 -1
- package/dist/frameworks/express/decorators.d.ts +2 -0
- package/dist/frameworks/express/decorators.js +6 -0
- package/dist/frameworks/express/decorators.js.map +1 -1
- package/dist/frameworks/express/index.js +15 -5
- package/dist/frameworks/express/index.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/dist/middlewares/logger-endpoint.middleware.js +5 -4
- package/dist/middlewares/logger-endpoint.middleware.js.map +1 -1
- package/dist/models/index.d.ts +3 -0
- package/dist/models/index.js +3 -0
- package/dist/models/index.js.map +1 -1
- package/dist/models/log-queue.model.d.ts +25 -0
- package/dist/models/log-queue.model.js +68 -0
- package/dist/models/log-queue.model.js.map +1 -0
- package/dist/models/log-shipper.model.d.ts +75 -0
- package/dist/models/log-shipper.model.js +452 -0
- package/dist/models/log-shipper.model.js.map +1 -0
- package/dist/models/log-spool.model.d.ts +32 -0
- package/dist/models/log-spool.model.js +202 -0
- package/dist/models/log-spool.model.js.map +1 -0
- package/dist/models/logger.model.d.ts +2 -0
- package/dist/models/logger.model.js +49 -70
- package/dist/models/logger.model.js.map +1 -1
- package/dist/types/interface/api/requests/application-log.request.d.ts +10 -0
- package/dist/types/interface/api/responses/application-log.response.d.ts +5 -0
- package/dist/utils/alert.utils.d.ts +1 -0
- package/dist/utils/alert.utils.js +8 -5
- package/dist/utils/alert.utils.js.map +1 -1
- package/dist/utils/body-redaction.d.ts +9 -0
- package/dist/utils/body-redaction.js +57 -0
- package/dist/utils/body-redaction.js.map +1 -0
- package/dist/utils/graceful-shutdown.utils.d.ts +1 -0
- package/dist/utils/graceful-shutdown.utils.js +53 -8
- package/dist/utils/graceful-shutdown.utils.js.map +1 -1
- package/dist/utils/header-pattern.js +1 -0
- package/dist/utils/header-pattern.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/jest.config.ts +5 -0
- 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,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const body_redaction_1 = require("../utils/body-redaction");
|
|
4
|
+
describe('redactCapturedBody', () => {
|
|
5
|
+
it('drops credential keys by suffix, whatever the case or separator', () => {
|
|
6
|
+
const body = {
|
|
7
|
+
email: 'a@b.c',
|
|
8
|
+
password: 'p',
|
|
9
|
+
currentPassword: 'p',
|
|
10
|
+
new_password: 'p',
|
|
11
|
+
accessToken: 't',
|
|
12
|
+
refresh_token: 't',
|
|
13
|
+
'x-admin-token': 't',
|
|
14
|
+
adminToken: 't',
|
|
15
|
+
clientSecret: 's',
|
|
16
|
+
webhook_secret: 's',
|
|
17
|
+
apiKey: 'k',
|
|
18
|
+
API_KEY: 'k',
|
|
19
|
+
};
|
|
20
|
+
expect((0, body_redaction_1.redactCapturedBody)(body, body_redaction_1.CapturedBodySide.REQUEST)).toEqual({ email: 'a@b.c' });
|
|
21
|
+
});
|
|
22
|
+
it('drops exact keys sid, authorization and cookie', () => {
|
|
23
|
+
const body = { sid: 's', Authorization: 'Bearer x', cookie: 'c', user: { id: 'u1' } };
|
|
24
|
+
expect((0, body_redaction_1.redactCapturedBody)(body, body_redaction_1.CapturedBodySide.RESPONSE)).toEqual({ user: { id: 'u1' } });
|
|
25
|
+
});
|
|
26
|
+
it('drops code on the request side only', () => {
|
|
27
|
+
expect((0, body_redaction_1.redactCapturedBody)({ code: 'oauth-code', state: 'x' }, body_redaction_1.CapturedBodySide.REQUEST)).toEqual({
|
|
28
|
+
state: 'x',
|
|
29
|
+
});
|
|
30
|
+
expect((0, body_redaction_1.redactCapturedBody)({ code: 'emailNotVerified', type: 'authError' }, body_redaction_1.CapturedBodySide.RESPONSE)).toEqual({ code: 'emailNotVerified', type: 'authError' });
|
|
31
|
+
});
|
|
32
|
+
it('walks nested objects and arrays', () => {
|
|
33
|
+
const body = {
|
|
34
|
+
data: {
|
|
35
|
+
user: { id: 'u1' },
|
|
36
|
+
adminToken: 't',
|
|
37
|
+
items: [
|
|
38
|
+
{ id: 1, token: 'a' },
|
|
39
|
+
{ id: 2, token: 'b' },
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
expect((0, body_redaction_1.redactCapturedBody)(body, body_redaction_1.CapturedBodySide.RESPONSE)).toEqual({
|
|
44
|
+
data: { user: { id: 'u1' }, items: [{ id: 1 }, { id: 2 }] },
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
it('passes primitives, strings and null through unchanged', () => {
|
|
48
|
+
expect((0, body_redaction_1.redactCapturedBody)('Payload Too Large', body_redaction_1.CapturedBodySide.RESPONSE)).toBe('Payload Too Large');
|
|
49
|
+
expect((0, body_redaction_1.redactCapturedBody)(null, body_redaction_1.CapturedBodySide.REQUEST)).toBeNull();
|
|
50
|
+
expect((0, body_redaction_1.redactCapturedBody)(42, body_redaction_1.CapturedBodySide.REQUEST)).toBe(42);
|
|
51
|
+
expect((0, body_redaction_1.redactCapturedBody)(['a', 'b'], body_redaction_1.CapturedBodySide.REQUEST)).toEqual(['a', 'b']);
|
|
52
|
+
});
|
|
53
|
+
it('keeps keys that only contain a credential word without ending with it', () => {
|
|
54
|
+
expect((0, body_redaction_1.redactCapturedBody)({ tokenCount: 3, passwordUpdatedAt: 'd', secretName: 'n' }, body_redaction_1.CapturedBodySide.RESPONSE)).toEqual({ tokenCount: 3, passwordUpdatedAt: 'd', secretName: 'n' });
|
|
55
|
+
});
|
|
56
|
+
it('drops invitationTokenId, the consumption credential of an invitation (card #471 / ADR-0090)', () => {
|
|
57
|
+
const body = { invitationTokenId: 'inv-1', email: 'a@b.c' };
|
|
58
|
+
expect((0, body_redaction_1.redactCapturedBody)(body, body_redaction_1.CapturedBodySide.REQUEST)).toEqual({ email: 'a@b.c' });
|
|
59
|
+
expect((0, body_redaction_1.redactCapturedBody)(body, body_redaction_1.CapturedBodySide.RESPONSE)).toEqual({ email: 'a@b.c' });
|
|
60
|
+
});
|
|
61
|
+
it('keeps tokenHistoryId: it does not end with the tokenid suffix', () => {
|
|
62
|
+
const body = { tokenHistoryId: 'th-1' };
|
|
63
|
+
expect((0, body_redaction_1.redactCapturedBody)(body, body_redaction_1.CapturedBodySide.REQUEST)).toEqual({ tokenHistoryId: 'th-1' });
|
|
64
|
+
expect((0, body_redaction_1.redactCapturedBody)(body, body_redaction_1.CapturedBodySide.RESPONSE)).toEqual({ tokenHistoryId: 'th-1' });
|
|
65
|
+
});
|
|
66
|
+
it('never mutates its input', () => {
|
|
67
|
+
const body = { password: 'p', nested: { token: 't' } };
|
|
68
|
+
(0, body_redaction_1.redactCapturedBody)(body, body_redaction_1.CapturedBodySide.REQUEST);
|
|
69
|
+
expect(body).toEqual({ password: 'p', nested: { token: 't' } });
|
|
70
|
+
});
|
|
71
|
+
it('replaces nesting deeper than 32 levels with null', () => {
|
|
72
|
+
let deep = { token: 'leak' };
|
|
73
|
+
for (let i = 0; i < 40; i += 1)
|
|
74
|
+
deep = { child: deep };
|
|
75
|
+
const out = JSON.stringify((0, body_redaction_1.redactCapturedBody)(deep, body_redaction_1.CapturedBodySide.REQUEST));
|
|
76
|
+
expect(out).not.toContain('leak');
|
|
77
|
+
});
|
|
78
|
+
it('keeps a JSON-parsed __proto__ key as an own property instead of letting it vanish', () => {
|
|
79
|
+
const body = JSON.parse('{"__proto__":{"isAdmin":true},"email":"a@b.c"}');
|
|
80
|
+
const out = (0, body_redaction_1.redactCapturedBody)(body, body_redaction_1.CapturedBodySide.REQUEST);
|
|
81
|
+
expect(Object.keys(out)).toEqual(['__proto__', 'email']);
|
|
82
|
+
expect(JSON.stringify(out)).toContain('"__proto__"');
|
|
83
|
+
expect(Object.getPrototypeOf(out)).toBe(Object.prototype);
|
|
84
|
+
});
|
|
85
|
+
it('still drops a credential key nested under a __proto__ own property', () => {
|
|
86
|
+
const body = JSON.parse('{"__proto__":{"token":"leak","id":1}}');
|
|
87
|
+
const out = (0, body_redaction_1.redactCapturedBody)(body, body_redaction_1.CapturedBodySide.REQUEST);
|
|
88
|
+
expect(JSON.stringify(out)).not.toContain('leak');
|
|
89
|
+
expect(JSON.stringify(out)).toContain('"id":1');
|
|
90
|
+
});
|
|
91
|
+
it('does not pollute the global Object prototype', () => {
|
|
92
|
+
(0, body_redaction_1.redactCapturedBody)(JSON.parse('{"__proto__":{"isAdmin":true},"email":"a@b.c"}'), body_redaction_1.CapturedBodySide.REQUEST);
|
|
93
|
+
(0, body_redaction_1.redactCapturedBody)(JSON.parse('{"__proto__":{"token":"leak","id":1}}'), body_redaction_1.CapturedBodySide.REQUEST);
|
|
94
|
+
expect({}.isAdmin).toBeUndefined();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('isCredentialBodyKey', () => {
|
|
98
|
+
it('matches suffixes after normalization', () => {
|
|
99
|
+
expect((0, body_redaction_1.isCredentialBodyKey)('secretPublishToken', body_redaction_1.CapturedBodySide.RESPONSE)).toBe(true);
|
|
100
|
+
expect((0, body_redaction_1.isCredentialBodyKey)('personal_api_key', body_redaction_1.CapturedBodySide.RESPONSE)).toBe(true);
|
|
101
|
+
expect((0, body_redaction_1.isCredentialBodyKey)('description', body_redaction_1.CapturedBodySide.RESPONSE)).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=body-redaction.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"body-redaction.test.js","sourceRoot":"","sources":["../../src/__tests__/body-redaction.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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"}
|
|
@@ -21,6 +21,9 @@ describe('shouldCaptureHeader', () => {
|
|
|
21
21
|
expect((0, header_pattern_1.shouldCaptureHeader)('Authorization', ['authorization'])).toBe(false);
|
|
22
22
|
expect((0, header_pattern_1.shouldCaptureHeader)('Cookie', ['cookie'])).toBe(false);
|
|
23
23
|
});
|
|
24
|
+
it('returns false for the mesh admin token even if allowlisted by wildcard', () => {
|
|
25
|
+
expect((0, header_pattern_1.shouldCaptureHeader)('abyss-admin-token', ['abyss-*'])).toBe(false);
|
|
26
|
+
});
|
|
24
27
|
it('returns false when not in allowlist', () => {
|
|
25
28
|
expect((0, header_pattern_1.shouldCaptureHeader)('X-Custom', ['content-type'])).toBe(false);
|
|
26
29
|
});
|