Skip to content

Commit b00d0b5

Browse files
committed
Merge branch 'master' into potel-base
2 parents 146f101 + 3425d4c commit b00d0b5

File tree

8 files changed

+122
-41
lines changed

8 files changed

+122
-41
lines changed

sentry_sdk/client.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
get_default_release,
2323
handle_in_app,
2424
logger,
25+
get_before_send_log,
26+
has_logs_enabled,
2527
)
2628
from sentry_sdk.serializer import serialize
2729
from sentry_sdk.tracing import trace
@@ -322,9 +324,9 @@ def _capture_envelope(envelope: Envelope) -> None:
322324

323325
self.session_flusher = SessionFlusher(capture_func=_capture_envelope)
324326

325-
experiments = self.options.get("_experiments", {})
326327
self.log_batcher = None
327-
if experiments.get("enable_logs", False):
328+
329+
if has_logs_enabled(self.options):
328330
from sentry_sdk._log_batcher import LogBatcher
329331

330332
self.log_batcher = LogBatcher(capture_func=_capture_envelope)
@@ -820,9 +822,8 @@ def capture_event(
820822

821823
return return_value
822824

823-
def _capture_experimental_log(self, log: Log) -> None:
824-
logs_enabled = self.options["_experiments"].get("enable_logs", False)
825-
if not logs_enabled:
825+
def _capture_experimental_log(self, log: Optional[Log]) -> None:
826+
if not has_logs_enabled(self.options) or log is None:
826827
return
827828

828829
current_scope = sentry_sdk.get_current_scope()
@@ -877,9 +878,10 @@ def _capture_experimental_log(self, log: Log) -> None:
877878
f'[Sentry Logs] [{log.get("severity_text")}] {log.get("body")}'
878879
)
879880

880-
before_send_log = self.options["_experiments"].get("before_send_log")
881+
before_send_log = get_before_send_log(self.options)
881882
if before_send_log is not None:
882883
log = before_send_log(log, {})
884+
883885
if log is None:
884886
return
885887

sentry_sdk/consts.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -854,6 +854,8 @@ def __init__(
854854
custom_repr: Optional[Callable[..., Optional[str]]] = None,
855855
add_full_stack: bool = DEFAULT_ADD_FULL_STACK,
856856
max_stack_frames: Optional[int] = DEFAULT_MAX_STACK_FRAMES,
857+
enable_logs: bool = False,
858+
before_send_log: Optional[Callable[[Log, Hint], Optional[Log]]] = None,
857859
) -> None:
858860
"""Initialize the Sentry SDK with the given parameters. All parameters described here can be used in a call to `sentry_sdk.init()`.
859861
@@ -1240,6 +1242,14 @@ def __init__(
12401242
12411243
:param instrumenter:
12421244
1245+
:param enable_logs: Set `enable_logs` to True to enable the SDK to emit
1246+
Sentry logs. Defaults to False.
1247+
1248+
:param before_send_log: An optional function to modify or filter out logs
1249+
before they're sent to Sentry. Any modifications to the log in this
1250+
function will be retained. If the function returns None, the log will
1251+
not be sent to Sentry.
1252+
12431253
:param _experiments:
12441254
"""
12451255
pass

sentry_sdk/integrations/logging.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
event_from_exception,
1414
current_stacktrace,
1515
capture_internal_exceptions,
16+
has_logs_enabled,
1617
)
1718
from sentry_sdk.integrations import Integration
1819

@@ -336,7 +337,7 @@ def emit(self, record: LogRecord) -> Any:
336337
if not client.is_active():
337338
return
338339

339-
if not client.options["_experiments"].get("enable_logs", False):
340+
if not has_logs_enabled(client.options):
340341
return
341342

342343
self._capture_log_from_record(client, record)

sentry_sdk/integrations/loguru.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
_BaseHandler,
1010
)
1111
from sentry_sdk.logger import _log_level_to_otel
12+
from sentry_sdk.utils import has_logs_enabled
1213

1314
from typing import TYPE_CHECKING
1415

