datadog 2.39.0 → 2.41.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 (158) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +97 -44
  3. data/ext/datadog_profiling_native_extension/collectors_stack.c +219 -148
  4. data/ext/datadog_profiling_native_extension/collectors_stack.h +16 -2
  5. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +12 -7
  6. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +5 -4
  7. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +19 -11
  8. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +7 -0
  9. data/ext/datadog_profiling_native_extension/extconf.rb +12 -7
  10. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -3
  11. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +284 -76
  12. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +16 -10
  13. data/ext/libdatadog_api/datadog_ruby_common.c +19 -11
  14. data/ext/libdatadog_api/datadog_ruby_common.h +7 -0
  15. data/ext/libdatadog_api/init.c +4 -0
  16. data/ext/libdatadog_api/trace_exporter.c +1312 -0
  17. data/ext/libdatadog_api/trace_exporter.h +5 -0
  18. data/ext/libdatadog_extconf_helpers.rb +1 -1
  19. data/lib/datadog/ai_guard/api_client.rb +1 -1
  20. data/lib/datadog/ai_guard/evaluation/request.rb +8 -8
  21. data/lib/datadog/ai_guard/evaluation.rb +11 -3
  22. data/lib/datadog/ai_guard/ext.rb +3 -1
  23. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +21 -42
  24. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +1 -1
  25. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +1 -1
  26. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +1 -1
  27. data/lib/datadog/appsec/configuration.rb +11 -2
  28. data/lib/datadog/appsec/context.rb +1 -1
  29. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +1 -1
  30. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +2 -2
  31. data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
  32. data/lib/datadog/appsec/contrib/devise/patcher.rb +1 -1
  33. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +2 -2
  34. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +2 -2
  35. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
  36. data/lib/datadog/appsec/contrib/rack/ext.rb +2 -2
  37. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +2 -2
  38. data/lib/datadog/appsec/contrib/rack/patcher.rb +1 -1
  39. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +6 -3
  40. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +2 -2
  41. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -1
  42. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +2 -2
  43. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +2 -2
  44. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -1
  45. data/lib/datadog/appsec/processor/rule_loader.rb +12 -12
  46. data/lib/datadog/appsec/response.rb +1 -1
  47. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +3 -3
  48. data/lib/datadog/appsec/security_engine/engine.rb +3 -3
  49. data/lib/datadog/core/configuration/components.rb +2 -2
  50. data/lib/datadog/core/configuration/option_definition.rb +1 -1
  51. data/lib/datadog/core/configuration/options.rb +1 -1
  52. data/lib/datadog/core/configuration/settings.rb +33 -41
  53. data/lib/datadog/core/configuration/supported_configurations.rb +3 -0
  54. data/lib/datadog/core/diagnostics/environment_logger.rb +36 -1
  55. data/lib/datadog/core/environment/gc.rb +1 -1
  56. data/lib/datadog/core/environment/vm_cache.rb +1 -1
  57. data/lib/datadog/core/environment/yjit.rb +2 -2
  58. data/lib/datadog/core/metrics/helpers.rb +1 -1
  59. data/lib/datadog/core/metrics/options.rb +2 -2
  60. data/lib/datadog/core/process_discovery.rb +1 -1
  61. data/lib/datadog/core/remote/client.rb +1 -1
  62. data/lib/datadog/core/remote/configuration/repository.rb +2 -2
  63. data/lib/datadog/core/telemetry/configuration_value.rb +38 -0
  64. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +3 -1
  65. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +1 -1
  66. data/lib/datadog/core/telemetry/event/app_started.rb +5 -24
  67. data/lib/datadog/core/telemetry/event/generate_metrics.rb +1 -1
  68. data/lib/datadog/core/telemetry/event/log.rb +2 -2
  69. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +1 -1
  70. data/lib/datadog/core/telemetry/metric.rb +2 -2
  71. data/lib/datadog/core/telemetry/request.rb +2 -2
  72. data/lib/datadog/core/transport/http.rb +1 -1
  73. data/lib/datadog/core/transport/transport.rb +1 -1
  74. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +170 -18
  75. data/lib/datadog/core/utils/sequence.rb +3 -6
  76. data/lib/datadog/core/utils/time.rb +16 -54
  77. data/lib/datadog/data_streams/processor.rb +14 -14
  78. data/lib/datadog/di/el/compiler.rb +88 -12
  79. data/lib/datadog/di/el/evaluator.rb +82 -2
  80. data/lib/datadog/di/el/expression.rb +13 -2
  81. data/lib/datadog/di/instrumenter.rb +5 -4
  82. data/lib/datadog/di/probe_builder.rb +7 -6
  83. data/lib/datadog/di/probe_notification_builder.rb +2 -2
  84. data/lib/datadog/di/serializer.rb +29 -4
  85. data/lib/datadog/error_tracking/component.rb +1 -1
  86. data/lib/datadog/kit/appsec/events/v2.rb +2 -2
  87. data/lib/datadog/open_feature/exposures/batch_builder.rb +1 -1
  88. data/lib/datadog/open_feature/exposures/event.rb +5 -5
  89. data/lib/datadog/profiling/collectors/info.rb +1 -1
  90. data/lib/datadog/profiling/collectors/thread_context.rb +6 -13
  91. data/lib/datadog/profiling/component.rb +1 -0
  92. data/lib/datadog/profiling/tasks/exec.rb +1 -1
  93. data/lib/datadog/profiling.rb +4 -0
  94. data/lib/datadog/symbol_database/extractor.rb +6 -6
  95. data/lib/datadog/tracing/component.rb +21 -0
  96. data/lib/datadog/tracing/configuration/dynamic/option.rb +4 -0
  97. data/lib/datadog/tracing/configuration/dynamic.rb +5 -3
  98. data/lib/datadog/tracing/configuration/ext.rb +1 -0
  99. data/lib/datadog/tracing/configuration/settings.rb +16 -0
  100. data/lib/datadog/tracing/contrib/action_cable/events.rb +1 -1
  101. data/lib/datadog/tracing/contrib/action_mailer/events.rb +1 -1
  102. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -2
  103. data/lib/datadog/tracing/contrib/action_view/events.rb +1 -1
  104. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +1 -1
  105. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
  106. data/lib/datadog/tracing/contrib/active_record/events.rb +1 -1
  107. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +2 -2
  108. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
  109. data/lib/datadog/tracing/contrib/aws/services.rb +1 -1
  110. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
  111. data/lib/datadog/tracing/contrib/ext.rb +3 -3
  112. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +1 -1
  113. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -1
  114. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +1 -1
  115. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +2 -1
  116. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +4 -0
  117. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +7 -2
  118. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +7 -2
  119. data/lib/datadog/tracing/contrib/kafka/events.rb +1 -1
  120. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +1 -1
  121. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  122. data/lib/datadog/tracing/contrib/opensearch/ext.rb +1 -1
  123. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +1 -1
  124. data/lib/datadog/tracing/contrib/patchable.rb +1 -1
  125. data/lib/datadog/tracing/contrib/patcher.rb +1 -1
  126. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  127. data/lib/datadog/tracing/contrib/racecar/events.rb +1 -1
  128. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +1 -1
  129. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +1 -1
  130. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  131. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +1 -1
  132. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
  133. data/lib/datadog/tracing/contrib/redis/quantize.rb +36 -2
  134. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +9 -3
  135. data/lib/datadog/tracing/contrib/sequel/database.rb +1 -5
  136. data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
  137. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +1 -1
  138. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +1 -1
  139. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
  140. data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +1 -1
  141. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +1 -1
  142. data/lib/datadog/tracing/correlation.rb +2 -2
  143. data/lib/datadog/tracing/diagnostics/environment_logger.rb +2 -2
  144. data/lib/datadog/tracing/distributed/baggage.rb +1 -2
  145. data/lib/datadog/tracing/distributed/propagation_policy.rb +5 -0
  146. data/lib/datadog/tracing/metadata/tagging.rb +1 -1
  147. data/lib/datadog/tracing/remote.rb +2 -2
  148. data/lib/datadog/tracing/span.rb +1 -1
  149. data/lib/datadog/tracing/span_operation.rb +1 -1
  150. data/lib/datadog/tracing/sync_writer.rb +8 -3
  151. data/lib/datadog/tracing/tracer.rb +8 -0
  152. data/lib/datadog/tracing/transport/io/traces.rb +1 -1
  153. data/lib/datadog/tracing/transport/native/response.rb +71 -0
  154. data/lib/datadog/tracing/transport/native.rb +387 -0
  155. data/lib/datadog/tracing/transport/trace_formatter.rb +1 -1
  156. data/lib/datadog/tracing/writer.rb +17 -4
  157. data/lib/datadog/version.rb +1 -1
  158. metadata +12 -7
