Skip to content

Commit f491545

Browse files
committed
Initial commit to replace deprecated events API/
SDK with logs.
1 parent c4347e0 commit f491545

File tree

8 files changed

+54
-55
lines changed

8 files changed

+54
-55
lines changed

instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/__init__.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def response_hook(span, service_name, operation_name, result):
8888
from botocore.exceptions import ClientError
8989
from wrapt import wrap_function_wrapper
9090

91-
from opentelemetry._events import get_event_logger
91+
from opentelemetry._logs import get_logger
9292
from opentelemetry.instrumentation.botocore.extensions import (
9393
_find_extension,
9494
_has_extension,
@@ -139,8 +139,8 @@ def _instrument(self, **kwargs):
139139

140140
# tracers are lazy initialized per-extension in _get_tracer
141141
self._tracers = {}
142-
# event_loggers are lazy initialized per-extension in _get_event_logger
143-
self._event_loggers = {}
142+
# loggers are lazy initialized per-extension in _get_logger
143+
self._loggers = {}
144144
# meters are lazy initialized per-extension in _get_meter
145145
self._meters = {}
146146
# metrics are lazy initialized per-extension in _get_metrics
@@ -154,7 +154,7 @@ def _instrument(self, **kwargs):
154154
self.propagator = propagator
155155

156156
self.tracer_provider = kwargs.get("tracer_provider")
157-
self.event_logger_provider = kwargs.get("event_logger_provider")
157+
self.logger_provider = kwargs.get("logger_provider")
158158
self.meter_provider = kwargs.get("meter_provider")
159159

160160
wrap_function_wrapper(
@@ -195,23 +195,23 @@ def _get_tracer(self, extension: _AwsSdkExtension):
195195
)
196196
return self._tracers[instrumentation_name]
197197

198-
def _get_event_logger(self, extension: _AwsSdkExtension):
199-
"""This is a multiplexer in order to have an event logger per extension"""
198+
def _get_logger(self, extension: _AwsSdkExtension):
199+
"""This is a multiplexer in order to have a logger per extension"""
200200

201201
instrumentation_name = self._get_instrumentation_name(extension)
202-
event_logger = self._event_loggers.get(instrumentation_name)
203-
if event_logger:
204-
return event_logger
202+
logger = self._loggers.get(instrumentation_name)
203+
if logger:
204+
return logger
205205

206206
schema_version = extension.event_logger_schema_version()
207-
self._event_loggers[instrumentation_name] = get_event_logger(
207+
self._loggers[instrumentation_name] = get_logger(
208208
instrumentation_name,
209209
"",
210210
schema_url=f"https://opentelemetry.io/schemas/{schema_version}",
211-
event_logger_provider=self.event_logger_provider,
211+
logger_provider=self.logger_provider,
212212
)
213213

214-
return self._event_loggers[instrumentation_name]
214+
return self._loggers[instrumentation_name]
215215

216216
def _get_meter(self, extension: _AwsSdkExtension):
217217
"""This is a multiplexer in order to have a meter per extension"""
@@ -287,11 +287,11 @@ def _patched_api_call(self, original_func, instance, args, kwargs):
287287
end_span_on_exit = extension.should_end_span_on_exit()
288288

289289
tracer = self._get_tracer(extension)
290-
event_logger = self._get_event_logger(extension)
290+
logger = self._get_logger(extension)
291291
meter = self._get_meter(extension)
292292
metrics = self._get_metrics(extension, meter)
293293
instrumentor_ctx = _BotocoreInstrumentorContext(
294-
event_logger=event_logger,
294+
logger=logger,
295295
metrics=metrics,
296296
)
297297
with tracer.start_as_current_span(

instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/extensions/bedrock.py

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -457,9 +457,9 @@ def before_service_call(
457457

458458
messages = self._get_request_messages()
459459
for message in messages:
460-
event_logger = instrumentor_context.event_logger
460+
logger = instrumentor_context.logger
461461
for event in message_to_event(message, capture_content):
462-
event_logger.emit(event)
462+
logger.emit(event)
463463

464464
if span.is_recording():
465465
operation_name = span.attributes.get(GEN_AI_OPERATION_NAME, "")
@@ -501,12 +501,12 @@ def _converse_on_success(
501501

502502
# In case of an early stream closure, the result may not contain outputs
503503
if self._stream_has_output_content(result):
504-
event_logger = instrumentor_context.event_logger
504+
logger = instrumentor_context.logger
505505
choice = _Choice.from_converse(result, capture_content)
506506
# this path is used by streaming apis, in that case we are already out of the span
507507
# context so need to add the span context manually
508508
span_ctx = span.get_span_context()
509-
event_logger.emit(
509+
logger.emit(
510510
choice.to_choice_event(
511511
trace_id=span_ctx.trace_id,
512512
span_id=span_ctx.span_id,
@@ -729,11 +729,11 @@ def _handle_amazon_titan_response(
729729
[result["completionReason"]],
730730
)
731731

732-
event_logger = instrumentor_context.event_logger
732+
logger = instrumentor_context.logger
733733
choice = _Choice.from_invoke_amazon_titan(
734734
response_body, capture_content
735735
)
736-
event_logger.emit(choice.to_choice_event())
736+
logger.emit(choice.to_choice_event())
737737

738738
metrics = instrumentor_context.metrics
739739
metrics_attributes = self._extract_metrics_attributes()
@@ -791,9 +791,9 @@ def _handle_amazon_nova_response(
791791

792792
# In case of an early stream closure, the result may not contain outputs
793793
if self._stream_has_output_content(response_body):
794-
event_logger = instrumentor_context.event_logger
794+
logger = instrumentor_context.logger
795795
choice = _Choice.from_converse(response_body, capture_content)
796-
event_logger.emit(choice.to_choice_event())
796+
logger.emit(choice.to_choice_event())
797797

798798
metrics = instrumentor_context.metrics
799799
metrics_attributes = self._extract_metrics_attributes()
@@ -848,11 +848,11 @@ def _handle_anthropic_claude_response(
848848
GEN_AI_RESPONSE_FINISH_REASONS, [response_body["stop_reason"]]
849849
)
850850

851-
event_logger = instrumentor_context.event_logger
851+
logger = instrumentor_context.logger
852852
choice = _Choice.from_invoke_anthropic_claude(
853853
response_body, capture_content
854854
)
855-
event_logger.emit(choice.to_choice_event())
855+
logger.emit(choice.to_choice_event())
856856

857857
metrics = instrumentor_context.metrics
858858
metrics_attributes = self._extract_metrics_attributes()
@@ -903,11 +903,11 @@ def _handle_cohere_command_r_response(
903903
[response_body["finish_reason"]],
904904
)
905905

906-
event_logger = instrumentor_context.event_logger
906+
logger = instrumentor_context.logger
907907
choice = _Choice.from_invoke_cohere_command_r(
908908
response_body, capture_content
909909
)
910-
event_logger.emit(choice.to_choice_event())
910+
logger.emit(choice.to_choice_event())
911911

912912
def _handle_cohere_command_response(
913913
self,
@@ -929,11 +929,11 @@ def _handle_cohere_command_response(
929929
[generations["finish_reason"]],
930930
)
931931

932-
event_logger = instrumentor_context.event_logger
932+
logger = instrumentor_context.logger
933933
choice = _Choice.from_invoke_cohere_command(
934934
response_body, capture_content
935935
)
936-
event_logger.emit(choice.to_choice_event())
936+
logger.emit(choice.to_choice_event())
937937

938938
def _handle_meta_llama_response(
939939
self,
@@ -956,9 +956,9 @@ def _handle_meta_llama_response(
956956
GEN_AI_RESPONSE_FINISH_REASONS, [response_body["stop_reason"]]
957957
)
958958

959-
event_logger = instrumentor_context.event_logger
959+
logger = instrumentor_context.logger
960960
choice = _Choice.from_invoke_meta_llama(response_body, capture_content)
961-
event_logger.emit(choice.to_choice_event())
961+
logger.emit(choice.to_choice_event())
962962

963963
def _handle_mistral_ai_response(
964964
self,
@@ -979,11 +979,11 @@ def _handle_mistral_ai_response(
979979
GEN_AI_RESPONSE_FINISH_REASONS, [outputs["stop_reason"]]
980980
)
981981

982-
event_logger = instrumentor_context.event_logger
982+
logger = instrumentor_context.logger
983983
choice = _Choice.from_invoke_mistral_mistral(
984984
response_body, capture_content
985985
)
986-
event_logger.emit(choice.to_choice_event())
986+
logger.emit(choice.to_choice_event())
987987

988988
def on_error(
989989
self,

instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/extensions/bedrock_utils.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from botocore.eventstream import EventStream, EventStreamError
2323
from wrapt import ObjectProxy
2424

25-
from opentelemetry._events import Event
25+
from opentelemetry._logs import LogRecord
2626
from opentelemetry.instrumentation.botocore.environment_variables import (
2727
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT,
2828
)
@@ -492,7 +492,7 @@ def extract_tool_results(
492492

493493
def message_to_event(
494494
message: dict[str, Any], capture_content: bool
495-
) -> Iterator[Event]:
495+
) -> Iterator[LogRecord]:
496496
attributes = {GEN_AI_SYSTEM: GenAiSystemValues.AWS_BEDROCK.value}
497497
role = message.get("role")
498498
content = message.get("content")
@@ -507,14 +507,14 @@ def message_to_event(
507507
elif role == "user":
508508
# in case of tool calls we send one tool event for tool call and one for the user event
509509
for tool_body in extract_tool_results(message, capture_content):
510-
yield Event(
511-
name="gen_ai.tool.message",
510+
yield LogRecord(
511+
event_name="gen_ai.tool.message",
512512
attributes=attributes,
513513
body=tool_body,
514514
)
515515

516-
yield Event(
517-
name=f"gen_ai.{role}.message",
516+
yield LogRecord(
517+
event_name=f"gen_ai.{role}.message",
518518
attributes=attributes,
519519
body=body if body else None,
520520
)
@@ -617,9 +617,9 @@ def _to_body_dict(self) -> dict[str, Any]:
617617
"message": self.message,
618618
}
619619

620-
def to_choice_event(self, **event_kwargs) -> Event:
620+
def to_choice_event(self, **event_kwargs) -> LogRecord:
621621
attributes = {GEN_AI_SYSTEM: GenAiSystemValues.AWS_BEDROCK.value}
622-
return Event(
622+
return LogRecord(
623623
name="gen_ai.choice",
624624
attributes=attributes,
625625
body=self._to_body_dict(),

instrumentation/opentelemetry-instrumentation-botocore/src/opentelemetry/instrumentation/botocore/extensions/types.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import logging
1818
from typing import Any, Dict, Optional, Tuple
1919

20-
from opentelemetry._events import EventLogger
20+
from opentelemetry._logs import Logger
2121
from opentelemetry.metrics import Instrument, Meter
2222
from opentelemetry.trace import SpanKind
2323
from opentelemetry.trace.span import Span
@@ -96,10 +96,10 @@ def _get_attr(obj, name: str, default=None):
9696
class _BotocoreInstrumentorContext:
9797
def __init__(
9898
self,
99-
event_logger: EventLogger,
99+
logger: Logger,
100100
metrics: Dict[str, Instrument] | None = None,
101101
):
102-
self.event_logger = event_logger
102+
self.logger = logger
103103
self.metrics = metrics or {}
104104

105105

instrumentation/opentelemetry-instrumentation-botocore/tests/bedrock_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ def assert_log_parent(log, span):
292292
def assert_message_in_logs(log, event_name, expected_content, parent_span):
293293
assert (
294294
log.log_record.attributes[EventAttributes.EVENT_NAME] == event_name
295-
), log.log_record.attributes[EventAttributes.EVENT_NAME]
295+
)
296296
assert (
297297
log.log_record.attributes[GenAIAttributes.GEN_AI_SYSTEM]
298298
== GenAIAttributes.GenAiSystemValues.AWS_BEDROCK.value

instrumentation/opentelemetry-instrumentation-botocore/tests/conftest.py

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
from opentelemetry.instrumentation.botocore.environment_variables import (
1212
OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT,
1313
)
14-
from opentelemetry.sdk._events import EventLoggerProvider
1514
from opentelemetry.sdk._logs import LoggerProvider
1615
from opentelemetry.sdk._logs.export import (
1716
InMemoryLogExporter,
@@ -55,13 +54,12 @@ def fixture_tracer_provider(span_exporter):
5554
return provider
5655

5756

58-
@pytest.fixture(scope="function", name="event_logger_provider")
59-
def fixture_event_logger_provider(log_exporter):
57+
@pytest.fixture(scope="function", name="logger_provider")
58+
def fixture_logger_provider(log_exporter):
6059
provider = LoggerProvider()
6160
provider.add_log_record_processor(SimpleLogRecordProcessor(log_exporter))
62-
event_logger_provider = EventLoggerProvider(provider)
6361

64-
return event_logger_provider
62+
return provider
6563

6664

6765
@pytest.fixture(scope="function", name="meter_provider")
@@ -103,7 +101,7 @@ def vcr_config():
103101

104102
@pytest.fixture(scope="function")
105103
def instrument_no_content(
106-
tracer_provider, event_logger_provider, meter_provider
104+
tracer_provider, logger_provider, meter_provider
107105
):
108106
os.environ.update(
109107
{OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT: "False"}
@@ -112,7 +110,7 @@ def instrument_no_content(
112110
instrumentor = BotocoreInstrumentor()
113111
instrumentor.instrument(
114112
tracer_provider=tracer_provider,
115-
event_logger_provider=event_logger_provider,
113+
logger_provider=logger_provider,
116114
meter_provider=meter_provider,
117115
)
118116

@@ -123,15 +121,15 @@ def instrument_no_content(
123121

124122
@pytest.fixture(scope="function")
125123
def instrument_with_content(
126-
tracer_provider, event_logger_provider, meter_provider
124+
tracer_provider, logger_provider, meter_provider
127125
):
128126
os.environ.update(
129127
{OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT: "True"}
130128
)
131129
instrumentor = BotocoreInstrumentor()
132130
instrumentor.instrument(
133131
tracer_provider=tracer_provider,
134-
event_logger_provider=event_logger_provider,
132+
logger_provider=logger_provider,
135133
meter_provider=meter_provider,
136134
)
137135

instrumentation/opentelemetry-instrumentation-botocore/tests/test_botocore_bedrock.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2943,6 +2943,7 @@ def test_invoke_model_with_response_stream_handles_stream_error(
29432943
logs = log_exporter.get_finished_logs()
29442944
assert len(logs) == 1
29452945
user_content = {"content": [{"text": "Say this is a test"}]}
2946+
print(logs[0].log_record)
29462947
assert_message_in_logs(logs[0], "gen_ai.user.message", user_content, span)
29472948

29482949

instrumentation/opentelemetry-instrumentation-botocore/tests/test_botocore_dynamodb.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ def assert_extension_item_col_metrics(self, operation: str):
183183
extension.on_success(
184184
span,
185185
{"ItemCollectionMetrics": {"ItemCollectionKey": {"id": "1"}}},
186-
_BotocoreInstrumentorContext(event_logger=mock.Mock()),
186+
_BotocoreInstrumentorContext(logger=mock.Mock()),
187187
)
188188
self.assert_item_col_metrics(span)
189189

@@ -295,7 +295,7 @@ def test_delete_item_consumed_capacity(self):
295295
extension.on_success(
296296
span,
297297
{"ConsumedCapacity": {"TableName": "table"}},
298-
_BotocoreInstrumentorContext(event_logger=mock.Mock()),
298+
_BotocoreInstrumentorContext(logger=mock.Mock()),
299299
)
300300
self.assert_consumed_capacity(span, "table")
301301

0 commit comments

Comments
 (0)