|
11 | 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 | 12 | # See the License for the specific language governing permissions and |
13 | 13 | # limitations under the License. |
| 14 | + |
14 | 15 | import logging |
| 16 | +import os |
15 | 17 | import unittest |
16 | | -from unittest.mock import Mock |
| 18 | +import warnings |
| 19 | +from unittest.mock import Mock, patch |
17 | 20 |
|
18 | 21 | from opentelemetry._logs import NoOpLoggerProvider, SeverityNumber |
19 | 22 | from opentelemetry._logs import get_logger as APIGetLogger |
@@ -280,12 +283,27 @@ def test_log_body_is_always_string_with_formatter(self): |
280 | 283 | log_record = processor.get_log_record(0) |
281 | 284 | self.assertIsInstance(log_record.body, str) |
282 | 285 |
|
| 286 | + @patch.dict(os.environ, {"OTEL_SDK_DISABLED": "true"}) |
| 287 | + def test_handler_root_logger_with_disabled_sdk_does_not_go_into_recursion_error( |
| 288 | + self, |
| 289 | + ): |
| 290 | + processor, logger = set_up_test_logging( |
| 291 | + logging.NOTSET, root_logger=True |
| 292 | + ) |
| 293 | + with warnings.catch_warnings(record=True) as cw: |
| 294 | + logger.warning("hello") |
| 295 | + |
| 296 | + self.assertEqual(len(cw), 1) |
| 297 | + self.assertEqual("SDK is disabled.", str(cw[0].message)) |
| 298 | + |
| 299 | + self.assertEqual(processor.emit_count(), 0) |
| 300 | + |
283 | 301 |
|
284 | | -def set_up_test_logging(level, formatter=None): |
| 302 | +def set_up_test_logging(level, formatter=None, root_logger=False): |
285 | 303 | logger_provider = LoggerProvider() |
286 | 304 | processor = FakeProcessor() |
287 | 305 | logger_provider.add_log_record_processor(processor) |
288 | | - logger = logging.getLogger("foo") |
| 306 | + logger = logging.getLogger(None if root_logger else "foo") |
289 | 307 | handler = LoggingHandler(level=level, logger_provider=logger_provider) |
290 | 308 | if formatter: |
291 | 309 | handler.setFormatter(formatter) |
|
0 commit comments