@@ -108,9 +108,9 @@ module Datadog
108
108
  headers: {
109
109
  # The exception this controller was given in the request,
110
110
  # which is typical if the controller is configured to handle exceptions.
111
- request_exception: request.headers["action_dispatch.exception"]
111
+ request_exception: request.headers["action_dispatch.exception"],
112
112
  },
113
- tracing_context: {}
113
+ tracing_context: {},
114
114
  }
115
115
 
116
116
  begin
@@ -11,7 +11,7 @@ module Datadog
11
11
  module Events
12
12
  ALL = [
13
13
  Events::RenderPartial,
14
- Events::RenderTemplate
14
+ Events::RenderTemplate,
15
15
  ].freeze
16
16
 
17
17
  module_function
@@ -11,7 +11,7 @@ module Datadog
11
11
  module Events
12
12
  ALL = [
13
13
  Events::Render,
14
- Events::Serialize
14
+ Events::Serialize,
15
15
  ].freeze
16
16
 
17
17
  module_function
@@ -138,7 +138,7 @@ module Datadog
138
138
  host: active_record_config[:host],
139
139
  port: active_record_config[:port],
140
140
  database: active_record_config[:database],
141
- username: active_record_config[:username]
141
+ username: active_record_config[:username],
142
142
  }
143
143
  end
