datadog 2.31.0 → 2.32.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 (173) hide show
  1. checksums.yaml +4 -4
  2. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +17 -7
  3. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +11 -4
  4. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +6 -0
  5. data/ext/datadog_profiling_native_extension/extconf.rb +5 -4
  6. data/ext/datadog_profiling_native_extension/http_transport.c +10 -5
  7. data/ext/libdatadog_api/di.c +48 -0
  8. data/ext/libdatadog_api/extconf.rb +7 -4
  9. data/ext/libdatadog_extconf_helpers.rb +37 -0
  10. data/lib/datadog/ai_guard/configuration.rb +105 -2
  11. data/lib/datadog/ai_guard/evaluation.rb +1 -0
  12. data/lib/datadog/ai_guard/ext.rb +1 -0
  13. data/lib/datadog/appsec/autoload.rb +1 -1
  14. data/lib/datadog/appsec/component.rb +1 -1
  15. data/lib/datadog/appsec/configuration.rb +414 -1
  16. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +2 -1
  17. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +1 -1
  18. data/lib/datadog/appsec/contrib/rails/patcher.rb +2 -2
  19. data/lib/datadog/appsec/metrics/telemetry.rb +13 -1
  20. data/lib/datadog/appsec/security_engine/runner.rb +1 -1
  21. data/lib/datadog/appsec/trace_keeper.rb +18 -6
  22. data/lib/datadog/appsec/utils/http/url_encoded.rb +2 -2
  23. data/lib/datadog/core/configuration/components.rb +1 -1
  24. data/lib/datadog/core/configuration/settings.rb +3 -0
  25. data/lib/datadog/core/configuration/supported_configurations.rb +2 -0
  26. data/lib/datadog/core/configuration.rb +1 -1
  27. data/lib/datadog/core/contrib/rails/utils.rb +1 -1
  28. data/lib/datadog/core/crashtracking/component.rb +3 -3
  29. data/lib/datadog/core/diagnostics/environment_logger.rb +3 -1
  30. data/lib/datadog/core/environment/container.rb +2 -2
  31. data/lib/datadog/core/feature_flags.rb +1 -1
  32. data/lib/datadog/core/metrics/client.rb +5 -5
  33. data/lib/datadog/core/remote/client.rb +1 -1
  34. data/lib/datadog/core/remote/component.rb +2 -2
  35. data/lib/datadog/core/runtime/metrics.rb +1 -1
  36. data/lib/datadog/core/telemetry/emitter.rb +1 -1
  37. data/lib/datadog/core/telemetry/event/app_started.rb +2 -2
  38. data/lib/datadog/core/transport/http.rb +2 -0
  39. data/lib/datadog/core/utils.rb +1 -1
  40. data/lib/datadog/core/workers/async.rb +1 -1
  41. data/lib/datadog/core.rb +1 -1
  42. data/lib/datadog/data_streams/configuration.rb +40 -1
  43. data/lib/datadog/data_streams/pathway_context.rb +1 -1
  44. data/lib/datadog/data_streams/processor.rb +1 -1
  45. data/lib/datadog/data_streams.rb +1 -1
  46. data/lib/datadog/di/base.rb +8 -5
  47. data/lib/datadog/di/code_tracker.rb +179 -1
  48. data/lib/datadog/di/component.rb +1 -1
  49. data/lib/datadog/di/configuration.rb +235 -2
  50. data/lib/datadog/di/instrumenter.rb +46 -26
  51. data/lib/datadog/di/probe_builder.rb +1 -1
  52. data/lib/datadog/di/probe_file_loader.rb +2 -2
  53. data/lib/datadog/di/probe_manager.rb +6 -6
  54. data/lib/datadog/di/probe_notification_builder.rb +1 -1
  55. data/lib/datadog/di/probe_notifier_worker.rb +2 -2
  56. data/lib/datadog/di/remote.rb +6 -6
  57. data/lib/datadog/di/serializer.rb +1 -1
  58. data/lib/datadog/di/transport/input.rb +3 -3
  59. data/lib/datadog/error_tracking/configuration.rb +55 -2
  60. data/lib/datadog/kit/enable_core_dumps.rb +1 -1
  61. data/lib/datadog/open_feature/component.rb +18 -1
  62. data/lib/datadog/open_feature/evaluation_engine.rb +3 -3
  63. data/lib/datadog/open_feature/exposures/reporter.rb +1 -1
  64. data/lib/datadog/open_feature/exposures/worker.rb +1 -1
  65. data/lib/datadog/open_feature/hooks/flag_eval_hook.rb +49 -0
  66. data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +149 -0
  67. data/lib/datadog/open_feature/provider.rb +19 -1
  68. data/lib/datadog/open_feature/remote.rb +1 -1
  69. data/lib/datadog/open_feature/transport.rb +1 -1
  70. data/lib/datadog/opentelemetry/metrics.rb +3 -3
  71. data/lib/datadog/opentelemetry/sdk/configurator.rb +1 -1
  72. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +1 -1
  73. data/lib/datadog/profiling/collectors/code_provenance.rb +35 -9
  74. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +31 -2
  75. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +8 -2
  76. data/lib/datadog/profiling/collectors/info.rb +16 -3
  77. data/lib/datadog/profiling/component.rb +3 -5
  78. data/lib/datadog/profiling/exporter.rb +37 -12
  79. data/lib/datadog/profiling/ext.rb +0 -2
  80. data/lib/datadog/profiling/flush.rb +21 -12
  81. data/lib/datadog/profiling/http_transport.rb +12 -1
  82. data/lib/datadog/profiling/load_native_extension.rb +1 -1
  83. data/lib/datadog/profiling/profiler.rb +13 -1
  84. data/lib/datadog/profiling/scheduler.rb +2 -2
  85. data/lib/datadog/profiling/tasks/exec.rb +8 -3
  86. data/lib/datadog/profiling/tasks/help.rb +1 -0
  87. data/lib/datadog/profiling/tasks/setup.rb +2 -2
  88. data/lib/datadog/single_step_instrument.rb +1 -1
  89. data/lib/datadog/symbol_database/configuration.rb +65 -0
  90. data/lib/datadog/symbol_database/extractor.rb +915 -0
  91. data/lib/datadog/symbol_database/file_hash.rb +46 -0
  92. data/lib/datadog/symbol_database/logger.rb +43 -0
  93. data/lib/datadog/symbol_database/scope.rb +98 -0
  94. data/lib/datadog/symbol_database/service_version.rb +57 -0
  95. data/lib/datadog/symbol_database/symbol.rb +66 -0
  96. data/lib/datadog/symbol_database/transport/http/endpoint.rb +28 -0
  97. data/lib/datadog/symbol_database/transport/http.rb +45 -0
  98. data/lib/datadog/symbol_database/transport.rb +54 -0
  99. data/lib/datadog/symbol_database/uploader.rb +166 -0
  100. data/lib/datadog/symbol_database.rb +49 -0
  101. data/lib/datadog/tracing/buffer.rb +3 -3
  102. data/lib/datadog/tracing/configuration/settings.rb +1 -1
  103. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +5 -3
  104. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
  105. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
  106. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
  107. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
  108. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
  109. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
  110. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
  111. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
  112. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +1 -1
  113. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +2 -2
  114. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
  115. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -1
  116. data/lib/datadog/tracing/contrib/active_record/utils.rb +1 -1
  117. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +1 -1
  118. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +2 -2
  119. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +1 -1
  120. data/lib/datadog/tracing/contrib/component.rb +1 -1
  121. data/lib/datadog/tracing/contrib/configuration/resolver.rb +7 -4
  122. data/lib/datadog/tracing/contrib/dalli/quantize.rb +1 -1
  123. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +1 -1
  124. data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -2
  125. data/lib/datadog/tracing/contrib/extensions.rb +9 -0
  126. data/lib/datadog/tracing/contrib/faraday/middleware.rb +2 -2
  127. data/lib/datadog/tracing/contrib/grape/endpoint.rb +5 -5
  128. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +2 -2
  129. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +2 -2
  130. data/lib/datadog/tracing/contrib/http/instrumentation.rb +2 -2
  131. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +6 -2
  132. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +2 -2
  133. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +2 -2
  134. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +2 -2
  135. data/lib/datadog/tracing/contrib/karafka/patcher.rb +1 -1
  136. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +3 -3
  137. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +1 -1
  138. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +3 -3
  139. data/lib/datadog/tracing/contrib/rack/patcher.rb +1 -1
  140. data/lib/datadog/tracing/contrib/rack/request_queue.rb +1 -1
  141. data/lib/datadog/tracing/contrib/rails/log_injection.rb +1 -1
  142. data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
  143. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +2 -2
  144. data/lib/datadog/tracing/contrib/redis/quantize.rb +1 -1
  145. data/lib/datadog/tracing/contrib/redis/tags.rb +1 -1
  146. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +1 -1
  147. data/lib/datadog/tracing/contrib/stripe/request.rb +1 -1
  148. data/lib/datadog/tracing/contrib.rb +8 -0
  149. data/lib/datadog/tracing/diagnostics/environment_logger.rb +3 -1
  150. data/lib/datadog/tracing/distributed/baggage.rb +59 -5
  151. data/lib/datadog/tracing/distributed/datadog.rb +11 -11
  152. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +1 -1
  153. data/lib/datadog/tracing/distributed/propagation.rb +2 -2
  154. data/lib/datadog/tracing/distributed/trace_context.rb +74 -32
  155. data/lib/datadog/tracing/event.rb +1 -1
  156. data/lib/datadog/tracing/metadata/tagging.rb +2 -2
  157. data/lib/datadog/tracing/pipeline.rb +1 -1
  158. data/lib/datadog/tracing/remote.rb +1 -1
  159. data/lib/datadog/tracing/sampling/rule.rb +1 -1
  160. data/lib/datadog/tracing/sampling/rule_sampler.rb +2 -2
  161. data/lib/datadog/tracing/sampling/span/rule_parser.rb +2 -2
  162. data/lib/datadog/tracing/span_operation.rb +3 -3
  163. data/lib/datadog/tracing/trace_operation.rb +4 -4
  164. data/lib/datadog/tracing/tracer.rb +5 -5
  165. data/lib/datadog/tracing/transport/io/client.rb +1 -1
  166. data/lib/datadog/tracing/workers.rb +2 -1
  167. data/lib/datadog/version.rb +1 -1
  168. metadata +18 -9
  169. data/lib/datadog/ai_guard/configuration/settings.rb +0 -113
  170. data/lib/datadog/appsec/configuration/settings.rb +0 -423
  171. data/lib/datadog/data_streams/configuration/settings.rb +0 -49
  172. data/lib/datadog/di/configuration/settings.rb +0 -243
  173. data/lib/datadog/error_tracking/configuration/settings.rb +0 -63
