ddtrace 1.6.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +89 -2
  3. data/README.md +2 -2
  4. data/ext/ddtrace_profiling_loader/extconf.rb +5 -2
  5. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +1 -1
  6. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +3 -2
  7. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +81 -47
  8. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +1 -1
  9. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +332 -125
  10. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
  11. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
  12. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
  13. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
  14. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +11 -13
  15. data/ext/ddtrace_profiling_native_extension/extconf.rb +22 -8
  16. data/ext/ddtrace_profiling_native_extension/helpers.h +5 -0
  17. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +8 -0
  18. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +111 -26
  19. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +9 -0
  20. data/ext/ddtrace_profiling_native_extension/profiling.c +205 -0
  21. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +86 -0
  22. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +28 -6
  23. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +115 -0
  24. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +11 -0
  25. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +84 -35
  26. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +1 -0
  27. data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
  28. data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
  29. data/lib/datadog/appsec/assets/blocked.html +98 -3
  30. data/lib/datadog/appsec/assets/blocked.json +1 -0
  31. data/lib/datadog/appsec/assets/blocked.text +5 -0
  32. data/lib/datadog/appsec/assets/waf_rules/recommended.json +35 -46
  33. data/lib/datadog/appsec/assets/waf_rules/risky.json +1 -1
  34. data/lib/datadog/appsec/assets/waf_rules/strict.json +46 -1
  35. data/lib/datadog/appsec/assets.rb +2 -2
  36. data/lib/datadog/appsec/configuration/settings.rb +6 -0
  37. data/lib/datadog/appsec/configuration.rb +4 -0
  38. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +4 -8
  39. data/lib/datadog/appsec/contrib/rack/request.rb +17 -0
  40. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +2 -2
  41. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +2 -2
  42. data/lib/datadog/appsec/contrib/rails/patcher.rb +3 -6
  43. data/lib/datadog/appsec/contrib/sinatra/ext.rb +1 -0
  44. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +1 -1
  45. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -8
  46. data/lib/datadog/appsec/extensions.rb +10 -0
  47. data/lib/datadog/appsec/processor.rb +18 -0
  48. data/lib/datadog/appsec/response.rb +54 -0
  49. data/lib/datadog/core/configuration/components.rb +27 -6
  50. data/lib/datadog/core/configuration/ext.rb +18 -0
  51. data/lib/datadog/core/configuration/settings.rb +14 -341
  52. data/lib/datadog/core/diagnostics/health.rb +4 -22
  53. data/lib/datadog/core/environment/variable_helpers.rb +58 -10
  54. data/lib/datadog/core/runtime/ext.rb +1 -1
  55. data/lib/datadog/core/utils.rb +0 -21
  56. data/lib/datadog/core.rb +21 -1
  57. data/lib/datadog/opentracer/distributed_headers.rb +7 -9
  58. data/lib/datadog/opentracer/rack_propagator.rb +0 -3
  59. data/lib/datadog/opentracer/text_map_propagator.rb +5 -7
  60. data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +10 -4
  61. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +20 -5
  62. data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
  63. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
  64. data/lib/datadog/profiling/collectors/old_stack.rb +7 -0
  65. data/lib/datadog/profiling/exporter.rb +5 -0
  66. data/lib/datadog/profiling/old_recorder.rb +8 -0
  67. data/lib/datadog/profiling/profiler.rb +7 -0
  68. data/lib/datadog/profiling/scheduler.rb +4 -7
  69. data/lib/datadog/profiling/stack_recorder.rb +36 -0
  70. data/lib/datadog/profiling/tasks/setup.rb +0 -7
  71. data/lib/datadog/profiling.rb +2 -0
  72. data/lib/datadog/tracing/configuration/ext.rb +33 -3
  73. data/lib/datadog/tracing/configuration/settings.rb +433 -0
  74. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +4 -1
  75. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -0
  76. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +4 -1
  77. data/lib/datadog/tracing/contrib/dalli/ext.rb +1 -0
  78. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +4 -0
  79. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +5 -1
  80. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +1 -0
  81. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +6 -1
  82. data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
  83. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -1
  84. data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
  85. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +5 -1
  86. data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
  87. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +6 -1
  88. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +2 -1
  89. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +6 -12
  90. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +27 -0
  91. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +43 -0
  92. data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
  93. data/lib/datadog/tracing/contrib/grpc/patcher.rb +0 -2
  94. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +6 -1
  95. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +32 -0
  96. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +38 -0
  97. data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
  98. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +6 -1
  99. data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
  100. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +6 -1
  101. data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
  102. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -0
  103. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -0
  104. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -0
  105. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +5 -1
  106. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  107. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +2 -0
  108. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +4 -1
  109. data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -0
  110. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +2 -2
  111. data/lib/datadog/tracing/contrib/patcher.rb +3 -2
  112. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +4 -1
  113. data/lib/datadog/tracing/contrib/pg/ext.rb +1 -0
  114. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +12 -2
  115. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +4 -1
  116. data/lib/datadog/tracing/contrib/presto/ext.rb +1 -0
  117. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +1 -0
  118. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +10 -12
  119. data/lib/datadog/tracing/contrib/que/tracer.rb +2 -0
  120. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +4 -1
  121. data/lib/datadog/tracing/contrib/racecar/events/message.rb +4 -1
  122. data/lib/datadog/tracing/contrib/rack/middlewares.rb +2 -0
  123. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +4 -1
  124. data/lib/datadog/tracing/contrib/redis/ext.rb +1 -0
  125. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +30 -21
  126. data/lib/datadog/tracing/contrib/redis/integration.rb +34 -2
  127. data/lib/datadog/tracing/contrib/redis/patcher.rb +18 -14
  128. data/lib/datadog/tracing/contrib/redis/quantize.rb +12 -9
  129. data/lib/datadog/tracing/contrib/redis/tags.rb +4 -6
  130. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +72 -0
  131. data/lib/datadog/tracing/contrib/resque/resque_job.rb +2 -0
  132. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +6 -1
  133. data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
  134. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -0
  135. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +5 -0
  136. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -0
  137. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +2 -0
  138. data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -6
  139. data/lib/datadog/tracing/diagnostics/health.rb +40 -0
  140. data/lib/datadog/tracing/distributed/b3_multi.rb +66 -0
  141. data/lib/datadog/tracing/distributed/b3_single.rb +66 -0
  142. data/lib/datadog/tracing/distributed/datadog.rb +153 -0
  143. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +1 -0
  144. data/lib/datadog/tracing/distributed/fetcher.rb +30 -0
  145. data/lib/datadog/tracing/distributed/headers/ext.rb +18 -16
  146. data/lib/datadog/tracing/distributed/helpers.rb +9 -7
  147. data/lib/datadog/tracing/distributed/none.rb +19 -0
  148. data/lib/datadog/tracing/distributed/propagation.rb +127 -0
  149. data/lib/datadog/tracing/distributed/trace_context.rb +369 -0
  150. data/lib/datadog/tracing/metadata/ext.rb +1 -1
  151. data/lib/datadog/tracing/propagation/http.rb +3 -106
  152. data/lib/datadog/tracing/sampling/priority_sampler.rb +11 -0
  153. data/lib/datadog/tracing/sampling/rate_sampler.rb +3 -3
  154. data/lib/datadog/tracing/span.rb +3 -19
  155. data/lib/datadog/tracing/span_operation.rb +5 -4
  156. data/lib/datadog/tracing/trace_digest.rb +75 -2
  157. data/lib/datadog/tracing/trace_operation.rb +5 -4
  158. data/lib/datadog/tracing/trace_segment.rb +1 -1
  159. data/lib/datadog/tracing/utils.rb +50 -0
  160. data/lib/ddtrace/transport/trace_formatter.rb +2 -5
  161. data/lib/ddtrace/version.rb +2 -2
  162. metadata +35 -15
  163. data/lib/datadog/tracing/distributed/headers/b3.rb +0 -55
  164. data/lib/datadog/tracing/distributed/headers/b3_single.rb +0 -67
  165. data/lib/datadog/tracing/distributed/headers/datadog.rb +0 -144
  166. data/lib/datadog/tracing/distributed/headers/parser.rb +0 -37
  167. data/lib/datadog/tracing/distributed/metadata/b3.rb +0 -55
  168. data/lib/datadog/tracing/distributed/metadata/b3_single.rb +0 -66
  169. data/lib/datadog/tracing/distributed/metadata/datadog.rb +0 -73
  170. data/lib/datadog/tracing/distributed/metadata/parser.rb +0 -34
  171. data/lib/datadog/tracing/propagation/grpc.rb +0 -98
@@ -1,37 +0,0 @@
1
- # typed: false
2
-
3
- require_relative '../helpers'
4
-
5
- module Datadog
6
- module Tracing
7
- module Distributed
8
- module Headers
9
- # Parser provides easy access and validation methods for Rack headers
10
- class Parser
11
- def initialize(env)
12
- @env = env
13
- end
14
-
15
- # TODO: Don't assume Rack format.
16
- # Make distributed tracing headers apathetic.
17
- def header(name)
18
- rack_header = "http-#{name}".upcase!.tr('-', '_')
19
-
20
- hdr = @env[rack_header]
21
-
22
- # Only return the value if it is not an empty string
23
- hdr if hdr != ''
24
- end
25
-
26
- def id(hdr, base = 10)
27
- Helpers.value_to_id(header(hdr), base)
28
- end
29
-
30
- def number(hdr, base = 10)
31
- Helpers.value_to_number(header(hdr), base)
32
- end
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,55 +0,0 @@
1
- # typed: true
2
-
3
- require_relative '../helpers'
4
- require_relative 'parser'
5
- require_relative '../headers/ext'
6
- require_relative '../../trace_digest'
7
-
8
- module Datadog
9
- module Tracing
10
- module Distributed
11
- module Metadata
12
- # B3 provides helpers to inject or extract metadata for B3 style headers
13
- module B3
14
- include Distributed::Headers::Ext
15
-
16
- def self.inject!(digest, metadata)
17
- return if digest.nil?
18
-
19
- # DEV: We need these to be hex encoded
20
- metadata[B3_HEADER_TRACE_ID] = digest.trace_id.to_s(16)
21
- metadata[B3_HEADER_SPAN_ID] = digest.span_id.to_s(16)
22
-
23
- if digest.trace_sampling_priority
24
- sampling_priority = Helpers.clamp_sampling_priority(
25
- digest.trace_sampling_priority
26
- )
27
- metadata[B3_HEADER_SAMPLED] = sampling_priority.to_s
28
- end
29
-
30
- metadata
31
- end
32
-
33
- def self.extract(metadata)
34
- # Extract values from gRPC metadata
35
- # DEV: B3 doesn't have "origin"
36
- metadata = Parser.new(metadata)
37
- trace_id = metadata.id(B3_HEADER_TRACE_ID, 16)
38
- span_id = metadata.id(B3_HEADER_SPAN_ID, 16)
39
- # We don't need to try and convert sampled since B3 supports 0/1 (AUTO_REJECT/AUTO_KEEP)
40
- sampling_priority = metadata.number(B3_HEADER_SAMPLED)
41
-
42
- # Return early if this propagation is not valid
43
- return unless trace_id && span_id
44
-
45
- TraceDigest.new(
46
- trace_id: trace_id,
47
- span_id: span_id,
48
- trace_sampling_priority: sampling_priority
49
- )
50
- end
51
- end
52
- end
53
- end
54
- end
55
- end
@@ -1,66 +0,0 @@
1
- # typed: true
2
-
3
- require_relative 'parser'
4
- require_relative '../helpers'
5
- require_relative '../headers/ext'
6
- require_relative '../../trace_digest'
7
-
8
- module Datadog
9
- module Tracing
10
- module Distributed
11
- module Metadata
12
- # B3Single provides helpers to inject or extract metadata for B3 single header style headers
13
- module B3Single
14
- include Distributed::Headers::Ext
15
-
16
- def self.inject!(digest, metadata)
17
- return if digest.nil?
18
-
19
- # Header format:
20
- # b3: {TraceId}-{SpanId}-{SamplingState}-{ParentSpanId}
21
- # https://github.com/apache/incubator-zipkin-b3-propagation/tree/7c6e9f14d6627832bd80baa87ac7dabee7be23cf#single-header
22
- # DEV: `{SamplingState}` and `{ParentSpanId`}` are optional
23
-
24
- # DEV: We need these to be hex encoded
25
- b3_header = "#{digest.trace_id.to_s(16)}-#{digest.span_id.to_s(16)}"
26
-
27
- if digest.trace_sampling_priority
28
- sampling_priority = Helpers.clamp_sampling_priority(
29
- digest.trace_sampling_priority
30
- )
31
- b3_header += "-#{sampling_priority}"
32
- end
33
-
34
- metadata[B3_HEADER_SINGLE] = b3_header
35
-
36
- metadata
37
- end
38
-
39
- def self.extract(metadata)
40
- # Metadata format:
41
- # b3: {TraceId}-{SpanId}-{SamplingState}-{ParentSpanId}
42
- # https://github.com/apache/incubator-zipkin-b3-propagation/tree/7c6e9f14d6627832bd80baa87ac7dabee7be23cf#single-header
43
- # DEV: `{SamplingState}` and `{ParentSpanId`}` are optional
44
-
45
- b3_single = Parser.new(metadata).metadata_for_key(B3_HEADER_SINGLE)
46
- return if b3_single.nil?
47
-
48
- parts = b3_single.split('-')
49
- trace_id = Helpers.value_to_id(parts[0], 16) unless parts.empty?
50
- span_id = Helpers.value_to_id(parts[1], 16) if parts.length > 1
51
- sampling_priority = Helpers.value_to_number(parts[2]) if parts.length > 2
52
-
53
- # Return early if this propagation is not valid
54
- return unless trace_id && span_id
55
-
56
- TraceDigest.new(
57
- span_id: span_id,
58
- trace_id: trace_id,
59
- trace_sampling_priority: sampling_priority
60
- )
61
- end
62
- end
63
- end
64
- end
65
- end
66
- end
@@ -1,73 +0,0 @@
1
- require_relative '../headers/ext'
2
- require_relative 'parser'
3
-
4
- module Datadog
5
- module Tracing
6
- module Distributed
7
- module Metadata
8
- # Datadog provides helpers to inject or extract metadata for Datadog style headers
9
- class Datadog
10
- include Distributed::Headers::Ext
11
-
12
- def self.inject!(digest, metadata)
13
- return if digest.nil?
14
-
15
- metadata[GRPC_METADATA_TRACE_ID] = digest.trace_id.to_s
16
- metadata[GRPC_METADATA_PARENT_ID] = digest.span_id.to_s
17
- if digest.trace_sampling_priority
18
- metadata[GRPC_METADATA_SAMPLING_PRIORITY] =
19
- digest.trace_sampling_priority.to_s
20
- end
21
- metadata[GRPC_METADATA_ORIGIN] = digest.trace_origin.to_s if digest.trace_origin
22
-
23
- metadata
24
- end
25
-
26
- def self.extract(metadata)
27
- carrier = Carrier.new(metadata)
28
-
29
- return nil unless carrier.valid?
30
-
31
- TraceDigest.new(
32
- span_id: carrier.parent_id,
33
- trace_id: carrier.trace_id,
34
- trace_origin: carrier.origin,
35
- trace_sampling_priority: carrier.sampling_priority
36
- )
37
- end
38
-
39
- # opentracing.io compliant carrier object
40
- class Carrier
41
- include Distributed::Headers::Ext
42
-
43
- def initialize(metadata = {})
44
- @metadata = Parser.new(metadata || {})
45
- end
46
-
47
- def valid?
48
- (trace_id && parent_id) || (origin && trace_id)
49
- end
50
-
51
- def trace_id
52
- @metadata.id(GRPC_METADATA_TRACE_ID)
53
- end
54
-
55
- def parent_id
56
- @metadata.id(GRPC_METADATA_PARENT_ID)
57
- end
58
-
59
- def sampling_priority
60
- value = @metadata.metadata_for_key(GRPC_METADATA_SAMPLING_PRIORITY)
61
- value && value.to_i
62
- end
63
-
64
- def origin
65
- value = @metadata.metadata_for_key(GRPC_METADATA_ORIGIN)
66
- value if value != ''
67
- end
68
- end
69
- end
70
- end
71
- end
72
- end
73
- end
@@ -1,34 +0,0 @@
1
- require_relative '../helpers'
2
-
3
- module Datadog
4
- module Tracing
5
- module Distributed
6
- module Metadata
7
- # Parser provides easy access and validation methods for metadata headers
8
- class Parser
9
- def initialize(metadata)
10
- @metadata = metadata
11
- end
12
-
13
- def id(key, base = 10)
14
- Helpers.value_to_id(metadata_for_key(key), base)
15
- end
16
-
17
- def number(key, base = 10)
18
- Helpers.value_to_number(metadata_for_key(key), base)
19
- end
20
-
21
- def metadata_for_key(key)
22
- # metadata values can be arrays (multiple headers with the same key)
23
- value = @metadata[key]
24
- if value.is_a?(Array)
25
- value.first
26
- else
27
- value
28
- end
29
- end
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,98 +0,0 @@
1
- # typed: false
2
-
3
- require_relative '../distributed/metadata/datadog'
4
- require_relative '../distributed/metadata/b3'
5
- require_relative '../distributed/metadata/b3_single'
6
-
7
- require_relative '../span'
8
- require_relative '../trace_digest'
9
- require_relative '../trace_operation'
10
-
11
- module Datadog
12
- module Tracing
13
- module Propagation
14
- # opentracing.io compliant methods for distributing trace headers
15
- # between two or more distributed services. Note this is very close
16
- # to the Propagation::HTTP; the key difference is the way gRPC handles
17
- # header information (called "metadata") as it operates over HTTP2
18
- module GRPC
19
- PROPAGATION_STYLES = {
20
- Configuration::Ext::Distributed::PROPAGATION_STYLE_B3 => Distributed::Metadata::B3,
21
- Configuration::Ext::Distributed::PROPAGATION_STYLE_B3_SINGLE_HEADER => Distributed::Metadata::B3Single,
22
- Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG => Distributed::Metadata::Datadog
23
- }.freeze
24
-
25
- def self.inject!(digest, metadata)
26
- return if digest.nil?
27
-
28
- digest = digest.to_digest if digest.is_a?(TraceOperation)
29
-
30
- Datadog.configuration.tracing.distributed_tracing.propagation_inject_style.each do |style|
31
- propagator = PROPAGATION_STYLES[style]
32
- begin
33
- propagator.inject!(digest, metadata) unless propagator.nil?
34
- rescue => e
35
- Datadog.logger.error(
36
- 'Error injecting propagated trace headers into the environment. ' \
37
- "Cause: #{e} Location: #{Array(e.backtrace).first}"
38
- )
39
- end
40
- end
41
- end
42
-
43
- def self.extract(metadata)
44
- trace_digest = nil
45
- dd_trace_digest = nil
46
-
47
- Datadog.configuration.tracing.distributed_tracing.propagation_extract_style.each do |style|
48
- propagator = PROPAGATION_STYLES[style]
49
-
50
- next if propagator.nil?
51
-
52
- # Extract trace headers
53
- begin
54
- extracted_trace_digest = propagator.extract(metadata)
55
- rescue => e
56
- Datadog.logger.error(
57
- 'Error extracting propagated trace headers from the environment. ' \
58
- "Cause: #{e} Location: #{Array(e.backtrace).first}"
59
- )
60
- end
61
-
62
- # Skip this style if no valid headers were found
63
- next if extracted_trace_digest.nil?
64
-
65
- # Keep track of the Datadog extract trace headers, we want to return
66
- # this one if we have one
67
- if extracted_trace_digest && style == Configuration::Ext::Distributed::PROPAGATION_STYLE_DATADOG
68
- dd_trace_digest = extracted_trace_digest
69
- end
70
-
71
- # No previously extracted trace headers, use the one we just extracted
72
- if trace_digest.nil?
73
- trace_digest = extracted_trace_digest
74
- else
75
- unless trace_digest.trace_id == extracted_trace_digest.trace_id \
76
- && trace_digest.span_id == extracted_trace_digest.span_id
77
- # Return an empty/new trace headers if we have a mismatch in values extracted
78
- msg = "#{trace_digest.trace_id} != #{extracted_trace_digest.trace_id} && " \
79
- "#{trace_digest.span_id} != #{extracted_trace_digest.span_id}"
80
- Datadog.logger.debug(
81
- "Cannot extract trace headers from HTTP: extracted trace headers differ, #{msg}"
82
- )
83
- # DEV: This will return from `self.extract` not this `each` block
84
- return TraceDigest.new
85
- end
86
- end
87
- end
88
-
89
- # Return the extracted trace headers if we found one or else a new empty trace headers
90
- # Always return the Datadog trace headers if one exists since it has more
91
- # information than the B3 headers e.g. origin, expanded priority
92
- # sampling values, etc
93
- dd_trace_digest || trace_digest || nil
94
- end
95
- end
96
- end
97
- end
98
- end