Skip to content

Next Python SDK major - #5005

Draft
sentrivana wants to merge 125 commits into
masterfrom
major/3.0
Draft

Next Python SDK major#5005
sentrivana wants to merge 125 commits into
masterfrom
major/3.0

Conversation

@sentrivana

@sentrivana sentrivana commented Oct 24, 2025

Copy link
Copy Markdown
Contributor

We're preparing our next major on this branch.

The project is tracked in Linear. If you don't have access, we'll try to tag issues belonging to the project with the SDK 3.0 label on GitHub so that you can follow along.

Notable changes

  • Transaction-based tracing will be removed. Span streaming will be the default tracing model.
  • Python 3.6 support will be removed.

Context

You might have read this announcement about us discontinuing work on a 3.0. This is referring to the work done on the potel-base branch, which included two types of changes: a huge refactor of our tracing code on the one hand, and various unrelated changes, improvements and fixes on the other. We're dropping the huge refactor part, and only porting the rest, to a new branch and eventually a new 3.0 release.

Changes

@codecov

codecov Bot commented Oct 24, 2025

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 83.76%. Comparing base (14aff96) to head (d864ba0).
⚠️ Report is 4 commits behind head on master.
✅ All tests successful. No failed tests found.

Additional details and impacted files
@@             Coverage Diff             @@
##           master    #5005       +/-   ##
===========================================
+ Coverage   70.55%   83.76%   +13.21%     
===========================================
  Files         180      180               
  Lines       18077    18080        +3     
  Branches     3008     3009        +1     
===========================================
+ Hits        12754    15145     +2391     
+ Misses       4432     1943     -2489     
- Partials      891      992      +101     
Files with missing lines Coverage Δ
sentry_sdk/integrations/__init__.py 88.42% <100.00%> (+0.37%) ⬆️

... and 61 files with indirect coverage changes

@github-actions

github-actions Bot commented Mar 19, 2026

Copy link
Copy Markdown
Contributor

Codecov Results 📊

111241 passed | ⏭️ 5428 skipped | Total: 116669 | Pass Rate: 95.35% | Execution Time: 375m 5s

📊 Comparison with Base Branch

Metric Change
Total Tests 📉 -8714
Passed Tests 📉 -7410
Failed Tests
Skipped Tests 📉 -1304

All tests are passing successfully.

✅ Patch coverage is 90.64%. Project has 2228 uncovered lines.
✅ Project coverage is 90.64%. Comparing base (base) to head (head).

Coverage diff
@@            Coverage Diff             @@
##          main       #PR       +/-##
==========================================
+ Coverage    90.23%    90.64%    +0.41%
==========================================
  Files          193       185        -8
  Lines        25482     23811     -1671
  Branches      9384      8788      -596
==========================================
+ Hits         22994     21583     -1411
- Misses        2488      2228      -260
- Partials      1431      1362       -69

Generated by Codecov Action

@github-actions

github-actions Bot commented Mar 19, 2026

Copy link
Copy Markdown
Contributor

Semver Impact of This PR

None (no version bump detected)

📋 Changelog Preview

This is how your changes will appear in the changelog.
Entries from this PR are highlighted with a left border (blockquote style).


New Features ✨

  • (logging) Separate ignore lists for events/breadcrumbs and sentry logs by sl0thentr0py in #5698

Bug Fixes 🐛

Anthropic

  • Set exception info on streaming span when applicable by alexander-alderman-webb in #5683
  • Patch AsyncStream.close() and AsyncMessageStream.close() to finish spans by alexander-alderman-webb in #5675
  • Patch Stream.close() and MessageStream.close() to finish spans by alexander-alderman-webb in #5674

Documentation 📚

  • Add note on AI PRs to CONTRIBUTING.md by sentrivana in #5696

Internal Changes 🔧

  • Add -latest alias for each integration test suite by sentrivana in #5706
  • Use date-based branch names for toxgen PRs by sentrivana in #5704
  • 🤖 Update test matrix with new releases (03/19) by github-actions in #5703
  • Add client report tests for span streaming by sentrivana in #5677

