Skip to content

Commit 2982253

Browse files
authored
2.0.0 GA (#50)
1 parent 8dc9b0c commit 2982253

File tree

4 files changed

+11
-37
lines changed

4 files changed

+11
-37
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
11
# Release History
22

3+
## 2.0.0 (11/19/2024)
4+
5+
* GA release of Feature Management supporting Feature Variants.
6+
* GA release of Telemetry support.
7+
* `publish_telemetry` sends: feature name, enabled, telemetry version, reason, variant name, targeting id, and additionally provided metadata.
8+
* `publish_telemetry` can be added as a callback when creating `FeatureManager` with `on_feature_evaluated=publish_telemetry`
9+
& `track_event` a custom event logger that adds the targeting id to the event.
10+
311
## 2.0.0b3 (11/14/2024)
412

513
* Fixes a bug where no allocation reason is set if a user is allocated to exactly 100.

featuremanagement/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@
44
# license information.
55
# -------------------------------------------------------------------------
66

7-
VERSION = "2.0.0b3"
7+
VERSION = "2.0.0"

featuremanagement/azuremonitor/_send_telemetry.py

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# --------------------------------------------------------------------------
66
import logging
77
from typing import Dict, Optional
8-
from .._models import VariantAssignmentReason, EvaluationEvent
8+
from .._models import EvaluationEvent
99

1010
try:
1111
from azure.monitor.events.extension import track_event as azure_monitor_track_event # type: ignore
@@ -25,7 +25,7 @@
2525

2626
EVENT_NAME = "FeatureEvaluation"
2727

28-
EVALUATION_EVENT_VERSION = "1.1.0"
28+
EVALUATION_EVENT_VERSION = "1.0.0"
2929

3030

3131
def track_event(event_name: str, user: str, event_properties: Optional[Dict[str, Optional[str]]] = None) -> None:
@@ -75,25 +75,6 @@ def publish_telemetry(evaluation_event: EvaluationEvent) -> None:
7575
if variant:
7676
event[VARIANT] = variant.name
7777

78-
# VariantAllocationPercentage
79-
allocation_percentage = 0
80-
if reason == VariantAssignmentReason.DEFAULT_WHEN_ENABLED:
81-
event["VariantAssignmentPercentage"] = str(100)
82-
if feature.allocation:
83-
for allocation in feature.allocation.percentile:
84-
allocation_percentage += allocation.percentile_to - allocation.percentile_from
85-
event["VariantAssignmentPercentage"] = str(100 - allocation_percentage)
86-
elif reason == VariantAssignmentReason.PERCENTILE:
87-
if feature.allocation and feature.allocation.percentile:
88-
for allocation in feature.allocation.percentile:
89-
if variant and allocation.variant == variant.name:
90-
allocation_percentage += allocation.percentile_to - allocation.percentile_from
91-
event["VariantAssignmentPercentage"] = str(allocation_percentage)
92-
93-
# DefaultWhenEnabled
94-
if feature.allocation and feature.allocation.default_when_enabled:
95-
event["DefaultWhenEnabled"] = feature.allocation.default_when_enabled
96-
9778
if feature.telemetry:
9879
for metadata_key, metadata_value in feature.telemetry.metadata.items():
9980
if metadata_key not in event:

tests/test_send_telemetry_appinsights.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ def test_send_telemetry_appinsights(self):
2222
"ETag": "cmwBRcIAq1jUyKL3Kj8bvf9jtxBrFg-R-ayExStMC90",
2323
"FeatureFlagReference": "fake-store-uri/kv/.appconfig.featureflag/TestFeature",
2424
"FeatureFlagId": "fake-feature-flag-id",
25-
"AllocationId": "fake-allocation-id",
2625
},
2726
},
2827
}
@@ -46,16 +45,12 @@ def test_send_telemetry_appinsights(self):
4645
assert mock_track_event.call_args[0][1]["Enabled"] == "True"
4746
assert mock_track_event.call_args[0][1]["TargetingId"] == "test_user"
4847
assert mock_track_event.call_args[0][1]["Variant"] == "TestVariant"
49-
assert mock_track_event.call_args[0][1]["VariantAssignmentReason"] == "DefaultWhenDisabled"
50-
assert "VariantAssignmentPercentage" not in mock_track_event.call_args[0][1]
5148
assert mock_track_event.call_args[0][1]["ETag"] == "cmwBRcIAq1jUyKL3Kj8bvf9jtxBrFg-R-ayExStMC90"
5249
assert (
5350
mock_track_event.call_args[0][1]["FeatureFlagReference"]
5451
== "fake-store-uri/kv/.appconfig.featureflag/TestFeature"
5552
)
5653
assert mock_track_event.call_args[0][1]["FeatureFlagId"] == "fake-feature-flag-id"
57-
assert mock_track_event.call_args[0][1]["AllocationId"] == "fake-allocation-id"
58-
assert "DefaultWhenEnabled" not in mock_track_event.call_args[0][1]
5954

