Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add sample rate to baggage as well as trace in envelope header and flatten user #2135

Merged
merged 10 commits into from Jul 1, 2022

Conversation

adinauer
Copy link
Member

@adinauer adinauer commented Jun 24, 2022

📜 Description

Add sample rate to baggage header as well as trace in envelope header.
Flatten user into user_id and user_segment for trace in envelope header.

💡 Motivation and Context

To allow for dynamic sampling and align with docs / other SDKs: getsentry/develop#613

💚 How did you test it?

📝 Checklist

  • I reviewed the submitted code
  • I added tests to verify the changes
  • I updated the docs if needed
  • No breaking changes

🔮 Next steps

@adinauer
Copy link
Member Author

@AbhiPrasad @lforst @Lms24 can any of you please leave a review, once you feel the docs are ready to make sure this aligns?

@codecov-commenter
Copy link

codecov-commenter commented Jun 24, 2022

Codecov Report

Merging #2135 (1170cc7) into main (413862e) will decrease coverage by 0.01%.
The diff coverage is 85.80%.

@@             Coverage Diff              @@
##               main    #2135      +/-   ##
============================================
- Coverage     80.95%   80.94%   -0.02%     
- Complexity     3257     3290      +33     
============================================
  Files           231      233       +2     
  Lines         11964    12044      +80     
  Branches       1589     1594       +5     
============================================
+ Hits           9686     9749      +63     
- Misses         1698     1712      +14     
- Partials        580      583       +3     
Impacted Files Coverage Δ
...entry/src/main/java/io/sentry/NoOpTransaction.java 25.00% <0.00%> (-0.81%) ⬇️
sentry/src/main/java/io/sentry/OutboxSender.java 65.64% <64.70%> (-0.74%) ⬇️
...ry/src/main/java/io/sentry/TransactionContext.java 85.71% <71.42%> (-14.29%) ⬇️
...ain/java/io/sentry/protocol/SentryTransaction.java 88.97% <75.00%> (-0.28%) ⬇️
sentry/src/main/java/io/sentry/SpanContext.java 83.94% <76.92%> (-0.68%) ⬇️
...y/src/main/java/io/sentry/util/SampleRateUtil.java 88.88% <88.88%> (ø)
sentry/src/main/java/io/sentry/TraceContext.java 86.74% <90.90%> (-0.01%) ⬇️
sentry/src/main/java/io/sentry/Baggage.java 89.41% <100.00%> (+0.25%) ⬆️
sentry/src/main/java/io/sentry/Hub.java 76.41% <100.00%> (ø)
sentry/src/main/java/io/sentry/SentryOptions.java 82.03% <100.00%> (ø)
... and 5 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 413862e...1170cc7. Read the comment docs.

@@ -180,6 +180,10 @@ public void setTransaction(final @Nullable String transaction) {
set("sentry-transaction", transaction);
}

