datadog 2.33.0 → 2.35.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 (147) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +99 -1
  3. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +20 -0
  4. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +2 -15
  5. data/ext/datadog_profiling_native_extension/macos_sampler_thread.h +55 -0
  6. data/ext/datadog_profiling_native_extension/stack_recorder.c +6 -11
  7. data/lib/datadog/ai_guard/configuration.rb +1 -0
  8. data/lib/datadog/ai_guard/contrib/rack/request_middleware.rb +53 -39
  9. data/lib/datadog/ai_guard/evaluation.rb +6 -1
  10. data/lib/datadog/ai_guard/ext.rb +12 -1
  11. data/lib/datadog/appsec/api_security/route_extractor.rb +3 -0
  12. data/lib/datadog/appsec/component.rb +4 -1
  13. data/lib/datadog/appsec/compressed_json.rb +2 -2
  14. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +3 -3
  15. data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
  16. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +9 -40
  17. data/lib/datadog/appsec/default_header_tags.rb +48 -0
  18. data/lib/datadog/core/configuration/components.rb +8 -1
  19. data/lib/datadog/core/configuration/settings.rb +16 -7
  20. data/lib/datadog/core/configuration/supported_configurations.rb +10 -0
  21. data/lib/datadog/core/environment/ext.rb +4 -0
  22. data/lib/datadog/core/environment/identity.rb +15 -1
  23. data/lib/datadog/core/environment/process.rb +50 -27
  24. data/lib/datadog/core/remote/client/capabilities.rb +11 -2
  25. data/lib/datadog/core/remote/transport/http/config.rb +5 -5
  26. data/lib/datadog/core/telemetry/request.rb +0 -2
  27. data/lib/datadog/core/transport/response.rb +1 -1
  28. data/lib/datadog/core/utils/{base64.rb → base64_codec.rb} +3 -2
  29. data/lib/datadog/core/utils/{array.rb → enumerable_compat.rb} +2 -2
  30. data/lib/datadog/core/utils/hash.rb +0 -23
  31. data/lib/datadog/core/utils/spawn_monkey_patch.rb +46 -16
  32. data/lib/datadog/data_streams/pathway_context.rb +3 -3
  33. data/lib/datadog/di/code_tracker.rb +43 -22
  34. data/lib/datadog/di/contrib/active_record.rb +6 -2
  35. data/lib/datadog/di/instrumenter.rb +24 -4
  36. data/lib/datadog/di/probe_notification_builder.rb +1 -1
  37. data/lib/datadog/di/remote.rb +4 -4
  38. data/lib/datadog/di/serializer.rb +5 -5
  39. data/lib/datadog/di/utils.rb +42 -14
  40. data/lib/datadog/opentelemetry/configuration/settings.rb +65 -0
  41. data/lib/datadog/opentelemetry/ext.rb +9 -0
  42. data/lib/datadog/opentelemetry/logs.rb +98 -0
  43. data/lib/datadog/opentelemetry/metrics.rb +10 -46
  44. data/lib/datadog/opentelemetry/sdk/configurator.rb +40 -0
  45. data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +37 -0
  46. data/lib/datadog/opentelemetry/signal_configuration.rb +53 -0
  47. data/lib/datadog/opentelemetry.rb +1 -0
  48. data/lib/datadog/profiling/collectors/thread_context.rb +0 -4
  49. data/lib/datadog/profiling/component.rb +3 -11
  50. data/lib/datadog/profiling/ext/dir_monkey_patches.rb +3 -2
  51. data/lib/datadog/profiling/stack_recorder.rb +0 -4
  52. data/lib/datadog/symbol_database/component.rb +409 -0
  53. data/lib/datadog/symbol_database/configuration.rb +2 -2
  54. data/lib/datadog/symbol_database/extractor.rb +32 -4
  55. data/lib/datadog/symbol_database/remote.rb +175 -0
  56. data/lib/datadog/symbol_database/scope_batcher.rb +8 -0
  57. data/lib/datadog/symbol_database/service_version.rb +11 -2
  58. data/lib/datadog/symbol_database/symbol.rb +6 -3
  59. data/lib/datadog/symbol_database/uploader.rb +62 -8
  60. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +4 -1
  61. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -1
  62. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +4 -1
  63. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -1
  64. data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -1
  65. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +1 -0
  66. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +8 -0
  67. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +4 -1
  68. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +4 -1
  69. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +4 -1
  70. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +4 -1
  71. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +4 -1
  72. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +4 -1
  73. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +4 -1
  74. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +4 -1
  75. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -4
  76. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +1 -4
  77. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +1 -4
  78. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -5
  79. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +1 -5
  80. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +2 -0
  81. data/lib/datadog/tracing/contrib/delayed_job/server_internal_tracer/worker.rb +1 -0
  82. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +1 -5
  83. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
  84. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +1 -5
  85. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +1 -8
  86. data/lib/datadog/tracing/contrib/excon/middleware.rb +1 -5
  87. data/lib/datadog/tracing/contrib/ext.rb +3 -1
  88. data/lib/datadog/tracing/contrib/faraday/middleware.rb +1 -5
  89. data/lib/datadog/tracing/contrib/grape/endpoint.rb +3 -0
  90. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +1 -0
  91. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +1 -5
  92. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -5
  93. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +1 -0
  94. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +1 -0
  95. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +1 -0
  96. data/lib/datadog/tracing/contrib/http/instrumentation.rb +1 -5
  97. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +1 -5
  98. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +1 -5
  99. data/lib/datadog/tracing/contrib/kafka/event.rb +1 -0
  100. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
  101. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +2 -5
  102. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +1 -5
  103. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +1 -5
  104. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +2 -2
  105. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +1 -5
  106. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -5
  107. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +3 -0
  108. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +2 -2
  109. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -0
  110. data/lib/datadog/tracing/contrib/racecar/event.rb +1 -5
  111. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +23 -0
  112. data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -0
  113. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +2 -0
  114. data/lib/datadog/tracing/contrib/rails/runner.rb +2 -0
  115. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -2
  116. data/lib/datadog/tracing/contrib/redis/tags.rb +0 -5
  117. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +2 -0
  118. data/lib/datadog/tracing/contrib/resque/resque_job.rb +1 -0
  119. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +1 -5
  120. data/lib/datadog/tracing/contrib/roda/ext.rb +1 -0
  121. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +4 -1
  122. data/lib/datadog/tracing/contrib/sequel/database.rb +1 -0
  123. data/lib/datadog/tracing/contrib/sequel/dataset.rb +1 -0
  124. data/lib/datadog/tracing/contrib/sequel/utils.rb +0 -5
  125. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +1 -0
  126. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +1 -0
  127. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/heartbeat.rb +2 -0
  128. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/job_fetch.rb +1 -0
  129. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/redis_info.rb +1 -0
  130. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/scheduled_poller.rb +2 -0
  131. data/lib/datadog/tracing/contrib/sidekiq/server_internal_tracer/stop.rb +1 -0
  132. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +3 -2
  133. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +1 -0
  134. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +1 -0
  135. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -0
  136. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +1 -0
  137. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +1 -5
  138. data/lib/datadog/tracing/contrib/utils/quantization/{hash.rb → hash_formatter.rb} +1 -1
  139. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +0 -13
  140. data/lib/datadog/tracing/distributed/trace_context.rb +0 -28
  141. data/lib/datadog/tracing/metadata/ext.rb +10 -0
  142. data/lib/datadog/tracing/span_operation.rb +13 -0
  143. data/lib/datadog/tracing/trace_operation.rb +22 -0
  144. data/lib/datadog/tracing/tracer.rb +9 -0
  145. data/lib/datadog/tracing/transport/traces.rb +2 -2
  146. data/lib/datadog/version.rb +1 -1
  147. metadata +16 -10
@@ -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)
@@ -51,11 +51,6 @@ module Datadog
51
51
  end
52
52
 
53
53
  def set_common_tags(span, db)
54
- # Tag original global service name if not used
55
- if span.service != Datadog.configuration.service
56
- span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
57
- end
58
-
59
54
  span.set_tag(Tracing::Metadata::Ext::TAG_COMPONENT, Ext::TAG_COMPONENT)
60
55
  span.set_tag(Tracing::Metadata::Ext::TAG_OPERATION, Ext::TAG_OPERATION_QUERY)
61
56
 
@@ -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
@@ -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
@@ -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
 
@@ -33,11 +34,6 @@ module Datadog
33
34
  )
34
35
  end
35
36
 
36
- # Tag original global service name if not used
37
- if span.service != Datadog.configuration.service
38
- span.set_tag(Tracing::Contrib::Ext::Metadata::TAG_BASE_SERVICE, Datadog.configuration.service)
39
- end
40
-
41
37
  span.set_tag(Contrib::Ext::DB::TAG_SYSTEM, Ext::TAG_SYSTEM)
42
38
  span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_CLIENT)
43
39
 
@@ -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
@@ -6,19 +6,6 @@ module Datadog
6
6
  # Encodes and decodes distributed 'x-datadog-tags' tags for transport
