datadog 2.8.0 → 2.10.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 (128) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +62 -1
  3. data/ext/datadog_profiling_native_extension/clock_id.h +2 -2
  4. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +66 -56
  5. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  6. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +1 -1
  7. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +16 -16
  8. data/ext/datadog_profiling_native_extension/collectors_stack.c +7 -7
  9. data/ext/datadog_profiling_native_extension/collectors_stack.h +2 -2
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +221 -127
  11. data/ext/datadog_profiling_native_extension/heap_recorder.c +50 -92
  12. data/ext/datadog_profiling_native_extension/heap_recorder.h +2 -2
  13. data/ext/datadog_profiling_native_extension/http_transport.c +4 -4
  14. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +3 -0
  15. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +3 -1
  16. data/ext/datadog_profiling_native_extension/profiling.c +10 -8
  17. data/ext/datadog_profiling_native_extension/ruby_helpers.c +8 -8
  18. data/ext/datadog_profiling_native_extension/stack_recorder.c +63 -76
  19. data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -2
  20. data/ext/datadog_profiling_native_extension/time_helpers.h +1 -1
  21. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +47 -0
  22. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +31 -0
  23. data/ext/libdatadog_api/crashtracker.c +3 -0
  24. data/lib/datadog/appsec/actions_handler.rb +27 -0
  25. data/lib/datadog/appsec/assets/waf_rules/recommended.json +355 -157
  26. data/lib/datadog/appsec/assets/waf_rules/strict.json +62 -32
  27. data/lib/datadog/appsec/component.rb +14 -8
  28. data/lib/datadog/appsec/configuration/settings.rb +9 -0
  29. data/lib/datadog/appsec/context.rb +74 -0
  30. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +12 -8
  31. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +6 -6
  32. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +4 -4
  33. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +1 -7
  34. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +20 -30
  35. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +6 -6
  36. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +3 -3
  37. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +67 -96
  38. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +11 -11
  39. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +6 -6
  40. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +7 -7
  41. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +10 -11
  42. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +43 -60
  43. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +23 -33
  44. data/lib/datadog/appsec/contrib/rails/patcher.rb +4 -14
  45. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +7 -7
  46. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +45 -65
  47. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +5 -28
  48. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +6 -6
  49. data/lib/datadog/appsec/event.rb +6 -6
  50. data/lib/datadog/appsec/ext.rb +8 -1
  51. data/lib/datadog/appsec/metrics/collector.rb +38 -0
  52. data/lib/datadog/appsec/metrics/exporter.rb +35 -0
  53. data/lib/datadog/appsec/metrics/telemetry.rb +23 -0
  54. data/lib/datadog/appsec/metrics.rb +13 -0
  55. data/lib/datadog/appsec/monitor/gateway/watcher.rb +23 -32
  56. data/lib/datadog/appsec/monitor/reactive/set_user.rb +6 -6
  57. data/lib/datadog/appsec/processor/rule_loader.rb +0 -3
  58. data/lib/datadog/appsec/processor.rb +4 -3
  59. data/lib/datadog/appsec/response.rb +18 -80
  60. data/lib/datadog/appsec/security_engine/result.rb +67 -0
  61. data/lib/datadog/appsec/security_engine/runner.rb +88 -0
  62. data/lib/datadog/appsec/security_engine.rb +9 -0
  63. data/lib/datadog/appsec.rb +17 -8
  64. data/lib/datadog/auto_instrument.rb +3 -0
  65. data/lib/datadog/core/configuration/agent_settings_resolver.rb +39 -11
  66. data/lib/datadog/core/configuration/components.rb +4 -2
  67. data/lib/datadog/core/configuration.rb +1 -1
  68. data/lib/datadog/{tracing → core}/contrib/rails/utils.rb +1 -3
  69. data/lib/datadog/core/crashtracking/component.rb +1 -3
  70. data/lib/datadog/core/telemetry/event.rb +87 -3
  71. data/lib/datadog/core/telemetry/logging.rb +2 -2
  72. data/lib/datadog/core/telemetry/metric.rb +22 -0
  73. data/lib/datadog/core/telemetry/worker.rb +33 -0
  74. data/lib/datadog/di/base.rb +115 -0
  75. data/lib/datadog/di/code_tracker.rb +7 -4
  76. data/lib/datadog/di/component.rb +19 -11
  77. data/lib/datadog/di/configuration/settings.rb +11 -1
  78. data/lib/datadog/di/contrib/railtie.rb +15 -0
  79. data/lib/datadog/di/contrib.rb +26 -0
  80. data/lib/datadog/di/error.rb +5 -0
  81. data/lib/datadog/di/instrumenter.rb +39 -18
  82. data/lib/datadog/di/{init.rb → preload.rb} +2 -4
  83. data/lib/datadog/di/probe_manager.rb +4 -4
  84. data/lib/datadog/di/probe_notification_builder.rb +22 -2
  85. data/lib/datadog/di/probe_notifier_worker.rb +5 -6
  86. data/lib/datadog/di/redactor.rb +0 -1
  87. data/lib/datadog/di/remote.rb +30 -9
  88. data/lib/datadog/di/transport.rb +2 -4
  89. data/lib/datadog/di.rb +5 -108
  90. data/lib/datadog/kit/appsec/events.rb +3 -3
  91. data/lib/datadog/kit/identity.rb +4 -4
  92. data/lib/datadog/profiling/component.rb +55 -53
  93. data/lib/datadog/profiling/http_transport.rb +1 -26
  94. data/lib/datadog/tracing/contrib/action_cable/integration.rb +5 -2
  95. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +6 -2
  96. data/lib/datadog/tracing/contrib/action_pack/integration.rb +5 -2
  97. data/lib/datadog/tracing/contrib/action_view/integration.rb +5 -2
  98. data/lib/datadog/tracing/contrib/active_job/integration.rb +5 -2
  99. data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -2
  100. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +3 -1
  101. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +3 -1
  102. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +10 -0
  103. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -2
  104. data/lib/datadog/tracing/contrib/auto_instrument.rb +2 -2
  105. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -0
  106. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -0
  107. data/lib/datadog/tracing/contrib/extensions.rb +15 -3
  108. data/lib/datadog/tracing/contrib/http/integration.rb +3 -0
  109. data/lib/datadog/tracing/contrib/httprb/integration.rb +3 -0
  110. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -0
  111. data/lib/datadog/tracing/contrib/mongodb/integration.rb +3 -0
  112. data/lib/datadog/tracing/contrib/opensearch/integration.rb +3 -0
  113. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -0
  114. data/lib/datadog/tracing/contrib/rack/integration.rb +2 -2
  115. data/lib/datadog/tracing/contrib/rails/framework.rb +2 -2
  116. data/lib/datadog/tracing/contrib/rails/patcher.rb +1 -1
  117. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -0
  118. data/lib/datadog/tracing/span.rb +12 -4
  119. data/lib/datadog/tracing/span_event.rb +123 -3
  120. data/lib/datadog/tracing/span_operation.rb +6 -0
  121. data/lib/datadog/tracing/transport/serializable_trace.rb +24 -6
  122. data/lib/datadog/version.rb +1 -1
  123. metadata +40 -17
  124. data/lib/datadog/appsec/contrib/sinatra/ext.rb +0 -14
  125. data/lib/datadog/appsec/processor/context.rb +0 -107
  126. data/lib/datadog/appsec/reactive/operation.rb +0 -68
  127. data/lib/datadog/appsec/scope.rb +0 -58
  128. data/lib/datadog/core/crashtracking/agent_base_url.rb +0 -21
