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
@@ -42,6 +42,7 @@ module Datadog
42
42
 
43
43
  span.name = "#{adapter_name}.query"
44
44
  span.service = service_name
45
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
45
46
  span.resource = payload.fetch(:sql)
46
47
  span.type = Tracing::Metadata::Ext::SQL::TYPE
47
48
 
@@ -77,6 +77,7 @@ module Datadog
77
77
  mapping = MAPPING.fetch(event)
78
78
 
79
79
  span.service = configuration[:cache_service]
80
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
80
81
  span.resource = mapping[:resource]
81
82
 
82
83
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
@@ -51,6 +51,7 @@ module Datadog
51
51
  service: Datadog.configuration.tracing[:active_support][:cache_service],
52
52
  resource: action
53
53
  ) do |span|
54
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
54
55
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
55
56
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_CACHE)
56
57
 
@@ -32,6 +32,7 @@ module Datadog
32
32
  # rubocop:disable Metrics/MethodLength
33
33
  def annotate!(span, context)
34
34
  span.service = configuration[:service_name]
35
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
35
36
  span.type = Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
36
37
  span.name = Ext::SPAN_COMMAND
37
38
  span.resource = context.safely(:resource)
@@ -101,6 +101,13 @@ module Datadog
101
101
  # shrink a Hash using an "st_table" back to an "ar_table")
102
102
  @cache = Hash[*1..20]
103
103
  @cache.clear
104
+ # Workaround for the segfault from https://github.com/DataDog/dd-trace-rb/issues/5718#issuecomment-4421844775.
105
+ # It crashes on a simple {Hash} lookup, {Hash#key?}, called from `@cache.fetch(value)`.
106
+ # Using an identity-based {Hash} avoids {Hash#key?} calls.
107
+ # We should attempt to remove this workaround when we only support Ruby 4+,
108
+ # as large change around the crash site was done in that version (https://github.com/ruby/ruby/pull/14039/changes#diff-884a5a8a369ef1b4c7597e00aa65974cec8c5f54f25f03ad5d24848f64892869R1743),
109
+ # where `RClass.cc_table` (the NULL dereferenced pointer) became a GC-managed object,
110
+ @cache.compare_by_identity
104
111
  end
105
112
 
106
113
  # (see Resolver#resolve)
@@ -22,6 +22,7 @@ module Datadog
22
22
  Tracing.trace(Ext::SPAN_COMMAND) do |span|
23
23
  span.resource = op.to_s.upcase
24
24
  span.service = datadog_configuration[:service_name]
25
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
25
26
  span.type = Ext::SPAN_TYPE_COMMAND
26
27
 
27
28
  if datadog_configuration[:peer_service]
@@ -21,6 +21,7 @@ module Datadog
21
21
  resource: job_name(job),
22
22
  on_error: configuration[:on_error]
23
23
  ) do |span|
24
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
24
25
  set_sample_rate(span)
25
26
 
26
27
  # Measure service stats
@@ -51,6 +52,7 @@ module Datadog
51
52
  service: configuration[:client_service_name],
52
53
  resource: job_name(job)
53
54
  ) do |span|
55
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
54
56
  set_sample_rate(span)
55
57
 
56
58
  # Measure service stats
@@ -11,6 +11,7 @@ module Datadog
11
11
  configuration = Datadog.configuration.tracing[:delayed_job]
12
12
 
13
13
  Datadog::Tracing.trace(Ext::SPAN_RESERVE_JOB, 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)
@@ -55,6 +55,7 @@ module Datadog
55
55
  service: service,
56
56
  on_error: on_error
57
57
  ) do |span|
58
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
58
59
  connection = transport.connections.first
59
60
  host = connection.host[:host] if connection
60
61
  port = connection.host[:port] if connection
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../utils/quantization/hash'
3
+ require_relative '../utils/quantization/hash_formatter'
4
4
 
5
5
  module Datadog
6
6
  module Tracing
@@ -40,7 +40,7 @@ module Datadog
40
40
  # Parse each statement and quantize them.
41
41
  statements.collect do |string|
42
42
  reserialize_json(string, options[:placeholder]) do |obj|
43
- Contrib::Utils::Quantization::Hash.format(obj, options)
43
+ Contrib::Utils::Quantization::HashFormatter.format(obj, options)
44
44
  end
45
45
  end.join("\n")
46
46
  end
@@ -133,6 +133,7 @@ module Datadog
133
133
 
