Skip to content

Commit 1da8678

Browse files
authored
Fixes issues #42897 - TypeError in _transmit_from_storage: LocalFileBlob.get() returns None but code expects iterable (#42951)
* Fixes issues-42897, return type None handled in _transmit_from_storage * Updated CHANGELOG * Moved CHANGELOG to Bugs Fixed * Trigger CI/CD pipeline
1 parent 92e25ac commit 1da8678

File tree

3 files changed

+36
-4
lines changed

3 files changed

+36
-4
lines changed

sdk/monitor/azure-monitor-opentelemetry-exporter/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
### Breaking Changes
88

99
### Bugs Fixed
10+
- Fixes issues #42897 - TypeError in _transmit_from_storage: LocalFileBlob.get() returns None
11+
([#42897](https://github.com/Azure/azure-sdk-for-python/pull/42951))
1012

1113
### Other Changes
1214

@@ -29,6 +31,9 @@
2931
([#42655](https://github.com/Azure/azure-sdk-for-python/pull/42655))
3032
- Customer Facing SDKStats: Added telemetry_success field to dropped items as per [Spec] - https://github.com/aep-health-and-standards/Telemetry-Collection-Spec/pull/606
3133
([#42846](https://github.com/Azure/azure-sdk-for-python/pull/42846))
34+
### Breaking Changes
35+
36+
### Bugs Fixed
3237
- Customer Facing SDKStats: Refactor to use `Manager` and `Singleton` pattern
3338
([#42969](https://github.com/Azure/azure-sdk-for-python/pull/42969))
3439

sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/_base.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -202,11 +202,16 @@ def _transmit_from_storage(self) -> None:
202202
# give a few more seconds for blob lease operation
203203
# to reduce the chance of race (for perf consideration)
204204
if blob.lease(self._timeout + 5):
205-
envelopes = [_format_storage_telemetry_item(TelemetryItem.from_dict(x)) for x in blob.get()]
206-
result = self._transmit(envelopes)
207-
if result == ExportResult.FAILED_RETRYABLE:
208-
blob.lease(1)
205+
blob_data = blob.get()
206+
if blob_data is not None:
207+
envelopes = [_format_storage_telemetry_item(TelemetryItem.from_dict(x)) for x in blob_data]
208+
result = self._transmit(envelopes)
209+
if result == ExportResult.FAILED_RETRYABLE:
210+
blob.lease(1)
211+
else:
212+
blob.delete()
209213
else:
214+
# If blob.get() returns None, delete the corrupted blob
210215
blob.delete()
211216

212217

sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_base_exporter.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,28 @@ def test_transmit_from_storage_lease_failure(self):
305305
blob_mock.lease.assert_called_once()
306306
blob_mock.delete.assert_not_called()
307307

308+
def test_transmit_from_storage_blob_get_returns_none(self):
309+
"""Test that when blob.get() returns None, it's handled properly without TypeError."""
310+
exporter = BaseExporter()
311+
exporter.storage = mock.Mock()
312+
blob_mock = mock.Mock()
313+
blob_mock.lease.return_value = True
314+
315+
blob_mock.get.return_value = None
316+
exporter.storage.gets.return_value = [blob_mock]
317+
transmit_mock = mock.Mock()
318+
exporter._transmit = transmit_mock
319+
320+
# This should not raise a TypeError
321+
exporter._transmit_from_storage()
322+
323+
# Verify that the blob was leased and deleted (since data was None)
324+
exporter.storage.gets.assert_called_once()
325+
blob_mock.lease.assert_called_once()
326+
blob_mock.get.assert_called_once()
327+
blob_mock.delete.assert_called_once() # Corrupted blob should be deleted
328+
transmit_mock.assert_not_called() # No transmission should occur
329+
308330

309331
def test_format_storage_telemetry_item(self):
310332
time = datetime.now()

0 commit comments

Comments
 (0)