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
@@ -0,0 +1,5 @@
1
+ #pragma once
2
+
3
+ #include "datadog_ruby_common.h"
4
+
5
+ void trace_exporter_init(VALUE tracing_module);
@@ -10,7 +10,7 @@ module Datadog
10
10
  module LibdatadogExtconfHelpers
11
11
  # Used to make sure the correct gem version gets loaded, as extconf.rb does not get run with "bundle exec" and thus
12
12
  # may see multiple libdatadog versions. See https://github.com/DataDog/dd-trace-rb/pull/2531 for the horror story.
13
- LIBDATADOG_VERSION = "~> 36.0.0.1.0"
13
+ LIBDATADOG_VERSION = "~> 40.0.0.1.0"
14
14
 
15
15
  # Used as an workaround for a limitation with how dynamic linking works in environments where the datadog gem and
16
16
  # libdatadog are moved after the extension gets compiled.
@@ -32,7 +32,7 @@ module Datadog
32
32
  "DD-AI-GUARD-VERSION": Datadog::VERSION::STRING,
33
33
  "DD-AI-GUARD-SOURCE": "SDK",
34
34
  "DD-AI-GUARD-LANGUAGE": "ruby",
35
- "content-type": "application/json"
35
+ "content-type": "application/json",
36
36
  }.freeze
37
37
  end
38
38
 
@@ -36,10 +36,10 @@ module Datadog
36
36
  messages: @serialized_messages,
37
37
  meta: {
38
38
  service: Datadog.configuration.service,
39
- env: Datadog.configuration.env
40
- }
41
- }
42
- }
39
+ env: Datadog.configuration.env,
40
+ },
41
+ },
42
+ },
43
43
  }
44
44
  end
45
45
 
@@ -56,10 +56,10 @@ module Datadog
56
56
  id: message.tool_call.id,
57
57
  function: {
58
58
  name: message.tool_call.tool_name,
59
- arguments: message.tool_call.arguments
60
- }
61
- }
62
- ]
59
+ arguments: message.tool_call.arguments,
60
+ },
61
+ },
62
+ ],
63
63
  }
64
64
  elsif message.content.is_a?(::Array)
65
65
  {role: message.role, content: serialize_content_parts(message.content)}
@@ -15,6 +15,7 @@ module Datadog
15
15
  Tracing::Metadata::Ext::Distributed::TAG_DECISION_MAKER,
16
16
  Tracing::Sampling::Ext::Decision::AI_GUARD
17
17
  )
18
+ trace.set_distributed_source(Ext::PRODUCT_BIT)
18
19
  trace.set_tag(Ext::EVENT_TAG, true)
19
20
  trace.set_tag(Ext::TRACE_EXECUTED_TAG, "1")
20
21
 
@@ -50,7 +51,7 @@ module Datadog
50
51
  messages: truncate_content(truncate_messages(request.serialized_messages)),
51
52
  attack_categories: result.tags,
52
53
  sds: result.sds_findings,
53
- tag_probs: result.tag_probabilities
54
+ tag_probs: result.tag_probabilities,
54
55
  }
55
56
  )
56
57
 
@@ -87,7 +88,7 @@ module Datadog
87
88
  if message[:content].is_a?(::Array)
88
89
  serialized_content = message[:content].map do |part|
89
90
  if part[:text]
90
- {**part, text: part[:text].to_s.byteslice(0, max_bytes)}
91
+ {**part, text: truncate_content_value(part[:text].to_s, max_bytes)}
91
92
  else
92
93
  part
93
94
  end
@@ -97,11 +98,18 @@ module Datadog
97
98
  else
98
99
  {
99
100
  **message,
100
- content: message[:content].byteslice(0, max_bytes)
101
+ content: truncate_content_value(message[:content], max_bytes),
101
102
  }
102
103
  end
103
104
  end
104
105
  end
106
+
107
+ def truncate_content_value(content, max_bytes)
108
+ truncated = content.byteslice(0, max_bytes).to_s
109
+ return truncated if truncated.valid_encoding?
110
+
111
+ truncated.scrub("")
112
+ end
105
113
  end
106
114
  end
107
115
  end
@@ -4,6 +4,8 @@ module Datadog
4
4
  module AIGuard
5
5
  # AI Guard specific constants
6
6
  module Ext
7
+ PRODUCT_BIT = 0x20
8
+
7
9
  SPAN_NAME = "ai_guard"
8
10
  TARGET_TAG = "ai_guard.target"
