sentry-ruby icon indicating copy to clipboard operation
sentry-ruby copied to clipboard

Dynamic Sampling Context Continuation / Baggage

Open sl0thentr0py opened this issue 3 years ago • 4 comments

This PR adds support for the first part of our Dynamic Sampling product, i.e.

  • parsing incoming W3C Baggage headers and adding them as a Baggage object on the transaction
  • adding this baggage header to other outgoing HTTP requests in our net/http patch
  • converting the sentry-* items in the baggage to a DSC (Dynamic Sampling Context) and attaching them to outgoing envelope headers in the trace field

closes #1835

sl0thentr0py avatar Aug 16 '22 15:08 sl0thentr0py

Codecov Report

Base: 98.38% // Head: 98.46% // Increases project coverage by +0.08% :tada:

Coverage data is based on head (a558764) compared to base (d83b29c). Patch coverage: 99.75% of modified lines in pull request are covered.

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #1869      +/-   ##
==========================================
+ Coverage   98.38%   98.46%   +0.08%     
==========================================
  Files         148      150       +2     
  Lines        8893     9240     +347     
==========================================
+ Hits         8749     9098     +349     
+ Misses        144      142       -2     
Impacted Files Coverage Δ
sentry-ruby/lib/sentry/event.rb 98.76% <ø> (ø)
sentry-ruby/lib/sentry/rake.rb 65.00% <0.00%> (ø)
...entry-delayed_job/lib/sentry/delayed_job/plugin.rb 100.00% <100.00%> (ø)
sentry-delayed_job/spec/sentry/delayed_job_spec.rb 100.00% <100.00%> (ø)
sentry-rails/lib/sentry/rails/action_cable.rb 100.00% <100.00%> (ø)
sentry-rails/lib/sentry/rails/active_job.rb 100.00% <100.00%> (ø)
...entry-rails/lib/sentry/rails/capture_exceptions.rb 100.00% <100.00%> (+3.57%) :arrow_up:
...y-rails/lib/sentry/rails/controller_transaction.rb 100.00% <100.00%> (ø)
...entry-rails/spec/sentry/rails/action_cable_spec.rb 100.00% <100.00%> (ø)
sentry-rails/spec/sentry/rails/activejob_spec.rb 99.38% <100.00%> (+<0.01%) :arrow_up:
... and 28 more

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

:umbrella: View full report at Codecov.
:loudspeaker: Do you have feedback about the report comment? Let us know in this issue.

codecov-commenter avatar Aug 17 '22 13:08 codecov-commenter

@st0012 for releasing this, we need 2 more PRs, so maybe let's merge them all together. They're independent as features, but should go out together ideally.

  • head SDK baggage/DSC creation - https://github.com/getsentry/sentry-ruby/issues/1836
  • add transaction_info.source annotations - https://github.com/getsentry/sentry-ruby/issues/1866

sl0thentr0py avatar Sep 15 '22 09:09 sl0thentr0py

I'm making this a draft again so we don't merge it accidentally

sl0thentr0py avatar Sep 15 '22 12:09 sl0thentr0py

@st0012 after some discussion, we decided to remove all third party handling since that was mostly unused logic.

sl0thentr0py avatar Sep 19 '22 12:09 sl0thentr0py

E2E testing documentation

JS as head SDK / continuation

relevant frontend request headers (baggage)

GET /ds/items HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: http://localhost:3000/ds_js_head
sentry-trace: 9821e65c92894d60ab9b05e69d84e218-994f1602ff45d966-1
baggage: sentry-environment=development,sentry-release=foobar,sentry-public_key=d16ae2d36f9249849c7964e9a3a8a608,sentry-trace_id=9821e65c92894d60ab9b05e69d84e218,sentry-sample_rate=1

Outgoing trace envelope header (dynamic sampling context)

[5] pry(#<Sentry::HTTPTransport>)> envelope.headers[:trace]
=> {"environment"=>"development", "release"=>"foobar", "public_key"=>"d16ae2d36f9249849c7964e9a3a8a608", "trace_id"=>"9821e65c92894d60ab9b05e69d84e218", "sample_rate"=>"1"}

correct source annotation in transaction_info

[8] pry(#<Sentry::HTTPTransport>)> envelope.items.first.payload[:transaction_info]
=> {:source=>:view}

Backend-backend propagation of baggage


Rails as head SDK

meta tags on rails template

<meta name="sentry-trace" content="43906b36c4e84d97b310908dfa323ca0-534d009e7d378188-1">
<meta name="baggage" content="sentry-trace_id=43906b36c4e84d97b310908dfa323ca0,sentry-sample_rate=1.0,sentry-environment=development,sentry-release=test-sessions-2022-09-28+14%3A34%3A02+UTC,sentry-public_key=2fb45f003d054a7ea47feb45898f7649">

outgoing request from browser continues that trace

GET /ds/items HTTP/1.1
Host: localhost:3000
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:105.0) Gecko/20100101 Firefox/105.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: http://localhost:3000/ds_rails_head
sentry-trace: 43906b36c4e84d97b310908dfa323ca0-adc949650e49f6da-1
baggage: sentry-trace_id=43906b36c4e84d97b310908dfa323ca0,sentry-sample_rate=1.0,sentry-environment=development,sentry-release=test-sessions-2022-09-28%2B14%3A34%3A02%2BUTC,sentry-public_key=2fb45f003d054a7ea47feb45898f7649

envelope from browser transaction has correct trace header

"trace":{"trace_id":"43906b36c4e84d97b310908dfa323ca0","sample_rate":"1.0","environment":"development","release":"test-sessions-2022-09-28+14:34:02+UTC","public_key":"2fb45f003d054a7ea47feb45898f7649"}}

final flask request also has correct baggage header

sentry-trace_id=43906b36c4e84d97b310908dfa323ca0,sentry-sample_rate=1.0,sentry-environment=development,sentry-release=test-sessions-2022-09-28%2B14%3A34%3A02%2BUTC,sentry-public_key=2fb45f003d054a7ea47feb45898f7649

sl0thentr0py avatar Sep 28 '22 13:09 sl0thentr0py

ok @st0012 I've tested this E2E properly in all scenarios, everything seems to work 🎉

sl0thentr0py avatar Sep 28 '22 14:09 sl0thentr0py

@sl0thentr0py Should we make this PR ready for review?

st0012 avatar Sep 30 '22 09:09 st0012