@squiz/component-logger-lib 1.69.0 → 1.71.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/CHANGELOG.md +16 -0
- package/jest.integration.config.ts +2 -4
- package/lib/component-logger.d.ts +4 -2
- package/lib/component-logger.integration.spec.js +1 -1
- package/lib/component-logger.integration.spec.js.map +1 -1
- package/lib/component-logger.js +36 -9
- package/lib/component-logger.js.map +1 -1
- package/lib/component-logger.spec.js +94 -4
- package/lib/component-logger.spec.js.map +1 -1
- package/package.json +4 -3
- package/src/component-logger.integration.spec.ts +1 -1
- package/src/component-logger.spec.ts +118 -5
- package/src/component-logger.ts +46 -12
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
# @squiz/component-logger-lib
|
2
2
|
|
3
|
+
## 1.71.0
|
4
|
+
|
5
|
+
### Minor Changes
|
6
|
+
|
7
|
+
- 0d445ab: Avoid waiting for logging request to complete, parallelize more work when saving a content page.
|
8
|
+
|
9
|
+
### Patch Changes
|
10
|
+
|
11
|
+
- 0d445ab: Added spans to more easily identify different portions of the request which relate to saving a content page
|
12
|
+
|
13
|
+
## 1.70.0
|
14
|
+
|
15
|
+
### Minor Changes
|
16
|
+
|
17
|
+
- c719a29: Don't throw error if Logging API fails
|
18
|
+
|
3
19
|
## 1.69.0
|
4
20
|
|
5
21
|
### Minor Changes
|
@@ -1,14 +1,12 @@
|
|
1
1
|
import type { Config } from 'jest';
|
2
2
|
import { config as dotEnvConfig } from 'dotenv';
|
3
|
+
import { defaultIntegrationConfig } from '../../jest.config';
|
3
4
|
|
4
5
|
dotEnvConfig();
|
5
6
|
|
6
7
|
// Sync object
|
7
8
|
const config: Config = {
|
8
|
-
|
9
|
-
testTimeout: 60_000,
|
10
|
-
testEnvironment: 'node',
|
11
|
-
testRegex: '.*\\.integration\\.spec\\.ts$',
|
9
|
+
...defaultIntegrationConfig,
|
12
10
|
maxWorkers: 1,
|
13
11
|
};
|
14
12
|
|
@@ -1,8 +1,9 @@
|
|
1
1
|
import { ComponentLogLevel } from './component-log-message';
|
2
2
|
import { ComponentLoggerConfig } from './component-logger-config';
|
3
|
+
export declare const MAX_MESSAGE_LENGTH = 200000;
|
3
4
|
export declare const MAX_TAG_LENGTH = 200;
|
4
5
|
export declare class ComponentLogger {
|
5
|
-
readonly config
|
6
|
+
private readonly config;
|
6
7
|
private batch;
|
7
8
|
constructor(config: ComponentLoggerConfig);
|
8
9
|
debug(message: string | any, traceId?: string, userId?: string, tags?: string): Promise<void>;
|
@@ -11,5 +12,6 @@ export declare class ComponentLogger {
|
|
11
12
|
error(message: string | any, traceId?: string, userId?: string, tags?: string): Promise<void>;
|
12
13
|
protected append(level: ComponentLogLevel, message: string | any, traceId?: string, userId?: string, tags?: string): Promise<void>;
|
13
14
|
private cleanTags;
|
14
|
-
flush(): Promise<void>;
|
15
|
+
flush(background?: boolean): Promise<void>;
|
16
|
+
private flushInternal;
|
15
17
|
}
|
@@ -2,7 +2,7 @@
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
const dx_common_lib_1 = require("@squiz/dx-common-lib");
|
4
4
|
const _1 = require(".");
|
5
|
-
describe('ComponentLogger', () => {
|
5
|
+
describe.skip('ComponentLogger', () => {
|
6
6
|
it('should sending log messages', async () => {
|
7
7
|
const logger = await (0, _1.getComponentLogger)({
|
8
8
|
enabled: true,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"component-logger.integration.spec.js","sourceRoot":"","sources":["../src/component-logger.integration.spec.ts"],"names":[],"mappings":";;AAAA,wDAAyD;AACzD,wBAAuC;AAEvC,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;
|
1
|
+
{"version":3,"file":"component-logger.integration.spec.js","sourceRoot":"","sources":["../src/component-logger.integration.spec.ts"],"names":[],"mappings":";;AAAA,wDAAyD;AACzD,wBAAuC;AAEvC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAkB,EAAC;YACtC,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,kBAAkB;YAC5B,iBAAiB,EAAE,IAAA,iCAAiB,EAAC,iCAAiC,CAAC;YACvE,IAAI,EAAE,0BAA0B;YAChC,WAAW,EAAE,cAAc;SAC5B,CAAC,CAAC;QAEH,MAAM,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/lib/component-logger.js
CHANGED
@@ -3,10 +3,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
|
-
exports.ComponentLogger = exports.MAX_TAG_LENGTH = void 0;
|
6
|
+
exports.ComponentLogger = exports.MAX_TAG_LENGTH = exports.MAX_MESSAGE_LENGTH = void 0;
|
7
7
|
const superagent_1 = __importDefault(require("superagent"));
|
8
|
+
const api_1 = require("@opentelemetry/api");
|
8
9
|
const MESSAGE_BATCH_SIZE = 100;
|
10
|
+
exports.MAX_MESSAGE_LENGTH = 200000;
|
9
11
|
exports.MAX_TAG_LENGTH = 200;
|
12
|
+
const tracer = api_1.trace.getTracer('component-logger-lib:ComponentLogger');
|
10
13
|
class ComponentLogger {
|
11
14
|
constructor(config) {
|
12
15
|
this.config = config;
|
@@ -42,7 +45,7 @@ class ComponentLogger {
|
|
42
45
|
level: level,
|
43
46
|
service: this.config.serviceName,
|
44
47
|
timestamp: new Date().toISOString(),
|
45
|
-
message: payload,
|
48
|
+
message: payload.slice(0, exports.MAX_MESSAGE_LENGTH),
|
46
49
|
traceid: traceId,
|
47
50
|
userid: userId,
|
48
51
|
};
|
@@ -69,18 +72,42 @@ class ComponentLogger {
|
|
69
72
|
tags = tags.slice(0, exports.MAX_TAG_LENGTH);
|
70
73
|
return tags;
|
71
74
|
}
|
72
|
-
async flush() {
|
73
|
-
|
75
|
+
async flush(background = true) {
|
76
|
+
const promise = this.flushInternal();
|
77
|
+
// avoid holding up requests by default, don't await completion.
|
78
|
+
if (!background) {
|
79
|
+
await promise;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
async flushInternal() {
|
83
|
+
if (!this.config.enabled || this.batch.length === 0) {
|
84
|
+
return;
|
85
|
+
}
|
86
|
+
return tracer.startActiveSpan('flush', {
|
87
|
+
attributes: {
|
88
|
+
'batch.length': this.batch.length,
|
89
|
+
},
|
90
|
+
}, async (span) => {
|
91
|
+
const logs = this.batch;
|
92
|
+
this.batch = [];
|
74
93
|
try {
|
75
|
-
const url = `${this.config.logUrl.replace(/\/+$/, '')}
|
76
|
-
await superagent_1.default
|
77
|
-
|
94
|
+
const url = `${this.config.logUrl.replace(/\/+$/, '')}`;
|
95
|
+
await superagent_1.default
|
96
|
+
.post(url)
|
97
|
+
.set({
|
98
|
+
'x-dxp-tenant': this.config.tenantId,
|
99
|
+
'x-api-key': this.config.key,
|
100
|
+
})
|
101
|
+
.send(logs);
|
78
102
|
}
|
79
103
|
catch (err) {
|
104
|
+
this.batch.push(...logs);
|
80
105
|
console.error(err);
|
81
|
-
throw err;
|
82
106
|
}
|
83
|
-
|
107
|
+
finally {
|
108
|
+
span.end();
|
109
|
+
}
|
110
|
+
});
|
84
111
|
}
|
85
112
|
}
|
86
113
|
exports.ComponentLogger = ComponentLogger;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"component-logger.js","sourceRoot":"","sources":["../src/component-logger.ts"],"names":[],"mappings":";;;;;;AAAA,4DAAoC;
|
1
|
+
{"version":3,"file":"component-logger.js","sourceRoot":"","sources":["../src/component-logger.ts"],"names":[],"mappings":"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"}
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const component_logger_1 = require("./component-logger");
|
7
7
|
const superagent_1 = __importDefault(require("superagent"));
|
8
|
+
const timers_1 = require("timers");
|
8
9
|
const postSetMock = {
|
9
10
|
send: jest.fn(),
|
10
11
|
};
|
@@ -14,7 +15,10 @@ const postMock = {
|
|
14
15
|
},
|
15
16
|
};
|
16
17
|
jest.mock('superagent', () => ({
|
17
|
-
post: () => {
|
18
|
+
post: (url) => {
|
19
|
+
if (url === 'fail-logging-api-url') {
|
20
|
+
throw Error('logging failed');
|
21
|
+
}
|
18
22
|
return postMock;
|
19
23
|
},
|
20
24
|
}));
|
@@ -30,11 +34,13 @@ describe('ComponentLogger', () => {
|
|
30
34
|
afterEach(() => {
|
31
35
|
jest.clearAllMocks();
|
32
36
|
});
|
37
|
+
const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(jest.fn());
|
33
38
|
beforeAll(() => {
|
34
39
|
jest.useFakeTimers();
|
35
40
|
jest.setSystemTime(new Date('2023-05-28T00:00:00.000Z'));
|
36
41
|
});
|
37
42
|
afterAll(() => {
|
43
|
+
consoleErrorSpy.mockReset();
|
38
44
|
jest.useRealTimers();
|
39
45
|
});
|
40
46
|
it('should throw error if config.logUrl is not set', async () => {
|
@@ -76,8 +82,11 @@ describe('ComponentLogger', () => {
|
|
76
82
|
const logger = new component_logger_1.ComponentLogger(loggerConfig);
|
77
83
|
await logger.info('The quick brown fox', '123');
|
78
84
|
await logger.flush();
|
79
|
-
expect(postSpy).toBeCalledWith('some-log-url
|
80
|
-
expect(postSetSpy).toBeCalledWith(
|
85
|
+
expect(postSpy).toBeCalledWith('some-log-url');
|
86
|
+
expect(postSetSpy).toBeCalledWith({
|
87
|
+
'x-api-key': 'some-key',
|
88
|
+
'x-dxp-tenant': 'some-tenant-id',
|
89
|
+
});
|
81
90
|
});
|
82
91
|
it('should strip off extra "/" on the logUrl', async () => {
|
83
92
|
const loggerConfig = {
|
@@ -92,7 +101,7 @@ describe('ComponentLogger', () => {
|
|
92
101
|
const logger = new component_logger_1.ComponentLogger(loggerConfig);
|
93
102
|
await logger.info('The quick brown fox', '123');
|
94
103
|
await logger.flush();
|
95
|
-
expect(postSpy).toBeCalledWith('some-log-url
|
104
|
+
expect(postSpy).toBeCalledWith('some-log-url');
|
96
105
|
});
|
97
106
|
it('should not include "tags" in payload if tags is not configured', async () => {
|
98
107
|
const loggerConfig = {
|
@@ -324,5 +333,86 @@ describe('ComponentLogger', () => {
|
|
324
333
|
];
|
325
334
|
expect(postSetMock.send).toBeCalledWith(expectedMessages);
|
326
335
|
});
|
336
|
+
it('should truncate long messages', async () => {
|
337
|
+
const logger = new component_logger_1.ComponentLogger(loggerConfig);
|
338
|
+
const message = 'a'.repeat(component_logger_1.MAX_MESSAGE_LENGTH + 1);
|
339
|
+
await logger.info(message);
|
340
|
+
await logger.flush();
|
341
|
+
expect(postSetMock.send).toHaveBeenCalledWith([
|
342
|
+
expect.objectContaining({
|
343
|
+
message: message.slice(0, -1),
|
344
|
+
}),
|
345
|
+
]);
|
346
|
+
});
|
347
|
+
it('should not throw error if logging API fails', async () => {
|
348
|
+
const loggerConfig = {
|
349
|
+
enabled: true,
|
350
|
+
logUrl: 'fail-logging-api-url',
|
351
|
+
key: 'some-key',
|
352
|
+
tenantId: 'some-tenant-id',
|
353
|
+
tags: 'some-tags',
|
354
|
+
serviceName: 'some-service',
|
355
|
+
};
|
356
|
+
const logger = new component_logger_1.ComponentLogger(loggerConfig);
|
357
|
+
await logger.error('some error message', '123');
|
358
|
+
await logger.flush();
|
359
|
+
expect(consoleErrorSpy).toBeCalledWith(new Error('logging failed'));
|
360
|
+
});
|
361
|
+
it.each([
|
362
|
+
['background flush', true, ['flush resolved']],
|
363
|
+
['foreground flush', false, ['send resolved', 'flush resolved']],
|
364
|
+
])('should not await the promise if flush is performed in the background - %s', async (description, background, expectedResolveSequence) => {
|
365
|
+
const resolveSequence = [];
|
366
|
+
const resolver = jest.fn();
|
367
|
+
postSetMock.send.mockImplementation(async () => {
|
368
|
+
return new Promise((resolve) => {
|
369
|
+
resolver.mockImplementation(() => {
|
370
|
+
resolveSequence.push('send resolved');
|
371
|
+
resolve(null);
|
372
|
+
});
|
373
|
+
});
|
374
|
+
});
|
375
|
+
const logger = new component_logger_1.ComponentLogger(loggerConfig);
|
376
|
+
await logger.error('error message');
|
377
|
+
const flushPromise = logger.flush(background).then(() => resolveSequence.push('flush resolved'));
|
378
|
+
(0, timers_1.setImmediate)(() => {
|
379
|
+
resolver();
|
380
|
+
});
|
381
|
+
await flushPromise;
|
382
|
+
expect(resolveSequence).toEqual(expectedResolveSequence);
|
383
|
+
});
|
384
|
+
it('should not flush the same log entry multiple times if called concurrently', async () => {
|
385
|
+
const logger = new component_logger_1.ComponentLogger(loggerConfig);
|
386
|
+
const resolvers = [];
|
387
|
+
postSetMock.send.mockImplementation(async () => {
|
388
|
+
return new Promise((resolve) => {
|
389
|
+
resolvers.push(() => {
|
390
|
+
resolve(null);
|
391
|
+
});
|
392
|
+
});
|
393
|
+
});
|
394
|
+
await logger.error('error message 1');
|
395
|
+
await logger.flush();
|
396
|
+
await logger.error('error message 2');
|
397
|
+
await logger.flush();
|
398
|
+
resolvers.map((resolver) => resolver());
|
399
|
+
expect(postSetMock.send).toHaveBeenCalledTimes(2);
|
400
|
+
expect(postSetMock.send).toHaveBeenCalledWith([expect.objectContaining({ message: 'error message 1' })]);
|
401
|
+
expect(postSetMock.send).toHaveBeenCalledWith([expect.objectContaining({ message: 'error message 2' })]);
|
402
|
+
});
|
403
|
+
it('should flush logs on next attempt if they failed to flush', async () => {
|
404
|
+
const logger = new component_logger_1.ComponentLogger(loggerConfig);
|
405
|
+
postSetMock.send.mockRejectedValueOnce(new Error('Log submission failed.')).mockResolvedValue(postSetMock);
|
406
|
+
await logger.error('error message 1');
|
407
|
+
await logger.flush();
|
408
|
+
await logger.error('error message 2');
|
409
|
+
await logger.flush();
|
410
|
+
expect(postSetMock.send).toHaveBeenCalledTimes(2);
|
411
|
+
expect(postSetMock.send).toHaveBeenCalledWith([expect.objectContaining({ message: 'error message 1' })]);
|
412
|
+
expect(postSetMock.send).toHaveBeenCalledWith([
|
413
|
+
expect.objectContaining({ message: 'error message 1' }),
|
414
|
+
expect.objectContaining({ message: 'error message 2' }),
|
415
|
+
]);
|
416
|
+
});
|
327
417
|
});
|
328
418
|
//# sourceMappingURL=component-logger.spec.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"component-logger.spec.js","sourceRoot":"","sources":["../src/component-logger.spec.ts"],"names":[],"mappings":"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"}
|
1
|
+
{"version":3,"file":"component-logger.spec.js","sourceRoot":"","sources":["../src/component-logger.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@squiz/component-logger-lib",
|
3
|
-
"version": "1.
|
3
|
+
"version": "1.71.0",
|
4
4
|
"description": "",
|
5
5
|
"main": "lib/index.js",
|
6
6
|
"private": false,
|
@@ -15,14 +15,15 @@
|
|
15
15
|
"author": "",
|
16
16
|
"license": "ISC",
|
17
17
|
"dependencies": {
|
18
|
+
"@opentelemetry/api": "^1.6.0",
|
18
19
|
"superagent": "^8.0.9"
|
19
20
|
},
|
20
21
|
"devDependencies": {
|
21
22
|
"@squiz/dx-common-lib": "^1.64.0",
|
22
|
-
"@types/node": "20.12.
|
23
|
+
"@types/node": "20.12.12",
|
23
24
|
"dotenv": "^16.0.3",
|
24
25
|
"jest": "29.4.1",
|
25
26
|
"ts-jest": "29.0.5",
|
26
|
-
"ts-node": "10.9.
|
27
|
+
"ts-node": "10.9.2"
|
27
28
|
}
|
28
29
|
}
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { parseEnvVarForVar } from '@squiz/dx-common-lib';
|
2
2
|
import { getComponentLogger } from '.';
|
3
3
|
|
4
|
-
describe('ComponentLogger', () => {
|
4
|
+
describe.skip('ComponentLogger', () => {
|
5
5
|
it('should sending log messages', async () => {
|
6
6
|
const logger = await getComponentLogger({
|
7
7
|
enabled: true,
|
@@ -1,6 +1,7 @@
|
|
1
|
-
import { ComponentLogger, MAX_TAG_LENGTH } from './component-logger';
|
1
|
+
import { ComponentLogger, MAX_MESSAGE_LENGTH, MAX_TAG_LENGTH } from './component-logger';
|
2
2
|
import { ComponentLoggerConfig } from './component-logger-config';
|
3
3
|
import superagent from 'superagent';
|
4
|
+
import { setImmediate } from 'timers';
|
4
5
|
|
5
6
|
const postSetMock = {
|
6
7
|
send: jest.fn(),
|
@@ -11,7 +12,10 @@ const postMock = {
|
|
11
12
|
},
|
12
13
|
};
|
13
14
|
jest.mock('superagent', () => ({
|
14
|
-
post: () => {
|
15
|
+
post: (url: string) => {
|
16
|
+
if (url === 'fail-logging-api-url') {
|
17
|
+
throw Error('logging failed');
|
18
|
+
}
|
15
19
|
return postMock;
|
16
20
|
},
|
17
21
|
}));
|
@@ -30,12 +34,15 @@ describe('ComponentLogger', () => {
|
|
30
34
|
jest.clearAllMocks();
|
31
35
|
});
|
32
36
|
|
37
|
+
const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(jest.fn());
|
38
|
+
|
33
39
|
beforeAll(() => {
|
34
40
|
jest.useFakeTimers();
|
35
41
|
jest.setSystemTime(new Date('2023-05-28T00:00:00.000Z'));
|
36
42
|
});
|
37
43
|
|
38
44
|
afterAll(() => {
|
45
|
+
consoleErrorSpy.mockReset();
|
39
46
|
jest.useRealTimers();
|
40
47
|
});
|
41
48
|
|
@@ -83,8 +90,11 @@ describe('ComponentLogger', () => {
|
|
83
90
|
await logger.info('The quick brown fox', '123');
|
84
91
|
await logger.flush();
|
85
92
|
|
86
|
-
expect(postSpy).toBeCalledWith('some-log-url
|
87
|
-
expect(postSetSpy).toBeCalledWith(
|
93
|
+
expect(postSpy).toBeCalledWith('some-log-url');
|
94
|
+
expect(postSetSpy).toBeCalledWith({
|
95
|
+
'x-api-key': 'some-key',
|
96
|
+
'x-dxp-tenant': 'some-tenant-id',
|
97
|
+
});
|
88
98
|
});
|
89
99
|
|
90
100
|
it('should strip off extra "/" on the logUrl', async () => {
|
@@ -103,7 +113,7 @@ describe('ComponentLogger', () => {
|
|
103
113
|
await logger.info('The quick brown fox', '123');
|
104
114
|
await logger.flush();
|
105
115
|
|
106
|
-
expect(postSpy).toBeCalledWith('some-log-url
|
116
|
+
expect(postSpy).toBeCalledWith('some-log-url');
|
107
117
|
});
|
108
118
|
|
109
119
|
it('should not include "tags" in payload if tags is not configured', async () => {
|
@@ -376,4 +386,107 @@ describe('ComponentLogger', () => {
|
|
376
386
|
];
|
377
387
|
expect(postSetMock.send).toBeCalledWith(expectedMessages);
|
378
388
|
});
|
389
|
+
|
390
|
+
it('should truncate long messages', async () => {
|
391
|
+
const logger = new ComponentLogger(loggerConfig);
|
392
|
+
const message = 'a'.repeat(MAX_MESSAGE_LENGTH + 1);
|
393
|
+
|
394
|
+
await logger.info(message);
|
395
|
+
await logger.flush();
|
396
|
+
|
397
|
+
expect(postSetMock.send).toHaveBeenCalledWith([
|
398
|
+
expect.objectContaining({
|
399
|
+
message: message.slice(0, -1),
|
400
|
+
}),
|
401
|
+
]);
|
402
|
+
});
|
403
|
+
|
404
|
+
it('should not throw error if logging API fails', async () => {
|
405
|
+
const loggerConfig = <ComponentLoggerConfig>{
|
406
|
+
enabled: true,
|
407
|
+
logUrl: 'fail-logging-api-url',
|
408
|
+
key: 'some-key',
|
409
|
+
tenantId: 'some-tenant-id',
|
410
|
+
tags: 'some-tags',
|
411
|
+
serviceName: 'some-service',
|
412
|
+
};
|
413
|
+
const logger = new ComponentLogger(loggerConfig);
|
414
|
+
|
415
|
+
await logger.error('some error message', '123');
|
416
|
+
await logger.flush();
|
417
|
+
|
418
|
+
expect(consoleErrorSpy).toBeCalledWith(new Error('logging failed'));
|
419
|
+
});
|
420
|
+
|
421
|
+
it.each([
|
422
|
+
['background flush', true, ['flush resolved']],
|
423
|
+
['foreground flush', false, ['send resolved', 'flush resolved']],
|
424
|
+
])(
|
425
|
+
'should not await the promise if flush is performed in the background - %s',
|
426
|
+
async (description: string, background: boolean, expectedResolveSequence: string[]) => {
|
427
|
+
const resolveSequence: string[] = [];
|
428
|
+
const resolver = jest.fn();
|
429
|
+
|
430
|
+
postSetMock.send.mockImplementation(async () => {
|
431
|
+
return new Promise((resolve) => {
|
432
|
+
resolver.mockImplementation(() => {
|
433
|
+
resolveSequence.push('send resolved');
|
434
|
+
resolve(null);
|
435
|
+
});
|
436
|
+
});
|
437
|
+
});
|
438
|
+
|
439
|
+
const logger = new ComponentLogger(loggerConfig);
|
440
|
+
await logger.error('error message');
|
441
|
+
const flushPromise = logger.flush(background).then(() => resolveSequence.push('flush resolved'));
|
442
|
+
|
443
|
+
setImmediate(() => {
|
444
|
+
resolver();
|
445
|
+
});
|
446
|
+
await flushPromise;
|
447
|
+
|
448
|
+
expect(resolveSequence).toEqual(expectedResolveSequence);
|
449
|
+
},
|
450
|
+
);
|
451
|
+
|
452
|
+
it('should not flush the same log entry multiple times if called concurrently', async () => {
|
453
|
+
const logger = new ComponentLogger(loggerConfig);
|
454
|
+
const resolvers: (() => void)[] = [];
|
455
|
+
|
456
|
+
postSetMock.send.mockImplementation(async () => {
|
457
|
+
return new Promise((resolve) => {
|
458
|
+
resolvers.push(() => {
|
459
|
+
resolve(null);
|
460
|
+
});
|
461
|
+
});
|
462
|
+
});
|
463
|
+
|
464
|
+
await logger.error('error message 1');
|
465
|
+
await logger.flush();
|
466
|
+
await logger.error('error message 2');
|
467
|
+
await logger.flush();
|
468
|
+
resolvers.map((resolver) => resolver());
|
469
|
+
|
470
|
+
expect(postSetMock.send).toHaveBeenCalledTimes(2);
|
471
|
+
expect(postSetMock.send).toHaveBeenCalledWith([expect.objectContaining({ message: 'error message 1' })]);
|
472
|
+
expect(postSetMock.send).toHaveBeenCalledWith([expect.objectContaining({ message: 'error message 2' })]);
|
473
|
+
});
|
474
|
+
|
475
|
+
it('should flush logs on next attempt if they failed to flush', async () => {
|
476
|
+
const logger = new ComponentLogger(loggerConfig);
|
477
|
+
|
478
|
+
postSetMock.send.mockRejectedValueOnce(new Error('Log submission failed.')).mockResolvedValue(postSetMock);
|
479
|
+
|
480
|
+
await logger.error('error message 1');
|
481
|
+
await logger.flush();
|
482
|
+
await logger.error('error message 2');
|
483
|
+
await logger.flush();
|
484
|
+
|
485
|
+
expect(postSetMock.send).toHaveBeenCalledTimes(2);
|
486
|
+
expect(postSetMock.send).toHaveBeenCalledWith([expect.objectContaining({ message: 'error message 1' })]);
|
487
|
+
expect(postSetMock.send).toHaveBeenCalledWith([
|
488
|
+
expect.objectContaining({ message: 'error message 1' }),
|
489
|
+
expect.objectContaining({ message: 'error message 2' }),
|
490
|
+
]);
|
491
|
+
});
|
379
492
|
});
|
package/src/component-logger.ts
CHANGED
@@ -1,14 +1,17 @@
|
|
1
1
|
import superagent from 'superagent';
|
2
2
|
import { ComponentLogLevel, ComponentLogMessage } from './component-log-message';
|
3
3
|
import { ComponentLoggerConfig } from './component-logger-config';
|
4
|
+
import { trace } from '@opentelemetry/api';
|
4
5
|
|
5
6
|
const MESSAGE_BATCH_SIZE = 100;
|
7
|
+
export const MAX_MESSAGE_LENGTH = 200000;
|
6
8
|
export const MAX_TAG_LENGTH = 200;
|
9
|
+
const tracer = trace.getTracer('component-logger-lib:ComponentLogger');
|
7
10
|
|
8
11
|
export class ComponentLogger {
|
9
12
|
private batch: Array<ComponentLogMessage> = [];
|
10
13
|
|
11
|
-
constructor(readonly config: ComponentLoggerConfig) {
|
14
|
+
constructor(private readonly config: ComponentLoggerConfig) {
|
12
15
|
if (config.enabled) {
|
13
16
|
if (!config.logUrl) {
|
14
17
|
throw new Error('config.logUrl is required');
|
@@ -50,7 +53,7 @@ export class ComponentLogger {
|
|
50
53
|
level: level,
|
51
54
|
service: this.config.serviceName,
|
52
55
|
timestamp: new Date().toISOString(),
|
53
|
-
message: payload,
|
56
|
+
message: payload.slice(0, MAX_MESSAGE_LENGTH),
|
54
57
|
traceid: traceId,
|
55
58
|
userid: userId,
|
56
59
|
};
|
@@ -80,16 +83,47 @@ export class ComponentLogger {
|
|
80
83
|
return tags;
|
81
84
|
}
|
82
85
|
|
83
|
-
async flush(): Promise<void> {
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
} catch (err) {
|
90
|
-
console.error(err);
|
91
|
-
throw err;
|
92
|
-
}
|
86
|
+
async flush(background: boolean = true): Promise<void> {
|
87
|
+
const promise = this.flushInternal();
|
88
|
+
|
89
|
+
// avoid holding up requests by default, don't await completion.
|
90
|
+
if (!background) {
|
91
|
+
await promise;
|
93
92
|
}
|
94
93
|
}
|
94
|
+
|
95
|
+
private async flushInternal(): Promise<void> {
|
96
|
+
if (!this.config.enabled || this.batch.length === 0) {
|
97
|
+
return;
|
98
|
+
}
|
99
|
+
|
100
|
+
return tracer.startActiveSpan(
|
101
|
+
'flush',
|
102
|
+
{
|
103
|
+
attributes: {
|
104
|
+
'batch.length': this.batch.length,
|
105
|
+
},
|
106
|
+
},
|
107
|
+
async (span) => {
|
108
|
+
const logs = this.batch;
|
109
|
+
this.batch = [];
|
110
|
+
|
111
|
+
try {
|
112
|
+
const url = `${this.config.logUrl.replace(/\/+$/, '')}`;
|
113
|
+
await superagent
|
114
|
+
.post(url)
|
115
|
+
.set({
|
116
|
+
'x-dxp-tenant': this.config.tenantId,
|
117
|
+
'x-api-key': this.config.key,
|
118
|
+
})
|
119
|
+
.send(logs);
|
120
|
+
} catch (err) {
|
121
|
+
this.batch.push(...logs);
|
122
|
+
console.error(err);
|
123
|
+
} finally {
|
124
|
+
span.end();
|
125
|
+
}
|
126
|
+
},
|
127
|
+
);
|
128
|
+
}
|
95
129
|
}
|