class Traces::Context

A generic representation of the current tracing context.

def self.local(flags = 0, **options)

@parameter flags [Integer] Any trace context flags.
Create a local trace context which is likley to be globally unique.
def self.local(flags = 0, **options)
	self.new(SecureRandom.hex(16), SecureRandom.hex(8), flags, **options)
end

def self.nested(parent, flags = 0)

@parameter parent [Context] An optional parent context.
Nest a local trace context in an optional parent context.
def self.nested(parent, flags = 0)
	if parent
		parent.nested(flags)
	else
		self.local(flags)
	end
end

def self.parse(parent, state = nil, **options)

@parameter state [Array(String)] Any attached trace state.
@parameter parent [String] The parent trace context.
Parse a string representation of a distributed trace.
def self.parse(parent, state = nil, **options)
	version, trace_id, parent_id, flags = parent.split('-')
	
	if version == '00'
		flags = Integer(flags, 16)
		
		if state.is_a?(String)
			state = state.split(',')
		end
		
		if state
			state = state.map{|item| item.split('=')}.to_h
		end
		
		self.new(trace_id, parent_id, flags, state, **options)
	end
end

def as_json

Convert the trace context to a JSON representation, including trace state.
def as_json
	{
		trace_id: @trace_id,
		parent_id: @parent_id,
		flags: @flags,
		state: @state,
		remote: @remote
	}
end

def initialize(trace_id, parent_id, flags, state = nil, remote: false)

@parameter remote [Boolean] Whether this context was created from a distributed trace header.
@parameter state [Hash] Additional vendor-specific trace identification information.
@parameter flags [Integer] An 8-bit field that controls tracing flags such as sampling, trace level, etc.
@parameter parent_id [String] The ID of this operation as known by the caller (sometimes referred to as the span ID).
@parameter trace_id [String] The ID of the whole trace forest.
Initialize the trace context.
def initialize(trace_id, parent_id, flags, state = nil, remote: false)
	@trace_id = trace_id
	@parent_id = parent_id
	@flags = flags
	@state = state
	@remote = remote
end

def nested(flags = @flags)

Create a new nested trace context in which spans can be recorded.
def nested(flags = @flags)
	Context.new(@trace_id, SecureRandom.hex(8), flags, @state, remote: @remote)
end

def remote?

Whether this context was created from a distributed trace header.
def remote?
	@remote
end

def sampled?

Denotes that the caller may have recorded trace data. When unset, the caller did not record trace data out-of-band.
def sampled?
	(@flags & SAMPLED) != 0
end

def to_json(...)

Convert the trace context to a JSON string.
def to_json(...)
	as_json.to_json(...)
end

def to_s

A string representation of the trace context (excluding trace state).
def to_s
	"00-#{@trace_id}-#{@parent_id}-#{@flags.to_s(16)}"
end