7
7
  # to and from external processes.
8
8
  module DatadogTagsCodec
9
- # Backport `Regexp::match?` because it is measurably the most performant
10
- # way to check if a string matches a regular expression.
11
- module RefineRegexp
12
- unless Regexp.method_defined?(:match?)
13
- refine ::Regexp do
14
- def match?(*args)
15
- !match(*args).nil?
16
- end
17
- end
18
- end
19
- end
20
- using RefineRegexp
21
-
22
9
  # ASCII characters 32-126, except `,`, `=`, and ` `. At least one character.
23
10
  VALID_KEY_CHARS = /\A(?:(?![,= ])[\u0020-\u007E])+\Z/.freeze
24
11
  # ASCII characters 32-126, except `,`. At least one character.
@@ -75,34 +75,6 @@ module Datadog
75
75
 
76
76
  private
77
77
 
78
- # Refinements to ensure newer rubies do not suffer performance impact
79
- # by needing to use older APIs.
80
- module Refine
81
- # Backport `Regexp::match?` because it is measurably the most performant
82
- # way to check if a string matches a regular expression.
83
- unless Regexp.method_defined?(:match?)
84
- refine ::Regexp do
85
- def match?(*args)
86
- !match(*args).nil?
87
- end
88
- end
89
- end
90
-
91
- unless String.method_defined?(:delete_prefix)
92
- refine ::String do
93
- def delete_prefix(prefix)
94
- prefix = prefix.to_s
95
- if rindex(prefix, 0)
96
- self[prefix.length..-1]
97
- else
98
- dup
99
- end
100
- end
101
- end
102
- end
103
- end
104
- using Refine
105
-
106
78
  # @see https://www.w3.org/TR/trace-context/#traceparent-header
107
79
  def build_traceparent(digest)