134
134
  def datadog_tag_request
135
135
  span = @datadog_span
136
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
136
137
  method = Ext::NOT_APPLICABLE_METHOD
137
138
  method = @datadog_method.to_s if instance_variable_defined?(:@datadog_method) && !@datadog_method.nil?
138
139
  span.resource = method
@@ -64,6 +64,7 @@ module Datadog
64
64
  )
65
65
  @datadog_multi_trace_digest = Tracing.active_trace.to_digest
66
66
 
67
+ @datadog_multi_span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
67
68
  @datadog_multi_span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
68
69
  @datadog_multi_span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_MULTI_REQUEST)
69
70
 
@@ -119,6 +119,7 @@ module Datadog
119
119
  def annotate!(span, datum)
120
120
  span.resource = datum[:method].to_s.upcase
121
121
  span.service = service_name(datum[:host], @options)
122
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
122
123
  span.type = Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
123
124
 
124
125
  if @options[:peer_service]
@@ -62,6 +62,9 @@ module Datadog
62
62
 
63
63
  # Value of tag from which peer.service value was remapped from
64
64
  TAG_PEER_SERVICE_REMAP = '_dd.peer.service.remapped_from'
65
+
66
+ # Set equal to the global service when contrib span.service is overriden
67
+ TAG_BASE_SERVICE = Tracing::Metadata::Ext::TAG_BASE_SERVICE
65
68
  end
66
69
  end
67
70
  end
@@ -47,6 +47,7 @@ module Datadog
47
47
  def annotate!(span, env, options)
48
48
  span.resource = resource_name(env)
49
49
  span.service = service_name(env[:url].host, options)
50
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
50
51
  span.type = Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
51
52
 
52
53
  if options[:peer_service]
@@ -62,6 +62,7 @@ module Datadog
62
62
 
63
63
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
64
64
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_ENDPOINT_RUN)
65
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
65
66
 
66
67
  if (grape_route = env['grape.routing_args']) && grape_route[:route_info]
67
68
  trace.set_tag(
@@ -162,6 +163,7 @@ module Datadog
162
163
 
163
164
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
164
165
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_ENDPOINT_RENDER)
166
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
165
167
 
166
168
  Thread.current[KEY_RENDER] = true
167
169
  rescue => e
@@ -213,6 +215,7 @@ module Datadog
213
215
  begin
214
216
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
215
217
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_ENDPOINT_RUN_FILTERS)
218
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
216
219
 
217
220
  # Set analytics sample rate
218
221
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
@@ -214,6 +214,7 @@ module Datadog
214
214
  resource: resource,
215
215
  service: @service_name
216
216
  ) do |span|
217
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
217
218
  if Contrib::Analytics.enabled?(@analytics_enabled)
218
219
  Contrib::Analytics.set_sample_rate(span, @analytics_sample_rate)
219
220
  end
@@ -29,6 +29,7 @@ module Datadog
29
29
  }
30
30
 
31
31
  Tracing.trace(Ext::SPAN_CLIENT, **options) do |span, trace|
32
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
32
33
  annotate!(trace, span, keywords, formatter)
33
34
 
34
35
  begin
@@ -33,6 +33,7 @@ module Datadog
33
33
  set_distributed_context!(metadata)
34
34
 
35
35
  Tracing.trace(Ext::SPAN_SERVICE, **options) do |span|
36
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
36
37
  annotate!(span, metadata, formatter)
37
38
 
38
39
  begin
@@ -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
@@ -36,6 +36,7 @@ module Datadog
36
36
  @propagation = GRPC::Distributed::Propagation.new(
37
37
  propagation_style_inject: tracing.propagation_style_inject,
38
38
  propagation_style_extract: tracing.propagation_style_extract,
39
+ propagation_behavior_extract: tracing.propagation_behavior_extract,
39
40
  propagation_extract_first: tracing.propagation_extract_first
40
41
  )
41
42
  end
@@ -22,6 +22,7 @@ module Datadog
22
22
  service: configuration[:service_name],
23
23
  type: Tracing::Metadata::Ext::HTTP::TYPE_INBOUND
24
24
  ) do |span_op, trace_op|
25
+ span_op.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
25
26
  span_op.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
26
27
  span_op.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_ACTION)
27
28
 
@@ -24,6 +24,7 @@ module Datadog
24
24
  resource: action_klass.to_s,
25
25
  type: Tracing::Metadata::Ext::HTTP::TYPE_INBOUND
