Skip to content

Commit 8a13737

Browse files
committed
opentelemetry-sdk: avoid recursion error with sdk disabled
If the sdk is disable and our handler is added to the root logger we will recurse in order to log that SDK is disabled. Use the warnings facilities to print the message instead.
1 parent 06809f4 commit 8a13737

File tree

3 files changed

+26
-5
lines changed

3 files changed

+26
-5
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -692,7 +692,7 @@ def get_logger(
692692
attributes: Optional[Attributes] = None,
693693
) -> Logger:
694694
if self._disabled:
695-
_logger.warning("SDK is disabled.")
695+
warnings.warn("SDK is disabled.")
696696
return NoOpLogger(
697697
name,
698698
version=version,

opentelemetry-sdk/tests/logs/test_handler.py

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,12 @@
1111
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
14+
1415
import logging
16+
import os
1517
import unittest
16-
from unittest.mock import Mock
18+
import warnings
19+
from unittest.mock import Mock, patch
1720

1821
from opentelemetry._logs import NoOpLoggerProvider, SeverityNumber
1922
from opentelemetry._logs import get_logger as APIGetLogger
@@ -280,12 +283,25 @@ def test_log_body_is_always_string_with_formatter(self):
280283
log_record = processor.get_log_record(0)
281284
self.assertIsInstance(log_record.body, str)
282285

286+
@patch.dict(os.environ, {"OTEL_SDK_DISABLED": "true"})
287+
def test_handler_with_disabled_sdk_does_not_go_into_recursion_error(self):
288+
processor, logger = set_up_test_logging(
289+
logging.NOTSET, logger_name=None
290+
)
291+
with warnings.catch_warnings(record=True) as cw:
292+
logger.warning("hello")
293+
294+
self.assertEqual(len(cw), 1)
295+
self.assertEqual("SDK is disabled.", str(cw[0].message))
296+
297+
self.assertEqual(processor.emit_count(), 0)
298+
283299

284-
def set_up_test_logging(level, formatter=None):
300+
def set_up_test_logging(level, formatter=None, logger_name="foo"):
285301
logger_provider = LoggerProvider()
286302
processor = FakeProcessor()
287303
logger_provider.add_log_record_processor(processor)
288-
logger = logging.getLogger("foo")
304+
logger = logging.getLogger(logger_name)
289305
handler = LoggingHandler(level=level, logger_provider=logger_provider)
290306
if formatter:
291307
handler.setFormatter(formatter)

opentelemetry-sdk/tests/logs/test_logs.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
# pylint: disable=protected-access
1616

1717
import unittest
18+
import warnings
1819
from unittest.mock import Mock, patch
1920

2021
from opentelemetry.sdk._logs import LoggerProvider
@@ -69,8 +70,12 @@ def test_get_logger(self):
6970

7071
@patch.dict("os.environ", {OTEL_SDK_DISABLED: "true"})
7172
def test_get_logger_with_sdk_disabled(self):
72-
logger = LoggerProvider().get_logger(Mock())
73+
with warnings.catch_warnings(record=True) as cw:
74+
logger = LoggerProvider().get_logger(Mock())
75+
7376
self.assertIsInstance(logger, NoOpLogger)
77+
self.assertEqual(len(cw), 1)
78+
self.assertEqual("SDK is disabled.", str(cw[0].message))
7479

7580
@patch.object(Resource, "create")
7681
def test_logger_provider_init(self, resource_patch):

0 commit comments

Comments
 (0)