datadog 2.8.0 → 2.10.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 (128) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +62 -1
  3. data/ext/datadog_profiling_native_extension/clock_id.h +2 -2
  4. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +66 -56
  5. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  6. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +1 -1
  7. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +16 -16
  8. data/ext/datadog_profiling_native_extension/collectors_stack.c +7 -7
  9. data/ext/datadog_profiling_native_extension/collectors_stack.h +2 -2
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +221 -127
  11. data/ext/datadog_profiling_native_extension/heap_recorder.c +50 -92
  12. data/ext/datadog_profiling_native_extension/heap_recorder.h +2 -2
  13. data/ext/datadog_profiling_native_extension/http_transport.c +4 -4
  14. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +3 -0
  15. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +3 -1
  16. data/ext/datadog_profiling_native_extension/profiling.c +10 -8
  17. data/ext/datadog_profiling_native_extension/ruby_helpers.c +8 -8
  18. data/ext/datadog_profiling_native_extension/stack_recorder.c +63 -76
  19. data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -2
  20. data/ext/datadog_profiling_native_extension/time_helpers.h +1 -1
  21. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +47 -0
  22. data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +31 -0
  23. data/ext/libdatadog_api/crashtracker.c +3 -0
  24. data/lib/datadog/appsec/actions_handler.rb +27 -0
  25. data/lib/datadog/appsec/assets/waf_rules/recommended.json +355 -157
  26. data/lib/datadog/appsec/assets/waf_rules/strict.json +62 -32
  27. data/lib/datadog/appsec/component.rb +14 -8
  28. data/lib/datadog/appsec/configuration/settings.rb +9 -0
  29. data/lib/datadog/appsec/context.rb +74 -0
  30. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +12 -8
  31. data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +6 -6
  32. data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +4 -4
  33. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +1 -7
  34. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +20 -30
  35. data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +6 -6
  36. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +3 -3
  37. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +67 -96
  38. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +11 -11
  39. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +6 -6
  40. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +7 -7
  41. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +10 -11
  42. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +43 -60
  43. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +23 -33
  44. data/lib/datadog/appsec/contrib/rails/patcher.rb +4 -14
  45. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +7 -7
  46. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +45 -65
  47. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +5 -28
  48. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +6 -6
  49. data/lib/datadog/appsec/event.rb +6 -6
  50. data/lib/datadog/appsec/ext.rb +8 -1
  51. data/lib/datadog/appsec/metrics/collector.rb +38 -0
  52. data/lib/datadog/appsec/metrics/exporter.rb +35 -0
  53. data/lib/datadog/appsec/metrics/telemetry.rb +23 -0
  54. data/lib/datadog/appsec/metrics.rb +13 -0
  55. data/lib/datadog/appsec/monitor/gateway/watcher.rb +23 -32
  56. data/lib/datadog/appsec/monitor/reactive/set_user.rb +6 -6
  57. data/lib/datadog/appsec/processor/rule_loader.rb +0 -3
  58. data/lib/datadog/appsec/processor.rb +4 -3
  59. data/lib/datadog/appsec/response.rb +18 -80
  60. data/lib/datadog/appsec/security_engine/result.rb +67 -0
  61. data/lib/datadog/appsec/security_engine/runner.rb +88 -0
  62. data/lib/datadog/appsec/security_engine.rb +9 -0
  63. data/lib/datadog/appsec.rb +17 -8
  64. data/lib/datadog/auto_instrument.rb +3 -0
  65. data/lib/datadog/core/configuration/agent_settings_resolver.rb +39 -11
  66. data/lib/datadog/core/configuration/components.rb +4 -2
  67. data/lib/datadog/core/configuration.rb +1 -1
  68. data/lib/datadog/{tracing → core}/contrib/rails/utils.rb +1 -3
  69. data/lib/datadog/core/crashtracking/component.rb +1 -3
  70. data/lib/datadog/core/telemetry/event.rb +87 -3
  71. data/lib/datadog/core/telemetry/logging.rb +2 -2
  72. data/lib/datadog/core/telemetry/metric.rb +22 -0
  73. data/lib/datadog/core/telemetry/worker.rb +33 -0
  74. data/lib/datadog/di/base.rb +115 -0
  75. data/lib/datadog/di/code_tracker.rb +7 -4
  76. data/lib/datadog/di/component.rb +19 -11
  77. data/lib/datadog/di/configuration/settings.rb +11 -1
  78. data/lib/datadog/di/contrib/railtie.rb +15 -0
  79. data/lib/datadog/di/contrib.rb +26 -0
  80. data/lib/datadog/di/error.rb +5 -0
  81. data/lib/datadog/di/instrumenter.rb +39 -18
  82. data/lib/datadog/di/{init.rb → preload.rb} +2 -4
  83. data/lib/datadog/di/probe_manager.rb +4 -4
  84. data/lib/datadog/di/probe_notification_builder.rb +22 -2
  85. data/lib/datadog/di/probe_notifier_worker.rb +5 -6
  86. data/lib/datadog/di/redactor.rb +0 -1
  87. data/lib/datadog/di/remote.rb +30 -9
  88. data/lib/datadog/di/transport.rb +2 -4
  89. data/lib/datadog/di.rb +5 -108
  90. data/lib/datadog/kit/appsec/events.rb +3 -3
  91. data/lib/datadog/kit/identity.rb +4 -4
  92. data/lib/datadog/profiling/component.rb +55 -53
  93. data/lib/datadog/profiling/http_transport.rb +1 -26
  94. data/lib/datadog/tracing/contrib/action_cable/integration.rb +5 -2
  95. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +6 -2
  96. data/lib/datadog/tracing/contrib/action_pack/integration.rb +5 -2
  97. data/lib/datadog/tracing/contrib/action_view/integration.rb +5 -2
  98. data/lib/datadog/tracing/contrib/active_job/integration.rb +5 -2
  99. data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -2
  100. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +3 -1
  101. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +3 -1
  102. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +10 -0
  103. data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -2
  104. data/lib/datadog/tracing/contrib/auto_instrument.rb +2 -2
  105. data/lib/datadog/tracing/contrib/aws/integration.rb +3 -0
  106. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -0
  107. data/lib/datadog/tracing/contrib/extensions.rb +15 -3
  108. data/lib/datadog/tracing/contrib/http/integration.rb +3 -0
  109. data/lib/datadog/tracing/contrib/httprb/integration.rb +3 -0
  110. data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -0
  111. data/lib/datadog/tracing/contrib/mongodb/integration.rb +3 -0
  112. data/lib/datadog/tracing/contrib/opensearch/integration.rb +3 -0
  113. data/lib/datadog/tracing/contrib/presto/integration.rb +3 -0
  114. data/lib/datadog/tracing/contrib/rack/integration.rb +2 -2
  115. data/lib/datadog/tracing/contrib/rails/framework.rb +2 -2
  116. data/lib/datadog/tracing/contrib/rails/patcher.rb +1 -1
  117. data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -0
  118. data/lib/datadog/tracing/span.rb +12 -4
  119. data/lib/datadog/tracing/span_event.rb +123 -3
  120. data/lib/datadog/tracing/span_operation.rb +6 -0
  121. data/lib/datadog/tracing/transport/serializable_trace.rb +24 -6
  122. data/lib/datadog/version.rb +1 -1
  123. metadata +40 -17
  124. data/lib/datadog/appsec/contrib/sinatra/ext.rb +0 -14
  125. data/lib/datadog/appsec/processor/context.rb +0 -107
  126. data/lib/datadog/appsec/reactive/operation.rb +0 -68
  127. data/lib/datadog/appsec/scope.rb +0 -58
  128. data/lib/datadog/core/crashtracking/agent_base_url.rb +0 -21
