datadog 2.40.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 (117) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +85 -58
  3. data/ext/datadog_profiling_native_extension/collectors_stack.c +2 -2
  4. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -3
  5. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +26 -12
  6. data/ext/libdatadog_api/trace_exporter.c +409 -71
  7. data/ext/libdatadog_extconf_helpers.rb +1 -1
  8. data/lib/datadog/ai_guard/api_client.rb +1 -1
  9. data/lib/datadog/ai_guard/evaluation/request.rb +8 -8
  10. data/lib/datadog/ai_guard/evaluation.rb +10 -3
  11. data/lib/datadog/ai_guard/ext.rb +1 -1
  12. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +21 -42
  13. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +1 -1
  14. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +1 -1
  15. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +1 -1
  16. data/lib/datadog/appsec/configuration.rb +2 -2
  17. data/lib/datadog/appsec/context.rb +1 -1
  18. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +1 -1
  19. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +2 -2
  20. data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
  21. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +2 -2
  22. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +2 -2
  23. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +1 -1
  24. data/lib/datadog/appsec/contrib/rack/ext.rb +2 -2
  25. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +2 -2
  26. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +2 -2
  27. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +2 -2
  28. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +2 -2
  29. data/lib/datadog/appsec/processor/rule_loader.rb +12 -12
  30. data/lib/datadog/appsec/response.rb +1 -1
  31. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +3 -3
  32. data/lib/datadog/appsec/security_engine/engine.rb +3 -3
  33. data/lib/datadog/core/configuration/components.rb +2 -2
  34. data/lib/datadog/core/configuration/option_definition.rb +1 -1
  35. data/lib/datadog/core/configuration/options.rb +1 -1
  36. data/lib/datadog/core/diagnostics/environment_logger.rb +36 -1
  37. data/lib/datadog/core/metrics/helpers.rb +1 -1
  38. data/lib/datadog/core/metrics/options.rb +2 -2
  39. data/lib/datadog/core/process_discovery.rb +1 -1
  40. data/lib/datadog/core/remote/client.rb +1 -1
  41. data/lib/datadog/core/remote/configuration/repository.rb +2 -2
  42. data/lib/datadog/core/telemetry/configuration_value.rb +38 -0
  43. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +3 -1
  44. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +1 -1
  45. data/lib/datadog/core/telemetry/event/app_started.rb +5 -24
  46. data/lib/datadog/core/telemetry/event/generate_metrics.rb +1 -1
  47. data/lib/datadog/core/telemetry/event/log.rb +2 -2
  48. data/lib/datadog/core/telemetry/metric.rb +2 -2
  49. data/lib/datadog/core/telemetry/request.rb +2 -2
  50. data/lib/datadog/core/transport/http.rb +1 -1
  51. data/lib/datadog/core/transport/transport.rb +1 -1
  52. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +127 -43
  53. data/lib/datadog/data_streams/processor.rb +14 -14
  54. data/lib/datadog/di/el/compiler.rb +23 -0
  55. data/lib/datadog/di/el/expression.rb +8 -5
  56. data/lib/datadog/di/instrumenter.rb +5 -4
  57. data/lib/datadog/di/probe_builder.rb +5 -4
  58. data/lib/datadog/di/probe_notification_builder.rb +2 -2
  59. data/lib/datadog/di/serializer.rb +29 -4
  60. data/lib/datadog/error_tracking/component.rb +1 -1
  61. data/lib/datadog/kit/appsec/events/v2.rb +2 -2
  62. data/lib/datadog/open_feature/exposures/batch_builder.rb +1 -1
  63. data/lib/datadog/open_feature/exposures/event.rb +5 -5
  64. data/lib/datadog/profiling/collectors/info.rb +1 -1
  65. data/lib/datadog/profiling/tasks/exec.rb +1 -1
  66. data/lib/datadog/symbol_database/extractor.rb +6 -6
  67. data/lib/datadog/tracing/configuration/dynamic/option.rb +4 -0
  68. data/lib/datadog/tracing/configuration/dynamic.rb +5 -3
  69. data/lib/datadog/tracing/contrib/action_cable/events.rb +1 -1
  70. data/lib/datadog/tracing/contrib/action_mailer/events.rb +1 -1
  71. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +2 -2
  72. data/lib/datadog/tracing/contrib/action_view/events.rb +1 -1
  73. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +1 -1
  74. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -1
  75. data/lib/datadog/tracing/contrib/active_record/events.rb +1 -1
  76. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +2 -2
  77. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -1
  78. data/lib/datadog/tracing/contrib/aws/services.rb +1 -1
  79. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +1 -1
  80. data/lib/datadog/tracing/contrib/ext.rb +3 -3
  81. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +1 -1
  82. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +1 -1
  83. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +1 -1
  84. data/lib/datadog/tracing/contrib/kafka/events.rb +1 -1
  85. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +1 -1
  86. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +1 -1
  87. data/lib/datadog/tracing/contrib/opensearch/ext.rb +1 -1
  88. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +1 -1
  89. data/lib/datadog/tracing/contrib/patchable.rb +1 -1
  90. data/lib/datadog/tracing/contrib/patcher.rb +1 -1
  91. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  92. data/lib/datadog/tracing/contrib/racecar/events.rb +1 -1
  93. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +1 -1
  94. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +1 -1
  95. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  96. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +1 -1
  97. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +1 -1
  98. data/lib/datadog/tracing/contrib/redis/quantize.rb +36 -2
  99. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +9 -3
  100. data/lib/datadog/tracing/contrib/sequel/utils.rb +1 -1
  101. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +1 -1
  102. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +1 -1
  103. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +1 -1
  104. data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +1 -1
  105. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +1 -1
  106. data/lib/datadog/tracing/correlation.rb +2 -2
  107. data/lib/datadog/tracing/diagnostics/environment_logger.rb +2 -2
  108. data/lib/datadog/tracing/distributed/baggage.rb +1 -2
  109. data/lib/datadog/tracing/metadata/tagging.rb +1 -1
  110. data/lib/datadog/tracing/remote.rb +2 -2
  111. data/lib/datadog/tracing/span.rb +1 -1
  112. data/lib/datadog/tracing/span_operation.rb +1 -1
  113. data/lib/datadog/tracing/transport/io/traces.rb +1 -1
  114. data/lib/datadog/tracing/transport/native.rb +78 -54
  115. data/lib/datadog/tracing/writer.rb +1 -1
  116. data/lib/datadog/version.rb +1 -1
  117. metadata +6 -5
