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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +89 -2
- data/README.md +2 -2
- data/ext/ddtrace_profiling_loader/extconf.rb +5 -2
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +1 -1
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +3 -2
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +81 -47
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +1 -1
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +332 -125
- data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
- data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +11 -13
- data/ext/ddtrace_profiling_native_extension/extconf.rb +22 -8
- data/ext/ddtrace_profiling_native_extension/helpers.h +5 -0
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +8 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +111 -26
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +9 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +205 -0
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +86 -0
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +28 -6
- data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +115 -0
- data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +11 -0
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +84 -35
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +1 -0
- data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
- data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
- data/lib/datadog/appsec/assets/blocked.html +98 -3
- data/lib/datadog/appsec/assets/blocked.json +1 -0
- data/lib/datadog/appsec/assets/blocked.text +5 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +35 -46
- data/lib/datadog/appsec/assets/waf_rules/risky.json +1 -1
- data/lib/datadog/appsec/assets/waf_rules/strict.json +46 -1
- data/lib/datadog/appsec/assets.rb +2 -2
- data/lib/datadog/appsec/configuration/settings.rb +6 -0
- data/lib/datadog/appsec/configuration.rb +4 -0
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +4 -8
- data/lib/datadog/appsec/contrib/rack/request.rb +17 -0
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +2 -2
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +2 -2
- data/lib/datadog/appsec/contrib/rails/patcher.rb +3 -6
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +1 -0
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -8
- data/lib/datadog/appsec/extensions.rb +10 -0
- data/lib/datadog/appsec/processor.rb +18 -0
- data/lib/datadog/appsec/response.rb +54 -0
- data/lib/datadog/core/configuration/components.rb +27 -6
- data/lib/datadog/core/configuration/ext.rb +18 -0
- data/lib/datadog/core/configuration/settings.rb +14 -341
- data/lib/datadog/core/diagnostics/health.rb +4 -22
- data/lib/datadog/core/environment/variable_helpers.rb +58 -10
- data/lib/datadog/core/runtime/ext.rb +1 -1
- data/lib/datadog/core/utils.rb +0 -21
- data/lib/datadog/core.rb +21 -1
- data/lib/datadog/opentracer/distributed_headers.rb +7 -9
- data/lib/datadog/opentracer/rack_propagator.rb +0 -3
- data/lib/datadog/opentracer/text_map_propagator.rb +5 -7
- data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +10 -4
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +20 -5
- data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
- data/lib/datadog/profiling/collectors/old_stack.rb +7 -0
- data/lib/datadog/profiling/exporter.rb +5 -0
- data/lib/datadog/profiling/old_recorder.rb +8 -0
- data/lib/datadog/profiling/profiler.rb +7 -0
- data/lib/datadog/profiling/scheduler.rb +4 -7
- data/lib/datadog/profiling/stack_recorder.rb +36 -0
- data/lib/datadog/profiling/tasks/setup.rb +0 -7
- data/lib/datadog/profiling.rb +2 -0
- data/lib/datadog/tracing/configuration/ext.rb +33 -3
- data/lib/datadog/tracing/configuration/settings.rb +433 -0
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/dalli/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +4 -0
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +2 -1
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +6 -12
- data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +27 -0
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +43 -0
- data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc/patcher.rb +0 -2
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +32 -0
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +38 -0
- data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -0
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +2 -0
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +2 -2
- data/lib/datadog/tracing/contrib/patcher.rb +3 -2
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/pg/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +12 -2
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/presto/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +10 -12
- data/lib/datadog/tracing/contrib/que/tracer.rb +2 -0
- data/lib/datadog/tracing/contrib/racecar/events/batch.rb +4 -1
- data/lib/datadog/tracing/contrib/racecar/events/message.rb +4 -1
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +2 -0
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/redis/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +30 -21
- data/lib/datadog/tracing/contrib/redis/integration.rb +34 -2
- data/lib/datadog/tracing/contrib/redis/patcher.rb +18 -14
- data/lib/datadog/tracing/contrib/redis/quantize.rb +12 -9
- data/lib/datadog/tracing/contrib/redis/tags.rb +4 -6
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +72 -0
- data/lib/datadog/tracing/contrib/resque/resque_job.rb +2 -0
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -0
- data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +5 -0
- data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -0
- data/lib/datadog/tracing/contrib/sneakers/tracer.rb +2 -0
- data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -6
- data/lib/datadog/tracing/diagnostics/health.rb +40 -0
- data/lib/datadog/tracing/distributed/b3_multi.rb +66 -0
- data/lib/datadog/tracing/distributed/b3_single.rb +66 -0
- data/lib/datadog/tracing/distributed/datadog.rb +153 -0
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +1 -0
- data/lib/datadog/tracing/distributed/fetcher.rb +30 -0
- data/lib/datadog/tracing/distributed/headers/ext.rb +18 -16
- data/lib/datadog/tracing/distributed/helpers.rb +9 -7
- data/lib/datadog/tracing/distributed/none.rb +19 -0
- data/lib/datadog/tracing/distributed/propagation.rb +127 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +369 -0
- data/lib/datadog/tracing/metadata/ext.rb +1 -1
- data/lib/datadog/tracing/propagation/http.rb +3 -106
- data/lib/datadog/tracing/sampling/priority_sampler.rb +11 -0
- data/lib/datadog/tracing/sampling/rate_sampler.rb +3 -3
- data/lib/datadog/tracing/span.rb +3 -19
- data/lib/datadog/tracing/span_operation.rb +5 -4
- data/lib/datadog/tracing/trace_digest.rb +75 -2
- data/lib/datadog/tracing/trace_operation.rb +5 -4
- data/lib/datadog/tracing/trace_segment.rb +1 -1
- data/lib/datadog/tracing/utils.rb +50 -0
- data/lib/ddtrace/transport/trace_formatter.rb +2 -5
- data/lib/ddtrace/version.rb +2 -2
- metadata +35 -15
- data/lib/datadog/tracing/distributed/headers/b3.rb +0 -55
- data/lib/datadog/tracing/distributed/headers/b3_single.rb +0 -67
- data/lib/datadog/tracing/distributed/headers/datadog.rb +0 -144
- data/lib/datadog/tracing/distributed/headers/parser.rb +0 -37
- data/lib/datadog/tracing/distributed/metadata/b3.rb +0 -55
- data/lib/datadog/tracing/distributed/metadata/b3_single.rb +0 -66
- data/lib/datadog/tracing/distributed/metadata/datadog.rb +0 -73
- data/lib/datadog/tracing/distributed/metadata/parser.rb +0 -34
- 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
|