9
11
  TOOL_NAME_TAG = "ai_guard.tool_name"
@@ -22,7 +24,7 @@ module Datadog
22
24
  TRACE_ANOMALY_DETECTION_TAGS = [
23
25
  TRACE_HTTP_USERAGENT_TAG,
24
26
  TRACE_HTTP_CLIENT_IP_TAG,
25
- TRACE_NETWORK_CLIENT_IP_TAG
27
+ TRACE_NETWORK_CLIENT_IP_TAG,
26
28
  ].freeze
27
29
  end
28
30
  end
@@ -3,7 +3,7 @@
3
3
  module Datadog
4
4
  module AppSec
5
5
  module ActionsHandler
6
- # This module serves encapsulates MessagePack serialization for caller locations.
6
+ # Encapsulates serialisation of caller locations.
7
7
  #
8
8
  # It serializes part of the stack:
9
9
  # up to 32 frames (configurable)
@@ -21,50 +21,21 @@ module Datadog
21
21
  def to_msgpack(packer = nil)
22
22
  # JRuby doesn't pass the packer
23
23
  packer ||= MessagePack::Packer.new
24
-
25
- packer.write_map_header(3)
26
-
27
- packer.write("id")
28
- packer.write(@stack_id.encode("UTF-8"))
29
-
30
- packer.write("language")
31
- packer.write("ruby".encode("UTF-8"))
32
-
33
- serializable_locations_map = build_serializable_locations_map
34
-
35
- packer.write("frames")
36
- packer.write_array_header(serializable_locations_map.size)
37
-
38
- serializable_locations_map.each do |frame_id, location|
39
- packer.write_map_header(6)
40
-
41
- packer.write("id")
42
- packer.write(frame_id)
43
-
44
- packer.write("text")
45
- packer.write(location.to_s.encode("UTF-8"))
46
-
47
- packer.write("file")
48
- packer.write(location.path&.encode("UTF-8"))
49
-
50
- packer.write("line")
51
- packer.write(location.lineno)
52
-
53
- class_name, function_name = location.label&.match(CLASS_AND_FUNCTION_NAME_REGEX)&.captures
54
-
55
- packer.write("class_name")
56
- packer.write(class_name&.encode("UTF-8"))
57
-
58
- packer.write("function")
59
- packer.write(function_name&.encode("UTF-8"))
60
- end
61
-
24
+ packer.write(to_h)
62
25
  packer
63
26
  end
64
27
 
28
+ def to_h
29
+ {
30
+ "id" => @stack_id.encode("UTF-8"),
31
+ "language" => "ruby".encode("UTF-8"),
32
+ "frames" => build_serializable_frames,
33
+ }
34
+ end
35
+
65
36
  private
66
37
 
67
- def build_serializable_locations_map
38
+ def build_serializable_frames
68
39
  max_depth = Datadog.configuration.appsec.stack_trace.max_depth
69
40
  top_percent = Datadog.configuration.appsec.stack_trace.top_percentage
70
41
 
@@ -72,7 +43,7 @@ module Datadog
72
43
  drop_until_idx = @locations.size - (max_depth - drop_from_idx)
73
44
 
74
45
  frame_idx = -1
75
- @locations.each_with_object({}) do |location, map|
46
+ @locations.each_with_object([]) do |location, frames|
76
47
  # we are dropping frames from library code without increasing frame index
77
48
  next if location.path&.include?("lib/datadog")
78
49
 
@@ -80,7 +51,15 @@ module Datadog
80
51
 
81
52
  next if max_depth != 0 && frame_idx >= drop_from_idx && frame_idx < drop_until_idx
82
53
 
83
- map[frame_idx] = location
54
+ class_name, function_name = location.label&.match(CLASS_AND_FUNCTION_NAME_REGEX)&.captures
55
+ frames << {
56
+ "id" => frame_idx,
57
+ "text" => location.to_s.encode("UTF-8"),
58
+ "file" => location.path&.encode("UTF-8"),
59
+ "line" => location.lineno,
60
+ "class_name" => class_name&.encode("UTF-8"),
61
+ "function" => function_name&.encode("UTF-8"),
62
+ }
84
63
  end
85
64
  end
86
65
  end
@@ -16,7 +16,7 @@ module Datadog
16
16
  resource_name: "#{route.request_method} #{path}",
17
17
  operation_name: "http.request",
18
18
  method: route.request_method,
19
- path: path
19
+ path: path,
20
20
  }
