Skip to content

Commit eed100c

Browse files
fix: map Python CRITICAL log level to OTel FATAL severity text (#5011)
1 parent 3f3ffdb commit eed100c

File tree

5 files changed

+20
-12
lines changed

5 files changed

+20
-12
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1414

1515
- `opentelemetry-sdk`: Add `create_resource` and `create_propagator`/`configure_propagator` to declarative file configuration, enabling Resource and propagator instantiation from config files without reading env vars
1616
([#4979](https://github.com/open-telemetry/opentelemetry-python/pull/4979))
17+
- `opentelemetry-sdk`: Map Python `CRITICAL` log level to OTel `FATAL` severity text per the specification
18+
([#4984](https://github.com/open-telemetry/opentelemetry-python/issues/4984))
1719
- `opentelemetry-sdk`: Add file configuration support with YAML/JSON loading, environment variable substitution, and schema validation against the vendored OTel config JSON schema
1820
([#4898](https://github.com/open-telemetry/opentelemetry-python/pull/4898))
1921
- Fix intermittent CI failures in `getting-started` and `tracecontext` jobs caused by GitHub git CDN SHA propagation lag by installing contrib packages from the already-checked-out local copy instead of a second git clone

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -592,10 +592,16 @@ def _translate(self, record: logging.LogRecord) -> LogRecord:
592592
else:
593593
body = record.getMessage()
594594

595-
# related to https://github.com/open-telemetry/opentelemetry-python/issues/3548
596-
# Severity Text = WARN as defined in https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md#displaying-severity.
597-
level_name = (
598-
"WARN" if record.levelname == "WARNING" else record.levelname
595+
# Map Python log level names to OTel severity text as defined in
596+
# https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/logs/data-model.md#displaying-severity
597+
# Python "WARNING" -> OTel "WARN" (see #3548)
598+
# Python "CRITICAL" -> OTel "FATAL" (see #4984)
599+
_python_to_otel_severity_text = {
600+
"WARNING": "WARN",
601+
"CRITICAL": "FATAL",
602+
}
603+
level_name = _python_to_otel_severity_text.get(
604+
record.levelname, record.levelname
599605
)
600606

601607
return LogRecord(

opentelemetry-sdk/tests/logs/test_export.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ def test_simple_log_record_processor_custom_level(self):
161161
SeverityNumber.ERROR,
162162
)
163163
self.assertEqual(fatal_log_record.log_record.body, "Critical message")
164-
self.assertEqual(fatal_log_record.log_record.severity_text, "CRITICAL")
164+
self.assertEqual(fatal_log_record.log_record.severity_text, "FATAL")
165165
self.assertEqual(
166166
fatal_log_record.log_record.severity_number, SeverityNumber.FATAL
167167
)
@@ -216,7 +216,7 @@ def test_simple_log_record_processor_trace_correlation(self):
216216
self.assertEqual(
217217
sdk_record.log_record.body, "Critical message within span"
218218
)
219-
self.assertEqual(sdk_record.log_record.severity_text, "CRITICAL")
219+
self.assertEqual(sdk_record.log_record.severity_text, "FATAL")
220220
self.assertEqual(
221221
sdk_record.log_record.severity_number, SeverityNumber.FATAL
222222
)
@@ -290,7 +290,7 @@ def test_simple_log_record_processor_different_msg_types(self):
290290
("Very high rise in temperatures across the globe", "ERROR"),
291291
(
292292
"Temperature hits high 420 C in Hyderabad",
293-
"CRITICAL",
293+
"FATAL",
294294
),
295295
(["list", "of", "strings"], "WARN"),
296296
({"key": "value"}, "ERROR"),
@@ -386,7 +386,7 @@ def test_simple_log_record_processor_different_msg_types_with_formatter(
386386
),
387387
(
388388
"different_msg_types - CRITICAL - Temperature hits high 420 C in Hyderabad",
389-
"CRITICAL",
389+
"FATAL",
390390
),
391391
(
392392
"different_msg_types - WARNING - ['list', 'of', 'strings']",

opentelemetry-sdk/tests/logs/test_handler.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,7 +341,7 @@ def test_log_record_trace_correlation(self):
341341
record.log_record.body,
342342
"Critical message within span",
343343
)
344-
self.assertEqual(record.log_record.severity_text, "CRITICAL")
344+
self.assertEqual(record.log_record.severity_text, "FATAL")
345345
self.assertEqual(
346346
record.log_record.severity_number,
347347
SeverityNumber.FATAL,
@@ -374,7 +374,7 @@ def test_log_record_trace_correlation_deprecated(self):
374374
self.assertEqual(
375375
record.log_record.body, "Critical message within span"
376376
)
377-
self.assertEqual(record.log_record.severity_text, "CRITICAL")
377+
self.assertEqual(record.log_record.severity_text, "FATAL")
378378
self.assertEqual(
379379
record.log_record.severity_number, SeverityNumber.FATAL
380380
)

opentelemetry-sdk/tests/logs/test_multi_log_processor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,9 @@ def test_log_record_processor(self):
9494
provider.add_log_record_processor(processor2)
9595
with self.assertLogs(level=logging.CRITICAL):
9696
logger.critical("Something disastrous")
97-
expected_list_1.append(("Something disastrous", "CRITICAL"))
97+
expected_list_1.append(("Something disastrous", "FATAL"))
9898

99-
expected_list_2 = [("Something disastrous", "CRITICAL")]
99+
expected_list_2 = [("Something disastrous", "FATAL")]
100100

101101
self.assertEqual(logs_list_1, expected_list_1)
102102
self.assertEqual(logs_list_2, expected_list_2)

0 commit comments

Comments
 (0)