feat: Add strict trace continuation support#5136
Conversation
Semver Impact of This PR🟡 Minor (new features) 📋 Changelog PreviewThis is how your changes will appear in the changelog. New Features ✨
🤖 This preview updates automatically when you update the PR. |
|
Performance metrics 🚀
|
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 91bb874 | 314.47 ms | 440.00 ms | 125.53 ms |
| dba088c | 333.98 ms | 381.16 ms | 47.18 ms |
| d15471f | 310.66 ms | 368.19 ms | 57.53 ms |
| bbc35bb | 298.53 ms | 372.17 ms | 73.64 ms |
| d15471f | 307.28 ms | 381.85 ms | 74.57 ms |
| ad8da22 | 362.98 ms | 453.94 ms | 90.96 ms |
| cf708bd | 408.35 ms | 458.98 ms | 50.63 ms |
| 96449e8 | 361.30 ms | 423.39 ms | 62.09 ms |
| 27d7cf8 | 309.43 ms | 364.27 ms | 54.85 ms |
| 91bb874 | 311.00 ms | 363.47 ms | 52.47 ms |
App size
| Revision | Plain | With Sentry | Diff |
|---|---|---|---|
| 91bb874 | 1.58 MiB | 2.13 MiB | 559.07 KiB |
| dba088c | 1.58 MiB | 2.13 MiB | 558.99 KiB |
| d15471f | 1.58 MiB | 2.13 MiB | 559.54 KiB |
| bbc35bb | 1.58 MiB | 2.12 MiB | 553.01 KiB |
| d15471f | 1.58 MiB | 2.13 MiB | 559.54 KiB |
| ad8da22 | 1.58 MiB | 2.29 MiB | 719.83 KiB |
| cf708bd | 1.58 MiB | 2.11 MiB | 539.71 KiB |
| 96449e8 | 1.58 MiB | 2.11 MiB | 539.35 KiB |
| 27d7cf8 | 1.58 MiB | 2.12 MiB | 549.42 KiB |
| 91bb874 | 1.58 MiB | 2.13 MiB | 559.07 KiB |
| fun `strict=false, mismatched orgs - starts new trace`() { | ||
| val options = makeOptions(dsnOrgId = "2", strict = false) | ||
| val pc = | ||
| PropagationContext.fromHeaders( |
There was a problem hiding this comment.
invocations expect a wrong signature; in the future we should make sure to compile test sources and tests pass
| final @NotNull ILogger logger, | ||
| final @Nullable String sentryTraceHeaderString, | ||
| final @Nullable List<String> baggageHeaderStrings) { | ||
| return fromHeaders(logger, sentryTraceHeaderString, baggageHeaderStrings, null); |
There was a problem hiding this comment.
We could use Sentry.getCurrentScopes().getOptions() here to default to the current options.
The better fix would probably be to replace call sites with passing in options and remove this overload.
Since PropagationContext is marked internal, we're free to change / replace / remove methods.
| } | ||
| } | ||
|
|
||
| public static @NotNull PropagationContext fromHeaders( |
There was a problem hiding this comment.
This overload isn't covered. This means our OpenTelemetry integrations would not check orgId.
| * When false, a mismatch between present org IDs will still start a new trace, but missing org | ||
| * IDs on either side are tolerated. | ||
| */ | ||
| private boolean strictTraceContinuation = false; |
There was a problem hiding this comment.
We should add both of these options to ExternalOptions and ManifestMetadataReader as well.
There's no tests for options.
We have https://github.com/getsentry/sentry-java/blob/main/.cursor/rules/options.mdc which explains details around options in this SDK.
| private final @Nullable String secretKey; | ||
| private final @NotNull String publicKey; | ||
| private final @NotNull URI sentryUri; | ||
| private @Nullable String orgId; |
| return orgId; | ||
| } | ||
|
|
||
| void setOrgId(final @Nullable String orgId) { |
|
|
||
| ### Features | ||
|
|
||
| - Add strict trace continuation support ([#5136](https://github.com/getsentry/sentry-java/pull/5136)) |
There was a problem hiding this comment.
We should add some description here for customers to explain what this means for them.
We should also mention the new options.
Extract org ID from DSN host, add strictTraceContinuation and orgId options, propagate sentry-org_id in baggage, and validate incoming traces per the decision matrix. Closes #5128
Add public API declarations for new org ID and strict trace continuation methods on Baggage, PropagationContext, and SentryOptions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Make Dsn.orgId final, remove unnecessary setter - Fix test signatures to use List<String> for baggage headers - Add strictTraceContinuation and orgId to ExternalOptions and merge() - Add options to ManifestMetadataReader for Android manifest config - Use Sentry.getCurrentScopes().getOptions() in legacy fromHeaders overload - Improve CHANGELOG description with details about new options - Update API surface file for ExternalOptions changes Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add comment to empty catch block in PropagationContext to satisfy -Werror - Add setOrgId setter to Dsn class (remove final modifier on orgId field) to support the existing test for org ID override Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
457e177 to
e30064c
Compare
Summary
o123.ingest.sentry.io→"123")strictTraceContinuation(boolean, default false) andorgId(String) options toSentryOptionssentry-org_idin baggage / Dynamic Sampling ContextDecision Matrix
Changes
Dsn.java— org ID extraction from host using^o(\d+)\.regexSentryOptions.java—strictTraceContinuation,orgId, andgetEffectiveOrgId()Baggage.java—ORG_IDDSCKey, getter/setter, population insetValuesFromTransaction/setValuesFromScope/fromEventPropagationContext.java—shouldContinueTrace()logic infromHeaders()Scopes.java— pass options tofromHeaders()Test plan
Closes #5128
🤖 Generated with Claude Code