Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion featuremanagement/azuremonitor/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
# Licensed under the MIT License. See License.txt in the project root for
# license information.
# -------------------------------------------------------------------------
from ._send_telemetry import publish_telemetry, track_event
from ._send_telemetry import publish_telemetry, track_event, attach_targeting_info, TargetingSpanProcessor


__all__ = [
"publish_telemetry",
"track_event",
"attach_targeting_info",
"TargetingSpanProcessor",
]
29 changes: 23 additions & 6 deletions featuremanagement/azuremonitor/_send_telemetry.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,12 @@
# --------------------------------------------------------------------------
import logging
from typing import Dict, Optional
from .._models import VariantAssignmentReason, EvaluationEvent
from .._models import VariantAssignmentReason, EvaluationEvent, TargetingContext

try:
from azure.monitor.events.extension import track_event as azure_monitor_track_event # type: ignore
from opentelemetry import trace, baggage, context
from opentelemetry.sdk.trace import Span, SpanProcessor

HAS_AZURE_MONITOR_EVENTS_EXTENSION = True
except ImportError:
Expand All @@ -23,6 +25,12 @@
VARIANT = "Variant"
REASON = "VariantAssignmentReason"

DefaultWhenEnabled = "DefaultWhenEnabled"
VERSION = "Version"
VARIANT_ASSIGNMENT_PERCENTAGE = "VariantAssignmentPercentage"
Microsoft_TargetingId = "Microsoft.TargetingId"
SPAN = "Span"

EVENT_NAME = "FeatureEvaluation"

EVALUATION_EVENT_VERSION = "1.1.0"
Expand Down Expand Up @@ -64,7 +72,7 @@ def publish_telemetry(evaluation_event: EvaluationEvent) -> None:
event: Dict[str, Optional[str]] = {
FEATURE_NAME: feature.name,
ENABLED: str(evaluation_event.enabled),
"Version": EVALUATION_EVENT_VERSION,
VERSION: EVALUATION_EVENT_VERSION,
}

reason = evaluation_event.reason
Expand All @@ -78,25 +86,34 @@ def publish_telemetry(evaluation_event: EvaluationEvent) -> None:
# VariantAllocationPercentage
allocation_percentage = 0
if reason == VariantAssignmentReason.DEFAULT_WHEN_ENABLED:
event["VariantAssignmentPercentage"] = str(100)
event[VARIANT_ASSIGNMENT_PERCENTAGE] = str(100)
if feature.allocation:
for allocation in feature.allocation.percentile:
allocation_percentage += allocation.percentile_to - allocation.percentile_from
event["VariantAssignmentPercentage"] = str(100 - allocation_percentage)
event[VARIANT_ASSIGNMENT_PERCENTAGE] = str(100 - allocation_percentage)
elif reason == VariantAssignmentReason.PERCENTILE:
if feature.allocation and feature.allocation.percentile:
for allocation in feature.allocation.percentile:
if variant and allocation.variant == variant.name:
allocation_percentage += allocation.percentile_to - allocation.percentile_from
event["VariantAssignmentPercentage"] = str(allocation_percentage)
event[VARIANT_ASSIGNMENT_PERCENTAGE] = str(allocation_percentage)

# DefaultWhenEnabled
if feature.allocation and feature.allocation.default_when_enabled:
event["DefaultWhenEnabled"] = feature.allocation.default_when_enabled
event[DefaultWhenEnabled] = feature.allocation.default_when_enabled

if feature.telemetry:
for metadata_key, metadata_value in feature.telemetry.metadata.items():
if metadata_key not in event:
event[metadata_key] = metadata_value

track_event(EVENT_NAME, evaluation_event.user, event_properties=event)

def attach_targeting_info(targeting_id: str):
context.attach(baggage.set_baggage(Microsoft_TargetingId, targeting_id))
trace.get_current_span().set_attribute(TARGETING_ID, targeting_id)

class TargetingSpanProcessor(SpanProcessor):
def on_start(self, span: Span, parent_context = None):
if (baggage.get_baggage(Microsoft_TargetingId, parent_context) != None):
span.set_attribute(TARGETING_ID, baggage.get_baggage(Microsoft_TargetingId, parent_context))
Loading