144
144
 
@@ -11,7 +11,7 @@ module Datadog
11
11
  module Events
12
12
  ALL = [
13
13
  Events::Instantiation,
14
- Events::SQL
14
+ Events::SQL,
15
15
  ].freeze
16
16
 
17
17
  module_function
@@ -32,7 +32,7 @@ module Datadog
32
32
 
33
33
  def span_options
34
34
  {
35
- type: Ext::SPAN_TYPE_CACHE
35
+ type: Ext::SPAN_TYPE_CACHE,
36
36
  }
37
37
  end
38
38
 
@@ -42,7 +42,7 @@ module Datadog
42
42
  "cache_read.active_support" => {resource: Ext::RESOURCE_CACHE_GET},
43
43
  "cache_read_multi.active_support" => {resource: Ext::RESOURCE_CACHE_MGET, multi_key: true},
44
44
  "cache_write.active_support" => {resource: Ext::RESOURCE_CACHE_SET},
45
- "cache_write_multi.active_support" => {resource: Ext::RESOURCE_CACHE_MSET, multi_key: true}
45
+ "cache_write_multi.active_support" => {resource: Ext::RESOURCE_CACHE_MSET, multi_key: true},
46
46
  }.freeze
47
47
 
48
48
  def trace?(event, payload)
@@ -42,7 +42,7 @@ module Datadog
42
42
  TAG_STATE_MACHINE_NAME,
43
43
  Tracing::Metadata::Ext::TAG_PEER_HOSTNAME,
44
44
  Tracing::Metadata::Ext::NET::TAG_DESTINATION_NAME,
45
- Tracing::Metadata::Ext::NET::TAG_TARGET_HOST,].freeze
45
+ Tracing::Metadata::Ext::NET::TAG_TARGET_HOST].freeze
46
46
  end
47
47
  end
48
48
  end
@@ -131,7 +131,7 @@ module Datadog
131
131
  "kinesis" => Service::Kinesis.new,
132
132
  "eventbridge" => Service::EventBridge.new,
133
133
  "states" => Service::States.new,
134
- "s3" => Service::S3.new
134
+ "s3" => Service::S3.new,
135
135
  }.freeze
136
136
  end
137
137
  end
@@ -15,7 +15,7 @@ module Datadog
15
15
  DEFAULT_OPTIONS = {
16
16
  exclude: EXCLUDE_KEYS,
17
17
  show: SHOW_KEYS,
18
- placeholder: PLACEHOLDER
18
+ placeholder: PLACEHOLDER,
19
19
  }.freeze
20
20
 
21
21
  module_function
@@ -31,7 +31,7 @@ module Datadog
31
31
  PEER_SERVICE_SOURCES = [TAG_INSTANCE,
32
32
  Tracing::Metadata::Ext::NET::TAG_DESTINATION_NAME,
33
33
  Tracing::Metadata::Ext::TAG_PEER_HOSTNAME,
34
- Tracing::Metadata::Ext::NET::TAG_TARGET_HOST,].freeze
34
+ Tracing::Metadata::Ext::NET::TAG_TARGET_HOST].freeze
35
35
  end
36
36
 
37
37
  module RPC
@@ -41,7 +41,7 @@ module Datadog
41
41
  PEER_SERVICE_SOURCES = [TAG_SERVICE,
42
42
  Tracing::Metadata::Ext::NET::TAG_DESTINATION_NAME,
43
43
  Tracing::Metadata::Ext::TAG_PEER_HOSTNAME,
44
- Tracing::Metadata::Ext::NET::TAG_TARGET_HOST,].freeze
44
+ Tracing::Metadata::Ext::NET::TAG_TARGET_HOST].freeze
45
45
  module GRPC
