Skip to content

Commit b8bd5ef

Browse files
committed
Merge branch 'master' into ivana/loguru-logs
2 parents ac6dd2d + 7f8571c commit b8bd5ef

File tree

4 files changed

+67
-10
lines changed

4 files changed

+67
-10
lines changed

sentry_sdk/client.py

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from typing import TYPE_CHECKING, List, Dict, cast, overload
99
import warnings
1010

11+
import sentry_sdk
1112
from sentry_sdk._compat import PY37, check_uwsgi_thread_support
1213
from sentry_sdk.utils import (
1314
AnnotatedValue,
@@ -215,8 +216,8 @@ def capture_event(self, *args, **kwargs):
215216
# type: (*Any, **Any) -> Optional[str]
216217
return None
217218

218-
def _capture_experimental_log(self, scope, log):
219-
# type: (Scope, Log) -> None
219+
def _capture_experimental_log(self, log):
220+
# type: (Log) -> None
220221
pass
221222

222223
def capture_session(self, *args, **kwargs):
@@ -893,12 +894,14 @@ def capture_event(
893894

894895
return return_value
895896

896-
def _capture_experimental_log(self, current_scope, log):
897-
# type: (Scope, Log) -> None
897+
def _capture_experimental_log(self, log):
898+
# type: (Log) -> None
898899
logs_enabled = self.options["_experiments"].get("enable_logs", False)
899900
if not logs_enabled:
900901
return
901-
isolation_scope = current_scope.get_isolation_scope()
902+
903+
current_scope = sentry_sdk.get_current_scope()
904+
isolation_scope = sentry_sdk.get_isolation_scope()
902905

903906
log["attributes"]["sentry.sdk.name"] = SDK_INFO["name"]
904907
log["attributes"]["sentry.sdk.version"] = SDK_INFO["version"]
@@ -927,6 +930,21 @@ def _capture_experimental_log(self, current_scope, log):
927930
elif propagation_context is not None:
928931
log["trace_id"] = propagation_context.trace_id
929932

933+
# The user, if present, is always set on the isolation scope.
934+
if self.should_send_default_pii() and isolation_scope._user is not None:
935+
for log_attribute, user_attribute in (
936+
("user.id", "id"),
937+
("user.name", "username"),
938+
("user.email", "email"),
939+
):
940+
if (
941+
user_attribute in isolation_scope._user
942+
and log_attribute not in log["attributes"]
943+
):
944+
log["attributes"][log_attribute] = isolation_scope._user[
945+
user_attribute
946+
]
947+
930948
# If debug is enabled, log the log to the console
931949
debug = self.options.get("debug", False)
932950
if debug:

sentry_sdk/integrations/logging.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,6 @@ def emit(self, record):
352352

353353
def _capture_log_from_record(self, client, record):
354354
# type: (BaseClient, LogRecord) -> None
355-
scope = sentry_sdk.get_current_scope()
356355
otel_severity_number, otel_severity_text = _python_level_to_otel(record.levelno)
357356
project_root = client.options["project_root"]
358357
attrs = self._extra_from_record(record) # type: Any
@@ -391,7 +390,6 @@ def _capture_log_from_record(self, client, record):
391390

392391
# noinspection PyProtectedMember
393392
client._capture_experimental_log(
394-
scope,
395393
{
396394
"severity_text": otel_severity_text,
397395
"severity_number": otel_severity_number,

sentry_sdk/logger.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33
import time
44
from typing import Any
55

6-
from sentry_sdk import get_client, get_current_scope
6+
from sentry_sdk import get_client
77
from sentry_sdk.utils import safe_repr
88

99

1010
def _capture_log(severity_text, severity_number, template, **kwargs):
1111
# type: (str, int, str, **Any) -> None
1212
client = get_client()
13-
scope = get_current_scope()
1413

1514
attrs = {
1615
"sentry.message.template": template,
@@ -36,7 +35,6 @@ def _capture_log(severity_text, severity_number, template, **kwargs):
3635

3736
# noinspection PyProtectedMember
3837
client._capture_experimental_log(
39-
scope,
4038
{
4139
"severity_text": severity_text,
4240
"severity_number": severity_number,

tests/test_logs.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,49 @@ def test_auto_flush_logs_after_100(sentry_init, capture_envelopes):
286286
raise AssertionError("200 logs were never flushed after five seconds")
287287

288288

289+
def test_user_attributes(sentry_init, capture_envelopes):
290+
"""User attributes are sent if send_default_pii is True."""
291+
sentry_init(send_default_pii=True, _experiments={"enable_logs": True})
292+
293+
sentry_sdk.set_user({"id": "1", "email": "[email protected]", "username": "test"})
294+
envelopes = capture_envelopes()
295+
296+
python_logger = logging.Logger("test-logger")
297+
python_logger.warning("Hello, world!")
298+
299+
get_client().flush()
300+
301+
logs = envelopes_to_logs(envelopes)
302+
(log,) = logs
303+
304+
# Check that all expected user attributes are present.
305+
assert log["attributes"].items() >= {
306+
("user.id", "1"),
307+
("user.email", "[email protected]"),
308+
("user.name", "test"),
309+
}
310+
311+
312+
def test_user_attributes_no_pii(sentry_init, capture_envelopes):
313+
"""Ensure no user attributes are sent if send_default_pii is False."""
314+
sentry_init(_experiments={"enable_logs": True})
315+
316+
sentry_sdk.set_user({"id": "1", "email": "[email protected]", "username": "test"})
317+
envelopes = capture_envelopes()
318+
319+
python_logger = logging.Logger("test-logger")
320+
python_logger.warning("Hello, world!")
321+
322+
get_client().flush()
323+
324+
logs = envelopes_to_logs(envelopes)
325+
326+
(log,) = logs
327+
assert "user.id" not in log["attributes"]
328+
assert "user.email" not in log["attributes"]
329+
assert "user.name" not in log["attributes"]
330+
331+
289332
@minimum_python_37
290333
def test_auto_flush_logs_after_5s(sentry_init, capture_envelopes):
291334
"""

0 commit comments

Comments
 (0)