Skip to content

Commit b149c6e

Browse files
authored
Using events API to emit events (#43711)
* Using events API to emit events * Fixing linting issues
1 parent 1234486 commit b149c6e

File tree

1 file changed

+19
-28
lines changed
  • sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_evaluate

1 file changed

+19
-28
lines changed

sdk/evaluation/azure-ai-evaluation/azure/ai/evaluation/_evaluate/_evaluate.py

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,19 +1109,18 @@ def _build_internal_log_attributes(
11091109

11101110

11111111
def _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

Comments
 (0)