From dab665e4053349c0482f55cb369d21d88c46c7d9 Mon Sep 17 00:00:00 2001 From: Brian Giori Date: Mon, 22 May 2023 13:58:09 -0700 Subject: [PATCH 1/3] feat: support expeirment key on variant and exposure event --- .../src/experimentClient.ts | 1 + .../experiment-browser/src/types/exposure.ts | 29 ++++++++++++++----- .../experiment-browser/src/types/variant.ts | 5 ++++ 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/packages/experiment-browser/src/experimentClient.ts b/packages/experiment-browser/src/experimentClient.ts index 8ffc6338..83c20e07 100644 --- a/packages/experiment-browser/src/experimentClient.ts +++ b/packages/experiment-browser/src/experimentClient.ts @@ -518,6 +518,7 @@ export class ExperimentClient implements Client { this.exposureTrackingProvider?.track({ flag_key: key, variant: variant.value, + experiment_key: variant.expKey, }); this.analyticsProvider?.setUserProperty?.(event); this.analyticsProvider?.track(event); diff --git a/packages/experiment-browser/src/types/exposure.ts b/packages/experiment-browser/src/types/exposure.ts index d9e88dba..8746c9ab 100644 --- a/packages/experiment-browser/src/types/exposure.ts +++ b/packages/experiment-browser/src/types/exposure.ts @@ -1,21 +1,23 @@ /** - * Improved exposure event for tracking exposures to Amplitude Experiment. + * Event object for tracking exposures to Amplitude Experiment. * * This object contains all the required information to send an `$exposure` - * event through any SDK or CDP to experiment. The resulting exposure event - * must follow the following definition: + * event through any SDK or CDP to experiment. + * + * The resulting exposure event must follow the following definition: * ``` * { * "event_type": "$exposure", * "event_properties": { * "flag_key": "", - * "variant": "" + * "variant": "", + * "experiment_key": "", * } * } * ``` * - * Where `` and `` are the {@link flag_key} and - * {@link variant} variant` members on this type. + * Where ``, ``, and `` are the {@link flag_key}, + * {@link variant}, and {@link experiment_key} variant members on this type: * * For example, if you're using Segment for analytics: * @@ -24,8 +26,20 @@ * ``` */ export type Exposure = { + /** + * (Required) The key for the flag the user was exposed to. + */ flag_key: string; + /** + * (Optional) The variant the user was exposed to. If null or missing, the + * event will not be persisted, and will unset the user property. + */ variant?: string; + /** + * (Optional) The experiment key used to differentiate between multiple + * experiments associated with the same flag. + */ + experiment_key?: string; }; /** @@ -72,7 +86,8 @@ export interface ExposureTrackingProvider { * "event_type": "$exposure", * "event_properties": { * "flag_key": "", - * "variant": "" + * "variant": "", + * "experiment_key": "" * } * } * ``` diff --git a/packages/experiment-browser/src/types/variant.ts b/packages/experiment-browser/src/types/variant.ts index c796a98d..654e6f3e 100644 --- a/packages/experiment-browser/src/types/variant.ts +++ b/packages/experiment-browser/src/types/variant.ts @@ -12,6 +12,11 @@ export type Variant = { */ // eslint-disable-next-line @typescript-eslint/no-explicit-any payload?: any; + + /** + * The experiment key. Used to distinguish two experiments associated with the same flag. + */ + expKey?: string; }; /** From 1d19461d3944f00d4cc9b8c0f78437cb55719d08 Mon Sep 17 00:00:00 2001 From: Brian Giori Date: Wed, 24 May 2023 14:50:00 -0700 Subject: [PATCH 2/3] fix: add test --- .../experiment-browser/src/types/exposure.ts | 8 ++++---- .../experiment-browser/test/client.test.ts | 18 +++++++++++++++++- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/packages/experiment-browser/src/types/exposure.ts b/packages/experiment-browser/src/types/exposure.ts index 8746c9ab..168c886b 100644 --- a/packages/experiment-browser/src/types/exposure.ts +++ b/packages/experiment-browser/src/types/exposure.ts @@ -11,7 +11,7 @@ * "event_properties": { * "flag_key": "", * "variant": "", - * "experiment_key": "", + * "experiment_key": "" * } * } * ``` @@ -47,8 +47,7 @@ export type Exposure = { * {@link ExperimentClient}. * * If you're using the Amplitude Analytics SDK for tracking you do not need - * to implement this interface. Simply upgrade your analytics SDK version to - * 2.36.0+ and initialize experiment using the + * to implement this interface. Simply initialize experiment using the * {@link Experiment.initializeWithAmplitudeAnalytics} function. * * If you're using a 3rd party analytics implementation then you'll need to @@ -60,7 +59,8 @@ export type Exposure = { * "event_type": "$exposure", * "event_properties": { * "flag_key": "", - * "variant": "" + * "variant": "", + * "experiment_key": "" * } * } * ``` diff --git a/packages/experiment-browser/test/client.test.ts b/packages/experiment-browser/test/client.test.ts index ac84be32..bb5c8257 100644 --- a/packages/experiment-browser/test/client.test.ts +++ b/packages/experiment-browser/test/client.test.ts @@ -5,7 +5,7 @@ import { HttpClient, SimpleResponse } from 'src/types/transport'; import { ExperimentClient } from '../src/experimentClient'; import { ExperimentAnalyticsProvider } from '../src/types/analytics'; import { FetchOptions } from '../src/types/client'; -import { ExposureTrackingProvider } from '../src/types/exposure'; +import { Exposure, ExposureTrackingProvider } from '../src/types/exposure'; import { ExperimentUserProvider } from '../src/types/provider'; import { Source } from '../src/types/source'; import { ExperimentUser } from '../src/types/user'; @@ -429,3 +429,19 @@ test('ExperimentClient.fetch with not exist flagKeys in fetch options', async () const variant = client.all(); expect(variant).toEqual({}); }); + +test('ExperimentClient.variant experiment key passed from variant to exposure', async () => { + let didTrack = false; + const client = new ExperimentClient(LOCAL_TEST_API, { + exposureTrackingProvider: { + track: (exposure: Exposure) => { + expect(exposure.experiment_key).toEqual('expKey'); + didTrack = true; + }, + }, + source: Source.InitialVariants, + initialVariants: { flagKey: { value: 'value', expKey: 'expKey' } }, + }); + client.variant('flagKey'); + expect(didTrack).toEqual(true); +}); From d890469d0712475f3f2c0b9c611e01cf0d5aebb2 Mon Sep 17 00:00:00 2001 From: Brian Giori Date: Wed, 24 May 2023 17:24:26 -0700 Subject: [PATCH 3/3] fix: parse expkey in client --- packages/experiment-browser/src/experimentClient.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/experiment-browser/src/experimentClient.ts b/packages/experiment-browser/src/experimentClient.ts index 83c20e07..b594b119 100644 --- a/packages/experiment-browser/src/experimentClient.ts +++ b/packages/experiment-browser/src/experimentClient.ts @@ -400,6 +400,7 @@ export class ExperimentClient implements Client { variants[key] = { value: json[key].key, payload: json[key].payload, + expKey: json[key].expKey, }; } this.debug('[Experiment] Received variants: ', variants);