Skip to content

Commit 4ba2e66

Browse files
committed
refactor(NODE-5169): Address review comments
1 parent f51ac87 commit 4ba2e66

File tree

7 files changed

+71
-78
lines changed

7 files changed

+71
-78
lines changed

src/cmap/connection_pool_events.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,10 @@ export class ConnectionClosedEvent extends ConnectionPoolMonitoringEvent {
137137
/** The id of the connection */
138138
connectionId: number | '<monitor>';
139139
/** The reason the connection was closed */
140-
reason: 'idle' | 'stale' | 'poolClosed' | 'error';
140+
reason: string;
141141
serviceId?: ObjectId;
142142
name = CONNECTION_CLOSED;
143-
error: Error | undefined;
143+
error: AnyError | null;
144144

145145
/** @internal */
146146
constructor(
@@ -153,7 +153,7 @@ export class ConnectionClosedEvent extends ConnectionPoolMonitoringEvent {
153153
this.connectionId = connection.id;
154154
this.reason = reason;
155155
this.serviceId = connection.serviceId;
156-
this.error = error;
156+
this.error = error ?? null;
157157
}
158158
}
159159

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ export type {
314314
MongoLoggerOptions,
315315
SeverityLevel
316316
} from './mongo_logger';
317-
export { createStdLogger } from './mongo_logger';
317+
export { createStdioLogger } from './mongo_logger';
318318
export type {
319319
CommonEvents,
320320
EventsDescription,

src/mongo_logger.ts

Lines changed: 50 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ type ClientLogPathOptions = {
170170
};
171171

172172
/** @internal */
173-
export function createStdLogger(stream: {
173+
export function createStdioLogger(stream: {
174174
write: NodeJS.WriteStream['write'];
175175
}): MongoDBLogWritable {
176176
return {
@@ -191,23 +191,25 @@ function resolveLogPath(
191191
{ MONGODB_LOG_PATH }: MongoLoggerEnvOptions,
192192
{ mongodbLogPath }: ClientLogPathOptions
193193
): MongoDBLogWritable {
194-
if (typeof mongodbLogPath === 'string' && /^stderr$/i.test(mongodbLogPath))
195-
return createStdLogger(process.stderr);
196-
if (typeof mongodbLogPath === 'string' && /^stdout$/i.test(mongodbLogPath))
197-
return createStdLogger(process.stdout);
194+
if (typeof mongodbLogPath === 'string' && /^stderr$/i.test(mongodbLogPath)) {
195+
return createStdioLogger(process.stderr);
196+
}
197+
if (typeof mongodbLogPath === 'string' && /^stdout$/i.test(mongodbLogPath)) {
198+
return createStdioLogger(process.stdout);
199+
}
198200

199201
if (typeof mongodbLogPath === 'object' && typeof mongodbLogPath?.write === 'function') {
200202
return mongodbLogPath;
201203
}
202204

203205
if (MONGODB_LOG_PATH && /^stderr$/i.test(MONGODB_LOG_PATH)) {
204-
return createStdLogger(process.stderr);
206+
return createStdioLogger(process.stderr);
205207
}
206208
if (MONGODB_LOG_PATH && /^stdout$/i.test(MONGODB_LOG_PATH)) {
207-
return createStdLogger(process.stdout);
209+
return createStdioLogger(process.stdout);
208210
}
209211

210-
return createStdLogger(process.stderr);
212+
return createStdioLogger(process.stderr);
211213
}
212214

213215
/** @internal */
@@ -220,7 +222,7 @@ export interface Log extends Record<string, any> {
220222

221223
/** @internal */
222224
export interface MongoDBLogWritable {
223-
write(log: Log): unknown;
225+
write(log: Log): void;
224226
}
225227

226228
function compareSeverity(s0: SeverityLevel, s1: SeverityLevel): 1 | 0 | -1 {
@@ -232,7 +234,6 @@ function compareSeverity(s0: SeverityLevel, s1: SeverityLevel): 1 | 0 | -1 {
232234

233235
/** @internal */
234236
export type LoggableEvent =
235-
//| ConnectionPoolMonitoringEvent
236237
| CommandStartedEvent
237238
| CommandSucceededEvent
238239
| CommandFailedEvent
@@ -262,45 +263,35 @@ function isLogConvertible(obj: Loggable): obj is LogConvertible {
262263
return objAsLogConvertible.toLog !== undefined && typeof objAsLogConvertible.toLog === 'function';
263264
}
264265

265-
function getHostPort(address: string): { host: string; port: number } {
266-
const hostAddress = new HostAddress(address);
267-
268-
// NOTE: Should only default when the address is a socket address
269-
if (hostAddress.socketPath) {
270-
return { host: hostAddress.socketPath, port: 0 };
271-
}
272-
273-
const host = hostAddress.host ?? '';
274-
const port = hostAddress.port ?? 0;
275-
return { host, port };
276-
}
277-
278266
function attachCommandFields(
279-
l: any,
280-
ev: CommandStartedEvent | CommandSucceededEvent | CommandFailedEvent
267+
log: Record<string, any>,
268+
commandEvent: CommandStartedEvent | CommandSucceededEvent | CommandFailedEvent
281269
) {
282-
l.commandName = ev.commandName;
283-
l.requestId = ev.requestId;
284-
l.driverConnectionId = ev?.connectionId;
285-
const { host, port } = getHostPort(ev.address);
286-
l.serverHost = host;
287-
l.serverPort = port;
288-
if (ev?.serviceId) {
289-
l.serviceId = ev.serviceId.toHexString();
270+
log.commandName = commandEvent.commandName;
271+
log.requestId = commandEvent.requestId;
272+
log.driverConnectionId = commandEvent?.connectionId;
273+
const { host, port } = HostAddress.fromString(commandEvent.address).toHostPort();
274+
log.serverHost = host;
275+
log.serverPort = port;
276+
if (commandEvent?.serviceId) {
277+
log.serviceId = commandEvent.serviceId.toHexString();
290278
}
291279

292-
return l;
280+
return log;
293281
}
294282

295-
function attachConnectionFields(l: any, ev: ConnectionPoolMonitoringEvent) {
296-
const { host, port } = getHostPort(ev.address);
297-
l.serverHost = host;
298-
l.serverPort = port;
283+
function attachConnectionFields(
284+
log: Record<string, any>,
285+
connectionPoolEvent: ConnectionPoolMonitoringEvent
286+
) {
287+
const { host, port } = HostAddress.fromString(connectionPoolEvent.address).toHostPort();
288+
log.serverHost = host;
289+
log.serverPort = port;
299290

300-
return l;
291+
return log;
301292
}
302293

303-
function DEFAULT_LOG_TRANSFORM(logObject: LoggableEvent): Omit<Log, 's' | 't' | 'c'> {
294+
function defaultLogTransform(logObject: LoggableEvent): Omit<Log, 's' | 't' | 'c'> {
304295
let log: Omit<Log, 's' | 't' | 'c'> = Object.create(null);
305296

306297
switch (logObject.name) {
@@ -309,19 +300,19 @@ function DEFAULT_LOG_TRANSFORM(logObject: LoggableEvent): Omit<Log, 's' | 't' |
309300
log.message = 'Command started';
310301
log.command = EJSON.stringify(logObject.command);
311302
log.databaseName = logObject.databaseName;
312-
break;
303+
return log;
313304
case COMMAND_SUCCEEDED:
314305
log = attachCommandFields(log, logObject);
315306
log.message = 'Command succeeded';
316307
log.durationMS = logObject.duration;
317308
log.reply = EJSON.stringify(logObject.reply);
318-
break;
309+
return log;
319310
case COMMAND_FAILED:
320311
log = attachCommandFields(log, logObject);
321312
log.message = 'Command failed';
322313
log.durationMS = logObject.duration;
323314
log.failure = logObject.failure;
324-
break;
315+
return log;
325316
case CONNECTION_POOL_CREATED:
326317
log = attachConnectionFields(log, logObject);
327318
log.message = 'Connection pool created';
@@ -336,44 +327,37 @@ function DEFAULT_LOG_TRANSFORM(logObject: LoggableEvent): Omit<Log, 's' | 't' |
336327
maxConnecting,
337328
waitQueueTimeoutMS
338329
};
339-
log.waitQueueSize = logObject.waitQueueSize;
340330
}
341-
break;
331+
return log;
342332
case CONNECTION_POOL_READY:
343333
log = attachConnectionFields(log, logObject);
344334
log.message = 'Connection pool ready';
345-
break;
335+
return log;
346336
case CONNECTION_POOL_CLEARED:
347337
log = attachConnectionFields(log, logObject);
348338
log.message = 'Connection pool cleared';
349339
if (logObject.serviceId?._bsontype === 'ObjectId') {
350340
log.serviceId = logObject.serviceId.toHexString();
351341
}
352-
break;
342+
return log;
353343
case CONNECTION_POOL_CLOSED:
354344
log = attachConnectionFields(log, logObject);
355345
log.message = 'Connection pool closed';
356-
break;
346+
return log;
357347
case CONNECTION_CREATED:
358348
log = attachConnectionFields(log, logObject);
359349
log.message = 'Connection created';
360-
if ('connectionId' in logObject) {
361-
log.driverConnectionId = logObject.connectionId;
362-
}
363-
break;
350+
log.driverConnectionId = logObject.connectionId;
351+
return log;
364352
case CONNECTION_READY:
365353
log = attachConnectionFields(log, logObject);
366354
log.message = 'Connection ready';
367-
if ('connectionId' in logObject) {
368-
log.driverConnectionId = logObject.connectionId;
369-
}
370-
break;
355+
log.driverConnectionId = logObject.connectionId;
356+
return log;
371357
case CONNECTION_CLOSED:
372358
log = attachConnectionFields(log, logObject);
373359
log.message = 'Connection closed';
374-
if ('connectionId' in logObject) {
375-
log.driverConnectionId = logObject.connectionId;
376-
}
360+
log.driverConnectionId = logObject.connectionId;
377361
switch (logObject.reason) {
378362
case 'stale':
379363
log.reason = 'Connection became stale because the pool was cleared';
@@ -392,28 +376,28 @@ function DEFAULT_LOG_TRANSFORM(logObject: LoggableEvent): Omit<Log, 's' | 't' |
392376
log.reason = 'Connection pool was closed';
393377
break;
394378
default:
395-
// Omit if we have some other reason as it would be invalid
379+
log.reason = `Unknown close reason: ${logObject.reason}`;
396380
}
397-
break;
381+
return log;
398382
case CONNECTION_CHECK_OUT_STARTED:
399383
log = attachConnectionFields(log, logObject);
400384
log.message = 'Connection checkout started';
401-
break;
385+
return log;
402386
case CONNECTION_CHECK_OUT_FAILED:
403387
log = attachConnectionFields(log, logObject);
404388
log.message = 'Connection checkout failed';
405389
log.reason = logObject.reason;
406-
break;
390+
return log;
407391
case CONNECTION_CHECKED_OUT:
408392
log = attachConnectionFields(log, logObject);
409393
log.message = 'Connection checked out';
410394
log.driverConnectionId = logObject.connectionId;
411-
break;
395+
return log;
412396
case CONNECTION_CHECKED_IN:
413397
log = attachConnectionFields(log, logObject);
414398
log.message = 'Connection checked in';
415399
log.driverConnectionId = logObject.connectionId;
416-
break;
400+
return log;
417401
default:
418402
for (const [key, value] of Object.entries(logObject)) {
419403
if (value != null) log[key] = value;
@@ -453,7 +437,6 @@ export class MongoLogger {
453437
this.logDestination = options.logDestination;
454438
}
455439

456-
457440
private log(
458441
severity: SeverityLevel,
459442
component: MongoLoggableComponent,
@@ -468,7 +451,7 @@ export class MongoLogger {
468451
if (isLogConvertible(message)) {
469452
logMessage = { ...logMessage, ...message.toLog() };
470453
} else {
471-
logMessage = { ...logMessage, ...DEFAULT_LOG_TRANSFORM(message) };
454+
logMessage = { ...logMessage, ...defaultLogTransform(message) };
472455
}
473456
}
474457
this.logDestination.write(logMessage);

src/utils.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,6 +1083,16 @@ export class HostAddress {
10831083
static fromSrvRecord({ name, port }: SrvRecord): HostAddress {
10841084
return HostAddress.fromHostPort(name, port);
10851085
}
1086+
1087+
toHostPort(): { host: string; port: number } {
1088+
if (this.socketPath) {
1089+
return { host: this.socketPath, port: 0 };
1090+
}
1091+
1092+
const host = this.host ?? '';
1093+
const port = this.port ?? 0;
1094+
return { host, port };
1095+
}
10861096
}
10871097

10881098
export const DEFAULT_PK_FACTORY = {

test/unit/connection_string.test.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,9 +561,10 @@ describe('Connection String', function () {
561561

562562
describe('feature flags', () => {
563563
it('should be stored in the FEATURE_FLAGS Set', () => {
564-
expect(FEATURE_FLAGS.size).to.equal(2);
564+
expect(FEATURE_FLAGS.size).to.equal(3);
565565
expect(FEATURE_FLAGS.has(Symbol.for('@@mdb.skipPingOnConnect'))).to.be.true;
566566
expect(FEATURE_FLAGS.has(Symbol.for('@@mdb.enableMongoLogger'))).to.be.true;
567+
expect(FEATURE_FLAGS.has(Symbol.for('@@mdb.internalLoggerConfig'))).to.be.true;
567568
// Add more flags here
568569
});
569570

test/unit/index.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const EXPECTED_EXPORTS = [
4646
'ConnectionPoolMonitoringEvent',
4747
'ConnectionPoolReadyEvent',
4848
'ConnectionReadyEvent',
49+
'createStdioLogger',
4950
'CURSOR_FLAGS',
5051
'Db',
5152
'DBRef',

test/unit/mongo_logger.test.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,9 +1012,6 @@ describe('class MongoLogger', function () {
10121012
it('emits a log with field `waitQueueTimeoutMS` that is a number', function () {
10131013
expect(log).to.have.property('waitQueueTimeoutMS').that.is.a('number');
10141014
});
1015-
it('emits a log with field `waitQueueSize` that is a number', function () {
1016-
expect(log).to.have.property('waitQueueSize').that.is.a('number');
1017-
});
10181015
});
10191016

10201017
context('when ConnectionPoolReadyEvent is logged', function () {
@@ -1195,16 +1192,17 @@ describe('class MongoLogger', function () {
11951192
});
11961193
}
11971194

1198-
context('with invalid reason', function () {
1195+
context('with unknown reason', function () {
11991196
beforeEach(function () {
12001197
logger[severityLevel]('connection', { ...connectionClosed, reason: 'woops' });
12011198
expect(stream.buffer).to.have.lengthOf(1);
12021199
log = stream.buffer[0];
12031200
});
12041201

12051202
commonConnectionComponentAssertions();
1206-
it('emits a log without field `reason`', function () {
1207-
expect(log).to.not.have.property('reason');
1203+
it('emits a log with field `reason` prefixed by "Unknown close reason: "', function () {
1204+
expect(log).to.have.property('reason');
1205+
expect(log.reason).to.match(/^Unknown close reason: .*$/);
12081206
});
12091207
});
12101208
});

0 commit comments

Comments
 (0)