@@ -58,7 +58,8 @@ module Datadog
58
58
  # TODO[manu]: findout the reason and reschedule the send if it's not
59
59
  # a fatal exception
60
60
  logger.warn(
61
- "Error during traces flush: dropped #{traces.length} items. Cause: #{e} Location: #{Array(e.backtrace).first}"
61
+ "Error during traces flush: dropped #{traces.length} items. " \
62
+ "Cause: #{e.class}: #{e.message} Location: #{Array(e.backtrace).first}"
62
63
  )
63
64
  end
64
65
  end
@@ -3,7 +3,7 @@
3
3
  module Datadog
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 31
6
+ MINOR = 32
7
7
  PATCH = 0
8
8
  PRE = nil
9
9
  BUILD = nil
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: datadog
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.31.0
4
+ version: 2.32.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2026-04-20 00:00:00.000000000 Z
11
+ date: 2026-05-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -190,7 +190,6 @@ files:
190
190
  - lib/datadog/ai_guard/component.rb
191
191
  - lib/datadog/ai_guard/configuration.rb
192
192
  - lib/datadog/ai_guard/configuration/ext.rb
193
- - lib/datadog/ai_guard/configuration/settings.rb
194
193
  - lib/datadog/ai_guard/contrib/integration.rb
195
194
  - lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb
