datadog 2.34.0 → 2.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +114 -6
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +68 -31
  4. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  5. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +1 -1
  6. data/ext/datadog_profiling_native_extension/collectors_stack.c +37 -18
  7. data/ext/datadog_profiling_native_extension/collectors_stack.h +8 -2
  8. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +435 -314
  9. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +9 -7
  10. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +7 -8
  11. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +0 -12
  12. data/ext/datadog_profiling_native_extension/extconf.rb +2 -2
  13. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +4 -43
  14. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +15 -47
  15. data/ext/datadog_profiling_native_extension/heap_recorder.c +44 -26
  16. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +14 -35
  17. data/ext/datadog_profiling_native_extension/profiling.c +41 -4
  18. data/ext/datadog_profiling_native_extension/ruby_helpers.c +33 -34
  19. data/ext/datadog_profiling_native_extension/stack_recorder.c +30 -14
  20. data/ext/datadog_profiling_native_extension/stack_recorder.h +1 -0
  21. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +4 -2
  22. data/ext/libdatadog_api/datadog_ruby_common.c +7 -8
  23. data/ext/libdatadog_api/datadog_ruby_common.h +0 -12
  24. data/ext/libdatadog_extconf_helpers.rb +1 -1
  25. data/lib/datadog/ai_guard/configuration.rb +1 -0
  26. data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +53 -39
  27. data/lib/datadog/ai_guard/evaluation.rb +6 -1
  28. data/lib/datadog/ai_guard/ext.rb +12 -1
  29. data/lib/datadog/appsec/api_security/route_extractor.rb +9 -0
  30. data/lib/datadog/appsec/component.rb +1 -1
  31. data/lib/datadog/appsec/configuration.rb +7 -0
  32. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +37 -4
  33. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +64 -19
  34. data/lib/datadog/appsec/contrib/graphql/integration.rb +1 -0
  35. data/lib/datadog/appsec/contrib/rack/buffered_input.rb +83 -0
  36. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +41 -3
  37. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +20 -7
  38. data/lib/datadog/appsec/contrib/rack/input_peeker.rb +92 -0
  39. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +9 -40
  40. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +33 -0
  41. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +17 -1
  42. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +20 -3
  43. data/lib/datadog/appsec/default_header_tags.rb +52 -0
  44. data/lib/datadog/core/configuration/components.rb +1 -0
  45. data/lib/datadog/core/configuration/settings.rb +11 -8
  46. data/lib/datadog/core/configuration/supported_configurations.rb +2 -0
  47. data/lib/datadog/core/environment/process.rb +4 -2
  48. data/lib/datadog/core/remote/component.rb +1 -1
  49. data/lib/datadog/core/telemetry/event/app_started.rb +0 -21
  50. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +1 -1
  51. data/lib/datadog/core/utils/{array.rb → enumerable_compat.rb} +2 -2
  52. data/lib/datadog/core/utils/forking.rb +3 -1
  53. data/lib/datadog/core/utils/spawn_monkey_patch.rb +3 -1
  54. data/lib/datadog/core.rb +3 -0
  55. data/lib/datadog/di/base.rb +4 -1
  56. data/lib/datadog/di/component.rb +1 -1
  57. data/lib/datadog/error_tracking/collector.rb +2 -1
  58. data/lib/datadog/error_tracking/component.rb +2 -2
  59. data/lib/datadog/kit/tracing/method_tracer.rb +4 -1
  60. data/lib/datadog/opentelemetry/sdk/propagator.rb +9 -3
  61. data/lib/datadog/opentelemetry/sdk/span_processor.rb +4 -1
  62. data/lib/datadog/profiling/collectors/thread_context.rb +1 -4
  63. data/lib/datadog/profiling/component.rb +15 -25
  64. data/lib/datadog/profiling/ext/dir_monkey_patches.rb +6 -5
  65. data/lib/datadog/profiling/stack_recorder.rb +0 -4
  66. data/lib/datadog/ruby_version.rb +25 -0
  67. data/lib/datadog/symbol_database/component.rb +306 -98
  68. data/lib/datadog/symbol_database/extractor.rb +226 -87
  69. data/lib/datadog/tracing/configuration/ext.rb +13 -0
  70. data/lib/datadog/tracing/configuration/settings.rb +17 -0
  71. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -1
  72. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -1
  73. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -1
  74. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -1
  75. data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -1
  76. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +1 -0
  77. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +4 -1
  78. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +4 -1
  79. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -1
  80. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -1
  81. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -1
  82. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -1
  83. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -1
  84. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -1
  85. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -0
  86. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +1 -0
  87. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -0
  88. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -0
  89. data/lib/datadog/tracing/contrib/configuration/resolver.rb +7 -0
  90. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -0
  91. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -0
  92. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +1 -0
  93. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +1 -0
  94. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
  95. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +1 -0
  96. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +1 -0
  97. data/lib/datadog/tracing/contrib/excon/middleware.rb +1 -0
  98. data/lib/datadog/tracing/contrib/ext.rb +3 -0
  99. data/lib/datadog/tracing/contrib/faraday/middleware.rb +1 -0
  100. data/lib/datadog/tracing/contrib/grape/endpoint.rb +3 -0
  101. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +1 -0
  102. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +1 -0
  103. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -0
  104. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +2 -0
  105. data/lib/datadog/tracing/contrib/grpc.rb +1 -0
  106. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -0
  107. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -0
  108. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +1 -0
  109. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +2 -0
  110. data/lib/datadog/tracing/contrib/http/instrumentation.rb +1 -0
  111. data/lib/datadog/tracing/contrib/http.rb +1 -0
  112. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +1 -0
  113. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +1 -0
  114. data/lib/datadog/tracing/contrib/kafka/event.rb +1 -0
  115. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +2 -0
  116. data/lib/datadog/tracing/contrib/karafka.rb +1 -0
  117. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
  118. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +2 -0
  119. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +1 -0
  120. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +1 -0
  121. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +2 -2
  122. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +1 -0
  123. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -0
  124. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +3 -0
  125. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +2 -2
  126. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -0
  127. data/lib/datadog/tracing/contrib/racecar/event.rb +1 -0
  128. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +23 -0
  129. data/lib/datadog/tracing/contrib/rack/middlewares.rb +4 -1
  130. data/lib/datadog/tracing/contrib/rack/route_inference.rb +3 -1
  131. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +2 -0
  132. data/lib/datadog/tracing/contrib/rails/runner.rb +2 -0
  133. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -2
  134. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +2 -0
  135. data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -0
  136. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +1 -0
  137. data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
  138. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +4 -1
  139. data/lib/datadog/tracing/contrib/sequel/database.rb +1 -0
  140. data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -0
  141. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -0
  142. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +1 -0
  143. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +2 -0
  144. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
  145. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +1 -0
  146. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +1 -0
  147. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
  148. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +1 -0
  149. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +3 -2
  150. data/lib/datadog/tracing/contrib/sidekiq.rb +1 -0
  151. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +1 -0
  152. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +1 -0
  153. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -0
  154. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -0
  155. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +1 -0
  156. data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +1 -1
  157. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +2 -0
  158. data/lib/datadog/tracing/contrib/waterdrop.rb +1 -0
  159. data/lib/datadog/tracing/distributed/propagation.rb +33 -1
  160. data/lib/datadog/tracing/distributed/trace_context.rb +11 -2
  161. data/lib/datadog/tracing/metadata/ext.rb +7 -0
  162. data/lib/datadog/tracing/trace_digest.rb +7 -0
  163. data/lib/datadog/tracing/trace_operation.rb +4 -1
  164. data/lib/datadog/tracing/tracer.rb +4 -0
  165. data/lib/datadog/tracing/transport/traces.rb +2 -2
  166. data/lib/datadog/version.rb +1 -1
  167. data/lib/datadog.rb +4 -1
  168. metadata +13 -11
