ddtrace 1.5.1 → 1.6.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 +63 -1
- data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +9 -2
- data/ext/ddtrace_profiling_loader/extconf.rb +17 -0
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +38 -2
- data/ext/ddtrace_profiling_native_extension/clock_id.h +1 -0
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +1 -0
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +517 -42
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +3 -0
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +208 -30
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +156 -46
- data/ext/ddtrace_profiling_native_extension/collectors_stack.h +11 -2
- data/ext/ddtrace_profiling_native_extension/extconf.rb +11 -1
- data/ext/ddtrace_profiling_native_extension/http_transport.c +83 -64
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +4 -4
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +3 -2
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +59 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +3 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +10 -0
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +0 -1
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +4 -2
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +45 -29
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +7 -7
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +44 -18
- data/lib/datadog/appsec/event.rb +8 -4
- data/lib/datadog/core/configuration/components.rb +20 -14
- data/lib/datadog/core/configuration/settings.rb +59 -7
- data/lib/datadog/core/diagnostics/environment_logger.rb +5 -1
- data/lib/datadog/core/utils/compression.rb +5 -1
- data/lib/datadog/core.rb +0 -54
- data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +12 -2
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +5 -3
- data/lib/datadog/profiling/exporter.rb +2 -4
- data/lib/datadog/profiling/http_transport.rb +1 -1
- data/lib/datadog/tracing/client_ip.rb +11 -0
- data/lib/datadog/tracing/configuration/ext.rb +3 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/dalli/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +4 -0
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +3 -0
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +2 -0
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +2 -0
- data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -0
- data/lib/datadog/tracing/contrib/ext.rb +6 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +2 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +5 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +7 -1
- data/lib/datadog/tracing/contrib/grpc/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +47 -0
- data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +22 -0
- data/lib/datadog/tracing/contrib/hanami/ext.rb +24 -0
- data/lib/datadog/tracing/contrib/hanami/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/hanami/patcher.rb +33 -0
- data/lib/datadog/tracing/contrib/hanami/plugin.rb +23 -0
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +41 -0
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +44 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +7 -0
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +4 -0
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +12 -0
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -0
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +12 -0
- data/lib/datadog/tracing/contrib/pg/ext.rb +2 -1
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +34 -18
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +43 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +32 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +28 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +49 -0
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +15 -7
- data/lib/datadog/tracing/contrib/redis/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +4 -2
- data/lib/datadog/tracing/contrib/redis/patcher.rb +41 -0
- data/lib/datadog/tracing/contrib/redis/tags.rb +5 -0
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +2 -0
- data/lib/datadog/tracing/contrib/sinatra/env.rb +12 -23
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +7 -3
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +8 -80
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +14 -9
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +84 -0
- data/lib/datadog/tracing/distributed/headers/datadog.rb +122 -30
- data/lib/datadog/tracing/distributed/headers/ext.rb +2 -0
- data/lib/datadog/tracing/flush.rb +1 -1
- data/lib/datadog/tracing/metadata/ext.rb +8 -0
- data/lib/datadog/tracing/propagation/http.rb +9 -1
- data/lib/datadog/tracing/sampling/ext.rb +31 -0
- data/lib/datadog/tracing/sampling/priority_sampler.rb +46 -4
- data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +8 -9
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +29 -5
- data/lib/datadog/tracing/sampling/rate_sampler.rb +10 -3
- data/lib/datadog/tracing/sampling/rule_sampler.rb +4 -3
- data/lib/datadog/tracing/sampling/span/ext.rb +0 -4
- data/lib/datadog/tracing/sampling/span/rule.rb +1 -1
- data/lib/datadog/tracing/sampling/span/sampler.rb +14 -3
- data/lib/datadog/tracing/trace_digest.rb +3 -0
- data/lib/datadog/tracing/trace_operation.rb +10 -0
- data/lib/datadog/tracing/trace_segment.rb +6 -0
- data/lib/datadog/tracing/tracer.rb +3 -1
- data/lib/datadog/tracing/writer.rb +7 -0
- data/lib/ddtrace/transport/trace_formatter.rb +7 -0
- data/lib/ddtrace/transport/traces.rb +1 -1
- data/lib/ddtrace/version.rb +2 -2
- metadata +18 -14
- data/lib/datadog/profiling/old_ext.rb +0 -42
- data/lib/datadog/profiling/transport/http/api/endpoint.rb +0 -85
- data/lib/datadog/profiling/transport/http/api/instance.rb +0 -38
- data/lib/datadog/profiling/transport/http/api/spec.rb +0 -42
- data/lib/datadog/profiling/transport/http/api.rb +0 -45
- data/lib/datadog/profiling/transport/http/builder.rb +0 -30
- data/lib/datadog/profiling/transport/http/client.rb +0 -37
- data/lib/datadog/profiling/transport/http/response.rb +0 -21
- data/lib/datadog/profiling/transport/http.rb +0 -118
|
@@ -21,17 +21,26 @@ module Datadog
|
|
|
21
21
|
|
|
22
22
|
def initialize(opts = {})
|
|
23
23
|
@pre_sampler = opts[:base_sampler] || AllSampler.new
|
|
24
|
-
@priority_sampler = opts[:post_sampler] || RateByServiceSampler.new
|
|
24
|
+
@priority_sampler = opts[:post_sampler] || RateByServiceSampler.new(decision: Sampling::Ext::Decision::AGENT_RATE)
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def sample?(trace)
|
|
28
28
|
@pre_sampler.sample?(trace)
|
|
29
29
|
end
|
|
30
30
|
|
|
31
|
+
# DEV-2.0:We should get rid of this complicated interaction between @pre_sampler and @priority_sampler.
|
|
32
|
+
# DEV-2.0:If the user wants to configure a custom sampler, we should only allow them to provide a complete
|
|
33
|
+
# DEV-2.0:sampling suite, not having this convoluted support for mixing arbitrary provided samplers in
|
|
34
|
+
# DEV-2.0:the PrioritySampler. Ideally, the PrioritySampler is only used by Datadog.
|
|
35
|
+
# DEV-2.0:There are too many edge cases and combinations to work around currently in this class.
|
|
31
36
|
def sample!(trace)
|
|
37
|
+
# The priority that was set before the sampler ran.
|
|
38
|
+
# This comes from distributed tracing priority propagation.
|
|
39
|
+
distributed_sampling_priority = priority_assigned?(trace)
|
|
40
|
+
|
|
32
41
|
# If pre-sampling is configured, do it first. (By default, this will sample at 100%.)
|
|
33
42
|
# NOTE: Pre-sampling at rates < 100% may result in partial traces; not recommended.
|
|
34
|
-
trace.sampled = pre_sample?(trace) ? @pre_sampler.sample!(trace) : true
|
|
43
|
+
trace.sampled = pre_sample?(trace) ? preserving_priority_sampling(trace) { @pre_sampler.sample!(trace) } : true
|
|
35
44
|
|
|
36
45
|
if trace.sampled?
|
|
37
46
|
# If priority sampling has already been applied upstream, use that value.
|
|
@@ -53,11 +62,27 @@ module Datadog
|
|
|
53
62
|
end
|
|
54
63
|
|
|
55
64
|
trace.sampled?
|
|
65
|
+
ensure
|
|
66
|
+
if trace.sampling_priority && trace.sampling_priority > 0
|
|
67
|
+
# Don't modify decision if priority was set upstream.
|
|
68
|
+
if !distributed_sampling_priority && !trace.has_tag?(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
|
|
69
|
+
# If no sampling priority being assigned at this point, a custom
|
|
70
|
+
# sampler implementation is configured: this means the user has
|
|
71
|
+
# full control over the sampling decision.
|
|
72
|
+
trace.set_tag(
|
|
73
|
+
Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER,
|
|
74
|
+
Sampling::Ext::Decision::MANUAL
|
|
75
|
+
)
|
|
76
|
+
end
|
|
77
|
+
else
|
|
78
|
+
# The sampler decided to not keep this span, removing sampling decision.
|
|
79
|
+
trace.clear_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
|
|
80
|
+
end
|
|
56
81
|
end
|
|
57
82
|
|
|
58
83
|
# (see Datadog::Tracing::Sampling::RateByServiceSampler#update)
|
|
59
|
-
def update(rate_by_service)
|
|
60
|
-
@priority_sampler.update(rate_by_service)
|
|
84
|
+
def update(rate_by_service, decision: nil)
|
|
85
|
+
@priority_sampler.update(rate_by_service, decision: decision)
|
|
61
86
|
end
|
|
62
87
|
|
|
63
88
|
private
|
|
@@ -83,6 +108,23 @@ module Datadog
|
|
|
83
108
|
end
|
|
84
109
|
end
|
|
85
110
|
|
|
111
|
+
# Ensures the trace's priority sampling decision is not changed by the @pre_sampler.
|
|
112
|
+
# The @pre_sampler should only change `trace.sampled`.
|
|
113
|
+
def preserving_priority_sampling(trace)
|
|
114
|
+
sampling_priority = trace.sampling_priority
|
|
115
|
+
sampling_decision = trace.get_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
|
|
116
|
+
|
|
117
|
+
yield.tap do
|
|
118
|
+
trace.sampling_priority = sampling_priority
|
|
119
|
+
|
|
120
|
+
if sampling_decision
|
|
121
|
+
trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, sampling_decision)
|
|
122
|
+
else
|
|
123
|
+
trace.clear_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER)
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
86
128
|
# Ensures the trace is always propagated to the writer and that
|
|
87
129
|
# the sample rate metric represents the true client-side sampling.
|
|
88
130
|
def preserving_sampling(trace)
|
|
@@ -12,7 +12,7 @@ module Datadog
|
|
|
12
12
|
attr_reader \
|
|
13
13
|
:default_key
|
|
14
14
|
|
|
15
|
-
def initialize(default_key, default_rate = 1.0, &block)
|
|
15
|
+
def initialize(default_key, default_rate = 1.0, decision: nil, &block)
|
|
16
16
|
super()
|
|
17
17
|
|
|
18
18
|
raise ArgumentError, 'No resolver given!' unless block
|
|
@@ -22,7 +22,7 @@ module Datadog
|
|
|
22
22
|
@mutex = Mutex.new
|
|
23
23
|
@samplers = {}
|
|
24
24
|
|
|
25
|
-
set_rate(default_key, default_rate)
|
|
25
|
+
set_rate(default_key, default_rate, decision)
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def resolve(trace)
|
|
@@ -57,15 +57,15 @@ module Datadog
|
|
|
57
57
|
end
|
|
58
58
|
end
|
|
59
59
|
|
|
60
|
-
def update(key, rate)
|
|
60
|
+
def update(key, rate, decision: nil)
|
|
61
61
|
@mutex.synchronize do
|
|
62
|
-
set_rate(key, rate)
|
|
62
|
+
set_rate(key, rate, decision)
|
|
63
63
|
end
|
|
64
64
|
end
|
|
65
65
|
|
|
66
|
-
def update_all(rate_by_key)
|
|
66
|
+
def update_all(rate_by_key, decision: nil)
|
|
67
67
|
@mutex.synchronize do
|
|
68
|
-
rate_by_key.each { |key, rate| set_rate(key, rate) }
|
|
68
|
+
rate_by_key.each { |key, rate| set_rate(key, rate, decision) }
|
|
69
69
|
end
|
|
70
70
|
end
|
|
71
71
|
|
|
@@ -87,9 +87,8 @@ module Datadog
|
|
|
87
87
|
|
|
88
88
|
private
|
|
89
89
|
|
|
90
|
-
def set_rate(key, rate)
|
|
91
|
-
@samplers[key]
|
|
92
|
-
@samplers[key].sample_rate = rate
|
|
90
|
+
def set_rate(key, rate, decision)
|
|
91
|
+
@samplers[key] = RateSampler.new(rate, decision: decision)
|
|
93
92
|
end
|
|
94
93
|
end
|
|
95
94
|
end
|
|
@@ -11,17 +11,23 @@ module Datadog
|
|
|
11
11
|
class RateByServiceSampler < RateByKeySampler
|
|
12
12
|
DEFAULT_KEY = 'service:,env:'.freeze
|
|
13
13
|
|
|
14
|
-
def initialize(default_rate = 1.0,
|
|
15
|
-
super(
|
|
16
|
-
|
|
14
|
+
def initialize(default_rate = 1.0, env: nil, decision: Datadog::Tracing::Sampling::Ext::Decision::DEFAULT)
|
|
15
|
+
super(
|
|
16
|
+
DEFAULT_KEY,
|
|
17
|
+
default_rate,
|
|
18
|
+
decision: decision,
|
|
19
|
+
&method(:key_for)
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
@env = env
|
|
17
23
|
end
|
|
18
24
|
|
|
19
|
-
def update(rate_by_service)
|
|
25
|
+
def update(rate_by_service, decision: nil)
|
|
20
26
|
# Remove any old services
|
|
21
27
|
delete_if { |key, _| key != DEFAULT_KEY && !rate_by_service.key?(key) }
|
|
22
28
|
|
|
23
29
|
# Update each service rate
|
|
24
|
-
update_all(rate_by_service)
|
|
30
|
+
update_all(rate_by_service, decision: decision)
|
|
25
31
|
|
|
26
32
|
# Emit metric for service cache size
|
|
27
33
|
Datadog.health_metrics.sampling_service_cache_length(length)
|
|
@@ -29,6 +35,24 @@ module Datadog
|
|
|
29
35
|
|
|
30
36
|
private
|
|
31
37
|
|
|
38
|
+
# DEV: Creating a string on every trace to perform a single Hash lookup is expensive.
|
|
39
|
+
#
|
|
40
|
+
# Using 2 nested hashes: 1 for env and 1 for service is the fastest option.
|
|
41
|
+
# This approach requires large API changes to `RateByKeySampler`.
|
|
42
|
+
#
|
|
43
|
+
# Reducing the interpolated string size, by using a 1 character separator,
|
|
44
|
+
# is also measurably faster than the current method. This approach does not
|
|
45
|
+
# require changes to `RateByKeySampler`.
|
|
46
|
+
#
|
|
47
|
+
# Keep in mind that these changes also require changes to `#update`.
|
|
48
|
+
#
|
|
49
|
+
# Comparison:
|
|
50
|
+
# 2 nested hashes: `service_hash.fetch(service, {}).fetch(env, default_rate)`
|
|
51
|
+
# 7730045 i/s
|
|
52
|
+
# 1 char separator: `hash.fetch("#{service}\0#{env}", default_rate)`
|
|
53
|
+
# 4302801 i/s - 1.80x slower
|
|
54
|
+
# current: `hash.fetch("service:#{service},env:#{env}", default_rate)`
|
|
55
|
+
# 2720459 i/s - 2.84x slower
|
|
32
56
|
def key_for(trace)
|
|
33
57
|
# Resolve env dynamically, if Proc is given.
|
|
34
58
|
env = @env.is_a?(Proc) ? @env.call : @env
|
|
@@ -30,7 +30,7 @@ module Datadog
|
|
|
30
30
|
# DEV-2.0: sampler = RateSampler.new
|
|
31
31
|
# DEV-2.0: sampler.sample_rate = sample_rate
|
|
32
32
|
# DEV-2.0: ```
|
|
33
|
-
def initialize(sample_rate = 1.0)
|
|
33
|
+
def initialize(sample_rate = 1.0, decision: nil)
|
|
34
34
|
super()
|
|
35
35
|
|
|
36
36
|
unless sample_rate > 0.0 && sample_rate <= 1.0
|
|
@@ -39,6 +39,8 @@ module Datadog
|
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
self.sample_rate = sample_rate
|
|
42
|
+
|
|
43
|
+
@decision = decision
|
|
42
44
|
end
|
|
43
45
|
|
|
44
46
|
def sample_rate(*_)
|
|
@@ -56,8 +58,13 @@ module Datadog
|
|
|
56
58
|
|
|
57
59
|
def sample!(trace)
|
|
58
60
|
sampled = trace.sampled = sample?(trace)
|
|
59
|
-
|
|
60
|
-
sampled
|
|
61
|
+
|
|
62
|
+
return false unless sampled
|
|
63
|
+
|
|
64
|
+
trace.sample_rate = @sample_rate
|
|
65
|
+
trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, @decision) if @decision
|
|
66
|
+
|
|
67
|
+
true
|
|
61
68
|
end
|
|
62
69
|
end
|
|
63
70
|
end
|
|
@@ -48,7 +48,7 @@ module Datadog
|
|
|
48
48
|
nil
|
|
49
49
|
else
|
|
50
50
|
# TODO: Simplify .tags access, as `Tracer#tags` can't be arbitrarily changed anymore
|
|
51
|
-
RateByServiceSampler.new(1.0, env: -> { Tracing.send(:tracer).tags[
|
|
51
|
+
RateByServiceSampler.new(1.0, env: -> { Tracing.send(:tracer).tags['env'] })
|
|
52
52
|
end
|
|
53
53
|
end
|
|
54
54
|
|
|
@@ -76,10 +76,10 @@ module Datadog
|
|
|
76
76
|
end
|
|
77
77
|
|
|
78
78
|
# @!visibility private
|
|
79
|
-
def update(*args)
|
|
79
|
+
def update(*args, **kwargs)
|
|
80
80
|
return false unless @default_sampler.respond_to?(:update)
|
|
81
81
|
|
|
82
|
-
@default_sampler.update(*args)
|
|
82
|
+
@default_sampler.update(*args, **kwargs)
|
|
83
83
|
end
|
|
84
84
|
|
|
85
85
|
private
|
|
@@ -100,6 +100,7 @@ module Datadog
|
|
|
100
100
|
rate_limiter.allow?(1).tap do |allowed|
|
|
101
101
|
set_priority(trace, allowed)
|
|
102
102
|
set_limiter_metrics(trace, rate_limiter.effective_rate)
|
|
103
|
+
trace.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, Ext::Decision::TRACE_SAMPLING_RULE)
|
|
103
104
|
end
|
|
104
105
|
rescue StandardError => e
|
|
105
106
|
Datadog.logger.error(
|
|
@@ -18,10 +18,6 @@ module Datadog
|
|
|
18
18
|
TAG_RULE_RATE = '_dd.span_sampling.rule_rate'
|
|
19
19
|
# Rate limit configured for this span, if a rule applies
|
|
20
20
|
TAG_MAX_PER_SECOND = '_dd.span_sampling.max_per_second'
|
|
21
|
-
|
|
22
|
-
# This span was sampled on account of a Span Sampling Rule
|
|
23
|
-
# @see Datadog::Tracing::Sampling::Span::Rule
|
|
24
|
-
MECHANISM_SPAN_SAMPLING_RATE = 8
|
|
25
21
|
end
|
|
26
22
|
end
|
|
27
23
|
end
|
|
@@ -59,7 +59,7 @@ module Datadog
|
|
|
59
59
|
return :not_matched unless @matcher.match?(span_op)
|
|
60
60
|
|
|
61
61
|
if @sampler.sample?(span_op) && @rate_limiter.allow?(1)
|
|
62
|
-
span_op.set_metric(Span::Ext::TAG_MECHANISM,
|
|
62
|
+
span_op.set_metric(Span::Ext::TAG_MECHANISM, Sampling::Ext::Mechanism::SPAN_SAMPLING_RATE)
|
|
63
63
|
span_op.set_metric(Span::Ext::TAG_RULE_RATE, @sample_rate)
|
|
64
64
|
span_op.set_metric(Span::Ext::TAG_MAX_PER_SECOND, @rate_limit)
|
|
65
65
|
:kept
|
|
@@ -50,9 +50,20 @@ module Datadog
|
|
|
50
50
|
def sample!(trace_op, span_op)
|
|
51
51
|
return if trace_op.sampled? && trace_op.priority_sampled?
|
|
52
52
|
|
|
53
|
-
#
|
|
54
|
-
@rules.
|
|
55
|
-
rule.sample!(span_op)
|
|
53
|
+
# Applies the first matching rule
|
|
54
|
+
@rules.each do |rule|
|
|
55
|
+
decision = rule.sample!(span_op)
|
|
56
|
+
|
|
57
|
+
next if decision == :not_matched # Iterate until we find a matching decision
|
|
58
|
+
|
|
59
|
+
if decision == :kept
|
|
60
|
+
trace_op.set_tag(
|
|
61
|
+
Metadata::Ext::Distributed::TAG_DECISION_MAKER,
|
|
62
|
+
Sampling::Ext::Decision::SPAN_SAMPLING_RATE
|
|
63
|
+
)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
break # Found either a `kept` or `rejected` decision
|
|
56
67
|
end
|
|
57
68
|
|
|
58
69
|
nil
|
|
@@ -12,6 +12,7 @@ module Datadog
|
|
|
12
12
|
:span_resource,
|
|
13
13
|
:span_service,
|
|
14
14
|
:span_type,
|
|
15
|
+
:trace_distributed_tags,
|
|
15
16
|
:trace_hostname,
|
|
16
17
|
:trace_id,
|
|
17
18
|
:trace_name,
|
|
@@ -28,6 +29,7 @@ module Datadog
|
|
|
28
29
|
span_resource: nil,
|
|
29
30
|
span_service: nil,
|
|
30
31
|
span_type: nil,
|
|
32
|
+
trace_distributed_tags: nil,
|
|
31
33
|
trace_hostname: nil,
|
|
32
34
|
trace_id: nil,
|
|
33
35
|
trace_name: nil,
|
|
@@ -43,6 +45,7 @@ module Datadog
|
|
|
43
45
|
@span_resource = span_resource && span_resource.dup.freeze
|
|
44
46
|
@span_service = span_service && span_service.dup.freeze
|
|
45
47
|
@span_type = span_type && span_type.dup.freeze
|
|
48
|
+
@trace_distributed_tags = trace_distributed_tags && trace_distributed_tags.dup.freeze
|
|
46
49
|
@trace_hostname = trace_hostname && trace_hostname.dup.freeze
|
|
47
50
|
@trace_id = trace_id
|
|
48
51
|
@trace_name = trace_name && trace_name.dup.freeze
|
|
@@ -133,11 +133,13 @@ module Datadog
|
|
|
133
133
|
def keep!
|
|
134
134
|
self.sampled = true
|
|
135
135
|
self.sampling_priority = Sampling::Ext::Priority::USER_KEEP
|
|
136
|
+
set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, Tracing::Sampling::Ext::Decision::MANUAL)
|
|
136
137
|
end
|
|
137
138
|
|
|
138
139
|
def reject!
|
|
139
140
|
self.sampled = false
|
|
140
141
|
self.sampling_priority = Sampling::Ext::Priority::USER_REJECT
|
|
142
|
+
set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, Tracing::Sampling::Ext::Decision::MANUAL)
|
|
141
143
|
end
|
|
142
144
|
|
|
143
145
|
def name
|
|
@@ -278,6 +280,7 @@ module Datadog
|
|
|
278
280
|
span_resource: (@active_span && @active_span.resource),
|
|
279
281
|
span_service: (@active_span && @active_span.service),
|
|
280
282
|
span_type: (@active_span && @active_span.type),
|
|
283
|
+
trace_distributed_tags: distributed_tags,
|
|
281
284
|
trace_hostname: @hostname,
|
|
282
285
|
trace_id: @id,
|
|
283
286
|
trace_name: name,
|
|
@@ -452,6 +455,13 @@ module Datadog
|
|
|
452
455
|
root_span_id: !partial ? root_span && root_span.id : nil
|
|
453
456
|
)
|
|
454
457
|
end
|
|
458
|
+
|
|
459
|
+
# Returns tracer tags that will be propagated if this span's context
|
|
460
|
+
# is exported through {.to_digest}.
|
|
461
|
+
# @return [Hash] key value pairs of distributed tags
|
|
462
|
+
def distributed_tags
|
|
463
|
+
meta.select { |name, _| name.start_with?(Metadata::Ext::Distributed::TAGS_PREFIX) }
|
|
464
|
+
end
|
|
455
465
|
end
|
|
456
466
|
end
|
|
457
467
|
end
|
|
@@ -30,6 +30,7 @@ module Datadog
|
|
|
30
30
|
:rule_sample_rate,
|
|
31
31
|
:runtime_id,
|
|
32
32
|
:sample_rate,
|
|
33
|
+
:sampling_decision_maker,
|
|
33
34
|
:sampling_priority,
|
|
34
35
|
:service
|
|
35
36
|
|
|
@@ -77,6 +78,7 @@ module Datadog
|
|
|
77
78
|
@rule_sample_rate = rule_sample_rate_tag || rule_sample_rate
|
|
78
79
|
@runtime_id = runtime_id || runtime_id_tag
|
|
79
80
|
@sample_rate = sample_rate || sample_rate_tag
|
|
81
|
+
@sampling_decision_maker = sampling_decision_maker_tag
|
|
80
82
|
@sampling_priority = sampling_priority || sampling_priority_tag
|
|
81
83
|
@service = Core::Utils::SafeDup.frozen_or_dup(service || service_tag)
|
|
82
84
|
end
|
|
@@ -194,6 +196,10 @@ module Datadog
|
|
|
194
196
|
metrics[Metadata::Ext::Sampling::TAG_SAMPLE_RATE]
|
|
195
197
|
end
|
|
196
198
|
|
|
199
|
+
def sampling_decision_maker_tag
|
|
200
|
+
meta[Metadata::Ext::Distributed::TAG_DECISION_MAKER]
|
|
201
|
+
end
|
|
202
|
+
|
|
197
203
|
def sampling_priority_tag
|
|
198
204
|
meta[Metadata::Ext::Distributed::TAG_SAMPLING_PRIORITY]
|
|
199
205
|
end
|
|
@@ -326,7 +326,9 @@ module Datadog
|
|
|
326
326
|
id: digest.trace_id,
|
|
327
327
|
origin: digest.trace_origin,
|
|
328
328
|
parent_span_id: digest.span_id,
|
|
329
|
-
sampling_priority: digest.trace_sampling_priority
|
|
329
|
+
sampling_priority: digest.trace_sampling_priority,
|
|
330
|
+
# Distributed tags are just regular trace tags with special meaning to Datadog
|
|
331
|
+
tags: digest.trace_distributed_tags,
|
|
330
332
|
)
|
|
331
333
|
else
|
|
332
334
|
TraceOperation.new(
|
|
@@ -48,6 +48,7 @@ module Datadog
|
|
|
48
48
|
tag_runtime_id!
|
|
49
49
|
tag_rate_limiter_rate!
|
|
50
50
|
tag_sample_rate!
|
|
51
|
+
tag_sampling_decision_maker!
|
|
51
52
|
tag_sampling_priority!
|
|
52
53
|
|
|
53
54
|
trace
|
|
@@ -155,6 +156,12 @@ module Datadog
|
|
|
155
156
|
)
|
|
156
157
|
end
|
|
157
158
|
|
|
159
|
+
def tag_sampling_decision_maker!
|
|
160
|
+
return unless (decision = trace.sampling_decision_maker)
|
|
161
|
+
|
|
162
|
+
root_span.set_tag(Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER, decision)
|
|
163
|
+
end
|
|
164
|
+
|
|
158
165
|
def tag_sampling_priority!
|
|
159
166
|
return unless trace.sampling_priority
|
|
160
167
|
|
|
@@ -80,7 +80,7 @@ module Datadog
|
|
|
80
80
|
|
|
81
81
|
if encoded.size > max_size
|
|
82
82
|
# This single trace is too large, we can't flush it
|
|
83
|
-
Datadog.logger.debug { "Dropping trace. Payload too large: '#{trace.
|
|
83
|
+
Datadog.logger.debug { "Dropping trace. Payload too large: '#{trace.inspect}'" }
|
|
84
84
|
Datadog.health_metrics.transport_trace_too_large(1)
|
|
85
85
|
|
|
86
86
|
return nil
|
data/lib/ddtrace/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ddtrace
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Datadog, Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-11-15 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: msgpack
|
|
@@ -64,14 +64,14 @@ dependencies:
|
|
|
64
64
|
requirements:
|
|
65
65
|
- - "~>"
|
|
66
66
|
- !ruby/object:Gem::Version
|
|
67
|
-
version: 0.
|
|
67
|
+
version: 0.9.0.1.0
|
|
68
68
|
type: :runtime
|
|
69
69
|
prerelease: false
|
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
|
71
71
|
requirements:
|
|
72
72
|
- - "~>"
|
|
73
73
|
- !ruby/object:Gem::Version
|
|
74
|
-
version: 0.
|
|
74
|
+
version: 0.9.0.1.0
|
|
75
75
|
description: |
|
|
76
76
|
ddtrace is Datadog's tracing client for Ruby. It is used to trace requests
|
|
77
77
|
as they flow across web servers, databases and microservices so that developers
|
|
@@ -314,7 +314,6 @@ files:
|
|
|
314
314
|
- lib/datadog/profiling/http_transport.rb
|
|
315
315
|
- lib/datadog/profiling/load_native_extension.rb
|
|
316
316
|
- lib/datadog/profiling/native_extension.rb
|
|
317
|
-
- lib/datadog/profiling/old_ext.rb
|
|
318
317
|
- lib/datadog/profiling/old_recorder.rb
|
|
319
318
|
- lib/datadog/profiling/pprof/builder.rb
|
|
320
319
|
- lib/datadog/profiling/pprof/converter.rb
|
|
@@ -335,14 +334,6 @@ files:
|
|
|
335
334
|
- lib/datadog/profiling/tasks/setup.rb
|
|
336
335
|
- lib/datadog/profiling/trace_identifiers/ddtrace.rb
|
|
337
336
|
- lib/datadog/profiling/trace_identifiers/helper.rb
|
|
338
|
-
- lib/datadog/profiling/transport/http.rb
|
|
339
|
-
- lib/datadog/profiling/transport/http/api.rb
|
|
340
|
-
- lib/datadog/profiling/transport/http/api/endpoint.rb
|
|
341
|
-
- lib/datadog/profiling/transport/http/api/instance.rb
|
|
342
|
-
- lib/datadog/profiling/transport/http/api/spec.rb
|
|
343
|
-
- lib/datadog/profiling/transport/http/builder.rb
|
|
344
|
-
- lib/datadog/profiling/transport/http/client.rb
|
|
345
|
-
- lib/datadog/profiling/transport/http/response.rb
|
|
346
337
|
- lib/datadog/tracing.rb
|
|
347
338
|
- lib/datadog/tracing/analytics.rb
|
|
348
339
|
- lib/datadog/tracing/buffer.rb
|
|
@@ -505,6 +496,14 @@ files:
|
|
|
505
496
|
- lib/datadog/tracing/contrib/grpc/integration.rb
|
|
506
497
|
- lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb
|
|
507
498
|
- lib/datadog/tracing/contrib/grpc/patcher.rb
|
|
499
|
+
- lib/datadog/tracing/contrib/hanami/action_tracer.rb
|
|
500
|
+
- lib/datadog/tracing/contrib/hanami/configuration/settings.rb
|
|
501
|
+
- lib/datadog/tracing/contrib/hanami/ext.rb
|
|
502
|
+
- lib/datadog/tracing/contrib/hanami/integration.rb
|
|
503
|
+
- lib/datadog/tracing/contrib/hanami/patcher.rb
|
|
504
|
+
- lib/datadog/tracing/contrib/hanami/plugin.rb
|
|
505
|
+
- lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb
|
|
506
|
+
- lib/datadog/tracing/contrib/hanami/router_tracing.rb
|
|
508
507
|
- lib/datadog/tracing/contrib/http/circuit_breaker.rb
|
|
509
508
|
- lib/datadog/tracing/contrib/http/configuration/settings.rb
|
|
510
509
|
- lib/datadog/tracing/contrib/http/ext.rb
|
|
@@ -569,6 +568,10 @@ files:
|
|
|
569
568
|
- lib/datadog/tracing/contrib/presto/instrumentation.rb
|
|
570
569
|
- lib/datadog/tracing/contrib/presto/integration.rb
|
|
571
570
|
- lib/datadog/tracing/contrib/presto/patcher.rb
|
|
571
|
+
- lib/datadog/tracing/contrib/propagation/sql_comment.rb
|
|
572
|
+
- lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb
|
|
573
|
+
- lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb
|
|
574
|
+
- lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb
|
|
572
575
|
- lib/datadog/tracing/contrib/qless/configuration/settings.rb
|
|
573
576
|
- lib/datadog/tracing/contrib/qless/ext.rb
|
|
574
577
|
- lib/datadog/tracing/contrib/qless/integration.rb
|
|
@@ -686,6 +689,7 @@ files:
|
|
|
686
689
|
- lib/datadog/tracing/contrib/utils/quantization/hash.rb
|
|
687
690
|
- lib/datadog/tracing/contrib/utils/quantization/http.rb
|
|
688
691
|
- lib/datadog/tracing/correlation.rb
|
|
692
|
+
- lib/datadog/tracing/distributed/datadog_tags_codec.rb
|
|
689
693
|
- lib/datadog/tracing/distributed/headers/b3.rb
|
|
690
694
|
- lib/datadog/tracing/distributed/headers/b3_single.rb
|
|
691
695
|
- lib/datadog/tracing/distributed/headers/datadog.rb
|
|
@@ -792,7 +796,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
792
796
|
- !ruby/object:Gem::Version
|
|
793
797
|
version: 2.0.0
|
|
794
798
|
requirements: []
|
|
795
|
-
rubygems_version: 3.
|
|
799
|
+
rubygems_version: 3.3.7
|
|
796
800
|
signing_key:
|
|
797
801
|
specification_version: 4
|
|
798
802
|
summary: Datadog tracing code for your Ruby applications
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# typed: true
|
|
2
|
-
|
|
3
|
-
module Datadog
|
|
4
|
-
module Profiling
|
|
5
|
-
# NOTE: This OldExt file is temporary and expected to be removed once the migration to the new `HttpTransport` class
|
|
6
|
-
# is complete
|
|
7
|
-
module OldExt
|
|
8
|
-
module Transport
|
|
9
|
-
module HTTP
|
|
10
|
-
URI_TEMPLATE_DD_API = 'https://intake.profile.%s/'.freeze
|
|
11
|
-
|
|
12
|
-
FORM_FIELD_RECORDING_START = 'start'.freeze
|
|
13
|
-
FORM_FIELD_RECORDING_END = 'end'.freeze
|
|
14
|
-
FORM_FIELD_FAMILY = 'family'.freeze
|
|
15
|
-
FORM_FIELD_TAG_ENV = 'env'.freeze
|
|
16
|
-
FORM_FIELD_TAG_HOST = 'host'.freeze
|
|
17
|
-
FORM_FIELD_TAG_LANGUAGE = 'language'.freeze
|
|
18
|
-
FORM_FIELD_TAG_PID = 'process_id'.freeze
|
|
19
|
-
FORM_FIELD_TAG_PROFILER_VERSION = 'profiler_version'.freeze
|
|
20
|
-
FORM_FIELD_TAG_RUNTIME = 'runtime'.freeze
|
|
21
|
-
FORM_FIELD_TAG_RUNTIME_ENGINE = 'runtime_engine'.freeze
|
|
22
|
-
FORM_FIELD_TAG_RUNTIME_ID = 'runtime-id'.freeze
|
|
23
|
-
FORM_FIELD_TAG_RUNTIME_PLATFORM = 'runtime_platform'.freeze
|
|
24
|
-
FORM_FIELD_TAG_RUNTIME_VERSION = 'runtime_version'.freeze
|
|
25
|
-
FORM_FIELD_TAG_SERVICE = 'service'.freeze
|
|
26
|
-
FORM_FIELD_TAG_VERSION = 'version'.freeze
|
|
27
|
-
FORM_FIELD_TAGS = 'tags'.freeze
|
|
28
|
-
FORM_FIELD_INTAKE_VERSION = 'version'.freeze
|
|
29
|
-
|
|
30
|
-
HEADER_CONTENT_TYPE = 'Content-Type'.freeze
|
|
31
|
-
HEADER_CONTENT_TYPE_OCTET_STREAM = 'application/octet-stream'.freeze
|
|
32
|
-
|
|
33
|
-
FORM_FIELD_PPROF_DATA = 'data[rubyprofile.pprof]'.freeze
|
|
34
|
-
PPROF_DEFAULT_FILENAME = 'rubyprofile.pprof.gz'.freeze
|
|
35
|
-
|
|
36
|
-
FORM_FIELD_CODE_PROVENANCE_DATA = 'data[code-provenance.json]'.freeze
|
|
37
|
-
CODE_PROVENANCE_FILENAME = 'code-provenance.json.gz'.freeze
|
|
38
|
-
end
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|