46
46
  TAG_STATUS_CODE = "rpc.grpc.status_code"
47
47
  TAG_FULL_METHOD = "rpc.grpc.full_method"
@@ -53,7 +53,7 @@ module Datadog
53
53
  TAG_DESTINATION = "messaging.destination"
54
54
  PEER_SERVICE_SOURCES = [Tracing::Metadata::Ext::NET::TAG_DESTINATION_NAME,
55
55
  Tracing::Metadata::Ext::TAG_PEER_HOSTNAME,
56
- Tracing::Metadata::Ext::NET::TAG_TARGET_HOST,].freeze
56
+ Tracing::Metadata::Ext::NET::TAG_TARGET_HOST].freeze
57
57
  end
58
58
 
59
59
  module Metadata
@@ -25,7 +25,7 @@ module Datadog
25
25
  type: Tracing::Metadata::Ext::HTTP::TYPE_OUTBOUND,
26
26
  service: service_name, # Maintain client-side service name configuration
27
27
  resource: formatter.resource_name,
28
- on_error: on_error
28
+ on_error: on_error,
29
29
  }
30
30
 
31
31
  Tracing.trace(Ext::SPAN_CLIENT, **options) do |span, trace|
@@ -26,7 +26,7 @@ module Datadog
26
26
  type: Tracing::Metadata::Ext::HTTP::TYPE_INBOUND,
27
27
  service: service_name, # TODO: Remove server-side service name configuration
28
28
  resource: formatter.resource_name,
29
- on_error: on_error
29
+ on_error: on_error,
30
30
  }
31
31
  metadata = keywords[:call].metadata
32
32
 
@@ -35,7 +35,7 @@ module Datadog
35
35
  Tracing::Distributed::TraceContext.new(fetcher: Fetcher),
36
36
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_BAGGAGE =>
37
37
  Tracing::Distributed::Baggage.new(fetcher: Fetcher),
38
- Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new
38
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new,
39
39
  },
40
40
  propagation_style_inject: propagation_style_inject,
41
41
  propagation_style_extract: propagation_style_extract,
@@ -10,7 +10,8 @@ module Datadog
10
10
  # Hanami Instrumentation for `hanami.routing`
11
11
  module RouterTracing
12
12
  def call(env)
13
- return super if Tracing.active_span && Tracing.active_span.name == Ext::SPAN_ROUTING
13
+ active_span = Tracing.active_span
14
+ return super if active_span && active_span.name == Ext::SPAN_ROUTING
14
15
 
15
16
  Tracing.trace(
16
17
  Ext::SPAN_ROUTING,
@@ -21,6 +21,10 @@ module Datadog
21
21
  super
22
22
 
23
23
  span.resource = payload[:api]
24
+ end
25
+
26
+ def on_finish(span, _event, _id, payload)
27
+ super
24
28
 
25
29
  span.set_tag(Ext::TAG_REQUEST_SIZE, payload[:request_size]) if payload.key?(:request_size)
26
30
  span.set_tag(Ext::TAG_RESPONSE_SIZE, payload[:response_size]) if payload.key?(:response_size)
@@ -17,12 +17,17 @@ module Datadog
17
17
 
18
18
  module_function
19
19
 
20
- def on_start(span, _event, _id, payload)
20
+ def on_start(span, _event, _id, _payload)
21
+ super
22
+
23
+ span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_PRODUCER)
24
+ end
25
+
26
+ def on_finish(span, _event, _id, payload)
21
27
  super
22
28
 
23
29
  span.set_tag(Ext::TAG_MESSAGE_COUNT, payload[:message_count]) if payload.key?(:message_count)
24
30
  span.set_tag(Ext::TAG_SENT_MESSAGE_COUNT, payload[:sent_message_count]) if payload.key?(:sent_message_count)
25
- span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_PRODUCER)
26
31
  end
27
32
 
28
33
  def span_name
@@ -17,7 +17,13 @@ module Datadog
17
17
 
18
18
  module_function
19
19
 
20
- def on_start(span, _event, _id, payload)
20
+ def on_start(span, _event, _id, _payload)
21
+ super
22
+
23
+ span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_PRODUCER)
24
+ end
25
+
26
+ def on_finish(span, _event, _id, payload)
21
27
  super
22
28
 