@@ -53,6 +53,7 @@ module Datadog
53
53
  name,
54
54
  service: Datadog.configuration.tracing[:rails][:service_name],
55
55
  tags: {
56
+ Tracing::Metadata::Ext::TAG_SVC_SRC => Ext::TAG_COMPONENT,
56
57
  Tracing::Metadata::Ext::TAG_COMPONENT => Ext::TAG_COMPONENT,
57
58
  Tracing::Metadata::Ext::TAG_OPERATION => operation,
58
59
  }
@@ -94,6 +95,7 @@ module Datadog
94
95
  service: Datadog.configuration.tracing[:rails][:service_name],
95
96
  resource: resource,
96
97
  tags: {
98
+ Tracing::Metadata::Ext::TAG_SVC_SRC => Ext::TAG_COMPONENT,
97
99
  Tracing::Metadata::Ext::TAG_COMPONENT => Ext::TAG_COMPONENT,
98
100
  Tracing::Metadata::Ext::TAG_OPERATION => operation,
99
101
  }
@@ -3,7 +3,7 @@
3
3
  require_relative '../../metadata/ext'
4
4
  require_relative '../analytics'
5
5
  require_relative 'ext'
6
- require_relative '../utils/quantization/hash'
6
+ require_relative '../utils/quantization/hash_formatter'
7
7
 
