Tracing: don't record HTTP OPTIONS and HEAD transactions
Summary
This pull request makes it so HTTP OPTIONS and HEAD requests will not be sampled (traced).
Closes #1864. Based on the approach in https://github.com/getsentry/sentry-javascript/pull/5485
Changes
- Adds a check for Rack env http method in
capture_exceptionsrack app middleware. It felt like the right spot for this, instead of shoving another check inTransaction.set_initial_sample_decision, because it depends directly on an HTTP request, and thus is rather specific to Rack env. - Adds a changelog entry
- [x] This needs unit tests, but
capture_exceptions_spec.rbis scary. I'll write them up tomorrow.
Open questions
- @sl0thentr0py, @st0012, is this the right approach and the right place for this check?
- Another note: this approach ignores the incoming trace. If I'm reading the Javascript implementation correctly, it does the same, since the HTTP method check is the first one in the tracing middleware.
Codecov Report
Merging #2181 (d8891f3) into master (49a628e) will decrease coverage by
30.97%. The diff coverage is100.00%.
Additional details and impacted files
@@ Coverage Diff @@
## master #2181 +/- ##
===========================================
- Coverage 97.43% 66.47% -30.97%
===========================================
Files 102 100 -2
Lines 3817 3749 -68
===========================================
- Hits 3719 2492 -1227
- Misses 98 1257 +1159
| Components | Coverage Δ | |
|---|---|---|
| sentry-ruby | 55.75% <ø> (-42.40%) |
:arrow_down: |
| sentry-rails | 95.05% <100.00%> (+0.03%) |
:arrow_up: |
| sentry-sidekiq | 94.70% <ø> (ø) |
|
| sentry-resque | 93.65% <ø> (+1.58%) |
:arrow_up: |
| sentry-delayed_job | 94.44% <ø> (ø) |
|
| sentry-opentelemetry | 100.00% <ø> (ø) |
| Files | Coverage Δ | |
|---|---|---|
| sentry-rails/lib/sentry/rails/action_cable.rb | 100.00% <100.00%> (ø) |
|
| ...entry-rails/lib/sentry/rails/capture_exceptions.rb | 96.77% <100.00%> (+0.22%) |
:arrow_up: |
Added the unit tests, and moved the changelog entry to Unreleased.
Just passing by here — I'll clean this up today so we can get it merged! Sorry for the delay.
@sl0thentr0py, thank you for the guidance <3
I've pushed up the code, with two gotchas where I'd love your input and preference:
- I've duplicated the
IGNORED_HTTP_METHODSin the three classes that use it. In theory, we could just put it inmodule Sentry, and use it withSentry::IGNORED_HTTP_METHODS, but I think having it in the same file is a bit more readable. Want me to DRY it out? - I have not yet added the tests for the Rails and ActionCable pieces. I can get back to this, or we can ship this as is — up to you!
Hmmmmmmmm
1) Sentry::Client#event_from_transaction correct dynamic_sampling_context when head SDK
Failure/Error:
expect(event.dynamic_sampling_context).to eq({
"environment" => "development",
"public_key" => "12345",
"sample_rate" => "1.0",
"sampled" => "true",
"transaction" => "test transaction",
"trace_id" => transaction.trace_id
})
expected: {"environment"=>"development", "public_key"=>"12345", "sample_rate"=>"1.0", "sampled"=>"true", "trace_id"=>"f86126d5bfb14f5d8716c5459fe6495b", "transaction"=>"test transaction"}
got: {"environment"=>"development", "public_key"=>"12345", "sample_rate"=>"0.5", "sampled"=>"true", "trace_id"=>"f86126d5bfb14f5d8716c5459fe6495b", "transaction"=>"test transaction"}
(compared using ==)
Diff:
@@ -1,6 +1,6 @@
"environment" => "development",
"public_key" => "12345",
-"sample_rate" => "1.0",
+"sample_rate" => "0.5",
"sampled" => "true",
"trace_id" => "f86126d5bfb14f5d8716c5459fe6495b",
"transaction" => "test transaction",
# ./spec/sentry/client_spec.rb:183:in `block (3 levels) in <top (required)>'