datadog 2.40.0 → 2.42.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 (170) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +120 -59
  3. data/ext/datadog_profiling_native_extension/NativeExtensionDesign.md +12 -24
  4. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +110 -61
  5. data/ext/datadog_profiling_native_extension/collectors_stack.c +13 -5
  6. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +141 -103
  7. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +7 -3
  8. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +0 -10
  9. data/ext/datadog_profiling_native_extension/extconf.rb +52 -93
  10. data/ext/datadog_profiling_native_extension/heap_recorder.c +338 -255
  11. data/ext/datadog_profiling_native_extension/heap_recorder.h +46 -31
  12. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -27
  13. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +526 -443
  14. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +15 -3
  15. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  16. data/ext/datadog_profiling_native_extension/ruby_helpers.c +1 -79
  17. data/ext/datadog_profiling_native_extension/ruby_helpers.h +0 -7
  18. data/ext/datadog_profiling_native_extension/stack_recorder.c +93 -61
  19. data/ext/datadog_profiling_native_extension/stack_recorder.h +12 -4
  20. data/ext/libdatadog_api/datadog_ruby_common.h +0 -10
  21. data/ext/libdatadog_api/di.c +10 -0
  22. data/ext/libdatadog_api/extconf.rb +3 -0
  23. data/ext/libdatadog_api/init.c +2 -0
  24. data/ext/libdatadog_api/otel_thread_context.c +232 -0
  25. data/ext/libdatadog_api/otel_thread_context.h +5 -0
  26. data/ext/libdatadog_api/trace_exporter.c +409 -71
  27. data/ext/libdatadog_extconf_helpers.rb +1 -1
  28. data/lib/datadog/ai_guard/api_client.rb +1 -1
  29. data/lib/datadog/ai_guard/evaluation/request.rb +8 -8
  30. data/lib/datadog/ai_guard/evaluation.rb +10 -3
  31. data/lib/datadog/ai_guard/ext.rb +1 -1
  32. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +21 -42
  33. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +1 -1
  34. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +1 -1
  35. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +1 -1
  36. data/lib/datadog/appsec/assets/blocked.html +1 -108
  37. data/lib/datadog/appsec/configuration.rb +2 -2
  38. data/lib/datadog/appsec/context.rb +1 -1
  39. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +1 -1
  40. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +2 -2
  41. data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
  42. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +2 -2
  43. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +2 -2
  44. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
  45. data/lib/datadog/appsec/contrib/rack/ext.rb +2 -2
  46. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +2 -2
  47. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +2 -2
  48. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +2 -2
  49. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +2 -2
  50. data/lib/datadog/appsec/processor/rule_loader.rb +12 -12
  51. data/lib/datadog/appsec/response.rb +1 -1
  52. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +3 -3
  53. data/lib/datadog/appsec/security_engine/engine.rb +3 -3
  54. data/lib/datadog/core/configuration/components.rb +3 -2
  55. data/lib/datadog/core/configuration/option_definition.rb +1 -1
  56. data/lib/datadog/core/configuration/options.rb +1 -1
  57. data/lib/datadog/core/crashtracking/component.rb +5 -1
  58. data/lib/datadog/core/diagnostics/environment_logger.rb +36 -1
  59. data/lib/datadog/core/metrics/helpers.rb +1 -1
  60. data/lib/datadog/core/metrics/options.rb +2 -2
  61. data/lib/datadog/core/process_discovery.rb +1 -1
  62. data/lib/datadog/core/remote/client.rb +1 -1
  63. data/lib/datadog/core/remote/configuration/repository.rb +2 -2
  64. data/lib/datadog/core/telemetry/configuration_value.rb +38 -0
  65. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +3 -1
  66. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +1 -1
  67. data/lib/datadog/core/telemetry/event/app_started.rb +5 -24
  68. data/lib/datadog/core/telemetry/event/generate_metrics.rb +1 -1
  69. data/lib/datadog/core/telemetry/event/log.rb +2 -2
  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 +127 -43
  75. data/lib/datadog/data_streams/pathway_context.rb +20 -22
  76. data/lib/datadog/data_streams/processor.rb +45 -14
  77. data/lib/datadog/di/el/compiler.rb +23 -0
  78. data/lib/datadog/di/el/expression.rb +8 -5
  79. data/lib/datadog/di/instrumenter.rb +46 -5
  80. data/lib/datadog/di/logger.rb +2 -2
  81. data/lib/datadog/di/probe.rb +9 -1
  82. data/lib/datadog/di/probe_builder.rb +5 -4
  83. data/lib/datadog/di/probe_notification_builder.rb +3 -2
  84. data/lib/datadog/di/remote.rb +3 -3
  85. data/lib/datadog/di/serializer.rb +29 -4
  86. data/lib/datadog/error_tracking/component.rb +1 -1
  87. data/lib/datadog/kit/appsec/events/v2.rb +2 -2
  88. data/lib/datadog/open_feature/evaluation_engine.rb +29 -3
  89. data/lib/datadog/open_feature/exposures/batch_builder.rb +1 -1
  90. data/lib/datadog/open_feature/exposures/event.rb +15 -8
  91. data/lib/datadog/open_feature/ext.rb +19 -0
  92. data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +236 -80
  93. data/lib/datadog/open_feature/flag_evaluation/writer.rb +179 -68
  94. data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +24 -21
  95. data/lib/datadog/open_feature/native_evaluator.rb +33 -6
  96. data/lib/datadog/open_feature/noop_evaluator.rb +5 -0
  97. data/lib/datadog/open_feature/provider.rb +11 -2
  98. data/lib/datadog/opentelemetry/sdk/propagator.rb +1 -1
  99. data/lib/datadog/opentelemetry/trace.rb +3 -0
  100. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +3 -0
  101. data/lib/datadog/profiling/collectors/info.rb +1 -1
  102. data/lib/datadog/profiling/collectors/thread_context.rb +0 -4
  103. data/lib/datadog/profiling/component.rb +8 -16
  104. data/lib/datadog/profiling/tasks/exec.rb +1 -1
  105. data/lib/datadog/symbol_database/extractor.rb +6 -6
  106. data/lib/datadog/tracing/configuration/dynamic/option.rb +4 -0
  107. data/lib/datadog/tracing/configuration/dynamic.rb +5 -3
  108. data/lib/datadog/tracing/contrib/action_cable/events.rb +1 -1
  109. data/lib/datadog/tracing/contrib/action_mailer/events.rb +1 -1
  110. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -2
  111. data/lib/datadog/tracing/contrib/action_view/events.rb +1 -1
  112. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +1 -1
  113. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
  114. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -0
  115. data/lib/datadog/tracing/contrib/active_record/events.rb +1 -1
  116. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +2 -2
  117. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
  118. data/lib/datadog/tracing/contrib/aws/services.rb +1 -1
  119. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
  120. data/lib/datadog/tracing/contrib/ext.rb +3 -3
  121. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +1 -1
  122. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -1
  123. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +1 -1
  124. data/lib/datadog/tracing/contrib/kafka/events.rb +1 -1
  125. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +1 -1
  126. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  127. data/lib/datadog/tracing/contrib/opensearch/ext.rb +1 -1
  128. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +1 -1
  129. data/lib/datadog/tracing/contrib/patchable.rb +1 -1
  130. data/lib/datadog/tracing/contrib/patcher.rb +1 -1
  131. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  132. data/lib/datadog/tracing/contrib/racecar/events.rb +1 -1
  133. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +1 -1
  134. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +1 -1
  135. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  136. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +1 -1
  137. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
  138. data/lib/datadog/tracing/contrib/redis/quantize.rb +36 -2
  139. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +9 -3
  140. data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
  141. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +1 -1
  142. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +1 -1
  143. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
  144. data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +1 -1
  145. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +1 -1
  146. data/lib/datadog/tracing/correlation.rb +2 -2
  147. data/lib/datadog/tracing/diagnostics/environment_logger.rb +2 -2
  148. data/lib/datadog/tracing/distributed/baggage.rb +1 -3
  149. data/lib/datadog/tracing/distributed/datadog.rb +3 -3
  150. data/lib/datadog/tracing/distributed/propagation.rb +3 -0
  151. data/lib/datadog/tracing/distributed/trace_context.rb +14 -271
  152. data/lib/datadog/tracing/distributed/trace_state/datadog.rb +233 -0
  153. data/lib/datadog/tracing/distributed/trace_state/ext.rb +44 -0
  154. data/lib/datadog/tracing/distributed/trace_state/open_telemetry.rb +156 -0
  155. data/lib/datadog/tracing/distributed/trace_state.rb +121 -0
  156. data/lib/datadog/tracing/metadata/tagging.rb +1 -1
  157. data/lib/datadog/tracing/otel_thread_context.rb +30 -0
  158. data/lib/datadog/tracing/remote.rb +197 -29
  159. data/lib/datadog/tracing/sampling/rule_sampler.rb +2 -0
  160. data/lib/datadog/tracing/span.rb +1 -1
  161. data/lib/datadog/tracing/span_operation.rb +1 -1
  162. data/lib/datadog/tracing/trace_digest.rb +22 -4
  163. data/lib/datadog/tracing/trace_operation.rb +22 -10
  164. data/lib/datadog/tracing/tracer.rb +5 -5
  165. data/lib/datadog/tracing/transport/io/traces.rb +1 -1
  166. data/lib/datadog/tracing/transport/native.rb +78 -54
  167. data/lib/datadog/tracing/writer.rb +1 -1
  168. data/lib/datadog/version.rb +1 -1
  169. metadata +15 -8
  170. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +0 -69