public void setSampleRate(final @Nullable String sampleRate) {
set("sentry-samplerate", sampleRate);
Copy link
Member

Choose a reason for hiding this comment

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

We decided to make baggage and envelope header key names identical (except for the sentry- prefix in baggage keys) so that we're able to just dump the DSC data into both transport mechanisms without any mapping. (Linking to the preview here for more details)

Therefore, we should change the snake case keys to underscores (like in the example below)

Suggested change
set("sentry-samplerate", sampleRate);
set("sentry-sample_rate", sampleRate);

Copy link
Member Author

Choose a reason for hiding this comment

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

Does that also mean

  • sentry-publickey becomes sentry-public_key
  • sentry-traceid becomes sentry_trace_id
  • sentry-userid becomes sentry-user_id
  • sentry-usersegment becomes sentry-user_segment

Copy link
Member

Choose a reason for hiding this comment

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

Yes, exactly

Copy link
Member

Choose a reason for hiding this comment

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

  • sentry-traceid becomes sentry_trace_id

It becomes sentry-trace_id, but that probably just was a typo ^^

Copy link
Member Author

@adinauer adinauer Jun 27, 2022

Choose a reason for hiding this comment

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

OK thanks, will update.
Yeah just a typo on the _ there.

@adinauer adinauer marked this pull request as ready for review June 29, 2022 08:25
@adinauer adinauer requested a review from romtsn as a code owner June 29, 2022 08:25
CHANGELOG.md Outdated
Comment on lines 9 to 13
## Unreleased

### Features

- Add sample rate to baggage as well as trace in envelope header and flatten user ([#2135](https://github.com/getsentry/sentry-java/pull/2135))
Copy link
Contributor

Choose a reason for hiding this comment

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

Merge main into the branch to fix the changelog.

private static @Nullable String getSegment(final @NotNull User user) {
final Map<String, String> others = user.getOthers();
if (others != null) {
return others.get("segment");
Copy link
Contributor

Choose a reason for hiding this comment

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

Should segment be a new field in the User protocol maybe?

Copy link
Member Author

Choose a reason for hiding this comment

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

JS seems to have it https://github.com/getsentry/sentry-javascript/blob/master/packages/types/src/user.ts while cocoa does not. Didn't check any other SDKs. Not sure what exactly this is used for / if it should be added. Can create a separate issue to track if you want.

Copy link
Contributor

Choose a reason for hiding this comment

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

Yes, please, but let's be sure that the approach with others works if not now.
Also, in this issue, we should upgrade the protocol https://develop.sentry.dev/sdk/event-payloads/user/ (adding the new field).

Copy link
Member Author

Choose a reason for hiding this comment

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

Maybe there's a confusion here. Retrieving segment from others is not new behaviour. It's been there before. See

https://github.com/getsentry/sentry-java/pull/2135/files#diff-9049646d5de9245eead3115d46537579192044823590d4e9ef02eb221a9ae43cL118-L125

Comment on lines 88 to 90
if (sampleRateAsDouble < 0.0 || sampleRateAsDouble > 1.0) {
return null;
}
Copy link
Contributor

Choose a reason for hiding this comment

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

Maybe we extract this logic from SentryOptions#setSampleRate and SentryOptions#setTracesSampleRate and reuse it as an util function.

Copy link
Member Author

Choose a reason for hiding this comment

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

setSampleRate has sampleRate > 1.0 || sampleRate <= 0.0 while setTracesSampleRate has tracesSampleRate > 1.0 || tracesSampleRate < 0.0. Can add a util but won't reuse in both.

Copy link
Contributor

Choose a reason for hiding this comment

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

Indeed, tracesSampleRate can be 0.0

Copy link
Member Author

Choose a reason for hiding this comment

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

Added SampleRateUtil in #2141

Comment on lines 92 to 94
DecimalFormat df =
new DecimalFormat("#.################", DecimalFormatSymbols.getInstance(Locale.US));
return df.format(sampleRateAsDouble);
Copy link
Contributor

Choose a reason for hiding this comment

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

We should avoid US locale and use Locale.ROOT instead, some custom OS versions might not have the US locale.
Why don't we just transform the Double to String and send it as it is?

Copy link
Member Author

Choose a reason for hiding this comment

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

Because we don't want exponent formatting. 0.00000021.toString() would become 2.1E-7 which we don't want.
Can replace the locale.

Copy link
Contributor

Choose a reason for hiding this comment

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

Is the spec defining the number of max digits? because ################ can lead to a different value, not sure if this would round or not.

Copy link
Member Author

Choose a reason for hiding this comment

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

It would round on the last digit. Yes we're aligning with JS on the max digits here.

Copy link
Member Author

@adinauer adinauer Jun 29, 2022

Choose a reason for hiding this comment

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

Updated the locale usage in #2141


return baggage;
}

public static final class TraceContextUser implements JsonUnknown, JsonSerializable {
Copy link
Contributor

Choose a reason for hiding this comment

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

Would that be a breaking change if people is upgrading SDKs from X to Y? how does the ser/deser behave if you're reading a JSON with the older structure.

Copy link
Member Author

@adinauer adinauer Jun 29, 2022

Choose a reason for hiding this comment

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

Yes, updated the code to parse from legacy JSON in #2141

adinauer and others added 4 commits June 30, 2022 12:16
* Commit tests

* Add sample rate from traces sampler to DSC

* Do not replace null with true/false

* Restore sample rate in OutboxSender

* Remove fallback for sampling decision from TraceContext

* Remove sample rate fallback from TracesSamplingDecision

* Test more envelope header trace fields for OutboxSender

* CR changes
…y/sentry-java into feat/add-sample-rate-to-baggage
Copy link
Member

@romtsn romtsn left a comment

Choose a reason for hiding this comment

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

LGTM!

@adinauer adinauer merged commit fa3886f into main Jul 1, 2022
@adinauer adinauer deleted the feat/add-sample-rate-to-baggage branch July 1, 2022 13:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants