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



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 56

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,
  )
end

#inject!(digest, data) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 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
  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