@@ -12,8 +12,11 @@ module Datadog
12
12
  attr_reader \
13
13
  :trace
14
14
 
15
- def initialize(trace)
15
+ # @param trace [Datadog::Trace] the trace to serialize
16
+ # @param native_events_supported [Boolean] whether the agent supports span events as a top-level field
17
+ def initialize(trace, native_events_supported = false)
16
18
  @trace = trace
19
+ @native_events_supported = native_events_supported
17
20
  end
18
21
 
19
22
  # MessagePack serializer interface. Making this object
@@ -26,13 +29,13 @@ module Datadog
26
29
  # @param packer [MessagePack::Packer] serialization buffer, can be +nil+ with JRuby
27
30
  def to_msgpack(packer = nil)
28
31
  # As of 1.3.3, JRuby implementation doesn't pass an existing packer
29
- trace.spans.map { |s| SerializableSpan.new(s) }.to_msgpack(packer)
32
+ trace.spans.map { |s| SerializableSpan.new(s, @native_events_supported) }.to_msgpack(packer)
30
33
  end
31
34
 
32
35
  # JSON serializer interface.
33
36
  # Used by older version of the transport.
34
37
  def to_json(*args)
35
- trace.spans.map { |s| SerializableSpan.new(s).to_hash }.to_json(*args)
38
+ trace.spans.map { |s| SerializableSpan.new(s, @native_events_supported).to_hash }.to_json(*args)
36
39
  end