@@ -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)}
@@ -51,7 +51,7 @@ module Datadog
51
51
  messages: truncate_content(truncate_messages(request.serialized_messages)),
52
52
  attack_categories: result.tags,
53
53
  sds: result.sds_findings,
54
- tag_probs: result.tag_probabilities
54
+ tag_probs: result.tag_probabilities,
55
55
  }
56
56
  )
57
57
 
@@ -88,7 +88,7 @@ module Datadog
88
88
  if message[:content].is_a?(::Array)
89
89
  serialized_content = message[:content].map do |part|
90
90
  if part[:text]
91
- {**part, text: part[:text].to_s.byteslice(0, max_bytes)}
91
+ {**part, text: truncate_content_value(part[:text].to_s, max_bytes)}
92
92
  else
93
93
  part
94
94
  end
@@ -98,11 +98,18 @@ module Datadog
98
98
  else
99
99
  {
100
100
  **message,
101
- content: message[:content].byteslice(0, max_bytes)
101
+ content: truncate_content_value(message[:content], max_bytes),
102
102
  }
103
103
  end
104
104
  end
105
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
106
113
  end
107
114
  end
108
115
  end
@@ -24,7 +24,7 @@ module Datadog
24
24
  TRACE_ANOMALY_DETECTION_TAGS = [
25
25
  TRACE_HTTP_USERAGENT_TAG,
26
26
  TRACE_HTTP_CLIENT_IP_TAG,
27
- TRACE_NETWORK_CLIENT_IP_TAG
27
+ TRACE_NETWORK_CLIENT_IP_TAG,
28
28
  ].freeze