8
8
  module Datadog
9
9
  module Tracing
@@ -53,6 +53,7 @@ module Datadog
53
53
 
54
54
  def annotate_invoke!(span, args)
55
55
  span.resource = name
56
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
56
57
  # Set analytics sample rate
57
58
  if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
58
59
  Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
@@ -71,6 +72,7 @@ module Datadog
71
72
 
72
73
  def annotate_execute!(span, args)
73
74
  span.resource = name
75
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
74
76
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
75
77
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_EXECUTE)
76
78
  span.set_tag(Ext::TAG_EXECUTE_ARGS, quantize_args(args.to_hash)) unless args.nil?
@@ -80,7 +82,7 @@ module Datadog
80
82
 
81
83
  def quantize_args(args)
82
84
  quantize_options = configuration[:quantize][:args]
83
- Contrib::Utils::Quantization::Hash.format(args, quantize_options)
85
+ Contrib::Utils::Quantization::HashFormatter.format(args, quantize_options)
84
86
  end
85
87
 
86
88
  def enabled?
@@ -26,6 +26,7 @@ module Datadog
26
26
  class << self
27
27
  def call(client, command, service_name, command_args)
28
28
  Tracing.trace(Redis::Ext::SPAN_COMMAND, type: Redis::Ext::TYPE, service: service_name) do |span|
29
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Redis::Ext::TAG_COMPONENT)
29
30
  raw_command = get_command(command, true)
30
31
  span.resource = command_args ? raw_command : get_command(command, false)
31
32
 
@@ -37,6 +38,7 @@ module Datadog
37
38
 
38
39
  def call_pipelined(client, commands, service_name, command_args)
39
40
  Tracing.trace(Redis::Ext::SPAN_COMMAND, type: Redis::Ext::TYPE, service: service_name) do |span|
41
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Redis::Ext::TAG_COMPONENT)
40
42
  raw_command = get_pipeline_commands(commands, true)
41
43
  span.resource = command_args ? raw_command : get_pipeline_commands(commands, false)
42
44
 
@@ -35,6 +35,7 @@ module Datadog
35
35
  return yield unless datadog_configuration && Tracing.enabled?
36
36
 
37
37
  Tracing.trace(Ext::SPAN_JOB, **span_options) do |span|
38
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
38
39
  span.resource = args.first.is_a?(Hash) && args.first['job_class'] || name
39
40
  span.type = Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
40
41
 
@@ -37,6 +37,7 @@ module Datadog
37
37
  end
38
38
 
39
39
  def datadog_tag_request(uri, span)
40
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
40
41
  span.resource = method.to_s.upcase
41
42
 
42
43
  if datadog_configuration[:peer_service]
@@ -7,6 +7,7 @@ module Datadog
7
7
  # Roda integration constants
8
8
  module Ext
9
9
  APP = 'roda'
10
+ TAG_COMPONENT = 'roda'
10
11
  ENV_ENABLED = 'DD_TRACE_RODA_ENABLED'
11
12
  # @!visibility private
12
13
  ENV_ANALYTICS_ENABLED = 'DD_RODA_ANALYTICS_ENABLED'
@@ -25,7 +25,10 @@ module Datadog
25
25
  begin
26
26
  request_method = request.request_method.to_s.upcase
27
27
 
28
- span.service = configuration[:service_name] if configuration[:service_name]
28
+ if configuration[:service_name]
29
+ span.service = configuration[:service_name]
30
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
31
+ end
29
32
 
30
33
  span.type = Tracing::Metadata::Ext::HTTP::TYPE_INBOUND
31
34
 
@@ -29,6 +29,7 @@ module Datadog
29
29
  '',
30
30
  adapter_name
31
31
  )
32
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
32
33
  span.resource = opts[:query]
33
34
  span.type = Tracing::Metadata::Ext::SQL::TYPE
34
35
  Utils.set_common_tags(span, self)
@@ -46,6 +46,7 @@ module Datadog
46
46
  '',
