Skip to content

Commit 6794cdf

Browse files
zhukaihanclaude
andauthored
fix: include experiment key on local-eval exposure events (#75)
Local evaluation exposure events emit `metadata.experimentKey` inside the metadata blob but never lift it onto a top-level event property. Custom reports keying off `[Experiment] Experiment Key` therefore see no value for customers using local evaluation. When `variant.metadata['experimentKey']` is present, set `event_properties['[Experiment] Experiment Key']`. Mirrors the equivalent fix in the Node SDK (amplitude/experiment-node-server#83). Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
1 parent 1ff22ad commit 6794cdf

2 files changed

Lines changed: 19 additions & 2 deletions

File tree

src/amplitude_experiment/exposure/exposure_service.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@ def to_exposure_events(exposure: Exposure, ttl_millis: int) -> List[BaseEvent]:
4141
event_properties['[Experiment] Variant'] = variant.key
4242
elif variant.value:
4343
event_properties['[Experiment] Variant'] = variant.value
44+
experiment_key = variant.metadata.get('experimentKey') if variant.metadata is not None else None
45+
if experiment_key:
46+
event_properties['[Experiment] Experiment Key'] = experiment_key
4447
if variant.metadata:
4548
event_properties['metadata'] = variant.metadata
4649

tests/local/exposure/exposure_service_test.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,13 @@ def test_to_exposure_events(self):
5050
})
5151
empty_metadata = Variant(key='on', value='on')
5252
empty_variant = Variant()
53+
with_experiment_key = Variant(key='treatment', value='treatment', metadata={
54+
'segmentName': 'All Other Users',
55+
'flagType': 'experiment',
56+
'flagVersion': 10,
57+
'default': False,
58+
'experimentKey': 'exp-1',
59+
})
5360
results = {
5461
'basic': basic,
5562
'different_value': different_value,
@@ -59,12 +66,13 @@ def test_to_exposure_events(self):
5966
'partial_metadata': partial_metadata,
6067
'empty_metadata': empty_metadata,
6168
'empty_variant': empty_variant,
69+
'with_experiment_key': with_experiment_key,
6270
}
6371
exposure = Exposure(user, results)
6472
events = to_exposure_events(exposure, DAY_MILLIS)
6573
# Should exclude default (default=True) only
66-
# basic, different_value, mutex, holdout, partial_metadata, empty_metadata, empty_variant = 7 events
67-
self.assertEqual(7, len(events))
74+
# basic, different_value, mutex, holdout, partial_metadata, empty_metadata, empty_variant, with_experiment_key = 8 events
75+
self.assertEqual(8, len(events))
6876

6977
# Verify empty_variant is included
7078
empty_variant_events = [e for e in events if e.event_properties.get('[Experiment] Flag Key') == 'empty_variant']
@@ -95,6 +103,12 @@ def test_to_exposure_events(self):
95103
# If variant has no key or value (empty_variant), variant property may not be set
96104
if variant.metadata:
97105
self.assertEqual(variant.metadata, event.event_properties.get('metadata'))
106+
107+
# Validate experiment key is lifted to top-level event property when present
108+
if flag_key == 'with_experiment_key':
109+
self.assertEqual('exp-1', event.event_properties.get('[Experiment] Experiment Key'))
110+
else:
111+
self.assertNotIn('[Experiment] Experiment Key', event.event_properties)
98112

99113
# Validate user properties
100114
user_properties = event.user_properties

0 commit comments

Comments
 (0)