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.
Files changed (173) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +64 -2
  3. data/ext/datadog_profiling_loader/datadog_profiling_loader.c +9 -1
  4. data/ext/datadog_profiling_loader/extconf.rb +10 -22
  5. data/ext/datadog_profiling_native_extension/NativeExtensionDesign.md +3 -3
  6. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +198 -41
  7. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +4 -2
  8. data/ext/datadog_profiling_native_extension/collectors_stack.c +89 -46
  9. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +645 -107
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +15 -1
  11. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +0 -27
  12. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +0 -4
  13. data/ext/datadog_profiling_native_extension/extconf.rb +42 -25
  14. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.c +50 -0
  15. data/ext/datadog_profiling_native_extension/gvl_profiling_helper.h +75 -0
  16. data/ext/datadog_profiling_native_extension/heap_recorder.c +194 -34
  17. data/ext/datadog_profiling_native_extension/heap_recorder.h +11 -0
  18. data/ext/datadog_profiling_native_extension/http_transport.c +38 -6
  19. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +1 -1
  20. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +53 -2
  21. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +3 -0
  22. data/ext/datadog_profiling_native_extension/profiling.c +1 -1
  23. data/ext/datadog_profiling_native_extension/ruby_helpers.c +14 -11
  24. data/ext/datadog_profiling_native_extension/stack_recorder.c +58 -22
  25. data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -0
  26. data/ext/libdatadog_api/crashtracker.c +20 -18
  27. data/ext/libdatadog_api/datadog_ruby_common.c +0 -27
  28. data/ext/libdatadog_api/datadog_ruby_common.h +0 -4
  29. data/ext/libdatadog_extconf_helpers.rb +1 -1
  30. data/lib/datadog/appsec/assets/waf_rules/recommended.json +2184 -108
  31. data/lib/datadog/appsec/assets/waf_rules/strict.json +1430 -2
  32. data/lib/datadog/appsec/component.rb +29 -8
  33. data/lib/datadog/appsec/configuration/settings.rb +10 -2
  34. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +1 -0
  35. data/lib/datadog/appsec/contrib/devise/patcher/rememberable_patch.rb +21 -0
  36. data/lib/datadog/appsec/contrib/devise/patcher.rb +12 -2
  37. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +0 -14
  38. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +67 -31
  39. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +14 -15
  40. data/lib/datadog/appsec/contrib/graphql/integration.rb +14 -1
  41. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +7 -20
  42. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +2 -5
  43. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +9 -15
  44. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +6 -18
  45. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +7 -20
  46. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +5 -18
  47. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +3 -1
  48. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -5
  49. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +5 -18
  50. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -10
  51. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +7 -20
  52. data/lib/datadog/appsec/event.rb +25 -1
  53. data/lib/datadog/appsec/ext.rb +4 -0
  54. data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -5
  55. data/lib/datadog/appsec/monitor/reactive/set_user.rb +7 -20
  56. data/lib/datadog/appsec/processor/context.rb +109 -0
  57. data/lib/datadog/appsec/processor/rule_loader.rb +3 -1
  58. data/lib/datadog/appsec/processor/rule_merger.rb +33 -15
  59. data/lib/datadog/appsec/processor.rb +42 -107
  60. data/lib/datadog/appsec/rate_limiter.rb +25 -40
  61. data/lib/datadog/appsec/remote.rb +7 -3
  62. data/lib/datadog/appsec/scope.rb +1 -4
  63. data/lib/datadog/appsec/utils/trace_operation.rb +15 -0
  64. data/lib/datadog/appsec/utils.rb +2 -0
  65. data/lib/datadog/appsec.rb +3 -2
  66. data/lib/datadog/core/configuration/agent_settings_resolver.rb +26 -25
  67. data/lib/datadog/core/configuration/components.rb +4 -3
  68. data/lib/datadog/core/configuration/settings.rb +96 -5
  69. data/lib/datadog/core/configuration.rb +1 -3
  70. data/lib/datadog/core/crashtracking/component.rb +9 -6
  71. data/lib/datadog/core/environment/execution.rb +5 -5
  72. data/lib/datadog/core/environment/yjit.rb +5 -0
  73. data/lib/datadog/core/metrics/client.rb +7 -0
  74. data/lib/datadog/core/rate_limiter.rb +183 -0
  75. data/lib/datadog/core/remote/client/capabilities.rb +4 -3
  76. data/lib/datadog/core/remote/component.rb +4 -2
  77. data/lib/datadog/core/remote/negotiation.rb +4 -4
  78. data/lib/datadog/core/remote/tie.rb +2 -0
  79. data/lib/datadog/core/remote/transport/http.rb +5 -0
  80. data/lib/datadog/core/remote/worker.rb +1 -1
  81. data/lib/datadog/core/runtime/ext.rb +1 -0
  82. data/lib/datadog/core/runtime/metrics.rb +5 -1
  83. data/lib/datadog/core/semaphore.rb +35 -0
  84. data/lib/datadog/core/telemetry/component.rb +2 -0
  85. data/lib/datadog/core/telemetry/event.rb +12 -7
  86. data/lib/datadog/core/telemetry/logger.rb +51 -0
  87. data/lib/datadog/core/telemetry/logging.rb +50 -14
  88. data/lib/datadog/core/telemetry/request.rb +13 -1
  89. data/lib/datadog/core/transport/ext.rb +1 -0
  90. data/lib/datadog/core/utils/time.rb +12 -0
  91. data/lib/datadog/core/workers/async.rb +1 -1
  92. data/lib/datadog/di/code_tracker.rb +166 -0
  93. data/lib/datadog/di/configuration/settings.rb +163 -0
  94. data/lib/datadog/di/configuration.rb +11 -0
  95. data/lib/datadog/di/error.rb +31 -0
  96. data/lib/datadog/di/extensions.rb +16 -0
  97. data/lib/datadog/di/instrumenter.rb +301 -0
  98. data/lib/datadog/di/probe.rb +162 -0
  99. data/lib/datadog/di/probe_builder.rb +47 -0
  100. data/lib/datadog/di/probe_notification_builder.rb +207 -0
  101. data/lib/datadog/di/probe_notifier_worker.rb +244 -0
  102. data/lib/datadog/di/redactor.rb +188 -0
  103. data/lib/datadog/di/serializer.rb +215 -0
  104. data/lib/datadog/di/transport.rb +67 -0
  105. data/lib/datadog/di/utils.rb +39 -0
  106. data/lib/datadog/di.rb +57 -0
  107. data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -0
  108. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +12 -10
  109. data/lib/datadog/profiling/collectors/info.rb +12 -3
  110. data/lib/datadog/profiling/collectors/thread_context.rb +32 -8
  111. data/lib/datadog/profiling/component.rb +21 -4
  112. data/lib/datadog/profiling/http_transport.rb +6 -1
  113. data/lib/datadog/profiling/scheduler.rb +2 -0
  114. data/lib/datadog/profiling/stack_recorder.rb +40 -9
  115. data/lib/datadog/single_step_instrument.rb +12 -0
  116. data/lib/datadog/tracing/component.rb +13 -0
  117. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +8 -12
  118. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +5 -0
  119. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +78 -0
  120. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +33 -0
  121. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +2 -0
  122. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +4 -0
  123. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +3 -1
  124. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +3 -1
  125. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +5 -1
  126. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -0
  127. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +6 -1
  128. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -0
  129. data/lib/datadog/tracing/contrib/excon/middleware.rb +3 -0
  130. data/lib/datadog/tracing/contrib/faraday/middleware.rb +12 -0
  131. data/lib/datadog/tracing/contrib/grape/endpoint.rb +24 -2
  132. data/lib/datadog/tracing/contrib/graphql/patcher.rb +9 -12
  133. data/lib/datadog/tracing/contrib/graphql/trace_patcher.rb +3 -3
  134. data/lib/datadog/tracing/contrib/graphql/tracing_patcher.rb +3 -3
  135. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +13 -9
  136. data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +6 -3
  137. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +9 -0
  138. data/lib/datadog/tracing/contrib/http/instrumentation.rb +22 -15
  139. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +10 -5
  140. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +1 -14
  141. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +9 -0
  142. data/lib/datadog/tracing/contrib/httprb/patcher.rb +1 -14
  143. data/lib/datadog/tracing/contrib/lograge/patcher.rb +1 -2
  144. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +2 -0
  145. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +13 -6
  146. data/lib/datadog/tracing/contrib/patcher.rb +2 -1
  147. data/lib/datadog/tracing/contrib/presto/patcher.rb +1 -13
  148. data/lib/datadog/tracing/contrib/rack/middlewares.rb +27 -0
  149. data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
  150. data/lib/datadog/tracing/contrib/redis/tags.rb +4 -0
  151. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +3 -0
  152. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +4 -0
  153. data/lib/datadog/tracing/contrib/stripe/request.rb +3 -2
  154. data/lib/datadog/tracing/distributed/propagation.rb +7 -0
  155. data/lib/datadog/tracing/metadata/ext.rb +2 -0
  156. data/lib/datadog/tracing/remote.rb +5 -2
  157. data/lib/datadog/tracing/sampling/matcher.rb +6 -1
  158. data/lib/datadog/tracing/sampling/rate_sampler.rb +1 -1
  159. data/lib/datadog/tracing/sampling/rule.rb +2 -0
  160. data/lib/datadog/tracing/sampling/rule_sampler.rb +15 -9
  161. data/lib/datadog/tracing/sampling/span/ext.rb +1 -1
  162. data/lib/datadog/tracing/sampling/span/rule.rb +2 -2
  163. data/lib/datadog/tracing/trace_operation.rb +26 -2
  164. data/lib/datadog/tracing/tracer.rb +29 -22
  165. data/lib/datadog/tracing/transport/http/client.rb +1 -0
  166. data/lib/datadog/tracing/transport/http.rb +4 -0
  167. data/lib/datadog/tracing/transport/io/client.rb +1 -0
  168. data/lib/datadog/tracing/workers/trace_writer.rb +1 -1
  169. data/lib/datadog/tracing/workers.rb +2 -2
  170. data/lib/datadog/tracing/writer.rb +26 -28
  171. data/lib/datadog/version.rb +1 -1
  172. metadata +40 -15
  173. 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, 7);
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
- DDTRACE_UNUSED VALUE _self,
416
- VALUE recorder_instance,
417
- VALUE cpu_time_enabled,
418
- VALUE alloc_samples_enabled,
419
- VALUE heap_samples_enabled,
420
- VALUE heap_size_enabled,
421
- VALUE heap_sample_every,
422
- VALUE timeline_enabled
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/profiling.h>
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 exporter_configuration = rb_hash_fetch(options, ID2SYM(rb_intern("exporter_configuration")));
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(exporter_configuration, T_ARRAY);
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
- ddog_prof_CrashtrackerConfiguration config = {
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 = DDOG_PROF_STACKTRACE_COLLECTION_ENABLED_WITH_SYMBOLS_IN_RECEIVER,
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
- ddog_prof_CrashtrackerMetadata metadata = {
78
- .profiling_library_name = DDOG_CHARSLICE_C("dd-trace-rb"),
79
- .profiling_library_version = char_slice_from_ruby_string(version),
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
- ddog_prof_EnvVar ld_library_path_env = {
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
- ddog_prof_CrashtrackerReceiverConfig receiver_config = {
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
- ddog_prof_CrashtrackerResult result =
98
+ ddog_crasht_Result result =
98
99
  action == start_action ?
99
- ddog_prof_Crashtracker_init_with_receiver(config, receiver_config, metadata) :
100
- ddog_prof_Crashtracker_update_on_fork(config, receiver_config, metadata);
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 == DDOG_PROF_CRASHTRACKER_RESULT_ERR) {
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
- ddog_prof_CrashtrackerResult result = ddog_prof_Crashtracker_shutdown();
116
+ ddog_crasht_Result result = ddog_crasht_shutdown();
115
117
 
116
- if (result.tag == DDOG_PROF_CRASHTRACKER_RESULT_ERR) {
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.0.0.1.0'
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.