@@ -147,7 +148,7 @@ def loguru_sentry_logs_handler(message: Message) -> None:
147148
if not client.is_active():
148149
return
149150

150-
if not client.options["_experiments"].get("enable_logs", False):
151+
if not has_logs_enabled(client.options):
151152
return
152153

153154
record = message.record

sentry_sdk/utils.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@
5959
from gevent.hub import Hub as GeventHub
6060
from opentelemetry.util.types import AttributeValue
6161

62-
from sentry_sdk._types import Event, ExcInfo
62+
from sentry_sdk._types import Event, ExcInfo, Log, Hint
6363

6464
P = ParamSpec("P")
6565
R = TypeVar("R")
@@ -1919,3 +1919,24 @@ def serialize_item(item):
19191919
return json.dumps(serialized, default=str)
19201920
except Exception:
19211921
return str(data)
1922+
1923+
1924+
def has_logs_enabled(options):
1925+
# type: (Optional[dict[str, Any]]) -> bool
1926+
if options is None:
1927+
return False
1928+
1929+
return bool(
1930+
options.get("enable_logs", False)
1931+
or options["_experiments"].get("enable_logs", False)
1932+
)
1933+
1934+
1935+
def get_before_send_log(options):
1936+
# type: (Optional[dict[str, Any]]) -> Optional[Callable[[Log, Hint], Optional[Log]]]
1937+
if options is None:
1938+
return None
1939+
1940+
return options.get("before_send_log") or options["_experiments"].get(
1941+
"before_send_log"
1942+
)

tests/integrations/logging/test_logging.py

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ def test_sentry_logs_warning(sentry_init, capture_envelopes):
357357
"""
358358
The python logger module should create 'warn' sentry logs if the flag is on.
359359
"""
360-
sentry_init(_experiments={"enable_logs": True})
360+
sentry_init(enable_logs=True)
361361
envelopes = capture_envelopes()
362362

363363
python_logger = logging.Logger("test-logger")
@@ -382,7 +382,7 @@ def test_sentry_logs_debug(sentry_init, capture_envelopes):
382382
"""
383383
The python logger module should not create 'debug' sentry logs if the flag is on by default
384384
"""
385-
sentry_init(_experiments={"enable_logs": True})
385+
sentry_init(enable_logs=True)
386386
envelopes = capture_envelopes()
387387

388388
python_logger = logging.Logger("test-logger")
@@ -397,7 +397,7 @@ def test_no_log_infinite_loop(sentry_init, capture_envelopes):
397397
If 'debug' mode is true, and you set a low log level in the logging integration, there should be no infinite loops.
398398
"""
399399
sentry_init(
400-
_experiments={"enable_logs": True},
400+
enable_logs=True,
401401
integrations=[LoggingIntegration(sentry_logs_level=logging.DEBUG)],
402402
debug=True,
403403
)
@@ -414,7 +414,7 @@ def test_logging_errors(sentry_init, capture_envelopes):
414414
"""
415415
The python logger module should be able to log errors without erroring
416416
"""
417-
sentry_init(_experiments={"enable_logs": True})
417+
sentry_init(enable_logs=True)
418418
envelopes = capture_envelopes()
419419

420420
python_logger = logging.Logger("test-logger")
@@ -449,7 +449,7 @@ def test_log_strips_project_root(sentry_init, capture_envelopes):
449449
The python logger should strip project roots from the log record path
450450
"""
451451
sentry_init(
452-
_experiments={"enable_logs": True},
452+
enable_logs=True,
453453
project_root="/custom/test",
454454
)
455455
envelopes = capture_envelopes()
@@ -478,7 +478,7 @@ def test_logger_with_all_attributes(sentry_init, capture_envelopes):
478478
"""
479479
The python logger should be able to log all attributes, including extra data.
480480
"""
481-
sentry_init(_experiments={"enable_logs": True})
481+
sentry_init(enable_logs=True)
482482
envelopes = capture_envelopes()
483483

