datadog 2.42.0 → 2.44.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 (94) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +67 -2
  3. data/README.md +3 -0
  4. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +46 -5
  5. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +6 -7
  6. data/ext/datadog_profiling_native_extension/collectors_stack.c +6 -7
  7. data/ext/datadog_profiling_native_extension/collectors_stack.h +1 -1
  8. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +80 -36
  9. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +3 -2
  10. data/ext/datadog_profiling_native_extension/extconf.rb +4 -2
  11. data/ext/datadog_profiling_native_extension/heap_recorder.c +13 -0
  12. data/ext/datadog_profiling_native_extension/heap_recorder.h +4 -0
  13. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +34 -2
  14. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +1 -0
  15. data/ext/datadog_profiling_native_extension/profiling.c +1 -0
  16. data/ext/datadog_profiling_native_extension/stack_recorder.c +17 -4
  17. data/ext/datadog_profiling_native_extension/time_helpers.h +5 -4
  18. data/ext/libdatadog_api/di.c +8 -3
  19. data/ext/libdatadog_api/extconf.rb +1 -1
  20. data/ext/libdatadog_api/feature_flags.c +8 -0
  21. data/ext/libdatadog_api/init.c +3 -1
  22. data/ext/libdatadog_api/otel_thread_context.c +51 -15
  23. data/ext/libdatadog_api/trace_exporter.c +642 -22
  24. data/ext/libdatadog_extconf_helpers.rb +14 -9
  25. data/lib/datadog/ai_guard/component.rb +17 -8
  26. data/lib/datadog/ai_guard/configuration/ext.rb +2 -0
  27. data/lib/datadog/ai_guard/configuration.rb +13 -0
  28. data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +48 -55
  29. data/lib/datadog/ai_guard/contrib/ruby_llm/integration.rb +1 -1
  30. data/lib/datadog/ai_guard/contrib/ruby_llm/message_adapter.rb +76 -0
  31. data/lib/datadog/ai_guard/contrib/ruby_llm/patcher.rb +1 -0
  32. data/lib/datadog/ai_guard/contrib/ruby_llm/redaction_change_set.rb +135 -0
  33. data/lib/datadog/ai_guard/evaluation/client.rb +50 -0
  34. data/lib/datadog/ai_guard/evaluation/content_part.rb +12 -0
  35. data/lib/datadog/ai_guard/evaluation/message.rb +25 -7
  36. data/lib/datadog/ai_guard/evaluation/message_builder.rb +31 -0
  37. data/lib/datadog/ai_guard/evaluation/no_op_result.rb +6 -6
  38. data/lib/datadog/ai_guard/evaluation/outcome.rb +24 -0
  39. data/lib/datadog/ai_guard/evaluation/request.rb +4 -60
  40. data/lib/datadog/ai_guard/evaluation/response.rb +33 -0
  41. data/lib/datadog/ai_guard/evaluation/result.rb +11 -18
  42. data/lib/datadog/ai_guard/evaluation/tool_call.rb +15 -2
  43. data/lib/datadog/ai_guard/evaluation.rb +25 -11
  44. data/lib/datadog/ai_guard/ext.rb +1 -0
  45. data/lib/datadog/ai_guard/{api_client.rb → http_client.rb} +6 -4
  46. data/lib/datadog/ai_guard/metrics/telemetry.rb +43 -0
  47. data/lib/datadog/ai_guard/redaction/replacements.rb +97 -0
  48. data/lib/datadog/ai_guard/redaction/result.rb +29 -0
  49. data/lib/datadog/ai_guard/redaction.rb +80 -0
  50. data/lib/datadog/ai_guard.rb +58 -57
  51. data/lib/datadog/core/configuration/components.rb +9 -1
  52. data/lib/datadog/core/configuration/settings.rb +5 -2
  53. data/lib/datadog/core/configuration/supported_configurations.rb +8 -0
  54. data/lib/datadog/core/remote/client/capabilities.rb +10 -4
  55. data/lib/datadog/core/remote/component.rb +9 -2
  56. data/lib/datadog/core/remote/worker.rb +8 -0
  57. data/lib/datadog/di/instrumenter.rb +1 -1
  58. data/lib/datadog/di/probe_manager.rb +10 -5
  59. data/lib/datadog/di/proc_responder.rb +1 -1
  60. data/lib/datadog/open_feature/agentless/configuration_source.rb +246 -0
  61. data/lib/datadog/open_feature/agentless/parser.rb +43 -0
  62. data/lib/datadog/open_feature/agentless/response.rb +19 -0
  63. data/lib/datadog/open_feature/agentless/transport.rb +103 -0
  64. data/lib/datadog/open_feature/component.rb +57 -1
  65. data/lib/datadog/open_feature/configuration/agentless_endpoint.rb +90 -0
  66. data/lib/datadog/open_feature/configuration/source/resolution.rb +22 -0
  67. data/lib/datadog/open_feature/configuration/source.rb +43 -0
  68. data/lib/datadog/open_feature/configuration.rb +118 -0
  69. data/lib/datadog/open_feature/native_evaluator.rb +1 -14
  70. data/lib/datadog/open_feature/remote.rb +5 -5
  71. data/lib/datadog/open_feature/transport.rb +5 -0
  72. data/lib/datadog/opentelemetry/signal_configuration.rb +13 -9
  73. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +2 -2
  74. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +5 -7
  75. data/lib/datadog/profiling/collectors/info.rb +2 -6
  76. data/lib/datadog/symbol_database/extractor.rb +84 -102
  77. data/lib/datadog/tracing/component.rb +2 -0
  78. data/lib/datadog/tracing/configuration/ext.rb +1 -0
  79. data/lib/datadog/tracing/configuration/settings.rb +6 -0
  80. data/lib/datadog/tracing/context.rb +24 -2
  81. data/lib/datadog/tracing/context_provider.rb +9 -5
  82. data/lib/datadog/tracing/contrib/grape/endpoint.rb +32 -5
  83. data/lib/datadog/tracing/contrib/sequel/jdbc_connection_string.rb +140 -0
  84. data/lib/datadog/tracing/contrib/sequel/utils.rb +49 -62
  85. data/lib/datadog/tracing/metadata/ext.rb +3 -0
  86. data/lib/datadog/tracing/otel_thread_context.rb +78 -9
  87. data/lib/datadog/tracing/tracer.rb +15 -2
  88. data/lib/datadog/tracing/transport/native.rb +18 -26
  89. data/lib/datadog/tracing/transport/span_events_negotiation.rb +41 -0
  90. data/lib/datadog/tracing/transport/trace_formatter.rb +13 -3
  91. data/lib/datadog/tracing/transport/traces.rb +3 -23
  92. data/lib/datadog/version.rb +1 -1
  93. metadata +25 -7
  94. data/lib/datadog/ai_guard/evaluation/content_builder.rb +0 -31