21
21
  end
22
22
  end
@@ -26,7 +26,7 @@ module Datadog
26
26
  resource_name: "#{method} #{path}",
27
27
  operation_name: "http.request",
28
28
  method: method,
29
- path: path
29
+ path: path,
30
30
  }
31
31
  end
32
32
  end
@@ -16,7 +16,7 @@ module Datadog
16
16
  resource_name: "#{method} #{path}",
17
17
  operation_name: "http.request",
18
18
  method: method,
19
- path: path
19
+ path: path,
20
20
  }
21
21
  end
22
22
  end
@@ -20,7 +20,7 @@ module Datadog
20
20
  AUTO_USER_INSTRUMENTATION_MODES = [
21
21
  DISABLED_AUTO_USER_INSTRUMENTATION_MODE,
22
22
  ANONYMIZATION_AUTO_USER_INSTRUMENTATION_MODE,
23
- IDENTIFICATION_AUTO_USER_INSTRUMENTATION_MODE
23
+ IDENTIFICATION_AUTO_USER_INSTRUMENTATION_MODE,
24
24
  ].freeze
25
25
  AUTO_USER_INSTRUMENTATION_MODES_ALIASES = {
26
26
  "ident" => IDENTIFICATION_AUTO_USER_INSTRUMENTATION_MODE,
@@ -31,7 +31,7 @@ module Datadog
31
31
  SAFE_TRACK_USER_EVENTS_MODE = "safe"
32
32
  EXTENDED_TRACK_USER_EVENTS_MODE = "extended"
33
33
  APPSEC_VALID_TRACK_USER_EVENTS_MODE = [
34
- SAFE_TRACK_USER_EVENTS_MODE, EXTENDED_TRACK_USER_EVENTS_MODE
34
+ SAFE_TRACK_USER_EVENTS_MODE, EXTENDED_TRACK_USER_EVENTS_MODE,
35
35
  ].freeze
36
36
  APPSEC_VALID_TRACK_USER_EVENTS_ENABLED_VALUES = ["1", "true"].concat(
37
37
  APPSEC_VALID_TRACK_USER_EVENTS_MODE
@@ -52,6 +52,15 @@ module Datadog
52
52
  o.default false
53
53
  end
54
54
 
55
+ # NOTE: Marker set by the agentic onboarding tooling.
56
+ # Has no effect here — we just report its value in telemetry,
57
+ # so onboarding can be detected at runtime
58
+ option :agentic_onboarding do |o|
59
+ o.type :string
60
+ o.env "DD_APPSEC_AGENTIC_ONBOARDING"
61
+ o.default ""
62
+ end
63
+
55
64
  define_method(:instrument) do |integration_name|
56
65
  if enabled
57
66
  registered_integration = Datadog::AppSec::Contrib::Integration.registry[integration_name]
@@ -62,7 +62,7 @@ module Datadog
62
62
  @state = {
63
63
  events: [],
64
64
  interrupted: false,
65
- downstream_body_analyzed_count: 0
65
+ downstream_body_analyzed_count: 0,
66
66
  }
67
67
  end
68
68
 
@@ -25,7 +25,7 @@ module Datadog
25
25
 
26
26
  ephemeral_data = {
27
27
  "server.db.statement" => sql,
28
- "server.db.system" => db_system
28
+ "server.db.system" => db_system,
29
29
  }
30
30
 
31
31
  waf_timeout = Datadog.configuration.appsec.waf_timeout
@@ -35,7 +35,7 @@ module Datadog
35
35
  "server.request.body" => parse_body(payload, headers),
36
36
  "server.request.body.byte_length" => body_byte_length(payload),
37
37
  "server.request.path_params" => payload["path_params"],
38
- "http.client_ip" => extract_client_ip(payload["source_ip"], headers)
38
+ "http.client_ip" => extract_client_ip(payload["source_ip"], headers),
39
39
  }
40
40
 
41
41
  data.compact!
@@ -51,7 +51,7 @@ module Datadog
51
51
  "server.response.headers" => headers,
52
52
  "server.response.headers.no_cookies" => headers.dup.tap { |h| h.delete("set-cookie") },
53
53
  "server.response.body" => parse_body(payload, headers),
54
- "server.response.body.byte_length" => body_byte_length(payload)
54
+ "server.response.body.byte_length" => body_byte_length(payload),
55
55
  }
56
56
 
57
57
  data.compact!