196
195
  - lib/datadog/ai_guard/contrib/ruby_llm/integration.rb
@@ -227,7 +226,6 @@ files:
227
226
  - lib/datadog/appsec/component.rb
228
227
  - lib/datadog/appsec/compressed_json.rb
229
228
  - lib/datadog/appsec/configuration.rb
230
- - lib/datadog/appsec/configuration/settings.rb
231
229
  - lib/datadog/appsec/context.rb
232
230
  - lib/datadog/appsec/contrib/active_record/instrumentation.rb
233
231
  - lib/datadog/appsec/contrib/active_record/integration.rb
@@ -492,7 +490,6 @@ files:
492
490
  - lib/datadog/core/workers/runtime_metrics.rb
493
491
  - lib/datadog/data_streams.rb
494
492
  - lib/datadog/data_streams/configuration.rb
495
- - lib/datadog/data_streams/configuration/settings.rb
496
493
  - lib/datadog/data_streams/ext.rb
497
494
  - lib/datadog/data_streams/extensions.rb
498
495
  - lib/datadog/data_streams/pathway_context.rb
@@ -506,7 +503,6 @@ files:
506
503
  - lib/datadog/di/code_tracker.rb
507
504
  - lib/datadog/di/component.rb
508
505
  - lib/datadog/di/configuration.rb
509
- - lib/datadog/di/configuration/settings.rb
510
506
  - lib/datadog/di/context.rb
511
507
  - lib/datadog/di/contrib.rb
512
508
  - lib/datadog/di/contrib/active_record.rb
@@ -542,7 +538,6 @@ files:
542
538
  - lib/datadog/error_tracking/collector.rb
543
539
  - lib/datadog/error_tracking/component.rb
544
540
  - lib/datadog/error_tracking/configuration.rb
545
- - lib/datadog/error_tracking/configuration/settings.rb
546
541
  - lib/datadog/error_tracking/ext.rb
