diff --git a/packages/vercel-flags-core/src/black-box.test.ts b/packages/vercel-flags-core/src/black-box.test.ts index f8ca008a..b4b5b38a 100644 --- a/packages/vercel-flags-core/src/black-box.test.ts +++ b/packages/vercel-flags-core/src/black-box.test.ts @@ -205,6 +205,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 1, + mode: 'build', + revision: '1', + environment: 'test', }, }, ]), @@ -246,6 +249,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 1, + mode: 'build', + revision: '1', + environment: 'test', }, }, ]), @@ -346,6 +352,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 1, + mode: 'stream', + revision: '1', + environment: 'test', }, }, ]), @@ -420,6 +429,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 1, + mode: 'build', + revision: '1', + environment: 'test', }, }, ]), @@ -1189,6 +1201,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 1, + mode: 'offline', + revision: '1', + environment: 'test', }, }, ]), @@ -1265,6 +1280,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 1, + mode: 'offline', + revision: '1', + environment: 'test', }, }, ]), @@ -2126,6 +2144,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 1, + mode: 'stream', + revision: '1', + environment: 'test', }, }, ]), @@ -2497,6 +2518,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 2000, + mode: 'stream', + revision: '1', + environment: 'test', }, }, ]), @@ -3166,6 +3190,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 1, + mode: 'stream', + revision: '1', + environment: 'test', }, }, ]), @@ -3229,6 +3256,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 1, + mode: 'stream', + revision: '1', + environment: 'test', }, }, { @@ -3241,6 +3271,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 1, + mode: 'stream', + revision: '1', + environment: 'test', }, }, { @@ -3253,6 +3286,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 1, + mode: 'stream', + revision: '1', + environment: 'test', }, }, ]), @@ -3405,6 +3441,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 1, + mode: 'offline', + revision: '1', + environment: 'test', }, }, ]), @@ -3624,6 +3663,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 2, + mode: 'build', + revision: '2', + environment: 'test', }, }, ]), @@ -3665,6 +3707,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 1, + mode: 'build', + revision: '1', + environment: 'test', }, }, ]), @@ -3728,6 +3773,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 5, + mode: 'stream', + revision: '1', + environment: 'test', }, }, ]), @@ -3784,6 +3832,9 @@ describe('Controller (black-box)', () => { cacheIsBlocking: false, duration: 0, configUpdatedAt: 2, + mode: 'build', + revision: '2', + environment: 'test', }, }, ]), diff --git a/packages/vercel-flags-core/src/controller/index.ts b/packages/vercel-flags-core/src/controller/index.ts index d0dbe929..ee8bc35c 100644 --- a/packages/vercel-flags-core/src/controller/index.ts +++ b/packages/vercel-flags-core/src/controller/index.ts @@ -784,17 +784,24 @@ export class Controller implements ControllerInterface { : this.state === 'polling' ? 'REFRESHING' : 'NONE'; + const mode = this.mode; const trackOptions: TrackReadOptions = { configOrigin, cacheStatus: cacheHadDefinitions ? 'HIT' : 'MISS', cacheAction, cacheIsBlocking: !cacheHadDefinitions, duration: Date.now() - startTime, + mode: + mode === 'streaming' ? 'stream' : mode === 'polling' ? 'poll' : mode, }; const configUpdatedAt = this.data?.configUpdatedAt; if (typeof configUpdatedAt === 'number') { trackOptions.configUpdatedAt = configUpdatedAt; } + const revision = this.data?.revision; + if (typeof revision === 'number') { + trackOptions.revision = revision; + } if (isFirstRead) { trackOptions.cacheIsFirstRead = true; } diff --git a/packages/vercel-flags-core/src/utils/usage-tracker.ts b/packages/vercel-flags-core/src/utils/usage-tracker.ts index 1d6c5654..63436ec6 100644 --- a/packages/vercel-flags-core/src/utils/usage-tracker.ts +++ b/packages/vercel-flags-core/src/utils/usage-tracker.ts @@ -18,13 +18,16 @@ export interface FlagsConfigReadEvent { region?: string; invocationHost?: string; vercelRequestId?: string; - cacheStatus?: 'HIT' | 'MISS' | 'BYPASS'; + cacheStatus?: 'HIT' | 'MISS' | 'BYPASS' | 'STALE'; cacheAction?: 'REFRESHING' | 'FOLLOWING' | 'NONE'; cacheIsBlocking?: boolean; cacheIsFirstRead?: boolean; duration?: number; configUpdatedAt?: number; - configOrigin?: 'in-memory' | 'embedded'; + configOrigin?: 'in-memory' | 'embedded' | 'poll' | 'stream' | 'constructor'; + mode?: 'poll' | 'stream' | 'build' | 'offline'; + revision?: string; + environment?: string; }; } @@ -91,6 +94,10 @@ export interface TrackReadOptions { duration?: number; /** Timestamp when the config was last updated */ configUpdatedAt?: number; + /** The mode the SDK is operating in */ + mode?: 'poll' | 'stream' | 'build' | 'offline'; + /** Revision of the config */ + revision?: number; } /** @@ -174,6 +181,18 @@ export class UsageTracker { if (options.configUpdatedAt !== undefined) { event.payload.configUpdatedAt = options.configUpdatedAt; } + if (options.mode !== undefined) { + event.payload.mode = options.mode; + } + if (options.revision !== undefined) { + event.payload.revision = String(options.revision); + } + } + + const environment = + process.env.VERCEL_ENV || process.env.NODE_ENV || undefined; + if (environment) { + event.payload.environment = environment; } this.batcher.events.push(event); @@ -266,6 +285,7 @@ export class UsageTracker { debugLog( '@vercel/flags-core: Failed to send events:', response.statusText, + await response.text(), ); this.requeue(eventsToSend); }