datadog 2.3.0 → 2.5.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 +64 -2
- data/ext/datadog_profiling_loader/datadog_profiling_loader.c +9 -1
- data/ext/datadog_profiling_loader/extconf.rb +10 -22
- data/ext/datadog_profiling_native_extension/NativeExtensionDesign.md +3 -3
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +198 -41
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +4 -2
- data/ext/datadog_profiling_native_extension/collectors_stack.c +89 -46
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +645 -107
- data/ext/datadog_profiling_native_extension/collectors_thread_context.h +15 -1
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +0 -27
- data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +0 -4
- data/ext/datadog_profiling_native_extension/extconf.rb +42 -25
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +50 -0
- data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +75 -0
- data/ext/datadog_profiling_native_extension/heap_recorder.c +194 -34
- data/ext/datadog_profiling_native_extension/heap_recorder.h +11 -0
- data/ext/datadog_profiling_native_extension/http_transport.c +38 -6
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +1 -1
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +53 -2
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +3 -0
- data/ext/datadog_profiling_native_extension/profiling.c +1 -1
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +14 -11
- data/ext/datadog_profiling_native_extension/stack_recorder.c +58 -22
- data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -0
- data/ext/libdatadog_api/crashtracker.c +20 -18
- data/ext/libdatadog_api/datadog_ruby_common.c +0 -27
- data/ext/libdatadog_api/datadog_ruby_common.h +0 -4
- data/ext/libdatadog_extconf_helpers.rb +1 -1
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +2184 -108
- data/lib/datadog/appsec/assets/waf_rules/strict.json +1430 -2
- data/lib/datadog/appsec/component.rb +29 -8
- data/lib/datadog/appsec/configuration/settings.rb +10 -2
- data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +1 -0
- data/lib/datadog/appsec/contrib/devise/patcher/rememberable_patch.rb +21 -0
- data/lib/datadog/appsec/contrib/devise/patcher.rb +12 -2
- data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +0 -14
- data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +67 -31
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +14 -15
- data/lib/datadog/appsec/contrib/graphql/integration.rb +14 -1
- data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +7 -20
- data/lib/datadog/appsec/contrib/rack/gateway/request.rb +2 -5
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +9 -15
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +6 -18
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +7 -20
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +5 -18
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +3 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -5
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +5 -18
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -10
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +7 -20
- data/lib/datadog/appsec/event.rb +25 -1
- data/lib/datadog/appsec/ext.rb +4 -0
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -5
- data/lib/datadog/appsec/monitor/reactive/set_user.rb +7 -20
- data/lib/datadog/appsec/processor/context.rb +109 -0
- data/lib/datadog/appsec/processor/rule_loader.rb +3 -1
- data/lib/datadog/appsec/processor/rule_merger.rb +33 -15
- data/lib/datadog/appsec/processor.rb +42 -107
- data/lib/datadog/appsec/rate_limiter.rb +25 -40
- data/lib/datadog/appsec/remote.rb +7 -3
- data/lib/datadog/appsec/scope.rb +1 -4
- data/lib/datadog/appsec/utils/trace_operation.rb +15 -0
- data/lib/datadog/appsec/utils.rb +2 -0
- data/lib/datadog/appsec.rb +3 -2
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +26 -25
- data/lib/datadog/core/configuration/components.rb +4 -3
- data/lib/datadog/core/configuration/settings.rb +96 -5
- data/lib/datadog/core/configuration.rb +1 -3
- data/lib/datadog/core/crashtracking/component.rb +9 -6
- data/lib/datadog/core/environment/execution.rb +5 -5
- data/lib/datadog/core/environment/yjit.rb +5 -0
- data/lib/datadog/core/metrics/client.rb +7 -0
- data/lib/datadog/core/rate_limiter.rb +183 -0
- data/lib/datadog/core/remote/client/capabilities.rb +4 -3
- data/lib/datadog/core/remote/component.rb +4 -2
- data/lib/datadog/core/remote/negotiation.rb +4 -4
- data/lib/datadog/core/remote/tie.rb +2 -0
- data/lib/datadog/core/remote/transport/http.rb +5 -0
- data/lib/datadog/core/remote/worker.rb +1 -1
- data/lib/datadog/core/runtime/ext.rb +1 -0
- data/lib/datadog/core/runtime/metrics.rb +5 -1
- data/lib/datadog/core/semaphore.rb +35 -0
- data/lib/datadog/core/telemetry/component.rb +2 -0
- data/lib/datadog/core/telemetry/event.rb +12 -7
- data/lib/datadog/core/telemetry/logger.rb +51 -0
- data/lib/datadog/core/telemetry/logging.rb +50 -14
- data/lib/datadog/core/telemetry/request.rb +13 -1
- data/lib/datadog/core/transport/ext.rb +1 -0
- data/lib/datadog/core/utils/time.rb +12 -0
- data/lib/datadog/core/workers/async.rb +1 -1
- data/lib/datadog/di/code_tracker.rb +166 -0
- data/lib/datadog/di/configuration/settings.rb +163 -0
- data/lib/datadog/di/configuration.rb +11 -0
- data/lib/datadog/di/error.rb +31 -0
- data/lib/datadog/di/extensions.rb +16 -0
- data/lib/datadog/di/instrumenter.rb +301 -0
- data/lib/datadog/di/probe.rb +162 -0
- data/lib/datadog/di/probe_builder.rb +47 -0
- data/lib/datadog/di/probe_notification_builder.rb +207 -0
- data/lib/datadog/di/probe_notifier_worker.rb +244 -0
- data/lib/datadog/di/redactor.rb +188 -0
- data/lib/datadog/di/serializer.rb +215 -0
- data/lib/datadog/di/transport.rb +67 -0
- data/lib/datadog/di/utils.rb +39 -0
- data/lib/datadog/di.rb +57 -0
- data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -0
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +12 -10
- data/lib/datadog/profiling/collectors/info.rb +12 -3
- data/lib/datadog/profiling/collectors/thread_context.rb +32 -8
- data/lib/datadog/profiling/component.rb +21 -4
- data/lib/datadog/profiling/http_transport.rb +6 -1
- data/lib/datadog/profiling/scheduler.rb +2 -0
- data/lib/datadog/profiling/stack_recorder.rb +40 -9
- data/lib/datadog/single_step_instrument.rb +12 -0
- data/lib/datadog/tracing/component.rb +13 -0
- data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +8 -12
- data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +5 -0
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +78 -0
- data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +33 -0
- data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -0
- data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +4 -0
- data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +3 -1
- data/lib/datadog/tracing/contrib/active_record/events/sql.rb +3 -1
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +5 -1
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -0
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -1
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -0
- data/lib/datadog/tracing/contrib/excon/middleware.rb +3 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +12 -0
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +24 -2
- data/lib/datadog/tracing/contrib/graphql/patcher.rb +9 -12
- data/lib/datadog/tracing/contrib/graphql/trace_patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/graphql/tracing_patcher.rb +3 -3
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +13 -9
- data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +6 -3
- data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +9 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +22 -15
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +10 -5
- data/lib/datadog/tracing/contrib/httpclient/patcher.rb +1 -14
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +9 -0
- data/lib/datadog/tracing/contrib/httprb/patcher.rb +1 -14
- data/lib/datadog/tracing/contrib/lograge/patcher.rb +1 -2
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +2 -0
- data/lib/datadog/tracing/contrib/opensearch/patcher.rb +13 -6
- data/lib/datadog/tracing/contrib/patcher.rb +2 -1
- data/lib/datadog/tracing/contrib/presto/patcher.rb +1 -13
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +27 -0
- data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
- data/lib/datadog/tracing/contrib/redis/tags.rb +4 -0
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +3 -0
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +4 -0
- data/lib/datadog/tracing/contrib/stripe/request.rb +3 -2
- data/lib/datadog/tracing/distributed/propagation.rb +7 -0
- data/lib/datadog/tracing/metadata/ext.rb +2 -0
- data/lib/datadog/tracing/remote.rb +5 -2
- data/lib/datadog/tracing/sampling/matcher.rb +6 -1
- data/lib/datadog/tracing/sampling/rate_sampler.rb +1 -1
- data/lib/datadog/tracing/sampling/rule.rb +2 -0
- data/lib/datadog/tracing/sampling/rule_sampler.rb +15 -9
- data/lib/datadog/tracing/sampling/span/ext.rb +1 -1
- data/lib/datadog/tracing/sampling/span/rule.rb +2 -2
- data/lib/datadog/tracing/trace_operation.rb +26 -2
- data/lib/datadog/tracing/tracer.rb +29 -22
- data/lib/datadog/tracing/transport/http/client.rb +1 -0
- data/lib/datadog/tracing/transport/http.rb +4 -0
- data/lib/datadog/tracing/transport/io/client.rb +1 -0
- data/lib/datadog/tracing/workers/trace_writer.rb +1 -1
- data/lib/datadog/tracing/workers.rb +2 -2
- data/lib/datadog/tracing/writer.rb +26 -28
- data/lib/datadog/version.rb +1 -1
- metadata +40 -15
- data/lib/datadog/tracing/sampling/rate_limiter.rb +0 -185
@@ -187,6 +187,7 @@ typedef struct profile_slot {
|
|
187
187
|
struct stack_recorder_state {
|
188
188
|
// Heap recorder instance
|
189
189
|
heap_recorder *heap_recorder;
|
190
|
+
bool heap_clean_after_gc_enabled;
|
190
191
|
|
191
192
|
pthread_mutex_t mutex_slot_one;
|
192
193
|
profile_slot profile_slot_one;
|
@@ -236,16 +237,7 @@ static VALUE _native_new(VALUE klass);
|
|
236
237
|
static void initialize_slot_concurrency_control(struct stack_recorder_state *state);
|
237
238
|
static void initialize_profiles(struct stack_recorder_state *state, ddog_prof_Slice_ValueType sample_types);
|
238
239
|
static void stack_recorder_typed_data_free(void *data);
|
239
|
-
static VALUE _native_initialize(
|
240
|
-
DDTRACE_UNUSED VALUE _self,
|
241
|
-
VALUE recorder_instance,
|
242
|
-
VALUE cpu_time_enabled,
|
243
|
-
VALUE alloc_samples_enabled,
|
244
|
-
VALUE heap_samples_enabled,
|
245
|
-
VALUE heap_size_enabled,
|
246
|
-
VALUE heap_sample_every,
|
247
|
-
VALUE timeline_enabled
|
248
|
-
);
|
240
|
+
static VALUE _native_initialize(int argc, VALUE *argv, DDTRACE_UNUSED VALUE _self);
|
249
241
|
static VALUE _native_serialize(VALUE self, VALUE recorder_instance);
|
250
242
|
static VALUE ruby_time_from(ddog_Timespec ddprof_time);
|
251
243
|
static void *call_serialize_without_gvl(void *call_args);
|
@@ -270,7 +262,9 @@ static VALUE _native_gc_force_recycle(DDTRACE_UNUSED VALUE _self, VALUE obj);
|
|
270
262
|
static VALUE _native_has_seen_id_flag(DDTRACE_UNUSED VALUE _self, VALUE obj);
|
271
263
|
static VALUE _native_stats(DDTRACE_UNUSED VALUE self, VALUE instance);
|
272
264
|
static VALUE build_profile_stats(profile_slot *slot, long serialization_time_ns, long heap_iteration_prep_time_ns, long heap_profile_build_time_ns);
|
273
|
-
|
265
|
+
static VALUE _native_is_object_recorded(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE object_id);
|
266
|
+
static VALUE _native_heap_recorder_reset_last_update(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
|
267
|
+
static VALUE _native_recorder_after_gc_step(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance);
|
274
268
|
|
275
269
|
void stack_recorder_init(VALUE profiling_module) {
|
276
270
|
VALUE stack_recorder_class = rb_define_class_under(profiling_module, "StackRecorder", rb_cObject);
|
@@ -287,7 +281,7 @@ void stack_recorder_init(VALUE profiling_module) {
|
|
287
281
|
// https://bugs.ruby-lang.org/issues/18007 for a discussion around this.
|
288
282
|
rb_define_alloc_func(stack_recorder_class, _native_new);
|
289
283
|
|
290
|
-
rb_define_singleton_method(stack_recorder_class, "_native_initialize", _native_initialize,
|
284
|
+
rb_define_singleton_method(stack_recorder_class, "_native_initialize", _native_initialize, -1);
|
291
285
|
rb_define_singleton_method(stack_recorder_class, "_native_serialize", _native_serialize, 1);
|
292
286
|
rb_define_singleton_method(stack_recorder_class, "_native_reset_after_fork", _native_reset_after_fork, 1);
|
293
287
|
rb_define_singleton_method(stack_recorder_class, "_native_stats", _native_stats, 1);
|
@@ -307,6 +301,9 @@ void stack_recorder_init(VALUE profiling_module) {
|
|
307
301
|
_native_gc_force_recycle, 1);
|
308
302
|
rb_define_singleton_method(testing_module, "_native_has_seen_id_flag",
|
309
303
|
_native_has_seen_id_flag, 1);
|
304
|
+
rb_define_singleton_method(testing_module, "_native_is_object_recorded?", _native_is_object_recorded, 2);
|
305
|
+
rb_define_singleton_method(testing_module, "_native_heap_recorder_reset_last_update", _native_heap_recorder_reset_last_update, 1);
|
306
|
+
rb_define_singleton_method(testing_module, "_native_recorder_after_gc_step", _native_recorder_after_gc_step, 1);
|
310
307
|
|
311
308
|
ok_symbol = ID2SYM(rb_intern_const("ok"));
|
312
309
|
error_symbol = ID2SYM(rb_intern_const("error"));
|
@@ -330,6 +327,8 @@ static VALUE _native_new(VALUE klass) {
|
|
330
327
|
// Note: Any exceptions raised from this note until the TypedData_Wrap_Struct call will lead to the state memory
|
331
328
|
// being leaked.
|
332
329
|
|
330
|
+
state->heap_clean_after_gc_enabled = false;
|
331
|
+
|
333
332
|
ddog_prof_Slice_ValueType sample_types = {.ptr = all_value_types, .len = ALL_VALUE_TYPES_COUNT};
|
334
333
|
|
335
334
|
initialize_slot_concurrency_control(state);
|
@@ -411,26 +410,33 @@ static void stack_recorder_typed_data_free(void *state_ptr) {
|
|
411
410
|
ruby_xfree(state);
|
412
411
|
}
|
413
412
|
|
414
|
-
static VALUE _native_initialize(
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
VALUE
|
420
|
-
VALUE
|
421
|
-
VALUE
|
422
|
-
VALUE
|
423
|
-
)
|
413
|
+
static VALUE _native_initialize(int argc, VALUE *argv, DDTRACE_UNUSED VALUE _self) {
|
414
|
+
VALUE options;
|
415
|
+
rb_scan_args(argc, argv, "0:", &options);
|
416
|
+
if (options == Qnil) options = rb_hash_new();
|
417
|
+
|
418
|
+
VALUE recorder_instance = rb_hash_fetch(options, ID2SYM(rb_intern("self_instance")));
|
419
|
+
VALUE cpu_time_enabled = rb_hash_fetch(options, ID2SYM(rb_intern("cpu_time_enabled")));
|
420
|
+
VALUE alloc_samples_enabled = rb_hash_fetch(options, ID2SYM(rb_intern("alloc_samples_enabled")));
|
421
|
+
VALUE heap_samples_enabled = rb_hash_fetch(options, ID2SYM(rb_intern("heap_samples_enabled")));
|
422
|
+
VALUE heap_size_enabled = rb_hash_fetch(options, ID2SYM(rb_intern("heap_size_enabled")));
|
423
|
+
VALUE heap_sample_every = rb_hash_fetch(options, ID2SYM(rb_intern("heap_sample_every")));
|
424
|
+
VALUE timeline_enabled = rb_hash_fetch(options, ID2SYM(rb_intern("timeline_enabled")));
|
425
|
+
VALUE heap_clean_after_gc_enabled = rb_hash_fetch(options, ID2SYM(rb_intern("heap_clean_after_gc_enabled")));
|
426
|
+
|
424
427
|
ENFORCE_BOOLEAN(cpu_time_enabled);
|
425
428
|
ENFORCE_BOOLEAN(alloc_samples_enabled);
|
426
429
|
ENFORCE_BOOLEAN(heap_samples_enabled);
|
427
430
|
ENFORCE_BOOLEAN(heap_size_enabled);
|
428
431
|
ENFORCE_TYPE(heap_sample_every, T_FIXNUM);
|
429
432
|
ENFORCE_BOOLEAN(timeline_enabled);
|
433
|
+
ENFORCE_BOOLEAN(heap_clean_after_gc_enabled);
|
430
434
|
|
431
435
|
struct stack_recorder_state *state;
|
432
436
|
TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state);
|
433
437
|
|
438
|
+
state->heap_clean_after_gc_enabled = (heap_clean_after_gc_enabled == Qtrue);
|
439
|
+
|
434
440
|
heap_recorder_set_sample_rate(state->heap_recorder, NUM2INT(heap_sample_every));
|
435
441
|
|
436
442
|
uint8_t requested_values_count = ALL_VALUE_TYPES_COUNT -
|
@@ -675,6 +681,13 @@ void record_endpoint(VALUE recorder_instance, uint64_t local_root_span_id, ddog_
|
|
675
681
|
}
|
676
682
|
}
|
677
683
|
|
684
|
+
void recorder_after_gc_step(VALUE recorder_instance) {
|
685
|
+
struct stack_recorder_state *state;
|
686
|
+
TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state);
|
687
|
+
|
688
|
+
if (state->heap_clean_after_gc_enabled) heap_recorder_update_young_objects(state->heap_recorder);
|
689
|
+
}
|
690
|
+
|
678
691
|
#define MAX_LEN_HEAP_ITERATION_ERROR_MSG 256
|
679
692
|
|
680
693
|
// Heap recorder iteration context allows us access to stack recorder state and profile being serialized
|
@@ -1057,3 +1070,26 @@ static VALUE build_profile_stats(profile_slot *slot, long serialization_time_ns,
|
|
1057
1070
|
for (long unsigned int i = 0; i < VALUE_COUNT(arguments); i += 2) rb_hash_aset(stats_as_hash, arguments[i], arguments[i+1]);
|
1058
1071
|
return stats_as_hash;
|
1059
1072
|
}
|
1073
|
+
|
1074
|
+
static VALUE _native_is_object_recorded(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance, VALUE obj_id) {
|
1075
|
+
ENFORCE_TYPE(obj_id, T_FIXNUM);
|
1076
|
+
|
1077
|
+
struct stack_recorder_state *state;
|
1078
|
+
TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state);
|
1079
|
+
|
1080
|
+
return heap_recorder_testonly_is_object_recorded(state->heap_recorder, obj_id);
|
1081
|
+
}
|
1082
|
+
|
1083
|
+
static VALUE _native_heap_recorder_reset_last_update(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) {
|
1084
|
+
struct stack_recorder_state *state;
|
1085
|
+
TypedData_Get_Struct(recorder_instance, struct stack_recorder_state, &stack_recorder_typed_data, state);
|
1086
|
+
|
1087
|
+
heap_recorder_testonly_reset_last_update(state->heap_recorder);
|
1088
|
+
|
1089
|
+
return Qtrue;
|
1090
|
+
}
|
1091
|
+
|
1092
|
+
static VALUE _native_recorder_after_gc_step(DDTRACE_UNUSED VALUE _self, VALUE recorder_instance) {
|
1093
|
+
recorder_after_gc_step(recorder_instance);
|
1094
|
+
return Qtrue;
|
1095
|
+
}
|
@@ -19,6 +19,7 @@ typedef struct sample_labels {
|
|
19
19
|
// This is used to allow the `Collectors::Stack` to modify the existing label, if any. This MUST be NULL or point
|
20
20
|
// somewhere inside the labels slice above.
|
21
21
|
ddog_prof_Label *state_label;
|
22
|
+
bool is_gvl_waiting_state;
|
22
23
|
|
23
24
|
int64_t end_timestamp_ns;
|
24
25
|
} sample_labels;
|
@@ -26,4 +27,5 @@ typedef struct sample_labels {
|
|
26
27
|
void record_sample(VALUE recorder_instance, ddog_prof_Slice_Location locations, sample_values values, sample_labels labels);
|
27
28
|
void record_endpoint(VALUE recorder_instance, uint64_t local_root_span_id, ddog_CharSlice endpoint);
|
28
29
|
void track_object(VALUE recorder_instance, VALUE new_object, unsigned int sample_weight, ddog_CharSlice *alloc_class);
|
30
|
+
void recorder_after_gc_step(VALUE recorder_instance);
|
29
31
|
VALUE enforce_recorder_instance(VALUE object);
|
@@ -1,5 +1,5 @@
|
|
1
1
|
#include <ruby.h>
|
2
|
-
#include <datadog/
|
2
|
+
#include <datadog/crashtracker.h>
|
3
3
|
|
4
4
|
#include "datadog_ruby_common.h"
|
5
5
|
|
@@ -28,8 +28,9 @@ void crashtracker_init(VALUE crashtracking_module) {
|
|
28
28
|
static VALUE _native_start_or_update_on_fork(int argc, VALUE *argv, DDTRACE_UNUSED VALUE _self) {
|
29
29
|
VALUE options;
|
30
30
|
rb_scan_args(argc, argv, "0:", &options);
|
31
|
+
if (options == Qnil) options = rb_hash_new();
|
31
32
|
|
32
|
-
VALUE
|
33
|
+
VALUE agent_base_url = rb_hash_fetch(options, ID2SYM(rb_intern("agent_base_url")));
|
33
34
|
VALUE path_to_crashtracking_receiver_binary = rb_hash_fetch(options, ID2SYM(rb_intern("path_to_crashtracking_receiver_binary")));
|
34
35
|
VALUE ld_library_path = rb_hash_fetch(options, ID2SYM(rb_intern("ld_library_path")));
|
35
36
|
VALUE tags_as_array = rb_hash_fetch(options, ID2SYM(rb_intern("tags_as_array")));
|
@@ -39,7 +40,7 @@ static VALUE _native_start_or_update_on_fork(int argc, VALUE *argv, DDTRACE_UNUS
|
|
39
40
|
VALUE start_action = ID2SYM(rb_intern("start"));
|
40
41
|
VALUE update_on_fork_action = ID2SYM(rb_intern("update_on_fork"));
|
41
42
|
|
42
|
-
ENFORCE_TYPE(
|
43
|
+
ENFORCE_TYPE(agent_base_url, T_STRING);
|
43
44
|
ENFORCE_TYPE(tags_as_array, T_ARRAY);
|
44
45
|
ENFORCE_TYPE(path_to_crashtracking_receiver_binary, T_STRING);
|
45
46
|
ENFORCE_TYPE(ld_library_path, T_STRING);
|
@@ -49,13 +50,13 @@ static VALUE _native_start_or_update_on_fork(int argc, VALUE *argv, DDTRACE_UNUS
|
|
49
50
|
if (action != start_action && action != update_on_fork_action) rb_raise(rb_eArgError, "Unexpected action: %+"PRIsVALUE, action);
|
50
51
|
|
51
52
|
VALUE version = datadog_gem_version();
|
52
|
-
ddog_prof_Endpoint endpoint = endpoint_from(exporter_configuration);
|
53
53
|
|
54
|
-
// Tags are heap-allocated, so after here we can't raise exceptions otherwise we'll leak this memory
|
54
|
+
// Tags and endpoint are heap-allocated, so after here we can't raise exceptions otherwise we'll leak this memory
|
55
55
|
// Start of exception-free zone to prevent leaks {{
|
56
|
+
ddog_Endpoint *endpoint = ddog_endpoint_from_url(char_slice_from_ruby_string(agent_base_url));
|
56
57
|
ddog_Vec_Tag tags = convert_tags(tags_as_array);
|
57
58
|
|
58
|
-
|
59
|
+
ddog_crasht_Config config = {
|
59
60
|
.additional_files = {},
|
60
61
|
// The Ruby VM already uses an alt stack to detect stack overflows so the crash handler must not overwrite it.
|
61
62
|
//
|
@@ -67,26 +68,26 @@ static VALUE _native_start_or_update_on_fork(int argc, VALUE *argv, DDTRACE_UNUS
|
|
67
68
|
// "Process.kill('SEGV', Process.pid)" gets run.
|
68
69
|
.create_alt_stack = false,
|
69
70
|
.endpoint = endpoint,
|
70
|
-
.resolve_frames =
|
71
|
+
.resolve_frames = DDOG_CRASHT_STACKTRACE_COLLECTION_ENABLED_WITH_SYMBOLS_IN_RECEIVER,
|
71
72
|
.timeout_secs = FIX2INT(upload_timeout_seconds),
|
72
73
|
// Waits for crash tracker to finish reporting the issue before letting the Ruby process die; see
|
73
74
|
// https://github.com/DataDog/libdatadog/pull/477 for details
|
74
75
|
.wait_for_receiver = true,
|
75
76
|
};
|
76
77
|
|
77
|
-
|
78
|
-
.
|
79
|
-
.
|
78
|
+
ddog_crasht_Metadata metadata = {
|
79
|
+
.library_name = DDOG_CHARSLICE_C("dd-trace-rb"),
|
80
|
+
.library_version = char_slice_from_ruby_string(version),
|
80
81
|
.family = DDOG_CHARSLICE_C("ruby"),
|
81
82
|
.tags = &tags,
|
82
83
|
};
|
83
84
|
|
84
|
-
|
85
|
+
ddog_crasht_EnvVar ld_library_path_env = {
|
85
86
|
.key = DDOG_CHARSLICE_C("LD_LIBRARY_PATH"),
|
86
87
|
.val = char_slice_from_ruby_string(ld_library_path),
|
87
88
|
};
|
88
89
|
|
89
|
-
|
90
|
+
ddog_crasht_ReceiverConfig receiver_config = {
|
90
91
|
.args = {},
|
91
92
|
.env = {.ptr = &ld_library_path_env, .len = 1},
|
92
93
|
.path_to_receiver_binary = char_slice_from_ruby_string(path_to_crashtracking_receiver_binary),
|
@@ -94,16 +95,17 @@ static VALUE _native_start_or_update_on_fork(int argc, VALUE *argv, DDTRACE_UNUS
|
|
94
95
|
.optional_stdout_filename = {},
|
95
96
|
};
|
96
97
|
|
97
|
-
|
98
|
+
ddog_crasht_Result result =
|
98
99
|
action == start_action ?
|
99
|
-
|
100
|
-
|
100
|
+
ddog_crasht_init_with_receiver(config, receiver_config, metadata) :
|
101
|
+
ddog_crasht_update_on_fork(config, receiver_config, metadata);
|
101
102
|
|
102
103
|
// Clean up before potentially raising any exceptions
|
103
104
|
ddog_Vec_Tag_drop(tags);
|
105
|
+
ddog_endpoint_drop(endpoint);
|
104
106
|
// }} End of exception-free zone to prevent leaks
|
105
107
|
|
106
|
-
if (result.tag ==
|
108
|
+
if (result.tag == DDOG_CRASHT_RESULT_ERR) {
|
107
109
|
rb_raise(rb_eRuntimeError, "Failed to start/update the crash tracker: %"PRIsVALUE, get_error_details_and_drop(&result.err));
|
108
110
|
}
|
109
111
|
|
@@ -111,9 +113,9 @@ static VALUE _native_start_or_update_on_fork(int argc, VALUE *argv, DDTRACE_UNUS
|
|
111
113
|
}
|
112
114
|
|
113
115
|
static VALUE _native_stop(DDTRACE_UNUSED VALUE _self) {
|
114
|
-
|
116
|
+
ddog_crasht_Result result = ddog_crasht_shutdown();
|
115
117
|
|
116
|
-
if (result.tag ==
|
118
|
+
if (result.tag == DDOG_CRASHT_RESULT_ERR) {
|
117
119
|
rb_raise(rb_eRuntimeError, "Failed to stop the crash tracker: %"PRIsVALUE, get_error_details_and_drop(&result.err));
|
118
120
|
}
|
119
121
|
|
@@ -28,33 +28,6 @@ VALUE datadog_gem_version(void) {
|
|
28
28
|
return version_string;
|
29
29
|
}
|
30
30
|
|
31
|
-
__attribute__((warn_unused_result))
|
32
|
-
ddog_prof_Endpoint endpoint_from(VALUE exporter_configuration) {
|
33
|
-
ENFORCE_TYPE(exporter_configuration, T_ARRAY);
|
34
|
-
|
35
|
-
VALUE exporter_working_mode = rb_ary_entry(exporter_configuration, 0);
|
36
|
-
ENFORCE_TYPE(exporter_working_mode, T_SYMBOL);
|
37
|
-
ID working_mode = SYM2ID(exporter_working_mode);
|
38
|
-
|
39
|
-
ID agentless_id = rb_intern("agentless");
|
40
|
-
ID agent_id = rb_intern("agent");
|
41
|
-
|
42
|
-
if (working_mode != agentless_id && working_mode != agent_id) {
|
43
|
-
rb_raise(rb_eArgError, "Failed to initialize transport: Unexpected working mode, expected :agentless or :agent");
|
44
|
-
}
|
45
|
-
|
46
|
-
if (working_mode == agentless_id) {
|
47
|
-
VALUE site = rb_ary_entry(exporter_configuration, 1);
|
48
|
-
VALUE api_key = rb_ary_entry(exporter_configuration, 2);
|
49
|
-
|
50
|
-
return ddog_prof_Endpoint_agentless(char_slice_from_ruby_string(site), char_slice_from_ruby_string(api_key));
|
51
|
-
} else { // agent_id
|
52
|
-
VALUE base_url = rb_ary_entry(exporter_configuration, 1);
|
53
|
-
|
54
|
-
return ddog_prof_Endpoint_agent(char_slice_from_ruby_string(base_url));
|
55
|
-
}
|
56
|
-
}
|
57
|
-
|
58
31
|
static VALUE log_failure_to_process_tag(VALUE err_details) {
|
59
32
|
VALUE datadog_module = rb_const_get(rb_cObject, rb_intern("Datadog"));
|
60
33
|
VALUE logger = rb_funcall(datadog_module, rb_intern("logger"), 0);
|
@@ -27,7 +27,6 @@
|
|
27
27
|
#define ENFORCE_BOOLEAN(value) \
|
28
28
|
{ if (RB_UNLIKELY(value != Qtrue && value != Qfalse)) raise_unexpected_type(value, ADD_QUOTES(value), "true or false", __FILE__, __LINE__, __func__); }
|
29
29
|
|
30
|
-
// Called by ENFORCE_TYPE; should not be used directly
|
31
30
|
NORETURN(void raise_unexpected_type(VALUE value, const char *value_name, const char *type_name, const char *file, int line, const char* function_name));
|
32
31
|
|
33
32
|
// Helper to retrieve Datadog::VERSION::STRING
|
@@ -39,9 +38,6 @@ static inline ddog_CharSlice char_slice_from_ruby_string(VALUE string) {
|
|
39
38
|
return char_slice;
|
40
39
|
}
|
41
40
|
|
42
|
-
__attribute__((warn_unused_result))
|
43
|
-
ddog_prof_Endpoint endpoint_from(VALUE exporter_configuration);
|
44
|
-
|
45
41
|
__attribute__((warn_unused_result))
|
46
42
|
ddog_Vec_Tag convert_tags(VALUE tags_as_array);
|
47
43
|
|
@@ -8,7 +8,7 @@ module Datadog
|
|
8
8
|
module LibdatadogExtconfHelpers
|
9
9
|
# Used to make sure the correct gem version gets loaded, as extconf.rb does not get run with "bundle exec" and thus
|
10
10
|
# may see multiple libdatadog versions. See https://github.com/DataDog/dd-trace-rb/pull/2531 for the horror story.
|
11
|
-
LIBDATADOG_VERSION = '~>
|
11
|
+
LIBDATADOG_VERSION = '~> 13.1.0.1.0'
|
12
12
|
|
13
13
|
# Used as an workaround for a limitation with how dynamic linking works in environments where the datadog gem and
|
14
14
|
# libdatadog are moved after the extension gets compiled.
|