Skip to content

Commit 229d969

Browse files
authored
Rename "fsspec_upload" entry point and classes to more generic "upload" (#3798)
1 parent 205fd59 commit 229d969

File tree

9 files changed

+47
-56
lines changed

9 files changed

+47
-56
lines changed

docs/instrumentation-genai/util.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ OpenTelemetry Python - GenAI Util
2626
:undoc-members:
2727
:show-inheritance:
2828

29-
.. automodule:: opentelemetry.util.genai._fsspec_upload
29+
.. automodule:: opentelemetry.util.genai._upload
3030
:members:
3131
:show-inheritance:

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1072,7 +1072,7 @@ deps =
10721072
{[testenv]test_deps}
10731073
{toxinidir}/opentelemetry-instrumentation
10741074
{toxinidir}/util/opentelemetry-util-http
1075-
{toxinidir}/util/opentelemetry-util-genai[fsspec]
1075+
{toxinidir}/util/opentelemetry-util-genai[upload]
10761076
{toxinidir}/instrumentation-genai/opentelemetry-instrumentation-vertexai[instruments]
10771077
{toxinidir}/instrumentation-genai/opentelemetry-instrumentation-google-genai[instruments]
10781078
{toxinidir}/instrumentation/opentelemetry-instrumentation-aiokafka[instruments]

util/opentelemetry-util-genai/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
- Add jsonlines support to fsspec uploader
1111
([https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3791](#3791))
12+
- Rename "fsspec_upload" entry point and classes to more generic "upload"
13+
([https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3798](#3798))
1214

1315
## Version 0.1b0 (2025-09-24)
1416

util/opentelemetry-util-genai/pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ dependencies = [
3131
]
3232

3333
[project.entry-points.opentelemetry_genai_completion_hook]
34-
fsspec_upload = "opentelemetry.util.genai._fsspec_upload:fsspec_completion_upload_hook"
34+
upload = "opentelemetry.util.genai._upload:upload_completion_hook"
3535

3636
[project.optional-dependencies]
3737
test = ["pytest>=7.0.0"]
38-
fsspec = ["fsspec>=2025.9.0"]
38+
upload = ["fsspec>=2025.9.0"]
3939

4040
[project.urls]
4141
Homepage = "https://github.com/open-telemetry/opentelemetry-python-contrib/tree/main/util/opentelemetry-util-genai"
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,12 @@
2525
)
2626

2727

28-
def fsspec_completion_upload_hook() -> CompletionHook:
28+
def upload_completion_hook() -> CompletionHook:
2929
# If fsspec is not installed the hook will be a no-op.
3030
try:
3131
# pylint: disable=import-outside-toplevel
32-
from opentelemetry.util.genai._fsspec_upload.completion_hook import (
33-
FsspecUploadCompletionHook,
32+
from opentelemetry.util.genai._upload.completion_hook import (
33+
UploadCompletionHook,
3434
)
3535
except ImportError:
3636
return _NoOpCompletionHook()
@@ -39,4 +39,4 @@ def fsspec_completion_upload_hook() -> CompletionHook:
3939
if not base_path:
4040
return _NoOpCompletionHook()
4141

42-
return FsspecUploadCompletionHook(base_path=base_path)
42+
return UploadCompletionHook(base_path=base_path)
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,17 +83,17 @@ def fsspec_open(urlpath: str, mode: Literal["w"]) -> TextIO:
8383
return cast(TextIO, fsspec.open(urlpath, mode)) # pyright: ignore[reportUnknownMemberType]
8484

8585

86-
class FsspecUploadCompletionHook(CompletionHook):
86+
class UploadCompletionHook(CompletionHook):
8787
"""An completion hook using ``fsspec`` to upload to external storage
8888
8989
This function can be used as the
9090
:func:`~opentelemetry.util.genai.completion_hook.load_completion_hook` implementation by
91-
setting :envvar:`OTEL_INSTRUMENTATION_GENAI_COMPLETION_HOOK` to ``fsspec_upload``.
91+
setting :envvar:`OTEL_INSTRUMENTATION_GENAI_COMPLETION_HOOK` to ``upload``.
9292
:envvar:`OTEL_INSTRUMENTATION_GENAI_UPLOAD_BASE_PATH` must be configured to specify the
9393
base path for uploads.
9494
9595
Both the ``fsspec`` and ``opentelemetry-sdk`` packages should be installed, or a no-op
96-
implementation will be used instead. You can use ``opentelemetry-util-genai[fsspec]``
96+
implementation will be used instead. You can use ``opentelemetry-util-genai[upload]``
9797
as a requirement to achieve this.
9898
"""
9999

@@ -133,15 +133,15 @@ def done(future: Future[None]) -> None:
133133
try:
134134
future.result()
135135
except Exception: # pylint: disable=broad-except
136-
_logger.exception("fsspec uploader failed")
136+
_logger.exception("uploader failed")
137137
finally:
138138
self._semaphore.release()
139139

140140
for path, json_encodeable in upload_data.items():
141141
# could not acquire, drop data
142142
if not self._semaphore.acquire(blocking=False): # pylint: disable=consider-using-with
143143
_logger.warning(
144-
"fsspec upload queue is full, dropping upload %s",
144+
"upload queue is full, dropping upload %s",
145145
path,
146146
)
147147
continue
@@ -153,7 +153,7 @@ def done(future: Future[None]) -> None:
153153
fut.add_done_callback(done)
154154
except RuntimeError:
155155
_logger.info(
156-
"attempting to upload file after FsspecUploadCompletionHook.shutdown() was already called"
156+
"attempting to upload file after UploadCompletionHook.shutdown() was already called"
157157
)
158158
self._semaphore.release()
159159

util/opentelemetry-util-genai/src/opentelemetry/util/genai/environment_variables.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,6 @@
3939
* `Configuration
4040
<https://filesystem-spec.readthedocs.io/en/latest/features.html#configuration>`_ for
4141
configuring a backend with environment variables.
42-
* `URL Chaining
43-
<https://filesystem-spec.readthedocs.io/en/latest/features.html#url-chaining>`_ for advanced
44-
use cases.
4542
"""
4643

4744
OTEL_INSTRUMENTATION_GENAI_UPLOAD_FORMAT = (

util/opentelemetry-util-genai/tests/test_fsspec_upload.py renamed to util/opentelemetry-util-genai/tests/test_upload.py

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@
2828
from opentelemetry._logs import LogRecord
2929
from opentelemetry.test.test_base import TestBase
3030
from opentelemetry.util.genai import types
31-
from opentelemetry.util.genai._fsspec_upload.completion_hook import (
32-
FsspecUploadCompletionHook,
31+
from opentelemetry.util.genai._upload.completion_hook import (
32+
UploadCompletionHook,
3333
)
3434
from opentelemetry.util.genai.completion_hook import (
3535
_NoOpCompletionHook,
@@ -44,28 +44,26 @@
4444
@patch.dict(
4545
"os.environ",
4646
{
47-
"OTEL_INSTRUMENTATION_GENAI_COMPLETION_HOOK": "fsspec_upload",
47+
"OTEL_INSTRUMENTATION_GENAI_COMPLETION_HOOK": "upload",
4848
"OTEL_INSTRUMENTATION_GENAI_UPLOAD_BASE_PATH": BASE_PATH,
4949
},
5050
clear=True,
5151
)
52-
class TestFsspecEntryPoint(TestCase):
53-
def test_fsspec_entry_point(self):
54-
self.assertIsInstance(
55-
load_completion_hook(), FsspecUploadCompletionHook
56-
)
52+
class TestUploadEntryPoint(TestCase):
53+
def test_upload_entry_point(self):
54+
self.assertIsInstance(load_completion_hook(), UploadCompletionHook)
5755

58-
def test_fsspec_entry_point_no_fsspec(self):
56+
def test_upload_entry_point_no_fsspec(self):
5957
"""Tests that the a no-op uploader is used when fsspec is not installed"""
6058

61-
from opentelemetry.util.genai import _fsspec_upload
59+
from opentelemetry.util.genai import _upload
6260

6361
# Simulate fsspec imports failing
6462
with patch.dict(
6563
sys.modules,
66-
{"opentelemetry.util.genai._fsspec_upload.completion_hook": None},
64+
{"opentelemetry.util.genai._upload.completion_hook": None},
6765
):
68-
importlib.reload(_fsspec_upload)
66+
importlib.reload(_upload)
6967
self.assertIsInstance(load_completion_hook(), _NoOpCompletionHook)
7068

7169

@@ -114,15 +112,15 @@ def _increment_mock_call(self, /, *args, **kwargs):
114112
super()._increment_mock_call(*args, **kwargs)
115113

116114

117-
class TestFsspecUploadCompletionHook(TestCase):
115+
class TestUploadCompletionHook(TestCase):
118116
def setUp(self):
119117
self._fsspec_patcher = patch(
120-
"opentelemetry.util.genai._fsspec_upload.completion_hook.fsspec"
118+
"opentelemetry.util.genai._upload.completion_hook.fsspec"
121119
)
122120
self.mock_fsspec = self._fsspec_patcher.start()
123121
self.mock_fsspec.open = ThreadSafeMagicMock()
124122

125-
self.hook = FsspecUploadCompletionHook(
123+
self.hook = UploadCompletionHook(
126124
base_path=BASE_PATH,
127125
max_size=MAXSIZE,
128126
)
@@ -187,7 +185,7 @@ def test_upload_blocked(self):
187185
)
188186

189187
self.assertIn(
190-
"fsspec upload queue is full, dropping upload", logs.output[0]
188+
"upload queue is full, dropping upload", logs.output[0]
191189
)
192190

193191
def test_shutdown_timeout(self):
@@ -212,13 +210,11 @@ def test_failed_upload_logs(self):
212210
)
213211
self.hook.shutdown()
214212

215-
self.assertIn("fsspec uploader failed", logs.output[0])
213+
self.assertIn("uploader failed", logs.output[0])
216214

217215
def test_invalid_upload_format(self):
218216
with self.assertRaisesRegex(ValueError, "Invalid upload_format"):
219-
FsspecUploadCompletionHook(
220-
base_path=BASE_PATH, upload_format="invalid"
221-
)
217+
UploadCompletionHook(base_path=BASE_PATH, upload_format="invalid")
222218

223219
def test_parse_upload_format_envvar(self):
224220
for envvar_value, expect in (
@@ -233,7 +229,7 @@ def test_parse_upload_format_envvar(self):
233229
{"OTEL_INSTRUMENTATION_GENAI_UPLOAD_FORMAT": envvar_value},
234230
clear=True,
235231
):
236-
hook = FsspecUploadCompletionHook(base_path=BASE_PATH)
232+
hook = UploadCompletionHook(base_path=BASE_PATH)
237233
self.addCleanup(hook.shutdown)
238234
self.assertEqual(
239235
hook._format,
@@ -246,7 +242,7 @@ def test_parse_upload_format_envvar(self):
246242
{"OTEL_INSTRUMENTATION_GENAI_UPLOAD_FORMAT": "json"},
247243
clear=True,
248244
):
249-
hook = FsspecUploadCompletionHook(
245+
hook = UploadCompletionHook(
250246
base_path=BASE_PATH, upload_format="jsonl"
251247
)
252248
self.addCleanup(hook.shutdown)
@@ -262,18 +258,18 @@ def test_upload_after_shutdown_logs(self):
262258
)
263259
self.assertEqual(len(logs.output), 3)
264260
self.assertIn(
265-
"attempting to upload file after FsspecUploadCompletionHook.shutdown() was already called",
261+
"attempting to upload file after UploadCompletionHook.shutdown() was already called",
266262
logs.output[0],
267263
)
268264

269265

270-
class TestFsspecUploadCompletionHookIntegration(TestBase):
266+
class TestUploadCompletionHookIntegration(TestBase):
271267
def setUp(self):
272268
super().setUp()
273-
self.hook = FsspecUploadCompletionHook(base_path=BASE_PATH)
269+
self.hook = UploadCompletionHook(base_path=BASE_PATH)
274270

275-
def create_hook(self) -> FsspecUploadCompletionHook:
276-
self.hook = FsspecUploadCompletionHook(base_path=BASE_PATH)
271+
def create_hook(self) -> UploadCompletionHook:
272+
self.hook = UploadCompletionHook(base_path=BASE_PATH)
277273
return self.hook
278274

279275
def tearDown(self):
@@ -365,9 +361,7 @@ def test_upload_bytes(self) -> None:
365361
)
366362

367363
def test_upload_json(self) -> None:
368-
hook = FsspecUploadCompletionHook(
369-
base_path=BASE_PATH, upload_format="json"
370-
)
364+
hook = UploadCompletionHook(base_path=BASE_PATH, upload_format="json")
371365
self.addCleanup(hook.shutdown)
372366
log_record = LogRecord()
373367

@@ -390,9 +384,7 @@ def test_upload_json(self) -> None:
390384
)
391385

392386
def test_upload_jsonlines(self) -> None:
393-
hook = FsspecUploadCompletionHook(
394-
base_path=BASE_PATH, upload_format="jsonl"
395-
)
387+
hook = UploadCompletionHook(base_path=BASE_PATH, upload_format="jsonl")
396388
self.addCleanup(hook.shutdown)
397389
log_record = LogRecord()
398390

uv.lock

Lines changed: 6 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)