547
542
  - lib/datadog/error_tracking/extensions.rb
548
543
  - lib/datadog/error_tracking/filters.rb
@@ -563,6 +558,8 @@ files:
563
558
  - lib/datadog/open_feature/exposures/reporter.rb
564
559
  - lib/datadog/open_feature/exposures/worker.rb
565
560
  - lib/datadog/open_feature/ext.rb
561
+ - lib/datadog/open_feature/hooks/flag_eval_hook.rb
562
+ - lib/datadog/open_feature/metrics/flag_eval_metrics.rb
566
563
  - lib/datadog/open_feature/native_evaluator.rb
567
564
  - lib/datadog/open_feature/noop_evaluator.rb
568
565
  - lib/datadog/open_feature/provider.rb
@@ -610,6 +607,18 @@ files:
610
607
  - lib/datadog/profiling/tasks/help.rb
611
608
  - lib/datadog/profiling/tasks/setup.rb
612
609
  - lib/datadog/single_step_instrument.rb
610
+ - lib/datadog/symbol_database.rb
611
+ - lib/datadog/symbol_database/configuration.rb
612
+ - lib/datadog/symbol_database/extractor.rb
613
+ - lib/datadog/symbol_database/file_hash.rb
614
+ - lib/datadog/symbol_database/logger.rb
615
+ - lib/datadog/symbol_database/scope.rb
616
+ - lib/datadog/symbol_database/service_version.rb
617
+ - lib/datadog/symbol_database/symbol.rb
618
+ - lib/datadog/symbol_database/transport.rb
619
+ - lib/datadog/symbol_database/transport/http.rb
620
+ - lib/datadog/symbol_database/transport/http/endpoint.rb
621
+ - lib/datadog/symbol_database/uploader.rb
613
622
  - lib/datadog/tracing.rb
614
623
  - lib/datadog/tracing/analytics.rb
615
624
  - lib/datadog/tracing/buffer.rb
@@ -1109,8 +1118,8 @@ licenses:
1109
1118
  - Apache-2.0
1110
1119
  metadata:
1111
1120
  allowed_push_host: https://rubygems.org
1112
- changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.31.0/CHANGELOG.md
1113
- source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.31.0
1121
+ changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.32.0/CHANGELOG.md
1122
+ source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.32.0
1114
1123
  post_install_message: 'JRuby support in the datadog gem is deprecated. Details: https://dtdg.co/jruby-deprecation'
1115
1124
  rdoc_options: []
1116
1125
  require_paths:
