TracesSourceTracesContext

class Context

A generic representation of the current tracing context.

Definitions

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

Parse a string representation of a distributed trace.

Signature

parameter parent String

The parent trace context.

parameter state Array(String)

Any attached trace state.

Implementation

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 self.local(flags = 0, **options)

Create a local trace context which is likley to be globally unique.

Signature

parameter flags Integer

Any trace context flags.

Implementation

def self.local(flags = 0, **options)
	self.new(SecureRandom.hex(16), SecureRandom.hex(8), flags, **options)
end

def self.nested(parent, flags = 0)

Nest a local trace context in an optional parent context.

Signature

parameter parent Context

An optional parent context.

Implementation

def self.nested(parent, flags = 0)
	if parent
		parent.nested(flags)
	else
		self.local(flags)
	end
end

def nested(flags = @flags)

Create a new nested trace context in which spans can be recorded.

Implementation

def nested(flags = @flags)
	Context.new(@trace_id, SecureRandom.hex(8), flags, @state, remote: @remote)
end

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

Initialize the trace context.

Signature

parameter trace_id String

The ID of the whole trace forest.

parameter parent_id String

The ID of this operation as known by the caller (sometimes referred to as the span ID).

parameter flags Integer

An 8-bit field that controls tracing flags such as sampling, trace level, etc.

parameter state Hash

Additional vendor-specific trace identification information.

parameter remote Boolean

Whether this context was created from a distributed trace header.

Implementation

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

attr :trace_id

The ID of the whole trace forest and is used to uniquely identify a distributed trace through a system. It is represented as a 16-byte array, for example, 4bf92f3577b34da6a3ce929d0e0e4736. All bytes as zero (00000000000000000000000000000000) is considered an invalid value.

attr :parent_id

The ID of this operation as known by the caller (in some tracing systems, this is known as the span-id, where a span is the execution of a client operation). It is represented as an 8-byte array, for example, 00f067aa0ba902b7. All bytes as zero (0000000000000000) is considered an invalid value.

attr :flags

An 8-bit field that controls tracing flags such as sampling, trace level, etc. These flags are recommendations given by the caller rather than strict rules.

attr :state

Provides additional vendor-specific trace identification information across different distributed tracing systems. Conveys information about the operation's position in multiple distributed tracing graphs.

def sampled?

Denotes that the caller may have recorded trace data. When unset, the caller did not record trace data out-of-band.

Implementation

def sampled?
	(@flags & SAMPLED) != 0
end

def remote?

Whether this context was created from a distributed trace header.

Implementation

def remote?
	@remote
end

def to_s

A string representation of the trace context (excluding trace state).

Implementation

def to_s
	"00-#{@trace_id}-#{@parent_id}-#{@flags.to_s(16)}"
end

def as_json

Convert the trace context to a JSON representation, including trace state.

Implementation

def as_json
	{
		trace_id: @trace_id,
		parent_id: @parent_id,
		flags: @flags,
		state: @state,
		remote: @remote
	}
end

def to_json(...)

Convert the trace context to a JSON string.

Implementation

def to_json(...)
	as_json.to_json(...)
end