@@ -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
@@ -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"]
@@ -352,13 +352,13 @@ module Datadog
352
352
  # have direct ownership of it.
353
353
  old_statsd = [
354
354
  runtime_metrics.metrics.statsd,
355
- health_metrics.statsd
355
+ health_metrics.statsd,
356
356
  ].compact.uniq
357
357
 
358
358
  new_statsd = if replacement
359
359
  [
360
360
  replacement.runtime_metrics.metrics.statsd,
361
- replacement.health_metrics.statsd
361
+ replacement.health_metrics.statsd,
362
362
  ].compact.uniq
363
363
  else
364
364
  []
@@ -165,7 +165,7 @@ module Datadog
165
165
  resetter: @resetter,
166
166
  setter: @setter,
167
167
  type: @type,
168
- type_options: @type_options
168
+ type_options: @type_options,
169
169
  }
170
170
  end
171
171
 
@@ -84,7 +84,7 @@ module Datadog
84
84
  end
85
85
  {
86
86
  option_name.to_sym => opt_getter,
87
- :"#{option_name}=" => opt_setter
87
+ :"#{option_name}=" => opt_setter,
88
88
  }
89
89
  end
90
90
 
@@ -75,7 +75,10 @@ module Datadog
75
75
  tags: tags,
76
76
  runtime_metrics_enabled: runtime_metrics_enabled,
77
77
  vm: vm,
