diff --git a/MIGRATION_GUIDE.md b/MIGRATION_GUIDE.md index fce64bce33..204efae119 100644 --- a/MIGRATION_GUIDE.md +++ b/MIGRATION_GUIDE.md @@ -40,6 +40,9 @@ Looking to upgrade from Sentry SDK 2.x to 3.x? Here's a comprehensive list of wh - `MAX_PROFILE_DURATION_NS`, `PROFILE_MINIMUM_SAMPLES`, `Profile`, `Scheduler`, `ThreadScheduler`, `GeventScheduler`, `has_profiling_enabled`, `setup_profiler`, `teardown_profiler` are no longer accessible from `sentry_sdk.profiler`. They're still accessible from `sentry_sdk.profiler.transaction_profiler`. - `DEFAULT_SAMPLING_FREQUENCY`, `MAX_STACK_DEPTH`, `get_frame_name`, `extract_frame`, `extract_stack`, `frame_id` are no longer accessible from `sentry_sdk.profiler`. They're still accessible from `sentry_sdk.profiler.utils`. +#### Logs + +- `enable_logs` and `before_send_log` are now regular SDK options. Their original versions under `_experiments` have been removed. #### Integrations - Redis: In Redis pipeline spans there is no `span["data"]["redis.commands"]` that contains a dict `{"count": 3, "first_ten": ["cmd1", "cmd2", ...]}` but instead `span["data"]["redis.commands.count"]` (containing `3`) and `span["data"]["redis.commands.first_ten"]` (containing `["cmd1", "cmd2", ...]`). diff --git a/sentry_sdk/client.py b/sentry_sdk/client.py index 32cfb03579..ddddab488b 100644 --- a/sentry_sdk/client.py +++ b/sentry_sdk/client.py @@ -22,8 +22,6 @@ get_default_release, handle_in_app, logger, - get_before_send_log, - has_logs_enabled, ) from sentry_sdk.serializer import serialize from sentry_sdk.tracing import trace @@ -326,7 +324,7 @@ def _capture_envelope(envelope: Envelope) -> None: self.log_batcher = None - if has_logs_enabled(self.options): + if self.options.get("enable_logs") is True: from sentry_sdk._log_batcher import LogBatcher self.log_batcher = LogBatcher(capture_func=_capture_envelope) @@ -823,7 +821,7 @@ def capture_event( return return_value def _capture_experimental_log(self, log: Optional[Log]) -> None: - if not has_logs_enabled(self.options) or log is None: + if self.options.get("enable_logs") is not True or log is None: return current_scope = sentry_sdk.get_current_scope() @@ -878,7 +876,7 @@ def _capture_experimental_log(self, log: Optional[Log]) -> None: f'[Sentry Logs] [{log.get("severity_text")}] {log.get("body")}' ) - before_send_log = get_before_send_log(self.options) + before_send_log = self.options.get("before_send_log") if before_send_log is not None: log = before_send_log(log, {}) diff --git a/sentry_sdk/consts.py b/sentry_sdk/consts.py index a93f935849..c71cf21fa1 100644 --- a/sentry_sdk/consts.py +++ b/sentry_sdk/consts.py @@ -78,8 +78,6 @@ class CompressionAlgo(Enum): "transport_compression_algo": Optional[CompressionAlgo], "transport_num_pools": Optional[int], "transport_http2": Optional[bool], - "enable_logs": Optional[bool], - "before_send_log": Optional[Callable[[Log, Hint], Optional[Log]]], }, total=False, ) diff --git a/sentry_sdk/integrations/logging.py b/sentry_sdk/integrations/logging.py index c349c7d68a..5d03be1139 100644 --- a/sentry_sdk/integrations/logging.py +++ b/sentry_sdk/integrations/logging.py @@ -13,7 +13,6 @@ event_from_exception, current_stacktrace, capture_internal_exceptions, - has_logs_enabled, ) from sentry_sdk.integrations import Integration @@ -337,7 +336,7 @@ def emit(self, record: LogRecord) -> Any: if not client.is_active(): return - if not has_logs_enabled(client.options): + if client.options.get("enable_logs") is not True: return self._capture_log_from_record(client, record) diff --git a/sentry_sdk/integrations/loguru.py b/sentry_sdk/integrations/loguru.py index 241c8771e9..7570e7b744 100644 --- a/sentry_sdk/integrations/loguru.py +++ b/sentry_sdk/integrations/loguru.py @@ -9,7 +9,6 @@ _BaseHandler, ) from sentry_sdk.logger import _log_level_to_otel -from sentry_sdk.utils import has_logs_enabled from typing import TYPE_CHECKING @@ -148,7 +147,7 @@ def loguru_sentry_logs_handler(message: Message) -> None: if not client.is_active(): return - if not has_logs_enabled(client.options): + if client.options.get("enable_logs") is not True: return record = message.record diff --git a/sentry_sdk/utils.py b/sentry_sdk/utils.py index c1867bb821..3a44b25578 100644 --- a/sentry_sdk/utils.py +++ b/sentry_sdk/utils.py @@ -59,7 +59,7 @@ from gevent.hub import Hub as GeventHub from opentelemetry.util.types import AttributeValue - from sentry_sdk._types import Event, ExcInfo, Log, Hint + from sentry_sdk._types import Event, ExcInfo P = ParamSpec("P") R = TypeVar("R") @@ -1919,24 +1919,3 @@ def serialize_item(item): return json.dumps(serialized, default=str) except Exception: return str(data) - - -def has_logs_enabled(options): - # type: (Optional[dict[str, Any]]) -> bool - if options is None: - return False - - return bool( - options.get("enable_logs", False) - or options["_experiments"].get("enable_logs", False) - ) - - -def get_before_send_log(options): - # type: (Optional[dict[str, Any]]) -> Optional[Callable[[Log, Hint], Optional[Log]]] - if options is None: - return None - - return options.get("before_send_log") or options["_experiments"].get( - "before_send_log" - ) diff --git a/tests/test_logs.py b/tests/test_logs.py index 4a74afe125..1e9ae70172 100644 --- a/tests/test_logs.py +++ b/tests/test_logs.py @@ -111,22 +111,6 @@ def test_logs_basics(sentry_init, capture_envelopes): assert logs[5].get("severity_number") == 21 -@minimum_python_37 -def test_logs_experimental_option_still_works(sentry_init, capture_envelopes): - sentry_init(_experiments={"enable_logs": True}) - envelopes = capture_envelopes() - - sentry_sdk.logger.error("This is an error log...") - - get_client().flush() - - logs = envelopes_to_logs(envelopes) - assert len(logs) == 1 - - assert logs[0].get("severity_text") == "error" - assert logs[0].get("severity_number") == 17 - - @minimum_python_37 def test_logs_before_send_log(sentry_init, capture_envelopes): before_log_called = False @@ -174,36 +158,6 @@ def _before_log(record, hint): assert before_log_called is True -@minimum_python_37 -def test_logs_before_send_log_experimental_option_still_works( - sentry_init, capture_envelopes -): - before_log_called = False - - def _before_log(record, hint): - nonlocal before_log_called - before_log_called = True - - return record - - sentry_init( - enable_logs=True, - _experiments={ - "before_send_log": _before_log, - }, - ) - envelopes = capture_envelopes() - - sentry_sdk.logger.error("This is an error log...") - - get_client().flush() - logs = envelopes_to_logs(envelopes) - assert len(logs) == 1 - - assert logs[0]["severity_text"] == "error" - assert before_log_called is True - - @minimum_python_37 def test_logs_attributes(sentry_init, capture_envelopes): """