23
29
  span.set_tag(Ext::TAG_ATTEMPTS, payload[:attempts]) if payload.key?(:attempts)
@@ -25,7 +31,6 @@ module Datadog
25
31
  if payload.key?(:delivered_message_count)
26
32
  span.set_tag(Ext::TAG_DELIVERED_MESSAGE_COUNT, payload[:delivered_message_count])
27
33
  end
28
- span.set_tag(Tracing::Metadata::Ext::TAG_KIND, Tracing::Metadata::Ext::SpanKind::TAG_PRODUCER)
29
34
  end
30
35
 
31
36
  def span_name
@@ -25,7 +25,7 @@ module Datadog
25
25
  Events::ConsumerGroup::LeaveGroup,
26
26
  Events::ConsumerGroup::SyncGroup,
27
27
  Events::ProduceOperation::SendMessages,
28
- Events::Producer::DeliverMessages
28
+ Events::Producer::DeliverMessages,
29
29
  ].freeze
30
30
 
31
31
  module_function
@@ -34,7 +34,7 @@ module Datadog
34
34
  Tracing::Distributed::TraceContext.new(fetcher: Tracing::Distributed::Fetcher),
35
35
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_BAGGAGE =>
36
36
  Tracing::Distributed::Baggage.new(fetcher: Tracing::Distributed::Fetcher),
37
- Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new
37
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new,
38
38
  },
39
39
  propagation_style_inject: propagation_style_inject,
40
40
  propagation_style_extract: propagation_style_extract,
@@ -28,7 +28,7 @@ module Datadog
28
28
  {
29
29
  "operation" => command_name,
30
30
  "database" => database_name,
31
- "collection" => command.values.first
31
+ "collection" => command.values.first,
32
32
  },
33
33
  options
34
34
  )
@@ -18,7 +18,7 @@ module Datadog
18
18
  RELATIVE_RESOURCE_PATTERN = "relative"
19
19
  VALID_RESOURCE_PATTERNS = [
20
20
  ABSOLUTE_RESOURCE_PATTERN,
21
- RELATIVE_RESOURCE_PATTERN
21
+ RELATIVE_RESOURCE_PATTERN,
22
22
  ].freeze
23
23
  # Default should be changed to RELATIVE in 3.0 to match the Elasticsearch integration
24
24
  DEFAULT_RESOURCE_PATTERN = ABSOLUTE_RESOURCE_PATTERN
@@ -15,7 +15,7 @@ module Datadog
15
15
  DEFAULT_OPTIONS = {
16
16
  exclude: EXCLUDE_KEYS,
17
17
  show: SHOW_KEYS,
18
- placeholder: PLACEHOLDER
18
+ placeholder: PLACEHOLDER,
19
19
  }.freeze
20
20
 
21
21
  module_function
@@ -84,7 +84,7 @@ module Datadog
84
84
  available: self.class.available?,
85
85
  loaded: self.class.loaded?,
86
86
  compatible: self.class.compatible?,
87
- patchable: self.class.patchable?
87
+ patchable: self.class.patchable?,
88
88
  }
89
89
  end
90
90
 
@@ -57,7 +57,7 @@ module Datadog
57
57
  @patch_error_result = {
58
58
  type: e.class.name,
59
59
  message: e.message,
60
- line: Array(e.backtrace).first
60
+ line: Array(e.backtrace).first,
61
61
  }
62
62
 
63
63
  # Emit a metric
@@ -12,7 +12,7 @@ module Datadog
12
12
  trace_options = {
13
13
  service: configuration[:service_name],
14
14
  type: Tracing::Metadata::Ext::AppTypes::TYPE_WORKER,
15
- on_error: configuration[:on_error]
15
+ on_error: configuration[:on_error],
16
16
  }
17
17
 
18
18
  Tracing.trace(Ext::SPAN_JOB, **trace_options) do |request_span|
@@ -13,7 +13,7 @@ module Datadog
13
13
  ALL = [
14
14
  Events::Consume,
15
15
  Events::Batch,
16
- Events::Message
16
+ Events::Message,
17
17
  ].freeze
18
18
 
19
19
  module_function
@@ -15,7 +15,7 @@ module Datadog
15
15
  response: %w[
16
16
  Content-Type
17
17
  X-Request-ID
18
- ]
18
+ ],
19
19
  }.freeze
20
20
 
21
21
  option :enabled do |o|
@@ -10,7 +10,7 @@ module Datadog
10
10
  module HeaderTagging
