Skip to content

Commit fded599

Browse files
committed
fix: capture the correct log caller
Signed-off-by: Varsha GS <varsha.gs@ibm.com>
1 parent d7deedf commit fded599

2 files changed

Lines changed: 28 additions & 2 deletions

File tree

src/instana/instrumentation/logging.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,16 @@ def log_with_instana(wrapped, instance, argv, kwargs):
1616
# argv[0] = level
1717
# argv[1] = message
1818
# argv[2] = args for message
19+
if sys.version_info >= (3, 13):
20+
stacklevel = 3
21+
else:
22+
stacklevel = 2
1923
try:
2024
tracer, parent_span, _ = get_tracer_tuple()
2125

2226
# Only needed if we're tracing and serious log
2327
if tracing_is_off() or argv[0] < logging.WARN:
24-
return wrapped(*argv, **kwargs)
28+
return wrapped(*argv, **kwargs, stacklevel=stacklevel)
2529

2630
msg = str(argv[1])
2731
args = argv[2]
@@ -48,7 +52,7 @@ def log_with_instana(wrapped, instance, argv, kwargs):
4852
except Exception:
4953
logger.debug('log_with_instana:', exc_info=True)
5054

51-
return wrapped(*argv, **kwargs)
55+
return wrapped(*argv, **kwargs, stacklevel=stacklevel)
5256

5357

5458
logger.debug('Instrumenting logging')

tests/clients/test_logging.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,15 @@
33

44
import logging
55
import unittest
6+
import pytest
67
from instana.singletons import agent, tracer
78

89

910
class TestLogging(unittest.TestCase):
11+
@pytest.fixture
12+
def capture_log(self, caplog):
13+
self.caplog = caplog
14+
1015
def setUp(self):
1116
""" Clear all spans before a test run """
1217
self.recorder = tracer.recorder
@@ -74,3 +79,20 @@ def test_root_exit_span(self):
7479
self.assertEqual(2, spans[0].k)
7580

7681
self.assertEqual('foo bar', spans[0].data["log"].get('message'))
82+
83+
@pytest.mark.usefixtures("capture_log")
84+
def test_log_caller(self):
85+
handler = logging.StreamHandler()
86+
handler.setFormatter(
87+
logging.Formatter("source: %(funcName)s, message: %(message)s")
88+
)
89+
self.logger.addHandler(handler)
90+
91+
def log_custom_warning():
92+
self.logger.warning("foo %s", "bar")
93+
94+
with tracer.start_active_span("test"):
95+
log_custom_warning()
96+
self.assertEqual(self.caplog.records[0].funcName, "log_custom_warning")
97+
98+
self.logger.removeHandler(handler)

0 commit comments

Comments
 (0)