class ElasticAPM::TraceContext
@api private
def self.parse(header)
def self.parse(header) raise InvalidTraceparentHeader unless header.length == 55 raise InvalidTraceparentHeader unless header[0..1] == VERSION new.tap do |t| t.version, t.trace_id, t.parent_id, t.flags = header.split('-').tap do |values| values[-1] = Util.hex_to_bits(values[-1]) end raise InvalidTraceparentHeader if HEX_REGEX =~ t.trace_id raise InvalidTraceparentHeader if HEX_REGEX =~ t.parent_id end end
def child
def child dup.tap do |tc| tc.parent_id = tc.id tc.id = hex(ID_LENGTH) end end
def ensure_parent_id
def ensure_parent_id @parent_id ||= hex(ID_LENGTH) end
def flags
def flags format('0000000%d', recorded? ? 1 : 0) end
def flags=(flags)
def flags=(flags) @flags = flags self.recorded = flags[7] == '1' end
def hex(len)
def hex(len) SecureRandom.hex(len) end
def hex_flags
def hex_flags format('%02x', flags.to_i(2)) end
def initialize(
def initialize( version: VERSION, trace_id: nil, span_id: nil, id: nil, recorded: true ) @version = version @trace_id = trace_id || hex(TRACE_ID_LENGTH) # TODO: rename to parent_id with next major version bump @parent_id = span_id @id = id || hex(ID_LENGTH) @recorded = recorded end
def span_id
- Use parent_id instead
def span_id @parent_id end
def span_id=(span_id)
- Use parent_id instead
def span_id=(span_id) @parent_id = span_id end
def to_header
def to_header format('%s-%s-%s-%s', version, trace_id, id, hex_flags) end