26
26
  ) do |span_op, _trace_op|
27
+ span_op.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
27
28
  span_op.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
28
29
  span_op.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_RENDER)
29
30
 
@@ -17,6 +17,7 @@ module Datadog
17
17
  service: configuration[:service_name],
18
18
  type: Tracing::Metadata::Ext::HTTP::TYPE_INBOUND
19
19
  ) do |span_op, trace_op|
20
+ span_op.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
20
21
  span_op.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
21
22
  span_op.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_ROUTING)
22
23
 
@@ -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
 
33
33
  Tracing.trace(Ext::SPAN_REQUEST) do |span, trace|
34
34
  span.service = service_name(host, request_options, client_config)
35
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
35
36
  span.type = Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
36
37
  span.resource = req.method
37
38
 
@@ -36,6 +36,7 @@ module Datadog
36
36
  @propagation = HTTP::Distributed::Propagation.new(
37
37
  propagation_style_inject: tracing.propagation_style_inject,
38
38
  propagation_style_extract: tracing.propagation_style_extract,
39
+ propagation_behavior_extract: tracing.propagation_behavior_extract,
39
40
  propagation_extract_first: tracing.propagation_extract_first
40
41
  )
41
42
  end
@@ -28,6 +28,7 @@ module Datadog
28
28
  Tracing.trace(Ext::SPAN_REQUEST) do |span, trace|
29
29
  begin
30
30
  span.service = service_name(host, request_options, client_config)
31
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
31
32
  span.type = Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
32
33
 
33
34
  if Tracing::Distributed::PropagationPolicy.enabled?(
@@ -28,6 +28,7 @@ module Datadog
28
28
  Tracing.trace(Ext::SPAN_REQUEST) do |span, trace|
29
29
  begin
30
30
  span.service = service_name(host, request_options, client_config)
31
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
31
32
  span.type = Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND
32
33
 
33
34
  if Tracing::Distributed::PropagationPolicy.enabled?(
@@ -30,6 +30,7 @@ module Datadog
30
30
  end
31
31
 
32
32
  def on_start(span, _event, _id, payload)
33
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
33
34
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
34
35
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_MESSAGING_SYSTEM)
35
36
 
@@ -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
@@ -28,6 +28,7 @@ module Datadog
28
28
  @propagation = Karafka::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
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../utils/quantization/hash'
3
+ require_relative '../utils/quantization/hash_formatter'
4
4
 
5
5
  module Datadog
6
6
  module Tracing
@@ -20,11 +20,11 @@ module Datadog
20
20
  # returns a formatted and normalized query
21
21
  def query_builder(command_name, database_name, command)
22
22
  # always exclude the command name
23
- options = Contrib::Utils::Quantization::Hash.merge_options(quantization_options, exclude: [command_name.to_s])
23
+ options = Contrib::Utils::Quantization::HashFormatter.merge_options(quantization_options, exclude: [command_name.to_s])
24
24
 
25
25
  # quantized statements keys are strings to avoid leaking Symbols in older Rubies
26
26
  # as Symbols are not GC'ed in Rubies prior to 2.2
27
- base_info = Contrib::Utils::Quantization::Hash.format(
27
+ base_info = Contrib::Utils::Quantization::HashFormatter.format(
28
28
  {
29
29
  'operation' => command_name,
30
30
  'database' => database_name,
@@ -33,11 +33,11 @@ module Datadog
33
33
  options
34
34
  )
35
35
 
36
- base_info.merge(Contrib::Utils::Quantization::Hash.format(command, options))
36
+ base_info.merge(Contrib::Utils::Quantization::HashFormatter.format(command, options))
37
37
  end
38
38
 
39
39
  def quantization_options
40
- Contrib::Utils::Quantization::Hash.merge_options(DEFAULT_OPTIONS, configuration[:quantize])
40
+ Contrib::Utils::Quantization::HashFormatter.merge_options(DEFAULT_OPTIONS, configuration[:quantize])
41
41
  end
42
42
 
43
43
  def configuration
@@ -30,6 +30,8 @@ module Datadog
30
30
  span = Tracing.trace(Ext::SPAN_COMMAND, service: service, type: Ext::SPAN_TYPE_COMMAND)
31
31
  set_span(event, span)
32
32
 
33
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
34
+
33
35
  # build a quantized Query using the Parser module
34
36
  query = MongoDB.query_builder(event.command_name, event.database_name, event.command)
35
37
  serialized_query = serialize_query(query)
@@ -24,6 +24,7 @@ module Datadog
24
24
  on_error = Datadog.configuration_for(self, :on_error) || datadog_configuration[:on_error]
25
25
 
26
26
  Tracing.trace(Ext::SPAN_QUERY, service: service, on_error: on_error) do |span, trace_op|
27
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
27
28
  span.resource = sql
28
29
  span.type = Tracing::Metadata::Ext::SQL::TYPE
29
30
 
@@ -34,6 +34,7 @@ module Datadog
34
34
  response = nil
35
35
  # rubocop:disable Metrics/BlockLength
36
36
  Tracing.trace('opensearch.query', service: datadog_configuration[:service_name]) do |span|
37
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
37
38
  # Set generic tags
38
39
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
39
40
  span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../utils/quantization/hash'
3
+ require_relative '../utils/quantization/hash_formatter'
4
4
 
5
5
  module Datadog
6
6
  module Tracing
@@ -41,7 +41,7 @@ module Datadog
41
41
  # Parse each statement and quantize them.
42
42
  statements.collect do |string|
43
43
  reserialize_json(string, options[:placeholder]) do |obj|
44
- Contrib::Utils::Quantization::Hash.format(obj, options)
44
+ Contrib::Utils::Quantization::HashFormatter.format(obj, options)
45
45
  end
46
46
  end.join("\n")
47
47
  end
@@ -109,6 +109,7 @@ module Datadog
109
109
  resource: resource,
110
110
  type: Tracing::Metadata::Ext::SQL::TYPE
111
111
  ) do |span, trace_op|
112
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
112
113
  annotate_span_with_query!(span, service)
113
114
  # Set analytics sample rate
114
115
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?
@@ -23,6 +23,7 @@ module Datadog
23
23
  service: datadog_configuration[:service_name]
24
24
  ) do |span|
25
25
  begin
26
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
26
27
  decorate!(span, Ext::TAG_OPERATION_QUERY)
27
28
  span.resource = query
28
29
  span.type = Tracing::Metadata::Ext::SQL::TYPE
@@ -41,6 +42,7 @@ module Datadog
41
42
  service: datadog_configuration[:service_name]
42
43
  ) do |span|
