Class: Datadog::Tracing::Distributed::Datadog

Inherits:
Object
  • Object
show all
Defined in:
lib/datadog/tracing/distributed/datadog.rb

Overview

Datadog-style trace propagation.

Constant Summary collapse

TRACE_ID_KEY =
'x-datadog-trace-id'
PARENT_ID_KEY =
'x-datadog-parent-id'
SAMPLING_PRIORITY_KEY =
'x-datadog-sampling-priority'
ORIGIN_KEY =
'x-datadog-origin'
TAGS_KEY =

Distributed trace-level tags

'x-datadog-tags'
TAGS_PREFIX =

Prefix used by all Datadog-specific distributed tags

'x-datadog-'

Instance Method Summary collapse

Constructor Details

#initialize(fetcher:, trace_id_key: TRACE_ID_KEY, parent_id_key: PARENT_ID_KEY, sampling_priority_key: SAMPLING_PRIORITY_KEY, origin_key: ORIGIN_KEY, tags_key: TAGS_KEY) ⇒ Datadog

Returns a new instance of Datadog.



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/datadog/tracing/distributed/datadog.rb', line 24

def initialize(
  fetcher:,
  trace_id_key: TRACE_ID_KEY,
  parent_id_key: PARENT_ID_KEY,
  sampling_priority_key: SAMPLING_PRIORITY_KEY,
  origin_key: ORIGIN_KEY,
  tags_key: TAGS_KEY
)
  @trace_id_key = trace_id_key
  @parent_id_key = parent_id_key
  @sampling_priority_key = sampling_priority_key
  @origin_key = origin_key
  @tags_key = tags_key
  @fetcher = fetcher
end

Instance Method Details

#extract(data) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/datadog/tracing/distributed/datadog.rb', line 55

def extract(data)
  fetcher = @fetcher.new(data)

  trace_id  = parse_trace_id(fetcher)
  parent_id = parse_parent_id(fetcher)

  sampling_priority = Helpers.parse_decimal_id(fetcher[@sampling_priority_key])
  origin = fetcher[@origin_key]

  # Return early if this propagation is not valid
  # DEV: To be valid we need to have a trace id and a parent id
  #      or when it is a synthetics trace, just the trace id.
  # DEV: `Fetcher#id` will not return 0
  return unless (trace_id && parent_id) || (origin && trace_id)

  trace_distributed_tags = extract_tags(fetcher)

  # If trace id is 128 bits long,
  # Concatentated high order 64 bit hex-encoded `tid` tag
  trace_id = extract_trace_id!(trace_id, trace_distributed_tags)

  TraceDigest.new(
    span_id: parent_id,
    trace_id: trace_id,
    trace_origin: origin,
    trace_sampling_priority: sampling_priority,
    trace_distributed_tags: trace_distributed_tags,
    span_remote: true,
  )
end

#inject!(digest, data) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/datadog/tracing/distributed/datadog.rb', line 40

def inject!(digest, data)
  return if digest.nil?

  data[@trace_id_key] = Tracing::Utils::TraceId.to_low_order(digest.trace_id).to_s

  data[@parent_id_key] = digest.span_id.to_s if digest.span_id
  data[@sampling_priority_key] = digest.trace_sampling_priority.to_s if digest.trace_sampling_priority
  data[@origin_key] = digest.trace_origin.to_s if digest.trace_origin

  build_tags(digest).tap do |tags|
    inject_tags!(tags, data) unless tags.empty?
  end
  data
end