2828 SpanProcessor = object # type: ignore
2929
3030
31- _events_logger_initialized = False
31+ _EVENTS_LOGGER_INITIALIZED : list [ bool ] = []
3232
3333def _initialize_event_logger () -> None :
34- global _events_logger_initialized
35- if _events_logger_initialized :
34+ if _EVENTS_LOGGER_INITIALIZED :
3635 return
3736
3837 if not HAS_OPENTELEMETRY_LOGGING :
@@ -43,7 +42,8 @@ def _initialize_event_logger() -> None:
4342
4443 _event_logger .addHandler (LoggingHandler ())
4544 _event_logger .setLevel (INFO )
46- _events_logger_initialized = True
45+ _EVENTS_LOGGER_INITIALIZED .append (True )
46+
4747
4848FEATURE_NAME = "FeatureName"
4949ENABLED = "Enabled"
@@ -80,11 +80,16 @@ def track_event(event_name: str, user: str, event_properties: Optional[Dict[str,
8080 event_properties [TARGETING_ID ] = user
8181
8282 # Azure Monitor exporter maps this attribute to customEvent telemetry name.
83- custom_event_attributes = {
84- ** event_properties ,
85- "microsoft.custom_event.name" : event_name ,
86- }
87- _event_logger .info (event_name , extra = custom_event_attributes )
83+ custom_event_attributes = {** event_properties , "microsoft.custom_event.name" : event_name }
84+
85+ # logging raises KeyError if an `extra` key overwrites a built-in LogRecord attribute (e.g. "name", "message").
86+ reserved = logging .makeLogRecord ({}).__dict__
87+ safe_attributes : Dict [str , Optional [str ]] = {}
88+ for key , value in custom_event_attributes .items ():
89+ safe_key = key if key not in reserved else f"telemetry.{ key } "
90+ safe_attributes [safe_key ] = value
91+
92+ _event_logger .info (event_name , extra = safe_attributes )
8893
8994
9095def publish_telemetry (evaluation_event : EvaluationEvent ) -> None :
0 commit comments