Module: Datadog::Trace
- Defined in:
- lib/datadog/lambda/trace/context.rb,
lib/datadog/lambda/trace/listener.rb,
lib/datadog/lambda/trace/constants.rb,
lib/datadog/lambda/trace/patch_http.rb,
lib/datadog/lambda/trace/xray_lambda.rb
Overview
Trace contains methods to help with patching Net/HTTP
Defined Under Namespace
Modules: NetExtensions
Classes: FacadeSegment, LambdaContext, LambdaEmitter, LambdaStreamer, Listener
Constant Summary
collapse
- SAMPLE_MODE_USER_REJECT =
-1
- SAMPLE_MODE_AUTO_REJECT =
0
- SAMPLE_MODE_AUTO_KEEP =
1
- SAMPLE_MODE_USER_KEEP =
2
'x-datadog-trace-id'
'x-datadog-parent-id'
'x-datadog-sampling-priority'
- DD_XRAY_SUBSEGMENT_NAME =
'datadog-metadata'
- DD_XRAY_SUBSEGMENT_KEY =
'trace'
- DD_XRAY_SUBSEGMENT_NAMESPACE =
'datadog'
Class Method Summary
collapse
Class Method Details
.add_trace_context_to_xray(context) ⇒ Object
.convert_to_apm_parent_id(xray_parent_id) ⇒ Object
117
118
119
120
121
122
123
|
# File 'lib/datadog/lambda/trace/context.rb', line 117
def convert_to_apm_parent_id(xray_parent_id)
return nil if xray_parent_id.length != 16
return nil if xray_parent_id.upcase[/\H/]
hex = xray_parent_id.to_i(16)
hex.to_s(10)
end
|
.convert_to_apm_trace_id(xray_trace_id) ⇒ Object
103
104
105
106
107
108
109
110
111
112
113
114
115
|
# File 'lib/datadog/lambda/trace/context.rb', line 103
def convert_to_apm_trace_id(xray_trace_id)
parts = xray_trace_id.split('-')
return nil if parts.length < 3
last_part = parts[2]
return nil if last_part.length != 24
return nil if last_part.upcase[/\H/]
hex = last_part.to_i(16)
last_63_bits = hex & 0x7fffffffffffffff
last_63_bits.to_s(10)
end
|
.convert_to_sample_mode(xray_sampled) ⇒ Object
.current_trace_context(trace_context) ⇒ Object
48
49
50
51
52
53
54
55
56
|
# File 'lib/datadog/lambda/trace/context.rb', line 48
def current_trace_context(trace_context)
entity = XRay.recorder.current_entity
parent_id = entity.id
{
trace_id: trace_context[:trace_id],
parent_id: convert_to_apm_parent_id(parent_id),
sample_mode: trace_context[:sample_mode]
}
end
|
20
21
22
23
24
25
26
27
28
29
30
31
|
# File 'lib/datadog/lambda/trace/context.rb', line 20
def (event)
context = read_trace_context_from_event(event)
unless context.nil?
begin
add_trace_context_to_xray(context)
rescue StandardError => e
Datadog::Utils.logger.error("couldn't add metadata to xray #{e}")
end
return context
end
read_trace_context_from_xray
end
|
86
87
88
89
|
# File 'lib/datadog/lambda/trace/context.rb', line 86
def (event)
event.is_a?(Hash) && event.key?('headers') &&
event['headers'].is_a?(Hash)
end
|
.patch_http ⇒ Object
25
26
27
28
|
# File 'lib/datadog/lambda/trace/patch_http.rb', line 25
def self.patch_http
Net::HTTP.prepend NetExtensions unless @patched
@patched = true
end
|
.read_trace_context_from_event(event) ⇒ Object
72
73
74
75
76
77
78
79
80
81
82
83
84
|
# File 'lib/datadog/lambda/trace/context.rb', line 72
def read_trace_context_from_event(event)
return nil unless (event)
= event['headers'].transform_keys(&:downcase)
return nil unless ()
{
trace_id: [DD_TRACE_ID_HEADER],
parent_id: [DD_PARENT_ID_HEADER],
sample_mode: [DD_SAMPLING_PRIORITY_HEADER].to_i
}
end
|
.read_trace_context_from_xray ⇒ Object
58
59
60
61
62
63
64
65
66
67
68
69
70
|
# File 'lib/datadog/lambda/trace/context.rb', line 58
def read_trace_context_from_xray
segment = XRay.recorder.current_entity
parent_id = segment.id
mode = segment.sampled ? SAMPLE_MODE_USER_KEEP : SAMPLE_MODE_USER_REJECT
{
trace_id: convert_to_apm_trace_id(segment.trace_id),
parent_id: convert_to_apm_parent_id(parent_id),
sample_mode: mode
}
rescue StandardError => e
Datadog::Utils.logger.error("couldn't read xray trace header #{e}")
nil
end
|
.trace_context ⇒ Object
16
17
18
|
# File 'lib/datadog/lambda/trace/patch_http.rb', line 16
def self.trace_context
@trace_context
end
|
.trace_context=(val) ⇒ Object
20
21
22
|
# File 'lib/datadog/lambda/trace/patch_http.rb', line 20
def self.trace_context=(val)
@trace_context = val
end
|