Skip to content

Commit 980dbe7

Browse files
initial commit
1 parent 6e4880d commit 980dbe7

3 files changed

Lines changed: 53 additions & 93 deletions

File tree

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

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,11 @@
5252
OTEL_EXPORTER_OTLP_METRICS_PROTOCOL,
5353
OTEL_EXPORTER_OTLP_PROTOCOL,
5454
OTEL_EXPORTER_OTLP_TRACES_PROTOCOL,
55-
OTEL_PYTHON_TRACER_CONFIGURATOR,
5655
OTEL_PYTHON_LOG_FORMAT,
57-
OTEL_PYTHON_LOG_LEVEL,
56+
OTEL_PYTHON_LOG_HANDLER_LEVEL,
57+
OTEL_PYTHON_TRACER_CONFIGURATOR,
5858
OTEL_TRACES_SAMPLER,
5959
OTEL_TRACES_SAMPLER_ARG,
60-
OTEL_PYTHON_LOG_LEVEL,
61-
OTEL_PYTHON_LOG_FORMAT,
6260
)
6361
from opentelemetry.sdk.metrics import MeterProvider
6462
from opentelemetry.sdk.metrics.export import (
@@ -105,7 +103,7 @@
105103

106104
_OTEL_SAMPLER_ENTRY_POINT_GROUP = "opentelemetry_traces_sampler"
107105

108-
_OTEL_PYTHON_LOG_LEVEL_BY_NAME = {
106+
_OTEL_PYTHON_LOG_HANDLER_LEVEL_BY_NAME = {
109107
"notset": logging.NOTSET,
110108
"debug": logging.DEBUG,
111109
"info": logging.INFO,
@@ -179,17 +177,18 @@ def _get_sampler() -> str | None:
179177
def _get_id_generator() -> str:
180178
return environ.get(OTEL_PYTHON_ID_GENERATOR, _DEFAULT_ID_GENERATOR)
181179

180+
182181
def _get_log_level() -> int:
183-
return _OTEL_PYTHON_LOG_LEVEL_BY_NAME.get(
184-
environ.get(OTEL_PYTHON_LOG_LEVEL, "notset").lower().strip(),
182+
return _OTEL_PYTHON_LOG_HANDLER_LEVEL_BY_NAME.get(
183+
environ.get(OTEL_PYTHON_LOG_HANDLER_LEVEL, "notset").lower().strip(),
185184
logging.NOTSET,
186185
)
187186

187+
188188
def _get_tracer_configurator() -> str | None:
189189
return environ.get(OTEL_PYTHON_TRACER_CONFIGURATOR, None)
190190

191191

192-
193192
def _get_exporter_entry_point(
194193
exporter_name: str, signal_type: Literal["traces", "metrics", "logs"]
195194
):
@@ -350,11 +349,13 @@ def _init_logging(
350349
level=logging.NOTSET, logger_provider=provider
351350
)
352351
# Log level
353-
if OTEL_PYTHON_LOG_LEVEL in environ:
352+
if OTEL_PYTHON_LOG_HANDLER_LEVEL in environ:
354353
handler.setLevel(_get_log_level())
355354
# Log format
356355
if OTEL_PYTHON_LOG_FORMAT in environ:
357-
log_format = environ.get(OTEL_PYTHON_LOG_FORMAT, logging.BASIC_FORMAT)
356+
log_format = environ.get(
357+
OTEL_PYTHON_LOG_FORMAT, logging.BASIC_FORMAT
358+
)
358359
handler.setFormatter(logging.Formatter(log_format))
359360
logging.getLogger().addHandler(handler)
360361
_overwrite_logging_config_fns(handler)

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,11 @@
6262
Default: "logging.BASIC_FORMAT"
6363
"""
6464

65-
OTEL_PYTHON_LOG_LEVEL = "OTEL_PYTHON_LOG_LEVEL"
65+
OTEL_PYTHON_LOG_HANDLER_LEVEL = "OTEL_PYTHON_LOG_HANDLER_LEVEL"
6666
"""
67-
.. envvar:: OTEL_PYTHON_LOG_LEVEL
67+
.. envvar:: OTEL_PYTHON_LOG_HANDLER_LEVEL
6868
69-
The :envvar:`OTEL_PYTHON_LOG_LEVEL` environment variable sets the log level for the OpenTelemetry LoggingHandler
69+
The :envvar:`OTEL_PYTHON_LOG_HANDLER_LEVEL` environment variable sets the log level for the OpenTelemetry LoggingHandler
7070
Default: "logging.NOTSET"
7171
"""
7272

opentelemetry-sdk/tests/test_configurator.py

Lines changed: 39 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818

1919
import logging
2020
import logging.config
21-
from logging import WARNING, getLogger
2221
from logging import (
2322
DEBUG,
2423
ERROR,
@@ -833,7 +832,7 @@ def test_logging_init_custom_log_record_processors(self):
833832
environ,
834833
{
835834
"OTEL_RESOURCE_ATTRIBUTES": "service.name=otlp-service",
836-
"OTEL_PYTHON_LOG_LEVEL": "CUSTOM_LOG_LEVEL",
835+
"OTEL_PYTHON_LOG_HANDLER_LEVEL": "CUSTOM_LOG_LEVEL",
837836
},
838837
)
839838
@patch("opentelemetry.sdk._configuration._get_log_level", return_value=39)
@@ -842,7 +841,6 @@ def test_logging_init_exporter_level_under(self, log_level_mock):
842841
_init_logging(
843842
{"otlp": DummyOTLPLogExporter},
844843
resource=resource,
845-
setup_logging_handler=False,
846844
)
847845
self.assertEqual(self.set_provider_mock.call_count, 1)
848846
provider = self.set_provider_mock.call_args[0][0]
@@ -852,12 +850,13 @@ def test_logging_init_exporter_level_under(self, log_level_mock):
852850
provider.resource.attributes.get("service.name"),
853851
"otlp-service",
854852
)
855-
self.assertIsInstance(provider.processor, DummyLogRecordProcessor)
853+
self.assertEqual(len(provider.processors), 1)
854+
self.assertIsInstance(provider.processors[0], DummyLogRecordProcessor)
856855
self.assertIsInstance(
857-
provider.processor.exporter, DummyOTLPLogExporter
856+
provider.processors[0].exporter, DummyOTLPLogExporter
858857
)
859858
getLogger(__name__).error("hello")
860-
self.assertFalse(provider.processor.exporter.export_called)
859+
self.assertTrue(provider.processors[0].exporter.export_called)
861860
root_logger = getLogger()
862861
self.assertEqual(root_logger.level, WARNING)
863862
handler_present = False
@@ -871,12 +870,12 @@ def test_logging_init_exporter_level_under(self, log_level_mock):
871870
environ,
872871
{
873872
"OTEL_RESOURCE_ATTRIBUTES": "service.name=otlp-service",
874-
"OTEL_PYTHON_LOG_LEVEL": "CUSTOM_LOG_LEVEL",
873+
"OTEL_PYTHON_LOG_HANDLER_LEVEL": "CUSTOM_LOG_LEVEL",
875874
},
876875
clear=True,
877876
)
878-
@patch("opentelemetry.sdk._configuration._get_log_level", return_value=39)
879-
def test_logging_init_exporter_level_under(self, log_level_mock):
877+
@patch("opentelemetry.sdk._configuration._get_log_level", return_value=41)
878+
def test_logging_init_exporter_level_over(self, log_level_mock):
880879
resource = Resource.create({})
881880
_init_logging(
882881
{"otlp": DummyOTLPLogExporter},
@@ -890,26 +889,25 @@ def test_logging_init_exporter_level_under(self, log_level_mock):
890889
provider.resource.attributes.get("service.name"),
891890
"otlp-service",
892891
)
893-
self.assertIsInstance(provider.processor, DummyLogRecordProcessor)
892+
self.assertEqual(len(provider.processors), 1)
893+
self.assertIsInstance(provider.processors[0], DummyLogRecordProcessor)
894894
self.assertIsInstance(
895-
provider.processor.exporter, DummyOTLPLogExporter
895+
provider.processors[0].exporter, DummyOTLPLogExporter
896896
)
897897
getLogger(__name__).error("hello")
898-
self.assertFalse(provider.processor.exporter.export_called)
898+
self.assertFalse(provider.processors[0].exporter.export_called)
899899
root_logger = getLogger()
900900
handler_present = False
901901
for handler in root_logger.handlers:
902902
if isinstance(handler, LoggingHandler):
903903
handler_present = True
904-
self.assertEqual(handler.level, 39)
904+
self.assertEqual(handler.level, 41)
905905
self.assertTrue(handler_present)
906906

907907
@patch.dict(
908908
environ,
909909
{
910910
"OTEL_RESOURCE_ATTRIBUTES": "service.name=otlp-service",
911-
"OTEL_PYTHON_LOG_LEVEL": "CUSTOM_LOG_LEVEL",
912-
"OTEL_PYTHON_LOG_HANDLER_LEVEL": "CUSTOM_LOG_LEVEL",
913911
"OTEL_PYTHON_LOG_FORMAT": CUSTOM_LOG_FORMAT,
914912
},
915913
)
@@ -927,12 +925,13 @@ def test_logging_init_exporter_format(self):
927925
provider.resource.attributes.get("service.name"),
928926
"otlp-service",
929927
)
930-
self.assertIsInstance(provider.processor, DummyLogRecordProcessor)
928+
self.assertEqual(len(provider.processors), 1)
929+
self.assertIsInstance(provider.processors[0], DummyLogRecordProcessor)
931930
self.assertIsInstance(
932-
provider.processor.exporter, DummyOTLPLogExporter
931+
provider.processors[0].exporter, DummyOTLPLogExporter
933932
)
934933
getLogger(__name__).error("hello")
935-
self.assertFalse(provider.processor.exporter.export_called)
934+
self.assertTrue(provider.processors[0].exporter.export_called)
936935
root_logger = getLogger()
937936
self.assertEqual(root_logger.level, WARNING)
938937
handler_present = False
@@ -984,31 +983,45 @@ def test_logging_init_exporter_without_handler_setup(self):
984983
def test_otel_log_level_by_name_default(self):
985984
self.assertEqual(_get_log_level(), NOTSET)
986985

987-
@patch.dict(environ, {"OTEL_PYTHON_LOG_LEVEL": "NOTSET "}, clear=True)
986+
@patch.dict(
987+
environ, {"OTEL_PYTHON_LOG_HANDLER_LEVEL": "NOTSET "}, clear=True
988+
)
988989
def test_otel_log_level_by_name_notset(self):
989990
self.assertEqual(_get_log_level(), NOTSET)
990991

991-
@patch.dict(environ, {"OTEL_PYTHON_LOG_LEVEL": " DeBug "}, clear=True)
992+
@patch.dict(
993+
environ, {"OTEL_PYTHON_LOG_HANDLER_LEVEL": " DeBug "}, clear=True
994+
)
992995
def test_otel_log_level_by_name_debug(self):
993996
self.assertEqual(_get_log_level(), DEBUG)
994997

995-
@patch.dict(environ, {"OTEL_PYTHON_LOG_LEVEL": " info "}, clear=True)
998+
@patch.dict(
999+
environ, {"OTEL_PYTHON_LOG_HANDLER_LEVEL": " info "}, clear=True
1000+
)
9961001
def test_otel_log_level_by_name_info(self):
9971002
self.assertEqual(_get_log_level(), INFO)
9981003

999-
@patch.dict(environ, {"OTEL_PYTHON_LOG_LEVEL": " warn"}, clear=True)
1004+
@patch.dict(
1005+
environ, {"OTEL_PYTHON_LOG_HANDLER_LEVEL": " warn"}, clear=True
1006+
)
10001007
def test_otel_log_level_by_name_warn(self):
10011008
self.assertEqual(_get_log_level(), WARNING)
10021009

1003-
@patch.dict(environ, {"OTEL_PYTHON_LOG_LEVEL": " warnING "}, clear=True)
1010+
@patch.dict(
1011+
environ, {"OTEL_PYTHON_LOG_HANDLER_LEVEL": " warnING "}, clear=True
1012+
)
10041013
def test_otel_log_level_by_name_warning(self):
10051014
self.assertEqual(_get_log_level(), WARNING)
10061015

1007-
@patch.dict(environ, {"OTEL_PYTHON_LOG_LEVEL": " eRroR"}, clear=True)
1016+
@patch.dict(
1017+
environ, {"OTEL_PYTHON_LOG_HANDLER_LEVEL": " eRroR"}, clear=True
1018+
)
10081019
def test_otel_log_level_by_name_error(self):
10091020
self.assertEqual(_get_log_level(), ERROR)
10101021

1011-
@patch.dict(environ, {"OTEL_PYTHON_LOG_LEVEL": "foobar"}, clear=True)
1022+
@patch.dict(
1023+
environ, {"OTEL_PYTHON_LOG_HANDLER_LEVEL": "foobar"}, clear=True
1024+
)
10121025
def test_otel_log_level_by_name_invalid(self):
10131026
self.assertEqual(_get_log_level(), NOTSET)
10141027

@@ -1340,60 +1353,6 @@ def test_dictConfig_preserves_otel_handler(self):
13401353
"Should still have exactly one OpenTelemetry LoggingHandler",
13411354
)
13421355

1343-
def test_basicConfig_works_with_otel_handler(self):
1344-
with ClearLoggingHandlers():
1345-
_init_logging(
1346-
{"otlp": DummyOTLPLogExporter},
1347-
Resource.create({}),
1348-
setup_logging_handler=True,
1349-
)
1350-
1351-
logging.basicConfig(level=logging.INFO)
1352-
1353-
root_logger = logging.getLogger()
1354-
stream_handlers = [
1355-
h
1356-
for h in root_logger.handlers
1357-
if isinstance(h, logging.StreamHandler)
1358-
]
1359-
self.assertEqual(
1360-
len(stream_handlers),
1361-
1,
1362-
"basicConfig should add a StreamHandler even when OTel handler exists",
1363-
)
1364-
1365-
def test_basicConfig_preserves_otel_handler(self):
1366-
with ClearLoggingHandlers():
1367-
_init_logging(
1368-
{"otlp": DummyOTLPLogExporter},
1369-
Resource.create({}),
1370-
setup_logging_handler=True,
1371-
)
1372-
1373-
root_logger = logging.getLogger()
1374-
self.assertEqual(
1375-
len(root_logger.handlers),
1376-
1,
1377-
"Should be exactly one OpenTelemetry LoggingHandler",
1378-
)
1379-
handler = root_logger.handlers[0]
1380-
self.assertIsInstance(handler, LoggingHandler)
1381-
1382-
logging.basicConfig()
1383-
1384-
self.assertGreater(len(root_logger.handlers), 1)
1385-
1386-
logging_handlers = [
1387-
h
1388-
for h in root_logger.handlers
1389-
if isinstance(h, LoggingHandler)
1390-
]
1391-
self.assertEqual(
1392-
len(logging_handlers),
1393-
1,
1394-
"Should still have exactly one OpenTelemetry LoggingHandler",
1395-
)
1396-
13971356

13981357
class TestMetricsInit(TestCase):
13991358
def setUp(self):
@@ -1671,7 +1630,7 @@ def __exit__(self, exc_type, exc_val, exc_tb):
16711630
logging.config.fileConfig = self.original_file_config
16721631

16731632

1674-
class TestClearLoggingHandlers(TestCase):
1633+
class TestResetGlobalLoggingState(TestCase):
16751634
def test_preserves_handlers(self):
16761635
root_logger = getLogger()
16771636
initial_handlers = root_logger.handlers[:]

0 commit comments

Comments
 (0)