Other

  • Next Python SDK major by sentrivana in #5005
  • Update CHANGELOG.md by sentrivana in #5685

🤖 This preview updates automatically when you update the PR.

Comment thread sentry_sdk/consts.py
sentrivana and others added 4 commits July 28, 2026 11:47
Add `UnraisablehookIntegration` to the default integrations list.
Stop raising exceptions `from None` in the ASGI and asyncio integrations.

Closes #5624
Remove everything hub related, including all sorts of compatibility
shims around hubs/scopes.

Also remove deprecated session methods.

`configure_scope` and `push_scope` removal coming in a future PR.

#### Issues
Closes #5001
The integration requires additional configuration which should be
intentional on the user's part.

#### Issues
Closes #4993
- Remove everything in `integrations/opentelemetry`
(`SentrySpanProcessor`, `SentryPropagator`, etc.)
- Remove associated test files and CI config
- Move old propagator functions and consts that we were using in
`OTLPIntegration` to the OTLP propagator directly
- Remove `instrumenter`

Note: `NoOpSpan` was not removed because it makes mypy blow up. Not
worth the effort as we'll anyway get rid of it when dropping transaction
based tracing.

#### Issues
Closes #6932
Comment thread sentry_sdk/integrations/otlp.py
### Description
The API is deprecated and slated for removal in 3.0.

#### Issues
Closes #5019

