Skip to content

Commit a4adc93

Browse files
DylanRussellemdnetoaabmass
authored
Update google-genai instrumentation to use Logs API instead of the deprecated events API (#3625)
* initial commit removing events from genai stuff * Fix function that finds events * Update changelog * Require opentelemetry-api 1.35.0 * Change logger_provider var name to be logger * Fix version requirmenets * Fix changelog * Upgrade dependencies.. * use opentelemetry api 1.37 not .37.0 * Update CHANGELOG.md Co-authored-by: Emídio Neto <[email protected]> * Update CHANGELOG * Fix broken test * Fix changelog * Respond to comments --------- Co-authored-by: Emídio Neto <[email protected]> Co-authored-by: Aaron Abbott <[email protected]>
1 parent e3cb053 commit a4adc93

File tree

10 files changed

+50
-50
lines changed

10 files changed

+50
-50
lines changed

CHANGELOG.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1212
## Unreleased
1313

1414
### Fixed
15-
1615
- `opentelemetry-instrumentation-dbapi`: fix crash retrieving libpq version when enabling commenter with psycopg
1716
([#3796](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3796))
18-
- `opentelemetry-instrumentation-vertexai`: migrate off the deprecated events API to use the logs API
19-
([#3625](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3626))
2017

2118
### Added
2219
- `opentelemetry-instrumentation`: botocore: Add support for AWS Secrets Manager semantic convention attribute
2320
([#3765](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3765))
2421
- Add `rstcheck` to pre-commit to stop introducing invalid RST
2522
([#3777](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3777))
26-
- `opentelemetry-exporter-credential-provider-gcp`: create this package which provides support for supplying your machine's Application Default Credentials (https://cloud.google.com/docs/authentication/application-default-credentials) to the OTLP Exporters created automatically by OpenTelemetry Python's auto instrumentation. These credentials authorize OTLP traces to be sent to `telemetry.googleapis.com`.
27-
[#3766](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3766).
23+
- `opentelemetry-exporter-credential-provider-gcp`: create this package which provides support for supplying your machine's Application Default
24+
Credentials (https://cloud.google.com/docs/authentication/application-default-credentials) to the OTLP Exporters created automatically by OpenTelemetry Python's auto instrumentation. These credentials authorize OTLP traces to be sent to `telemetry.googleapis.com`. [#3766](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3766).
2825

2926
## Version 1.37.0/0.58b0 (2025-09-11)
3027

instrumentation-genai/opentelemetry-instrumentation-google-genai/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ classifiers = [
3737
"Programming Language :: Python :: 3.12"
3838
]
3939
dependencies = [
40-
"opentelemetry-api >=1.31.1, <2",
40+
"opentelemetry-api >=1.37, <2",
4141
"opentelemetry-instrumentation >=0.52b1, <2",
4242
"opentelemetry-semantic-conventions >=0.52b1, <2"
4343
]

instrumentation-genai/opentelemetry-instrumentation-google-genai/src/opentelemetry/instrumentation/google_genai/instrumentor.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
from typing import Any, Collection, Optional
1616

17-
from opentelemetry._events import get_event_logger_provider
17+
from opentelemetry._logs import get_logger_provider
1818
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
1919
from opentelemetry.metrics import get_meter_provider
2020
from opentelemetry.trace import get_tracer_provider
@@ -49,13 +49,13 @@ def _instrument(self, **kwargs: Any):
4949
tracer_provider = (
5050
kwargs.get("tracer_provider") or get_tracer_provider()
5151
)
52-
event_logger_provider = (
53-
kwargs.get("event_logger_provider") or get_event_logger_provider()
52+
logger_provider = (
53+
kwargs.get("logger_provider") or get_logger_provider()
5454
)
5555
meter_provider = kwargs.get("meter_provider") or get_meter_provider()
5656
otel_wrapper = OTelWrapper.from_providers(
5757
tracer_provider=tracer_provider,
58-
event_logger_provider=event_logger_provider,
58+
logger_provider=logger_provider,
5959
meter_provider=meter_provider,
6060
)
6161
self._generate_content_snapshot = instrument_generate_content(

instrumentation-genai/opentelemetry-instrumentation-google-genai/src/opentelemetry/instrumentation/google_genai/otel_wrapper.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
import google.genai
1818

19-
from opentelemetry._events import Event
19+
from opentelemetry._logs import LogRecord
2020
from opentelemetry.semconv._incubating.metrics import gen_ai_metrics
2121
from opentelemetry.semconv.schemas import Schemas
2222

@@ -36,9 +36,9 @@
3636

3737

3838
class OTelWrapper:
39-
def __init__(self, tracer, event_logger, meter):
39+
def __init__(self, tracer, logger, meter):
4040
self._tracer = tracer
41-
self._event_logger = event_logger
41+
self._logger = logger
4242
self._meter = meter
4343
self._operation_duration_metric = (
4444
gen_ai_metrics.create_gen_ai_client_operation_duration(meter)
@@ -48,12 +48,12 @@ def __init__(self, tracer, event_logger, meter):
4848
)
4949

5050
@staticmethod
51-
def from_providers(tracer_provider, event_logger_provider, meter_provider):
51+
def from_providers(tracer_provider, logger_provider, meter_provider):
5252
return OTelWrapper(
5353
tracer_provider.get_tracer(
5454
_SCOPE_NAME, _LIBRARY_VERSION, _SCHEMA_URL, _SCOPE_ATTRIBUTES
5555
),
56-
event_logger_provider.get_event_logger(
56+
logger_provider.get_logger(
5757
_SCOPE_NAME, _LIBRARY_VERSION, _SCHEMA_URL, _SCOPE_ATTRIBUTES
5858
),
5959
meter=meter_provider.get_meter(
@@ -88,5 +88,7 @@ def log_response_content(self, attributes, body):
8888
self._log_event(event_name, attributes, body)
8989

9090
def _log_event(self, event_name, attributes, body):
91-
event = Event(event_name, body=body, attributes=attributes)
92-
self._event_logger.emit(event)
91+
event = LogRecord(
92+
event_name=event_name, body=body, attributes=attributes
93+
)
94+
self._logger.emit(event)

instrumentation-genai/opentelemetry-instrumentation-google-genai/tests/common/otel_mocker.py

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,14 @@
1313
# limitations under the License.
1414

1515

16-
import opentelemetry._events
1716
import opentelemetry._logs._internal
1817
import opentelemetry.metrics._internal
1918
import opentelemetry.trace
20-
from opentelemetry._events import (
21-
get_event_logger_provider,
22-
set_event_logger_provider,
19+
from opentelemetry._logs import (
20+
get_logger_provider,
21+
set_logger_provider,
2322
)
24-
from opentelemetry._logs import get_logger_provider, set_logger_provider
2523
from opentelemetry.metrics import get_meter_provider, set_meter_provider
26-
from opentelemetry.sdk._events import EventLoggerProvider
2724
from opentelemetry.sdk._logs import LoggerProvider
2825
from opentelemetry.sdk._logs.export import (
2926
InMemoryLogExporter,
@@ -43,22 +40,19 @@
4340
def _bypass_otel_once():
4441
opentelemetry.trace._TRACER_PROVIDER_SET_ONCE = Once()
4542
opentelemetry._logs._internal._LOGGER_PROVIDER_SET_ONCE = Once()
46-
opentelemetry._events._EVENT_LOGGER_PROVIDER_SET_ONCE = Once()
4743
opentelemetry.metrics._internal._METER_PROVIDER_SET_ONCE = Once()
4844

4945

5046
class OTelProviderSnapshot:
5147
def __init__(self):
5248
self._tracer_provider = get_tracer_provider()
5349
self._logger_provider = get_logger_provider()
54-
self._event_logger_provider = get_event_logger_provider()
5550
self._meter_provider = get_meter_provider()
5651

5752
def restore(self):
5853
_bypass_otel_once()
5954
set_tracer_provider(self._tracer_provider)
6055
set_logger_provider(self._logger_provider)
61-
set_event_logger_provider(self._event_logger_provider)
6256
set_meter_provider(self._meter_provider)
6357

6458

@@ -82,6 +76,10 @@ def attributes(self):
8276
def body(self):
8377
return self._log_data.log_record.body
8478

79+
@property
80+
def event_name(self):
81+
return self._log_data.log_record.event_name
82+
8583
def __str__(self):
8684
return self._log_data.log_record.to_json()
8785

@@ -175,23 +173,21 @@ def assert_does_not_have_span_named(self, name):
175173
assert span is None, f"Found unexpected span named {name}"
176174

177175
def get_event_named(self, event_name):
178-
for event in self.get_finished_logs():
179-
event_name_attr = event.attributes.get("event.name")
180-
if event_name_attr is None:
181-
continue
182-
if event_name_attr == event_name:
183-
return event
184-
return None
176+
return next(
177+
(
178+
event
179+
for event in self.get_finished_logs()
180+
if event.event_name == event_name
181+
),
182+
None,
183+
)
185184

186185
def get_events_named(self, event_name):
187-
result = []
188-
for event in self.get_finished_logs():
189-
event_name_attr = event.attributes.get("event.name")
190-
if event_name_attr is None:
191-
continue
192-
if event_name_attr == event_name:
193-
result.append(event)
194-
return result
186+
return [
187+
event
188+
for event in self.get_finished_logs()
189+
if event.event_name == event_name
190+
]
195191

196192
def assert_has_event_named(self, name):
197193
event = self.get_event_named(name)
@@ -219,8 +215,6 @@ def _install_logs(self):
219215
provider = LoggerProvider()
220216
provider.add_log_record_processor(SimpleLogRecordProcessor(self._logs))
221217
set_logger_provider(provider)
222-
event_provider = EventLoggerProvider(logger_provider=provider)
223-
set_event_logger_provider(event_provider)
224218

225219
def _install_metrics(self):
226220
provider = MeterProvider(metric_readers=[self._metrics])

instrumentation-genai/opentelemetry-instrumentation-google-genai/tests/requirements.oldest.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ pytest-vcr==1.0.2
2121

2222
google-auth==2.15.0
2323
google-genai==1.0.0
24-
opentelemetry-api==1.31.1
25-
opentelemetry-sdk==1.31.1
26-
opentelemetry-semantic-conventions==0.52b1
27-
opentelemetry-instrumentation==0.52b1
24+
opentelemetry-api==1.37.0
25+
opentelemetry-sdk==1.37.0
26+
opentelemetry-semantic-conventions==0.58b0
27+
opentelemetry-instrumentation==0.58b0
2828

2929
# Install locally from the folder. This path is relative to the
3030
# root directory, given invocation from "tox" at root level.

instrumentation-genai/opentelemetry-instrumentation-google-genai/tests/utils/test_tool_call_wrapper.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818

1919
from google.genai import types as genai_types
2020

21-
from opentelemetry._events import get_event_logger_provider
21+
from opentelemetry._logs import get_logger_provider
2222
from opentelemetry.instrumentation.google_genai import (
2323
otel_wrapper,
2424
tool_call_wrapper,
@@ -35,7 +35,7 @@ def setUp(self):
3535
self._otel.install()
3636
self._otel_wrapper = otel_wrapper.OTelWrapper.from_providers(
3737
get_tracer_provider(),
38-
get_event_logger_provider(),
38+
get_logger_provider(),
3939
get_meter_provider(),
4040
)
4141

instrumentation-genai/opentelemetry-instrumentation-vertexai/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ users will need to set the environment variable OTEL_SEMCONV_STABILITY_OPT_IN to
1414
([#3328](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3328))
1515
- VertexAI support for async calling
1616
([#3386](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3386))
17+
- `opentelemetry-instrumentation-vertexai`: migrate off the deprecated events API to use the logs API
18+
([#3625](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3626))
1719

1820
## Version 2.0b0 (2025-02-24)
1921

util/opentelemetry-util-genai/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1515
([https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3795](#3795))
1616
- Make inputs / outputs / system instructions optional params to `on_completion`,
1717
([https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3802](#3802)).
18+
- `opentelemetry-instrumentation-google-genai`: migrate off the deprecated events API to use the logs API
19+
([#3625](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3624))
20+
1821

1922
## Version 0.1b0 (2025-09-25)
2023

util/opentelemetry-util-genai/tests/test_upload.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import logging
1919
import sys
2020
import threading
21+
import time
2122
from contextlib import contextmanager
2223
from typing import Any
2324
from unittest import TestCase
@@ -155,7 +156,8 @@ def test_upload_then_shutdown(self):
155156
)
156157
# all items should be consumed
157158
self.hook.shutdown()
158-
159+
# TODO: https://github.com/open-telemetry/opentelemetry-python-contrib/issues/3812 fix flaky test that requires sleep.
160+
time.sleep(2)
159161
self.assertEqual(
160162
self.mock_fs.open.call_count,
161163
3,

0 commit comments

Comments
 (0)