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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +62 -1
- data/ext/datadog_profiling_native_extension/clock_id.h +2 -2
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +66 -56
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
- data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.h +1 -1
- data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +16 -16
- data/ext/datadog_profiling_native_extension/collectors_stack.c +7 -7
- data/ext/datadog_profiling_native_extension/collectors_stack.h +2 -2
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +221 -127
- data/ext/datadog_profiling_native_extension/heap_recorder.c +50 -92
- data/ext/datadog_profiling_native_extension/heap_recorder.h +2 -2
- data/ext/datadog_profiling_native_extension/http_transport.c +4 -4
- data/ext/datadog_profiling_native_extension/private_vm_api_access.c +3 -0
- data/ext/datadog_profiling_native_extension/private_vm_api_access.h +3 -1
- data/ext/datadog_profiling_native_extension/profiling.c +10 -8
- data/ext/datadog_profiling_native_extension/ruby_helpers.c +8 -8
- data/ext/datadog_profiling_native_extension/stack_recorder.c +63 -76
- data/ext/datadog_profiling_native_extension/stack_recorder.h +2 -2
- data/ext/datadog_profiling_native_extension/time_helpers.h +1 -1
- data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.c +47 -0
- data/ext/datadog_profiling_native_extension/unsafe_api_calls_check.h +31 -0
- data/ext/libdatadog_api/crashtracker.c +3 -0
- data/lib/datadog/appsec/actions_handler.rb +27 -0
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +355 -157
- data/lib/datadog/appsec/assets/waf_rules/strict.json +62 -32
- data/lib/datadog/appsec/component.rb +14 -8
- data/lib/datadog/appsec/configuration/settings.rb +9 -0
- data/lib/datadog/appsec/context.rb +74 -0
- data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +12 -8
- data/lib/datadog/appsec/contrib/devise/patcher/authenticatable_patch.rb +6 -6
- data/lib/datadog/appsec/contrib/devise/patcher/registration_controller_patch.rb +4 -4
- data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +1 -7
- data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +20 -30
- data/lib/datadog/appsec/contrib/graphql/reactive/multiplex.rb +6 -6
- data/lib/datadog/appsec/contrib/rack/gateway/response.rb +3 -3
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +67 -96
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +11 -11
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +6 -6
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +7 -7
- data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +10 -11
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +43 -60
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +23 -33
- data/lib/datadog/appsec/contrib/rails/patcher.rb +4 -14
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +7 -7
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +45 -65
- data/lib/datadog/appsec/contrib/sinatra/patcher.rb +5 -28
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +6 -6
- data/lib/datadog/appsec/event.rb +6 -6
- data/lib/datadog/appsec/ext.rb +8 -1
- data/lib/datadog/appsec/metrics/collector.rb +38 -0
- data/lib/datadog/appsec/metrics/exporter.rb +35 -0
- data/lib/datadog/appsec/metrics/telemetry.rb +23 -0
- data/lib/datadog/appsec/metrics.rb +13 -0
- data/lib/datadog/appsec/monitor/gateway/watcher.rb +23 -32
- data/lib/datadog/appsec/monitor/reactive/set_user.rb +6 -6
- data/lib/datadog/appsec/processor/rule_loader.rb +0 -3
- data/lib/datadog/appsec/processor.rb +4 -3
- data/lib/datadog/appsec/response.rb +18 -80
- data/lib/datadog/appsec/security_engine/result.rb +67 -0
- data/lib/datadog/appsec/security_engine/runner.rb +88 -0
- data/lib/datadog/appsec/security_engine.rb +9 -0
- data/lib/datadog/appsec.rb +17 -8
- data/lib/datadog/auto_instrument.rb +3 -0
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +39 -11
- data/lib/datadog/core/configuration/components.rb +4 -2
- data/lib/datadog/core/configuration.rb +1 -1
- data/lib/datadog/{tracing → core}/contrib/rails/utils.rb +1 -3
- data/lib/datadog/core/crashtracking/component.rb +1 -3
- data/lib/datadog/core/telemetry/event.rb +87 -3
- data/lib/datadog/core/telemetry/logging.rb +2 -2
- data/lib/datadog/core/telemetry/metric.rb +22 -0
- data/lib/datadog/core/telemetry/worker.rb +33 -0
- data/lib/datadog/di/base.rb +115 -0
- data/lib/datadog/di/code_tracker.rb +7 -4
- data/lib/datadog/di/component.rb +19 -11
- data/lib/datadog/di/configuration/settings.rb +11 -1
- data/lib/datadog/di/contrib/railtie.rb +15 -0
- data/lib/datadog/di/contrib.rb +26 -0
- data/lib/datadog/di/error.rb +5 -0
- data/lib/datadog/di/instrumenter.rb +39 -18
- data/lib/datadog/di/{init.rb → preload.rb} +2 -4
- data/lib/datadog/di/probe_manager.rb +4 -4
- data/lib/datadog/di/probe_notification_builder.rb +22 -2
- data/lib/datadog/di/probe_notifier_worker.rb +5 -6
- data/lib/datadog/di/redactor.rb +0 -1
- data/lib/datadog/di/remote.rb +30 -9
- data/lib/datadog/di/transport.rb +2 -4
- data/lib/datadog/di.rb +5 -108
- data/lib/datadog/kit/appsec/events.rb +3 -3
- data/lib/datadog/kit/identity.rb +4 -4
- data/lib/datadog/profiling/component.rb +55 -53
- data/lib/datadog/profiling/http_transport.rb +1 -26
- data/lib/datadog/tracing/contrib/action_cable/integration.rb +5 -2
- data/lib/datadog/tracing/contrib/action_mailer/integration.rb +6 -2
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +5 -2
- data/lib/datadog/tracing/contrib/action_view/integration.rb +5 -2
- data/lib/datadog/tracing/contrib/active_job/integration.rb +5 -2
- data/lib/datadog/tracing/contrib/active_record/integration.rb +6 -2
- data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +3 -1
- data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +3 -1
- data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +10 -0
- data/lib/datadog/tracing/contrib/active_support/integration.rb +5 -2
- data/lib/datadog/tracing/contrib/auto_instrument.rb +2 -2
- data/lib/datadog/tracing/contrib/aws/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/extensions.rb +15 -3
- data/lib/datadog/tracing/contrib/http/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/httprb/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/kafka/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/mongodb/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/opensearch/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/presto/integration.rb +3 -0
- data/lib/datadog/tracing/contrib/rack/integration.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/framework.rb +2 -2
- data/lib/datadog/tracing/contrib/rails/patcher.rb +1 -1
- data/lib/datadog/tracing/contrib/rest_client/integration.rb +3 -0
- data/lib/datadog/tracing/span.rb +12 -4
- data/lib/datadog/tracing/span_event.rb +123 -3
- data/lib/datadog/tracing/span_operation.rb +6 -0
- data/lib/datadog/tracing/transport/serializable_trace.rb +24 -6
- data/lib/datadog/version.rb +1 -1
- metadata +40 -17
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +0 -14
- data/lib/datadog/appsec/processor/context.rb +0 -107
- data/lib/datadog/appsec/reactive/operation.rb +0 -68
- data/lib/datadog/appsec/scope.rb +0 -58
- 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
|
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(
|
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
|
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
|
-
|
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(
|
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
|
-
|
105
|
-
TypedData_Get_Struct(self_instance,
|
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
|
-
|
114
|
-
TypedData_Get_Struct(self_instance,
|
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
|
-
|
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
|
-
|
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
|
-
|
193
|
-
TypedData_Get_Struct(self_instance,
|
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
|
-
|
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,
|
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
|
-
};
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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);
|