@@ -25,7 +25,9 @@ void DDTRACE_EXPORT Init_libdatadog_api(void) {
25
25
  library_config_init(core_module);
26
26
  ddsketch_init(core_module);
27
27
  feature_flags_init(core_module);
28
- di_init(datadog_module);
28
+ #ifndef TRUFFLERUBY
29
+ di_init(datadog_module);
30
+ #endif
29
31
 
30
32
  VALUE tracing_module = rb_define_module_under(datadog_module, "Tracing");
31
33
  trace_exporter_init(tracing_module);
@@ -4,7 +4,12 @@
4
4
  #include "datadog_ruby_common.h"
5
5
  #include "otel_thread_context.h"
6
6
 
7
- #ifdef __linux__
7
+ // Relies on a :fiber_switch TracePoint that TruffleRuby does not support yet
8
+ #if defined(__linux__) && !defined(TRUFFLERUBY)
9
+ #define OTEL_THREAD_CONTEXT_SUPPORTED
10
+ #endif
11
+
12
+ #ifdef OTEL_THREAD_CONTEXT_SUPPORTED
8
13
  #include <datadog/otel-thread-ctx.h>
9
14
  extern __thread const uint8_t *otel_thread_ctx_v1;
10
15
 
@@ -24,6 +29,7 @@ static ID fiber_context_slot;
24
29
  DDTRACE_UNUSED static bool otel_context_enabled = false;
25
30
 
26
31
  static VALUE native_set(VALUE _self, VALUE trace_id, VALUE span_id, VALUE local_root_span_id);
32
+ static VALUE native_clear(VALUE _self);
27
33
  static VALUE native_supported_p(VALUE _self);
28
34
  static VALUE native_enable(VALUE _self);
29
35
  static VALUE native_read(VALUE _self);
@@ -31,17 +37,18 @@ static VALUE native_read(VALUE _self);
31
37
  void otel_thread_context_init(VALUE tracing_module) {
32
38
  fiber_context_slot = rb_intern("__dd_otel_fiber_context");
33
39
 
34
- VALUE otel_thread_context_module = rb_define_module_under(tracing_module, "OTelThreadContext");
40
+ VALUE otel_thread_context_class = rb_define_class_under(tracing_module, "OTelThreadContext", rb_cObject);
35
41
 
36
- rb_define_singleton_method(otel_thread_context_module, "_native_enable", native_enable, 0);
37
- rb_define_singleton_method(otel_thread_context_module, "_native_set", native_set, 3);
38
- rb_define_singleton_method(otel_thread_context_module, "_native_supported?", native_supported_p, 0);
42
+ rb_define_method(otel_thread_context_class, "_native_enable", native_enable, 0);
43
+ rb_define_method(otel_thread_context_class, "_native_set", native_set, 3);
44
+ rb_define_method(otel_thread_context_class, "_native_clear", native_clear, 0);
45
+ rb_define_method(otel_thread_context_class, "_native_supported?", native_supported_p, 0);
39
46
 
40
- VALUE testing_module = rb_define_module_under(otel_thread_context_module, "Testing");
47
+ VALUE testing_module = rb_define_module_under(otel_thread_context_class, "Testing");
41
48
  rb_define_singleton_method(testing_module, "_native_read", native_read, 0);
42
49
  }
43
50
 
44
- #ifdef __linux__
51
+ #ifdef OTEL_THREAD_CONTEXT_SUPPORTED
45
52
  static ddog_ThreadContextHandle *get_fiber_handle_for(VALUE thread) {
46
53
  VALUE obj = rb_thread_local_aref(thread, fiber_context_slot);
47
54
 
@@ -54,6 +61,22 @@ void otel_thread_context_init(VALUE tracing_module) {
54
61
  return get_fiber_handle_for(rb_thread_current());
55
62
  }
56
63
 
64
+ static void pack_span_id(VALUE id, uint8_t bytes[8]) {
65
+ // Tracing::Utils.next_id caps generated span IDs at (1 << 62) - 1, which fits
66
+ // in a Fixnum on 64-bit Ruby. Packing them directly avoids rb_integer_pack's
67
+ // generic conversion and format checks on each context update.
68
+ // https://github.com/DataDog/dd-trace-rb/blob/0b10368e0a2940c1f4d50c9739b9973b4f8bc32a/lib/datadog/tracing/utils.rb#L20-L37
69
+ if (FIXNUM_P(id)) {
70
+ uint64_t number = (uint64_t) FIX2LONG(id);
71
+ for (int i = 7; i >= 0; i--) {
72
+ bytes[i] = (uint8_t) number;
73
+ number >>= 8;
74
+ }
75
+ } else {
76
+ rb_integer_pack(id, bytes, 1, sizeof(uint64_t), 0, INTEGER_PACK_BIG_ENDIAN);
77
+ }
78
+ }
79
+
57
80
  static void store_current_fiber_handle(ddog_ThreadContextHandle *handle) {
58
81
  VALUE obj = TypedData_Wrap_Struct(rb_cObject, &otel_ctx_handle_t, handle);
59
82
  rb_thread_local_aset(rb_thread_current(), fiber_context_slot, obj);
@@ -135,7 +158,7 @@ void otel_thread_context_init(VALUE tracing_module) {
135
158
  #endif
136
159
 
137
160
  static VALUE native_enable(DDTRACE_UNUSED VALUE _self) {
138
- #ifdef __linux__
161
+ #ifdef OTEL_THREAD_CONTEXT_SUPPORTED
139
162
  if (otel_context_enabled) return Qtrue;
140
163
  otel_context_enabled = true;
141
164
 
@@ -161,7 +184,7 @@ static VALUE native_enable(DDTRACE_UNUSED VALUE _self) {
161
184
  }
162
185
 
163
186
  static VALUE native_supported_p(DDTRACE_UNUSED VALUE _self) {
164
- #ifdef __linux__
187
+ #ifdef OTEL_THREAD_CONTEXT_SUPPORTED
165
188
  return Qtrue;
166
189
  #else
167
190
  return Qfalse;
@@ -174,17 +197,17 @@ static VALUE native_set(
174
197
  DDTRACE_UNUSED VALUE span_id,
175
198
  DDTRACE_UNUSED VALUE local_root_span_id
176
199
  ) {
177
- #ifdef __linux__
200
+ #ifdef OTEL_THREAD_CONTEXT_SUPPORTED
178
201
  if (!otel_context_enabled) return Qfalse;
179
202
 
180
203
  uint8_t trace_id_bytes[16];
181
204
  uint8_t span_id_bytes[8];
182
205
  uint8_t local_root_span_id_bytes[8];
183
206
 
184
- const int BIG_ENDIAN_PACK_FLAGS = INTEGER_PACK_MSWORD_FIRST | INTEGER_PACK_BIG_ENDIAN;
185
- rb_integer_pack(trace_id, trace_id_bytes, sizeof(trace_id_bytes), 1, 0, BIG_ENDIAN_PACK_FLAGS);
186
- rb_integer_pack(span_id, span_id_bytes, sizeof(span_id_bytes), 1, 0, BIG_ENDIAN_PACK_FLAGS);
187
- rb_integer_pack(local_root_span_id, local_root_span_id_bytes, sizeof(local_root_span_id_bytes), 1, 0, BIG_ENDIAN_PACK_FLAGS);
207
+ // Note: We use 2 words of size 8, as `rb_integer_pack` has a fast path for it (vs 16 bytes of size 1)
208
+ rb_integer_pack(trace_id, trace_id_bytes, 2, sizeof(uint64_t), 0, INTEGER_PACK_BIG_ENDIAN);
209
+ pack_span_id(span_id, span_id_bytes);
210
+ pack_span_id(local_root_span_id, local_root_span_id_bytes);
188
211
 
189
212
  ddog_ThreadContextHandle *handle = get_current_fiber_handle();
190
213
 
@@ -204,8 +227,21 @@ static VALUE native_set(
204
227
  #endif
205
228
  }
206
229
 
230
+ static VALUE native_clear(DDTRACE_UNUSED VALUE _self) {
231
+ #ifdef OTEL_THREAD_CONTEXT_SUPPORTED
232
+ if (!otel_context_enabled) return Qfalse;
233
+
234
+ ddog_ThreadContextHandle *detached = ddog_otel_thread_ctx_detach();
235
+ rb_thread_local_aset(rb_thread_current(), fiber_context_slot, Qnil);
236
+
237
+ return detached == NULL ? Qfalse : Qtrue;
238
+ #else
239
+ return Qfalse;
240
+ #endif
241
+ }
242
+
207
243
  static VALUE native_read(DDTRACE_UNUSED VALUE _self) {
208
- #ifdef __linux__
244
+ #ifdef OTEL_THREAD_CONTEXT_SUPPORTED
209
245
  const uint8_t *raw = otel_thread_ctx_v1;
210
246
  if (!raw) return Qnil;
211
247