From 5e467cd564a824de35d92b7fa4bc5442253a9e7e Mon Sep 17 00:00:00 2001 From: Matt Metcalf Date: Fri, 1 Nov 2024 10:37:53 -0700 Subject: [PATCH 1/3] Fixing no assignment percentage when assignment is None --- .../azuremonitor/_send_telemetry.py | 4 ++- tests/test_send_telemetry_appinsights.py | 35 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/featuremanagement/azuremonitor/_send_telemetry.py b/featuremanagement/azuremonitor/_send_telemetry.py index 8655fd8..b39fbec 100644 --- a/featuremanagement/azuremonitor/_send_telemetry.py +++ b/featuremanagement/azuremonitor/_send_telemetry.py @@ -77,7 +77,9 @@ def publish_telemetry(evaluation_event: EvaluationEvent) -> None: # VariantAllocationPercentage allocation_percentage = 0 - if reason == VariantAssignmentReason.DEFAULT_WHEN_ENABLED and feature.allocation and feature.allocation.percentile: + if reason == VariantAssignmentReason.DEFAULT_WHEN_ENABLED: + event["VariantAssignmentPercentage"] = str(100) + if reason == VariantAssignmentReason.DEFAULT_WHEN_ENABLED and feature.allocation: for allocation in feature.allocation.percentile: allocation_percentage += allocation.percentile_to - allocation.percentile_from event["VariantAssignmentPercentage"] = str(100 - allocation_percentage) diff --git a/tests/test_send_telemetry_appinsights.py b/tests/test_send_telemetry_appinsights.py index 219ebf7..073c55f 100644 --- a/tests/test_send_telemetry_appinsights.py +++ b/tests/test_send_telemetry_appinsights.py @@ -47,6 +47,7 @@ def test_send_telemetry_appinsights(self): assert mock_track_event.call_args[0][1]["TargetingId"] == "test_user" assert mock_track_event.call_args[0][1]["Variant"] == "TestVariant" assert mock_track_event.call_args[0][1]["VariantAssignmentReason"] == "DefaultWhenDisabled" + assert "VariantAssignmentPercentage" not in mock_track_event.call_args[0][1] assert mock_track_event.call_args[0][1]["ETag"] == "cmwBRcIAq1jUyKL3Kj8bvf9jtxBrFg-R-ayExStMC90" assert ( mock_track_event.call_args[0][1]["FeatureFlagReference"] @@ -77,6 +78,7 @@ def test_send_telemetry_appinsights_no_user(self): assert "TargetingId" not in mock_track_event.call_args[0][1] assert mock_track_event.call_args[0][1]["Variant"] == "TestVariant" assert mock_track_event.call_args[0][1]["VariantAssignmentReason"] == "DefaultWhenDisabled" + assert "VariantAssignmentPercentage" not in mock_track_event.call_args[0][1] assert "DefaultWhenEnabled" not in mock_track_event.call_args[0][1] def test_send_telemetry_appinsights_no_variant(self): @@ -145,6 +147,39 @@ def test_send_telemetry_appinsights_default_when_enabled(self): assert "DefaultWhenEnabled" in mock_track_event.call_args[0][1] assert mock_track_event.call_args[0][1]["DefaultWhenEnabled"] == "big" + def test_send_telemetry_appinsights_default_when_enabled_no_percentile(self): + feature_flag = FeatureFlag.convert_from_json( + { + "id": "TestFeature", + "allocation": { + "default_when_enabled": "big", + }, + } + ) + evaluation_event = EvaluationEvent(feature_flag) + variant = Variant("big", None) + evaluation_event.feature = feature_flag + evaluation_event.enabled = True + evaluation_event.user = "test_user" + evaluation_event.variant = variant + evaluation_event.reason = VariantAssignmentReason.DEFAULT_WHEN_ENABLED + + with patch("featuremanagement.azuremonitor._send_telemetry.azure_monitor_track_event") as mock_track_event: + # This is called like this so we can override the track_event function + featuremanagement.azuremonitor._send_telemetry.publish_telemetry( # pylint: disable=protected-access + evaluation_event + ) + mock_track_event.assert_called_once() + assert mock_track_event.call_args[0][0] == "FeatureEvaluation" + assert mock_track_event.call_args[0][1]["FeatureName"] == "TestFeature" + assert mock_track_event.call_args[0][1]["Enabled"] == "True" + assert mock_track_event.call_args[0][1]["TargetingId"] == "test_user" + assert mock_track_event.call_args[0][1]["Variant"] == "big" + assert mock_track_event.call_args[0][1]["VariantAssignmentReason"] == "DefaultWhenEnabled" + assert mock_track_event.call_args[0][1]["VariantAssignmentPercentage"] == "100" + assert "DefaultWhenEnabled" in mock_track_event.call_args[0][1] + assert mock_track_event.call_args[0][1]["DefaultWhenEnabled"] == "big" + def test_send_telemetry_appinsights_allocation(self): feature_flag = FeatureFlag.convert_from_json( { From 2b799e51dca5575ea002a1d46a22d7951dc738bd Mon Sep 17 00:00:00 2001 From: Matt Metcalf Date: Fri, 1 Nov 2024 10:40:06 -0700 Subject: [PATCH 2/3] Update _send_telemetry.py --- featuremanagement/azuremonitor/_send_telemetry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/featuremanagement/azuremonitor/_send_telemetry.py b/featuremanagement/azuremonitor/_send_telemetry.py index b39fbec..3645cc9 100644 --- a/featuremanagement/azuremonitor/_send_telemetry.py +++ b/featuremanagement/azuremonitor/_send_telemetry.py @@ -78,7 +78,7 @@ def publish_telemetry(evaluation_event: EvaluationEvent) -> None: # VariantAllocationPercentage allocation_percentage = 0 if reason == VariantAssignmentReason.DEFAULT_WHEN_ENABLED: - event["VariantAssignmentPercentage"] = str(100) + event["VariantAssignmentPercentage"] = str(100) if reason == VariantAssignmentReason.DEFAULT_WHEN_ENABLED and feature.allocation: for allocation in feature.allocation.percentile: allocation_percentage += allocation.percentile_to - allocation.percentile_from From a00fbd4670c2dadc63d9349b22fe9b74c70fd87e Mon Sep 17 00:00:00 2001 From: Matthew Metcalf Date: Fri, 1 Nov 2024 11:11:02 -0700 Subject: [PATCH 3/3] Update featuremanagement/azuremonitor/_send_telemetry.py Co-authored-by: Ross Grambo --- featuremanagement/azuremonitor/_send_telemetry.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/featuremanagement/azuremonitor/_send_telemetry.py b/featuremanagement/azuremonitor/_send_telemetry.py index 3645cc9..9933d22 100644 --- a/featuremanagement/azuremonitor/_send_telemetry.py +++ b/featuremanagement/azuremonitor/_send_telemetry.py @@ -79,10 +79,10 @@ def publish_telemetry(evaluation_event: EvaluationEvent) -> None: allocation_percentage = 0 if reason == VariantAssignmentReason.DEFAULT_WHEN_ENABLED: event["VariantAssignmentPercentage"] = str(100) - if reason == VariantAssignmentReason.DEFAULT_WHEN_ENABLED and feature.allocation: - for allocation in feature.allocation.percentile: - allocation_percentage += allocation.percentile_to - allocation.percentile_from - event["VariantAssignmentPercentage"] = str(100 - allocation_percentage) + if feature.allocation: + for allocation in feature.allocation.percentile: + allocation_percentage += allocation.percentile_to - allocation.percentile_from + event["VariantAssignmentPercentage"] = str(100 - allocation_percentage) elif reason == VariantAssignmentReason.PERCENTILE: if feature.allocation and feature.allocation.percentile: for allocation in feature.allocation.percentile: