ddtrace 1.6.1 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
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