47
47
  adapter_name
48
48
  )
49
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
49
50
  span.resource = opts[:query]
50
51
  span.type = Tracing::Metadata::Ext::SQL::TYPE
51
52
  Utils.set_common_tags(span, db)
@@ -20,6 +20,7 @@ module Datadog
20
20
  type: Tracing::Metadata::Ext::AppTypes::TYPE_WORKER,
21
21
  on_error: @on_error
22
22
  ) do |span|
23
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
23
24
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_MESSAGING_SYSTEM)
24
25
 
25
26
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
@@ -24,6 +24,7 @@ module Datadog
24
24
  resource = job_resource(job)
25
25
 
26
26
  Datadog::Tracing.trace(Ext::SPAN_PUSH, service: @sidekiq_service) do |span, trace_op|
27
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
27
28
  if Tracing::Distributed::PropagationPolicy.enabled?(
28
29
  global_config: configuration,
29
30
  trace: trace_op
@@ -20,6 +20,7 @@ module Datadog
20
20
  def initialize(
21
21
  propagation_style_inject:,
22
22
  propagation_style_extract:,
23
+ propagation_behavior_extract:,
23
24
  propagation_extract_first:
24
25
  )
25
26
  super(
@@ -38,6 +39,7 @@ module Datadog
38
39
  },
39
40
  propagation_style_inject: propagation_style_inject,
40
41
  propagation_style_extract: propagation_style_extract,
42
+ propagation_behavior_extract: propagation_behavior_extract,
41
43
  propagation_extract_first: propagation_extract_first
42
44
  )
43
45
  end
@@ -13,6 +13,7 @@ module Datadog
13
13
  configuration = Datadog.configuration.tracing[:sidekiq]
14
14
 
15
15
  Datadog::Tracing.trace(Ext::SPAN_HEARTBEAT, service: configuration[:service_name]) do |span|
16
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
16
17
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
17
18
 
18
19
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -38,6 +39,7 @@ module Datadog
38
39
  configuration = Datadog.configuration.tracing[:sidekiq]
39
40
 
40
41
  Datadog::Tracing.trace(Ext::SPAN_HEARTBEAT, service: configuration[:service_name]) do |span|
42
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
41
43
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
42
44
 
43
45
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -13,6 +13,7 @@ module Datadog
13
13
  configuration = Datadog.configuration.tracing[:sidekiq]
14
14
 
15
15
  Datadog::Tracing.trace(Ext::SPAN_JOB_FETCH, service: configuration[:service_name]) do |span|
16
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
16
17
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
17
18
 
18
19
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -11,6 +11,7 @@ module Datadog
11
11
  configuration = Datadog.configuration.tracing[:sidekiq]
12
12
 
13
13
  Datadog::Tracing.trace(Ext::SPAN_REDIS_INFO, service: configuration[:service_name]) do |span|
14
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
14
15
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
15
16
 
16
17
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -12,6 +12,7 @@ module Datadog
12
12
  configuration = Datadog.configuration.tracing[:sidekiq]
13
13
 
14
14
  Datadog::Tracing.trace(Ext::SPAN_SCHEDULED_PUSH, service: configuration[:service_name]) do |span|
15
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
15
16
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
16
17
 
17
18
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -34,6 +35,7 @@ module Datadog
34
35
  configuration = Datadog.configuration.tracing[:sidekiq]
35
36
 
36
37
  Datadog::Tracing.trace(Ext::SPAN_SCHEDULED_WAIT, service: configuration[:service_name]) do |span|
38
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
37
39
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
38
40
 
39
41
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -11,6 +11,7 @@ module Datadog
11
11
  configuration = Datadog.configuration.tracing[:sidekiq]
12
12
 
13
13
  Datadog::Tracing.trace(Ext::SPAN_STOP, service: configuration[:service_name]) do |span|
14
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
14
15
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
15
16
 
16
17
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -4,7 +4,7 @@ require_relative '../../metadata/ext'
4
4
  require_relative '../analytics'
5
5
  require_relative 'ext'
6
6
  require_relative 'utils'
7
- require_relative '../utils/quantization/hash'
7
+ require_relative '../utils/quantization/hash_formatter'
8
8
  require_relative 'distributed/propagation'
9
9
 
10
10
  module Datadog
@@ -36,6 +36,7 @@ module Datadog
36
36
  type: Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER,
37
37
  on_error: @on_error
38
38
  ) do |span|
