datadog 2.0.0 → 2.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +14 -1
- data/README.md +1 -1
- data/lib/datadog/appsec/configuration/settings.rb +5 -0
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +0 -1
- data/lib/datadog/core/configuration/ext.rb +1 -0
- data/lib/datadog/core/configuration/option.rb +21 -14
- data/lib/datadog/core/configuration/options.rb +5 -1
- data/lib/datadog/core/configuration/settings.rb +29 -5
- data/lib/datadog/core/environment/ext.rb +2 -0
- data/lib/datadog/core/runtime/ext.rb +1 -0
- data/lib/datadog/core/telemetry/event.rb +28 -10
- data/lib/datadog/tracing/configuration/ext.rb +7 -0
- data/lib/datadog/tracing/configuration/settings.rb +52 -3
- data/lib/datadog/tracing/distributed/propagation.rb +30 -2
- data/lib/datadog/tracing/distributed/trace_context.rb +2 -1
- data/lib/datadog/tracing/metadata/ext.rb +1 -0
- data/lib/datadog/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0297728b2d8779a69af39f3dffa86af6b3765e3f2dd19cb685340ca7ad8e2ac
|
4
|
+
data.tar.gz: 3c7d3506df76790fea0b2e2047d1b2c4919e9d928ccb644086194197125391e7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec2862773c6ee93e5d698d6b586a576413689a84f7d94a621c20088759469e1ad6742e13fc1e7f9250046212cec0e284abf4fb0048e255802c19f378cf7d428c
|
7
|
+
data.tar.gz: 507fbfd3f8879333c11336646e1a56ca453fbaf92c84fb0bae3b0e38435f3ea1ec6b3ddc756f848c76113a4e5832f8097cd521532541bf9ca8fdff6cca1e5ff3
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,16 @@
|
|
2
2
|
|
3
3
|
## [Unreleased]
|
4
4
|
|
5
|
+
## [2.1.0] - 2024-06-10
|
6
|
+
|
7
|
+
### Added
|
8
|
+
|
9
|
+
* Tracing: Configuration by OpenTelemetry environment variables ([#3657][])
|
10
|
+
|
11
|
+
### Fixed
|
12
|
+
|
13
|
+
* Tracing: Improved compatibility with W3C Trace Context propagation ([#3631][])
|
14
|
+
|
5
15
|
## [2.0.0] - 2024-06-06
|
6
16
|
|
7
17
|
### Added
|
@@ -2894,7 +2904,8 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
|
|
2894
2904
|
Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
2895
2905
|
|
2896
2906
|
|
2897
|
-
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v2.
|
2907
|
+
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v2.1.0...master
|
2908
|
+
[2.1.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.0.0...v2.1.0
|
2898
2909
|
[2.0.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.0.0.rc1...v2.0.0
|
2899
2910
|
[2.0.0.rc1]: https://github.com/DataDog/dd-trace-rb/compare/v2.0.0.beta2...v2.0.0.rc1
|
2900
2911
|
[1.23.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.22.0...v1.23.0
|
@@ -4267,8 +4278,10 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
4267
4278
|
[#3624]: https://github.com/DataDog/dd-trace-rb/issues/3624
|
4268
4279
|
[#3627]: https://github.com/DataDog/dd-trace-rb/issues/3627
|
4269
4280
|
[#3630]: https://github.com/DataDog/dd-trace-rb/issues/3630
|
4281
|
+
[#3631]: https://github.com/DataDog/dd-trace-rb/issues/3631
|
4270
4282
|
[#3645]: https://github.com/DataDog/dd-trace-rb/issues/3645
|
4271
4283
|
[#3651]: https://github.com/DataDog/dd-trace-rb/issues/3651
|
4284
|
+
[#3657]: https://github.com/DataDog/dd-trace-rb/issues/3657
|
4272
4285
|
[#3664]: https://github.com/DataDog/dd-trace-rb/issues/3664
|
4273
4286
|
[@AdrianLC]: https://github.com/AdrianLC
|
4274
4287
|
[@Azure7111]: https://github.com/Azure7111
|
data/README.md
CHANGED
@@ -8,7 +8,7 @@
|
|
8
8
|
|
9
9
|
## Getting started
|
10
10
|
|
11
|
-
**If you're upgrading from a
|
11
|
+
**If you're upgrading from a 1.x version, check out the [upgrade guide](https://github.com/DataDog/dd-trace-rb/blob/release/docs/UpgradeGuide2.md).**
|
12
12
|
|
13
13
|
For a product overview, installation, and configuration check out our [documentation][public docs].
|
14
14
|
|
@@ -14,7 +14,7 @@ module Datadog
|
|
14
14
|
# @!attribute [r] precedence_set
|
15
15
|
# When this option was last set, what was the value precedence used?
|
16
16
|
# @return [Precedence::Value]
|
17
|
-
attr_reader :definition, :precedence_set
|
17
|
+
attr_reader :definition, :precedence_set, :resolved_env
|
18
18
|
|
19
19
|
# Option setting precedence.
|
20
20
|
module Precedence
|
@@ -50,6 +50,7 @@ module Datadog
|
|
50
50
|
@context = context
|
51
51
|
@value = nil
|
52
52
|
@is_set = false
|
53
|
+
@resolved_env = nil
|
53
54
|
|
54
55
|
# One value is stored per precedence, to allow unsetting a higher
|
55
56
|
# precedence value and falling back to a lower precedence one.
|
@@ -65,7 +66,7 @@ module Datadog
|
|
65
66
|
#
|
66
67
|
# @param value [Object] the new value to be associated with this option
|
67
68
|
# @param precedence [Precedence] from what precedence order this new value comes from
|
68
|
-
def set(value, precedence: Precedence::PROGRAMMATIC)
|
69
|
+
def set(value, precedence: Precedence::PROGRAMMATIC, resolved_env: nil)
|
69
70
|
# Is there a higher precedence value set?
|
70
71
|
if @precedence_set > precedence
|
71
72
|
# This should be uncommon, as higher precedence values tend to
|
@@ -84,7 +85,7 @@ module Datadog
|
|
84
85
|
return @value
|
85
86
|
end
|
86
87
|
|
87
|
-
internal_set(value, precedence)
|
88
|
+
internal_set(value, precedence, resolved_env)
|
88
89
|
end
|
89
90
|
|
90
91
|
def unset(precedence)
|
@@ -102,7 +103,7 @@ module Datadog
|
|
102
103
|
# Look for value that is set.
|
103
104
|
# The hash `@value_per_precedence` has a custom default value of `UNSET`.
|
104
105
|
if (value = @value_per_precedence[p]) != UNSET
|
105
|
-
internal_set(value, p)
|
106
|
+
internal_set(value, p, nil)
|
106
107
|
return nil
|
107
108
|
end
|
108
109
|
end
|
@@ -260,11 +261,12 @@ module Datadog
|
|
260
261
|
end
|
261
262
|
|
262
263
|
# Directly manipulates the current value and currently set precedence.
|
263
|
-
def internal_set(value, precedence)
|
264
|
+
def internal_set(value, precedence, resolved_env)
|
264
265
|
old_value = @value
|
265
266
|
(@value = context_exec(validate_type(value), old_value, &definition.setter)).tap do |v|
|
266
267
|
@is_set = true
|
267
268
|
@precedence_set = precedence
|
269
|
+
@resolved_env = resolved_env
|
268
270
|
# Store original value to ensure we can always safely call `#internal_set`
|
269
271
|
# when restoring a value from `@value_per_precedence`, and we are only running `definition.setter`
|
270
272
|
# on the original value, not on a valud that has already been processed by `definition.setter`.
|
@@ -284,16 +286,21 @@ module Datadog
|
|
284
286
|
def set_value_from_env_or_default
|
285
287
|
value = nil
|
286
288
|
precedence = nil
|
287
|
-
|
289
|
+
resolved_env = nil
|
288
290
|
|
289
|
-
if definition.env
|
290
|
-
|
291
|
-
|
292
|
-
|
291
|
+
if definition.env
|
292
|
+
Array(definition.env).each do |env|
|
293
|
+
next if ENV[env].nil?
|
294
|
+
|
295
|
+
resolved_env = env
|
296
|
+
value = coerce_env_variable(ENV[env])
|
297
|
+
precedence = Precedence::PROGRAMMATIC
|
298
|
+
break
|
299
|
+
end
|
293
300
|
end
|
294
301
|
|
295
302
|
if value.nil? && definition.deprecated_env && ENV[definition.deprecated_env]
|
296
|
-
|
303
|
+
resolved_env = definition.deprecated_env
|
297
304
|
value = coerce_env_variable(ENV[definition.deprecated_env])
|
298
305
|
precedence = Precedence::PROGRAMMATIC
|
299
306
|
|
@@ -304,11 +311,11 @@ module Datadog
|
|
304
311
|
|
305
312
|
option_value = value.nil? ? default_value : value
|
306
313
|
|
307
|
-
set(option_value, precedence: precedence || Precedence::DEFAULT)
|
314
|
+
set(option_value, precedence: precedence || Precedence::DEFAULT, resolved_env: resolved_env)
|
308
315
|
rescue ArgumentError
|
309
316
|
raise ArgumentError,
|
310
|
-
"Expected environment variable #{
|
311
|
-
"but '#{ENV[
|
317
|
+
"Expected environment variable #{resolved_env} to be a #{@definition.type}, " \
|
318
|
+
"but '#{ENV[resolved_env]}' was provided"
|
312
319
|
end
|
313
320
|
|
314
321
|
# Anchor object that represents a value that is not set.
|
@@ -68,7 +68,7 @@ module Datadog
|
|
68
68
|
end
|
69
69
|
|
70
70
|
def set_option(name, value, precedence: Configuration::Option::Precedence::PROGRAMMATIC)
|
71
|
-
resolve_option(name).set(value, precedence: precedence)
|
71
|
+
resolve_option(name).set(value, precedence: precedence, resolved_env: resolved_env(name))
|
72
72
|
end
|
73
73
|
|
74
74
|
def unset_option(name, precedence: Configuration::Option::Precedence::PROGRAMMATIC)
|
@@ -116,6 +116,10 @@ module Datadog
|
|
116
116
|
options[name] = definition.build(self)
|
117
117
|
end
|
118
118
|
|
119
|
+
def resolved_env(name)
|
120
|
+
return options[name].resolved_env if options.key?(name)
|
121
|
+
end
|
122
|
+
|
119
123
|
def assert_valid_option!(name)
|
120
124
|
raise(InvalidOptionError, "#{self.class.name} doesn't define the option: #{name}") unless option_defined?(name)
|
121
125
|
end
|
@@ -122,9 +122,18 @@ module Datadog
|
|
122
122
|
# @default `DD_TRACE_DEBUG` environment variable, otherwise `false`
|
123
123
|
# @return [Boolean]
|
124
124
|
option :debug do |o|
|
125
|
-
o.env Datadog::Core::Configuration::Ext::Diagnostics::ENV_DEBUG_ENABLED
|
125
|
+
o.env [Datadog::Core::Configuration::Ext::Diagnostics::ENV_DEBUG_ENABLED,
|
126
|
+
Datadog::Core::Configuration::Ext::Diagnostics::ENV_OTEL_LOG_LEVEL]
|
126
127
|
o.default false
|
127
128
|
o.type :bool
|
129
|
+
o.env_parser do |value|
|
130
|
+
if value
|
131
|
+
value = value.strip.downcase
|
132
|
+
# Debug is enabled when DD_TRACE_DEBUG is true or 1 OR
|
133
|
+
# when OTEL_LOG_LEVEL is set to debug
|
134
|
+
['true', '1', 'debug'].include?(value)
|
135
|
+
end
|
136
|
+
end
|
128
137
|
o.after_set do |enabled|
|
129
138
|
# Enable rich debug print statements.
|
130
139
|
# We do not need to unnecessarily load 'pp' unless in debugging mode.
|
@@ -465,7 +474,7 @@ module Datadog
|
|
465
474
|
o.type :string, nilable: true
|
466
475
|
|
467
476
|
# NOTE: service also gets set as a side effect of tags. See the WORKAROUND note in #initialize for details.
|
468
|
-
o.env Core::Environment::Ext::ENV_SERVICE
|
477
|
+
o.env [Core::Environment::Ext::ENV_SERVICE, Core::Environment::Ext::ENV_OTEL_SERVICE]
|
469
478
|
o.default Core::Environment::Ext::FALLBACK_SERVICE_NAME
|
470
479
|
|
471
480
|
# There's a few cases where we don't want to use the fallback service name, so this helper allows us to get a
|
@@ -500,14 +509,13 @@ module Datadog
|
|
500
509
|
# @return [Hash<String,String>]
|
501
510
|
option :tags do |o|
|
502
511
|
o.type :hash, nilable: true
|
503
|
-
o.env Core::Environment::Ext::ENV_TAGS
|
512
|
+
o.env [Core::Environment::Ext::ENV_TAGS, Core::Environment::Ext::ENV_OTEL_RESOURCE_ATTRIBUTES]
|
504
513
|
o.env_parser do |env_value|
|
505
514
|
values = if env_value.include?(',')
|
506
515
|
env_value.split(',')
|
507
516
|
else
|
508
517
|
env_value.split(' ') # rubocop:disable Style/RedundantArgument
|
509
518
|
end
|
510
|
-
|
511
519
|
values.map! do |v|
|
512
520
|
v.gsub!(/\A[\s,]*|[\s,]*\Z/, '')
|
513
521
|
|
@@ -517,7 +525,23 @@ module Datadog
|
|
517
525
|
values.compact!
|
518
526
|
values.each_with_object({}) do |tag, tags|
|
519
527
|
key, value = tag.split(':', 2)
|
520
|
-
|
528
|
+
if value.nil?
|
529
|
+
# support tags/attributes delimited by the OpenTelemetry separator (`=`)
|
530
|
+
key, value = tag.split('=', 2)
|
531
|
+
end
|
532
|
+
next if value.nil? || value.empty?
|
533
|
+
|
534
|
+
# maps OpenTelemetry semantic attributes to Datadog tags
|
535
|
+
case key.downcase
|
536
|
+
when 'deployment.environment'
|
537
|
+
tags['env'] = value
|
538
|
+
when 'service.version'
|
539
|
+
tags['version'] = value
|
540
|
+
when 'service.name'
|
541
|
+
tags['service'] = value
|
542
|
+
else
|
543
|
+
tags[key] = value
|
544
|
+
end
|
521
545
|
end
|
522
546
|
end
|
523
547
|
o.setter do |new_value, old_value|
|
@@ -18,8 +18,10 @@ module Datadog
|
|
18
18
|
ENV_API_KEY = 'DD_API_KEY'
|
19
19
|
ENV_ENVIRONMENT = 'DD_ENV'
|
20
20
|
ENV_SERVICE = 'DD_SERVICE'
|
21
|
+
ENV_OTEL_SERVICE = 'OTEL_SERVICE_NAME'
|
21
22
|
ENV_SITE = 'DD_SITE'
|
22
23
|
ENV_TAGS = 'DD_TAGS'
|
24
|
+
ENV_OTEL_RESOURCE_ATTRIBUTES = 'OTEL_RESOURCE_ATTRIBUTES'
|
23
25
|
ENV_VERSION = 'DD_VERSION'
|
24
26
|
FALLBACK_SERVICE_NAME =
|
25
27
|
begin
|
@@ -113,7 +113,10 @@ module Datadog
|
|
113
113
|
conf_value('tracing.opentelemetry.enabled', !defined?(Datadog::OpenTelemetry::LOADED).nil?),
|
114
114
|
)
|
115
115
|
list << conf_value('logger.instance', config.logger.instance.class.to_s) if config.logger.instance
|
116
|
-
|
116
|
+
if config.respond_to?('appsec')
|
117
|
+
list << conf_value('appsec.enabled', config.dig('appsec', 'enabled'))
|
118
|
+
list << conf_value('appsec.sca_enabled', config.dig('appsec', 'sca_enabled'))
|
119
|
+
end
|
117
120
|
list << conf_value('ci.enabled', config.dig('ci', 'enabled')) if config.respond_to?('ci')
|
118
121
|
|
119
122
|
list.reject! { |entry| entry[:value].nil? }
|
@@ -242,15 +245,30 @@ module Datadog
|
|
242
245
|
end
|
243
246
|
|
244
247
|
def payload(seq_id)
|
245
|
-
{
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
248
|
+
{ configuration: configuration(seq_id) }
|
249
|
+
end
|
250
|
+
|
251
|
+
def configuration(seq_id)
|
252
|
+
config = Datadog.configuration
|
253
|
+
|
254
|
+
res = @changes.map do |name, value|
|
255
|
+
{
|
256
|
+
name: name,
|
257
|
+
value: value,
|
258
|
+
origin: @origin,
|
259
|
+
}
|
260
|
+
end
|
261
|
+
|
262
|
+
unless config.dig('appsec', 'sca_enabled').nil?
|
263
|
+
res << {
|
264
|
+
name: 'appsec.sca_enabled',
|
265
|
+
value: config.appsec.sca_enabled,
|
266
|
+
origin: 'code',
|
267
|
+
seq_id: seq_id,
|
268
|
+
}
|
269
|
+
end
|
270
|
+
|
271
|
+
res
|
254
272
|
end
|
255
273
|
end
|
256
274
|
|
@@ -9,6 +9,7 @@ module Datadog
|
|
9
9
|
# e.g. Env vars, default values, enums, etc...
|
10
10
|
module Ext
|
11
11
|
ENV_ENABLED = 'DD_TRACE_ENABLED'
|
12
|
+
ENV_OTEL_TRACES_EXPORTER = 'OTEL_TRACES_EXPORTER'
|
12
13
|
ENV_HEADER_TAGS = 'DD_TRACE_HEADER_TAGS'
|
13
14
|
ENV_TRACE_ID_128_BIT_GENERATION_ENABLED = 'DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED'
|
14
15
|
|
@@ -39,10 +40,14 @@ module Datadog
|
|
39
40
|
# W3C Trace Context
|
40
41
|
PROPAGATION_STYLE_TRACE_CONTEXT = 'tracecontext'
|
41
42
|
|
43
|
+
PROPAGATION_STYLE_SUPPORTED = [PROPAGATION_STYLE_DATADOG, PROPAGATION_STYLE_B3_MULTI_HEADER,
|
44
|
+
PROPAGATION_STYLE_B3_SINGLE_HEADER, PROPAGATION_STYLE_TRACE_CONTEXT].freeze
|
45
|
+
|
42
46
|
# Sets both extract and inject propagation style tho the provided value.
|
43
47
|
# Has lower precedence than `DD_TRACE_PROPAGATION_STYLE_INJECT` or
|
44
48
|
# `DD_TRACE_PROPAGATION_STYLE_EXTRACT`.
|
45
49
|
ENV_PROPAGATION_STYLE = 'DD_TRACE_PROPAGATION_STYLE'
|
50
|
+
ENV_OTEL_PROPAGATION_STYLE = 'OTEL_PROPAGATORS'
|
46
51
|
|
47
52
|
ENV_PROPAGATION_STYLE_INJECT = 'DD_TRACE_PROPAGATION_STYLE_INJECT'
|
48
53
|
|
@@ -68,6 +73,8 @@ module Datadog
|
|
68
73
|
ENV_SAMPLE_RATE = 'DD_TRACE_SAMPLE_RATE'
|
69
74
|
ENV_RATE_LIMIT = 'DD_TRACE_RATE_LIMIT'
|
70
75
|
ENV_RULES = 'DD_TRACE_SAMPLING_RULES'
|
76
|
+
ENV_OTEL_TRACES_SAMPLER = 'OTEL_TRACES_SAMPLER'
|
77
|
+
OTEL_TRACES_SAMPLER_ARG = 'OTEL_TRACES_SAMPLER_ARG'
|
71
78
|
|
72
79
|
# @public_api
|
73
80
|
module Span
|
@@ -13,6 +13,8 @@ module Datadog
|
|
13
13
|
# rubocop:disable Metrics/BlockLength
|
14
14
|
# rubocop:disable Metrics/MethodLength
|
15
15
|
# rubocop:disable Layout/LineLength
|
16
|
+
# rubocop:disable Metrics/CyclomaticComplexity
|
17
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
16
18
|
module Settings
|
17
19
|
def self.extended(base)
|
18
20
|
base.class_eval do
|
@@ -89,7 +91,7 @@ module Datadog
|
|
89
91
|
# @return [Array<String>]
|
90
92
|
option :propagation_style do |o|
|
91
93
|
o.type :array
|
92
|
-
o.env Configuration::Ext::Distributed::ENV_PROPAGATION_STYLE
|
94
|
+
o.env [Configuration::Ext::Distributed::ENV_PROPAGATION_STYLE, Configuration::Ext::Distributed::ENV_OTEL_PROPAGATION_STYLE]
|
93
95
|
o.default []
|
94
96
|
o.after_set do |styles|
|
95
97
|
next if styles.empty?
|
@@ -97,6 +99,14 @@ module Datadog
|
|
97
99
|
# Make values case-insensitive
|
98
100
|
styles.map!(&:downcase)
|
99
101
|
|
102
|
+
styles.select! do |s|
|
103
|
+
if Configuration::Ext::Distributed::PROPAGATION_STYLE_SUPPORTED.include?(s)
|
104
|
+
true
|
105
|
+
else
|
106
|
+
Datadog.logger.warn("Unsupported propagation style: #{s}")
|
107
|
+
false
|
108
|
+
end
|
109
|
+
end
|
100
110
|
set_option(:propagation_style_extract, styles)
|
101
111
|
set_option(:propagation_style_inject, styles)
|
102
112
|
end
|
@@ -121,9 +131,23 @@ module Datadog
|
|
121
131
|
# @default `DD_TRACE_ENABLED` environment variable, otherwise `true`
|
122
132
|
# @return [Boolean]
|
123
133
|
option :enabled do |o|
|
124
|
-
o.env Tracing::Configuration::Ext::ENV_ENABLED
|
134
|
+
o.env [Tracing::Configuration::Ext::ENV_ENABLED, Tracing::Configuration::Ext::ENV_OTEL_TRACES_EXPORTER]
|
125
135
|
o.default true
|
126
136
|
o.type :bool
|
137
|
+
o.env_parser do |value|
|
138
|
+
value = value&.downcase
|
139
|
+
# Tracing is disabled when OTEL_TRACES_EXPORTER is none or
|
140
|
+
# DD_TRACE_ENABLED is 0 or false.
|
141
|
+
if ['none', 'false', '0'].include?(value)
|
142
|
+
false
|
143
|
+
# Tracing is enabled when DD_TRACE_ENABLED is true or 1
|
144
|
+
elsif ['true', '1'].include?(value)
|
145
|
+
true
|
146
|
+
else
|
147
|
+
Datadog.logger.warn("Unsupported value for exporting datadog traces: #{value}. Traces will be sent to Datadog.")
|
148
|
+
nil
|
149
|
+
end
|
150
|
+
end
|
127
151
|
end
|
128
152
|
|
129
153
|
# Comma-separated, case-insensitive list of header names that are reported in incoming and outgoing HTTP requests.
|
@@ -245,7 +269,30 @@ module Datadog
|
|
245
269
|
# @return [Float, nil]
|
246
270
|
option :default_rate do |o|
|
247
271
|
o.type :float, nilable: true
|
248
|
-
o.env Tracing::Configuration::Ext::Sampling::ENV_SAMPLE_RATE
|
272
|
+
o.env [Tracing::Configuration::Ext::Sampling::ENV_SAMPLE_RATE, Tracing::Configuration::Ext::Sampling::ENV_OTEL_TRACES_SAMPLER]
|
273
|
+
o.env_parser do |value|
|
274
|
+
# Parse the value as a float
|
275
|
+
next if value.nil?
|
276
|
+
|
277
|
+
value = value&.downcase
|
278
|
+
if ['always_on', 'always_off', 'traceidratio'].include?(value)
|
279
|
+
Datadog.logger.warn("The value '#{value}' is not yet supported. 'parentbased_#{value}' will be used instead.")
|
280
|
+
value = "parentbased_#{value}"
|
281
|
+
end
|
282
|
+
# OTEL_TRACES_SAMPLER can be set to always_on, always_off, traceidratio, and/or parentbased value.
|
283
|
+
# These values are mapped to a sample rate.
|
284
|
+
# DD_TRACE_SAMPLE_RATE sets the sample rate to float.
|
285
|
+
case value
|
286
|
+
when 'parentbased_always_on'
|
287
|
+
1.0
|
288
|
+
when 'parentbased_always_off'
|
289
|
+
0.0
|
290
|
+
when 'parentbased_traceidratio'
|
291
|
+
ENV.fetch(Tracing::Configuration::Ext::Sampling::OTEL_TRACES_SAMPLER_ARG, 1.0).to_f
|
292
|
+
else
|
293
|
+
value.to_f
|
294
|
+
end
|
295
|
+
end
|
249
296
|
end
|
250
297
|
|
251
298
|
# Rate limit for number of spans per second.
|
@@ -417,6 +464,8 @@ module Datadog
|
|
417
464
|
# rubocop:enable Metrics/BlockLength
|
418
465
|
# rubocop:enable Metrics/MethodLength
|
419
466
|
# rubocop:enable Layout/LineLength
|
467
|
+
# rubocop:enable Metrics/CyclomaticComplexity
|
468
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
420
469
|
end
|
421
470
|
end
|
422
471
|
end
|
@@ -101,10 +101,22 @@ module Datadog
|
|
101
101
|
# Only parse if it represent the same trace as the successfully extracted one
|
102
102
|
next unless tracecontext_digest.trace_id == extracted_trace_digest.trace_id
|
103
103
|
|
104
|
-
|
104
|
+
parent_id = extracted_trace_digest.span_id
|
105
|
+
distributed_tags = extracted_trace_digest.trace_distributed_tags
|
106
|
+
unless extracted_trace_digest.span_id == tracecontext_digest.span_id
|
107
|
+
# span_id in the tracecontext header takes precedence over the value in all conflicting headers
|
108
|
+
parent_id = tracecontext_digest.span_id
|
109
|
+
if (lp_id = last_datadog_parent_id(data, tracecontext_digest.trace_distributed_tags))
|
110
|
+
distributed_tags = extracted_trace_digest.trace_distributed_tags&.dup || {}
|
111
|
+
distributed_tags[Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID] = lp_id
|
112
|
+
end
|
113
|
+
end
|
114
|
+
# Preserve the trace state and last datadog span id
|
105
115
|
extracted_trace_digest = extracted_trace_digest.merge(
|
116
|
+
span_id: parent_id,
|
106
117
|
trace_state: tracecontext_digest.trace_state,
|
107
|
-
trace_state_unknown_fields: tracecontext_digest.trace_state_unknown_fields
|
118
|
+
trace_state_unknown_fields: tracecontext_digest.trace_state_unknown_fields,
|
119
|
+
trace_distributed_tags: distributed_tags
|
108
120
|
)
|
109
121
|
end
|
110
122
|
rescue => e
|
@@ -115,6 +127,22 @@ module Datadog
|
|
115
127
|
|
116
128
|
extracted_trace_digest
|
117
129
|
end
|
130
|
+
|
131
|
+
private
|
132
|
+
|
133
|
+
def last_datadog_parent_id(headers, tracecontext_tags)
|
134
|
+
dd_propagator = @propagation_style_extract.find { |propagator| propagator.is_a?(Datadog) }
|
135
|
+
if tracecontext_tags&.fetch(
|
136
|
+
Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID,
|
137
|
+
Tracing::Metadata::Ext::Distributed::DD_PARENT_ID_DEFAULT
|
138
|
+
) != Tracing::Metadata::Ext::Distributed::DD_PARENT_ID_DEFAULT
|
139
|
+
# tracecontext headers contain a p value, ensure this value is sent to backend
|
140
|
+
tracecontext_tags[Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID]
|
141
|
+
elsif dd_propagator && (dd_digest = dd_propagator.extract(headers))
|
142
|
+
# if p value is not present in tracestate, use the parent id from the datadog headers
|
143
|
+
format('%016x', dd_digest.span_id)
|
144
|
+
end
|
145
|
+
end
|
118
146
|
end
|
119
147
|
end
|
120
148
|
end
|
@@ -57,7 +57,8 @@ module Datadog
|
|
57
57
|
end
|
58
58
|
|
59
59
|
tags ||= {}
|
60
|
-
tags[Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID] =
|
60
|
+
tags[Tracing::Metadata::Ext::Distributed::TAG_DD_PARENT_ID] =
|
61
|
+
ts_parent_id || Tracing::Metadata::Ext::Distributed::DD_PARENT_ID_DEFAULT
|
61
62
|
|
62
63
|
TraceDigest.new(
|
63
64
|
span_id: parent_id,
|
@@ -55,6 +55,7 @@ module Datadog
|
|
55
55
|
TAG_SAMPLING_PRIORITY = '_sampling_priority_v1'
|
56
56
|
|
57
57
|
TAG_DD_PARENT_ID = '_dd.parent_id'
|
58
|
+
DD_PARENT_ID_DEFAULT = '0000000000000000'
|
58
59
|
|
59
60
|
# Trace tags with this prefix will propagate from a trace through distributed tracing.
|
60
61
|
# Distributed headers tags with this prefix will be injected into the active trace.
|
data/lib/datadog/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: datadog
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.1.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: 2024-06-
|
11
|
+
date: 2024-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -859,7 +859,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
859
859
|
- !ruby/object:Gem::Version
|
860
860
|
version: 2.0.0
|
861
861
|
requirements: []
|
862
|
-
rubygems_version: 3.4.
|
862
|
+
rubygems_version: 3.4.10
|
863
863
|
signing_key:
|
864
864
|
specification_version: 4
|
865
865
|
summary: Datadog tracing code for your Ruby applications
|