@@ -1109,19 +1109,18 @@ def _build_internal_log_attributes(
11091109
11101110
11111111def _log_events_to_app_insights (
1112- otel_logger ,
1112+ event_logger ,
11131113 events : List [Dict [str , Any ]],
11141114 log_attributes : Dict [str , Any ],
11151115 app_insights_config : AppInsightsConfig ,
11161116 data_source_item : Optional [Dict [str , Any ]] = None ,
11171117 evaluator_config : Optional [Dict [str , EvaluatorConfig ]] = None ,
11181118) -> None :
11191119 """
1120- Log independent events directly to App Insights using OpenTelemetry logging.
1121- No spans are created - events are sent as pure log records.
1120+ Log independent events directly to App Insights using OpenTelemetry event logging.
11221121
1123- :param otel_logger : OpenTelemetry logger instance
1124- :type otel_logger: Logger
1122+ :param event_logger : OpenTelemetry event logger instance
1123+ :type event_logger: EventLogger
11251124 :param events: List of event data dictionaries to log
11261125 :type events: List[Dict[str, Any]]
11271126 :param log_attributes: Attributes dict to use for each event (already includes extra_attributes if present)
@@ -1132,8 +1131,7 @@ def _log_events_to_app_insights(
11321131 :type data_source_item: Optional[Dict[str, Any]]
11331132 """
11341133
1135- from opentelemetry import trace
1136- from opentelemetry .trace import SpanContext , TraceFlags , NonRecordingSpan
1134+ from opentelemetry ._events import Event
11371135
11381136 try :
11391137 # Initialize values from AppInsights config as defaults
@@ -1179,6 +1177,7 @@ def _log_events_to_app_insights(
11791177 # The standard attributes are already in https://github.com/open-telemetry/semantic-conventions/blob/main/docs/gen-ai/gen-ai-events.md#event-eventgen_aievaluationresult
11801178 metric_name = event_data .get ("metric" )
11811179 standard_log_attributes = {}
1180+ # This attributes makes evaluation events to go into customEvents table in App Insights
11821181 standard_log_attributes ["microsoft.custom_event.name" ] = EVALUATION_EVENT_NAME
11831182 standard_log_attributes ["gen_ai.evaluation.name" ] = metric_name
11841183 if event_data .get ("score" ) is not None :
@@ -1241,24 +1240,14 @@ def _log_events_to_app_insights(
12411240 # Anonymize IP address to prevent Azure GeoIP enrichment and location tracking
12421241 standard_log_attributes ["http.client_ip" ] = "0.0.0.0"
12431242
1244- # Create context with trace_id and span_id if present (for distributed tracing correlation)
1245- ctx = None
1246- if trace_id :
1247- span_context = SpanContext (
1248- trace_id = trace_id ,
1249- span_id = span_id if span_id else 0 , # Use extracted span_id or 0 if not available
1250- is_remote = False ,
1251- trace_flags = TraceFlags (0x01 ),
1243+ event_logger .emit (
1244+ Event (
1245+ name = EVALUATION_EVENT_NAME ,
1246+ attributes = standard_log_attributes ,
1247+ body = EVALUATION_EVENT_NAME ,
1248+ trace_id = trace_id if trace_id is not None else None ,
1249+ span_id = span_id if span_id is not None else None ,
12521250 )
1253- span = NonRecordingSpan (span_context )
1254- ctx = trace .set_span_in_context (span )
1255-
1256- otel_logger .emit (
1257- timestamp = time .time_ns (),
1258- observed_timestamp = time .time_ns (),
1259- body = EVALUATION_EVENT_NAME ,
1260- attributes = standard_log_attributes ,
1261- context = ctx ,
12621251 )
12631252
12641253 except Exception as e :
@@ -1289,6 +1278,8 @@ def emit_eval_result_events_to_app_insights(
12891278 from opentelemetry .sdk .resources import Resource
12901279 from opentelemetry .semconv .resource import ResourceAttributes
12911280 from azure .monitor .opentelemetry .exporter import AzureMonitorLogExporter
1281+ from opentelemetry ._events import get_event_logger
1282+ from opentelemetry .sdk ._events import EventLoggerProvider
12921283
12931284 if not results :
12941285 LOGGER .debug ("No results to log to App Insights" )
@@ -1316,9 +1307,9 @@ def emit_eval_result_events_to_app_insights(
13161307 # Add the Azure Monitor exporter to the logger provider
13171308 logger_provider .add_log_record_processor (BatchLogRecordProcessor (azure_log_exporter ))
13181309
1319- # Create a logger from OUR configured logger_provider (not the global one)
1320- # This ensures the logger uses our anonymized resource
1321- otel_logger = logger_provider . get_logger (__name__ )
1310+ # Create event logger
1311+ event_provider = EventLoggerProvider ( logger_provider )
1312+ event_logger = get_event_logger (__name__ , event_logger_provider = event_provider )
13221313
13231314 # Initialize base log attributes with extra_attributes if present, otherwise empty dict
13241315 base_log_attributes = app_insights_config .get ("extra_attributes" , {})
@@ -1338,7 +1329,7 @@ def emit_eval_result_events_to_app_insights(
13381329 log_attributes = base_log_attributes .copy ()
13391330
13401331 _log_events_to_app_insights (
1341- otel_logger = otel_logger ,
1332+ event_logger = event_logger ,
13421333 events = result ["results" ],
13431334 log_attributes = log_attributes ,
13441335 data_source_item = result ["datasource_item" ] if "datasource_item" in result else None ,
0 commit comments