From 51d87d827a7d0abdb604345c241c40120c9826b2 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Tue, 15 Mar 2022 10:58:50 -0700 Subject: [PATCH 01/13] sxc --- CHANGELOG.md | 4 +-- .../src/opentelemetry/sdk/_logs/__init__.py | 24 +++++++++++++++++- opentelemetry-sdk/tests/logs/test_handler.py | 25 +++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 91f4482334..35e30966b6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,11 +10,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fix incorrect installation of some exporter “convenience” packages into “site-packages/src” ([#2525](https://github.com/open-telemetry/opentelemetry-python/pull/2525)) +- Capture exception information as part of log attributes + ([#2525](https://github.com/open-telemetry/opentelemetry-python/pull/2525)) ## [1.10.0-0.29b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.10.0-0.29b0) - 2022-03-10 - - - Docs rework: [non-API docs are moving](https://github.com/open-telemetry/opentelemetry-python/issues/2172) to [opentelemetry.io](https://opentelemetry.io). For details, including a list of diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py index 1de44712e8..635d205f06 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py @@ -19,6 +19,7 @@ import logging import os import threading +import traceback from typing import Any, Callable, Optional, Tuple, Union, cast from opentelemetry.sdk._logs.severity import SeverityNumber, std_to_otlp @@ -33,6 +34,7 @@ format_trace_id, get_current_span, ) +from opentelemetry.semconv.trace import SpanAttributes from opentelemetry.trace.span import TraceFlags from opentelemetry.util._providers import _load_provider from opentelemetry.util._time import _time_ns @@ -318,9 +320,29 @@ def __init__( @staticmethod def _get_attributes(record: logging.LogRecord) -> Attributes: - return { + attributes = { k: v for k, v in vars(record).items() if k not in _RESERVED_ATTRS } + if record.exc_info: + exctype, value, tb = record.exc_info + if exctype is not None: + exc_type = exctype.__name__ + if value is not None: + message = value.args[0] + callstack = [] + if tb is not None: + for fileName, line, method, text in traceback.extract_tb(tb): + callstack.append({ + 'method': method, + 'fileName': fileName, + 'line': line, + 'text': text, + }) + callstack.reverse() + attributes[SpanAttributes.EXCEPTION_TYPE] = exc_type + attributes[SpanAttributes.EXCEPTION_MESSAGE] = message + attributes[SpanAttributes.EXCEPTION_STACKTRACE] = json.dumps(callstack) + return attributes def _translate(self, record: logging.LogRecord) -> LogRecord: timestamp = int(record.created * 1e9) diff --git a/opentelemetry-sdk/tests/logs/test_handler.py b/opentelemetry-sdk/tests/logs/test_handler.py index d7942f912b..2f621ec7d2 100644 --- a/opentelemetry-sdk/tests/logs/test_handler.py +++ b/opentelemetry-sdk/tests/logs/test_handler.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import json import logging import unittest from unittest.mock import Mock @@ -19,6 +20,7 @@ from opentelemetry.sdk import trace from opentelemetry.sdk._logs import LogEmitter, OTLPHandler from opentelemetry.sdk._logs.severity import SeverityNumber +from opentelemetry.semconv.trace import SpanAttributes from opentelemetry.trace import INVALID_SPAN_CONTEXT @@ -77,6 +79,29 @@ def test_log_record_user_attributes(self): self.assertIsNotNone(log_record) self.assertEqual(log_record.attributes, {"http.status_code": 200}) + def test_log_record_exception(self): + """Exception information will be included in attributes""" + emitter_mock = Mock(spec=LogEmitter) + logger = get_logger(log_emitter=emitter_mock) + try: + div = 1/0 + except: + logger.exception("Zero Division Error") + args, _ = emitter_mock.emit.call_args_list[0] + log_record = args[0] + + self.assertIsNotNone(log_record) + self.assertEqual(log_record.body, "Zero Division Error") + self.assertEqual(log_record.attributes[SpanAttributes.EXCEPTION_TYPE], ZeroDivisionError.__name__) + self.assertEqual(log_record.attributes[SpanAttributes.EXCEPTION_MESSAGE], "division by zero") + print(log_record.attributes[SpanAttributes.EXCEPTION_STACKTRACE]) + stack_trace = json.loads(log_record.attributes[SpanAttributes.EXCEPTION_STACKTRACE]) + self.assertEqual(len(stack_trace), 1) + self.assertEqual(stack_trace[0]["method"], "test_log_record_exception") + self.assertEqual(stack_trace[0]["fileName"], __file__) + # self.assertEqual(stack_trace[0]["line"], 87) + self.assertEqual(stack_trace[0]["text"], "div = 1/0") + def test_log_record_trace_correlation(self): emitter_mock = Mock(spec=LogEmitter) logger = get_logger(log_emitter=emitter_mock) From 00188dac51d866af5f0070652d1579d00891a44b Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Tue, 15 Mar 2022 11:16:37 -0700 Subject: [PATCH 02/13] lint --- CHANGELOG.md | 2 +- opentelemetry-sdk/tests/logs/test_handler.py | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35e30966b6..67f1afb999 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,7 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 “site-packages/src” ([#2525](https://github.com/open-telemetry/opentelemetry-python/pull/2525)) - Capture exception information as part of log attributes - ([#2525](https://github.com/open-telemetry/opentelemetry-python/pull/2525)) + ([#2531](https://github.com/open-telemetry/opentelemetry-python/pull/2531)) ## [1.10.0-0.29b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.10.0-0.29b0) - 2022-03-10 diff --git a/opentelemetry-sdk/tests/logs/test_handler.py b/opentelemetry-sdk/tests/logs/test_handler.py index 2f621ec7d2..ff0c5dfa6b 100644 --- a/opentelemetry-sdk/tests/logs/test_handler.py +++ b/opentelemetry-sdk/tests/logs/test_handler.py @@ -84,7 +84,7 @@ def test_log_record_exception(self): emitter_mock = Mock(spec=LogEmitter) logger = get_logger(log_emitter=emitter_mock) try: - div = 1/0 + div = 1 / 0 except: logger.exception("Zero Division Error") args, _ = emitter_mock.emit.call_args_list[0] @@ -92,10 +92,18 @@ def test_log_record_exception(self): self.assertIsNotNone(log_record) self.assertEqual(log_record.body, "Zero Division Error") - self.assertEqual(log_record.attributes[SpanAttributes.EXCEPTION_TYPE], ZeroDivisionError.__name__) - self.assertEqual(log_record.attributes[SpanAttributes.EXCEPTION_MESSAGE], "division by zero") + self.assertEqual( + log_record.attributes[SpanAttributes.EXCEPTION_TYPE], + ZeroDivisionError.__name__, + ) + self.assertEqual( + log_record.attributes[SpanAttributes.EXCEPTION_MESSAGE], + "division by zero", + ) print(log_record.attributes[SpanAttributes.EXCEPTION_STACKTRACE]) - stack_trace = json.loads(log_record.attributes[SpanAttributes.EXCEPTION_STACKTRACE]) + stack_trace = json.loads( + log_record.attributes[SpanAttributes.EXCEPTION_STACKTRACE] + ) self.assertEqual(len(stack_trace), 1) self.assertEqual(stack_trace[0]["method"], "test_log_record_exception") self.assertEqual(stack_trace[0]["fileName"], __file__) From 40c4e3b9b71319439399ee55913403fc4885ad0f Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Tue, 15 Mar 2022 12:29:40 -0700 Subject: [PATCH 03/13] lint --- .../src/opentelemetry/sdk/_logs/__init__.py | 18 +++++++++++------- opentelemetry-sdk/tests/logs/test_handler.py | 3 +-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py index b8d3875210..6d4246c480 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py @@ -333,16 +333,20 @@ def _get_attributes(record: logging.LogRecord) -> Attributes: callstack = [] if tb is not None: for fileName, line, method, text in traceback.extract_tb(tb): - callstack.append({ - 'method': method, - 'fileName': fileName, - 'line': line, - 'text': text, - }) + callstack.append( + { + "method": method, + "fileName": fileName, + "line": line, + "text": text, + } + ) callstack.reverse() attributes[SpanAttributes.EXCEPTION_TYPE] = exc_type attributes[SpanAttributes.EXCEPTION_MESSAGE] = message - attributes[SpanAttributes.EXCEPTION_STACKTRACE] = json.dumps(callstack) + attributes[SpanAttributes.EXCEPTION_STACKTRACE] = json.dumps( + callstack + ) return attributes def _translate(self, record: logging.LogRecord) -> LogRecord: diff --git a/opentelemetry-sdk/tests/logs/test_handler.py b/opentelemetry-sdk/tests/logs/test_handler.py index 6d837ef011..276c0da4d1 100644 --- a/opentelemetry-sdk/tests/logs/test_handler.py +++ b/opentelemetry-sdk/tests/logs/test_handler.py @@ -84,7 +84,7 @@ def test_log_record_exception(self): emitter_mock = Mock(spec=LogEmitter) logger = get_logger(log_emitter=emitter_mock) try: - div = 1 / 0 + div = 1/0 except: logger.exception("Zero Division Error") args, _ = emitter_mock.emit.call_args_list[0] @@ -100,7 +100,6 @@ def test_log_record_exception(self): log_record.attributes[SpanAttributes.EXCEPTION_MESSAGE], "division by zero", ) - print(log_record.attributes[SpanAttributes.EXCEPTION_STACKTRACE]) stack_trace = json.loads( log_record.attributes[SpanAttributes.EXCEPTION_STACKTRACE] ) From 55263e868c3e07307944f4b2b8538d34e106a543 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Tue, 15 Mar 2022 14:01:26 -0700 Subject: [PATCH 04/13] litnt --- opentelemetry-sdk/tests/logs/test_handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-sdk/tests/logs/test_handler.py b/opentelemetry-sdk/tests/logs/test_handler.py index 276c0da4d1..2e4f94cd3e 100644 --- a/opentelemetry-sdk/tests/logs/test_handler.py +++ b/opentelemetry-sdk/tests/logs/test_handler.py @@ -84,7 +84,7 @@ def test_log_record_exception(self): emitter_mock = Mock(spec=LogEmitter) logger = get_logger(log_emitter=emitter_mock) try: - div = 1/0 + div = 1 / 0 except: logger.exception("Zero Division Error") args, _ = emitter_mock.emit.call_args_list[0] From 9d26b29f4d90108d010733777a74d1b204f2f1c5 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Tue, 15 Mar 2022 14:29:35 -0700 Subject: [PATCH 05/13] Update test_handler.py --- opentelemetry-sdk/tests/logs/test_handler.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opentelemetry-sdk/tests/logs/test_handler.py b/opentelemetry-sdk/tests/logs/test_handler.py index 2e4f94cd3e..92f25d5cb6 100644 --- a/opentelemetry-sdk/tests/logs/test_handler.py +++ b/opentelemetry-sdk/tests/logs/test_handler.py @@ -84,7 +84,7 @@ def test_log_record_exception(self): emitter_mock = Mock(spec=LogEmitter) logger = get_logger(log_emitter=emitter_mock) try: - div = 1 / 0 + div = 1 / 0 except: logger.exception("Zero Division Error") args, _ = emitter_mock.emit.call_args_list[0] @@ -107,7 +107,7 @@ def test_log_record_exception(self): self.assertEqual(stack_trace[0]["method"], "test_log_record_exception") self.assertEqual(stack_trace[0]["fileName"], __file__) # self.assertEqual(stack_trace[0]["line"], 87) - self.assertEqual(stack_trace[0]["text"], "div = 1/0") + self.assertEqual(stack_trace[0]["text"], "div = 1 / 0") def test_log_record_trace_correlation(self): emitter_mock = Mock(spec=LogEmitter) From ec81f8f47626de05b6c5856f6636aac0ac5d4a58 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Tue, 15 Mar 2022 15:20:49 -0700 Subject: [PATCH 06/13] Update __init__.py --- opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py index 6d4246c480..719ea45db4 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py @@ -29,12 +29,12 @@ from opentelemetry.sdk.resources import Resource from opentelemetry.sdk.util import ns_to_iso_str from opentelemetry.sdk.util.instrumentation import InstrumentationInfo +from opentelemetry.semconv.trace import SpanAttributes from opentelemetry.trace import ( format_span_id, format_trace_id, get_current_span, ) -from opentelemetry.semconv.trace import SpanAttributes from opentelemetry.trace.span import TraceFlags from opentelemetry.util._providers import _load_provider from opentelemetry.util._time import _time_ns From d38cdbf143bf13097977975183aa1a2d45982412 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Tue, 15 Mar 2022 17:12:14 -0700 Subject: [PATCH 07/13] Update test_handler.py --- opentelemetry-sdk/tests/logs/test_handler.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/opentelemetry-sdk/tests/logs/test_handler.py b/opentelemetry-sdk/tests/logs/test_handler.py index 92f25d5cb6..ad2c3dae98 100644 --- a/opentelemetry-sdk/tests/logs/test_handler.py +++ b/opentelemetry-sdk/tests/logs/test_handler.py @@ -85,7 +85,8 @@ def test_log_record_exception(self): logger = get_logger(log_emitter=emitter_mock) try: div = 1 / 0 - except: + print(div) + except ZeroDivisionError: logger.exception("Zero Division Error") args, _ = emitter_mock.emit.call_args_list[0] log_record = args[0] From 68d206b60253118d1496ae3bab6c25def37d806c Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Tue, 15 Mar 2022 17:39:55 -0700 Subject: [PATCH 08/13] lint --- opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py index 719ea45db4..f1a3bc7cc6 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py @@ -332,11 +332,11 @@ def _get_attributes(record: logging.LogRecord) -> Attributes: message = value.args[0] callstack = [] if tb is not None: - for fileName, line, method, text in traceback.extract_tb(tb): + for file_name, line, method, text in traceback.extract_tb(tb): callstack.append( { "method": method, - "fileName": fileName, + "fileName": file_name, "line": line, "text": text, } From 91f6b118e4bd8c0a17cb62e72e2909a0777f781f Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Wed, 16 Mar 2022 10:06:56 -0700 Subject: [PATCH 09/13] lint --- opentelemetry-sdk/tests/logs/test_handler.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/opentelemetry-sdk/tests/logs/test_handler.py b/opentelemetry-sdk/tests/logs/test_handler.py index ad2c3dae98..9de661eb61 100644 --- a/opentelemetry-sdk/tests/logs/test_handler.py +++ b/opentelemetry-sdk/tests/logs/test_handler.py @@ -84,8 +84,7 @@ def test_log_record_exception(self): emitter_mock = Mock(spec=LogEmitter) logger = get_logger(log_emitter=emitter_mock) try: - div = 1 / 0 - print(div) + div = 1 / 0 # noqa: F841 except ZeroDivisionError: logger.exception("Zero Division Error") args, _ = emitter_mock.emit.call_args_list[0] @@ -107,7 +106,6 @@ def test_log_record_exception(self): self.assertEqual(len(stack_trace), 1) self.assertEqual(stack_trace[0]["method"], "test_log_record_exception") self.assertEqual(stack_trace[0]["fileName"], __file__) - # self.assertEqual(stack_trace[0]["line"], 87) self.assertEqual(stack_trace[0]["text"], "div = 1 / 0") def test_log_record_trace_correlation(self): From 570d61b6b0cbed4c1538520f5314ab29426ceb90 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Thu, 17 Mar 2022 13:29:22 -0700 Subject: [PATCH 10/13] tb --- .../src/opentelemetry/sdk/_logs/__init__.py | 16 ++-------------- opentelemetry-sdk/tests/logs/test_handler.py | 16 +++++++--------- 2 files changed, 9 insertions(+), 23 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py index f1a3bc7cc6..e003adf19e 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py @@ -330,23 +330,11 @@ def _get_attributes(record: logging.LogRecord) -> Attributes: exc_type = exctype.__name__ if value is not None: message = value.args[0] - callstack = [] if tb is not None: - for file_name, line, method, text in traceback.extract_tb(tb): - callstack.append( - { - "method": method, - "fileName": file_name, - "line": line, - "text": text, - } - ) - callstack.reverse() + stack_trace = "".join(traceback.format_exception(*record.exc_info)) attributes[SpanAttributes.EXCEPTION_TYPE] = exc_type attributes[SpanAttributes.EXCEPTION_MESSAGE] = message - attributes[SpanAttributes.EXCEPTION_STACKTRACE] = json.dumps( - callstack - ) + attributes[SpanAttributes.EXCEPTION_STACKTRACE] = stack_trace return attributes def _translate(self, record: logging.LogRecord) -> LogRecord: diff --git a/opentelemetry-sdk/tests/logs/test_handler.py b/opentelemetry-sdk/tests/logs/test_handler.py index 9de661eb61..37499bbd24 100644 --- a/opentelemetry-sdk/tests/logs/test_handler.py +++ b/opentelemetry-sdk/tests/logs/test_handler.py @@ -11,8 +11,6 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. - -import json import logging import unittest from unittest.mock import Mock @@ -100,13 +98,13 @@ def test_log_record_exception(self): log_record.attributes[SpanAttributes.EXCEPTION_MESSAGE], "division by zero", ) - stack_trace = json.loads( - log_record.attributes[SpanAttributes.EXCEPTION_STACKTRACE] - ) - self.assertEqual(len(stack_trace), 1) - self.assertEqual(stack_trace[0]["method"], "test_log_record_exception") - self.assertEqual(stack_trace[0]["fileName"], __file__) - self.assertEqual(stack_trace[0]["text"], "div = 1 / 0") + stack_trace = log_record.attributes[SpanAttributes.EXCEPTION_STACKTRACE] + self.assertIsInstance(stack_trace, str) + self.assertTrue("Traceback" in stack_trace) + self.assertTrue("div = 1 / 0" in stack_trace) + self.assertTrue("ZeroDivisionError" in stack_trace) + self.assertTrue("division by zero" in stack_trace) + self.assertTrue(__file__ in stack_trace) def test_log_record_trace_correlation(self): emitter_mock = Mock(spec=LogEmitter) From b29751b42f2b24096631ed63a9e64f6ceecef5b1 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Thu, 17 Mar 2022 13:56:55 -0700 Subject: [PATCH 11/13] lint --- opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py | 4 +++- opentelemetry-sdk/tests/logs/test_handler.py | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py index e003adf19e..4bffbb6dd2 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py @@ -331,7 +331,9 @@ def _get_attributes(record: logging.LogRecord) -> Attributes: if value is not None: message = value.args[0] if tb is not None: - stack_trace = "".join(traceback.format_exception(*record.exc_info)) + stack_trace = "".join( + traceback.format_exception(*record.exc_info) + ) attributes[SpanAttributes.EXCEPTION_TYPE] = exc_type attributes[SpanAttributes.EXCEPTION_MESSAGE] = message attributes[SpanAttributes.EXCEPTION_STACKTRACE] = stack_trace diff --git a/opentelemetry-sdk/tests/logs/test_handler.py b/opentelemetry-sdk/tests/logs/test_handler.py index 37499bbd24..10130e29a9 100644 --- a/opentelemetry-sdk/tests/logs/test_handler.py +++ b/opentelemetry-sdk/tests/logs/test_handler.py @@ -98,7 +98,9 @@ def test_log_record_exception(self): log_record.attributes[SpanAttributes.EXCEPTION_MESSAGE], "division by zero", ) - stack_trace = log_record.attributes[SpanAttributes.EXCEPTION_STACKTRACE] + stack_trace = log_record.attributes[ + SpanAttributes.EXCEPTION_STACKTRACE + ] self.assertIsInstance(stack_trace, str) self.assertTrue("Traceback" in stack_trace) self.assertTrue("div = 1 / 0" in stack_trace) From 5135c0bd860da781f3ff25f5b9884d1573bae7c9 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Thu, 17 Mar 2022 14:34:24 -0700 Subject: [PATCH 12/13] lint --- opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py | 1 + opentelemetry-sdk/tests/logs/test_handler.py | 1 + 2 files changed, 2 insertions(+) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py index 4bffbb6dd2..79bb782baf 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py @@ -331,6 +331,7 @@ def _get_attributes(record: logging.LogRecord) -> Attributes: if value is not None: message = value.args[0] if tb is not None: + # https://github.com/open-telemetry/opentelemetry-specification/blob/9fa7c656b26647b27e485a6af7e38dc716eba98a/specification/trace/semantic_conventions/exceptions.md#stacktrace-representation stack_trace = "".join( traceback.format_exception(*record.exc_info) ) diff --git a/opentelemetry-sdk/tests/logs/test_handler.py b/opentelemetry-sdk/tests/logs/test_handler.py index 10130e29a9..a1e6ae0d67 100644 --- a/opentelemetry-sdk/tests/logs/test_handler.py +++ b/opentelemetry-sdk/tests/logs/test_handler.py @@ -82,6 +82,7 @@ def test_log_record_exception(self): emitter_mock = Mock(spec=LogEmitter) logger = get_logger(log_emitter=emitter_mock) try: + # pylint:disable=unused-variable div = 1 / 0 # noqa: F841 except ZeroDivisionError: logger.exception("Zero Division Error") From 07e852065577427a29adcf1c51c932c785ce60dc Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Fri, 18 Mar 2022 10:21:23 -0700 Subject: [PATCH 13/13] none chceks --- opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py | 7 +++++-- opentelemetry-sdk/tests/logs/test_handler.py | 4 +--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py index 79bb782baf..c278635c6b 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/_logs/__init__.py @@ -324,11 +324,14 @@ def _get_attributes(record: logging.LogRecord) -> Attributes: attributes = { k: v for k, v in vars(record).items() if k not in _RESERVED_ATTRS } - if record.exc_info: + if record.exc_info is not None: + exc_type = "" + message = "" + stack_trace = "" exctype, value, tb = record.exc_info if exctype is not None: exc_type = exctype.__name__ - if value is not None: + if value is not None and value.args: message = value.args[0] if tb is not None: # https://github.com/open-telemetry/opentelemetry-specification/blob/9fa7c656b26647b27e485a6af7e38dc716eba98a/specification/trace/semantic_conventions/exceptions.md#stacktrace-representation diff --git a/opentelemetry-sdk/tests/logs/test_handler.py b/opentelemetry-sdk/tests/logs/test_handler.py index a1e6ae0d67..7ea478e844 100644 --- a/opentelemetry-sdk/tests/logs/test_handler.py +++ b/opentelemetry-sdk/tests/logs/test_handler.py @@ -82,8 +82,7 @@ def test_log_record_exception(self): emitter_mock = Mock(spec=LogEmitter) logger = get_logger(log_emitter=emitter_mock) try: - # pylint:disable=unused-variable - div = 1 / 0 # noqa: F841 + raise ZeroDivisionError("division by zero") except ZeroDivisionError: logger.exception("Zero Division Error") args, _ = emitter_mock.emit.call_args_list[0] @@ -104,7 +103,6 @@ def test_log_record_exception(self): ] self.assertIsInstance(stack_trace, str) self.assertTrue("Traceback" in stack_trace) - self.assertTrue("div = 1 / 0" in stack_trace) self.assertTrue("ZeroDivisionError" in stack_trace) self.assertTrue("division by zero" in stack_trace) self.assertTrue(__file__ in stack_trace)