55# --------------------------------------------------------------------------
66import logging
77from typing import Dict , Optional
8- from .._models import VariantAssignmentReason , EvaluationEvent
8+ from .._models import VariantAssignmentReason , EvaluationEvent , TargetingContext
99
1010try :
1111 from azure .monitor .events .extension import track_event as azure_monitor_track_event # type: ignore
12+ from opentelemetry import trace , baggage , context
13+ from opentelemetry .sdk .trace import Span , SpanProcessor
1214
1315 HAS_AZURE_MONITOR_EVENTS_EXTENSION = True
1416except ImportError :
2325VARIANT = "Variant"
2426REASON = "VariantAssignmentReason"
2527
28+ DefaultWhenEnabled = "DefaultWhenEnabled"
29+ VERSION = "Version"
30+ VARIANT_ASSIGNMENT_PERCENTAGE = "VariantAssignmentPercentage"
31+ Microsoft_TargetingId = "Microsoft.TargetingId"
32+ SPAN = "Span"
33+
2634EVENT_NAME = "FeatureEvaluation"
2735
2836EVALUATION_EVENT_VERSION = "1.1.0"
@@ -64,7 +72,7 @@ def publish_telemetry(evaluation_event: EvaluationEvent) -> None:
6472 event : Dict [str , Optional [str ]] = {
6573 FEATURE_NAME : feature .name ,
6674 ENABLED : str (evaluation_event .enabled ),
67- "Version" : EVALUATION_EVENT_VERSION ,
75+ VERSION : EVALUATION_EVENT_VERSION ,
6876 }
6977
7078 reason = evaluation_event .reason
@@ -78,25 +86,34 @@ def publish_telemetry(evaluation_event: EvaluationEvent) -> None:
7886 # VariantAllocationPercentage
7987 allocation_percentage = 0
8088 if reason == VariantAssignmentReason .DEFAULT_WHEN_ENABLED :
81- event ["VariantAssignmentPercentage" ] = str (100 )
89+ event [VARIANT_ASSIGNMENT_PERCENTAGE ] = str (100 )
8290 if feature .allocation :
8391 for allocation in feature .allocation .percentile :
8492 allocation_percentage += allocation .percentile_to - allocation .percentile_from
85- event ["VariantAssignmentPercentage" ] = str (100 - allocation_percentage )
93+ event [VARIANT_ASSIGNMENT_PERCENTAGE ] = str (100 - allocation_percentage )
8694 elif reason == VariantAssignmentReason .PERCENTILE :
8795 if feature .allocation and feature .allocation .percentile :
8896 for allocation in feature .allocation .percentile :
8997 if variant and allocation .variant == variant .name :
9098 allocation_percentage += allocation .percentile_to - allocation .percentile_from
91- event ["VariantAssignmentPercentage" ] = str (allocation_percentage )
99+ event [VARIANT_ASSIGNMENT_PERCENTAGE ] = str (allocation_percentage )
92100
93101 # DefaultWhenEnabled
94102 if feature .allocation and feature .allocation .default_when_enabled :
95- event [" DefaultWhenEnabled" ] = feature .allocation .default_when_enabled
103+ event [DefaultWhenEnabled ] = feature .allocation .default_when_enabled
96104
97105 if feature .telemetry :
98106 for metadata_key , metadata_value in feature .telemetry .metadata .items ():
99107 if metadata_key not in event :
100108 event [metadata_key ] = metadata_value
101109
102110 track_event (EVENT_NAME , evaluation_event .user , event_properties = event )
111+
112+ def attach_targeting_info (targeting_id : str ):
113+ context .attach (baggage .set_baggage (Microsoft_TargetingId , targeting_id ))
114+ trace .get_current_span ().set_attribute (TARGETING_ID , targeting_id )
115+
116+ class TargetingSpanProcessor (SpanProcessor ):
117+ def on_start (self , span : Span , parent_context = None ):
118+ if (baggage .get_baggage (Microsoft_TargetingId , parent_context ) != None ):
119+ span .set_attribute (TARGETING_ID , baggage .get_baggage (Microsoft_TargetingId , parent_context ))
0 commit comments