37
40
  end
38
41
 
@@ -41,9 +44,12 @@ module Datadog
41
44
  attr_reader \
42
45
  :span
43
46
 
44
- def initialize(span)
47
+ # @param span [Datadog::Span] the span to serialize
48
+ # @param native_events_supported [Boolean] whether the agent supports span events as a top-level field
49
+ def initialize(span, native_events_supported)
45
50
  @span = span
46
51
  @trace_id = Tracing::Utils::TraceId.to_low_order(span.trace_id)
52
+ @native_events_supported = native_events_supported
47
53
  end
48
54
 
49
55
  # MessagePack serializer interface. Making this object
@@ -55,11 +61,14 @@ module Datadog
55
61
  #
56
62
  # @param packer [MessagePack::Packer] serialization buffer, can be +nil+ with JRuby
57
63
  # rubocop:disable Metrics/AbcSize
64
+ # rubocop:disable Metrics/MethodLength
58
65
  def to_msgpack(packer = nil)
59
66
  packer ||= MessagePack::Packer.new
60
67
 
61
68
  number_of_elements_to_write = 11
62
69
 
70
+ number_of_elements_to_write += 1 if span.events.any? && @native_events_supported
71
+
63
72
  if span.stopped?
64
73
  packer.write_map_header(number_of_elements_to_write + 2) # Set header with how many elements in the map
65
74
 
@@ -72,8 +81,16 @@ module Datadog
72
81
  packer.write_map_header(number_of_elements_to_write) # Set header with how many elements in the map
73
82
  end
74
83
 
75
- # serialize span events as meta tags
76
- span.set_tag('events', span.events.map(&:to_hash).to_json) if span.events.any?
84
+ if span.events.any?
85
+ if @native_events_supported
86
+ # Use top-level field for native events
87
+ packer.write('span_events')
88
+ packer.write(span.events.map(&:to_native_format))
89
+ else
90
+ # Serialize span events as meta tags
91
+ span.set_tag('events', span.events.map(&:to_hash).to_json)
92
+ end
93
+ end
77
94
 
78
95
  # DEV: We use strings as keys here, instead of symbols, as
79
96
  # DEV: MessagePack will ultimately convert them to strings.
@@ -103,6 +120,7 @@ module Datadog
103
120
  packer
104
121
  end
105
122
  # rubocop:enable Metrics/AbcSize
123
+ # rubocop:enable Metrics/MethodLength
106
124
 
107
125
  # JSON serializer interface.
108
126
  # Used by older version of the transport.
@@ -3,7 +3,7 @@
3
3
  module Datadog
4
4
  module VERSION
5
5
  MAJOR = 2
6
- MINOR = 8
6
+ MINOR = 10
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.8.0
4
+ version: 2.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Datadog, Inc.
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-10 00:00:00.000000000 Z
11
+ date: 2025-02-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: msgpack
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '3.3'
33
+ version: '3.4'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '3.3'
40
+ version: '3.4'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: libddwaf
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
68
  version: 14.3.1.1.0