@@ -21,15 +21,15 @@
21
21
  typedef enum { ACTION_WAIT, ACTION_RUN, ACTION_STOP } action;
22
22
 
23
23
  // Contains state for a single CpuAndWallTimeWorker instance
24
- struct idle_sampling_loop_state {
24
+ typedef struct {
25
25
  pthread_mutex_t wakeup_mutex;
26
26
  pthread_cond_t wakeup;
27
27
  action requested_action;
28
28
  void (*run_action_function)(void);
29
- };
29
+ } idle_sampling_loop_state;
30
30
 
31
31
  static VALUE _native_new(VALUE klass);
32
- static void reset_state(struct idle_sampling_loop_state *state);
32
+ static void reset_state(idle_sampling_loop_state *state);
33
33
  static VALUE _native_idle_sampling_loop(DDTRACE_UNUSED VALUE self, VALUE self_instance);
34
34
  static VALUE _native_stop(DDTRACE_UNUSED VALUE self, VALUE self_instance);
35
35
  static void *run_idle_sampling_loop(void *state_ptr);
@@ -62,7 +62,7 @@ void collectors_idle_sampling_helper_init(VALUE profiling_module) {
62
62
  rb_define_singleton_method(testing_module, "_native_idle_sampling_helper_request_action", _native_idle_sampling_helper_request_action, 1);
63
63
  }
64
64
 
65
- // This structure is used to define a Ruby object that stores a pointer to a struct idle_sampling_loop_state
65
+ // This structure is used to define a Ruby object that stores a pointer to a idle_sampling_loop_state
66
66
  // See also https://github.com/ruby/ruby/blob/master/doc/extension.rdoc for how this works
