datadog 2.1.0 → 2.2.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 +53 -2
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +19 -1
- data/ext/datadog_profiling_native_extension/collectors_stack.c +41 -0
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +1 -1
- data/ext/datadog_profiling_native_extension/crashtracker.c +1 -1
- data/ext/datadog_profiling_native_extension/extconf.rb +6 -4
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +47 -1
- data/ext/datadog_profiling_native_extension/setup_signal_handler.c +1 -1
- data/ext/datadog_profiling_native_extension/stack_recorder.c +13 -6
- data/ext/datadog_profiling_native_extension/stack_recorder.h +1 -0
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +1 -1
- data/lib/datadog/appsec/extensions.rb +1 -0
- data/lib/datadog/core/configuration/components.rb +6 -3
- data/lib/datadog/core/configuration/settings.rb +39 -0
- data/lib/datadog/core/configuration.rb +3 -17
- data/lib/datadog/core/deprecations.rb +58 -0
- data/lib/datadog/core/environment/yjit.rb +5 -0
- data/lib/datadog/core/runtime/ext.rb +1 -0
- data/lib/datadog/core/runtime/metrics.rb +6 -0
- data/lib/datadog/core/telemetry/component.rb +107 -0
- data/lib/datadog/core/telemetry/event.rb +100 -25
- data/lib/datadog/core/telemetry/ext.rb +2 -0
- data/lib/datadog/core/telemetry/http/adapters/net.rb +1 -1
- data/lib/datadog/core/telemetry/metric.rb +167 -0
- data/lib/datadog/core/telemetry/metrics_collection.rb +81 -0
- data/lib/datadog/core/telemetry/metrics_manager.rb +81 -0
- data/lib/datadog/core/telemetry/request.rb +1 -1
- data/lib/datadog/core/telemetry/worker.rb +173 -0
- data/lib/datadog/core/utils/only_once_successful.rb +76 -0
- data/lib/datadog/core.rb +2 -19
- data/lib/datadog/opentelemetry/sdk/propagator.rb +5 -10
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +5 -2
- data/lib/datadog/profiling/collectors/code_provenance.rb +18 -5
- data/lib/datadog/profiling/component.rb +18 -1
- data/lib/datadog/profiling/ext/dir_monkey_patches.rb +410 -0
- data/lib/datadog/profiling.rb +1 -0
- data/lib/datadog/tracing/contrib/action_cable/event.rb +1 -1
- data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +1 -1
- data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +1 -1
- data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +1 -1
- data/lib/datadog/tracing/contrib/action_mailer/event.rb +4 -6
- data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +9 -4
- data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +3 -2
- data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +1 -5
- data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/discard.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/perform.rb +1 -1
- data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +1 -1
- data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/cache/event.rb +32 -0
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +156 -0
- data/lib/datadog/tracing/contrib/active_support/cache/events.rb +34 -0
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +45 -41
- data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +17 -40
- data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +4 -1
- data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +29 -6
- data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +16 -4
- data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +33 -29
- data/lib/datadog/tracing/contrib/analytics.rb +5 -0
- data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +5 -0
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +8 -2
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +166 -0
- data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +25 -0
- data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/consumer_group_event.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/event.rb +1 -1
- data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +3 -3
- data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +3 -3
- data/lib/datadog/tracing/contrib/racecar/event.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/ext.rb +9 -0
- data/lib/datadog/tracing/contrib/rails/patcher.rb +7 -0
- data/lib/datadog/tracing/contrib/rails/runner.rb +95 -0
- data/lib/datadog/tracing/distributed/b3_multi.rb +1 -1
- data/lib/datadog/tracing/distributed/b3_single.rb +3 -1
- data/lib/datadog/tracing/distributed/datadog.rb +2 -2
- data/lib/datadog/tracing/distributed/propagation.rb +9 -2
- data/lib/datadog/tracing/distributed/trace_context.rb +3 -2
- data/lib/datadog/tracing/span_operation.rb +3 -2
- data/lib/datadog/tracing/trace_operation.rb +7 -3
- data/lib/datadog/tracing/trace_segment.rb +4 -1
- data/lib/datadog/tracing/tracer.rb +9 -2
- data/lib/datadog/tracing.rb +5 -1
- data/lib/datadog/version.rb +2 -2
- metadata +22 -9
- data/lib/datadog/core/telemetry/client.rb +0 -95
- data/lib/datadog/core/telemetry/heartbeat.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 895fe8f9fdd8391d5c6c86e8d39d0a8e241c85bbce42b35c9744e1f94095853f
|
4
|
+
data.tar.gz: d5a6e88ec35816de59a5d080f66896a4c85656216d2853b46bb1268dfa64df35
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fef3c78c7835c47507a1f09d87c2ee84ddcc97303f9b9d7c6b4d601381ac62a47133f3450ddbc888cf54c56353ef4417ff337009a1e60d2ae239fb19093d721b
|
7
|
+
data.tar.gz: 061154162ab97a6e1cdc87f53c18d98fd0eea75b6cb7e71fd1e4e5c4a536ff7722c4e1202258760113ce5a7f0ce3838622e700858103fa97dddc33d0322275cc
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,36 @@
|
|
2
2
|
|
3
3
|
## [Unreleased]
|
4
4
|
|
5
|
+
## [2.2.0] - 2024-07-11
|
6
|
+
|
7
|
+
### Added
|
8
|
+
|
9
|
+
* Tracing: Add `Rails` Runner instrumentation ([#2509][])
|
10
|
+
* Tracing: Introduce a new, reworked `GraphQL` tracer to comply with span attributes specification ([#3672][])
|
11
|
+
* Tracing: Enhance `ActiveSupport::Cache` instrumentation with `ActiveSupport::Notifications` subscription ([#3772][])
|
12
|
+
* Profiling: Track unscaled allocation counts in allocation profiler ([#3770][])
|
13
|
+
|
14
|
+
### Changed
|
15
|
+
|
16
|
+
* Core: Send Telemetry events in batches ([#3749][])
|
17
|
+
* Tracing: Populate spans from `ActiveSupport::Notifications` as early as possible ([#3725][])
|
18
|
+
* Profiling: Upgrade to `libdatadog` 10 ([#3753][])
|
19
|
+
* Profiling: Optimize `CodeProvenance#record_loaded_files` to avoid allocations ([#3757][])
|
20
|
+
|
21
|
+
### Fixed
|
22
|
+
|
23
|
+
* Core: Fix Telemetry events blocking main thread ([#3718][])
|
24
|
+
* Core: Fix deadlock from Telemetry threads ([#3743][])
|
25
|
+
* Tracing: Fix empty log correlation when tracing is disabled ([#3731][])
|
26
|
+
* Tracing: Fix HTTP propagation when missing parent span id ([#3730][])
|
27
|
+
* Tracing: Ensure `_dd.p.tid` tag with fixed size ([#3729][])
|
28
|
+
* OTel: Fix ids encoding/decoding for propagation ([#3709][])
|
29
|
+
* Profiling: Workaround Ruby `Dir` returning incorrect results ([#3720][])
|
30
|
+
* Profiling: Fix `Phusion Passenger` detection when missing from `Gemfile`/`gems.rb` ([#3750][])
|
31
|
+
* Profiling: Fix `rpath` for linking to libdatadog when loading extension ([#3706][])
|
32
|
+
* Profiling: Fix incorrect code provenance due to broken JSON monkey patch ([#3695][])
|
33
|
+
* Profiling: Fix aggregation of actionview template classes ([#3759][], [#3774][])
|
34
|
+
|
5
35
|
## [2.1.0] - 2024-06-10
|
6
36
|
|
7
37
|
### Added
|
@@ -2904,7 +2934,8 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
|
|
2904
2934
|
Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
2905
2935
|
|
2906
2936
|
|
2907
|
-
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v2.
|
2937
|
+
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v2.2.0...master
|
2938
|
+
[2.2.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.1.0...v2.2.0
|
2908
2939
|
[2.1.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.0.0...v2.1.0
|
2909
2940
|
[2.0.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.0.0.rc1...v2.0.0
|
2910
2941
|
[2.0.0.rc1]: https://github.com/DataDog/dd-trace-rb/compare/v2.0.0.beta2...v2.0.0.rc1
|
@@ -3901,6 +3932,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
3901
3932
|
[#2497]: https://github.com/DataDog/dd-trace-rb/issues/2497
|
3902
3933
|
[#2501]: https://github.com/DataDog/dd-trace-rb/issues/2501
|
3903
3934
|
[#2504]: https://github.com/DataDog/dd-trace-rb/issues/2504
|
3935
|
+
[#2509]: https://github.com/DataDog/dd-trace-rb/issues/2509
|
3904
3936
|
[#2512]: https://github.com/DataDog/dd-trace-rb/issues/2512
|
3905
3937
|
[#2513]: https://github.com/DataDog/dd-trace-rb/issues/2513
|
3906
3938
|
[#2522]: https://github.com/DataDog/dd-trace-rb/issues/2522
|
@@ -4283,6 +4315,25 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
4283
4315
|
[#3651]: https://github.com/DataDog/dd-trace-rb/issues/3651
|
4284
4316
|
[#3657]: https://github.com/DataDog/dd-trace-rb/issues/3657
|
4285
4317
|
[#3664]: https://github.com/DataDog/dd-trace-rb/issues/3664
|
4318
|
+
[#3672]: https://github.com/DataDog/dd-trace-rb/issues/3672
|
4319
|
+
[#3695]: https://github.com/DataDog/dd-trace-rb/issues/3695
|
4320
|
+
[#3706]: https://github.com/DataDog/dd-trace-rb/issues/3706
|
4321
|
+
[#3709]: https://github.com/DataDog/dd-trace-rb/issues/3709
|
4322
|
+
[#3718]: https://github.com/DataDog/dd-trace-rb/issues/3718
|
4323
|
+
[#3720]: https://github.com/DataDog/dd-trace-rb/issues/3720
|
4324
|
+
[#3725]: https://github.com/DataDog/dd-trace-rb/issues/3725
|
4325
|
+
[#3729]: https://github.com/DataDog/dd-trace-rb/issues/3729
|
4326
|
+
[#3730]: https://github.com/DataDog/dd-trace-rb/issues/3730
|
4327
|
+
[#3731]: https://github.com/DataDog/dd-trace-rb/issues/3731
|
4328
|
+
[#3743]: https://github.com/DataDog/dd-trace-rb/issues/3743
|
4329
|
+
[#3749]: https://github.com/DataDog/dd-trace-rb/issues/3749
|
4330
|
+
[#3750]: https://github.com/DataDog/dd-trace-rb/issues/3750
|
4331
|
+
[#3753]: https://github.com/DataDog/dd-trace-rb/issues/3753
|
4332
|
+
[#3757]: https://github.com/DataDog/dd-trace-rb/issues/3757
|
4333
|
+
[#3759]: https://github.com/DataDog/dd-trace-rb/issues/3759
|
4334
|
+
[#3770]: https://github.com/DataDog/dd-trace-rb/issues/3770
|
4335
|
+
[#3772]: https://github.com/DataDog/dd-trace-rb/issues/3772
|
4336
|
+
[#3774]: https://github.com/DataDog/dd-trace-rb/issues/3774
|
4286
4337
|
[@AdrianLC]: https://github.com/AdrianLC
|
4287
4338
|
[@Azure7111]: https://github.com/Azure7111
|
4288
4339
|
[@BabyGroot]: https://github.com/BabyGroot
|
@@ -4434,4 +4485,4 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
4434
4485
|
[@y-yagi]: https://github.com/y-yagi
|
4435
4486
|
[@yujideveloper]: https://github.com/yujideveloper
|
4436
4487
|
[@yukimurasawa]: https://github.com/yukimurasawa
|
4437
|
-
[@zachmccormick]: https://github.com/zachmccormick
|
4488
|
+
[@zachmccormick]: https://github.com/zachmccormick
|
@@ -222,6 +222,8 @@ static VALUE _native_with_blocked_sigprof(DDTRACE_UNUSED VALUE self);
|
|
222
222
|
static VALUE rescued_sample_allocation(VALUE tracepoint_data);
|
223
223
|
static void delayed_error(struct cpu_and_wall_time_worker_state *state, const char *error);
|
224
224
|
static VALUE _native_delayed_error(DDTRACE_UNUSED VALUE self, VALUE instance, VALUE error_msg);
|
225
|
+
static VALUE _native_hold_signals(DDTRACE_UNUSED VALUE self);
|
226
|
+
static VALUE _native_resume_signals(DDTRACE_UNUSED VALUE self);
|
225
227
|
|
226
228
|
// Note on sampler global state safety:
|
227
229
|
//
|
@@ -285,7 +287,9 @@ void collectors_cpu_and_wall_time_worker_init(VALUE profiling_module) {
|
|
285
287
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_allocation_count", _native_allocation_count, 0);
|
286
288
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_is_running?", _native_is_running, 1);
|
287
289
|
rb_define_singleton_method(testing_module, "_native_current_sigprof_signal_handler", _native_current_sigprof_signal_handler, 0);
|
288
|
-
|
290
|
+
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_hold_signals", _native_hold_signals, 0);
|
291
|
+
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_resume_signals", _native_resume_signals, 0);
|
292
|
+
// TODO: Remove `_native_is_running` from `testing_module` (should be in class) once `prof-correctness` has been updated to not need it
|
289
293
|
rb_define_singleton_method(testing_module, "_native_is_running?", _native_is_running, 1);
|
290
294
|
rb_define_singleton_method(testing_module, "_native_install_testing_signal_handler", _native_install_testing_signal_handler, 0);
|
291
295
|
rb_define_singleton_method(testing_module, "_native_remove_testing_signal_handler", _native_remove_testing_signal_handler, 0);
|
@@ -1159,3 +1163,17 @@ static VALUE _native_delayed_error(DDTRACE_UNUSED VALUE self, VALUE instance, VA
|
|
1159
1163
|
|
1160
1164
|
return Qnil;
|
1161
1165
|
}
|
1166
|
+
|
1167
|
+
// Masks SIGPROF interruptions for the current thread. Please don't use this -- you may end up with incomplete
|
1168
|
+
// profiling data.
|
1169
|
+
static VALUE _native_hold_signals(DDTRACE_UNUSED VALUE self) {
|
1170
|
+
block_sigprof_signal_handler_from_running_in_current_thread();
|
1171
|
+
return Qtrue;
|
1172
|
+
}
|
1173
|
+
|
1174
|
+
// Unmasks SIGPROF interruptions for the current thread. If there's a pending sample, it'll be triggered inside this
|
1175
|
+
// method.
|
1176
|
+
static VALUE _native_resume_signals(DDTRACE_UNUSED VALUE self) {
|
1177
|
+
unblock_sigprof_signal_handler_from_running_in_current_thread();
|
1178
|
+
return Qtrue;
|
1179
|
+
}
|
@@ -34,6 +34,7 @@ static VALUE _native_sample(
|
|
34
34
|
);
|
35
35
|
static void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer* buffer, char *frames_omitted_message, int frames_omitted_message_size);
|
36
36
|
static void record_placeholder_stack_in_native_code(sampling_buffer* buffer, VALUE recorder_instance, sample_values values, sample_labels labels);
|
37
|
+
static void maybe_trim_template_random_ids(ddog_CharSlice *name_slice, ddog_CharSlice *filename_slice);
|
37
38
|
|
38
39
|
void collectors_stack_init(VALUE profiling_module) {
|
39
40
|
VALUE collectors_module = rb_define_module_under(profiling_module, "Collectors");
|
@@ -69,6 +70,7 @@ static VALUE _native_sample(
|
|
69
70
|
.cpu_or_wall_samples = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("cpu-samples"), zero)),
|
70
71
|
.wall_time_ns = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("wall-time"), zero)),
|
71
72
|
.alloc_samples = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("alloc-samples"), zero)),
|
73
|
+
.alloc_samples_unscaled = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("alloc-samples-unscaled"), zero)),
|
72
74
|
.timeline_wall_time_ns = NUM2UINT(rb_hash_lookup2(metric_values_hash, rb_str_new_cstr("timeline"), zero)),
|
73
75
|
};
|
74
76
|
|
@@ -199,6 +201,8 @@ void sample_thread(
|
|
199
201
|
ddog_CharSlice name_slice = char_slice_from_ruby_string(name);
|
200
202
|
ddog_CharSlice filename_slice = char_slice_from_ruby_string(filename);
|
201
203
|
|
204
|
+
maybe_trim_template_random_ids(&name_slice, &filename_slice);
|
205
|
+
|
202
206
|
bool top_of_the_stack = i == 0;
|
203
207
|
|
204
208
|
// When there's only wall-time in a sample, this means that the thread was not active in the sampled period.
|
@@ -268,6 +272,43 @@ void sample_thread(
|
|
268
272
|
);
|
269
273
|
}
|
270
274
|
|
275
|
+
// Rails's ActionView likes to dynamically generate method names with suffixed hashes/ids, resulting in methods with
|
276
|
+
// names such as:
|
277
|
+
// * "_app_views_layouts_explore_html_haml__2304485752546535910_211320" (__number_number suffix -- two underscores)
|
278
|
+
// * "_app_views_articles_index_html_erb___2022809201779434309_12900" (___number_number suffix -- three underscores)
|
279
|
+
// This makes these stacks not aggregate well, as well as being not-very-useful data.
|
280
|
+
// (Reference:
|
281
|
+
// https://github.com/rails/rails/blob/4fa56814f18fd3da49c83931fa773caa727d8096/actionview/lib/action_view/template.rb#L389
|
282
|
+
// The two vs three underscores happen when @identifier.hash is negative in that method: the "-" gets replaced with
|
283
|
+
// the extra "_".)
|
284
|
+
//
|
285
|
+
// This method trims these suffixes, so that we keep less data + the names correctly aggregate together.
|
286
|
+
static void maybe_trim_template_random_ids(ddog_CharSlice *name_slice, ddog_CharSlice *filename_slice) {
|
287
|
+
// Check filename doesn't end with ".rb"; templates are usually along the lines of .html.erb/.html.haml/...
|
288
|
+
if (filename_slice->len < 3 || memcmp(filename_slice->ptr + filename_slice->len - 3, ".rb", 3) == 0) return;
|
289
|
+
|
290
|
+
int pos = name_slice->len - 1;
|
291
|
+
|
292
|
+
// Let's match on something__number_number:
|
293
|
+
// Find start of id suffix from the end...
|
294
|
+
if (name_slice->ptr[pos] < '0' || name_slice->ptr[pos] > '9') return;
|
295
|
+
|
296
|
+
// ...now match a bunch of numbers and interspersed underscores
|
297
|
+
for (int underscores = 0; pos >= 0 && underscores < 2; pos--) {
|
298
|
+
if (name_slice->ptr[pos] == '_') underscores++;
|
299
|
+
else if (name_slice->ptr[pos] < '0' || name_slice->ptr[pos] > '9') return;
|
300
|
+
}
|
301
|
+
|
302
|
+
// Make sure there's something left before the underscores (hence the <= instead of <) + match the last underscore
|
303
|
+
if (pos <= 0 || name_slice->ptr[pos] != '_') return;
|
304
|
+
|
305
|
+
// Does it have the optional third underscore? If so, remove it as well
|
306
|
+
if (pos > 1 && name_slice->ptr[pos-1] == '_') pos--;
|
307
|
+
|
308
|
+
// If we got here, we matched on our pattern. Let's slice the length of the string to exclude it.
|
309
|
+
name_slice->len = pos;
|
310
|
+
}
|
311
|
+
|
271
312
|
static void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer* buffer, char *frames_omitted_message, int frames_omitted_message_size) {
|
272
313
|
ptrdiff_t frames_omitted = stack_depth_for(thread) - buffer->max_frames;
|
273
314
|
|
@@ -1290,7 +1290,7 @@ void thread_context_collector_sample_allocation(VALUE self_instance, unsigned in
|
|
1290
1290
|
/* thread: */ current_thread,
|
1291
1291
|
/* stack_from_thread: */ current_thread,
|
1292
1292
|
get_or_create_context_for(current_thread, state),
|
1293
|
-
(sample_values) {.alloc_samples = sample_weight},
|
1293
|
+
(sample_values) {.alloc_samples = sample_weight, .alloc_samples_unscaled = 1},
|
1294
1294
|
INVALID_TIME, // For now we're not collecting timestamps for allocation events, as per profiling team internal discussions
|
1295
1295
|
&ruby_vm_type,
|
1296
1296
|
optional_class_name
|
@@ -57,7 +57,7 @@ static VALUE _native_start_or_update_on_fork(int argc, VALUE *argv, DDTRACE_UNUS
|
|
57
57
|
// "Process.kill('SEGV', Process.pid)" gets run.
|
58
58
|
.create_alt_stack = false,
|
59
59
|
.endpoint = endpoint,
|
60
|
-
.resolve_frames =
|
60
|
+
.resolve_frames = DDOG_PROF_STACKTRACE_COLLECTION_ENABLED_WITH_SYMBOLS_IN_RECEIVER,
|
61
61
|
.timeout_secs = FIX2INT(upload_timeout_seconds),
|
62
62
|
};
|
63
63
|
|
@@ -211,12 +211,14 @@ unless have_type('atomic_int', ['stdatomic.h'])
|
|
211
211
|
skip_building_extension!(Datadog::Profiling::NativeExtensionHelpers::Supported::COMPILER_ATOMIC_MISSING)
|
212
212
|
end
|
213
213
|
|
214
|
-
# See comments on the helper
|
214
|
+
# See comments on the helper methods being used for why we need to additionally set this.
|
215
215
|
# The extremely excessive escaping around ORIGIN below seems to be correct and was determined after a lot of
|
216
216
|
# experimentation. We need to get these special characters across a lot of tools untouched...
|
217
|
-
|
218
|
-
|
219
|
-
|
217
|
+
extra_relative_rpaths = [
|
218
|
+
Datadog::Profiling::NativeExtensionHelpers.libdatadog_folder_relative_to_native_lib_folder,
|
219
|
+
*Datadog::Profiling::NativeExtensionHelpers.libdatadog_folder_relative_to_ruby_extensions_folders,
|
220
|
+
]
|
221
|
+
extra_relative_rpaths.each { |folder| $LDFLAGS += " -Wl,-rpath,$$$\\\\{ORIGIN\\}/#{folder.to_str}" }
|
220
222
|
Logging.message("[datadog] After pkg-config $LDFLAGS were set to: #{$LDFLAGS.inspect}\n")
|
221
223
|
|
222
224
|
# Tag the native extension library with the Ruby version and Ruby platform.
|
@@ -15,7 +15,7 @@ module Datadog
|
|
15
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
16
|
CAN_USE_MJIT_HEADER = RUBY_VERSION.start_with?('2.6', '2.7', '3.0.', '3.1.', '3.2.')
|
17
17
|
|
18
|
-
LIBDATADOG_VERSION = '~>
|
18
|
+
LIBDATADOG_VERSION = '~> 10.0.0.1.0'
|
19
19
|
|
20
20
|
def self.fail_install_if_missing_extension?
|
21
21
|
ENV[ENV_FAIL_INSTALL_IF_MISSING_EXTENSION].to_s.strip.downcase == 'true'
|
@@ -67,6 +67,52 @@ module Datadog
|
|
67
67
|
Pathname.new(libdatadog_lib_folder).relative_path_from(Pathname.new(profiling_native_lib_folder)).to_s
|
68
68
|
end
|
69
69
|
|
70
|
+
# In https://github.com/DataDog/dd-trace-rb/pull/3582 we got a report of a customer for which the native extension
|
71
|
+
# only got installed into the extensions folder.
|
72
|
+
#
|
73
|
+
# But then this fix was not enough to fully get them moving because then they started to see the issue from
|
74
|
+
# https://github.com/DataDog/dd-trace-rb/issues/2067 / https://github.com/DataDog/dd-trace-rb/pull/2125 :
|
75
|
+
#
|
76
|
+
# > Profiling was requested but is not supported, profiling disabled: There was an error loading the profiling
|
77
|
+
# > native extension due to 'RuntimeError Failure to load datadog_profiling_native_extension.3.2.2_x86_64-linux
|
78
|
+
# > due to libdatadog_profiling.so: cannot open shared object file: No such file or directory
|
79
|
+
#
|
80
|
+
# The problem is that when loading the native extension from the extensions directory, the relative rpath we add
|
81
|
+
# with the #libdatadog_folder_relative_to_native_lib_folder helper above is not correct, we need to add a relative
|
82
|
+
# rpath to the extensions directory.
|
83
|
+
#
|
84
|
+
# So how do we find the full path where the native extension is placed?
|
85
|
+
# * From https://github.com/ruby/ruby/blob/83f02d42e0a3c39661dc99c049ab9a70ff227d5b/lib/bundler/runtime.rb#L166
|
86
|
+
# `extension_dirs = Dir["#{Gem.dir}/extensions/*/*/*"] + Dir["#{Gem.dir}/bundler/gems/extensions/*/*/*"]`
|
87
|
+
# we get that's in one of two fixed subdirectories of `Gem.dir`
|
88
|
+
# * From https://github.com/ruby/ruby/blob/83f02d42e0a3c39661dc99c049ab9a70ff227d5b/lib/rubygems/basic_specification.rb#L111-L115
|
89
|
+
# we get the structure of the subdirectory (platform/extension_api_version/gem_and_version)
|
90
|
+
#
|
91
|
+
# Thus, `Gem.dir` of `/var/app/current/vendor/bundle/ruby/3.2.0` becomes (for instance)
|
92
|
+
# `/var/app/current/vendor/bundle/ruby/3.2.0/extensions/x86_64-linux/3.2.0/datadog-2.0.0/` or
|
93
|
+
# `/var/app/current/vendor/bundle/ruby/3.2.0/bundler/gems/extensions/x86_64-linux/3.2.0/datadog-2.0.0/`
|
94
|
+
#
|
95
|
+
# We then compute the relative path between these folders and the libdatadog folder, and use that as a relative path.
|
96
|
+
def self.libdatadog_folder_relative_to_ruby_extensions_folders(
|
97
|
+
gem_dir: Gem.dir,
|
98
|
+
libdatadog_pkgconfig_folder: Libdatadog.pkgconfig_folder
|
99
|
+
)
|
100
|
+
return unless libdatadog_pkgconfig_folder
|
101
|
+
|
102
|
+
# For the purposes of calculating a folder relative to the other, we don't actually NEED to fill in the
|
103
|
+
# platform, extension_api_version and gem version. We're basically just after how many folders it is deep from
|
104
|
+
# the Gem.dir.
|
105
|
+
expected_ruby_extensions_folders = [
|
106
|
+
"#{gem_dir}/extensions/platform/extension_api_version/datadog_version/",
|
107
|
+
"#{gem_dir}/bundler/gems/extensions/platform/extension_api_version/datadog_version/",
|
108
|
+
]
|
109
|
+
libdatadog_lib_folder = "#{libdatadog_pkgconfig_folder}/../"
|
110
|
+
|
111
|
+
expected_ruby_extensions_folders.map do |folder|
|
112
|
+
Pathname.new(libdatadog_lib_folder).relative_path_from(Pathname.new(folder)).to_s
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
70
116
|
# Used to check if profiler is supported, including user-visible clear messages explaining why their
|
71
117
|
# system may not be supported.
|
72
118
|
module Supported
|
@@ -91,7 +91,7 @@ void remove_sigprof_signal_handler(void) {
|
|
91
91
|
if (sigaction(SIGPROF, &signal_handler_config, NULL) != 0) rb_sys_fail("Failure while removing the signal handler");
|
92
92
|
}
|
93
93
|
|
94
|
-
static void toggle_sigprof_signal_handler_for_current_thread(int action) {
|
94
|
+
static inline void toggle_sigprof_signal_handler_for_current_thread(int action) {
|
95
95
|
sigset_t signals_to_toggle;
|
96
96
|
sigemptyset(&signals_to_toggle);
|
97
97
|
sigaddset(&signals_to_toggle, SIGPROF);
|
@@ -151,21 +151,23 @@ static VALUE error_symbol = Qnil; // :error in Ruby
|
|
151
151
|
#define WALL_TIME_VALUE_ID 2
|
152
152
|
#define ALLOC_SAMPLES_VALUE {.type_ = VALUE_STRING("alloc-samples"), .unit = VALUE_STRING("count")}
|
153
153
|
#define ALLOC_SAMPLES_VALUE_ID 3
|
154
|
+
#define ALLOC_SAMPLES_UNSCALED_VALUE {.type_ = VALUE_STRING("alloc-samples-unscaled"), .unit = VALUE_STRING("count")}
|
155
|
+
#define ALLOC_SAMPLES_UNSCALED_VALUE_ID 4
|
154
156
|
#define HEAP_SAMPLES_VALUE {.type_ = VALUE_STRING("heap-live-samples"), .unit = VALUE_STRING("count")}
|
155
|
-
#define HEAP_SAMPLES_VALUE_ID
|
157
|
+
#define HEAP_SAMPLES_VALUE_ID 5
|
156
158
|
#define HEAP_SIZE_VALUE {.type_ = VALUE_STRING("heap-live-size"), .unit = VALUE_STRING("bytes")}
|
157
|
-
#define HEAP_SIZE_VALUE_ID
|
159
|
+
#define HEAP_SIZE_VALUE_ID 6
|
158
160
|
#define TIMELINE_VALUE {.type_ = VALUE_STRING("timeline"), .unit = VALUE_STRING("nanoseconds")}
|
159
|
-
#define TIMELINE_VALUE_ID
|
161
|
+
#define TIMELINE_VALUE_ID 7
|
160
162
|
|
161
163
|
static const ddog_prof_ValueType all_value_types[] =
|
162
|
-
{CPU_TIME_VALUE, CPU_SAMPLES_VALUE, WALL_TIME_VALUE, ALLOC_SAMPLES_VALUE, HEAP_SAMPLES_VALUE, HEAP_SIZE_VALUE, TIMELINE_VALUE};
|
164
|
+
{CPU_TIME_VALUE, CPU_SAMPLES_VALUE, WALL_TIME_VALUE, ALLOC_SAMPLES_VALUE, ALLOC_SAMPLES_UNSCALED_VALUE, HEAP_SAMPLES_VALUE, HEAP_SIZE_VALUE, TIMELINE_VALUE};
|
163
165
|
|
164
166
|
// This array MUST be kept in sync with all_value_types above and is intended to act as a "hashmap" between VALUE_ID and the position it
|
165
167
|
// occupies on the all_value_types array.
|
166
168
|
// E.g. all_value_types_positions[CPU_TIME_VALUE_ID] => 0, means that CPU_TIME_VALUE was declared at position 0 of all_value_types.
|
167
169
|
static const uint8_t all_value_types_positions[] =
|
168
|
-
{CPU_TIME_VALUE_ID, CPU_SAMPLES_VALUE_ID, WALL_TIME_VALUE_ID, ALLOC_SAMPLES_VALUE_ID, HEAP_SAMPLES_VALUE_ID, HEAP_SIZE_VALUE_ID, TIMELINE_VALUE_ID};
|
170
|
+
{CPU_TIME_VALUE_ID, CPU_SAMPLES_VALUE_ID, WALL_TIME_VALUE_ID, ALLOC_SAMPLES_VALUE_ID, ALLOC_SAMPLES_UNSCALED_VALUE_ID, HEAP_SAMPLES_VALUE_ID, HEAP_SIZE_VALUE_ID, TIMELINE_VALUE_ID};
|
169
171
|
|
170
172
|
#define ALL_VALUE_TYPES_COUNT (sizeof(all_value_types) / sizeof(ddog_prof_ValueType))
|
171
173
|
|
@@ -429,7 +431,7 @@ static VALUE _native_initialize(
|
|
429
431
|
|
430
432
|
uint8_t requested_values_count = ALL_VALUE_TYPES_COUNT -
|
431
433
|
(cpu_time_enabled == Qtrue ? 0 : 1) -
|
432
|
-
(alloc_samples_enabled == Qtrue? 0 :
|
434
|
+
(alloc_samples_enabled == Qtrue? 0 : 2) -
|
433
435
|
(heap_samples_enabled == Qtrue ? 0 : 1) -
|
434
436
|
(heap_size_enabled == Qtrue ? 0 : 1) -
|
435
437
|
(timeline_enabled == Qtrue ? 0 : 1);
|
@@ -464,8 +466,12 @@ static VALUE _native_initialize(
|
|
464
466
|
if (alloc_samples_enabled == Qtrue) {
|
465
467
|
enabled_value_types[next_enabled_pos] = (ddog_prof_ValueType) ALLOC_SAMPLES_VALUE;
|
466
468
|
state->position_for[ALLOC_SAMPLES_VALUE_ID] = next_enabled_pos++;
|
469
|
+
|
470
|
+
enabled_value_types[next_enabled_pos] = (ddog_prof_ValueType) ALLOC_SAMPLES_UNSCALED_VALUE;
|
471
|
+
state->position_for[ALLOC_SAMPLES_UNSCALED_VALUE_ID] = next_enabled_pos++;
|
467
472
|
} else {
|
468
473
|
state->position_for[ALLOC_SAMPLES_VALUE_ID] = next_disabled_pos++;
|
474
|
+
state->position_for[ALLOC_SAMPLES_UNSCALED_VALUE_ID] = next_disabled_pos++;
|
469
475
|
}
|
470
476
|
|
471
477
|
if (heap_samples_enabled == Qtrue) {
|
@@ -603,6 +609,7 @@ void record_sample(VALUE recorder_instance, ddog_prof_Slice_Location locations,
|
|
603
609
|
metric_values[position_for[CPU_SAMPLES_VALUE_ID]] = values.cpu_or_wall_samples;
|
604
610
|
metric_values[position_for[WALL_TIME_VALUE_ID]] = values.wall_time_ns;
|
605
611
|
metric_values[position_for[ALLOC_SAMPLES_VALUE_ID]] = values.alloc_samples;
|
612
|
+
metric_values[position_for[ALLOC_SAMPLES_UNSCALED_VALUE_ID]] = values.alloc_samples_unscaled;
|
606
613
|
metric_values[position_for[TIMELINE_VALUE_ID]] = values.timeline_wall_time_ns;
|
607
614
|
|
608
615
|
if (values.alloc_samples != 0) {
|
@@ -6,7 +6,7 @@ require_relative '../diagnostics/environment_logger'
|
|
6
6
|
require_relative '../diagnostics/health'
|
7
7
|
require_relative '../logger'
|
8
8
|
require_relative '../runtime/metrics'
|
9
|
-
require_relative '../telemetry/
|
9
|
+
require_relative '../telemetry/component'
|
10
10
|
require_relative '../workers/runtime_metrics'
|
11
11
|
|
12
12
|
require_relative '../remote/component'
|
@@ -62,9 +62,11 @@ module Datadog
|
|
62
62
|
logger.debug { "Telemetry disabled. Agent network adapter not supported: #{agent_settings.adapter}" }
|
63
63
|
end
|
64
64
|
|
65
|
-
Telemetry::
|
65
|
+
Telemetry::Component.new(
|
66
66
|
enabled: enabled,
|
67
|
+
metrics_enabled: enabled && settings.telemetry.metrics_enabled,
|
67
68
|
heartbeat_interval_seconds: settings.telemetry.heartbeat_interval_seconds,
|
69
|
+
metrics_aggregation_interval_seconds: settings.telemetry.metrics_aggregation_interval_seconds,
|
68
70
|
dependency_collection: settings.telemetry.dependency_collection
|
69
71
|
)
|
70
72
|
end
|
@@ -169,8 +171,9 @@ module Datadog
|
|
169
171
|
unused_statsd = (old_statsd - (old_statsd & new_statsd))
|
170
172
|
unused_statsd.each(&:close)
|
171
173
|
|
172
|
-
telemetry
|
174
|
+
# enqueue closing event before stopping telemetry so it will be send out on shutdown
|
173
175
|
telemetry.emit_closing! unless replacement
|
176
|
+
telemetry.stop!
|
174
177
|
end
|
175
178
|
end
|
176
179
|
end
|
@@ -397,6 +397,22 @@ module Datadog
|
|
397
397
|
end
|
398
398
|
end
|
399
399
|
|
400
|
+
# The profiler gathers data by sending `SIGPROF` unix signals to Ruby application threads.
|
401
|
+
#
|
402
|
+
# We've discovered that this can trigger a bug in a number of Ruby APIs in the `Dir` class, as
|
403
|
+
# described in https://github.com/DataDog/dd-trace-rb/issues/3450 . This workaround prevents the issue
|
404
|
+
# from happening by monkey patching the affected APIs.
|
405
|
+
#
|
406
|
+
# (In the future, once a fix lands upstream, we'll disable this workaround for Rubies that don't need it)
|
407
|
+
#
|
408
|
+
# @default `DD_PROFILING_DIR_INTERRUPTION_WORKAROUND_ENABLED` environment variable as a boolean,
|
409
|
+
# otherwise `true`
|
410
|
+
option :dir_interruption_workaround_enabled do |o|
|
411
|
+
o.env 'DD_PROFILING_DIR_INTERRUPTION_WORKAROUND_ENABLED'
|
412
|
+
o.type :bool
|
413
|
+
o.default true
|
414
|
+
end
|
415
|
+
|
400
416
|
# Configures how much wall-time overhead the profiler targets. The profiler will dynamically adjust the
|
401
417
|
# interval between samples it takes so as to try and maintain the property that it spends no longer than
|
402
418
|
# this amount of wall-clock time profiling. For example, with the default value of 2%, the profiler will
|
@@ -647,6 +663,16 @@ module Datadog
|
|
647
663
|
o.type :bool
|
648
664
|
end
|
649
665
|
|
666
|
+
# Enable metrics collection for telemetry. Metrics collection only works when telemetry is enabled and
|
667
|
+
# metrics are enabled.
|
668
|
+
# @default `DD_TELEMETRY_METRICS_ENABLED` environment variable, otherwise `true`.
|
669
|
+
# @return [Boolean]
|
670
|
+
option :metrics_enabled do |o|
|
671
|
+
o.type :bool
|
672
|
+
o.env Core::Telemetry::Ext::ENV_METRICS_ENABLED
|
673
|
+
o.default true
|
674
|
+
end
|
675
|
+
|
650
676
|
# The interval in seconds when telemetry must be sent.
|
651
677
|
#
|
652
678
|
# This method is used internally, for testing purposes only.
|
@@ -660,6 +686,19 @@ module Datadog
|
|
660
686
|
o.default 60.0
|
661
687
|
end
|
662
688
|
|
689
|
+
# The interval in seconds when telemetry metrics are aggregated.
|
690
|
+
# Should be a denominator of `heartbeat_interval_seconds`.
|
691
|
+
#
|
692
|
+
# This method is used internally, for testing purposes only.
|
693
|
+
# @default `DD_TELEMETRY_METRICS_AGGREGATION_INTERVAL` environment variable, otherwise `10`.
|
694
|
+
# @return [Float]
|
695
|
+
# @!visibility private
|
696
|
+
option :metrics_aggregation_interval_seconds do |o|
|
697
|
+
o.type :float
|
698
|
+
o.env Core::Telemetry::Ext::ENV_METRICS_AGGREGATION_INTERVAL
|
699
|
+
o.default 10.0
|
700
|
+
end
|
701
|
+
|
663
702
|
# The install id of the application.
|
664
703
|
#
|
665
704
|
# This method is used internally, by library injection.
|
@@ -84,23 +84,16 @@ module Datadog
|
|
84
84
|
configuration = self.configuration
|
85
85
|
yield(configuration)
|
86
86
|
|
87
|
-
|
88
|
-
|
89
|
-
components = safely_synchronize do |write_components|
|
87
|
+
safely_synchronize do |write_components|
|
90
88
|
write_components.call(
|
91
89
|
if components?
|
92
90
|
replace_components!(configuration, @components)
|
93
91
|
else
|
94
|
-
|
95
|
-
built_components = true
|
96
|
-
components
|
92
|
+
build_components(configuration)
|
97
93
|
end
|
98
94
|
)
|
99
95
|
end
|
100
96
|
|
101
|
-
# Should only be called the first time components are built
|
102
|
-
components.telemetry.started! if built_components
|
103
|
-
|
104
97
|
configuration
|
105
98
|
end
|
106
99
|
|
@@ -200,20 +193,13 @@ module Datadog
|
|
200
193
|
current_components = COMPONENTS_READ_LOCK.synchronize { defined?(@components) && @components }
|
201
194
|
return current_components if current_components || !allow_initialization
|
202
195
|
|
203
|
-
|
204
|
-
|
205
|
-
components = safely_synchronize do |write_components|
|
196
|
+
safely_synchronize do |write_components|
|
206
197
|
if defined?(@components) && @components
|
207
198
|
@components
|
208
199
|
else
|
209
|
-
built_components = true
|
210
200
|
write_components.call(build_components(configuration))
|
211
201
|
end
|
212
202
|
end
|
213
|
-
|
214
|
-
# Should only be called the first time components are built
|
215
|
-
components&.telemetry&.started! if built_components
|
216
|
-
components
|
217
203
|
end
|
218
204
|
|
219
205
|
private
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Datadog
|
4
|
+
module Core
|
5
|
+
# Contains behavior for handling deprecated functions in the codebase.
|
6
|
+
module Deprecations
|
7
|
+
# Records the occurrence of a deprecated operation in this library.
|
8
|
+
#
|
9
|
+
# Currently, these operations are logged to `Datadog.logger` at `warn` level.
|
10
|
+
#
|
11
|
+
# `disallowed_next_major` adds a message informing that the deprecated operation
|
12
|
+
# won't be allowed in the next major release.
|
13
|
+
#
|
14
|
+
# @yieldreturn [String] a String with the lazily evaluated deprecation message.
|
15
|
+
# @param [Boolean] disallowed_next_major whether this deprecation will be enforced in the next major release.
|
16
|
+
# @param [Object] key A unique key for the deprecation. Only the first message with the same key will be logged.
|
17
|
+
def log_deprecation(disallowed_next_major: true, key: nil)
|
18
|
+
return unless log_deprecation?(key)
|
19
|
+
|
20
|
+
Datadog.logger.warn do
|
21
|
+
message = yield
|
22
|
+
message += ' This will be enforced in the next major release.' if disallowed_next_major
|
23
|
+
message
|
24
|
+
end
|
25
|
+
|
26
|
+
# Track the deprecation being logged.
|
27
|
+
deprecation_logged!(key)
|
28
|
+
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
# Determines whether a deprecation message should be logged.
|
35
|
+
#
|
36
|
+
# Internal use only.
|
37
|
+
def log_deprecation?(key)
|
38
|
+
return true if key.nil?
|
39
|
+
|
40
|
+
# Only allow a deprecation to be logged once.
|
41
|
+
!logged_deprecations.key?(key)
|
42
|
+
end
|
43
|
+
|
44
|
+
def deprecation_logged!(key)
|
45
|
+
return if key.nil?
|
46
|
+
|
47
|
+
logged_deprecations[key] += 1
|
48
|
+
end
|
49
|
+
|
50
|
+
# Tracks what deprecation warnings have already been logged
|
51
|
+
#
|
52
|
+
# Internal use only.
|
53
|
+
def logged_deprecations
|
54
|
+
@logged_deprecations ||= Hash.new(0)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -47,6 +47,11 @@ module Datadog
|
|
47
47
|
::RubyVM::YJIT.runtime_stats[:object_shape_count]
|
48
48
|
end
|
49
49
|
|
50
|
+
# Size of memory Rust allocated for metadata
|
51
|
+
def yjit_alloc_size
|
52
|
+
::RubyVM::YJIT.runtime_stats[:yjit_alloc_size]
|
53
|
+
end
|
54
|
+
|
50
55
|
def available?
|
51
56
|
defined?(::RubyVM::YJIT) \
|
52
57
|
&& ::RubyVM::YJIT.enabled? \
|
@@ -30,6 +30,7 @@ module Datadog
|
|
30
30
|
METRIC_YJIT_LIVE_PAGE_COUNT = 'runtime.ruby.yjit.live_page_count'
|
31
31
|
METRIC_YJIT_OBJECT_SHAPE_COUNT = 'runtime.ruby.yjit.object_shape_count'
|
32
32
|
METRIC_YJIT_OUTLINED_CODE_SIZE = 'runtime.ruby.yjit.outlined_code_size'
|
33
|
+
METRIC_YJIT_YJIT_ALLOC_SIZE = 'runtime.ruby.yjit.yjit_alloc_size'
|
33
34
|
|
34
35
|
TAG_SERVICE = 'service'
|
35
36
|
end
|
@@ -140,6 +140,7 @@ module Datadog
|
|
140
140
|
gauge(metric_name, metric_value) if metric_value
|
141
141
|
end
|
142
142
|
|
143
|
+
# rubocop:disable Metrics/MethodLength
|
143
144
|
def flush_yjit_stats
|
144
145
|
# Only on Ruby >= 3.2
|
145
146
|
try_flush do
|
@@ -176,9 +177,14 @@ module Datadog
|
|
176
177
|
Core::Runtime::Ext::Metrics::METRIC_YJIT_OUTLINED_CODE_SIZE,
|
177
178
|
Core::Environment::YJIT.outlined_code_size
|
178
179
|
)
|
180
|
+
gauge_if_not_nil(
|
181
|
+
Core::Runtime::Ext::Metrics::METRIC_YJIT_YJIT_ALLOC_SIZE,
|
182
|
+
Core::Environment::YJIT.yjit_alloc_size
|
183
|
+
)
|
179
184
|
end
|
180
185
|
end
|
181
186
|
end
|
187
|
+
# rubocop:enable Metrics/MethodLength
|
182
188
|
end
|
183
189
|
end
|
184
190
|
end
|