|
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 | | - |
15 | 14 | import logging |
16 | 15 | import unittest |
17 | 16 | from unittest.mock import Mock |
18 | 17 |
|
19 | 18 | from opentelemetry.sdk import trace |
20 | 19 | from opentelemetry.sdk._logs import LogEmitter, LoggingHandler |
21 | 20 | from opentelemetry.sdk._logs.severity import SeverityNumber |
| 21 | +from opentelemetry.semconv.trace import SpanAttributes |
22 | 22 | from opentelemetry.trace import INVALID_SPAN_CONTEXT |
23 | 23 |
|
24 | 24 |
|
@@ -77,6 +77,36 @@ def test_log_record_user_attributes(self): |
77 | 77 | self.assertIsNotNone(log_record) |
78 | 78 | self.assertEqual(log_record.attributes, {"http.status_code": 200}) |
79 | 79 |
|
| 80 | + def test_log_record_exception(self): |
| 81 | + """Exception information will be included in attributes""" |
| 82 | + emitter_mock = Mock(spec=LogEmitter) |
| 83 | + logger = get_logger(log_emitter=emitter_mock) |
| 84 | + try: |
| 85 | + raise ZeroDivisionError("division by zero") |
| 86 | + except ZeroDivisionError: |
| 87 | + logger.exception("Zero Division Error") |
| 88 | + args, _ = emitter_mock.emit.call_args_list[0] |
| 89 | + log_record = args[0] |
| 90 | + |
| 91 | + self.assertIsNotNone(log_record) |
| 92 | + self.assertEqual(log_record.body, "Zero Division Error") |
| 93 | + self.assertEqual( |
| 94 | + log_record.attributes[SpanAttributes.EXCEPTION_TYPE], |
| 95 | + ZeroDivisionError.__name__, |
| 96 | + ) |
| 97 | + self.assertEqual( |
| 98 | + log_record.attributes[SpanAttributes.EXCEPTION_MESSAGE], |
| 99 | + "division by zero", |
| 100 | + ) |
| 101 | + stack_trace = log_record.attributes[ |
| 102 | + SpanAttributes.EXCEPTION_STACKTRACE |
| 103 | + ] |
| 104 | + self.assertIsInstance(stack_trace, str) |
| 105 | + self.assertTrue("Traceback" in stack_trace) |
| 106 | + self.assertTrue("ZeroDivisionError" in stack_trace) |
| 107 | + self.assertTrue("division by zero" in stack_trace) |
| 108 | + self.assertTrue(__file__ in stack_trace) |
| 109 | + |
80 | 110 | def test_log_record_trace_correlation(self): |
81 | 111 | emitter_mock = Mock(spec=LogEmitter) |
82 | 112 | logger = get_logger(log_emitter=emitter_mock) |
|
0 commit comments