69
+ - !ruby/object:Gem::Dependency
70
+ name: logger
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  description: |
70
84
  datadog is Datadog's client library for Ruby. It includes a suite of tools
71
85
  which provide visibility into the performance and security of Ruby applications,
@@ -130,6 +144,8 @@ files:
130
144
  - ext/datadog_profiling_native_extension/stack_recorder.h
131
145
  - ext/datadog_profiling_native_extension/time_helpers.c
132
146
  - ext/datadog_profiling_native_extension/time_helpers.h
147
+ - ext/datadog_profiling_native_extension/unsafe_api_calls_check.c
148
+ - ext/datadog_profiling_native_extension/unsafe_api_calls_check.h
133
149
  - ext/libdatadog_api/crashtracker.c
134
150
  - ext/libdatadog_api/datadog_ruby_common.c
135
151
  - ext/libdatadog_api/datadog_ruby_common.h
@@ -138,6 +154,7 @@ files:
138
154
  - ext/libdatadog_extconf_helpers.rb
139
155
  - lib/datadog.rb
140
156
  - lib/datadog/appsec.rb
157
+ - lib/datadog/appsec/actions_handler.rb
141
158
  - lib/datadog/appsec/assets.rb
142
159
  - lib/datadog/appsec/assets/blocked.html
143
160
  - lib/datadog/appsec/assets/blocked.json
@@ -151,6 +168,7 @@ files:
151
168
  - lib/datadog/appsec/component.rb
152
169
  - lib/datadog/appsec/configuration.rb
153
170
  - lib/datadog/appsec/configuration/settings.rb
171
+ - lib/datadog/appsec/context.rb
154
172
  - lib/datadog/appsec/contrib/active_record/instrumentation.rb
155
173
  - lib/datadog/appsec/contrib/active_record/integration.rb
156
174
  - lib/datadog/appsec/contrib/active_record/patcher.rb
@@ -192,7 +210,6 @@ files:
192
210
  - lib/datadog/appsec/contrib/rails/reactive/action.rb
193
211
  - lib/datadog/appsec/contrib/rails/request.rb
194
212
  - lib/datadog/appsec/contrib/rails/request_middleware.rb
195
- - lib/datadog/appsec/contrib/sinatra/ext.rb
196
213
  - lib/datadog/appsec/contrib/sinatra/framework.rb
197
214
  - lib/datadog/appsec/contrib/sinatra/gateway/request.rb
198
215
  - lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb
@@ -207,22 +224,26 @@ files:
207
224
  - lib/datadog/appsec/instrumentation.rb
208
225
  - lib/datadog/appsec/instrumentation/gateway.rb
209
226
  - lib/datadog/appsec/instrumentation/gateway/argument.rb
227
+ - lib/datadog/appsec/metrics.rb
228
+ - lib/datadog/appsec/metrics/collector.rb
229
+ - lib/datadog/appsec/metrics/exporter.rb
230
+ - lib/datadog/appsec/metrics/telemetry.rb
210
231
  - lib/datadog/appsec/monitor.rb
211
232
  - lib/datadog/appsec/monitor/gateway/watcher.rb
212
233
  - lib/datadog/appsec/monitor/reactive/set_user.rb
213
234
  - lib/datadog/appsec/processor.rb
214
- - lib/datadog/appsec/processor/context.rb
215
235
  - lib/datadog/appsec/processor/rule_loader.rb
216
236
  - lib/datadog/appsec/processor/rule_merger.rb
217
237
  - lib/datadog/appsec/rate_limiter.rb
218
238
  - lib/datadog/appsec/reactive/address_hash.rb
219
239
  - lib/datadog/appsec/reactive/engine.rb
220
- - lib/datadog/appsec/reactive/operation.rb
221
240
  - lib/datadog/appsec/reactive/subscriber.rb
222
241
  - lib/datadog/appsec/remote.rb
