Skip to content

Commit 6d55f90

Browse files
authored
feat: support expeirment key on variant and exposure event (#72)
1 parent 2684ea2 commit 6d55f90

File tree

4 files changed

+49
-11
lines changed

4 files changed

+49
-11
lines changed

packages/experiment-browser/src/experimentClient.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,7 @@ export class ExperimentClient implements Client {
400400
variants[key] = {
401401
value: json[key].key,
402402
payload: json[key].payload,
403+
expKey: json[key].expKey,
403404
};
404405
}
405406
this.debug('[Experiment] Received variants: ', variants);
@@ -518,6 +519,7 @@ export class ExperimentClient implements Client {
518519
this.exposureTrackingProvider?.track({
519520
flag_key: key,
520521
variant: variant.value,
522+
experiment_key: variant.expKey,
521523
});
522524
this.analyticsProvider?.setUserProperty?.(event);
523525
this.analyticsProvider?.track(event);

packages/experiment-browser/src/types/exposure.ts

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,23 @@
11
/**
2-
* Improved exposure event for tracking exposures to Amplitude Experiment.
2+
* Event object for tracking exposures to Amplitude Experiment.
33
*
44
* This object contains all the required information to send an `$exposure`
5-
* event through any SDK or CDP to experiment. The resulting exposure event
6-
* must follow the following definition:
5+
* event through any SDK or CDP to experiment.
6+
*
7+
* The resulting exposure event must follow the following definition:
78
* ```
89
* {
910
* "event_type": "$exposure",
1011
* "event_properties": {
1112
* "flag_key": "<flagKey>",
12-
* "variant": "<variant>"
13+
* "variant": "<variant>",
14+
* "experiment_key": "<expKey>"
1315
* }
1416
* }
1517
* ```
1618
*
17-
* Where `<flagKey>` and `<variant>` are the {@link flag_key} and
18-
* {@link variant} variant` members on this type.
19+
* Where `<flagKey>`, `<variant>`, and `<expKey>` are the {@link flag_key},
20+
* {@link variant}, and {@link experiment_key} variant members on this type:
1921
*
2022
* For example, if you're using Segment for analytics:
2123
*
@@ -24,17 +26,28 @@
2426
* ```
2527
*/
2628
export type Exposure = {
29+
/**
30+
* (Required) The key for the flag the user was exposed to.
31+
*/
2732
flag_key: string;
33+
/**
34+
* (Optional) The variant the user was exposed to. If null or missing, the
35+
* event will not be persisted, and will unset the user property.
36+
*/
2837
variant?: string;
38+
/**
39+
* (Optional) The experiment key used to differentiate between multiple
40+
* experiments associated with the same flag.
41+
*/
42+
experiment_key?: string;
2943
};
3044

3145
/**
3246
* Interface for enabling tracking {@link Exposure}s through the
3347
* {@link ExperimentClient}.
3448
*
3549
* If you're using the Amplitude Analytics SDK for tracking you do not need
36-
* to implement this interface. Simply upgrade your analytics SDK version to
37-
* 2.36.0+ and initialize experiment using the
50+
* to implement this interface. Simply initialize experiment using the
3851
* {@link Experiment.initializeWithAmplitudeAnalytics} function.
3952
*
4053
* If you're using a 3rd party analytics implementation then you'll need to
@@ -46,7 +59,8 @@ export type Exposure = {
4659
* "event_type": "$exposure",
4760
* "event_properties": {
4861
* "flag_key": "<flagKey>",
49-
* "variant": "<variant>"
62+
* "variant": "<variant>",
63+
* "experiment_key": "<expKey>"
5064
* }
5165
* }
5266
* ```
@@ -72,7 +86,8 @@ export interface ExposureTrackingProvider {
7286
* "event_type": "$exposure",
7387
* "event_properties": {
7488
* "flag_key": "<flagKey>",
75-
* "variant": "<variant>"
89+
* "variant": "<variant>",
90+
* "experiment_key": "<expKey>"
7691
* }
7792
* }
7893
* ```

packages/experiment-browser/src/types/variant.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ export type Variant = {
1212
*/
1313
// eslint-disable-next-line @typescript-eslint/no-explicit-any
1414
payload?: any;
15+
16+
/**
17+
* The experiment key. Used to distinguish two experiments associated with the same flag.
18+
*/
19+
expKey?: string;
1520
};
1621

1722
/**

packages/experiment-browser/test/client.test.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { HttpClient, SimpleResponse } from 'src/types/transport';
55
import { ExperimentClient } from '../src/experimentClient';
66
import { ExperimentAnalyticsProvider } from '../src/types/analytics';
77
import { FetchOptions } from '../src/types/client';
8-
import { ExposureTrackingProvider } from '../src/types/exposure';
8+
import { Exposure, ExposureTrackingProvider } from '../src/types/exposure';
99
import { ExperimentUserProvider } from '../src/types/provider';
1010
import { Source } from '../src/types/source';
1111
import { ExperimentUser } from '../src/types/user';
@@ -429,3 +429,19 @@ test('ExperimentClient.fetch with not exist flagKeys in fetch options', async ()
429429
const variant = client.all();
430430
expect(variant).toEqual({});
431431
});
432+
433+
test('ExperimentClient.variant experiment key passed from variant to exposure', async () => {
434+
let didTrack = false;
435+
const client = new ExperimentClient(LOCAL_TEST_API, {
436+
exposureTrackingProvider: {
437+
track: (exposure: Exposure) => {
438+
expect(exposure.experiment_key).toEqual('expKey');
439+
didTrack = true;
440+
},
441+
},
442+
source: Source.InitialVariants,
443+
initialVariants: { flagKey: { value: 'value', expKey: 'expKey' } },
444+
});
445+
client.variant('flagKey');
446+
expect(didTrack).toEqual(true);
447+
});

0 commit comments

Comments
 (0)