@@ -11,7 +11,7 @@ module Datadog
11
11
  AppSec::Configuration::Settings::SAFE_TRACK_USER_EVENTS_MODE =>
12
12
  AppSec::Configuration::Settings::ANONYMIZATION_AUTO_USER_INSTRUMENTATION_MODE,
13
13
  AppSec::Configuration::Settings::EXTENDED_TRACK_USER_EVENTS_MODE =>
14
- AppSec::Configuration::Settings::IDENTIFICATION_AUTO_USER_INSTRUMENTATION_MODE
14
+ AppSec::Configuration::Settings::IDENTIFICATION_AUTO_USER_INSTRUMENTATION_MODE,
15
15
  }.freeze
16
16
 
17
17
  module_function
@@ -20,7 +20,7 @@ module Datadog
20
20
  module_function
21
21
 
22
22
  def patched?
23
- Patcher.instance_variable_get(:@patched)
23
+ !!Patcher.instance_variable_get(:@patched)
24
24
  end
25
25
 
26
26
  def target_version
@@ -29,7 +29,7 @@ module Datadog
29
29
  ephemeral_data = {
30
30
  "server.io.net.url" => url,
31
31
  "server.io.net.request.method" => data[:method].to_s.upcase,
32
- "server.io.net.request.headers" => headers
32
+ "server.io.net.request.headers" => headers,
33
33
  }
34
34
 
35
35
  is_redirect = context.state[:downstream_redirect_url] == url
@@ -60,7 +60,7 @@ module Datadog
60
60
  # @type var ephemeral_data: ::Datadog::AppSec::Context::input_data
61
61
  ephemeral_data = {
62
62
  "server.io.net.response.status" => data.dig(:response, :status).to_s,
63
- "server.io.net.response.headers" => headers
63
+ "server.io.net.response.headers" => headers,
64
64
  }
65
65
 
66
66
  is_redirect = REDIRECT_STATUS_CODES.cover?(data.dig(:response, :status)) && headers.key?("location")
@@ -26,7 +26,7 @@ module Datadog
26
26
  ephemeral_data = {
27
27
  "server.io.net.url" => url,
28
28
  "server.io.net.request.method" => env.method.to_s.upcase,
29
- "server.io.net.request.headers" => headers
29
+ "server.io.net.request.headers" => headers,
30
30
  }
31
31
 
32
32
  is_redirect = context.state[:downstream_redirect_url] == url
@@ -56,7 +56,7 @@ module Datadog
56
56
  # @type var ephemeral_data: ::Datadog::AppSec::Context::input_data
57
57
  ephemeral_data = {
58
58
  "server.io.net.response.status" => env.status.to_s,
59
- "server.io.net.response.headers" => headers
59
+ "server.io.net.response.headers" => headers,
60
60
  }
61
61
 
62
62
  is_redirect = REDIRECT_STATUS_CODES.cover?(env.status) && headers.key?("location")
@@ -27,7 +27,7 @@ module Datadog
27
27
 
28
28
  if context
29
29
  persistent_data = {
30
- "graphql.server.all_resolvers" => gateway_multiplex.arguments
30
+ "graphql.server.all_resolvers" => gateway_multiplex.arguments,
31
31
  }
32
32
 
33
33
  result = context.run_waf(persistent_data, {}, Datadog.configuration.appsec.waf_timeout)
@@ -17,7 +17,7 @@ module Datadog
17
17
  "x-appgw-trace-id",
18
18
  "x-cloud-trace-context",
19
19
  "x-sigsci-requestid",
20
- "x-sigsci-tags"
20
+ "x-sigsci-tags",
21
21
  ].freeze
22
22
 
23
23
  IDENTITY_COLLECTABLE_REQUEST_HEADERS = [
@@ -38,7 +38,7 @@ module Datadog
38
38
  "x-cluster-client-ip",
39
39
  "x-forwarded",
40
40
  "x-forwarded-for",
41
- "x-real-ip"
41
+ "x-real-ip",
42
42
  ].freeze
43
43
  end
44
44
  end
@@ -34,7 +34,7 @@ module Datadog
34
34
  "server.request.headers" => gateway_request.headers,
35
35
  "server.request.headers.no_cookies" => gateway_request.headers.dup.tap { |h| h.delete("cookie") },
36
36
  "http.client_ip" => gateway_request.client_ip,
37
- "server.request.method" => gateway_request.method
37
+ "server.request.method" => gateway_request.method,
38
38
  }
39
39
 
