ddtrace 1.11.1 → 1.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 +49 -1
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +6 -4
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +34 -16
- data/ext/ddtrace_profiling_native_extension/extconf.rb +17 -3
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +2 -2
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +38 -4
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +489 -133
- data/lib/datadog/appsec/assets/waf_rules/strict.json +2 -47
- data/lib/datadog/appsec/configuration/settings.rb +2 -10
- data/lib/datadog/appsec/configuration.rb +3 -9
- data/lib/datadog/appsec/contrib/rack/ext.rb +0 -1
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +12 -0
- data/lib/datadog/appsec/contrib/rack/gateway/response.rb +3 -3
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +9 -9
- data/lib/datadog/appsec/contrib/rack/integration.rb +0 -5
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +7 -1
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +33 -25
- data/lib/datadog/appsec/contrib/rails/ext.rb +0 -1
- data/lib/datadog/appsec/contrib/rails/framework.rb +1 -13
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -3
- data/lib/datadog/appsec/contrib/rails/integration.rb +0 -5
- data/lib/datadog/appsec/contrib/rails/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +0 -1
- data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -13
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -6
- data/lib/datadog/appsec/contrib/sinatra/integration.rb +0 -5
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +5 -4
- data/lib/datadog/appsec/event.rb +5 -5
- data/lib/datadog/appsec/ext.rb +1 -0
- data/lib/datadog/appsec/extensions.rb +2 -6
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -4
- data/lib/datadog/appsec/processor/rule_merger.rb +13 -7
- data/lib/datadog/appsec/processor.rb +0 -45
- data/lib/datadog/appsec/remote.rb +6 -0
- data/lib/datadog/appsec/scope.rb +61 -0
- data/lib/datadog/appsec.rb +6 -0
- data/lib/datadog/ci/ext/environment.rb +40 -4
- data/lib/datadog/core/configuration/settings.rb +66 -14
- data/lib/datadog/core/configuration.rb +5 -1
- data/lib/datadog/core/remote/client/capabilities.rb +1 -1
- data/lib/datadog/core/telemetry/collector.rb +2 -1
- data/lib/datadog/core/telemetry/v1/dependency.rb +2 -1
- data/lib/datadog/kit/appsec/events.rb +58 -13
- data/lib/datadog/kit/identity.rb +29 -10
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +2 -0
- data/lib/datadog/profiling/component.rb +54 -29
- data/lib/datadog/tracing/buffer.rb +0 -1
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +9 -1
- data/lib/datadog/tracing/contrib/aws/ext.rb +11 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +7 -0
- data/lib/datadog/tracing/contrib/aws/parsed_context.rb +4 -0
- data/lib/datadog/tracing/contrib/aws/service/base.rb +16 -0
- data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +19 -0
- data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +19 -0
- data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +29 -0
- data/lib/datadog/tracing/contrib/aws/service/s3.rb +19 -0
- data/lib/datadog/tracing/contrib/aws/service/sns.rb +27 -0
- data/lib/datadog/tracing/contrib/aws/service/sqs.rb +24 -0
- data/lib/datadog/tracing/contrib/aws/service/stepfunctions.rb +37 -0
- data/lib/datadog/tracing/contrib/aws/services.rb +10 -0
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -2
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +4 -2
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +5 -2
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +5 -2
- data/lib/datadog/tracing/contrib/patcher.rb +0 -1
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +5 -2
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/presto/instrumentation.rb +4 -2
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +10 -2
- data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +9 -1
- data/lib/datadog/tracing/contrib/racecar/event.rb +3 -1
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +3 -1
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/redis/tags.rb +4 -1
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +4 -1
- data/lib/datadog/tracing/contrib/roda/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/sequel/database.rb +4 -1
- data/lib/datadog/tracing/contrib/sequel/dataset.rb +4 -1
- data/lib/datadog/tracing/contrib/sequel/utils.rb +4 -1
- data/lib/datadog/tracing/contrib/status_code_matcher.rb +0 -1
- data/lib/datadog/tracing/correlation.rb +0 -1
- data/lib/datadog/tracing/distributed/headers/ext.rb +1 -1
- data/lib/datadog/tracing/event.rb +0 -2
- data/lib/datadog/tracing/pipeline.rb +0 -2
- data/lib/datadog/tracing/runtime/metrics.rb +0 -2
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +0 -1
- data/lib/datadog/tracing/sampling/rate_sampler.rb +0 -2
- data/lib/datadog/tracing/sampling/rule.rb +0 -2
- data/lib/datadog/tracing/sampling/rule_sampler.rb +0 -2
- data/lib/datadog/tracing/span_operation.rb +0 -1
- data/lib/datadog/tracing/sync_writer.rb +0 -2
- data/lib/datadog/tracing/trace_operation.rb +0 -1
- data/lib/datadog/tracing/tracer.rb +0 -1
- data/lib/datadog/tracing/workers/trace_writer.rb +0 -1
- data/lib/datadog/tracing/workers.rb +0 -2
- data/lib/datadog/tracing/writer.rb +0 -2
- data/lib/ddtrace/version.rb +2 -2
- metadata +18 -19
- data/lib/datadog/appsec/contrib/configuration/settings.rb +0 -20
- data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +0 -22
- data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +0 -22
- data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +0 -22
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 59174b63b257f636df60be99956c8e221fcf046ace610c57eb01192fac6560ad
|
|
4
|
+
data.tar.gz: 647e8de04a54a65b40ad7b20061a015f510966f7643c192df30f3710a8335386
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b677b76e9e3b00df5e9c5b33bfe8c6007cd867053366364769391bb1b41457e9e380c5869bb85cc97071969e4e6164fcbe89148aaac11828bdc9de7957cc5d21
|
|
7
|
+
data.tar.gz: 33d66238def0a52a491175d015bfe80e15b84e975abc974710d8b892fb76ffe4ff336a15f23341ecd94b5979d7015d75dc93587d7e227d0bd759c6fdb5c782c4
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,34 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [1.12.0] - 2023-06-02
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
* Profiling: Add support for profiling Ruby 3.3.0-preview1 ([#2860][])
|
|
9
|
+
* Appsec: Appsec support nested apps ([#2836][])
|
|
10
|
+
* Appsec: Appsec add support for custom rules ([#2856][])
|
|
11
|
+
* Appsec: Update appsec static rules to 1.7.0 version ([#2869][])
|
|
12
|
+
* Appsec: Tag AppSec on Rack top-level span ([#2858][])
|
|
13
|
+
* Profiling: Implement "no signals" workaround and enable CPU Profiling 2.0 for all customers ([#2873][])
|
|
14
|
+
* Ci: Update CI Visibility spec ([#2874][])
|
|
15
|
+
* Appsec: Added missing waf addresses to request operation ([#2883][])
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
* Tracing: Consistent APM Span tags for AWS SDK Requests ([#2730][])
|
|
20
|
+
* Tracing: Change default `service_name` values Part 2 ([#2765][])
|
|
21
|
+
* Profiling: Bump debase-ruby_core_source dependency to 3.2.1 ([#2875][])
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
* Telemetry: Disable for non-HTTP agent connection ([#2815][])
|
|
25
|
+
* Tracing: Fix circular requires ([#2826][])
|
|
26
|
+
* Tracing: Update comment about Datadog::Tracing::Distributed::Ext to correct modules ([#2840][])
|
|
27
|
+
* Appsec: Check if `:appsec` setting is present before accessing it in remote component ([#2854][])
|
|
28
|
+
* Telemetry: Do not send Dependency `hash` when `version` is present ([#2855][])
|
|
29
|
+
* Core: Fix symbol configuration for `env` and `service` ([#2864][])
|
|
30
|
+
* Tracing: Fix sql comment propagation `full` mode when tracing is disabled ([#2866][])
|
|
31
|
+
* Appsec: Use relative URI for server.request.uri.raw ([#2890][])
|
|
32
|
+
|
|
5
33
|
## [1.11.1] - 2023-05-03
|
|
6
34
|
|
|
7
35
|
### Fixed
|
|
@@ -2410,7 +2438,8 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
|
|
|
2410
2438
|
|
|
2411
2439
|
Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
2412
2440
|
|
|
2413
|
-
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.
|
|
2441
|
+
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.12.0...master
|
|
2442
|
+
[1.12.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.11.1...v1.12.0
|
|
2414
2443
|
[1.11.1]: https://github.com/DataDog/dd-trace-rb/compare/v1.10.1...v1.11.1
|
|
2415
2444
|
[1.11.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.10.1...v1.11.0
|
|
2416
2445
|
[1.11.0.beta1]: https://github.com/DataDog/dd-trace-rb/compare/v1.10.1...v1.11.0.beta1
|
|
@@ -3445,6 +3474,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
3445
3474
|
[#2720]: https://github.com/DataDog/dd-trace-rb/issues/2720
|
|
3446
3475
|
[#2726]: https://github.com/DataDog/dd-trace-rb/issues/2726
|
|
3447
3476
|
[#2727]: https://github.com/DataDog/dd-trace-rb/issues/2727
|
|
3477
|
+
[#2730]: https://github.com/DataDog/dd-trace-rb/issues/2730
|
|
3448
3478
|
[#2731]: https://github.com/DataDog/dd-trace-rb/issues/2731
|
|
3449
3479
|
[#2732]: https://github.com/DataDog/dd-trace-rb/issues/2732
|
|
3450
3480
|
[#2733]: https://github.com/DataDog/dd-trace-rb/issues/2733
|
|
@@ -3455,6 +3485,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
3455
3485
|
[#2757]: https://github.com/DataDog/dd-trace-rb/issues/2757
|
|
3456
3486
|
[#2760]: https://github.com/DataDog/dd-trace-rb/issues/2760
|
|
3457
3487
|
[#2762]: https://github.com/DataDog/dd-trace-rb/issues/2762
|
|
3488
|
+
[#2765]: https://github.com/DataDog/dd-trace-rb/issues/2765
|
|
3458
3489
|
[#2769]: https://github.com/DataDog/dd-trace-rb/issues/2769
|
|
3459
3490
|
[#2770]: https://github.com/DataDog/dd-trace-rb/issues/2770
|
|
3460
3491
|
[#2771]: https://github.com/DataDog/dd-trace-rb/issues/2771
|
|
@@ -3466,9 +3497,26 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
3466
3497
|
[#2805]: https://github.com/DataDog/dd-trace-rb/issues/2805
|
|
3467
3498
|
[#2806]: https://github.com/DataDog/dd-trace-rb/issues/2806
|
|
3468
3499
|
[#2810]: https://github.com/DataDog/dd-trace-rb/issues/2810
|
|
3500
|
+
[#2815]: https://github.com/DataDog/dd-trace-rb/issues/2815
|
|
3469
3501
|
[#2822]: https://github.com/DataDog/dd-trace-rb/issues/2822
|
|
3470
3502
|
[#2824]: https://github.com/DataDog/dd-trace-rb/issues/2824
|
|
3503
|
+
[#2826]: https://github.com/DataDog/dd-trace-rb/issues/2826
|
|
3471
3504
|
[#2829]: https://github.com/DataDog/dd-trace-rb/issues/2829
|
|
3505
|
+
[#2836]: https://github.com/DataDog/dd-trace-rb/issues/2836
|
|
3506
|
+
[#2840]: https://github.com/DataDog/dd-trace-rb/issues/2840
|
|
3507
|
+
[#2854]: https://github.com/DataDog/dd-trace-rb/issues/2854
|
|
3508
|
+
[#2855]: https://github.com/DataDog/dd-trace-rb/issues/2855
|
|
3509
|
+
[#2856]: https://github.com/DataDog/dd-trace-rb/issues/2856
|
|
3510
|
+
[#2858]: https://github.com/DataDog/dd-trace-rb/issues/2858
|
|
3511
|
+
[#2860]: https://github.com/DataDog/dd-trace-rb/issues/2860
|
|
3512
|
+
[#2864]: https://github.com/DataDog/dd-trace-rb/issues/2864
|
|
3513
|
+
[#2866]: https://github.com/DataDog/dd-trace-rb/issues/2866
|
|
3514
|
+
[#2869]: https://github.com/DataDog/dd-trace-rb/issues/2869
|
|
3515
|
+
[#2873]: https://github.com/DataDog/dd-trace-rb/issues/2873
|
|
3516
|
+
[#2874]: https://github.com/DataDog/dd-trace-rb/issues/2874
|
|
3517
|
+
[#2875]: https://github.com/DataDog/dd-trace-rb/issues/2875
|
|
3518
|
+
[#2883]: https://github.com/DataDog/dd-trace-rb/issues/2883
|
|
3519
|
+
[#2890]: https://github.com/DataDog/dd-trace-rb/issues/2890
|
|
3472
3520
|
[@AdrianLC]: https://github.com/AdrianLC
|
|
3473
3521
|
[@Azure7111]: https://github.com/Azure7111
|
|
3474
3522
|
[@BabyGroot]: https://github.com/BabyGroot
|
|
@@ -68,19 +68,19 @@ internal types, structures and functions).
|
|
|
68
68
|
|
|
69
69
|
Because these private header files are not included in regular Ruby installations, we have two different workarounds:
|
|
70
70
|
|
|
71
|
-
1. for Ruby versions
|
|
72
|
-
2. for Ruby versions < 2.6
|
|
71
|
+
1. for Ruby versions 2.6 to 3.2 we make use use the Ruby private MJIT header
|
|
72
|
+
2. for Ruby versions < 2.6 and > 3.2 we make use of the `debase-ruby_core_source` gem
|
|
73
73
|
|
|
74
74
|
Functions which make use of these headers are defined in the <private_vm_api_acccess.c> file.
|
|
75
75
|
|
|
76
|
-
There is currently no way for disabling usage of the private MJIT header for Ruby 2.6
|
|
76
|
+
There is currently no way for disabling usage of the private MJIT header for Ruby 2.6 to 3.2.
|
|
77
77
|
|
|
78
78
|
**Important Note**: Our medium/long-term plan is to stop relying on all private Ruby headers, and instead request and
|
|
79
79
|
contribute upstream changes so that they become official public VM APIs.
|
|
80
80
|
|
|
81
81
|
### Approach 1: Using the Ruby private MJIT header
|
|
82
82
|
|
|
83
|
-
Ruby versions
|
|
83
|
+
Ruby versions 2.6 to 3.2 shipped a JIT compiler called MJIT. This compiler does not directly generate machine code;
|
|
84
84
|
instead it generates C code and uses the system C compiler to turn it into machine code.
|
|
85
85
|
|
|
86
86
|
The generated C code `#include`s a private header -- which we reference as "the MJIT header" everywhere.
|
|
@@ -90,6 +90,8 @@ and of course the intention is that it is only used by the Ruby MJIT compiler.
|
|
|
90
90
|
This header is placed inside the `include/` directory in a Ruby installation, and is named for that specific Ruby
|
|
91
91
|
version. e.g. `rb_mjit_min_header-2.7.4.h`.
|
|
92
92
|
|
|
93
|
+
This header was removed in Ruby 3.3.
|
|
94
|
+
|
|
93
95
|
### Approach 2: Using the `debase-ruby_core_source` gem
|
|
94
96
|
|
|
95
97
|
The [`debase-ruby_core_source`](https://github.com/ruby-debug/debase-ruby_core_source) contains almost no code;
|
|
@@ -81,6 +81,7 @@ struct cpu_and_wall_time_worker_state {
|
|
|
81
81
|
|
|
82
82
|
bool gc_profiling_enabled;
|
|
83
83
|
bool allocation_counting_enabled;
|
|
84
|
+
bool no_signals_workaround_enabled;
|
|
84
85
|
bool dynamic_sampling_rate_enabled;
|
|
85
86
|
VALUE self_instance;
|
|
86
87
|
VALUE thread_context_collector_instance;
|
|
@@ -148,6 +149,7 @@ static VALUE _native_initialize(
|
|
|
148
149
|
VALUE gc_profiling_enabled,
|
|
149
150
|
VALUE idle_sampling_helper_instance,
|
|
150
151
|
VALUE allocation_counting_enabled,
|
|
152
|
+
VALUE no_signals_workaround_enabled,
|
|
151
153
|
VALUE dynamic_sampling_rate_enabled
|
|
152
154
|
);
|
|
153
155
|
static void cpu_and_wall_time_worker_typed_data_mark(void *state_ptr);
|
|
@@ -221,7 +223,7 @@ void collectors_cpu_and_wall_time_worker_init(VALUE profiling_module) {
|
|
|
221
223
|
// https://bugs.ruby-lang.org/issues/18007 for a discussion around this.
|
|
222
224
|
rb_define_alloc_func(collectors_cpu_and_wall_time_worker_class, _native_new);
|
|
223
225
|
|
|
224
|
-
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_initialize", _native_initialize,
|
|
226
|
+
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_initialize", _native_initialize, 7);
|
|
225
227
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_sampling_loop", _native_sampling_loop, 1);
|
|
226
228
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_stop", _native_stop, 2);
|
|
227
229
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_reset_after_fork", _native_reset_after_fork, 1);
|
|
@@ -257,6 +259,7 @@ static VALUE _native_new(VALUE klass) {
|
|
|
257
259
|
|
|
258
260
|
state->gc_profiling_enabled = false;
|
|
259
261
|
state->allocation_counting_enabled = false;
|
|
262
|
+
state->no_signals_workaround_enabled = false;
|
|
260
263
|
state->dynamic_sampling_rate_enabled = true;
|
|
261
264
|
state->thread_context_collector_instance = Qnil;
|
|
262
265
|
state->idle_sampling_helper_instance = Qnil;
|
|
@@ -283,10 +286,12 @@ static VALUE _native_initialize(
|
|
|
283
286
|
VALUE gc_profiling_enabled,
|
|
284
287
|
VALUE idle_sampling_helper_instance,
|
|
285
288
|
VALUE allocation_counting_enabled,
|
|
289
|
+
VALUE no_signals_workaround_enabled,
|
|
286
290
|
VALUE dynamic_sampling_rate_enabled
|
|
287
291
|
) {
|
|
288
292
|
ENFORCE_BOOLEAN(gc_profiling_enabled);
|
|
289
293
|
ENFORCE_BOOLEAN(allocation_counting_enabled);
|
|
294
|
+
ENFORCE_BOOLEAN(no_signals_workaround_enabled);
|
|
290
295
|
ENFORCE_BOOLEAN(dynamic_sampling_rate_enabled);
|
|
291
296
|
|
|
292
297
|
struct cpu_and_wall_time_worker_state *state;
|
|
@@ -294,6 +299,7 @@ static VALUE _native_initialize(
|
|
|
294
299
|
|
|
295
300
|
state->gc_profiling_enabled = (gc_profiling_enabled == Qtrue);
|
|
296
301
|
state->allocation_counting_enabled = (allocation_counting_enabled == Qtrue);
|
|
302
|
+
state->no_signals_workaround_enabled = (no_signals_workaround_enabled == Qtrue);
|
|
297
303
|
state->dynamic_sampling_rate_enabled = (dynamic_sampling_rate_enabled == Qtrue);
|
|
298
304
|
state->thread_context_collector_instance = enforce_thread_context_collector_instance(thread_context_collector_instance);
|
|
299
305
|
state->idle_sampling_helper_instance = idle_sampling_helper_instance;
|
|
@@ -439,7 +445,7 @@ static void handle_sampling_signal(DDTRACE_UNUSED int _signal, DDTRACE_UNUSED si
|
|
|
439
445
|
}
|
|
440
446
|
|
|
441
447
|
// We implicitly assume there can be no concurrent nor nested calls to handle_sampling_signal because
|
|
442
|
-
// a) we get triggered using SIGPROF, and the docs state second SIGPROF will not interrupt an existing one
|
|
448
|
+
// a) we get triggered using SIGPROF, and the docs state a second SIGPROF will not interrupt an existing one
|
|
443
449
|
// b) we validate we are in the thread that has the global VM lock; if a different thread gets a signal, it will return early
|
|
444
450
|
// because it will not have the global VM lock
|
|
445
451
|
|
|
@@ -476,22 +482,34 @@ static void *run_sampling_trigger_loop(void *state_ptr) {
|
|
|
476
482
|
while (atomic_load(&state->should_run)) {
|
|
477
483
|
state->stats.trigger_sample_attempts++;
|
|
478
484
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
//
|
|
482
|
-
//
|
|
483
|
-
//
|
|
484
|
-
pthread_kill(owner.owner, SIGPROF);
|
|
485
|
-
} else {
|
|
486
|
-
// If no thread owns the Global VM Lock, the application is probably idle at the moment. We still want to sample
|
|
487
|
-
// so we "ask a friend" (the IdleSamplingHelper component) to grab the GVL and simulate getting a SIGPROF.
|
|
485
|
+
if (state->no_signals_workaround_enabled) {
|
|
486
|
+
// In the no_signals_workaround_enabled mode, the profiler never sends SIGPROF signals.
|
|
487
|
+
//
|
|
488
|
+
// This is a fallback for a few incompatibilities and limitations -- see the code that decides when to enable
|
|
489
|
+
// `no_signals_workaround_enabled` in `Profiling::Component` for details.
|
|
488
490
|
//
|
|
489
|
-
//
|
|
490
|
-
//
|
|
491
|
-
// for an uncontrolled amount of time. (This can still happen to the IdleSamplingHelper, but the
|
|
492
|
-
// CpuAndWallTimeWorker will still be free to interrupt the Ruby VM and keep sampling for the entire blocking period).
|
|
491
|
+
// Thus, we instead pretty please ask Ruby to let us run. This means profiling data can be biased by when the Ruby
|
|
492
|
+
// scheduler chooses to schedule us.
|
|
493
493
|
state->stats.trigger_simulated_signal_delivery_attempts++;
|
|
494
|
-
|
|
494
|
+
grab_gvl_and_sample(); // Note: Can raise exceptions
|
|
495
|
+
} else {
|
|
496
|
+
current_gvl_owner owner = gvl_owner();
|
|
497
|
+
if (owner.valid) {
|
|
498
|
+
// Note that reading the GVL owner and sending them a signal is a race -- the Ruby VM keeps on executing while
|
|
499
|
+
// we're doing this, so we may still not signal the correct thread from time to time, but our signal handler
|
|
500
|
+
// includes a check to see if it got called in the right thread
|
|
501
|
+
pthread_kill(owner.owner, SIGPROF);
|
|
502
|
+
} else {
|
|
503
|
+
// If no thread owns the Global VM Lock, the application is probably idle at the moment. We still want to sample
|
|
504
|
+
// so we "ask a friend" (the IdleSamplingHelper component) to grab the GVL and simulate getting a SIGPROF.
|
|
505
|
+
//
|
|
506
|
+
// In a previous version of the code, we called `grab_gvl_and_sample` directly BUT this was problematic because
|
|
507
|
+
// Ruby may concurrently get busy and so the CpuAndWallTimeWorker would be blocked in line to acquire the GVL
|
|
508
|
+
// for an uncontrolled amount of time. (This can still happen to the IdleSamplingHelper, but the
|
|
509
|
+
// CpuAndWallTimeWorker will still be free to interrupt the Ruby VM and keep sampling for the entire blocking period).
|
|
510
|
+
state->stats.trigger_simulated_signal_delivery_attempts++;
|
|
511
|
+
idle_sampling_helper_request_action(state->idle_sampling_helper_instance, grab_gvl_and_sample);
|
|
512
|
+
}
|
|
495
513
|
}
|
|
496
514
|
|
|
497
515
|
sleep_for(minimum_time_between_signals);
|
|
@@ -81,7 +81,10 @@ end
|
|
|
81
81
|
|
|
82
82
|
# Because we can't control what compiler versions our customers use, shipping with -Werror by default is a no-go.
|
|
83
83
|
# But we can enable it in CI, so that we quickly spot any new warnings that just got introduced.
|
|
84
|
-
|
|
84
|
+
#
|
|
85
|
+
# @ivoanjo TODO: Ruby 3.3.0-preview1 was causing issues in CI because `have_header('vm_core.h')` below triggers warnings;
|
|
86
|
+
# I've chosen to disable `-Werror` for this Ruby version for now, and we can revisit this on a later 3.3 release.
|
|
87
|
+
add_compiler_flag '-Werror' if ENV['DDTRACE_CI'] == 'true' && !RUBY_DESCRIPTION.include?('3.3.0preview1')
|
|
85
88
|
|
|
86
89
|
# Older gcc releases may not default to C99 and we need to ask for this. This is also used:
|
|
87
90
|
# * by upstream Ruby -- search for gnu99 in the codebase
|
|
@@ -128,6 +131,12 @@ if RUBY_PLATFORM.include?('linux')
|
|
|
128
131
|
$defs << '-DHAVE_PTHREAD_GETCPUCLOCKID'
|
|
129
132
|
end
|
|
130
133
|
|
|
134
|
+
# On older Rubies, we did not need to include the ractor header (this was built into the MJIT header)
|
|
135
|
+
$defs << '-DNO_RACTOR_HEADER_INCLUDE' if RUBY_VERSION < '3.3'
|
|
136
|
+
|
|
137
|
+
# On older Rubies, some of the Ractor internal APIs were directly accessible
|
|
138
|
+
$defs << '-DUSE_RACTOR_INTERNAL_APIS_DIRECTLY' if RUBY_VERSION < '3.3'
|
|
139
|
+
|
|
131
140
|
# On older Rubies, there was no struct rb_native_thread. See private_vm_api_acccess.c for details.
|
|
132
141
|
$defs << '-DNO_RB_NATIVE_THREAD' if RUBY_VERSION < '3.2'
|
|
133
142
|
|
|
@@ -217,7 +226,8 @@ if Datadog::Profiling::NativeExtensionHelpers::CAN_USE_MJIT_HEADER
|
|
|
217
226
|
|
|
218
227
|
create_makefile EXTENSION_NAME
|
|
219
228
|
else
|
|
220
|
-
#
|
|
229
|
+
# The MJIT header was introduced on 2.6 and removed on 3.3; for other Rubies we rely on
|
|
230
|
+
# the debase-ruby_core_source gem to get access to private VM headers.
|
|
221
231
|
# This gem ships source code copies of these VM headers for the different Ruby VM versions;
|
|
222
232
|
# see https://github.com/ruby-debug/debase-ruby_core_source for details
|
|
223
233
|
|
|
@@ -228,7 +238,11 @@ else
|
|
|
228
238
|
|
|
229
239
|
Debase::RubyCoreSource
|
|
230
240
|
.create_makefile_with_core(
|
|
231
|
-
proc
|
|
241
|
+
proc do
|
|
242
|
+
have_header('vm_core.h') &&
|
|
243
|
+
have_header('iseq.h') &&
|
|
244
|
+
(RUBY_VERSION < '3.3' || have_header('ractor_core.h'))
|
|
245
|
+
end,
|
|
232
246
|
EXTENSION_NAME,
|
|
233
247
|
)
|
|
234
248
|
end
|
|
@@ -12,8 +12,8 @@ module Datadog
|
|
|
12
12
|
# Can be set to force rubygems to fail gem installation when profiling extension could not be built
|
|
13
13
|
ENV_FAIL_INSTALL_IF_MISSING_EXTENSION = 'DD_PROFILING_FAIL_INSTALL_IF_MISSING_EXTENSION'
|
|
14
14
|
|
|
15
|
-
#
|
|
16
|
-
CAN_USE_MJIT_HEADER = RUBY_VERSION
|
|
15
|
+
# The MJIT header was introduced on 2.6 and removed on 3.3; for other Rubies we rely on debase-ruby_core_source
|
|
16
|
+
CAN_USE_MJIT_HEADER = RUBY_VERSION.start_with?('2.6', '2.7', '3.0.', '3.1.', '3.2.')
|
|
17
17
|
|
|
18
18
|
LIBDATADOG_VERSION = '~> 2.0.0.1.0'
|
|
19
19
|
|
|
@@ -12,7 +12,8 @@
|
|
|
12
12
|
// Pick up internal structures from the private Ruby MJIT header file
|
|
13
13
|
#include RUBY_MJIT_HEADER
|
|
14
14
|
#else
|
|
15
|
-
//
|
|
15
|
+
// The MJIT header was introduced on 2.6 and removed on 3.3; for other Rubies we rely on
|
|
16
|
+
// the debase-ruby_core_source gem to get access to private VM headers.
|
|
16
17
|
|
|
17
18
|
// We can't do anything about warnings in VM headers, so we just use this technique to suppress them.
|
|
18
19
|
// See https://nelkinda.com/blog/suppress-warnings-in-gcc-and-clang/#d11e364 for details.
|
|
@@ -23,7 +24,20 @@
|
|
|
23
24
|
#pragma GCC diagnostic ignored "-Wexpansion-to-defined"
|
|
24
25
|
#include <vm_core.h>
|
|
25
26
|
#pragma GCC diagnostic pop
|
|
26
|
-
|
|
27
|
+
|
|
28
|
+
#pragma GCC diagnostic push
|
|
29
|
+
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
|
30
|
+
#include <iseq.h>
|
|
31
|
+
#pragma GCC diagnostic pop
|
|
32
|
+
|
|
33
|
+
#include <ruby.h>
|
|
34
|
+
|
|
35
|
+
#ifndef NO_RACTOR_HEADER_INCLUDE
|
|
36
|
+
#pragma GCC diagnostic push
|
|
37
|
+
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
|
38
|
+
#include <ractor_core.h>
|
|
39
|
+
#pragma GCC diagnostic pop
|
|
40
|
+
#endif
|
|
27
41
|
#endif
|
|
28
42
|
|
|
29
43
|
#define PRIVATE_VM_API_ACCESS_SKIP_RUBY_INCLUDES
|
|
@@ -712,8 +726,28 @@ check_method_entry(VALUE obj, int can_be_svar)
|
|
|
712
726
|
#ifndef NO_RACTORS
|
|
713
727
|
// This API and definition are exported as a public symbol by the VM BUT the function header is not defined in any public header, so we
|
|
714
728
|
// repeat it here to be able to use in our code.
|
|
715
|
-
|
|
716
|
-
|
|
729
|
+
#ifndef USE_RACTOR_INTERNAL_APIS_DIRECTLY
|
|
730
|
+
// Disable fast path for detecting multiple Ractors. Unfortunately this symbol is no longer visible on modern Ruby
|
|
731
|
+
// versions, so we need to do a bit more work.
|
|
732
|
+
struct rb_ractor_struct *ruby_single_main_ractor = NULL;
|
|
733
|
+
|
|
734
|
+
// Taken from upstream ractor.c at commit a1b01e7701f9fc370f8dff777aad6d39a2c5a3e3 (May 2023, Ruby 3.3.0-preview1)
|
|
735
|
+
// to allow us to ensure that we're always operating on the main ractor (if Ruby has ractors)
|
|
736
|
+
// Modifications:
|
|
737
|
+
// * None
|
|
738
|
+
bool rb_ractor_main_p_(void)
|
|
739
|
+
{
|
|
740
|
+
VM_ASSERT(rb_multi_ractor_p());
|
|
741
|
+
rb_execution_context_t *ec = GET_EC();
|
|
742
|
+
return rb_ec_ractor_ptr(ec) == rb_ec_vm_ptr(ec)->ractor.main_ractor;
|
|
743
|
+
}
|
|
744
|
+
#else
|
|
745
|
+
// Directly access Ruby internal fast path for detecting multiple Ractors.
|
|
746
|
+
extern struct rb_ractor_struct *ruby_single_main_ractor;
|
|
747
|
+
|
|
748
|
+
// Ruby 3.0 to 3.2 directly expose this symbol, we just need to tell the compiler it exists.
|
|
749
|
+
bool rb_ractor_main_p_(void);
|
|
750
|
+
#endif
|
|
717
751
|
|
|
718
752
|
// Taken from upstream ractor_core.h at commit d9cf0388599a3234b9f3c06ddd006cd59a58ab8b (November 2022, Ruby 3.2 trunk)
|
|
719
753
|
// to allow us to ensure that we're always operating on the main ractor (if Ruby has ractors)
|