223
242
  - lib/datadog/appsec/response.rb
224
243
  - lib/datadog/appsec/sample_rate.rb
225
- - lib/datadog/appsec/scope.rb
244
+ - lib/datadog/appsec/security_engine.rb
245
+ - lib/datadog/appsec/security_engine/result.rb
246
+ - lib/datadog/appsec/security_engine/runner.rb
226
247
  - lib/datadog/appsec/utils.rb
227
248
  - lib/datadog/appsec/utils/http.rb
228
249
  - lib/datadog/appsec/utils/http/media_range.rb
@@ -244,7 +265,7 @@ files:
244
265
  - lib/datadog/core/configuration/option_definition.rb
245
266
  - lib/datadog/core/configuration/options.rb
246
267
  - lib/datadog/core/configuration/settings.rb
247
- - lib/datadog/core/crashtracking/agent_base_url.rb
268
+ - lib/datadog/core/contrib/rails/utils.rb
248
269
  - lib/datadog/core/crashtracking/component.rb
249
270
  - lib/datadog/core/crashtracking/tag_builder.rb
250
271
  - lib/datadog/core/deprecations.rb
@@ -365,15 +386,18 @@ files:
365
386
  - lib/datadog/core/workers/queue.rb
366
387
  - lib/datadog/core/workers/runtime_metrics.rb
367
388
  - lib/datadog/di.rb
389
+ - lib/datadog/di/base.rb
368
390
  - lib/datadog/di/code_tracker.rb
369
391
  - lib/datadog/di/component.rb
370
392
  - lib/datadog/di/configuration.rb
371
393
  - lib/datadog/di/configuration/settings.rb
394
+ - lib/datadog/di/contrib.rb
372
395
  - lib/datadog/di/contrib/active_record.rb
396
+ - lib/datadog/di/contrib/railtie.rb
373
397
  - lib/datadog/di/error.rb
374
398
  - lib/datadog/di/extensions.rb
375
- - lib/datadog/di/init.rb
376
399
  - lib/datadog/di/instrumenter.rb
400
+ - lib/datadog/di/preload.rb
377
401
  - lib/datadog/di/probe.rb
378
402
  - lib/datadog/di/probe_builder.rb
379
403
  - lib/datadog/di/probe_manager.rb
@@ -726,7 +750,6 @@ files:
726
750
  - lib/datadog/tracing/contrib/rails/patcher.rb
727
751
  - lib/datadog/tracing/contrib/rails/railtie.rb
728
752
  - lib/datadog/tracing/contrib/rails/runner.rb
729
- - lib/datadog/tracing/contrib/rails/utils.rb
730
753
  - lib/datadog/tracing/contrib/rake/configuration/settings.rb
731
754
  - lib/datadog/tracing/contrib/rake/ext.rb
732
755
  - lib/datadog/tracing/contrib/rake/instrumentation.rb
@@ -902,9 +925,9 @@ licenses:
902
925
  - Apache-2.0
903
926
  metadata:
904
927
  allowed_push_host: https://rubygems.org
905
- changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.8.0/CHANGELOG.md
906
- source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.8.0
907
- post_install_message:
928
+ changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.10.0/CHANGELOG.md
929
+ source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.10.0
930
+ post_install_message:
908
931
  rdoc_options: []
909
932
  require_paths:
910
933
  - lib
@@ -922,8 +945,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
922
945
  - !ruby/object:Gem::Version
923
946
  version: 2.0.0
924
947
  requirements: []
925
- rubygems_version: 3.4.10
926
- signing_key:
948
+ rubygems_version: 3.5.22
949
+ signing_key:
927
950
  specification_version: 4
928
951
  summary: Datadog tracing code for your Ruby applications