67
67
  static const rb_data_type_t idle_sampling_helper_typed_data = {
68
68
  .wrap_struct_name = "Datadog::Profiling::Collectors::IdleSamplingHelper",
@@ -76,7 +76,7 @@ static const rb_data_type_t idle_sampling_helper_typed_data = {
76
76
  };
77
77
 
78
78
  static VALUE _native_new(VALUE klass) {
79
- struct idle_sampling_loop_state *state = ruby_xcalloc(1, sizeof(struct idle_sampling_loop_state));
79
+ idle_sampling_loop_state *state = ruby_xcalloc(1, sizeof(idle_sampling_loop_state));
80
80
 
81
81
  // Note: Any exceptions raised from this note until the TypedData_Wrap_Struct call will lead to the state memory
82
82
  // being leaked.
@@ -90,7 +90,7 @@ static VALUE _native_new(VALUE klass) {
90
90
  return TypedData_Wrap_Struct(klass, &idle_sampling_helper_typed_data, state);
91
91
  }
92
92
 
93
- static void reset_state(struct idle_sampling_loop_state *state) {
93
+ static void reset_state(idle_sampling_loop_state *state) {
94
94
  state->wakeup_mutex = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER;
95
95
  state->wakeup = (pthread_cond_t) PTHREAD_COND_INITIALIZER;
96
96
  state->requested_action = ACTION_WAIT;
@@ -101,8 +101,8 @@ static void reset_state(struct idle_sampling_loop_state *state) {
101
101
  // a pristine state before recreating the worker thread (this includes resetting the mutex in case it was left
102
102
  // locked halfway through the VM forking)
103
103
  static VALUE _native_reset(DDTRACE_UNUSED VALUE self, VALUE self_instance) {
104
- struct idle_sampling_loop_state *state;
105
- TypedData_Get_Struct(self_instance, struct idle_sampling_loop_state, &idle_sampling_helper_typed_data, state);
104
+ idle_sampling_loop_state *state;
105
+ TypedData_Get_Struct(self_instance, idle_sampling_loop_state, &idle_sampling_helper_typed_data, state);
106
106
 
107
107
  reset_state(state);
108
108
 
@@ -110,8 +110,8 @@ static VALUE _native_reset(DDTRACE_UNUSED VALUE self, VALUE self_instance) {
110
110
  }
111
111
 
112
112
  static VALUE _native_idle_sampling_loop(DDTRACE_UNUSED VALUE self, VALUE self_instance) {
113
- struct idle_sampling_loop_state *state;
114
- TypedData_Get_Struct(self_instance, struct idle_sampling_loop_state, &idle_sampling_helper_typed_data, state);
113
+ idle_sampling_loop_state *state;
114
+ TypedData_Get_Struct(self_instance, idle_sampling_loop_state, &idle_sampling_helper_typed_data, state);
115
115
 
116
116
  // Release GVL and run the loop waiting for requests
117
117
  rb_thread_call_without_gvl(run_idle_sampling_loop, state, interrupt_idle_sampling_loop, state);
@@ -120,7 +120,7 @@ static VALUE _native_idle_sampling_loop(DDTRACE_UNUSED VALUE self, VALUE self_in
120
120
  }
121
121
 
122
122
  static void *run_idle_sampling_loop(void *state_ptr) {
123
- struct idle_sampling_loop_state *state = (struct idle_sampling_loop_state *) state_ptr;
123
+ idle_sampling_loop_state *state = (idle_sampling_loop_state *) state_ptr;
124
124
  int error = 0;
125
125
 
126
126
  while (true) {
@@ -164,7 +164,7 @@ static void *run_idle_sampling_loop(void *state_ptr) {
164
164
  }
165
165
 
166
166
  static void interrupt_idle_sampling_loop(void *state_ptr) {
167
- struct idle_sampling_loop_state *state = (struct idle_sampling_loop_state *) state_ptr;
167
+ idle_sampling_loop_state *state = (idle_sampling_loop_state *) state_ptr;
168
168
  int error = 0;
169
169
 
170
170
  // Note about the error handling in this situation: Something bad happening at this stage is really really awkward to
@@ -189,8 +189,8 @@ static void interrupt_idle_sampling_loop(void *state_ptr) {
189
189
  }
190
190
 
191
191
  static VALUE _native_stop(DDTRACE_UNUSED VALUE self, VALUE self_instance) {
192
- struct idle_sampling_loop_state *state;
193
- TypedData_Get_Struct(self_instance, struct idle_sampling_loop_state, &idle_sampling_helper_typed_data, state);
192
+ idle_sampling_loop_state *state;
193
+ TypedData_Get_Struct(self_instance, idle_sampling_loop_state, &idle_sampling_helper_typed_data, state);
194
194
 
195
195
  ENFORCE_SUCCESS_GVL(pthread_mutex_lock(&state->wakeup_mutex));
196
196
  state->requested_action = ACTION_STOP;
@@ -204,12 +204,12 @@ static VALUE _native_stop(DDTRACE_UNUSED VALUE self, VALUE self_instance) {
204
204
 
205
205
  // Assumption: Function gets called without the global VM lock
206
206
  void idle_sampling_helper_request_action(VALUE self_instance, void (*run_action_function)(void)) {
207
- struct idle_sampling_loop_state *state;
207
+ idle_sampling_loop_state *state;
208
208
  if (!rb_typeddata_is_kind_of(self_instance, &idle_sampling_helper_typed_data)) {
209
209
  grab_gvl_and_raise(rb_eTypeError, "Wrong argument for idle_sampling_helper_request_action");
210
210
  }
211
211
  // This should never fail the the above check passes
212
- TypedData_Get_Struct(self_instance, struct idle_sampling_loop_state, &idle_sampling_helper_typed_data, state);
212
+ TypedData_Get_Struct(self_instance, idle_sampling_loop_state, &idle_sampling_helper_typed_data, state);
213
213
 
214
214
  ENFORCE_SUCCESS_NO_GVL(pthread_mutex_lock(&state->wakeup_mutex));
215
215
  if (state->requested_action == ACTION_WAIT) {
@@ -14,11 +14,11 @@
14
14
  static VALUE missing_string = Qnil;
15
15
 
16
16
  // Used as scratch space during sampling
17
- struct sampling_buffer {
17
+ struct sampling_buffer { // Note: typedef'd in the header to sampling_buffer
18
18
  uint16_t max_frames;
19
19
  ddog_prof_Location *locations;
20
20
  frame_info *stack_buffer;
21
- }; // Note: typedef'd in the header to sampling_buffer
21
+ };
22
22
 
23
23
  static VALUE _native_sample(int argc, VALUE *argv, DDTRACE_UNUSED VALUE _self);
24
24
  static VALUE native_sample_do(VALUE args);
@@ -44,7 +44,7 @@ void collectors_stack_init(VALUE profiling_module) {
44
44
  rb_global_variable(&missing_string);
45
45
  }
46
46
 
47
- struct native_sample_args {
47
+ typedef struct {
48
48
  VALUE in_gc;
49
49
  VALUE recorder_instance;
50
50
  sample_values values;
@@ -52,7 +52,7 @@ struct native_sample_args {
52
52
  VALUE thread;
53
53
  ddog_prof_Location *locations;
54
54
  sampling_buffer *buffer;
55
- };
55
+ } native_sample_args;
56
56
 
57
57
  // This method exists only to enable testing Datadog::Profiling::Collectors::Stack behavior using RSpec.
58
58
  // It SHOULD NOT be used for other purposes.
@@ -123,7 +123,7 @@ static VALUE _native_sample(int argc, VALUE *argv, DDTRACE_UNUSED VALUE _self) {
123
123
 
124
124
  ddog_prof_Slice_Label slice_labels = {.ptr = labels, .len = labels_count};
125
125
 
126
- struct native_sample_args args_struct = {
126
+ native_sample_args args_struct = {
127
127
  .in_gc = in_gc,
128
128
  .recorder_instance = recorder_instance,
129
129
  .values = values,
@@ -137,7 +137,7 @@ static VALUE _native_sample(int argc, VALUE *argv, DDTRACE_UNUSED VALUE _self) {
137
137
  }
138
138
 
139
139
  static VALUE native_sample_do(VALUE args) {
140
- struct native_sample_args *args_struct = (struct native_sample_args *) args;
140
+ native_sample_args *args_struct = (native_sample_args *) args;
141
141
 
142
142
  if (args_struct->in_gc == Qtrue) {
143
143
  record_placeholder_stack(
@@ -160,7 +160,7 @@ static VALUE native_sample_do(VALUE args) {
160
160
  }
161
161
 
162
162
  static VALUE native_sample_ensure(VALUE args) {
163
- struct native_sample_args *args_struct = (struct native_sample_args *) args;
163
+ native_sample_args *args_struct = (native_sample_args *) args;
164
164
 
165
165
  ruby_xfree(args_struct->locations);
166
166
  sampling_buffer_free(args_struct->buffer);
@@ -4,8 +4,8 @@
4
4
 
5
5
  #include "stack_recorder.h"
6
6
 
7
- #define MAX_FRAMES_LIMIT 10000
8
- #define MAX_FRAMES_LIMIT_AS_STRING "10000"
7
+ #define MAX_FRAMES_LIMIT 3000
8
+ #define MAX_FRAMES_LIMIT_AS_STRING "3000"
9
9
 
10
10
  typedef struct sampling_buffer sampling_buffer;
11
11