40
40
  result = context.run_waf(persistent_data, {}, Datadog.configuration.appsec.waf_timeout)
@@ -63,7 +63,7 @@ module Datadog
63
63
  persistent_data = {
64
64
  "server.response.status" => gateway_response.status.to_s,
65
65
  "server.response.headers" => gateway_response.headers,
66
- "server.response.headers.no_cookies" => gateway_response.headers.dup.tap { |h| h.delete("set-cookie") }
66
+ "server.response.headers.no_cookies" => gateway_response.headers.dup.tap { |h| h.delete("set-cookie") },
67
67
  }
68
68
 
69
69
  result = context.run_waf(persistent_data, {}, Datadog.configuration.appsec.waf_timeout)
@@ -12,7 +12,7 @@ module Datadog
12
12
  module_function
13
13
 
14
14
  def patched?
15
- Patcher.instance_variable_get(:@patched) # TODO: Patcher.flag_patched
15
+ !!Patcher.instance_variable_get(:@patched) # TODO: Patcher.flag_patched
16
16
  end
17
17
 
18
18
  def target_version
@@ -12,7 +12,8 @@ module Datadog
12
12
  # This should be inserted just below Rack::JSONBodyParser or
13
13
  # legacy Rack::PostBodyContentTypeParser from rack-contrib
14
14
  class RequestBodyMiddleware
15
- def initialize(app, opt = {})
15
+ # TODO: opt is never used, it can probably be safely removed
16
+ def initialize(app, opt = {}) # steep:ignore DifferentMethodParameterKind
16
17
  @app = app
17
18
  end
18
19
 
@@ -23,7 +24,7 @@ module Datadog
23
24
 
24
25
  # TODO: handle exceptions, except for @app.call
25
26
 
26
- http_response = nil
27
+ http_response = nil #: Rack::response?
27
28
  interrupt_params = catch(::Datadog::AppSec::Ext::INTERRUPT) do
28
29
  http_response, _request = Instrumentation.gateway.push("rack.request.body", Gateway::Request.new(env)) do
29
30
  @app.call(env)
@@ -34,7 +35,9 @@ module Datadog
34
35
 
35
36
  return AppSec::Response.from_interrupt_params(interrupt_params, env["HTTP_ACCEPT"]).to_rack if interrupt_params
36
37
 
37
- http_response
38
+ # Steep can't see that the catch block always populates http_response
39
+ # when no interrupt is thrown.
40
+ http_response #: Rack::response
38
41
  end
39
42
  end
40
43
  end
@@ -26,7 +26,7 @@ module Datadog
26
26
  limit = Datadog.configuration.appsec.body_parsing_size_limit
27
27
 
28
28
  persistent_data = {
29
- "server.request.path_params" => gateway_request.route_params
29
+ "server.request.path_params" => gateway_request.route_params,
30
30
  }
31
31
 
32
32
  unless limit.zero?
@@ -67,7 +67,7 @@ module Datadog
67
67
  context = container.context
68
68
 
69
69
  persistent_data = {
70
- "server.response.body" => container.data
70
+ "server.response.body" => container.data,
71
71
  }
72
72
  result = context.run_waf(persistent_data, {}, Datadog.configuration.appsec.waf_timeout)
73
73
 
@@ -6,7 +6,8 @@ module Datadog
6
6
  module Rails
7
7
  # Rack middleware for AppSec on Rails
8
8
  class RequestMiddleware
9
- def initialize(app, opt = {})
9
+ # TODO: opt is never used, it can probably be safely removed
10
+ def initialize(app, opt = {}) # steep:ignore DifferentMethodParameterKind
10
11
  @app = app
11
12
  end
12
13
 
@@ -24,7 +24,7 @@ module Datadog
24
24
  ephemeral_data = {
25
25
  "server.io.net.url" => url,
26
26
  "server.io.net.request.method" => method.to_s.upcase,
27
- "server.io.net.request.headers" => headers
27
+ "server.io.net.request.headers" => headers,
28
28
  }
29
29
 
30
30
  is_redirect = context.state[:downstream_redirect_url] == url
@@ -68,7 +68,7 @@ module Datadog
68
68
  # @type var ephemeral_data: ::Datadog::AppSec::Context::input_data
69
69
  ephemeral_data = {
70
70
  "server.io.net.response.status" => response.code.to_s,
71
- "server.io.net.response.headers" => headers
71
+ "server.io.net.response.headers" => headers,
72
72
  }
73
73
 