929
952
  test_files: []
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- module Contrib
6
- module Sinatra
7
- # Sinatra integration constants
8
- module Ext
9
- ROUTE_INTERRUPT = :datadog_appsec_contrib_sinatra_route_interrupt
10
- end
11
- end
12
- end
13
- end
14
- end
@@ -1,107 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- class Processor
6
- # Context manages a sequence of runs
7
- class Context
8
- LIBDDWAF_SUCCESSFUL_EXECUTION_CODES = [:ok, :match].freeze
9
-
10
- attr_reader :time_ns, :time_ext_ns, :timeouts, :events
11
-
12
- def initialize(handle, telemetry:)
13
- @context = WAF::Context.new(handle)
14
- @telemetry = telemetry
15
-
16
- @time_ns = 0.0
17
- @time_ext_ns = 0.0
18
- @timeouts = 0
19
- @events = []
20
- @run_mutex = Mutex.new
21
-
22
- @libddwaf_debug_tag = "libddwaf:#{WAF::VERSION::STRING} method:ddwaf_run"
23
- end
24
-
25
- def run(persistent_data, ephemeral_data, timeout = WAF::LibDDWAF::DDWAF_RUN_TIMEOUT)
26
- @run_mutex.lock
27
-
28
- start_ns = Core::Utils::Time.get_time(:nanosecond)
29
-
30
- persistent_data.reject! do |_, v|
31
- next false if v.is_a?(TrueClass) || v.is_a?(FalseClass)
32
-
33
- v.nil? ? true : v.empty?
34
- end
35
-
36
- ephemeral_data.reject! do |_, v|
37
- next false if v.is_a?(TrueClass) || v.is_a?(FalseClass)
38
-
39
- v.nil? ? true : v.empty?
40
- end
41
-
42
- _code, result = try_run(persistent_data, ephemeral_data, timeout)
43
-
44
- stop_ns = Core::Utils::Time.get_time(:nanosecond)
45
-
46
- # these updates are not thread safe and should be protected
47
- @time_ns += result.total_runtime
48
- @time_ext_ns += (stop_ns - start_ns)
49
- @timeouts += 1 if result.timeout
50
-
51
- report_execution(result)
52
- result
53
- ensure
54
- @run_mutex.unlock
55
- end
56
-
57
- def extract_schema
58
- return unless extract_schema?
59
-
60
- input = {
61
- 'waf.context.processor' => {
62
- 'extract-schema' => true
63
- }
64
- }
65
-
66
- _code, result = try_run(input, {}, WAF::LibDDWAF::DDWAF_RUN_TIMEOUT)
67
-
68
- report_execution(result)
69
- result
70
- end
71
-
72
- def finalize
73
- @context.finalize
74
- end
75
-
76
- private
77
-
78
- def try_run(persistent_data, ephemeral_data, timeout)
79
- @context.run(persistent_data, ephemeral_data, timeout)
80
- rescue WAF::LibDDWAF::Error => e
81
- Datadog.logger.debug { "#{@libddwaf_debug_tag} execution error: #{e} backtrace: #{e.backtrace&.first(3)}" }
82
- @telemetry.report(e, description: 'libddwaf-rb internal low-level error')
83
-
84
- [:err_internal, WAF::Result.new(:err_internal, [], 0.0, false, [], [])]
85
- end
86
-
87
- def report_execution(result)
88
- Datadog.logger.debug { "#{@libddwaf_debug_tag} execution timed out: #{result.inspect}" } if result.timeout
89
-
90
- if LIBDDWAF_SUCCESSFUL_EXECUTION_CODES.include?(result.status)
91
- Datadog.logger.debug { "#{@libddwaf_debug_tag} execution result: #{result.inspect}" }
92
- else
93
- message = "#{@libddwaf_debug_tag} execution error: #{result.status.inspect}"
94
-
95
- Datadog.logger.debug { message }
96
- @telemetry.error(message)
97
- end
98
- end
99
-
100
- def extract_schema?
101
- Datadog.configuration.appsec.api_security.enabled &&
102
- Datadog.configuration.appsec.api_security.sample_rate.sample?
103
- end
104
- end
105
- end
106
- end
107
- end
@@ -1,68 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'engine'
4
-
5
- module Datadog
6
- module AppSec
7
- module Reactive
8
- # Reactive Engine nested operation tracking
9
- class Operation
10
- attr_reader :reactive,
11
- :parent,
12
- :name
13
-
14
- def initialize(name, parent = nil, reactive_engine = nil)
15
- Datadog.logger.debug { "operation: #{name} initialize" }
16
- @name = name
17
- @parent = parent
18
- @reactive = select_reactive_engine(reactive_engine, parent)
19
-
20
- # TODO: concurrent store
21
- # TODO: constant
22
- Thread.current[:datadog_security_active_operation] = self
23
-
24
- yield self if block_given?
25
- ensure
26
- finalize
27
- end
28
-
29
- # TODO: use structs instead of an arg splat
30
- def subscribe(*addresses, &block)
31
- reactive.subscribe(*addresses, &block)
32
- end
33
-
34
- def publish(address, data)
35
- reactive.publish(address, data)
36
- end
37
-
38
- def finalize
39
- Datadog.logger.debug { "operation: #{name} finalize" }
40
- Thread.current[:datadog_security_active_operation] = parent
41
- end
42
-
43
- private
44
-
45
- def select_reactive_engine(reactive, parent)
46
- return reactive if reactive
47
-
48
- return parent.reactive unless parent.nil?
49
-
50
- Reactive::Engine.new
51
- end
52
-
53
- class << self
54
- def active
55
- Thread.current[:datadog_security_active_operation]
56
- end
57
-
58
- private
59
-
60
- # For testing only.
61
- def reset!
62
- Thread.current[:datadog_security_active_operation] = nil
63
- end
64
- end
65
- end
66
- end
67
- end
68
- end
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Datadog
4
- module AppSec
5
- # Capture context essential to consistently call processor and report via traces
6
- class Scope
7
- attr_reader :trace, :service_entry_span, :processor_context
8
-
9
- def initialize(trace, service_entry_span, processor_context)
10
- @trace = trace
11
- @service_entry_span = service_entry_span
12
- @processor_context = processor_context
13
- end
14
-
15
- def finalize
16
- @processor_context.finalize
17
- end
18
-
19
- class << self
20
- def activate_scope(trace, service_entry_span, processor)
21
- raise ActiveScopeError, 'another scope is active, nested scopes are not supported' if active_scope
22
-
23
- context = processor.new_context
24
- self.active_scope = new(trace, service_entry_span, context)
25
- end
26
-
27
- def deactivate_scope
28
- raise InactiveScopeError, 'no scope is active, nested scopes are not supported' unless active_scope
29
-
30
- scope = active_scope
31
-
32
- reset_active_scope
33
-
34
- scope.finalize
35
- end
36
-
37
- def active_scope
38
- Thread.current[:datadog_appsec_active_scope]
39
- end
40
-
41
- private
42
-
43
- def active_scope=(scope)
44
- raise ArgumentError, 'not a Datadog::AppSec::Scope' unless scope.instance_of?(Scope)
45
-
46
- Thread.current[:datadog_appsec_active_scope] = scope
47
- end
48
-
49
- def reset_active_scope
50
- Thread.current[:datadog_appsec_active_scope] = nil
51
- end
52
- end
53
-
54
- class InactiveScopeError < StandardError; end
55
- class ActiveScopeError < StandardError; end
56
- end
57
- end
58
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative '../configuration/ext'
4
-
5
- module Datadog
6
- module Core
7
- module Crashtracking
8
- # This module provides a method to resolve the base URL of the agent
9
- module AgentBaseUrl
10
- def self.resolve(agent_settings)
11
- case agent_settings.adapter
12
- when Datadog::Core::Configuration::Ext::Agent::HTTP::ADAPTER
13
- "#{agent_settings.ssl ? 'https' : 'http'}://#{agent_settings.hostname}:#{agent_settings.port}/"
14
- when Datadog::Core::Configuration::Ext::Agent::UnixSocket::ADAPTER
15
- "unix://#{agent_settings.uds_path}"
16
- end
17
- end
18
- end
19
- end
20
- end
21
- end