39
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
39
40
  span.resource = resource
40
41
 
41
42
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
@@ -68,7 +69,7 @@ module Datadog
68
69
 
69
70
  args = job['args']
70
71
  if args && !args.empty?
71
- span.set_tag(Ext::TAG_JOB_ARGS, Contrib::Utils::Quantization::Hash.format(args, (@quantize[:args] || {})))
72
+ span.set_tag(Ext::TAG_JOB_ARGS, Contrib::Utils::Quantization::HashFormatter.format(args, (@quantize[:args] || {})))
72
73
  end
73
74
 
74
75
  yield
@@ -28,6 +28,7 @@ module Datadog
28
28
  @propagation = Sidekiq::Distributed::Propagation.new(
29
29
  propagation_style_inject: tracing.propagation_style_inject,
30
30
  propagation_style_extract: tracing.propagation_style_extract,
31
+ propagation_behavior_extract: tracing.propagation_behavior_extract,
31
32
  propagation_extract_first: tracing.propagation_extract_first
32
33
  )
33
34
  end
@@ -57,6 +57,7 @@ module Datadog
57
57
  type: Tracing::Metadata::Ext::HTTP::TYPE_INBOUND,
58
58
  resource: "#{request.request_method} #{datadog_route}",
59
59
  ) do |span, trace|
60
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
60
61
  span.set_tag(Ext::TAG_APP_NAME, settings.name || settings.superclass.name)
61
62
  span.set_tag(Ext::TAG_ROUTE_PATH, datadog_route)
62
63
 
@@ -28,6 +28,7 @@ module Datadog
28
28
  service: configuration[:service_name],
29
29
  type: Tracing::Metadata::Ext::HTTP::TYPE_INBOUND
30
30
  ) do |span|
31
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
31
32
  # this is kept nil until we set a correct one (either in the route or with a fallback in the ensure below)
32
33
  # the nil signals that there's no good one yet and is also seen by profiler, when sampling the resource
33
34
  span.resource = nil
@@ -22,6 +22,7 @@ module Datadog
22
22
  }
23
23
 
24
24
  Tracing.trace(Ext::SPAN_JOB, **trace_options) do |request_span|
25
+ request_span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
25
26
  request_span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_MESSAGING_SYSTEM)
26
27
 
27
28
  request_span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
@@ -86,6 +86,7 @@ module Datadog
86
86
 
87
87
  def __with_instrumentation(name)
88
88
  Datadog::Tracing.trace(name, service: datadog_configuration[:service_name]) do |span|
89
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
89
90
  span.type = Datadog::Tracing::Metadata::Ext::AppTypes::TYPE_WORKER
90
91
  span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
91
92
  span.set_tag(Ext::TAG_QUEUE, to_s)
@@ -23,6 +23,7 @@ module Datadog
23
23
  service = Datadog.configuration_for(self, :service_name) || datadog_configuration[:service_name]
24
24
 
25
25
  Tracing.trace(Ext::SPAN_QUERY, service: service) do |span, trace_op|
26
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
26
27
  span.resource = sql
27
28
  span.type = Tracing::Metadata::Ext::SQL::TYPE
28
29
 
@@ -6,7 +6,7 @@ module Datadog
6
6
  module Utils
7
7
  module Quantization
8
8
  # Quantization for Hash
9
- module Hash
9
+ module HashFormatter
10
10
  PLACEHOLDER = '?'
11
11
  EXCLUDE_KEYS = [].freeze
12
12
  SHOW_KEYS = [].freeze
@@ -19,6 +19,7 @@ module Datadog
19
19
  def initialize(
20
20
  propagation_style_inject:,
21
21
  propagation_style_extract:,
22
+ propagation_behavior_extract:,
22
23
  propagation_extract_first:
23
24
  )
24
25
  super(
@@ -37,6 +38,7 @@ module Datadog
37
38
  },
38
39
  propagation_style_inject: propagation_style_inject,
39
40
  propagation_style_extract: propagation_style_extract,
41
+ propagation_behavior_extract: propagation_behavior_extract,
40
42
  propagation_extract_first: propagation_extract_first
41
43
  )
42
44
  end
@@ -32,6 +32,7 @@ module Datadog
32
32
  @propagation = WaterDrop::Distributed::Propagation.new(
33
33
  propagation_style_inject: tracing.propagation_style_inject,
34
34
  propagation_style_extract: tracing.propagation_style_extract,
35
+ propagation_behavior_extract: tracing.propagation_behavior_extract,
35
36
  propagation_extract_first: tracing.propagation_extract_first
36
37
  )
