Module: Julewire::GCP::TraceContext

Defined in:
lib/julewire/gcp/trace_context.rb,
lib/julewire/gcp/trace_context/traceparent.rb

Defined Under Namespace

Modules: Traceparent

Constant Summary collapse

X_CLOUD_TRACE_PATTERN =
%r{\A([[:xdigit:]]{32})(?:/(\d+))?(?:;o=(\d+))?\z}
TRACEPARENT_HEADER =
"traceparent"
X_CLOUD_TRACE_CONTEXT_HEADER =
"x-cloud-trace-context"
X_CLOUD_TRACE_CONTEXT_UNDERSCORE_HEADER =
"x_cloud_trace_context"
MAX_SPAN_ID =
(2**64) - 1

Class Method Summary collapse

Class Method Details

.extract(headers) ⇒ Object



41
42
43
44
45
46
47
# File 'lib/julewire/gcp/trace_context.rb', line 41

def extract(headers)
  return {} unless headers.respond_to?(:[])

  parse_traceparent(fetch_header(headers, :traceparent)) ||
    parse_x_cloud_trace_context(fetch_header(headers, :x_cloud_trace_context)) ||
    {}
end

.parse_traceparent(value) ⇒ Object



49
50
51
# File 'lib/julewire/gcp/trace_context.rb', line 49

def parse_traceparent(value)
  Traceparent.call(value)
end

.parse_x_cloud_trace_context(value) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/julewire/gcp/trace_context.rb', line 53

def parse_x_cloud_trace_context(value)
  match = X_CLOUD_TRACE_PATTERN.match(value.to_s.scrub.strip)
  return unless match

  trace_id = match[1].downcase
  return if Hex.zero?(trace_id)

  context = { trace_id: trace_id }
  if match[2]
    span_id = decimal_span_to_hex(match[2])
    context[:span_id] = span_id if span_id
  end
  context[:trace_sampled] = Integer(match[3], 10).allbits?(1) if match[3]
  context
end