From 0afa9a316ab0bddfe21c6faa0103ae9f4f64a625 Mon Sep 17 00:00:00 2001 From: Neel Shah Date: Wed, 16 Aug 2023 13:34:17 +0200 Subject: [PATCH] Add new unified get_trace_propagation_headers and use in net/http --- sentry-ruby/lib/sentry-ruby.rb | 9 +++++++++ sentry-ruby/lib/sentry/client.rb | 6 +++++- sentry-ruby/lib/sentry/hub.rb | 9 +++++++++ sentry-ruby/lib/sentry/net/http.rb | 12 +++--------- sentry-ruby/lib/sentry/propagation_context.rb | 2 +- sentry-ruby/spec/sentry/net/http_spec.rb | 19 +------------------ 6 files changed, 28 insertions(+), 29 deletions(-) diff --git a/sentry-ruby/lib/sentry-ruby.rb b/sentry-ruby/lib/sentry-ruby.rb index 7a56054ee..03edc0a08 100644 --- a/sentry-ruby/lib/sentry-ruby.rb +++ b/sentry-ruby/lib/sentry-ruby.rb @@ -507,6 +507,15 @@ def get_baggage get_current_hub.get_baggage end + # Returns the a Hash containing sentry-trace and baggage. + # Can be either from the currently active span or the propagation context. + # + # @return [Hash, nil] + def get_trace_propagation_headers + return nil unless initialized? + get_current_hub.get_trace_propagation_headers + end + ##### Helpers ##### # @!visibility private diff --git a/sentry-ruby/lib/sentry/client.rb b/sentry-ruby/lib/sentry/client.rb index 3d8c0dba6..80f1165c8 100644 --- a/sentry-ruby/lib/sentry/client.rb +++ b/sentry-ruby/lib/sentry/client.rb @@ -148,6 +148,8 @@ def send_event(event, hint = nil) raise end + # @deprecated use Sentry.get_traceparent instead. + # # Generates a Sentry trace for distribted tracing from the given Span. # Returns `nil` if `config.propagate_traces` is `false`. # @param span [Span] the span to generate trace from. @@ -160,7 +162,9 @@ def generate_sentry_trace(span) trace end - # Generates a W3C Baggage header for distribted tracing from the given Span. + # @deprecated Use Sentry.get_baggage instead. + # + # Generates a W3C Baggage header for distributed tracing from the given Span. # Returns `nil` if `config.propagate_traces` is `false`. # @param span [Span] the span to generate trace from. # @return [String, nil] diff --git a/sentry-ruby/lib/sentry/hub.rb b/sentry-ruby/lib/sentry/hub.rb index 0d9c02dba..2bece1b03 100644 --- a/sentry-ruby/lib/sentry/hub.rb +++ b/sentry-ruby/lib/sentry/hub.rb @@ -243,6 +243,15 @@ def get_baggage current_scope.propagation_context&.get_baggage&.serialize end + def get_trace_propagation_headers + return nil unless configuration.propagate_traces + + { + SENTRY_TRACE_HEADER_NAME => get_traceparent, + BAGGAGE_HEADER_NAME => get_baggage + }.compact + end + private def current_layer diff --git a/sentry-ruby/lib/sentry/net/http.rb b/sentry-ruby/lib/sentry/net/http.rb index 989d8f393..af6e12aa6 100644 --- a/sentry-ruby/lib/sentry/net/http.rb +++ b/sentry-ruby/lib/sentry/net/http.rb @@ -31,7 +31,7 @@ def request(req, body = nil, &block) Sentry.with_child_span(op: OP_NAME, start_timestamp: Sentry.utc_now.to_f) do |sentry_span| request_info = extract_request_info(req) - set_sentry_trace_header(req, sentry_span, request_info) + set_propagation_headers(req, request_info) super.tap do |res| record_sentry_breadcrumb(request_info, res) @@ -49,17 +49,11 @@ def request(req, body = nil, &block) private - def set_sentry_trace_header(req, sentry_span, request_info) - return unless sentry_span - + def set_propagation_headers(req, request_info) client = Sentry.get_current_client return unless propagate_trace?(request_info[:url], client.configuration.trace_propagation_targets) - trace = client.generate_sentry_trace(sentry_span) - req[SENTRY_TRACE_HEADER_NAME] = trace if trace - - baggage = client.generate_baggage(sentry_span) - req[BAGGAGE_HEADER_NAME] = baggage if baggage && !baggage.empty? + Sentry.get_trace_propagation_headers&.each { |k, v| req[k] = v } end def record_sentry_breadcrumb(request_info, res) diff --git a/sentry-ruby/lib/sentry/propagation_context.rb b/sentry-ruby/lib/sentry/propagation_context.rb index 1211c760b..1e99d2756 100644 --- a/sentry-ruby/lib/sentry/propagation_context.rb +++ b/sentry-ruby/lib/sentry/propagation_context.rb @@ -62,7 +62,7 @@ def populate_head_baggage items = { "trace_id" => trace_id, - "sample_rate" => configuration.traces_sample_rate, + "sample_rate" => configuration.traces_sample_rate&.to_s, "environment" => configuration.environment, "release" => configuration.release, "public_key" => configuration.dsn&.public_key diff --git a/sentry-ruby/spec/sentry/net/http_spec.rb b/sentry-ruby/spec/sentry/net/http_spec.rb index dc4605ffc..cf420a4bd 100644 --- a/sentry-ruby/spec/sentry/net/http_spec.rb +++ b/sentry-ruby/spec/sentry/net/http_spec.rb @@ -97,9 +97,6 @@ response = http.request(request) expect(response.code).to eq("200") - expect(string_io.string).to match( - /\[Tracing\] Adding sentry-trace header to outgoing request:/ - ) end it "adds baggage header to the request header as head SDK when no incoming trace" do @@ -115,10 +112,6 @@ response = http.request(request) expect(response.code).to eq("200") - expect(string_io.string).to match( - /\[Tracing\] Adding baggage header to outgoing request:/ - ) - request_span = transaction.span_recorder.spans.last expect(request["baggage"]).to eq(request_span.to_baggage) expect(request["baggage"]).to eq( @@ -150,10 +143,6 @@ response = http.request(request) expect(response.code).to eq("200") - expect(string_io.string).to match( - /\[Tracing\] Adding baggage header to outgoing request:/ - ) - request_span = transaction.span_recorder.spans.last expect(request["baggage"]).to eq(request_span.to_baggage) expect(request["baggage"]).to eq( @@ -164,7 +153,7 @@ ) end - context "with config.propagate_trace = false" do + context "with config.propagate_traces = false" do before do Sentry.configuration.propagate_traces = false end @@ -182,9 +171,6 @@ response = http.request(request) expect(response.code).to eq("200") - expect(string_io.string).not_to match( - /Adding sentry-trace header to outgoing request:/ - ) expect(request.key?("sentry-trace")).to eq(false) end @@ -209,9 +195,6 @@ response = http.request(request) expect(response.code).to eq("200") - expect(string_io.string).not_to match( - /Adding baggage header to outgoing request:/ - ) expect(request.key?("baggage")).to eq(false) end end