37
38
  end
@@ -3,6 +3,7 @@
3
3
  require_relative '../configuration/ext'
4
4
  require_relative '../trace_digest'
5
5
  require_relative '../trace_operation'
6
+ require_relative '../span_link'
6
7
  require_relative '../../core/telemetry/logger'
7
8
  require_relative 'baggage'
8
9
 
@@ -13,6 +14,8 @@ module Datadog
13
14
  class Propagation
14
15
  # @param propagation_styles [Hash<String,Object>]
15
16
  # a map of propagation styles to their corresponding implementations
17
+ # @param propagation_behavior_extract [String]
18
+ # the behavior to apply when extracting distributed trace data
16
19
  # @param propagation_style_inject [Array<String>]
17
20
  # a list of styles to use when injecting distributed trace data
18
21
  # @param propagation_style_extract [Array<String>]
@@ -23,9 +26,11 @@ module Datadog
23
26
  propagation_styles:,
24
27
  propagation_style_inject:,
25
28
  propagation_style_extract:,
29
+ propagation_behavior_extract:,
26
30
  propagation_extract_first:
27
31
  )
28
32
  @propagation_styles = propagation_styles
33
+ @propagation_behavior_extract = propagation_behavior_extract
29
34
  @propagation_extract_first = propagation_extract_first
30
35
  @propagation_style_inject = propagation_style_inject.map { |style| propagation_styles[style] }
31
36
  @propagation_style_extract = propagation_style_extract.map { |style| propagation_styles[style] }
@@ -97,12 +102,20 @@ module Datadog
97
102
  return unless data
98
103
  return if data.empty?
99
104
 
105
+ if @propagation_behavior_extract == Tracing::Configuration::Ext::Distributed::PROPAGATION_BEHAVIOR_EXTRACT_IGNORE
106
+ return nil
107
+ end
108
+
100
109
  extracted_trace_digest = nil
110
+ # Name of the propagation style that first produced a trace context.
111
+ # Used as the `context_headers` span-link attribute when restarting a trace.
112
+ extracted_style_name = nil
101
113
 
102
114
  @propagation_style_extract.each do |propagator|
103
115
  # First extraction?
104
116
  unless extracted_trace_digest
105
117
  extracted_trace_digest = propagator.extract(data)
118
+ extracted_style_name = @propagation_styles.key(propagator) if extracted_trace_digest
106
119
  next
107
120
  end
108
121
 
@@ -145,7 +158,26 @@ module Datadog
145
158
  # Handle baggage after all other styles if present
146
159
  extracted_trace_digest = propagate_baggage(data, extracted_trace_digest) if @baggage_propagator
147
160
 
148
- extracted_trace_digest
161
+ # Default mode: Current digest continues the upstream trace.
162
+ return extracted_trace_digest if @propagation_behavior_extract != Tracing::Configuration::Ext::Distributed::PROPAGATION_BEHAVIOR_EXTRACT_RESTART || extracted_trace_digest&.trace_id.nil?
163
+
164
+ # Restart mode: start a new local digest and create a Span Link on
165
+ # the service-entry span with the original propagation data.
166
+ link = SpanLink.new(
167
+ extracted_trace_digest,
168
+ attributes: {
169
+ 'reason' => 'propagation_behavior_extract',
170
+ 'context_headers' => extracted_style_name,
171
+ }
172
+ )
173
+ baggage_tags = extracted_trace_digest.trace_distributed_tags&.select { |k, _| k.start_with?('baggage.') }
174
+ baggage_tags = nil if baggage_tags&.empty?
175
+ TraceDigest.new(
176
+ span_links: [link],
177
+ baggage: extracted_trace_digest.baggage,
178
+ trace_distributed_tags: baggage_tags,
179
+ span_remote: false,
180
+ )
149
181
  end
150
182
 
151
183
  private
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../core/utils'
4
+ require_relative 'helpers'
5
+
3
6
  module Datadog
4
7
  module Tracing
5
8
  module Distributed
@@ -282,8 +285,11 @@ module Datadog
282
285
  trace_flags & TRACE_FLAGS_SAMPLED
283
286
  end
284
287
 