74
74
  is_redirect = REDIRECT_STATUS_CODES.cover?(response.code.to_i) && headers.key?("location")
@@ -77,7 +77,7 @@ module Datadog
77
77
  context = gateway_request.env[AppSec::Ext::CONTEXT_KEY] # : Context
78
78
 
79
79
  persistent_data = {
80
- "server.request.path_params" => gateway_route_params.params
80
+ "server.request.path_params" => gateway_route_params.params,
81
81
  }
82
82
 
83
83
  result = context.run_waf(persistent_data, {}, Datadog.configuration.appsec.waf_timeout)
@@ -102,7 +102,7 @@ module Datadog
102
102
  context = container.context # : Context
103
103
 
104
104
  persistent_data = {
105
- "server.response.body" => container.data
105
+ "server.response.body" => container.data,
106
106
  }
107
107
  result = context.run_waf(persistent_data, {}, Datadog.configuration.appsec.waf_timeout)
108
108
 
@@ -6,7 +6,8 @@ module Datadog
6
6
  module Sinatra
7
7
  # Rack middleware for AppSec on Sinatra
8
8
  class RequestMiddleware
9
- def initialize(app, opt = {})
9
+ # TODO: opt is never used, it can probably be safely removed
10
+ def initialize(app, opt = {}) # steep:ignore DifferentMethodParameterKind
10
11
  @app = app
11
12
  end
12
13
 
@@ -59,7 +59,7 @@ module Datadog
59
59
  {
60
60
  "id" => id,
61
61
  "type" => "data_with_expiration",
62
- "data" => denylist.map { |v| {"value" => v.to_s, "expiration" => 2**63} }
62
+ "data" => denylist.map { |v| {"value" => v.to_s, "expiration" => 2**63} },
63
63
  }
64
64
  end
65
65
 
@@ -82,12 +82,12 @@ module Datadog
82
82
  "parameters" => {
83
83
  "inputs" => [
84
84
  {
85
- "address" => "http.client_ip"
86
- }
85
+ "address" => "http.client_ip",
86
+ },
87
87
  ],
88
- "list" => pass
89
- }
90
- }
88
+ "list" => pass,
89
+ },
90
+ },
91
91
  ],
92
92
  "id" => SecureRandom.uuid,
93
93
  }
@@ -99,15 +99,15 @@ module Datadog
99
99
  "parameters" => {
100
100
  "inputs" => [
101
101
  {
102
- "address" => "http.client_ip"
103
- }
102
+ "address" => "http.client_ip",
103
+ },
104
104
  ],
105
- "list" => monitor
106
- }
107
- }
105
+ "list" => monitor,
106
+ },
107
+ },
108
108
  ],
109
109
  "id" => SecureRandom.uuid,
110
- "on_match" => "monitor"
110
+ "on_match" => "monitor",
111
111
  }
112
112
 
113
113
  exclusions
@@ -43,7 +43,7 @@ module Datadog
43
43
  content(
44
44
  security_response_id: interrupt_params["security_response_id"],
45
45
  content_type: content_type
46
- )
46
+ ),
47
47
  ],
48
48
  )
49
49
  end
@@ -31,7 +31,7 @@ module Datadog
31
31
  OPTIONAL_GROUP_SIGILS = [
32
32
  GROUP_OPEN_CHAR,
33
33
  GROUP_CLOSE_CHAR,
34
- OPTIONAL_GROUP_SUFFIX_CHAR
34
+ OPTIONAL_GROUP_SUFFIX_CHAR,
35
35
  ].join
36
36
 
37
37
  NAMED_PARAM_PREFIX_CHAR = ":"
@@ -41,14 +41,14 @@ module Datadog
41
41
  NAMED_PARAM_PREFIX_CHAR,
42
42
  GLOB_PARAM_PREFIX_CHAR,
43
43
  GROUP_OPEN_CHAR,
44
- GROUP_CLOSE_CHAR
44
+ GROUP_CLOSE_CHAR,
45
45
  ].join
46
46
 
47
47
  PARAM_NAME_CHARS = [*"a".."z", *"A".."Z", *"0".."9", "_"].join
48
48
 
49
49
  EXCLUDED_PARAM_NAME_TERMINATOR_CHARS = [
50
50
  PARAM_NAME_CHARS,
51
- PATTERN_STRUCTURE_CHARS
51
+ PATTERN_STRUCTURE_CHARS,
52
52
  ].join
53
53
 
54
54
  MAX_RESOLVE_LENGTH = 8192