Module: AllStak::Propagation

Defined in:
lib/allstak/propagation.rb

Class Method Summary collapse

Class Method Details

.apply_headers(headers, trace_id:, request_id: nil, span_id: nil, sampled: true) ⇒ Object



26
27
28
29
30
31
32
33
34
35
# File 'lib/allstak/propagation.rb', line 26

def apply_headers(headers, trace_id:, request_id: nil, span_id: nil, sampled: true)
  headers["X-AllStak-Trace-Id"] = trace_id
  headers["X-AllStak-Request-Id"] = request_id if request_id && !request_id.to_s.empty?
  if span_id && !span_id.to_s.empty?
    headers["X-AllStak-Span-Id"] = span_id
    headers["traceparent"] = "00-#{trace_id}-#{span_id[0, 16]}-#{trace_flags(sampled)}"
  end
  headers["baggage"] = merge_baggage(headers["baggage"], trace_id: trace_id, request_id: request_id, span_id: span_id)
  headers["AllStak-Baggage"] = baggage(trace_id: trace_id, request_id: request_id, span_id: span_id)
end

.apply_request_headers(req, trace_id:, request_id: nil, span_id: nil, sampled: true) ⇒ Object



37
38
39
40
41
42
43
44
45
46
# File 'lib/allstak/propagation.rb', line 37

def apply_request_headers(req, trace_id:, request_id: nil, span_id: nil, sampled: true)
  req["X-AllStak-Trace-Id"] ||= trace_id
  req["X-AllStak-Request-Id"] ||= request_id if request_id && !request_id.to_s.empty?
  if span_id && !span_id.to_s.empty?
    req["X-AllStak-Span-Id"] ||= span_id
    req["traceparent"] ||= "00-#{trace_id}-#{span_id[0, 16]}-#{trace_flags(sampled)}"
  end
  req["baggage"] = merge_baggage(req["baggage"], trace_id: trace_id, request_id: request_id, span_id: span_id)
  req["AllStak-Baggage"] = baggage(trace_id: trace_id, request_id: request_id, span_id: span_id)
end

.baggage(trace_id:, request_id: nil, span_id: nil) ⇒ Object



5
6
7
8
9
10
# File 'lib/allstak/propagation.rb', line 5

def baggage(trace_id:, request_id: nil, span_id: nil)
  parts = ["allstak-trace_id=#{trace_id}"]
  parts << "allstak-request_id=#{request_id}" if request_id && !request_id.to_s.empty?
  parts << "allstak-span_id=#{span_id}" if span_id && !span_id.to_s.empty?
  parts.join(",")
end

.merge_baggage(existing, trace_id:, request_id: nil, span_id: nil) ⇒ Object



12
13
14
15
16
17
# File 'lib/allstak/propagation.rb', line 12

def merge_baggage(existing, trace_id:, request_id: nil, span_id: nil)
  preserved = existing.to_s.split(",").map(&:strip).reject do |part|
    part.empty? || part.downcase.start_with?("allstak-")
  end
  (preserved + baggage(trace_id: trace_id, request_id: request_id, span_id: span_id).split(",")).join(",")
end

.trace_flags(sampled) ⇒ Object

W3C traceparent trace-flags: “01” = sampled, “00” = not sampled. ‘sampled` defaults to true to preserve historical behavior for callers that do not pass an explicit sampling decision.



22
23
24
# File 'lib/allstak/propagation.rb', line 22

def trace_flags(sampled)
  sampled == false ? "00" : "01"
end