285
- # @return [Array<String,Integer,String,String,Hash>] returns 4 values:
286
- # tracestate, sampling_priority, ts_parent_id, origin, tags.
288
+ # @return [nil] when the tracestate is absent or has no vendor entries.
289
+ # @return [String] when no `dd=` entry is present, the joined vendor list.
290
+ # @return [Array(String, Integer, String, String, Hash, String)] when a `dd=`
291
+ # entry is present: [tracestate without `dd=`, sampling_priority, origin,
292
+ # ts_parent_id, tags, unknown_fields]. All elements past the first may be nil.
287
293
  def extract_tracestate(tracestate)
288
294
  vendors = split_tracestate(tracestate)
289
295
  return unless vendors && !vendors.empty?
@@ -395,6 +401,9 @@ module Datadog
395
401
  tracestate = tracestate.chop
396
402
  end
397
403
 
404
+ tracestate = ::Datadog::Core::Utils.utf8_encode(tracestate, placeholder: nil)
405
+ return unless tracestate
406
+
398
407
  vendors = tracestate.split(',', TRACESTATE_MAX_LIST_MEMBERS + 1)
399
408
  if vendors.length > TRACESTATE_MAX_LIST_MEMBERS || remove_last_member
400
409
  vendors.pop
@@ -36,6 +36,13 @@ module Datadog
36
36
  # Set to the global service name when a span's service is overridden
37
37
  TAG_BASE_SERVICE = '_dd.base_service'
38
38
 
39
+ # Set to the source of a span's service override: the component name for Datadog-instrumented spans
40
+ # (e.g. 'redis', 'pg'), or {SVC_SRC_MANUAL} for manually-instrumented spans
41
+ TAG_SVC_SRC = '_dd.svc_src'
42
+
43
+ # Value for {TAG_SVC_SRC} indicating that a span was manually instrumented via the Tracing API
44
+ SVC_SRC_MANUAL = 'm'
45
+
39
46
  # Defines constants for trace analytics
40
47
  # @public_api
41
48
  module Analytics
@@ -22,6 +22,9 @@ module Datadog
22
22
  # @!attribute [r] span_type
23
23
  # The type of the currently active span.
24
24
  # @return [String]
25
+ # @!attribute [r] span_links
26
+ # Span links associated with this trace context.
27
+ # @return [Array<Datadog::Tracing::SpanLink>, nil]
25
28
  # @!attribute [r] trace_distributed_tags
26
29
  # Datadog-specific tags that support richer distributed tracing association.
27
30
  # @return [Hash<String,String>]
@@ -91,6 +94,7 @@ module Datadog
91
94
  :span_resource,
92
95
  :span_service,
93
96
  :span_type,
97
+ :span_links,
94
98
  :trace_distributed_tags,
95
99
  :trace_hostname,
96
100
  :trace_id,
@@ -114,6 +118,7 @@ module Datadog
114
118
  span_resource: nil,
115
119
  span_service: nil,
116
120
  span_type: nil,
121
+ span_links: nil,
117
122
  trace_distributed_tags: nil,
118
123
  trace_hostname: nil,
119
124
  trace_id: nil,
@@ -136,6 +141,7 @@ module Datadog
136
141
  @span_resource = span_resource && span_resource.dup.freeze
137
142
  @span_service = span_service && span_service.dup.freeze
138
143
  @span_type = span_type && span_type.dup.freeze
144
+ @span_links = span_links && span_links.dup.freeze
139
145
  @trace_distributed_tags = trace_distributed_tags && trace_distributed_tags.dup.freeze
140
146
  @trace_hostname = trace_hostname && trace_hostname.dup.freeze
141
147
  @trace_id = trace_id
@@ -167,6 +173,7 @@ module Datadog
167
173
  span_resource: span_resource,
168
174
  span_service: span_service,
169
175
  span_type: span_type,
176
+ span_links: span_links,
170
177
  trace_distributed_tags: trace_distributed_tags,
171
178
  trace_hostname: trace_hostname,
172
179
  trace_id: trace_id,
@@ -58,6 +58,7 @@ module Datadog
58
58
 
59
59
  # Creates a new TraceOperation.
60
60
  #
61
+ # @param span_links [Array<Datadog::Tracing::SpanLink>, nil] links to attach to the local root span.
61
62
  # @param auto_finish [Boolean] when true, automatically finishes the trace when the local root span finishes.
62
63
  # When false, the trace remains unfinished until {#finish!} is called.