43
44
  begin
45
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
44
46
  decorate!(span, Ext::TAG_OPERATION_QUERY)
45
47
  span.resource = query
46
48
  span.type = Tracing::Metadata::Ext::SQL::TYPE
@@ -59,6 +61,7 @@ module Datadog
59
61
  service: datadog_configuration[:service_name]
60
62
  ) do |span|
61
63
  begin
64
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
62
65
  decorate!(span, Ext::TAG_OPERATION_KILL)
63
66
  span.resource = Ext::SPAN_KILL
64
67
  span.type = Tracing::Metadata::Ext::AppTypes::TYPE_DB
@@ -18,6 +18,9 @@ module Datadog
18
18
  # The `service` mode propagates service configuration
19
19
  SERVICE = 'service'
20
20
 
21
+ # The `dynamic_service` mode propagates service configuration + DBM service hash
22
+ DYNAMIC_SERVICE = 'dynamic_service'
23
+
21
24
  # The `full` mode propagates service configuration + trace context
22
25
  FULL = 'full'
23
26
 
@@ -14,7 +14,7 @@ module Datadog
14
14
  end
15
15
 
16
16
  def service?
17
- mode == Ext::SERVICE
17
+ mode == Ext::SERVICE || mode == Ext::DYNAMIC_SERVICE
18
18
  end
19
19
 
20
20
  def full?
@@ -26,7 +26,7 @@ module Datadog
26
26
  end
27
27
 
28
28
  def inject_sql_basehash?
29
- inject_sql_basehash
29
+ inject_sql_basehash || mode == Ext::DYNAMIC_SERVICE
30
30
  end
31
31
  end
32
32
  end
@@ -16,6 +16,7 @@ module Datadog
16
16
  }
17
17
 
18
18
  Tracing.trace(Ext::SPAN_JOB, **trace_options) do |request_span|
19
+ request_span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
19
20
  request_span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_COMPONENT)
20
21
 
21
22
  request_span.resource = job.class.name.to_s
@@ -35,6 +35,7 @@ module Datadog
35
35
 
36
36
  def on_start(span, event, _id, payload)
37
37
  span.service = configuration[:service_name]
38
+ span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
38
39
  span.resource = payload[:consumer_class]