29
29
  end
30
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
@@ -1,108 +1 @@
1
- <!-- Sorry, you've been blocked -->
2
- <!DOCTYPE html>
3
- <html lang="en">
4
-
5
- <head>
6
- <meta charset="UTF-8">
7
- <meta name="viewport" content="width=device-width,initial-scale=1">
8
- <title>You've been blocked</title>
9
- <style>
10
- a,
11
- body,
12
- div,
13
- html,
14
- span {
15
- margin: 0;
16
- padding: 0;
17
- border: 0;
18
- font-size: 100%;
19
- font: inherit;
20
- vertical-align: baseline
21
- }
22
-
23
- body {
24
- background: -webkit-radial-gradient(26% 19%, circle, #fff, #f4f7f9);
25
- background: radial-gradient(circle at 26% 19%, #fff, #f4f7f9);
26
- display: -webkit-box;
27
- display: -ms-flexbox;
28
- display: flex;
29
- -webkit-box-pack: center;
30
- -ms-flex-pack: center;
31
- justify-content: center;
32
- -webkit-box-align: center;
33
- -ms-flex-align: center;
34
- align-items: center;
35
- -ms-flex-line-pack: center;
36
- align-content: center;
37
- width: 100%;
38
- min-height: 100vh;
39
- line-height: 1;
40
- flex-direction: column
41
- }
42
-
43
- p {
44
- display: block
45
- }
46
-
47
-
48
- main {
49
- text-align: center;
50
- flex: 1;
51
- display: -webkit-box;
52
- display: -ms-flexbox;
53
- display: flex;
54
- -webkit-box-pack: center;
55
- -ms-flex-pack: center;
56
- justify-content: center;
57
- -webkit-box-align: center;
58
- -ms-flex-align: center;
59
- align-items: center;
60
- -ms-flex-line-pack: center;
61
- align-content: center;
62
- flex-direction: column
63
- }
64
-
65
- p {
66
- font-size: 18px;
67
- line-height: normal;
68
- color: #646464;
69
- font-family: sans-serif;
70
- font-weight: 400
71
- }
72
-
73
- a {
74
- color: #4842b7
75
- }
76
-
77
- footer {
78
- width: 100%;
79
- text-align: center
80
- }
81
-
82
- footer p {
83
- font-size: 16px
84
- }
85
-
86
- .security-response-id {
87
- font-size:14px;
88
- color:#999;
89
- margin-top:20px;
90
- font-family:monospace
91
- }
92
- </style>
93
- </head>
94
-
95
- <body>
96
- <main>
97
- <p>Sorry, you cannot access this page. Please contact the customer service team.</p>
98
- <p class="security-response-id">Security Response ID: [security_response_id]</p>
99
- </main>
100
- <footer>
101
- <p>Security provided by <a
102
- href="https://www.datadoghq.com/product/security-platform/application-security-monitoring/"
103
- target="_blank"
104
- rel="noopener noreferrer">Datadog</a></p>
105
- </footer>
106
- </body>
107
-
108
- </html>
1
+ <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>You've been blocked</title><style>a,body,div,html,span{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}body{background:-webkit-radial-gradient(26% 19%,circle,#fff,#f4f7f9);background:radial-gradient(circle at 26% 19%,#fff,#f4f7f9);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center;width:100%;min-height:100vh;line-height:1;flex-direction:column}p{display:block}main{text-align:center;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center;flex-direction:column}p{font-size:18px;line-height:normal;color:#646464;font-family:sans-serif;font-weight:400}a{color:#4842b7}footer{width:100%;text-align:center}footer p{font-size:16px}.security-response-id{font-size:14px;color:#999;margin-top:20px;font-family:monospace}</style></head><body><main><p>Sorry, you cannot access this page. Please contact the customer service team.</p><p class="security-response-id">Security Response ID: [security_response_id]</p></main><footer><p>Security provided by <a href="https://www.datadoghq.com/product/security-platform/application-security-monitoring/" target="_blank" rel="noopener noreferrer">Datadog</a></p></footer></body></html>
@@ -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
@@ -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
@@ -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)
@@ -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
 
@@ -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
 
@@ -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
@@ -31,7 +31,7 @@ module Datadog
31
31
  @waf_builder = WAF::HandleBuilder.new(
32
32
  obfuscator: {
33
33
  key_regex: appsec_settings.obfuscator_key_regex,
34
- value_regex: appsec_settings.obfuscator_value_regex
34
+ value_regex: appsec_settings.obfuscator_value_regex,
35
35
  }
36
36
  )
37
37
 
@@ -130,7 +130,7 @@ module Datadog
130
130
  tags: {
131
131
  waf_version: Datadog::AppSec::WAF::VERSION::BASE_STRING,
132
132
  event_rules_version: ruleset_version.to_s,
133
- success: success.to_s
133
+ success: success.to_s,
134
134
  }
135
135
  )