6055
def test_send_telemetry_appinsights_no_user(self):
6156
feature_flag = FeatureFlag.convert_from_json({"id": "TestFeature"})
@@ -78,8 +73,6 @@ def test_send_telemetry_appinsights_no_user(self):
7873
assert "TargetingId" not in mock_track_event.call_args[0][1]
7974
assert mock_track_event.call_args[0][1]["Variant"] == "TestVariant"
8075
assert mock_track_event.call_args[0][1]["VariantAssignmentReason"] == "DefaultWhenDisabled"
81-
assert "VariantAssignmentPercentage" not in mock_track_event.call_args[0][1]
82-
assert "DefaultWhenEnabled" not in mock_track_event.call_args[0][1]
8376

8477
def test_send_telemetry_appinsights_no_variant(self):
8578
feature_flag = FeatureFlag.convert_from_json({"id": "TestFeature"})
@@ -143,9 +136,6 @@ def test_send_telemetry_appinsights_default_when_enabled(self):
143136
assert mock_track_event.call_args[0][1]["TargetingId"] == "test_user"
144137
assert mock_track_event.call_args[0][1]["Variant"] == "big"
145138
assert mock_track_event.call_args[0][1]["VariantAssignmentReason"] == "DefaultWhenEnabled"
146-
assert mock_track_event.call_args[0][1]["VariantAssignmentPercentage"] == "25"
147-
assert "DefaultWhenEnabled" in mock_track_event.call_args[0][1]
148-
assert mock_track_event.call_args[0][1]["DefaultWhenEnabled"] == "big"
149139

150140
def test_send_telemetry_appinsights_default_when_enabled_no_percentile(self):
151141
feature_flag = FeatureFlag.convert_from_json(
@@ -176,9 +166,6 @@ def test_send_telemetry_appinsights_default_when_enabled_no_percentile(self):
176166
assert mock_track_event.call_args[0][1]["TargetingId"] == "test_user"
177167
assert mock_track_event.call_args[0][1]["Variant"] == "big"
178168
assert mock_track_event.call_args[0][1]["VariantAssignmentReason"] == "DefaultWhenEnabled"
179-
assert mock_track_event.call_args[0][1]["VariantAssignmentPercentage"] == "100"
180-
assert "DefaultWhenEnabled" in mock_track_event.call_args[0][1]
181-
assert mock_track_event.call_args[0][1]["DefaultWhenEnabled"] == "big"
182169

183170
def test_send_telemetry_appinsights_allocation(self):
184171
feature_flag = FeatureFlag.convert_from_json(
@@ -209,5 +196,3 @@ def test_send_telemetry_appinsights_allocation(self):
209196
assert mock_track_event.call_args[0][1]["TargetingId"] == "test_user"
210197
assert mock_track_event.call_args[0][1]["Variant"] == "big"
211198
assert mock_track_event.call_args[0][1]["VariantAssignmentReason"] == "Percentile"
212-
assert mock_track_event.call_args[0][1]["VariantAssignmentPercentage"] == "25"
213-
assert "DefaultWhenEnabled" not in mock_track_event.call_args[0][1]

0 commit comments

Comments
 (0)