datadog 2.10.0 → 2.12.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +56 -1
- data/ext/datadog_profiling_native_extension/collectors_stack.c +3 -3
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +44 -1
- data/ext/datadog_profiling_native_extension/extconf.rb +4 -0
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +2 -0
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +0 -8
- data/ext/datadog_profiling_native_extension/heap_recorder.c +1 -1
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +56 -0
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +7 -0
- data/ext/datadog_profiling_native_extension/profiling.c +7 -0
- data/ext/libdatadog_api/crashtracker.c +4 -4
- data/ext/libdatadog_extconf_helpers.rb +1 -1
- data/lib/datadog/appsec/configuration/settings.rb +64 -11
- data/lib/datadog/appsec/contrib/active_record/patcher.rb +0 -3
- data/lib/datadog/appsec/contrib/devise/configuration.rb +76 -0
- data/lib/datadog/appsec/contrib/devise/event.rb +4 -7
- data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +16 -21
- data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +8 -15
- data/lib/datadog/appsec/contrib/devise/patcher/rememberable_patch.rb +1 -1
- data/lib/datadog/appsec/contrib/devise/patcher.rb +0 -3
- data/lib/datadog/appsec/contrib/devise/tracking.rb +1 -1
- data/lib/datadog/appsec/contrib/excon/integration.rb +41 -0
- data/lib/datadog/appsec/contrib/excon/patcher.rb +28 -0
- data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +43 -0
- data/lib/datadog/appsec/contrib/faraday/connection_patch.rb +22 -0
- data/lib/datadog/appsec/contrib/faraday/integration.rb +42 -0
- data/lib/datadog/appsec/contrib/faraday/patcher.rb +53 -0
- data/lib/datadog/appsec/contrib/faraday/rack_builder_patch.rb +22 -0
- data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +42 -0
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +10 -12
- data/lib/datadog/appsec/contrib/graphql/patcher.rb +0 -3
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +65 -73
- data/lib/datadog/appsec/contrib/rack/patcher.rb +0 -3
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +20 -25
- data/lib/datadog/appsec/contrib/rails/patcher.rb +0 -3
- data/lib/datadog/appsec/contrib/rest_client/integration.rb +45 -0
- data/lib/datadog/appsec/contrib/rest_client/patcher.rb +28 -0
- data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +39 -0
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +38 -49
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +0 -3
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +19 -25
- data/lib/datadog/appsec/remote.rb +4 -0
- data/lib/datadog/appsec.rb +3 -0
- data/lib/datadog/core/configuration/components.rb +8 -2
- data/lib/datadog/core/configuration/ext.rb +1 -1
- data/lib/datadog/core/configuration/option_definition.rb +2 -0
- data/lib/datadog/core/configuration/settings.rb +22 -6
- data/lib/datadog/core/encoding.rb +16 -0
- data/lib/datadog/core/environment/agent_info.rb +77 -0
- data/lib/datadog/core/remote/component.rb +11 -9
- data/lib/datadog/core/remote/transport/http/api.rb +13 -18
- data/lib/datadog/core/remote/transport/http/config.rb +0 -18
- data/lib/datadog/core/remote/transport/http/negotiation.rb +1 -18
- data/lib/datadog/core/remote/transport/http.rb +7 -12
- data/lib/datadog/core/remote/transport/negotiation.rb +13 -1
- data/lib/datadog/core/remote/worker.rb +10 -7
- data/lib/datadog/core/telemetry/component.rb +5 -1
- data/lib/datadog/core/telemetry/event.rb +5 -0
- data/lib/datadog/core/telemetry/worker.rb +9 -5
- data/lib/datadog/core/transport/http/adapters/unix_socket.rb +1 -1
- data/lib/datadog/{tracing → core}/transport/http/api/instance.rb +1 -1
- data/lib/datadog/{tracing → core}/transport/http/api/spec.rb +1 -1
- data/lib/datadog/{tracing → core}/transport/http/builder.rb +37 -17
- data/lib/datadog/core/transport/response.rb +4 -0
- data/lib/datadog/di/code_tracker.rb +15 -8
- data/lib/datadog/di/component.rb +2 -3
- data/lib/datadog/di/configuration/settings.rb +14 -0
- data/lib/datadog/di/contrib.rb +2 -0
- data/lib/datadog/di/logger.rb +30 -0
- data/lib/datadog/di/probe.rb +3 -6
- data/lib/datadog/di/probe_manager.rb +5 -2
- data/lib/datadog/di/probe_notifier_worker.rb +35 -8
- data/lib/datadog/di/remote.rb +3 -3
- data/lib/datadog/di/transport/diagnostics.rb +61 -0
- data/lib/datadog/di/transport/http/api.rb +52 -0
- data/lib/datadog/di/transport/http/client.rb +46 -0
- data/lib/datadog/di/transport/http/diagnostics.rb +92 -0
- data/lib/datadog/di/transport/http/input.rb +94 -0
- data/lib/datadog/di/transport/http.rb +119 -0
- data/lib/datadog/di/transport/input.rb +61 -0
- data/lib/datadog/di/utils.rb +91 -0
- data/lib/datadog/di.rb +5 -1
- data/lib/datadog/profiling/component.rb +2 -8
- data/lib/datadog/profiling/load_native_extension.rb +1 -33
- data/lib/datadog/tracing/component.rb +1 -0
- data/lib/datadog/tracing/configuration/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/extensions.rb +14 -0
- data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +21 -0
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +11 -0
- data/lib/datadog/tracing/contrib/graphql/ext.rb +5 -0
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +102 -11
- data/lib/datadog/tracing/contrib/rack/header_collection.rb +11 -1
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +1 -1
- data/lib/datadog/tracing/contrib/span_attribute_schema.rb +6 -1
- data/lib/datadog/tracing/sync_writer.rb +5 -2
- data/lib/datadog/tracing/tracer.rb +10 -7
- data/lib/datadog/tracing/transport/http/api.rb +11 -2
- data/lib/datadog/tracing/transport/http/traces.rb +0 -3
- data/lib/datadog/tracing/transport/http.rb +12 -7
- data/lib/datadog/tracing/transport/serializable_trace.rb +8 -4
- data/lib/datadog/tracing/transport/traces.rb +25 -8
- data/lib/datadog/tracing/workers/trace_writer.rb +4 -1
- data/lib/datadog/tracing/workers.rb +5 -4
- data/lib/datadog/tracing/writer.rb +6 -2
- data/lib/datadog/version.rb +1 -1
- metadata +33 -29
- data/ext/datadog_profiling_loader/datadog_profiling_loader.c +0 -142
- data/ext/datadog_profiling_loader/extconf.rb +0 -60
- data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +0 -46
- data/lib/datadog/appsec/contrib/patcher.rb +0 -12
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +0 -69
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +0 -47
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +0 -53
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +0 -53
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +0 -48
- data/lib/datadog/appsec/monitor/reactive/set_user.rb +0 -45
- data/lib/datadog/appsec/reactive/address_hash.rb +0 -22
- data/lib/datadog/appsec/reactive/engine.rb +0 -47
- data/lib/datadog/appsec/reactive/subscriber.rb +0 -19
- data/lib/datadog/core/remote/transport/http/api/instance.rb +0 -39
- data/lib/datadog/core/remote/transport/http/api/spec.rb +0 -21
- data/lib/datadog/core/remote/transport/http/builder.rb +0 -219
- data/lib/datadog/di/transport.rb +0 -79
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.
|
4
|
+
version: 2.12.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: 2025-02-
|
11
|
+
date: 2025-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: msgpack
|
@@ -44,28 +44,28 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 1.18.0.0.
|
47
|
+
version: 1.18.0.0.1
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 1.18.0.0.
|
54
|
+
version: 1.18.0.0.1
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: libdatadog
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version:
|
61
|
+
version: 16.0.1.1.0
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version:
|
68
|
+
version: 16.0.1.1.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: logger
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -90,7 +90,6 @@ executables:
|
|
90
90
|
- ddprofrb
|
91
91
|
extensions:
|
92
92
|
- ext/datadog_profiling_native_extension/extconf.rb
|
93
|
-
- ext/datadog_profiling_loader/extconf.rb
|
94
93
|
- ext/libdatadog_api/extconf.rb
|
95
94
|
extra_rdoc_files: []
|
96
95
|
files:
|
@@ -102,8 +101,6 @@ files:
|
|
102
101
|
- NOTICE
|
103
102
|
- README.md
|
104
103
|
- bin/ddprofrb
|
105
|
-
- ext/datadog_profiling_loader/datadog_profiling_loader.c
|
106
|
-
- ext/datadog_profiling_loader/extconf.rb
|
107
104
|
- ext/datadog_profiling_native_extension/NativeExtensionDesign.md
|
108
105
|
- ext/datadog_profiling_native_extension/clock_id.h
|
109
106
|
- ext/datadog_profiling_native_extension/clock_id_from_pthread.c
|
@@ -173,6 +170,7 @@ files:
|
|
173
170
|
- lib/datadog/appsec/contrib/active_record/integration.rb
|
174
171
|
- lib/datadog/appsec/contrib/active_record/patcher.rb
|
175
172
|
- lib/datadog/appsec/contrib/auto_instrument.rb
|
173
|
+
- lib/datadog/appsec/contrib/devise/configuration.rb
|
176
174
|
- lib/datadog/appsec/contrib/devise/event.rb
|
177
175
|
- lib/datadog/appsec/contrib/devise/ext.rb
|
178
176
|
- lib/datadog/appsec/contrib/devise/integration.rb
|
@@ -182,23 +180,26 @@ files:
|
|
182
180
|
- lib/datadog/appsec/contrib/devise/patcher/rememberable_patch.rb
|
183
181
|
- lib/datadog/appsec/contrib/devise/resource.rb
|
184
182
|
- lib/datadog/appsec/contrib/devise/tracking.rb
|
183
|
+
- lib/datadog/appsec/contrib/excon/integration.rb
|
184
|
+
- lib/datadog/appsec/contrib/excon/patcher.rb
|
185
|
+
- lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb
|
186
|
+
- lib/datadog/appsec/contrib/faraday/connection_patch.rb
|
187
|
+
- lib/datadog/appsec/contrib/faraday/integration.rb
|
188
|
+
- lib/datadog/appsec/contrib/faraday/patcher.rb
|
189
|
+
- lib/datadog/appsec/contrib/faraday/rack_builder_patch.rb
|
190
|
+
- lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb
|
185
191
|
- lib/datadog/appsec/contrib/graphql/appsec_trace.rb
|
186
192
|
- lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb
|
187
193
|
- lib/datadog/appsec/contrib/graphql/gateway/watcher.rb
|
188
194
|
- lib/datadog/appsec/contrib/graphql/integration.rb
|
189
195
|
- lib/datadog/appsec/contrib/graphql/patcher.rb
|
190
|
-
- lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb
|
191
196
|
- lib/datadog/appsec/contrib/integration.rb
|
192
|
-
- lib/datadog/appsec/contrib/patcher.rb
|
193
197
|
- lib/datadog/appsec/contrib/rack/ext.rb
|
194
198
|
- lib/datadog/appsec/contrib/rack/gateway/request.rb
|
195
199
|
- lib/datadog/appsec/contrib/rack/gateway/response.rb
|
196
200
|
- lib/datadog/appsec/contrib/rack/gateway/watcher.rb
|
197
201
|
- lib/datadog/appsec/contrib/rack/integration.rb
|
198
202
|
- lib/datadog/appsec/contrib/rack/patcher.rb
|
199
|
-
- lib/datadog/appsec/contrib/rack/reactive/request.rb
|
200
|
-
- lib/datadog/appsec/contrib/rack/reactive/request_body.rb
|
201
|
-
- lib/datadog/appsec/contrib/rack/reactive/response.rb
|
202
203
|
- lib/datadog/appsec/contrib/rack/request_body_middleware.rb
|
203
204
|
- lib/datadog/appsec/contrib/rack/request_middleware.rb
|
204
205
|
- lib/datadog/appsec/contrib/rails/ext.rb
|
@@ -207,16 +208,17 @@ files:
|
|
207
208
|
- lib/datadog/appsec/contrib/rails/gateway/watcher.rb
|
208
209
|
- lib/datadog/appsec/contrib/rails/integration.rb
|
209
210
|
- lib/datadog/appsec/contrib/rails/patcher.rb
|
210
|
-
- lib/datadog/appsec/contrib/rails/reactive/action.rb
|
211
211
|
- lib/datadog/appsec/contrib/rails/request.rb
|
212
212
|
- lib/datadog/appsec/contrib/rails/request_middleware.rb
|
213
|
+
- lib/datadog/appsec/contrib/rest_client/integration.rb
|
214
|
+
- lib/datadog/appsec/contrib/rest_client/patcher.rb
|
215
|
+
- lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb
|
213
216
|
- lib/datadog/appsec/contrib/sinatra/framework.rb
|
214
217
|
- lib/datadog/appsec/contrib/sinatra/gateway/request.rb
|
215
218
|
- lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb
|
216
219
|
- lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb
|
217
220
|
- lib/datadog/appsec/contrib/sinatra/integration.rb
|
218
221
|
- lib/datadog/appsec/contrib/sinatra/patcher.rb
|
219
|
-
- lib/datadog/appsec/contrib/sinatra/reactive/routed.rb
|
220
222
|
- lib/datadog/appsec/contrib/sinatra/request_middleware.rb
|
221
223
|
- lib/datadog/appsec/event.rb
|
222
224
|
- lib/datadog/appsec/ext.rb
|
@@ -230,14 +232,10 @@ files:
|
|
230
232
|
- lib/datadog/appsec/metrics/telemetry.rb
|
231
233
|
- lib/datadog/appsec/monitor.rb
|
232
234
|
- lib/datadog/appsec/monitor/gateway/watcher.rb
|
233
|
-
- lib/datadog/appsec/monitor/reactive/set_user.rb
|
234
235
|
- lib/datadog/appsec/processor.rb
|
235
236
|
- lib/datadog/appsec/processor/rule_loader.rb
|
236
237
|
- lib/datadog/appsec/processor/rule_merger.rb
|
237
238
|
- lib/datadog/appsec/rate_limiter.rb
|
238
|
-
- lib/datadog/appsec/reactive/address_hash.rb
|
239
|
-
- lib/datadog/appsec/reactive/engine.rb
|
240
|
-
- lib/datadog/appsec/reactive/subscriber.rb
|
241
239
|
- lib/datadog/appsec/remote.rb
|
242
240
|
- lib/datadog/appsec/response.rb
|
243
241
|
- lib/datadog/appsec/sample_rate.rb
|
@@ -272,6 +270,7 @@ files:
|
|
272
270
|
- lib/datadog/core/diagnostics/environment_logger.rb
|
273
271
|
- lib/datadog/core/diagnostics/health.rb
|
274
272
|
- lib/datadog/core/encoding.rb
|
273
|
+
- lib/datadog/core/environment/agent_info.rb
|
275
274
|
- lib/datadog/core/environment/cgroup.rb
|
276
275
|
- lib/datadog/core/environment/class_count.rb
|
277
276
|
- lib/datadog/core/environment/container.rb
|
@@ -318,9 +317,6 @@ files:
|
|
318
317
|
- lib/datadog/core/remote/transport/config.rb
|
319
318
|
- lib/datadog/core/remote/transport/http.rb
|
320
319
|
- lib/datadog/core/remote/transport/http/api.rb
|
321
|
-
- lib/datadog/core/remote/transport/http/api/instance.rb
|
322
|
-
- lib/datadog/core/remote/transport/http/api/spec.rb
|
323
|
-
- lib/datadog/core/remote/transport/http/builder.rb
|
324
320
|
- lib/datadog/core/remote/transport/http/client.rb
|
325
321
|
- lib/datadog/core/remote/transport/http/config.rb
|
326
322
|
- lib/datadog/core/remote/transport/http/negotiation.rb
|
@@ -352,7 +348,10 @@ files:
|
|
352
348
|
- lib/datadog/core/transport/http/adapters/unix_socket.rb
|
353
349
|
- lib/datadog/core/transport/http/api/endpoint.rb
|
354
350
|
- lib/datadog/core/transport/http/api/fallbacks.rb
|
351
|
+
- lib/datadog/core/transport/http/api/instance.rb
|
355
352
|
- lib/datadog/core/transport/http/api/map.rb
|
353
|
+
- lib/datadog/core/transport/http/api/spec.rb
|
354
|
+
- lib/datadog/core/transport/http/builder.rb
|
356
355
|
- lib/datadog/core/transport/http/env.rb
|
357
356
|
- lib/datadog/core/transport/http/response.rb
|
358
357
|
- lib/datadog/core/transport/parcel.rb
|
@@ -397,6 +396,7 @@ files:
|
|
397
396
|
- lib/datadog/di/error.rb
|
398
397
|
- lib/datadog/di/extensions.rb
|
399
398
|
- lib/datadog/di/instrumenter.rb
|
399
|
+
- lib/datadog/di/logger.rb
|
400
400
|
- lib/datadog/di/preload.rb
|
401
401
|
- lib/datadog/di/probe.rb
|
402
402
|
- lib/datadog/di/probe_builder.rb
|
@@ -406,7 +406,13 @@ files:
|
|
406
406
|
- lib/datadog/di/redactor.rb
|
407
407
|
- lib/datadog/di/remote.rb
|
408
408
|
- lib/datadog/di/serializer.rb
|
409
|
-
- lib/datadog/di/transport.rb
|
409
|
+
- lib/datadog/di/transport/diagnostics.rb
|
410
|
+
- lib/datadog/di/transport/http.rb
|
411
|
+
- lib/datadog/di/transport/http/api.rb
|
412
|
+
- lib/datadog/di/transport/http/client.rb
|
413
|
+
- lib/datadog/di/transport/http/diagnostics.rb
|
414
|
+
- lib/datadog/di/transport/http/input.rb
|
415
|
+
- lib/datadog/di/transport/input.rb
|
410
416
|
- lib/datadog/di/utils.rb
|
411
417
|
- lib/datadog/kit.rb
|
412
418
|
- lib/datadog/kit/appsec/events.rb
|
@@ -613,6 +619,7 @@ files:
|
|
613
619
|
- lib/datadog/tracing/contrib/grape/instrumentation.rb
|
614
620
|
- lib/datadog/tracing/contrib/grape/integration.rb
|
615
621
|
- lib/datadog/tracing/contrib/grape/patcher.rb
|
622
|
+
- lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb
|
616
623
|
- lib/datadog/tracing/contrib/graphql/configuration/settings.rb
|
617
624
|
- lib/datadog/tracing/contrib/graphql/ext.rb
|
618
625
|
- lib/datadog/tracing/contrib/graphql/integration.rb
|
@@ -900,9 +907,6 @@ files:
|
|
900
907
|
- lib/datadog/tracing/tracer.rb
|
901
908
|
- lib/datadog/tracing/transport/http.rb
|
902
909
|
- lib/datadog/tracing/transport/http/api.rb
|
903
|
-
- lib/datadog/tracing/transport/http/api/instance.rb
|
904
|
-
- lib/datadog/tracing/transport/http/api/spec.rb
|
905
|
-
- lib/datadog/tracing/transport/http/builder.rb
|
906
910
|
- lib/datadog/tracing/transport/http/client.rb
|
907
911
|
- lib/datadog/tracing/transport/http/statistics.rb
|
908
912
|
- lib/datadog/tracing/transport/http/traces.rb
|
@@ -925,8 +929,8 @@ licenses:
|
|
925
929
|
- Apache-2.0
|
926
930
|
metadata:
|
927
931
|
allowed_push_host: https://rubygems.org
|
928
|
-
changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.
|
929
|
-
source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.
|
932
|
+
changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.12.0/CHANGELOG.md
|
933
|
+
source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.12.0
|
930
934
|
post_install_message:
|
931
935
|
rdoc_options: []
|
932
936
|
require_paths:
|
@@ -1,142 +0,0 @@
|
|
1
|
-
#include <stdbool.h>
|
2
|
-
#include <dlfcn.h>
|
3
|
-
#include <ruby.h>
|
4
|
-
|
5
|
-
// Why this exists:
|
6
|
-
//
|
7
|
-
// The Datadog::Profiling::Loader exists because when Ruby loads a native extension (using `require`), it uses
|
8
|
-
// `dlopen(..., RTLD_LAZY | RTLD_GLOBAL)` (https://github.com/ruby/ruby/blob/67950a4c0a884bdb78d9beb4405ebf7459229b21/dln.c#L362).
|
9
|
-
// This means that every symbol exposed directly or indirectly by that native extension becomes visible to every other
|
10
|
-
// extension in the Ruby process. This can cause issues, see https://github.com/rubyjs/mini_racer/pull/179.
|
11
|
-
//
|
12
|
-
// Instead of `RTLD_LAZY | RTLD_GLOBAL`, we want to call `dlopen` with `RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND` when
|
13
|
-
// loading the profiling native extension, to avoid leaking any unintended symbols (`RTLD_LOCAL`) and avoid picking
|
14
|
-
// up other's symbols (`RTLD_DEEPBIND`).
|
15
|
-
//
|
16
|
-
// But Ruby's extension loading mechanism is not configurable -- there's no way to tell it to use different flags when
|
17
|
-
// calling `dlopen`. To get around this, this file (datadog_profiling_loader.c) introduces another extension
|
18
|
-
// (profiling loader) which has only a single responsibility: mimic Ruby's extension loading mechanism, but when calling
|
19
|
-
// `dlopen` use a different set of flags.
|
20
|
-
// This idea was shamelessly stolen from @lloeki's work in https://github.com/rubyjs/mini_racer/pull/179, big thanks!
|
21
|
-
//
|
22
|
-
// Extra note: Currently (May 2022), that we know of, the profiling native extension only exposes one potentially
|
23
|
-
// problematic symbol: `rust_eh_personality` (coming from libdatadog).
|
24
|
-
// Future versions of Rust have been patched not to expose this
|
25
|
-
// (see https://github.com/rust-lang/rust/pull/95604#issuecomment-1108563434) so we may want to revisit the need
|
26
|
-
// for this loader in the future, and perhaps delete it if we no longer require its services :)
|
27
|
-
|
28
|
-
#ifndef RTLD_DEEPBIND
|
29
|
-
#define RTLD_DEEPBIND 0
|
30
|
-
#endif
|
31
|
-
|
32
|
-
// Used to mark function arguments that are deliberately left unused
|
33
|
-
#ifdef __GNUC__
|
34
|
-
#define DDTRACE_UNUSED __attribute__((unused))
|
35
|
-
#else
|
36
|
-
#define DDTRACE_UNUSED
|
37
|
-
#endif
|
38
|
-
|
39
|
-
static VALUE ok_symbol = Qnil; // :ok in Ruby
|
40
|
-
static VALUE error_symbol = Qnil; // :error in Ruby
|
41
|
-
|
42
|
-
static VALUE _native_load(DDTRACE_UNUSED VALUE self, VALUE ruby_path, VALUE ruby_init_name);
|
43
|
-
static bool failed_to_load(void *handle, VALUE *failure_details);
|
44
|
-
static bool incompatible_library(void *handle, VALUE *failure_details);
|
45
|
-
static bool failed_to_initialize(void *handle, char *init_name, VALUE *failure_details);
|
46
|
-
static void set_failure_from_dlerror(VALUE *failure_details);
|
47
|
-
static void unload_failed_library(void *handle);
|
48
|
-
|
49
|
-
#define DDTRACE_EXPORT __attribute__ ((visibility ("default")))
|
50
|
-
|
51
|
-
void DDTRACE_EXPORT Init_datadog_profiling_loader(void) {
|
52
|
-
VALUE datadog_module = rb_define_module("Datadog");
|
53
|
-
VALUE profiling_module = rb_define_module_under(datadog_module, "Profiling");
|
54
|
-
VALUE loader_module = rb_define_module_under(profiling_module, "Loader");
|
55
|
-
rb_define_singleton_method(loader_module, "_native_load", _native_load, 2);
|
56
|
-
|
57
|
-
ok_symbol = ID2SYM(rb_intern_const("ok"));
|
58
|
-
error_symbol = ID2SYM(rb_intern_const("error"));
|
59
|
-
}
|
60
|
-
|
61
|
-
static VALUE _native_load(DDTRACE_UNUSED VALUE self, VALUE ruby_path, VALUE ruby_init_name) {
|
62
|
-
Check_Type(ruby_path, T_STRING);
|
63
|
-
Check_Type(ruby_init_name, T_STRING);
|
64
|
-
|
65
|
-
char *path = StringValueCStr(ruby_path);
|
66
|
-
char *init_name = StringValueCStr(ruby_init_name);
|
67
|
-
|
68
|
-
int dlopen_flags = RTLD_LAZY | RTLD_LOCAL | RTLD_DEEPBIND;
|
69
|
-
|
70
|
-
#if defined(__has_feature)
|
71
|
-
#if __has_feature(address_sanitizer)
|
72
|
-
dlopen_flags &= ~RTLD_DEEPBIND; // Not supported by ASAN
|
73
|
-
#endif
|
74
|
-
#endif
|
75
|
-
|
76
|
-
void *handle = dlopen(path, dlopen_flags);
|
77
|
-
|
78
|
-
VALUE failure_details = Qnil;
|
79
|
-
|
80
|
-
if (
|
81
|
-
failed_to_load(handle, &failure_details) ||
|
82
|
-
incompatible_library(handle, &failure_details) ||
|
83
|
-
failed_to_initialize(handle, init_name, &failure_details)
|
84
|
-
) {
|
85
|
-
return rb_ary_new_from_args(2, error_symbol, failure_details);
|
86
|
-
}
|
87
|
-
|
88
|
-
return rb_ary_new_from_args(2, ok_symbol, Qnil);
|
89
|
-
}
|
90
|
-
|
91
|
-
static bool failed_to_load(void *handle, VALUE *failure_details) {
|
92
|
-
if (handle == NULL) {
|
93
|
-
set_failure_from_dlerror(failure_details);
|
94
|
-
return true;
|
95
|
-
} else {
|
96
|
-
return false;
|
97
|
-
}
|
98
|
-
}
|
99
|
-
|
100
|
-
static bool incompatible_library(void *handle, VALUE *failure_details) {
|
101
|
-
// The library being loaded may be linked to a different libruby than the current executing Ruby.
|
102
|
-
// We check if this is the case by checking if a well-known symbol resolves to a common address.
|
103
|
-
|
104
|
-
void *xmalloc_from_library = dlsym(handle, "ruby_xmalloc");
|
105
|
-
|
106
|
-
if (xmalloc_from_library == NULL) {
|
107
|
-
// This happens when ruby is built without a `libruby.so` by using `--disable-shared` at compilation time.
|
108
|
-
// In this situation, no conflict between libruby version is possible.
|
109
|
-
return false;
|
110
|
-
}
|
111
|
-
|
112
|
-
if (xmalloc_from_library != &ruby_xmalloc) {
|
113
|
-
*failure_details = rb_str_new_cstr("library was compiled and linked to a different Ruby version");
|
114
|
-
unload_failed_library(handle);
|
115
|
-
return true;
|
116
|
-
} else {
|
117
|
-
return false;
|
118
|
-
}
|
119
|
-
}
|
120
|
-
|
121
|
-
static bool failed_to_initialize(void *handle, char *init_name, VALUE *failure_details) {
|
122
|
-
void (*initialization_function)(void) = dlsym(handle, init_name);
|
123
|
-
|
124
|
-
if (initialization_function == NULL) {
|
125
|
-
set_failure_from_dlerror(failure_details);
|
126
|
-
unload_failed_library(handle);
|
127
|
-
return true;
|
128
|
-
} else {
|
129
|
-
(*initialization_function)();
|
130
|
-
return false;
|
131
|
-
}
|
132
|
-
}
|
133
|
-
|
134
|
-
static void set_failure_from_dlerror(VALUE *failure_details) {
|
135
|
-
char *failure = dlerror();
|
136
|
-
*failure_details = failure == NULL ? Qnil : rb_str_new_cstr(failure);
|
137
|
-
}
|
138
|
-
|
139
|
-
static void unload_failed_library(void *handle) {
|
140
|
-
// Note: According to the Ruby VM sources, this may fail with a segfault on really old versions of macOS (< 10.11)
|
141
|
-
dlclose(handle);
|
142
|
-
}
|
@@ -1,60 +0,0 @@
|
|
1
|
-
# rubocop:disable Style/StderrPuts
|
2
|
-
|
3
|
-
if RUBY_ENGINE != "ruby" || Gem.win_platform?
|
4
|
-
$stderr.puts(
|
5
|
-
"WARN: Skipping build of Datadog profiling loader. See Datadog profiling native extension note for details."
|
6
|
-
)
|
7
|
-
|
8
|
-
File.write("Makefile", "all install clean: # dummy makefile that does nothing")
|
9
|
-
exit
|
10
|
-
end
|
11
|
-
|
12
|
-
require "mkmf"
|
13
|
-
|
14
|
-
# Because we can't control what compiler versions our customers use, shipping with -Werror by default is a no-go.
|
15
|
-
# But we can enable it in CI, so that we quickly spot any new warnings that just got introduced.
|
16
|
-
append_cflags "-Werror" if ENV["DATADOG_GEM_CI"] == "true"
|
17
|
-
|
18
|
-
# Older gcc releases may not default to C99 and we need to ask for this. This is also used:
|
19
|
-
# * by upstream Ruby -- search for gnu99 in the codebase
|
20
|
-
# * by msgpack, another datadog gem dependency
|
21
|
-
# (https://github.com/msgpack/msgpack-ruby/blob/18ce08f6d612fe973843c366ac9a0b74c4e50599/ext/msgpack/extconf.rb#L8)
|
22
|
-
append_cflags "-std=gnu99"
|
23
|
-
|
24
|
-
# Gets really noisy when we include the MJIT header, let's omit it (TODO: Use #pragma GCC diagnostic instead?)
|
25
|
-
append_cflags "-Wno-unused-function"
|
26
|
-
|
27
|
-
# Allow defining variables at any point in a function
|
28
|
-
append_cflags "-Wno-declaration-after-statement"
|
29
|
-
|
30
|
-
# If we forget to include a Ruby header, the function call may still appear to work, but then
|
31
|
-
# cause a segfault later. Let's ensure that never happens.
|
32
|
-
append_cflags "-Werror-implicit-function-declaration"
|
33
|
-
|
34
|
-
# Warn on unused parameters to functions. Use `DDTRACE_UNUSED` to mark things as known-to-not-be-used.
|
35
|
-
append_cflags "-Wunused-parameter"
|
36
|
-
|
37
|
-
# The native extension is not intended to expose any symbols/functions for other native libraries to use;
|
38
|
-
# the sole exception being `Init_datadog_profiling_loader` which needs to be visible for Ruby to call it when
|
39
|
-
# it `dlopen`s the library.
|
40
|
-
#
|
41
|
-
# By setting this compiler flag, we tell it to assume that everything is private unless explicitly stated.
|
42
|
-
# For more details see https://gcc.gnu.org/wiki/Visibility
|
43
|
-
append_cflags "-fvisibility=hidden"
|
44
|
-
|
45
|
-
# Avoid legacy C definitions
|
46
|
-
append_cflags "-Wold-style-definition"
|
47
|
-
|
48
|
-
# Enable all other compiler warnings
|
49
|
-
append_cflags "-Wall"
|
50
|
-
append_cflags "-Wextra"
|
51
|
-
|
52
|
-
# Tag the native extension library with the Ruby version and Ruby platform.
|
53
|
-
# This makes it easier for development (avoids "oops I forgot to rebuild when I switched my Ruby") and ensures that
|
54
|
-
# the wrong library is never loaded.
|
55
|
-
# When requiring, we need to use the exact same string, including the version and the platform.
|
56
|
-
EXTENSION_NAME = "datadog_profiling_loader.#{RUBY_VERSION}_#{RUBY_PLATFORM}".freeze
|
57
|
-
|
58
|
-
create_makefile(EXTENSION_NAME)
|
59
|
-
|
60
|
-
# rubocop:enable Style/StderrPuts
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Datadog
|
4
|
-
module AppSec
|
5
|
-
module Contrib
|
6
|
-
module GraphQL
|
7
|
-
module Reactive
|
8
|
-
# Dispatch data from a GraphQL resolve query to the WAF context
|
9
|
-
module Multiplex
|
10
|
-
ADDRESSES = [
|
11
|
-
'graphql.server.all_resolvers'
|
12
|
-
].freeze
|
13
|
-
private_constant :ADDRESSES
|
14
|
-
|
15
|
-
def self.publish(engine, gateway_multiplex)
|
16
|
-
catch(:block) do
|
17
|
-
engine.publish('graphql.server.all_resolvers', gateway_multiplex.arguments)
|
18
|
-
|
19
|
-
nil
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
def self.subscribe(engine, context)
|
24
|
-
engine.subscribe(*ADDRESSES) do |*values|
|
25
|
-
Datadog.logger.debug { "reacted to #{ADDRESSES.inspect}: #{values.inspect}" }
|
26
|
-
arguments = values[0]
|
27
|
-
|
28
|
-
persistent_data = {
|
29
|
-
'graphql.server.all_resolvers' => arguments
|
30
|
-
}
|
31
|
-
|
32
|
-
waf_timeout = Datadog.configuration.appsec.waf_timeout
|
33
|
-
result = context.run_waf(persistent_data, {}, waf_timeout)
|
34
|
-
|
35
|
-
next unless result.match?
|
36
|
-
|
37
|
-
yield result
|
38
|
-
throw(:block, true) unless result.actions.empty?
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Datadog
|
4
|
-
module AppSec
|
5
|
-
module Contrib
|
6
|
-
module Rack
|
7
|
-
module Reactive
|
8
|
-
# Dispatch data from a Rack request to the WAF context
|
9
|
-
module Request
|
10
|
-
ADDRESSES = [
|
11
|
-
'request.headers',
|
12
|
-
'request.uri.raw',
|
13
|
-
'request.query',
|
14
|
-
'request.cookies',
|
15
|
-
'request.client_ip',
|
16
|
-
'server.request.method'
|
17
|
-
].freeze
|
18
|
-
private_constant :ADDRESSES
|
19
|
-
|
20
|
-
def self.publish(engine, gateway_request)
|
21
|
-
catch(:block) do
|
22
|
-
engine.publish('request.query', gateway_request.query)
|
23
|
-
engine.publish('request.headers', gateway_request.headers)
|
24
|
-
engine.publish('request.uri.raw', gateway_request.fullpath)
|
25
|
-
engine.publish('request.cookies', gateway_request.cookies)
|
26
|
-
engine.publish('request.client_ip', gateway_request.client_ip)
|
27
|
-
engine.publish('server.request.method', gateway_request.method)
|
28
|
-
|
29
|
-
nil
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.subscribe(engine, context)
|
34
|
-
engine.subscribe(*ADDRESSES) do |*values|
|
35
|
-
Datadog.logger.debug { "reacted to #{ADDRESSES.inspect}: #{values.inspect}" }
|
36
|
-
|
37
|
-
headers = values[0]
|
38
|
-
headers_no_cookies = headers.dup.tap { |h| h.delete('cookie') }
|
39
|
-
uri_raw = values[1]
|
40
|
-
query = values[2]
|
41
|
-
cookies = values[3]
|
42
|
-
client_ip = values[4]
|
43
|
-
request_method = values[5]
|
44
|
-
|
45
|
-
persistent_data = {
|
46
|
-
'server.request.cookies' => cookies,
|
47
|
-
'server.request.query' => query,
|
48
|
-
'server.request.uri.raw' => uri_raw,
|
49
|
-
'server.request.headers' => headers,
|
50
|
-
'server.request.headers.no_cookies' => headers_no_cookies,
|
51
|
-
'http.client_ip' => client_ip,
|
52
|
-
'server.request.method' => request_method,
|
53
|
-
}
|
54
|
-
|
55
|
-
waf_timeout = Datadog.configuration.appsec.waf_timeout
|
56
|
-
result = context.run_waf(persistent_data, {}, waf_timeout)
|
57
|
-
|
58
|
-
next unless result.match?
|
59
|
-
|
60
|
-
yield result
|
61
|
-
throw(:block, true) unless result.actions.empty?
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Datadog
|
4
|
-
module AppSec
|
5
|
-
module Contrib
|
6
|
-
module Rack
|
7
|
-
module Reactive
|
8
|
-
# Dispatch data from a Rack request to the WAF context
|
9
|
-
module RequestBody
|
10
|
-
ADDRESSES = [
|
11
|
-
'request.body',
|
12
|
-
].freeze
|
13
|
-
private_constant :ADDRESSES
|
14
|
-
|
15
|
-
def self.publish(engine, gateway_request)
|
16
|
-
catch(:block) do
|
17
|
-
# params have been parsed from the request body
|
18
|
-
engine.publish('request.body', gateway_request.form_hash)
|
19
|
-
|
20
|
-
nil
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def self.subscribe(engine, context)
|
25
|
-
engine.subscribe(*ADDRESSES) do |*values|
|
26
|
-
Datadog.logger.debug { "reacted to #{ADDRESSES.inspect}: #{values.inspect}" }
|
27
|
-
body = values[0]
|
28
|
-
|
29
|
-
persistent_data = {
|
30
|
-
'server.request.body' => body,
|
31
|
-
}
|
32
|
-
|
33
|
-
waf_timeout = Datadog.configuration.appsec.waf_timeout
|
34
|
-
result = context.run_waf(persistent_data, {}, waf_timeout)
|
35
|
-
|
36
|
-
next unless result.match?
|
37
|
-
|
38
|
-
yield result
|
39
|
-
throw(:block, true) unless result.actions.empty?
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
@@ -1,53 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Datadog
|
4
|
-
module AppSec
|
5
|
-
module Contrib
|
6
|
-
module Rack
|
7
|
-
module Reactive
|
8
|
-
# Dispatch data from a Rack response to the WAF context
|
9
|
-
module Response
|
10
|
-
ADDRESSES = [
|
11
|
-
'response.status',
|
12
|
-
'response.headers',
|
13
|
-
].freeze
|
14
|
-
private_constant :ADDRESSES
|
15
|
-
|
16
|
-
def self.publish(engine, gateway_response)
|
17
|
-
catch(:block) do
|
18
|
-
engine.publish('response.status', gateway_response.status)
|
19
|
-
engine.publish('response.headers', gateway_response.headers)
|
20
|
-
|
21
|
-
nil
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.subscribe(engine, context)
|
26
|
-
engine.subscribe(*ADDRESSES) do |*values|
|
27
|
-
Datadog.logger.debug { "reacted to #{ADDRESSES.inspect}: #{values.inspect}" }
|
28
|
-
|
29
|
-
response_status = values[0]
|
30
|
-
response_headers = values[1]
|
31
|
-
response_headers_no_cookies = response_headers.dup.tap { |h| h.delete('set-cookie') }
|
32
|
-
|
33
|
-
persistent_data = {
|
34
|
-
'server.response.status' => response_status.to_s,
|
35
|
-
'server.response.headers' => response_headers,
|
36
|
-
'server.response.headers.no_cookies' => response_headers_no_cookies,
|
37
|
-
}
|
38
|
-
|
39
|
-
waf_timeout = Datadog.configuration.appsec.waf_timeout
|
40
|
-
result = context.run_waf(persistent_data, {}, waf_timeout)
|
41
|
-
|
42
|
-
next unless result.match?
|
43
|
-
|
44
|
-
yield result
|
45
|
-
throw(:block, true) unless result.actions.empty?
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|