From 8c62943cecae65863b93fd8c2f4809611a95bc9c Mon Sep 17 00:00:00 2001 From: Neel Shah Date: Thu, 10 Aug 2023 14:06:42 +0200 Subject: [PATCH] Support passing env to PropagationContext.new --- sentry-ruby/lib/sentry/propagation_context.rb | 31 +++++++++++++++++-- sentry-ruby/lib/sentry/scope.rb | 11 ++++--- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/sentry-ruby/lib/sentry/propagation_context.rb b/sentry-ruby/lib/sentry/propagation_context.rb index 6a2021903..a5f99b822 100644 --- a/sentry-ruby/lib/sentry/propagation_context.rb +++ b/sentry-ruby/lib/sentry/propagation_context.rb @@ -23,12 +23,37 @@ class PropagationContext # @return [String] attr_reader :parent_span_id - def initialize(scope) + def initialize(scope, env = nil) @scope = scope - @trace_id = SecureRandom.uuid.delete("-") - @span_id = SecureRandom.uuid.delete("-").slice(0, 16) @parent_span_id = nil @baggage = nil + + if env + sentry_trace_header = env["HTTP_SENTRY_TRACE"] + baggage_header = env["HTTP_BAGGAGE"] + + if sentry_trace_header + sentry_trace_data = extract_sentry_trace(sentry_trace_header) + + if sentry_trace_data + @trace_id, @parent_span_id, _ = sentry_trace_data + + @baggage = if baggage_header && !baggage_header.empty? + Baggage.from_incoming_header(baggage_header) + else + # If there's an incoming sentry-trace but no incoming baggage header, + # for instance in traces coming from older SDKs, + # baggage will be empty and frozen and won't be populated as head SDK. + Baggage.new({}) + end + + @baggage.freeze! + end + end + end + + @trace_id ||= SecureRandom.uuid.delete("-") + @span_id = SecureRandom.uuid.delete("-").slice(0, 16) end # Extract the trace_id, parent_span_id and parent_sampled values from a sentry-trace header. diff --git a/sentry-ruby/lib/sentry/scope.rb b/sentry-ruby/lib/sentry/scope.rb index f0ea77982..afbc03ea0 100644 --- a/sentry-ruby/lib/sentry/scope.rb +++ b/sentry-ruby/lib/sentry/scope.rb @@ -279,6 +279,13 @@ def add_event_processor(&block) @event_processors << block end + # Generate a new propagation context either from the incoming env headers or from scratch. + # @param env [Hash, nil] + # @return [void] + def generate_propagation_context(env = nil) + @propagation_context = PropagationContext.new(self, env) + end + protected # for duplicating scopes internally @@ -307,10 +314,6 @@ def set_new_breadcrumb_buffer @breadcrumbs = BreadcrumbBuffer.new(@max_breadcrumbs) end - def generate_propagation_context - @propagation_context = PropagationContext.new(self) - end - class << self # @return [Hash] def os_context