@@ -1,113 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "uri"
4
- require_relative "ext"
5
-
6
- module Datadog
7
- module AIGuard
8
- module Configuration
9
- # AI Guard specific settings
10
- module Settings
11
- def self.extended(base)
12
- base = base.singleton_class unless base.is_a?(Class)
13
- add_settings!(base)
14
- end
15
-
16
- def self.add_settings!(base)
17
- base.class_eval do
18
- # AI Guard specific configurations.
19
- # @public_api
20
- #
21
- # Steep does not update `self` for this `class_eval` block.
22
- # @type self: Datadog::Core::Configuration::Base::_DslContext
23
- settings :ai_guard do
24
- # Enable AI Guard.
25
- #
26
- # You can use this option to skip calls to AI Guard API without having to remove library as a whole.
27
- #
28
- # @default `DD_AI_GUARD_ENABLED`, otherwise `false`
29
- # @return [Boolean]
30
- option :enabled do |o|
31
- o.type :bool
32
- o.env Ext::ENV_AI_GUARD_ENABLED
33
- o.default false
34
- end
35
-
36
- define_method(:instrument) do |integration_name|
37
- return unless enabled # steep:ignore
38
-
39
- if (registered_integration = Datadog::AIGuard::Contrib::Integration.registry[integration_name])
40
- klass = registered_integration.klass
41
- if klass.loaded? && klass.compatible?
42
- instance = klass.new
43
- instance.patcher.patch unless instance.patcher.patched?
44
- end
45
- end
46
- end
47
-
48
- # AI Guard API endpoint path.
49
- #
50
- # @default `DD_AI_GUARD_ENDPOINT`, otherwise `nil`
51
- # @return [String, nil]
52
- option :endpoint do |o|
53
- o.type :string, nilable: true
54
- o.env Ext::ENV_AI_GUARD_ENDPOINT
55
-
56
- o.setter do |value|
57
- next unless value
58
-
59
- uri = URI(value.to_s)
60
- raise ArgumentError, "Please provide an absolute URI that includes a protocol" unless uri.absolute?
61
-
62
- uri.to_s.delete_suffix("/")
63
- end
64
- end
65
-
66
- # Datadog Application key.
67
- #
68
- # @default `DD_APP_KEY` environment variable, otherwise `nil`
69
- # @return [String, nil]
70
- option :app_key do |o|
71
- o.type :string, nilable: true
72
- o.env Ext::ENV_APP_KEY
73
- end
74
-
75
- # Request timeout in milliseconds.
76
- #
77
- # @default `DD_AI_GUARD_TIMEOUT`, otherwise 10 000 ms
78
- # @return [Integer]
79
- option :timeout_ms do |o|
80
- o.type :int
81
- o.env Ext::ENV_AI_GUARD_TIMEOUT
82
- o.default 10_000
83
- end
84
-
85
- # Maximum content size in bytes.
86
- # Content that exceeds the maximum allowed size is truncated before
87
- # being stored in the current span context.
88
- #
89
- # @default `DD_AI_GUARD_MAX_CONTENT_SIZE`, otherwise 524 228 bytes
90
- # @return [Integer]
91
- option :max_content_size_bytes do |o|
92
- o.type :int
93
- o.env Ext::ENV_AI_GUARD_MAX_CONTENT_SIZE
94
- o.default 512 * 1024
95
- end
96
-
97
- # Maximum number of messages.
98
- # Older messages are omitted once the message limit is reached.
99
- #
100
- # @default `DD_AI_GUARD_MAX_MESSAGES_LENGTH`, otherwise 16 messages
101
- # @return [Integer]
102
- option :max_messages_length do |o|
103
- o.type :int
104
- o.env Ext::ENV_AI_GUARD_MAX_MESSAGES_LENGTH
105
- o.default 16
106
- end
107
- end
108
- end
109
- end
110
- end
111
- end
112
- end
113
- end
@@ -1,423 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../../core/utils/duration'
4
- require_relative '../sample_rate'
5
-
6
- module Datadog
7
- module AppSec
8
- module Configuration
9
- # Settings
10
- module Settings
11
- # rubocop:disable Layout/LineLength
12
- DEFAULT_OBFUSCATOR_KEY_REGEX = '(?i)pass|pw(?:or)?d|secret|(?:api|private|public|access)[_-]?key|token|consumer[_-]?(?:id|key|secret)|sign(?:ed|ature)|bearer|authorization|jsessionid|phpsessid|asp\.net[_-]sessionid|sid|jwt'
13
- DEFAULT_OBFUSCATOR_VALUE_REGEX = '(?i)(?:p(?:ass)?w(?:or)?d|pass(?:[_-]?phrase)?|secret(?:[_-]?key)?|(?:(?:api|private|public|access)[_-]?)key(?:[_-]?id)?|(?:(?:auth|access|id|refresh)[_-]?)?token|consumer[_-]?(?:id|key|secret)|sign(?:ed|ature)?|auth(?:entication|orization)?|jsessionid|phpsessid|asp\.net(?:[_-]|-)sessionid|sid|jwt)(?:\s*=[^;]|"\s*:\s*"[^"]+")|bearer\s+[a-z0-9\._\-]+|token:[a-z0-9]{13}|gh[opsu]_[0-9a-zA-Z]{36}|ey[I-L][\w=-]+\.ey[I-L][\w=-]+(?:\.[\w.+\/=-]+)?|[\-]{5}BEGIN[a-z\s]+PRIVATE\sKEY[\-]{5}[^\-]+[\-]{5}END[a-z\s]+PRIVATE\sKEY|ssh-rsa\s*[a-z0-9\/\.+]{100,}'
14
- # rubocop:enable Layout/LineLength
15
-
16
- DISABLED_AUTO_USER_INSTRUMENTATION_MODE = 'disabled'
17
- ANONYMIZATION_AUTO_USER_INSTRUMENTATION_MODE = 'anonymization'
18
- IDENTIFICATION_AUTO_USER_INSTRUMENTATION_MODE = 'identification'
19
- AUTO_USER_INSTRUMENTATION_MODES = [
20
- DISABLED_AUTO_USER_INSTRUMENTATION_MODE,
21
- ANONYMIZATION_AUTO_USER_INSTRUMENTATION_MODE,
22
- IDENTIFICATION_AUTO_USER_INSTRUMENTATION_MODE
23
- ].freeze
24
- AUTO_USER_INSTRUMENTATION_MODES_ALIASES = {
25
- 'ident' => IDENTIFICATION_AUTO_USER_INSTRUMENTATION_MODE,
26
- 'anon' => ANONYMIZATION_AUTO_USER_INSTRUMENTATION_MODE,
27
- }.freeze
28
-
29
- # NOTE: These two constants are deprecated
30
- SAFE_TRACK_USER_EVENTS_MODE = 'safe'
31
- EXTENDED_TRACK_USER_EVENTS_MODE = 'extended'
32
- APPSEC_VALID_TRACK_USER_EVENTS_MODE = [
33
- SAFE_TRACK_USER_EVENTS_MODE, EXTENDED_TRACK_USER_EVENTS_MODE
34
- ].freeze
35
- APPSEC_VALID_TRACK_USER_EVENTS_ENABLED_VALUES = ['1', 'true'].concat(
36
- APPSEC_VALID_TRACK_USER_EVENTS_MODE
37
- ).freeze
38
-
39
- def self.extended(base)
40
- base = base.singleton_class unless base.is_a?(Class)
41
- add_settings!(base)
42
- end
43
-
44
- # rubocop:disable Metrics/AbcSize,Metrics/MethodLength,Metrics/BlockLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
45
- def self.add_settings!(base)
46
- base.class_eval do
47
- settings :appsec do
48
- option :enabled do |o|
49
- o.type :bool
50
- o.env 'DD_APPSEC_ENABLED'
51
- o.default false
52
- end
53
-
54
- define_method(:instrument) do |integration_name|
55
- if enabled
56
- registered_integration = Datadog::AppSec::Contrib::Integration.registry[integration_name]
57
- if registered_integration
58
- klass = registered_integration.klass
59
- if klass.loaded? && klass.compatible?
60
- instance = klass.new
61
- instance.patcher.patch unless instance.patcher.patched?
62
- end
63
- end
64
- end
65
- end
66
-
67
- # RASP or Runtime Application Self-Protection
68
- # is a collection of techniques and heuristics aimed at detecting malicious inputs and preventing
69
- # any potential side-effects on the application resulting from the use of said malicious inputs.
70
- option :rasp_enabled do |o|
71
- o.type :bool, nilable: true
72
- o.env 'DD_APPSEC_RASP_ENABLED'
73
- o.default true
74
- end
75
-
76
- option :ruleset do |o|
77
- o.env 'DD_APPSEC_RULES'
78
- o.default :recommended
79
- end
80
-
81
- option :ip_passlist do |o|
82
- o.default []
83
-
84
- o.setter do |value|
85
- next value if value.nil? || value.empty?
86
-
87
- Datadog::Core.log_deprecation(disallowed_next_major: false) do
88
- 'The ip_passlist setting is deprecated and will be removed in the next release. ' \
89
- 'Please migrate this configuration to your service settings via the Datadog UI'
90
- end
91
-
92
- value
93
- end
94
- end
95
-
96
- option :ip_denylist do |o|
97
- o.type :array
98
- o.default []
99
-
100
- o.setter do |value|
101
- next value if value.nil? || value.empty?
102
-
103
- Datadog::Core.log_deprecation(disallowed_next_major: false) do
104
- 'The ip_denylist setting is deprecated and will be removed in the next release. ' \
105
- 'Please migrate this configuration to your service settings via the Datadog UI'
106
- end
107
-
108
- value
109
- end
110
- end
111
-
112
- option :user_id_denylist do |o|
113
- o.type :array
114
- o.default []
115
-
116
- o.setter do |value|
117
- next value if value.nil? || value.empty?
118
-
119
- Datadog::Core.log_deprecation(disallowed_next_major: false) do
120
- 'The user_id_denylist setting is deprecated and will be removed in the next release. ' \
121
- 'Please migrate this configuration to your service settings via the Datadog UI'
122
- end
123
-
124
- value
125
- end
126
- end
127
-
128
- option :waf_timeout do |o|
129
- o.env 'DD_APPSEC_WAF_TIMEOUT' # us
130
- o.default 5_000
131
- o.setter do |v|
132
- Datadog::Core::Utils::Duration.call(v.to_s, base: :us)
133
- end
134
- end
135
-
136
- option :waf_debug do |o|
137
- o.env 'DD_APPSEC_WAF_DEBUG'
138
- o.default false
139
- o.type :bool
140
- end
141
-
142
- option :trace_rate_limit do |o|
143
- o.type :int
144
- o.env 'DD_APPSEC_TRACE_RATE_LIMIT' # trace/s
145
- o.default 100
146
- end
147
-
148
- option :obfuscator_key_regex do |o|
149
- o.type :string
150
- o.env 'DD_APPSEC_OBFUSCATION_PARAMETER_KEY_REGEXP'
151
- o.default DEFAULT_OBFUSCATOR_KEY_REGEX
152
- end
153
-
154
- option :obfuscator_value_regex do |o|
155
- o.type :string
156
- o.env 'DD_APPSEC_OBFUSCATION_PARAMETER_VALUE_REGEXP'
157
- o.default DEFAULT_OBFUSCATOR_VALUE_REGEX
158
- end
159
-
160
- settings :block do
161
- settings :templates do
162
- option :html do |o|
163
- o.env 'DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML'
164
- o.type :string, nilable: true
165
- o.setter do |value|
166
- if value
167
- unless File.exist?(value)
168
- raise(ArgumentError,
169
- "appsec.templates.html: file not found: #{value}")
170
- end
171
-
172
- File.binread(value) || ''
173
- end
174
- end
175
- end
176
-
177
- option :json do |o|
178
- o.env 'DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON'
179
- o.type :string, nilable: true
180
- o.setter do |value|
181
- if value
182
- unless File.exist?(value)
183
- raise(ArgumentError,
184
- "appsec.templates.json: file not found: #{value}")
185
- end
186
-
187
- File.binread(value) || ''
188
- end
189
- end
190
- end
191
-
192
- option :text do |o|
193
- o.env 'DD_APPSEC_HTTP_BLOCKED_TEMPLATE_TEXT'
194
- o.type :string, nilable: true
195
- o.setter do |value|
196
- if value
197
- unless File.exist?(value)
198
- raise(ArgumentError,
199
- "appsec.templates.text: file not found: #{value}")
200
- end
201
-
202
- File.binread(value) || ''
203
- end
204
- end
205
- end
206
- end
207
- end
208
-
209
- settings :stack_trace do
210
- option :enabled do |o|
211
- o.type :bool
212
- o.env 'DD_APPSEC_STACK_TRACE_ENABLED'
213
- o.default true
214
- end
215
-
216
- # The maximum number of stack trace frames to collect for each stack trace.
217
- #
218
- # If the stack trace exceeds this limit, the frames are dropped from the middle of the stack trace:
219
- # 75% of the frames are kept from the top of the stack trace and 25% from the bottom
220
- # (this percentage is also configurable).
221
- #
222
- # Minimum value is 10.
223
- # Set to zero if you don't want any frames to be dropped.
224
- #
225
- # Default value is 32
226
- option :max_depth do |o|
227
- o.type :int
228
- o.env 'DD_APPSEC_MAX_STACK_TRACE_DEPTH'
229
- o.default 32
230
-
231
- o.setter do |value|
232
- value = 0 if value < 0
233
- value
234
- end
235
- end
236
-
237
- # The percentage of frames to keep from the top of the stack trace.
238
- #
239
- # Default value is 75
240
- option :top_percentage do |o|
241
- o.type :int
242
- o.env 'DD_APPSEC_MAX_STACK_TRACE_DEPTH_TOP_PERCENT'
243
- o.default 75
244
-
245
- o.setter do |value|
246
- value = 100 if value > 100
247
- value = 0 if value.negative?
248
- value
249
- end
250
- end
251
-
252
- # Maximum number of stack traces to collect per span.
253
- #
254
- # Set to zero if you want to collect all stack traces.
255
- #
256
- # Default value is 2
257
- option :max_stack_traces do |o|
258
- o.type :int
259
- o.env 'DD_APPSEC_MAX_STACK_TRACES'
260
- o.default 2
261
-
262
- o.setter do |value|
263
- value = 0 if value < 0
264
- value
265
- end
266
- end
267
- end
268
-
269
- settings :auto_user_instrumentation do
270
- define_method(:enabled?) { get_option(:mode) != DISABLED_AUTO_USER_INSTRUMENTATION_MODE }
271
-
272
- option :mode do |o|
273
- o.type :string
274
- o.env 'DD_APPSEC_AUTO_USER_INSTRUMENTATION_MODE'
275
- o.default IDENTIFICATION_AUTO_USER_INSTRUMENTATION_MODE
276
- o.setter do |value|
277
- mode = AUTO_USER_INSTRUMENTATION_MODES_ALIASES.fetch(value, value)
278
- next mode if AUTO_USER_INSTRUMENTATION_MODES.include?(mode)
279
-
280
- Datadog.logger.warn(
281
- 'The appsec.auto_user_instrumentation.mode value provided is not supported. ' \
282
- "Supported values are: #{AUTO_USER_INSTRUMENTATION_MODES.join(" | ")}. " \
283
- "Using value: #{DISABLED_AUTO_USER_INSTRUMENTATION_MODE}."
284
- )
285
-
286
- DISABLED_AUTO_USER_INSTRUMENTATION_MODE
287
- end
288
- end
289
- end
290
-
291
- # DEV-3.0: Remove `track_user_events.enabled` and `track_user_events.mode` options
292
- settings :track_user_events do
293
- option :enabled do |o|
294
- o.default true
295
- o.type :bool
296
- o.env 'DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING'
297
- o.env_parser do |env_value|
298
- if env_value == 'disabled'
299
- false
300
- else
301
- APPSEC_VALID_TRACK_USER_EVENTS_ENABLED_VALUES.include?(env_value.strip.downcase)
302
- end
303
- end
304
- o.after_set do |_, _, precedence|
305
- unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
306
- Core.log_deprecation(key: :appsec_track_user_events_enabled) do
307
- 'The appsec.track_user_events.enabled setting is deprecated. ' \
308
- 'Please remove it from your Datadog.configure block and use ' \
309
- 'appsec.auto_user_instrumentation.mode instead.'
310
- end
311
- end
312
- end
313
- end
314
-
315
- option :mode do |o|
316
- o.type :string
317
- o.env 'DD_APPSEC_AUTOMATED_USER_EVENTS_TRACKING'
318
- o.default SAFE_TRACK_USER_EVENTS_MODE
319
- o.setter do |v|
320
- if APPSEC_VALID_TRACK_USER_EVENTS_MODE.include?(v)
321
- v
322
- elsif v == 'disabled'
323
- SAFE_TRACK_USER_EVENTS_MODE
324
- else
325
- Datadog.logger.warn(
326
- 'The appsec.track_user_events.mode value provided is not supported.' \
327
- "Supported values are: #{APPSEC_VALID_TRACK_USER_EVENTS_MODE.join(" | ")}." \
328
- "Using default value: #{SAFE_TRACK_USER_EVENTS_MODE}."
329
- )
330
-
331
- SAFE_TRACK_USER_EVENTS_MODE
332
- end
333
- end
334
- o.after_set do |_, _, precedence|
335
- unless precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
336
- Core.log_deprecation(key: :appsec_track_user_events_mode) do
337
- 'The appsec.track_user_events.mode setting is deprecated. ' \
338
- 'Please remove it from your Datadog.configure block and use ' \
339
- 'appsec.auto_user_instrumentation.mode instead.'
340
- end
341
- end
342
- end
343
- end
344
- end
345
-
346
- settings :api_security do
347
- define_method(:enabled?) { get_option(:enabled) }
348
-
349
- option :enabled do |o|
350
- o.type :bool
351
- o.env 'DD_API_SECURITY_ENABLED'
352
- o.default true
353
- end
354
-
355
- settings :endpoint_collection do
356
- # Enables reporting of application routes at application start via telemetry
357
- option :enabled do |o|
358
- o.type :bool, nilable: true
359
- o.env 'DD_API_SECURITY_ENDPOINT_COLLECTION_ENABLED'
360
- o.default true
361
- end
362
- end
363
-
364
- # NOTE: Unfortunately, we have to go with Float due to other libs
365
- # setup, even tho we don't plan to support sub-second delays.
366
- #
367
- # WARNING: The value will be converted to Integer.
368
- option :sample_delay do |o|
369
- o.type :float
370
- o.env 'DD_API_SECURITY_SAMPLE_DELAY'
371
- o.default 30
372
- o.setter do |value|
373
- value.to_i
374
- end
375
- end
376
-
377
- # DEV-3.0: Remove `api_security.sample_rate` option
378
- option :sample_rate do |o|
379
- o.type :float
380
- o.env 'DD_API_SECURITY_REQUEST_SAMPLE_RATE'
381
- o.default 0.1
382
- o.setter do |value|
383
- value = 1 if value > 1
384
- SampleRate.new(value)
385
- end
386
- o.after_set do |_, _, precedence|
387
- next if precedence == Datadog::Core::Configuration::Option::Precedence::DEFAULT
388
-
389
- Core.log_deprecation(key: :appsec_api_security_sample_rate) do
390
- 'The appsec.api_security.sample_rate setting is deprecated. ' \
391
- 'Please remove it from your Datadog.configure block and use ' \
392
- 'appsec.api_security.sample_delay instead.'
393
- end
394
- end
395
- end
396
-
397
- settings :downstream_body_analysis do
398
- option :sample_rate do |o|
399
- o.type :float
400
- o.env 'DD_API_SECURITY_DOWNSTREAM_BODY_ANALYSIS_SAMPLE_RATE'
401
- o.default 0.5
402
- end
403
-
404
- option :max_requests do |o|
405
- o.type :int
406
- o.env 'DD_API_SECURITY_MAX_DOWNSTREAM_REQUEST_BODY_ANALYSIS'
407
- o.default 1
408
- end
409
- end
410
- end
411
-
412
- option :sca_enabled do |o|
413
- o.type :bool, nilable: true
414
- o.env 'DD_APPSEC_SCA_ENABLED'
415
- end
416
- end
417
- end
418
- end
419
- # rubocop:enable Metrics/AbcSize,Metrics/MethodLength,Metrics/BlockLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
420
- end
421
- end
422
- end
423
- end