11
11
  DATADOG_REQUEST_ATTRIBUTION_HEADERS = [
12
12
  "x-datadog-endpoint-scan",
13
- "x-datadog-security-test"
13
+ "x-datadog-security-test",
14
14
  ].freeze
15
15
 
16
16
  def self.tag_request_headers(span, env, configuration)
@@ -70,7 +70,7 @@ module Datadog
70
70
  module Patcher
71
71
  PATCHERS = [
72
72
  MiddlewarePatcher,
73
- MiddlewareNamePatcher
73
+ MiddlewareNamePatcher,
74
74
  ].freeze
75
75
 
76
76
  module_function
@@ -27,7 +27,7 @@ module Datadog
27
27
  options = {
28
28
  service: configuration[:web_service_name],
29
29
  start_time: start_time,
30
- type: Tracing::Metadata::Ext::HTTP::TYPE_PROXY
30
+ type: Tracing::Metadata::Ext::HTTP::TYPE_PROXY,
31
31
  }
32
32
 
33
33
  request_span = Tracing.trace(Ext::SPAN_HTTP_PROXY_REQUEST, **options)
@@ -34,7 +34,7 @@ module Datadog
34
34
  host: hash[:host],
35
35
  port: hash[:port],
36
36
  db: hash[:db],
37
- scheme: hash[:scheme]
37
+ scheme: hash[:scheme],
38
38
  }
39
39
  end
40
40
 
@@ -15,6 +15,9 @@ module Datadog
15
15
 
16
16
  AUTH_COMMANDS = %w[AUTH auth].freeze
17
17
 