78
- health_metrics_enabled: health_metrics_enabled
78
+ health_metrics_enabled: health_metrics_enabled,
79
+ otlp_traces_export_enabled: otlp_traces_export_enabled,
80
+ otlp_metrics_export_enabled: otlp_metrics_export_enabled,
81
+ otlp_logs_export_enabled: otlp_logs_export_enabled,
79
82
  }
80
83
  end
81
84
 
@@ -159,8 +162,40 @@ module Datadog
159
162
  !!Datadog.configuration.health_metrics.enabled
160
163
  end
161
164
 
165
+ # @return [Boolean] whether the tracer exports traces over OTLP.
166
+ # Always false: Ruby exports spans in Datadog's native format and has no OTLP trace exporter.
167
+ def otlp_traces_export_enabled
168
+ false
169
+ end
170
+
171
+ # @return [Boolean] whether the tracer exports metrics over OTLP
172
+ def otlp_metrics_export_enabled
173
+ metrics = opentelemetry_settings&.metrics
174
+ # A "none" exporter skips the OTLP metric reader even when metrics are enabled
175
+ # (mirrors Datadog::OpenTelemetry::Ext::EXPORTER_NONE).
176
+ !!(metrics&.enabled && metrics.exporter != "none")
177
+ end
178
+
179
+ # @return [Boolean] whether the tracer exports logs over OTLP
180
+ def otlp_logs_export_enabled
181
+ logs = opentelemetry_settings&.logs
182
+ # A "none" exporter skips the OTLP log record processor even when logs are enabled
183
+ # (mirrors Datadog::OpenTelemetry::Ext::EXPORTER_NONE).
184
+ !!(logs&.enabled && logs.exporter != "none")
185
+ end
186
+
162
187
  private
163
188
 
189
+ # The `opentelemetry` settings namespace is registered by core configuration, but access it
190
+ # defensively so a missing/unregistered namespace defaults to `false` rather than raising.
191
+ def opentelemetry_settings
192
+ return unless Datadog.configuration.respond_to?(:opentelemetry)
193
+
194
+ Datadog.configuration.opentelemetry
195
+ rescue
196
+ nil
197
+ end
198
+
164
199
  # Outputs "k1:v1,k2:v2,..."
165
200
  def hash_serializer(h)
166
201
  h.map { |k, v| "#{k}:#{v}" }.join(",")
@@ -10,7 +10,7 @@ module Datadog
10
10
  :distribution,
11
11
  :increment,
12
12
  :gauge,
13
- :time
13
+ :time,
14
14
  ].each do |metric_type|
15
15
  define_method(metric_type) do |name, stat|
16
16
  name = name.to_sym
@@ -16,8 +16,8 @@ module Datadog
16
16
  "#{Ext::TAG_LANG_VERSION}:#{Environment::Identity.lang_version}",
17
17
  # TODO: Technically not accurate, if tracing version diverges from datadog gem version
18
18
  # If we extract tracing to its own gem, this needs to be updated.
19
- "#{Ext::TAG_TRACER_VERSION}:#{Environment::Identity.gem_datadog_version}"
20
- ].freeze
19
+ "#{Ext::TAG_TRACER_VERSION}:#{Environment::Identity.gem_datadog_version}",
20
+ ].freeze,
21
21
  }.freeze
22
22
 
23
23
  def metric_options(options = nil)
@@ -53,7 +53,7 @@ module Datadog
53
53
  service_version: settings.version || "",
54
54
  # Follows Java: https://github.com/DataDog/dd-trace-java/blob/2ebc964340ac530342cc389ba68ff0f5070d5f9f/dd-trace-core/src/main/java/datadog/trace/core/servicediscovery/ServiceDiscovery.java#L37-L38
55
55
  process_tags: settings.experimental_propagate_process_tags_enabled ? Core::Environment::Process.serialized : "",
56
- container_id: Core::Environment::Container.container_id || ""
56
+ container_id: Core::Environment::Container.container_id || "",
57
57
  }
58
58
  end
59
59
  end