108
80
  build_traceparent_string(
@@ -33,6 +33,16 @@ module Datadog
33
33
 
34
34
  TAG_APM_ENABLED = '_dd.apm.enabled'
35
35
 
36
+ # Set to the global service name when a span's service is overridden
37
+ TAG_BASE_SERVICE = '_dd.base_service'
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
+
36
46
  # Defines constants for trace analytics
37
47
  # @public_api
38
48
  module Analytics
@@ -270,6 +270,9 @@ module Datadog
270
270
  # Stop timing
271
271
  stop(end_time)
272
272
 
273
+ # Allow subscribers to enrich the span before it is finalized.
274
+ events.before_finish.publish(self)
275
+
273
276
  # Build span
274
277
  # Memoize for performance reasons
275
278
  @span = build_span
@@ -400,12 +403,14 @@ module Datadog
400
403
  :logger,
401
404
  :after_finish,
402
405
  :after_stop,
406
+ :before_finish,
403
407
  :before_start
404
408
 
405
409
  def initialize(logger: Datadog.logger)
406
410
  @logger = logger
407
411
  @after_finish = AfterFinish.new
408
412
  @after_stop = AfterStop.new
413
+ @before_finish = BeforeFinish.new
409
414
  @before_start = BeforeStart.new
410
415
  end
411
416
 
@@ -429,6 +434,14 @@ module Datadog
429
434
  end
430
435
  end
431
436
 
437
+ # Triggered just before the span is finalized into a Span object.
438
+ # Subscribers can still mutate tags on the SpanOperation at this point.
439
+ class BeforeFinish < Tracing::Event
440
+ def initialize
441
+ super(:before_finish)
442
+ end
443
+ end
444
+
432
445
  # Triggered just before the span is started.
433
446
  class BeforeStart < Tracing::Event
434
447
  def initialize
@@ -301,6 +301,11 @@ module Datadog
301
301
  start_span(span_op)
302
302
  end
303
303
 
304
+ # Before finish: allow enrichment before the span is finalized, publish events.
305
+ span_events.before_finish.subscribe do |span_op|
306
+ before_finish_span(span_op)
307
+ end
308
+
304
309
  # After finish: deactivate the span, record, publish events.
305
310
  span_events.after_finish.subscribe do |span, span_op|
306
311
  finish_span(span, span_op, parent)
@@ -449,6 +454,7 @@ module Datadog
449
454
  include Tracing::Events
450
455
 
451
456
  attr_reader \
457
+ :span_before_finish,
452
458
  :span_before_start,
453
459
  :span_finished,
454
460
  :trace_finished,
@@ -456,6 +462,7 @@ module Datadog
456
462
  :trace_resource_change
457
463
 
458
464
  def initialize
465
+ @span_before_finish = SpanBeforeFinish.new
459
466
  @span_before_start = SpanBeforeStart.new
460
467
  @span_finished = SpanFinished.new
461
468
  @trace_finished = TraceFinished.new
@@ -463,6 +470,14 @@ module Datadog
463
470
  @trace_resource_change = TraceResourceChange.new
464
471
  end
465
472
 
473
+ # Triggered just before a span is finalized, mirroring SpanOperation::Events::BeforeFinish.
474
+ # Subscribers can still mutate tags on the SpanOperation at this point.
475
+ class SpanBeforeFinish < Tracing::Event
476
+ def initialize
477
+ super(:span_before_finish)
478
+ end
479
+ end
480
+
466
481
  # Triggered before a span starts.
467
482
  class SpanBeforeStart < Tracing::Event
468
483
  def initialize
@@ -546,6 +561,13 @@ module Datadog
546
561
  logger.debug { "Error starting span on trace: #{e.class}: #{e.message} Backtrace: #{e.backtrace.first(3)}" }
547
562
  end
548
563
 
564
+ def before_finish_span(span_op)
565
+ # Publish :span_before_finish event
566
+ events.span_before_finish.publish(span_op, self)
567
+ rescue => e
568
+ logger.debug { "Error in before_finish_span on trace: #{e.class}: #{e.message} Backtrace: #{e.backtrace.first(3)}" }
569
+ end
570
+
549
571
  # For traces with automatic context management (auto_finish),
550
572
  # when the local root span finishes, the trace also finishes.
551
573
  # The trace cannot receive new spans after finished.
@@ -417,6 +417,15 @@ module Datadog
417
417
  event_span_op.service ||= @default_service
418
418
  end
419
419
 
420
+ events.span_before_finish.subscribe do |event_span_op, _event_trace_op|
421
+ if event_span_op.service && event_span_op.service != @default_service
422
+ event_span_op.set_tag(Tracing::Metadata::Ext::TAG_BASE_SERVICE, @default_service)
423
+ 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)
424
+ else
425
+ event_span_op.send(:meta).delete(Tracing::Metadata::Ext::TAG_SVC_SRC)
426
+ end
427
+ end
428
+
420
429
  events.trace_propagated.subscribe do |event_trace_op|
421
430
  sample_trace(event_trace_op)
422
431
  end
@@ -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 = 33
6
+ MINOR = 35
7
7
  PATCH = 0
8
8
  PRE = nil
9
9
  BUILD = nil
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadog
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.33.0
4
+ version: 2.35.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2026-05-13 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: msgpack
@@ -153,6 +152,7 @@ files:
153
152
  - ext/datadog_profiling_native_extension/http_transport.c
154
153
  - ext/datadog_profiling_native_extension/libdatadog_helpers.c
155
154
  - ext/datadog_profiling_native_extension/libdatadog_helpers.h
155
+ - ext/datadog_profiling_native_extension/macos_sampler_thread.h
156
156
  - ext/datadog_profiling_native_extension/native_extension_helpers.rb
157
157
  - ext/datadog_profiling_native_extension/private_vm_api_access.c
158
158
  - ext/datadog_profiling_native_extension/private_vm_api_access.h
@@ -295,6 +295,7 @@ files:
295
295
  - lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb
296
296
  - lib/datadog/appsec/contrib/sinatra/request_middleware.rb
297
297
  - lib/datadog/appsec/counter_sampler.rb
298
+ - lib/datadog/appsec/default_header_tags.rb
298
299
  - lib/datadog/appsec/event.rb
299
300
  - lib/datadog/appsec/ext.rb
300
301
  - lib/datadog/appsec/extensions.rb
@@ -468,10 +469,10 @@ files:
468
469
  - lib/datadog/core/transport/response.rb