18
+ CONNECTION_SETUP_COMMANDS = Set.new(%w[HELLO]).freeze
19
+ CLIENT_CONNECTION_SETUP_SUBCOMMANDS = Set.new(%w[SETINFO SETNAME]).freeze
20
+
18
21
  MULTI_VERB_COMMANDS = Set.new(
19
22
  %w[
20
23
  ACL
@@ -40,7 +43,7 @@ module Datadog
40
43
 
41
44
  def format_command_args(command_args)
42
45
  command_args = resolve_command_args(command_args)
43
- return "AUTH ?" if auth_command?(command_args)
46
+ return "AUTH ?" if auth_command?(command_args) || hello_auth_command?(command_args)
44
47
 
45
48
  verb, *args = command_args.map { |x| format_arg(x) }
46
49
  Core::Utils.truncate("#{verb.upcase} #{args.join(" ")}", CMD_MAX_LEN, TOO_LONG_MARK)
@@ -51,6 +54,8 @@ module Datadog
51
54
 
52
55
  return get_verb(command_args.first) if command_args.first.is_a?(Array)
53
56
 
57
+ return "AUTH" if hello_auth_command?(command_args)
58
+
54
59
  verb = command_args.first.to_s.upcase
55
60
  return verb unless MULTI_VERB_COMMANDS.include?(verb) && command_args[1]
56
61
 
@@ -64,6 +69,35 @@ module Datadog
64
69
  AUTH_COMMANDS.include?(verb)
65
70
  end
66
71
 
72
+ # Identifies a RESP3 `HELLO ... AUTH user pass` handshake command, which embeds
73
+ # credentials the same way a standalone `AUTH` command does and must be redacted
74
+ # (and kept visible as its own span) rather than treated as a silent connection
75
+ # bootstrap command.
76
+ def hello_auth_command?(command_args)
77
+ return false unless command_args.is_a?(Array) && !command_args.empty?
78
+
79
+ # `redis-client` always emits this as `["HELLO", "3", "AUTH", username, password]` — check
80
+ # the fixed "AUTH" keyword position only, never the username/password values themselves,
81
+ # since those are untrusted, possibly-binary bulk strings that `#upcase` can raise on.
82
+ return false if command_args.length < 3
83
+ command_args[0].to_s.upcase == "HELLO" && command_args[2].to_s.upcase == "AUTH"
84
+ end
85
+
86
+ # Identifies protocol-level connection bootstrap commands (`HELLO`, `CLIENT SETINFO`,
87
+ # `CLIENT SETNAME`) that `redis-client` sends as part of its per-connection handshake,
88
+ # so they can be excluded from pipeline resource naming. A `HELLO` carrying `AUTH`
89
+ # credentials is excluded from this so authentication remains visible as its own span.
90
+ def connection_setup_command?(command_args)
91
+ command_args = resolve_command_args(command_args)
92
+ return false unless command_args.is_a?(Array) && !command_args.empty?
93
+ return false if hello_auth_command?(command_args)
94
+
95
+ verb = command_args.first.to_s.upcase
96
+ return true if CONNECTION_SETUP_COMMANDS.include?(verb)
97
+
98
+ verb == "CLIENT" && CLIENT_CONNECTION_SETUP_SUBCOMMANDS.include?(command_args[1].to_s.upcase)
99
+ end
100
+
67
101
  # Unwraps command array when Redis is called with the following syntax:
68
102
  # redis.call([:cmd, 'arg1', ...])
69
103
  def resolve_command_args(command_args)
@@ -72,7 +106,7 @@ module Datadog
72
106
  command_args
73
107
  end
74
108
 
75
- private_class_method :auth_command?, :resolve_command_args
109
+ private_class_method :auth_command?, :hello_auth_command?, :resolve_command_args
76
110
  end
77
111
  end
78
112
  end
@@ -37,12 +37,18 @@ module Datadog
37
37
  end
38
38
 
39
39
  def call_pipelined(client, commands, service_name, command_args)
40
+ # `redis-client` sends its per-connection handshake (`HELLO`, `CLIENT SETINFO`/`SETNAME`)
41
+ # as a pipeline through this same code path. Excluding those from resource naming keeps
42
+ # the resource focused on application-issued commands (e.g. a lone `SELECT` prelude).
43
+ traced_commands = commands.reject { |c| Contrib::Redis::Quantize.connection_setup_command?(c) }
44
+ return yield if traced_commands.empty? && !commands.empty?
45
+
40
46
  Tracing.trace(Redis::Ext::SPAN_COMMAND, type: Redis::Ext::TYPE, service: service_name) do |span|
41
47
  span.set_tag(Tracing::Metadata::Ext::TAG_SVC_SRC, Redis::Ext::TAG_COMPONENT)
42
- raw_command = get_pipeline_commands(commands, true)
43
- span.resource = command_args ? raw_command : get_pipeline_commands(commands, false)
48
+ raw_command = get_pipeline_commands(traced_commands, true)
49
+ span.resource = command_args ? raw_command : get_pipeline_commands(traced_commands, false)
44
50
 
45
- span.set_metric Contrib::Redis::Ext::METRIC_PIPELINE_LEN, commands.length
51
+ span.set_metric Contrib::Redis::Ext::METRIC_PIPELINE_LEN, traced_commands.length
46
52
 
47
53
  Contrib::Redis::Tags.set_common_tags(client, span, raw_command)
48
54
 
@@ -46,11 +46,7 @@ module Datadog
46
46
  end
47
47
 
48
48
  def parse_opts(sql, opts)
49
- db_opts = if ::Sequel::VERSION < "3.41.0" && self.class.to_s !~ /Dataset$/
50
- @opts
51
- elsif instance_variable_defined?(:@pool) && @pool
52
- @pool.db.opts
53
- end
49
+ db_opts = @pool.db.opts if instance_variable_defined?(:@pool) && @pool
54
50
  sql = sql.is_a?(::Sequel::SQL::Expression) ? literal(sql) : sql.to_s
55
51
 
56
52
  Utils.parse_opts(sql, opts, db_opts)
@@ -84,7 +84,7 @@ module Datadog
84
84
  query: sql,
85
85
  prepared_name: prepared_name,
86
86
  database: db_opts[:database],
87
- host: db_opts[:host]
87
+ host: db_opts[:host],
88
88
  }
89
89
  end
90
90
 
@@ -35,7 +35,7 @@ module Datadog
35
35
  Tracing::Distributed::TraceContext.new(fetcher: Tracing::Distributed::Fetcher),
36
36
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_BAGGAGE =>
37
37
  Tracing::Distributed::Baggage.new(fetcher: Tracing::Distributed::Fetcher),
38
- Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new
38
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new,
39
39
  },
40
40
  propagation_style_inject: propagation_style_inject,
41
41
  propagation_style_extract: propagation_style_extract,
@@ -12,7 +12,7 @@ module Datadog
12
12
  # @public_api
13
13
  class Settings < Contrib::Configuration::Settings
14
14
  DEFAULT_HEADERS = {
15
- response: %w[Content-Type X-Request-ID]
15
+ response: %w[Content-Type X-Request-ID],
16
16
  }.freeze
17
17
 
18
18
  option :enabled do |o|
@@ -18,7 +18,7 @@ module Datadog
18
18
  trace_options = {
19
19
  service: configuration[:service_name],
20
20
  type: Tracing::Metadata::Ext::AppTypes::TYPE_WORKER,
21
- on_error: configuration[:on_error]
21
+ on_error: configuration[:on_error],
22
22
  }