#### Reminders
- Please add tests to validate your changes, and lint your code using
`uv run ruff`.
- Add GH Issue ID _&_ Linear ID (if applicable)
- PR title should use [conventional
commit](https://develop.sentry.dev/engineering-practices/commit-messages/#type)
style (`feat:`, `fix:`, `ref:`, `meta:`)
- For external contributors:
[CONTRIBUTING.md](https://github.com/getsentry/sentry-python/blob/master/CONTRIBUTING.md),
[Sentry SDK development docs](https://develop.sentry.dev/sdk/), [Discord
community](https://discord.gg/Ww9hbqr)
### Description
Remove the deprecated API.

#### Issues
Closes #5018
…new major (#6948)

### Description
When `failed_request_status_codes` was first introduced, it accepted a
different format. The format was then changed, while the old format was
deprecated. Drop support for the old format now.

#### Issues
Closes #5017
### Description
Most of the entries in our extras list serve as a way to
communicate/enforce the lower boundary of the respective framework that
we support. This creates a parallel system to the version checks we
already have in each integration.

Some extras, however, define extra dependencies or specific extras that
are required for an integration to work correctly (e.g. the Flask
integration needs `blinker` to work properly). In that case, keep the
extra.

#### Issues
Closes #6259
Comment thread tests/integrations/django/asgi/test_asgi.py
Comment thread sentry_sdk/integrations/otlp.py
Comment thread sentry_sdk/integrations/aiomysql.py
Comment thread sentry_sdk/integrations/aiomysql.py
Comment thread MIGRATION_GUIDE.md Outdated
Comment thread sentry_sdk/integrations/otlp.py
Comment thread sentry_sdk/integrations/pyramid.py
Comment thread sentry_sdk/integrations/strawberry.py
Comment thread tests/integrations/aiomysql/test_aiomysql.py
Comment thread tests/integrations/aiomysql/test_aiomysql.py
Comment thread tests/integrations/aiomysql/test_aiomysql.py
Comment thread sentry_sdk/integrations/stdlib.py
Comment thread sentry_sdk/integrations/stdlib.py
Comment thread sentry_sdk/integrations/__init__.py
Comment thread sentry_sdk/integrations/threading.py
Comment thread tests/integrations/bottle/test_bottle.py
Comment thread tests/integrations/httpx/test_httpx.py
### Description
The timeout in the AWS Lambda (and GCP, by extension) timeout warning is
wrong, remove it and slightly rephrase.

This is on the new major branch since it breaks grouping. (Even just
removing the number from the original message, without modifying it
further, causes regrouping. Since that's the case I took the liberty to
update the message a bit more.)

Original POTel PR: #4671

#### Issues
Closes
https://linear.app/getsentry/issue/PY-1937/change-aws-lambda-timeout-message

#### Reminders
- Please add tests to validate your changes, and lint your code using
`uv run ruff`.
- Add GH Issue ID _&_ Linear ID (if applicable)
- PR title should use [conventional
commit](https://develop.sentry.dev/engineering-practices/commit-messages/#type)
style (`feat:`, `fix:`, `ref:`, `meta:`)
- For external contributors:
[CONTRIBUTING.md](https://github.com/getsentry/sentry-python/blob/master/CONTRIBUTING.md),
[Sentry SDK development docs](https://develop.sentry.dev/sdk/), [Discord
community](https://discord.gg/Ww9hbqr)
sentrivana added a commit that referenced this pull request Aug 26, 2026
Originally raised by a bot
[here](#5005 (comment)):
the `parse_version` function parses version strings as is (e.g. 3.1
becomes `(3, 1)`). We use these parsed version tuples in integrations to
compare the installed version against the minimum (defined in
`integrations/__init__.py`). The minimum versions are often three-part,
e.g. `(3, 1, 0)`.

This means that we can mistakenly consider a valid version to be below
the minimum, because in pure tuple terms, `(3, 1) < (3, 1, 0)` is true.

This can also happen in reverse (package version has three parts, while
our min version boundary has two).

In this PR, we make the internal version comparison work as expected
regardless of mismatches in the length of the version strings/tuples.
Comment thread sentry_sdk/integrations/typer.py
Comment thread sentry_sdk/_init_implementation.py
Comment on lines +109 to 123
with sentry_sdk.traces.start_span(
name="unknown arq task",
status="ok",
op=OP.QUEUE_TASK_ARQ,
source=TransactionSource.TASK,
origin=ArqIntegration.origin,
)

with sentry_sdk.start_transaction(transaction) as span:
attributes={
"sentry.op": OP.QUEUE_TASK_ARQ,
"sentry.origin": ArqIntegration.origin,
"sentry.segment.name.source": SegmentNameSource.TASK,
SPANDATA.MESSAGING_MESSAGE_ID: job_id,
},
parent_span=None,
) as span:
if self.queue_name is not None:
span.set_data(SPANDATA.MESSAGING_DESTINATION_NAME, self.queue_name)
span.set_attribute(
SPANDATA.MESSAGING_DESTINATION_NAME, self.queue_name
)
return await old_run_job(self, job_id, score)

@sentry-warden sentry-warden Bot Aug 26, 2026

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Failed ARQ task spans keep status ok under span streaming

After switching run_job to streamed spans, _capture_exception still only sets status via scope.transaction, which is always None in streaming mode—so failed task segments stay ok unless the exception happens to escape ARQ. Update _capture_exception to set scope.streamed_span.status (as Celery does) and assert error status in the failure tests.

Evidence
  • This hunk makes traces.start_span(..., parent_span=None) the only task path in _sentry_run_job.
  • _capture_exception still does if scope.transaction is not None: scope.transaction.set_status(...).
  • In streaming mode, Scope.transaction returns None, so that status update is a no-op.
  • ARQ job failures are typically handled inside Worker.run_job, so the streamed span __exit__ often never sees the exception to mark error itself.
  • Celery already maps this via scope.streamed_span.status; ARQ tests assert failure events but not task-span status.

Identified by Warden · code-review, find-bugs · LZ3-SDG

Comment thread sentry_sdk/integrations/asgi.py
Comment thread sentry_sdk/integrations/strawberry.py
Comment thread sentry_sdk/integrations/redis/redis.py
Comment thread sentry_sdk/integrations/stdlib.py
### Description
Getting rid of custom APIs.

`update_current_span` never worked with span streaming anyway.


#### Issues
Part of https://linear.app/getsentry/issue/PY-2623/drop-custom-apis
Part of #6894

#### Reminders
- Please add tests to validate your changes, and lint your code using
`uv run ruff`.
- Add GH Issue ID _&_ Linear ID (if applicable)
- PR title should use [conventional
commit](https://develop.sentry.dev/engineering-practices/commit-messages/#type)
style (`feat:`, `fix:`, `ref:`, `meta:`)
- For external contributors:
[CONTRIBUTING.md](https://github.com/getsentry/sentry-python/blob/master/CONTRIBUTING.md),
[Sentry SDK development docs](https://develop.sentry.dev/sdk/), [Discord
community](https://discord.gg/Ww9hbqr)
### Description
Many of the `set_tag` calls were only present in non-span-streaming
branches, which will be completely removed anyway, and we've already
migrated those tags, if applicable, to span attributes in the scope of
span first.


#### Issues
Closes
https://linear.app/getsentry/issue/PY-1940/remove-tags-auto-set-by-the-sdk
### Description
Get the logging integration into shape now that Sentry Logs is a
first-class feature. The idea is to make Logs the primary feature the
integration offers, with capturing events an optional add-on.

High-level overview of the changes:
- The integration has to be **enabled explicitly** by the user. It's not
auto-enabled anymore.
- **Sentry logs related options and features get more generic sounding
names**.
- For instance, `level` (before: `sentry_logs_level`), `ignore_logger`
(before: `ignore_logger_for_sentry_logs`) now set the Sentry logs level
and Sentry logs denylist, respectively.
- Existing secondary features with previously generic names get
specialized names (`level` -> `breadcrumb_level`, `ignore_logger` ->
`ignore_logger_for_events`).
- **Capturing Sentry logs is on by default** when the integration is
enabled.
- **Event capture is off by default**, but can be turned on via an
option. Breadcrumb capture is still on by default.
- The **`capture_sentry_logs` option is gone completely**. Since logs
instrumentation is now on by default, and the `level` option exists, it
was superfluous. Capturing logs can still be opted out of by setting
`level=None`.

Collateral:
- Updated unrelated tests that were implicitly relying on default
behavior of the logging integration

#### Issues
Closes #7246
Closes
https://linear.app/getsentry/issue/PY-2739/update-logging-integration
### Description
Get the Loguru integration into shape now that Sentry Logs is a
first-class feature. The idea is to make Logs the primary feature the
integration offers, with capturing events an optional add-on.

High-level overview of the changes:
- The integration has to be **enabled explicitly** by the user. It's not
auto-enabled anymore.
- **Sentry logs related options and features get more generic sounding
names**.
- For instance, `level` (before: `sentry_logs_level`) now sets the
Sentry logs level.
- Existing secondary features with previously generic names get
specialized names (`level` -> `breadcrumb_level`).
- **Capturing Sentry logs is on by default** when the integration is
enabled.
- **Event capture is off by default**, but can be turned on via an
option. Breadcrumb capture is still on by default.
- The **`capture_sentry_logs` option is gone completely**. Since logs
instrumentation is now on by default, and the `level` option exists, it
was superfluous. Capturing logs can still be opted out of by setting
`level=None`.

#### Issues
Closes #7247
Closes
https://linear.app/getsentry/issue/PY-2740/update-loguru-integration
Comment thread MIGRATION_GUIDE.md Outdated
Comment thread MIGRATION_GUIDE.md Outdated
Comment thread sentry_sdk/consts.py
Changes:
- remove deprecated `max_spans` option of `LangchainIntegration`
- remove deprecated `sentry_sdk.init()` context manager
- remove deprecated `configure_debug_hub`
- remove deprecated `Baggage.from_options()`
- remove deprecated `Transport.capture_event()`
- remove deprecated `FunctionTransport`
- the `Scope.trace_propagation_meta` function no longer accepts a `span`
as argument
- remove deprecated direct assignment to `Scope.level`
- remove deprecated direct assignment to `Scope.user`
- remove deprecated `Scope.iter_headers`

Closes https://linear.app/getsentry/issue/PY-1935/drop-deprecated-stuff
…ng` for everything else) (#7268)

- Add a helper to use for deprecation warnings, specifically, that uses
`warnings.warn()`
- For everything but deprecation warnings, use `logger.warning()`

Closes
https://linear.app/getsentry/issue/PY-1934/use-warningswarn-for-deprecations-and-loggerwarning-for-everything
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants