diff --git a/packages/devtools-connect/src/connect.ts b/packages/devtools-connect/src/connect.ts index 1c0c0b61..c7724d9a 100644 --- a/packages/devtools-connect/src/connect.ts +++ b/packages/devtools-connect/src/connect.ts @@ -170,9 +170,11 @@ async function resolveMongodbSrv( error, duringLoad: true, resolutionDetails, + durationMs: null, }); } if (resolveDnsHelpers !== undefined) { + const dnsResolutionStart = Date.now(); try { const { wasNativelyLookedUp, @@ -181,6 +183,7 @@ async function resolveMongodbSrv( const resolved = await resolveDnsHelpers.resolve(uri, { dns: { resolveSrv(hostname: string, cb: Parameters[1]) { + const start = Date.now(); resolveSrv( hostname, (...args: Parameters[1]>) => { @@ -189,6 +192,7 @@ async function resolveMongodbSrv( hostname, error: args[0]?.message, wasNativelyLookedUp: wasNativelyLookedUp(args[1]), + durationMs: Date.now() - start, }); cb(...args); } @@ -198,11 +202,13 @@ async function resolveMongodbSrv( resolveTxt( hostname, (...args: Parameters[1]>) => { + const start = Date.now(); resolutionDetails.push({ query: 'TXT', hostname, error: args[0]?.message, wasNativelyLookedUp: wasNativelyLookedUp(args[1]), + durationMs: Date.now() - start, }); cb(...args); } @@ -214,6 +220,7 @@ async function resolveMongodbSrv( from: uri, to: resolved, resolutionDetails, + durationMs: Date.now() - dnsResolutionStart, }); return resolved; } catch (error: any) { @@ -222,6 +229,7 @@ async function resolveMongodbSrv( error, duringLoad: false, resolutionDetails, + durationMs: Date.now() - dnsResolutionStart, }); throw error; } diff --git a/packages/devtools-connect/src/log-hook.spec.ts b/packages/devtools-connect/src/log-hook.spec.ts index 2561573f..d51e3159 100644 --- a/packages/devtools-connect/src/log-hook.spec.ts +++ b/packages/devtools-connect/src/log-hook.spec.ts @@ -55,8 +55,10 @@ describe('Logging setup', function () { hostname: 'hello.world', error: 'failed', wasNativelyLookedUp: false, + durationMs: 1, }, ], + durationMs: 2, }); emitter.emit('devtools-connect:resolve-srv-succeeded', { from: 'mongodb+srv://foo:bar@hello.world/', @@ -67,8 +69,10 @@ describe('Logging setup', function () { hostname: 'hello.world', error: undefined, wasNativelyLookedUp: true, + durationMs: 3, }, ], + durationMs: 4, }); emitter.emit('devtools-connect:missing-optional-dependency', { name: 'kerberos', @@ -169,8 +173,10 @@ describe('Logging setup', function () { error: 'failed', hostname: 'hello.world', wasNativelyLookedUp: false, + durationMs: 1, }, ], + durationMs: 2, }, }, { @@ -189,8 +195,10 @@ describe('Logging setup', function () { error: null, hostname: 'hello.world', wasNativelyLookedUp: true, + durationMs: 3, }, ], + durationMs: 4, }, }, { diff --git a/packages/devtools-connect/src/log-hook.ts b/packages/devtools-connect/src/log-hook.ts index 2b1d67bb..fc229ec3 100644 --- a/packages/devtools-connect/src/log-hook.ts +++ b/packages/devtools-connect/src/log-hook.ts @@ -120,6 +120,7 @@ export function hookLogger( error: ev.error?.message, duringLoad: ev.duringLoad, resolutionDetails: ev.resolutionDetails, + durationMs: ev.durationMs, } ); } @@ -137,6 +138,7 @@ export function hookLogger( from: redactURICredentials(ev.from), to: redactURICredentials(ev.to), resolutionDetails: ev.resolutionDetails, + durationMs: ev.durationMs, } ); } diff --git a/packages/devtools-connect/src/types.ts b/packages/devtools-connect/src/types.ts index acb04cda..bfe167b8 100644 --- a/packages/devtools-connect/src/types.ts +++ b/packages/devtools-connect/src/types.ts @@ -31,6 +31,7 @@ export interface ConnectDnsResolutionDetail { hostname: string; error?: string; wasNativelyLookedUp?: boolean; + durationMs: number; } export interface ConnectResolveSrvErrorEvent { @@ -38,12 +39,14 @@ export interface ConnectResolveSrvErrorEvent { error: Error; duringLoad: boolean; resolutionDetails: ConnectDnsResolutionDetail[]; + durationMs: number | null; } export interface ConnectResolveSrvSucceededEvent { from: string; to: string; resolutionDetails: ConnectDnsResolutionDetail[]; + durationMs: number | null; } export interface ConnectMissingOptionalDependencyEvent {