Skip to content

Commit 2f80ab2

Browse files
committed
New OTel Integration
1 parent 8dc9b0c commit 2f80ab2

File tree

2 files changed

+26
-7
lines changed

2 files changed

+26
-7
lines changed

featuremanagement/azuremonitor/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
# Licensed under the MIT License. See License.txt in the project root for
44
# license information.
55
# -------------------------------------------------------------------------
6-
from ._send_telemetry import publish_telemetry, track_event
6+
from ._send_telemetry import publish_telemetry, track_event, attach_targeting_info, TargetingSpanProcessor
77

88

99
__all__ = [
1010
"publish_telemetry",
1111
"track_event",
12+
"attach_targeting_info",
13+
"TargetingSpanProcessor",
1214
]

featuremanagement/azuremonitor/_send_telemetry.py

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

1010
try:
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
1416
except ImportError:
@@ -23,6 +25,12 @@
2325
VARIANT = "Variant"
2426
REASON = "VariantAssignmentReason"
2527

28+
DefaultWhenEnabled = "DefaultWhenEnabled"
29+
VERSION = "Version"
30+
VARIANT_ASSIGNMENT_PERCENTAGE = "VariantAssignmentPercentage"
31+
Microsoft_TargetingId = "Microsoft.TargetingId"
32+
SPAN = "Span"
33+
2634
EVENT_NAME = "FeatureEvaluation"
2735

2836
EVALUATION_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

Comments
 (0)