469
470
  - lib/datadog/core/transport/transport.rb
470
471
  - lib/datadog/core/utils.rb
471
- - lib/datadog/core/utils/array.rb
472
472
  - lib/datadog/core/utils/at_fork_monkey_patch.rb
473
- - lib/datadog/core/utils/base64.rb
473
+ - lib/datadog/core/utils/base64_codec.rb
474
474
  - lib/datadog/core/utils/duration.rb
475
+ - lib/datadog/core/utils/enumerable_compat.rb
475
476
  - lib/datadog/core/utils/fnv.rb
476
477
  - lib/datadog/core/utils/forking.rb
477
478
  - lib/datadog/core/utils/hash.rb
@@ -582,13 +583,17 @@ files:
582
583
  - lib/datadog/opentelemetry/api/context.rb
583
584
  - lib/datadog/opentelemetry/api/trace/span.rb
584
585
  - lib/datadog/opentelemetry/configuration/settings.rb
586
+ - lib/datadog/opentelemetry/ext.rb
587
+ - lib/datadog/opentelemetry/logs.rb
585
588
  - lib/datadog/opentelemetry/metrics.rb
586
589
  - lib/datadog/opentelemetry/sdk/configurator.rb
587
590
  - lib/datadog/opentelemetry/sdk/id_generator.rb
591
+ - lib/datadog/opentelemetry/sdk/logs_exporter.rb
588
592
  - lib/datadog/opentelemetry/sdk/metrics_exporter.rb
589
593
  - lib/datadog/opentelemetry/sdk/propagator.rb
590
594
  - lib/datadog/opentelemetry/sdk/span_processor.rb
591
595
  - lib/datadog/opentelemetry/sdk/trace/span.rb
596
+ - lib/datadog/opentelemetry/signal_configuration.rb
592
597
  - lib/datadog/opentelemetry/trace.rb
593
598
  - lib/datadog/profiling.rb
594
599
  - lib/datadog/profiling/collectors/code_provenance.rb
@@ -619,10 +624,12 @@ files:
619
624
  - lib/datadog/profiling/tasks/setup.rb
620
625
  - lib/datadog/single_step_instrument.rb
621
626
  - lib/datadog/symbol_database.rb
627
+ - lib/datadog/symbol_database/component.rb
622
628
  - lib/datadog/symbol_database/configuration.rb
623
629
  - lib/datadog/symbol_database/extractor.rb
624
630
  - lib/datadog/symbol_database/file_hash.rb
625
631
  - lib/datadog/symbol_database/logger.rb
632
+ - lib/datadog/symbol_database/remote.rb
626
633
  - lib/datadog/symbol_database/scope.rb
627
634
  - lib/datadog/symbol_database/scope_batcher.rb
628
635
  - lib/datadog/symbol_database/service_version.rb
@@ -1045,7 +1052,7 @@ files:
1045
1052
  - lib/datadog/tracing/contrib/trilogy/integration.rb
1046
1053
  - lib/datadog/tracing/contrib/trilogy/patcher.rb
1047
1054
  - lib/datadog/tracing/contrib/utils/database.rb
1048
- - lib/datadog/tracing/contrib/utils/quantization/hash.rb
1055
+ - lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb
1049
1056
  - lib/datadog/tracing/contrib/utils/quantization/http.rb
1050
1057
  - lib/datadog/tracing/contrib/waterdrop.rb
1051
1058
  - lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb
@@ -1130,8 +1137,8 @@ licenses:
1130
1137
  - Apache-2.0
1131
1138
  metadata:
1132
1139
  allowed_push_host: https://rubygems.org
1133
- changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.33.0/CHANGELOG.md
1134
- source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.33.0
1140
+ changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.35.0/CHANGELOG.md
1141
+ source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.35.0
1135
1142
  post_install_message: 'JRuby support in the datadog gem is deprecated. Details: https://dtdg.co/jruby-deprecation'
1136
1143
  rdoc_options: []
1137
1144
  require_paths:
@@ -1150,8 +1157,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1150
1157
  - !ruby/object:Gem::Version
1151
1158
  version: 2.0.0
1152
1159
  requirements: []
1153
- rubygems_version: 3.5.22
1154
- signing_key:
1160
+ rubygems_version: 4.0.3
1155
1161
  specification_version: 4
1156
1162
  summary: Datadog tracing code for your Ruby applications
1157
1163
  test_files: []