136
136
  end
@@ -156,7 +156,7 @@ module Datadog
156
156
  common_tags = {
157
157
  waf_version: Datadog::AppSec::WAF::VERSION::BASE_STRING,
158
158
  event_rules_version: diagnostics["ruleset_version"].to_s,
159
- action: action
159
+ action: action,
160
160
  }
161
161
 
162
162
  if diagnostics["error"]
@@ -248,6 +248,7 @@ module Datadog
248
248
  crashtracker&.update_on_fork
249
249
  ProcessDiscovery.after_fork
250
250
  symbol_database&.after_fork!
251
+ data_streams&.restart_flush_thread
251
252
  end
252
253
 
253
254
  # Hot-swaps with a new sampler.
@@ -352,13 +353,13 @@ module Datadog
352
353
  # have direct ownership of it.
353
354
  old_statsd = [
354
355
  runtime_metrics.metrics.statsd,
355
- health_metrics.statsd
356
+ health_metrics.statsd,
356
357
  ].compact.uniq
357
358
 
358
359
  new_statsd = if replacement
359
360
  [
360
361
  replacement.runtime_metrics.metrics.statsd,
361
- replacement.health_metrics.statsd
362
+ replacement.health_metrics.statsd,
362
363
  ].compact.uniq
363
364
  else
364
365
  []