23
23
 
24
24
  Tracing.trace(Ext::SPAN_JOB, **trace_options) do |request_span|
@@ -15,7 +15,7 @@ module Datadog
15
15
  DEFAULT_OPTIONS = { # steep:ignore IncompatibleAssignment
16
16
  exclude: EXCLUDE_KEYS,
17
17
  show: SHOW_KEYS,
18
- placeholder: PLACEHOLDER
18
+ placeholder: PLACEHOLDER,
19
19
  }.freeze
20
20
 
21
21
  module_function
@@ -34,7 +34,7 @@ module Datadog
34
34
  Tracing::Distributed::TraceContext.new(fetcher: Tracing::Distributed::Fetcher),
35
35
  Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_BAGGAGE =>
36
36
  Tracing::Distributed::Baggage.new(fetcher: Tracing::Distributed::Fetcher),
37
- Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new
37
+ Tracing::Configuration::Ext::Distributed::PROPAGATION_STYLE_NONE => Tracing::Distributed::None.new,
38
38
  },
39
39
  propagation_style_inject: propagation_style_inject,
40
40
  propagation_style_extract: propagation_style_extract,
@@ -51,9 +51,9 @@ module Datadog
51
51
  service: service.to_s,
52
52
  version: version.to_s,
53
53
  trace_id: trace_id.to_s,
54
- span_id: span_id.to_s
54
+ span_id: span_id.to_s,
55
55
  },
56
- ddsource: Core::Logging::Ext::DD_SOURCE
56
+ ddsource: Core::Logging::Ext::DD_SOURCE,
57
57
  }
58
58
  end
59
59
 
@@ -47,7 +47,7 @@ module Datadog
47
47
 
48
48
  def collect_errors!(responses)
49
49
  {
50
- agent_error: agent_error(responses)
50
+ agent_error: agent_error(responses),
51
51
  }
52
52
  end
53
53
 
@@ -114,7 +114,7 @@ module Datadog
114
114
  {
115
115
  name: rule.matcher.name,
116
116
  service: rule.matcher.service,
117
- sample_rate: rule.sampler.sample_rate(nil)
117
+ sample_rate: rule.sampler.sample_rate(nil),
118
118
  }
119
119
  end.compact
120
120
  end
@@ -231,8 +231,7 @@ module Datadog
231
231
  tags = {}
232
232
 
233
233
  baggage_tag_keys.each do |key, _|
234
- # Steep: https://github.com/soutaro/steep/issues/2031
235
- value = baggage[key] # steep:ignore ArgumentTypeMismatch
234
+ value = baggage[key]
236
235
  next if value.nil? || value.empty?
237
236
 
238
237
  tags["baggage.#{key}"] = value
@@ -28,6 +28,11 @@ module Datadog
28
28
  return true
29
29
  end
30
30
 
31
+ if ::Datadog.configuration.respond_to?(:ai_guard) && ::Datadog.configuration.ai_guard.enabled &&
32
+ (trace_source & ::Datadog::AIGuard::Ext::PRODUCT_BIT) != 0
33
+ return true
34
+ end
35
+
31
36
  return false
32
37
  end
33
38
 
@@ -21,7 +21,7 @@ module Datadog
21
21
  Ext::Distributed::TAG_ORIGIN => true,
22
22
  Core::Environment::Ext::TAG_VERSION => true,
23
23
  Ext::HTTP::TAG_STATUS_CODE => true,
24
- Ext::NET::TAG_HOSTNAME => true
24
+ Ext::NET::TAG_HOSTNAME => true,
25
25
  }.freeze
26
26
 
27
27
  # Return the tag with the given key, nil if it doesn't exist.
@@ -37,9 +37,9 @@ module Datadog
37
37
  # Guard for RBS/Steep
38
38
  raise "option is a #{option.class}, expected Option" unless option.is_a?(Configuration::Dynamic::Option)
39
39
 
40
- option.call(value)
40
+ telemetry_value = option.call(value)
41
41
 
42
- [env_var, value]
42
+ [env_var, telemetry_value]
43
43
  end
44
44
 
45
45
  if (di_enabled = lib_config["dynamic_instrumentation_enabled"]) != nil # rubocop:disable Style/NonNilCheck
@@ -157,7 +157,7 @@ module Datadog
157
157
  span_id: @id,
158
158
  trace_id: @trace_id,
159
159
  type: @type,
160
- span_links: @links.map(&:to_hash)
160
+ span_links: @links.map(&:to_hash),
161
161
  }
162
162
 
163
163
  if stopped?