Skip to content

Commit 2ef08f8

Browse files
committed
Initial commit
1 parent ed008b7 commit 2ef08f8

File tree

5 files changed

+31
-5
lines changed

5 files changed

+31
-5
lines changed

opentelemetry-api/test-requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,5 @@ wrapt==1.16.0
1212
zipp==3.20.2
1313
-e opentelemetry-sdk
1414
-e opentelemetry-semantic-conventions
15-
-e tests/opentelemetry-test-utils
1615
-e opentelemetry-api
16+
-e tests/opentelemetry-test-utils

opentelemetry-sdk/src/opentelemetry/sdk/_logs/_internal/export/__init__.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import enum
1818
import logging
1919
import sys
20+
import traceback
2021
from os import environ, linesep
2122
from typing import IO, Callable, Optional, Sequence
2223

@@ -118,6 +119,9 @@ def __init__(self, exporter: LogExporter):
118119
self._shutdown = False
119120

120121
def on_emit(self, log_data: LogData):
122+
# Prevent entering recursive loop.
123+
if any(item[2] == "on_emit" for item in traceback.extract_stack()):
124+
return
121125
if self._shutdown:
122126
_logger.warning("Processor is already shutdown, ignoring call")
123127
return

opentelemetry-sdk/src/opentelemetry/sdk/_shared_internal/__init__.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,10 @@ def shutdown(self):
8181
raise NotImplementedError
8282

8383

84+
_logger = logging.getLogger(__name__)
85+
_logger.addFilter(DuplicateFilter())
86+
87+
8488
class BatchProcessor(Generic[Telemetry]):
8589
"""This class can be used with exporter's that implement the above
8690
Exporter interface to buffer and send telemetry in batch through
@@ -111,8 +115,6 @@ def __init__(
111115
target=self.worker,
112116
daemon=True,
113117
)
114-
self._logger = logging.getLogger(__name__)
115-
self._logger.addFilter(DuplicateFilter())
116118
self._exporting = exporting
117119

118120
self._shutdown = False
@@ -189,7 +191,7 @@ def _export(self, batch_strategy: BatchExportStrategy) -> None:
189191
]
190192
)
191193
except Exception: # pylint: disable=broad-exception-caught
192-
self._logger.exception(
194+
_logger.exception(
193195
"Exception while exporting %s.", self._exporting
194196
)
195197
detach(token)

opentelemetry-sdk/test-requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ tomli==2.0.1
1111
typing_extensions==4.10.0
1212
wrapt==1.16.0
1313
zipp==3.19.2
14-
-e tests/opentelemetry-test-utils
1514
-e opentelemetry-api
15+
-e tests/opentelemetry-test-utils
1616
-e opentelemetry-semantic-conventions
1717
-e opentelemetry-sdk

opentelemetry-sdk/tests/logs/test_export.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import unittest
2020
from concurrent.futures import ThreadPoolExecutor
2121
from sys import version_info
22+
from typing import Sequence
2223
from unittest.mock import Mock, patch
2324

2425
from pytest import mark
@@ -36,6 +37,7 @@
3637
BatchLogRecordProcessor,
3738
ConsoleLogExporter,
3839
InMemoryLogExporter,
40+
LogExporter,
3941
SimpleLogRecordProcessor,
4042
)
4143
from opentelemetry.sdk.environment_variables import (
@@ -61,6 +63,24 @@
6163

6264

6365
class TestSimpleLogRecordProcessor(unittest.TestCase):
66+
def test_simple_log_record_processor_doesnt_enter_recursive_loop(self):
67+
class Exporter(LogExporter):
68+
def shutdown(self):
69+
pass
70+
71+
def export(self, batch: Sequence[LogData]):
72+
raise ValueError("Exception raised !")
73+
74+
exporter = Exporter()
75+
logger_provider = LoggerProvider()
76+
logger_provider.add_log_record_processor(
77+
SimpleLogRecordProcessor(exporter)
78+
)
79+
logger = logging.getLogger("default_level")
80+
logger.addHandler(LoggingHandler(logger_provider=logger_provider))
81+
# This would cause a max recursion depth exceeded error..
82+
logger.warning("Something is wrong")
83+
6484
def test_simple_log_record_processor_default_level(self):
6585
exporter = InMemoryLogExporter()
6686
logger_provider = LoggerProvider()

0 commit comments

Comments
 (0)