484484
python_logger = logging.Logger("test-logger")
@@ -551,7 +551,7 @@ def test_sentry_logs_named_parameters(sentry_init, capture_envelopes):
551551
"""
552552
The python logger module should capture named parameters from dictionary arguments in Sentry logs.
553553
"""
554-
sentry_init(_experiments={"enable_logs": True})
554+
sentry_init(enable_logs=True)
555555
envelopes = capture_envelopes()
556556

557557
python_logger = logging.Logger("test-logger")
@@ -596,7 +596,7 @@ def test_sentry_logs_named_parameters_complex_values(sentry_init, capture_envelo
596596
"""
597597
The python logger module should handle complex values in named parameters using safe_repr.
598598
"""
599-
sentry_init(_experiments={"enable_logs": True})
599+
sentry_init(enable_logs=True)
600600
envelopes = capture_envelopes()
601601

602602
python_logger = logging.Logger("test-logger")

tests/integrations/loguru/test_loguru.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ def test_sentry_logs_warning(
141141
uninstall_integration("loguru")
142142
request.addfinalizer(logger.remove)
143143

144-
sentry_init(_experiments={"enable_logs": True})
144+
sentry_init(enable_logs=True)
145145
envelopes = capture_envelopes()
146146

147147
logger.warning("this is {} a {}", "just", "template")
@@ -165,7 +165,7 @@ def test_sentry_logs_debug(
165165
uninstall_integration("loguru")
166166
request.addfinalizer(logger.remove)
167167

168-
sentry_init(_experiments={"enable_logs": True})
168+
sentry_init(enable_logs=True)
169169
envelopes = capture_envelopes()
170170

171171
logger.debug("this is %s a template %s", "1", "2")
@@ -182,7 +182,7 @@ def test_sentry_log_levels(
182182

183183
sentry_init(
184184
integrations=[LoguruIntegration(sentry_logs_level=LoggingLevels.SUCCESS)],
185-
_experiments={"enable_logs": True},
185+
enable_logs=True,
186186
)
187187
envelopes = capture_envelopes()
188188

@@ -216,7 +216,7 @@ def test_disable_loguru_logs(
216216

217217
sentry_init(
218218
integrations=[LoguruIntegration(sentry_logs_level=None)],
219-
_experiments={"enable_logs": True},
219+
enable_logs=True,
220220
)
221221
envelopes = capture_envelopes()
222222

@@ -267,7 +267,7 @@ def test_no_log_infinite_loop(
267267
request.addfinalizer(logger.remove)
268268

269269
sentry_init(
270-
_experiments={"enable_logs": True},
270+
enable_logs=True,
271271
integrations=[LoguruIntegration(sentry_logs_level=LoggingLevels.DEBUG)],
272272
debug=True,
273273
)
@@ -284,7 +284,7 @@ def test_logging_errors(sentry_init, capture_envelopes, uninstall_integration, r
284284
uninstall_integration("loguru")
285285
request.addfinalizer(logger.remove)
286286

287-
sentry_init(_experiments={"enable_logs": True})
287+
sentry_init(enable_logs=True)
288288
envelopes = capture_envelopes()
289289

290290
logger.error(Exception("test exc 1"))
@@ -313,7 +313,7 @@ def test_log_strips_project_root(
313313
request.addfinalizer(logger.remove)
314314

315315
sentry_init(
316-
_experiments={"enable_logs": True},
316+
enable_logs=True,
317317
project_root="/custom/test",
318318
)
319319
envelopes = capture_envelopes()
@@ -362,7 +362,7 @@ def test_log_keeps_full_path_if_not_in_project_root(
362362
request.addfinalizer(logger.remove)
363363

364364
sentry_init(
365-
_experiments={"enable_logs": True},
365+
enable_logs=True,
366366
project_root="/custom/test",
367367
)
368368
envelopes = capture_envelopes()
@@ -410,7 +410,7 @@ def test_logger_with_all_attributes(
410410
uninstall_integration("loguru")
411411
request.addfinalizer(logger.remove)
412412

413-
sentry_init(_experiments={"enable_logs": True})
413+
sentry_init(enable_logs=True)
414414
envelopes = capture_envelopes()
415415

416416
logger.warning("log #{}", 1)

0 commit comments

Comments
 (0)