63
64
  # This is useful when this {TraceOperation} represents the continuation of a remote {TraceDigest},
@@ -72,6 +73,7 @@ module Datadog
72
73
  name: nil,
73
74
  origin: nil,
74
75
  parent_span_id: nil,
76
+ span_links: nil,
75
77
  rate_limiter_rate: nil,
76
78
  resource: nil,
77
79
  rule_sample_rate: nil,
@@ -98,7 +100,7 @@ module Datadog
98
100
  @parent_span_id = parent_span_id
99
101
  @sampled = sampled.nil? || sampled
100
102
  @remote_parent = remote_parent
101
-
103
+ @span_links = span_links
102
104
  # Tags
103
105
  @agent_sample_rate = agent_sample_rate
104
106
  @hostname = hostname
@@ -318,6 +320,7 @@ module Datadog
318
320
  events: span_events,
319
321
  on_error: on_error,
320
322
  parent_id: parent_id,
323
+ links: (@root_span.nil? ? @span_links : nil),
321
324
  resource: resource || op_name,
322
325
  service: service,
323
326
  start_time: start_time,
@@ -387,6 +387,7 @@ module Datadog
387
387
  origin: digest.trace_origin,
388
388
  parent_span_id: digest.span_id,
389
389
  sampling_priority: sampling_priority,
390
+ span_links: digest.span_links,
390
391
  # Distributed tags are just regular trace tags with special meaning to Datadog
391
392
  tags: digest.trace_distributed_tags,
392
393
  trace_state: digest.trace_state,
@@ -420,6 +421,9 @@ module Datadog
420
421
  events.span_before_finish.subscribe do |event_span_op, _event_trace_op|
421
422
  if event_span_op.service && event_span_op.service != @default_service
422
423
  event_span_op.set_tag(Tracing::Metadata::Ext::TAG_BASE_SERVICE, @default_service)
424
+ event_span_op.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Tracing::Metadata::Ext::SVC_SRC_MANUAL) unless event_span_op.get_tag(Tracing::Metadata::Ext::TAG_SVC_SRC)
425
+ else
426
+ event_span_op.send(:meta).delete(Tracing::Metadata::Ext::TAG_SVC_SRC)
423
427
  end
424
428
  end
425
429
 
@@ -4,7 +4,7 @@ require_relative '../../core/chunker'
4
4
  require_relative '../../core/transport/parcel'
5
5
  require_relative '../../core/transport/request'
6
6
  require_relative '../../core/transport/transport'
7
- require_relative '../../core/utils/array'
7
+ require_relative '../../core/utils/enumerable_compat'
8
8
  require_relative 'http/client'
9
9
  require_relative 'serializable_trace'
10
10
  require_relative 'trace_formatter'
@@ -62,7 +62,7 @@ module Datadog
62
62
  # @return [Enumerable[Array[Bytes,Integer]]] list of encoded chunks: each containing a byte array and
63
63
  # number of traces
64
64
  def encode_in_chunks(traces)
65
- encoded_traces = Core::Utils::Array.filter_map(traces) do |trace|
65
+ encoded_traces = Core::Utils::EnumerableCompat.filter_map(traces) do |trace|
66
66
  encode_one(trace)
67
67
  end
68
68
 
@@ -3,7 +3,7 @@
3
3
  module Datadog
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 34
6
+ MINOR = 36
7
7
  PATCH = 0
8
8
  PRE = nil
9
9
  BUILD = nil
data/lib/datadog.rb CHANGED
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # Load core first so shared helpers (e.g. Datadog::RubyVersion) are available at require-time
4
+ require_relative 'datadog/core'
5
+
3
6
  # Load tracing
4
7
  require_relative 'datadog/tracing'
5
8
  require_relative 'datadog/tracing/contrib'
@@ -16,7 +19,7 @@ require_relative 'datadog/open_feature'
16
19
  # trace point. Activate DI automatically on supported Ruby versions but
17
20
  # always load its settings so that, for example, turning DI off when
18
21
  # we are on Ruby 2.5 does not produce exceptions.
19
- require_relative 'datadog/di/boot' if RUBY_VERSION >= '2.6' && RUBY_ENGINE != 'jruby'
22
+ require_relative 'datadog/di/boot' if Datadog::RubyVersion.is?('>= 2.6') && RUBY_ENGINE != 'jruby'
20
23
 
21
24
  require_relative 'datadog/error_tracking'
22
25
  require_relative 'datadog/kit'