39
40
 
40
41
  span.set_tag(Contrib::Ext::Messaging::TAG_SYSTEM, Ext::TAG_MESSAGING_SYSTEM)
@@ -1,11 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'header_collection'
4
+
3
5
  module Datadog
4
6
  module Tracing
5
7
  module Contrib
6
8
  module Rack
7
9
  # Matches Rack-style headers with a matcher and sets matching headers into a span.
8
10
  module HeaderTagging
11
+ DATADOG_REQUEST_ATTRIBUTION_HEADERS = [
12
+ 'x-datadog-endpoint-scan',
13
+ 'x-datadog-security-test'
14
+ ].freeze
15
+
9
16
  def self.tag_request_headers(span, env, configuration)
10
17
  # Wrap env in a case-insensitive Rack-style accessor.
11
18
  headers = env.is_a?(Header::RequestHeaderCollection) ? env : Header::RequestHeaderCollection.new(env)
@@ -25,6 +32,7 @@ module Datadog
25
32
  end
26
33
 
27
34
  span.set_tags(tags)
35
+ tag_datadog_request_attribution_headers(span, headers)
28
36
  end
29
37
 
30
38
  def self.tag_response_headers(span, headers, configuration)
@@ -56,6 +64,21 @@ module Datadog
56
64
 
57
65
  span.set_tags(tags)
58
66
  end
67
+
68
+ # Datadog-originated requests use these headers for request attribution.
69
+ # They are tagged independently of user-configured header tagging so
70
+ # downstream systems can distinguish them from regular application traffic.
71
+ #
72
+ # @api private
73
+ private_class_method def self.tag_datadog_request_attribution_headers(span, headers)
74
+ DATADOG_REQUEST_ATTRIBUTION_HEADERS.each do |header|
75
+ header_value = headers.get(header)
76
+ next unless header_value
77
+
78
+ header_tag = Tracing::Metadata::Ext::HTTP::RequestHeaders.to_tag(header)
79
+ span.set_tag(header_tag, header_value)
80
+ end
81
+ end
59
82
  end
60
83
  end
61
84
  end
@@ -135,6 +135,7 @@ module Datadog
135
135
  # Otherwise, the getter method would delegate to its root span
136
136
  trace.resource = request_span.resource unless trace.resource_override?
137
137
 
138
+ request_span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT)
138
139
  request_span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
139
140
  request_span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_REQUEST)
140
141
  request_span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_SERVER)
@@ -267,7 +268,9 @@ module Datadog
267
268
  # 1. resource renaming is enabled
268
269
  # 2. AppSec is enabled and resource renaming is disabled (by default, not explicitly)
269
270
  if Datadog.configuration.tracing.resource_renaming.enabled ||
270
- Datadog.configuration.appsec.enabled && Datadog.configuration.tracing.resource_renaming.options[:enabled].default_precedence?
271
+ Datadog.configuration.respond_to?(:appsec) &&
272
+ Datadog.configuration.appsec&.enabled &&
273
+ Datadog.configuration.tracing.resource_renaming.options[:enabled].default_precedence?
271
274
  request_span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_ENDPOINT, value)
272
275
  end
273
276
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../../ruby_version'
4
+
3
5
  module Datadog
4
6
  module Tracing
5
7
  module Contrib
@@ -48,7 +50,7 @@ module Datadog
48
50
  nil
49
51
  end
50
52
 
51
- if RUBY_VERSION >= '2.6.'
53
+ if RubyVersion.is?('>= 2.6')
52
54
  def split(path, pattern = nil, &block)
53
55
  path.split(pattern, &block)
54
56
  end
@@ -32,12 +32,14 @@ module Datadog
32
32
 
33
33
  request_span = Tracing.trace(Ext::SPAN_HTTP_PROXY_REQUEST, **options)
34
34
 
35
+ request_span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT_HTTP_PROXY)
35
36
  request_span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT_HTTP_PROXY)
36
37
  request_span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_HTTP_PROXY_REQUEST)
37
38
  request_span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_PROXY)
38
39
 
39
40
  queue_span = Tracing.trace(Ext::SPAN_HTTP_PROXY_QUEUE, **options)
40
41
 
42
+ queue_span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Ext::TAG_COMPONENT_HTTP_PROXY)
41
43
  queue_span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT_HTTP_PROXY)
42
44
  queue_span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_HTTP_PROXY_QUEUE)
43
45
  queue_span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_PROXY)