ddtrace 1.8.0 → 1.9.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 +51 -1
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +10 -10
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +32 -32
- data/ext/ddtrace_profiling_native_extension/collectors_stack.h +2 -2
- data/ext/ddtrace_profiling_native_extension/http_transport.c +50 -49
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +5 -1
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +34 -12
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +10 -0
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +32 -32
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +4 -4
- data/lib/datadog/appsec/assets/waf_rules/recommended.json +75 -8
- data/lib/datadog/appsec/assets/waf_rules/risky.json +1 -1
- data/lib/datadog/appsec/assets/waf_rules/strict.json +1 -1
- data/lib/datadog/appsec/assets.rb +1 -1
- data/lib/datadog/appsec/configuration/settings.rb +35 -22
- data/lib/datadog/appsec/configuration.rb +4 -2
- data/lib/datadog/appsec/contrib/auto_instrument.rb +1 -1
- data/lib/datadog/appsec/contrib/configuration/settings.rb +1 -1
- data/lib/datadog/appsec/contrib/integration.rb +1 -1
- data/lib/datadog/appsec/contrib/patcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/configuration/settings.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/reactive/request.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/reactive/response.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/request.rb +1 -1
- data/lib/datadog/appsec/contrib/rack/response.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/configuration/settings.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/framework.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/reactive/action.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/request.rb +1 -1
- data/lib/datadog/appsec/contrib/rails/request_middleware.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/configuration/settings.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/ext.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/framework.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +1 -1
- data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +1 -1
- data/lib/datadog/appsec/event.rb +1 -1
- data/lib/datadog/appsec/extensions.rb +36 -26
- data/lib/datadog/appsec/instrumentation/gateway.rb +3 -3
- data/lib/datadog/appsec/processor.rb +15 -19
- data/lib/datadog/appsec/rate_limiter.rb +1 -1
- data/lib/datadog/appsec/reactive/address_hash.rb +1 -1
- data/lib/datadog/appsec/reactive/engine.rb +1 -1
- data/lib/datadog/appsec/reactive/operation.rb +2 -2
- data/lib/datadog/appsec/reactive/subscriber.rb +1 -1
- data/lib/datadog/appsec/response.rb +18 -9
- data/lib/datadog/appsec/utils/http/media_range.rb +201 -0
- data/lib/datadog/appsec/utils/http/media_type.rb +87 -0
- data/lib/datadog/appsec/utils/http.rb +9 -0
- data/lib/datadog/appsec/utils.rb +7 -0
- data/lib/datadog/appsec.rb +1 -1
- data/lib/datadog/ci/ext/environment.rb +57 -13
- data/lib/datadog/core/configuration/agent_settings_resolver.rb +2 -2
- data/lib/datadog/core/configuration/base.rb +3 -0
- data/lib/datadog/core/configuration/ext.rb +8 -0
- data/lib/datadog/core/configuration/option_definition.rb +11 -2
- data/lib/datadog/core/configuration/settings.rb +6 -4
- data/lib/datadog/core/diagnostics/environment_logger.rb +4 -3
- data/lib/datadog/core/metrics/client.rb +3 -2
- data/lib/datadog/core/metrics/ext.rb +0 -2
- data/lib/datadog/core/telemetry/collector.rb +1 -0
- data/lib/datadog/kit/appsec/events.rb +75 -0
- data/lib/datadog/kit/enable_core_dumps.rb +1 -0
- data/lib/datadog/kit/identity.rb +8 -7
- data/lib/datadog/opentelemetry/api/context.rb +187 -0
- data/lib/datadog/opentelemetry/api/trace/span.rb +15 -0
- data/lib/datadog/opentelemetry/sdk/configurator.rb +38 -0
- data/lib/datadog/opentelemetry/sdk/id_generator.rb +27 -0
- data/lib/datadog/opentelemetry/sdk/propagator.rb +91 -0
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +92 -0
- data/lib/datadog/opentelemetry.rb +48 -0
- data/lib/datadog/tracing/configuration/ext.rb +1 -2
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +5 -0
- data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +10 -3
- data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +3 -6
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +5 -0
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +3 -4
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +5 -0
- data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +3 -4
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +44 -31
- data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +33 -0
- data/lib/datadog/tracing/contrib/stripe/ext.rb +26 -0
- data/lib/datadog/tracing/contrib/stripe/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/stripe/patcher.rb +29 -0
- data/lib/datadog/tracing/contrib/stripe/request.rb +67 -0
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +16 -7
- data/lib/datadog/tracing/metadata/tagging.rb +6 -0
- data/lib/datadog/tracing/trace_digest.rb +17 -7
- data/lib/datadog/tracing/trace_operation.rb +8 -0
- data/lib/ddtrace/version.rb +1 -1
- metadata +23 -6
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1ba4a81593411a12abfa1665b3910e49e35429b1b266779e93accb0f84a478d2
|
|
4
|
+
data.tar.gz: e72362dc1a1e682a3c52b8af8017fcd12e60d353843cdd129f65a55dbb0c312d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: a083b23cfadccc78e67a5aa2a3ae067bc868e4721d92d1fb9fcbadc7536332fabd20f6638fb157712e5e909afd3e3e505a2011838a4f0e98dbebaa64a38f7db6
|
|
7
|
+
data.tar.gz: 81b27dbbf685c01ee99ab79a8774aefca4a2feb93363a41e1a3465b01b1b07f571d5bdd75a73880658ae05254a3d742651bdf8df98fd48c040f73bb6a16702d0
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,37 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [1.9.0] - 2023-01-30
|
|
6
|
+
|
|
7
|
+
As of ddtrace 1.9.0, CPU Profiling 2.0 is now in opt-in (that is, disabled by default) public beta. For more details, check the release notes.
|
|
8
|
+
|
|
9
|
+
Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v1.9.0
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
* Tracing: Add `Stripe` instrumentation ([#2557][])
|
|
14
|
+
* Tracing: Add configurable response codes considered as errors for `Net/HTTP`, `httprb` and `httpclient` ([#2501][], [#2576][])([@caramcc][])
|
|
15
|
+
* Tracing: Flexible header matching for HTTP propagator ([#2504][])
|
|
16
|
+
* Tracing: `OpenTelemetry` Traces support ([#2496][])
|
|
17
|
+
* Tracing: W3C: Propagate unknown values as-is ([#2485][])
|
|
18
|
+
* Appsec: Add event kit API ([#2512][])
|
|
19
|
+
* Profiling: Allow profiler development on arm64 macOS ([#2573][])
|
|
20
|
+
* Core: Add `profiling_enabled` state to environment logger output ([#2541][])
|
|
21
|
+
* Core: Add 'type' to `OptionDefinition` ([#2493][])
|
|
22
|
+
* Allow `debase-ruby_core_source` 3.2.0 to be used ([#2526][])
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
* Profiling: Upgrade to `libdatadog` to `1.0.1.1.0` ([#2530][])
|
|
27
|
+
* Appsec: Update appsec rules `1.4.3` ([#2580][])
|
|
28
|
+
* Ci: Update CI Visibility metadata extraction ([#2586][])
|
|
29
|
+
|
|
30
|
+
### Fixed
|
|
31
|
+
|
|
32
|
+
* Profiling: Fix wrong `libdatadog` version being picked during profiler build ([#2531][])
|
|
33
|
+
* Tracing: Support `PG` calls with a block ([#2522][])
|
|
34
|
+
* Ci: Fix error in `teamcity` env vars ([#2562][])
|
|
35
|
+
|
|
5
36
|
## [1.8.0] - 2022-12-14
|
|
6
37
|
|
|
7
38
|
Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v1.8.0
|
|
@@ -2250,7 +2281,8 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
|
|
|
2250
2281
|
|
|
2251
2282
|
Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
2252
2283
|
|
|
2253
|
-
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.
|
|
2284
|
+
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.9.0...master
|
|
2285
|
+
[1.9.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.8.0...v1.9.0
|
|
2254
2286
|
[1.8.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.7.0...v1.8.0
|
|
2255
2287
|
[1.7.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.6.1...v1.7.0
|
|
2256
2288
|
[1.6.1]: https://github.com/DataDog/dd-trace-rb/compare/v1.6.0...v1.6.1
|
|
@@ -3210,7 +3242,24 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
3210
3242
|
[#2469]: https://github.com/DataDog/dd-trace-rb/issues/2469
|
|
3211
3243
|
[#2470]: https://github.com/DataDog/dd-trace-rb/issues/2470
|
|
3212
3244
|
[#2473]: https://github.com/DataDog/dd-trace-rb/issues/2473
|
|
3245
|
+
[#2485]: https://github.com/DataDog/dd-trace-rb/issues/2485
|
|
3213
3246
|
[#2489]: https://github.com/DataDog/dd-trace-rb/issues/2489
|
|
3247
|
+
[#2493]: https://github.com/DataDog/dd-trace-rb/issues/2493
|
|
3248
|
+
[#2496]: https://github.com/DataDog/dd-trace-rb/issues/2496
|
|
3249
|
+
[#2501]: https://github.com/DataDog/dd-trace-rb/issues/2501
|
|
3250
|
+
[#2504]: https://github.com/DataDog/dd-trace-rb/issues/2504
|
|
3251
|
+
[#2512]: https://github.com/DataDog/dd-trace-rb/issues/2512
|
|
3252
|
+
[#2522]: https://github.com/DataDog/dd-trace-rb/issues/2522
|
|
3253
|
+
[#2526]: https://github.com/DataDog/dd-trace-rb/issues/2526
|
|
3254
|
+
[#2530]: https://github.com/DataDog/dd-trace-rb/issues/2530
|
|
3255
|
+
[#2531]: https://github.com/DataDog/dd-trace-rb/issues/2531
|
|
3256
|
+
[#2541]: https://github.com/DataDog/dd-trace-rb/issues/2541
|
|
3257
|
+
[#2557]: https://github.com/DataDog/dd-trace-rb/issues/2557
|
|
3258
|
+
[#2562]: https://github.com/DataDog/dd-trace-rb/issues/2562
|
|
3259
|
+
[#2573]: https://github.com/DataDog/dd-trace-rb/issues/2573
|
|
3260
|
+
[#2576]: https://github.com/DataDog/dd-trace-rb/issues/2576
|
|
3261
|
+
[#2580]: https://github.com/DataDog/dd-trace-rb/issues/2580
|
|
3262
|
+
[#2586]: https://github.com/DataDog/dd-trace-rb/issues/2586
|
|
3214
3263
|
[@AdrianLC]: https://github.com/AdrianLC
|
|
3215
3264
|
[@Azure7111]: https://github.com/Azure7111
|
|
3216
3265
|
[@BabyGroot]: https://github.com/BabyGroot
|
|
@@ -3249,6 +3298,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
3249
3298
|
[@brafales]: https://github.com/brafales
|
|
3250
3299
|
[@bzf]: https://github.com/bzf
|
|
3251
3300
|
[@callumj]: https://github.com/callumj
|
|
3301
|
+
[@caramcc]: https://github.com/caramcc
|
|
3252
3302
|
[@carlallen]: https://github.com/carlallen
|
|
3253
3303
|
[@chychkan]: https://github.com/chychkan
|
|
3254
3304
|
[@cjford]: https://github.com/cjford
|
|
@@ -147,7 +147,7 @@ static void trigger_sample_for_thread(
|
|
|
147
147
|
struct cpu_and_wall_time_collector_state *state,
|
|
148
148
|
VALUE thread,
|
|
149
149
|
struct per_thread_context *thread_context,
|
|
150
|
-
|
|
150
|
+
ddog_Slice_I64 metric_values_slice,
|
|
151
151
|
sample_type type
|
|
152
152
|
);
|
|
153
153
|
static VALUE _native_thread_list(VALUE self);
|
|
@@ -366,7 +366,7 @@ void cpu_and_wall_time_collector_sample(VALUE self_instance, long current_monoto
|
|
|
366
366
|
state,
|
|
367
367
|
thread,
|
|
368
368
|
thread_context,
|
|
369
|
-
(
|
|
369
|
+
(ddog_Slice_I64) {.ptr = metric_values, .len = ENABLED_VALUE_TYPES_COUNT},
|
|
370
370
|
SAMPLE_REGULAR
|
|
371
371
|
);
|
|
372
372
|
}
|
|
@@ -520,7 +520,7 @@ VALUE cpu_and_wall_time_collector_sample_after_gc(VALUE self_instance) {
|
|
|
520
520
|
state,
|
|
521
521
|
thread,
|
|
522
522
|
thread_context,
|
|
523
|
-
(
|
|
523
|
+
(ddog_Slice_I64) {.ptr = metric_values, .len = ENABLED_VALUE_TYPES_COUNT},
|
|
524
524
|
SAMPLE_IN_GC
|
|
525
525
|
);
|
|
526
526
|
|
|
@@ -549,24 +549,24 @@ static void trigger_sample_for_thread(
|
|
|
549
549
|
struct cpu_and_wall_time_collector_state *state,
|
|
550
550
|
VALUE thread,
|
|
551
551
|
struct per_thread_context *thread_context,
|
|
552
|
-
|
|
552
|
+
ddog_Slice_I64 metric_values_slice,
|
|
553
553
|
sample_type type
|
|
554
554
|
) {
|
|
555
555
|
int max_label_count =
|
|
556
556
|
1 + // thread id
|
|
557
557
|
1 + // thread name
|
|
558
558
|
2; // local root span id and span id
|
|
559
|
-
|
|
559
|
+
ddog_prof_Label labels[max_label_count];
|
|
560
560
|
int label_pos = 0;
|
|
561
561
|
|
|
562
|
-
labels[label_pos++] = (
|
|
562
|
+
labels[label_pos++] = (ddog_prof_Label) {
|
|
563
563
|
.key = DDOG_CHARSLICE_C("thread id"),
|
|
564
564
|
.str = thread_context->thread_id_char_slice
|
|
565
565
|
};
|
|
566
566
|
|
|
567
567
|
VALUE thread_name = thread_name_for(thread);
|
|
568
568
|
if (thread_name != Qnil) {
|
|
569
|
-
labels[label_pos++] = (
|
|
569
|
+
labels[label_pos++] = (ddog_prof_Label) {
|
|
570
570
|
.key = DDOG_CHARSLICE_C("thread name"),
|
|
571
571
|
.str = char_slice_from_ruby_string(thread_name)
|
|
572
572
|
};
|
|
@@ -576,8 +576,8 @@ static void trigger_sample_for_thread(
|
|
|
576
576
|
trace_identifiers_for(state, thread, &trace_identifiers_result);
|
|
577
577
|
|
|
578
578
|
if (trace_identifiers_result.valid) {
|
|
579
|
-
labels[label_pos++] = (
|
|
580
|
-
labels[label_pos++] = (
|
|
579
|
+
labels[label_pos++] = (ddog_prof_Label) {.key = DDOG_CHARSLICE_C("local root span id"), .str = trace_identifiers_result.local_root_span_id};
|
|
580
|
+
labels[label_pos++] = (ddog_prof_Label) {.key = DDOG_CHARSLICE_C("span id"), .num = trace_identifiers_result.span_id};
|
|
581
581
|
|
|
582
582
|
if (trace_identifiers_result.trace_endpoint != Qnil) {
|
|
583
583
|
// The endpoint gets recorded in a different way because it is mutable in the tracer and can change during a
|
|
@@ -610,7 +610,7 @@ static void trigger_sample_for_thread(
|
|
|
610
610
|
state->sampling_buffer,
|
|
611
611
|
state->recorder_instance,
|
|
612
612
|
metric_values_slice,
|
|
613
|
-
(
|
|
613
|
+
(ddog_prof_Slice_Label) {.ptr = labels, .len = label_pos},
|
|
614
614
|
type
|
|
615
615
|
);
|
|
616
616
|
}
|
|
@@ -22,8 +22,8 @@ struct sampling_buffer {
|
|
|
22
22
|
VALUE *stack_buffer;
|
|
23
23
|
int *lines_buffer;
|
|
24
24
|
bool *is_ruby_frame;
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
ddog_prof_Location *locations;
|
|
26
|
+
ddog_prof_Line *lines;
|
|
27
27
|
}; // Note: typedef'd in the header to sampling_buffer
|
|
28
28
|
|
|
29
29
|
static VALUE _native_sample(
|
|
@@ -39,8 +39,8 @@ static void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer*
|
|
|
39
39
|
static void record_placeholder_stack_in_native_code(
|
|
40
40
|
sampling_buffer* buffer,
|
|
41
41
|
VALUE recorder_instance,
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
ddog_Slice_I64 metric_values,
|
|
43
|
+
ddog_prof_Slice_Label labels,
|
|
44
44
|
sampling_buffer *record_buffer,
|
|
45
45
|
int extra_frames_in_record_buffer
|
|
46
46
|
);
|
|
@@ -48,8 +48,8 @@ static void sample_thread_internal(
|
|
|
48
48
|
VALUE thread,
|
|
49
49
|
sampling_buffer* buffer,
|
|
50
50
|
VALUE recorder_instance,
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
ddog_Slice_I64 metric_values,
|
|
52
|
+
ddog_prof_Slice_Label labels,
|
|
53
53
|
sampling_buffer *record_buffer,
|
|
54
54
|
int extra_frames_in_record_buffer
|
|
55
55
|
);
|
|
@@ -96,12 +96,12 @@ static VALUE _native_sample(
|
|
|
96
96
|
}
|
|
97
97
|
|
|
98
98
|
long labels_count = RARRAY_LEN(labels_array);
|
|
99
|
-
|
|
99
|
+
ddog_prof_Label labels[labels_count];
|
|
100
100
|
|
|
101
101
|
for (int i = 0; i < labels_count; i++) {
|
|
102
102
|
VALUE key_str_pair = rb_ary_entry(labels_array, i);
|
|
103
103
|
|
|
104
|
-
labels[i] = (
|
|
104
|
+
labels[i] = (ddog_prof_Label) {
|
|
105
105
|
.key = char_slice_from_ruby_string(rb_ary_entry(key_str_pair, 0)),
|
|
106
106
|
.str = char_slice_from_ruby_string(rb_ary_entry(key_str_pair, 1))
|
|
107
107
|
};
|
|
@@ -116,8 +116,8 @@ static VALUE _native_sample(
|
|
|
116
116
|
thread,
|
|
117
117
|
buffer,
|
|
118
118
|
recorder_instance,
|
|
119
|
-
(
|
|
120
|
-
(
|
|
119
|
+
(ddog_Slice_I64) {.ptr = metric_values, .len = ENABLED_VALUE_TYPES_COUNT},
|
|
120
|
+
(ddog_prof_Slice_Label) {.ptr = labels, .len = labels_count},
|
|
121
121
|
RTEST(in_gc) ? SAMPLE_IN_GC : SAMPLE_REGULAR
|
|
122
122
|
);
|
|
123
123
|
|
|
@@ -130,8 +130,8 @@ void sample_thread(
|
|
|
130
130
|
VALUE thread,
|
|
131
131
|
sampling_buffer* buffer,
|
|
132
132
|
VALUE recorder_instance,
|
|
133
|
-
|
|
134
|
-
|
|
133
|
+
ddog_Slice_I64 metric_values,
|
|
134
|
+
ddog_prof_Slice_Label labels,
|
|
135
135
|
sample_type type
|
|
136
136
|
) {
|
|
137
137
|
// Samples thread into recorder
|
|
@@ -146,8 +146,8 @@ void sample_thread(
|
|
|
146
146
|
if (type == SAMPLE_IN_GC) {
|
|
147
147
|
ddog_CharSlice function_name = DDOG_CHARSLICE_C("");
|
|
148
148
|
ddog_CharSlice function_filename = DDOG_CHARSLICE_C("Garbage Collection");
|
|
149
|
-
buffer->lines[0] = (
|
|
150
|
-
.function = (
|
|
149
|
+
buffer->lines[0] = (ddog_prof_Line) {
|
|
150
|
+
.function = (ddog_prof_Function) {.name = function_name, .filename = function_filename},
|
|
151
151
|
.line = 0
|
|
152
152
|
};
|
|
153
153
|
// To avoid changing sample_thread_internal, we just prepare a new buffer struct that uses the same underlying storage as the
|
|
@@ -192,8 +192,8 @@ static void sample_thread_internal(
|
|
|
192
192
|
VALUE thread,
|
|
193
193
|
sampling_buffer* buffer,
|
|
194
194
|
VALUE recorder_instance,
|
|
195
|
-
|
|
196
|
-
|
|
195
|
+
ddog_Slice_I64 metric_values,
|
|
196
|
+
ddog_prof_Slice_Label labels,
|
|
197
197
|
sampling_buffer *record_buffer,
|
|
198
198
|
int extra_frames_in_record_buffer
|
|
199
199
|
) {
|
|
@@ -257,8 +257,8 @@ static void sample_thread_internal(
|
|
|
257
257
|
name = NIL_P(name) ? missing_string : name;
|
|
258
258
|
filename = NIL_P(filename) ? missing_string : filename;
|
|
259
259
|
|
|
260
|
-
buffer->lines[i] = (
|
|
261
|
-
.function = (
|
|
260
|
+
buffer->lines[i] = (ddog_prof_Line) {
|
|
261
|
+
.function = (ddog_prof_Function) {
|
|
262
262
|
.name = char_slice_from_ruby_string(name),
|
|
263
263
|
.filename = char_slice_from_ruby_string(filename)
|
|
264
264
|
},
|
|
@@ -278,8 +278,8 @@ static void sample_thread_internal(
|
|
|
278
278
|
|
|
279
279
|
record_sample(
|
|
280
280
|
recorder_instance,
|
|
281
|
-
(
|
|
282
|
-
.locations = (
|
|
281
|
+
(ddog_prof_Sample) {
|
|
282
|
+
.locations = (ddog_prof_Slice_Location) {.ptr = record_buffer->locations, .len = captured_frames + extra_frames_in_record_buffer},
|
|
283
283
|
.values = metric_values,
|
|
284
284
|
.labels = labels,
|
|
285
285
|
}
|
|
@@ -301,8 +301,8 @@ static void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer*
|
|
|
301
301
|
// `record_sample`. So be careful where it gets allocated. (We do have tests for this, at least!)
|
|
302
302
|
ddog_CharSlice function_name = DDOG_CHARSLICE_C("");
|
|
303
303
|
ddog_CharSlice function_filename = {.ptr = frames_omitted_message, .len = strlen(frames_omitted_message)};
|
|
304
|
-
buffer->lines[buffer->max_frames - 1] = (
|
|
305
|
-
.function = (
|
|
304
|
+
buffer->lines[buffer->max_frames - 1] = (ddog_prof_Line) {
|
|
305
|
+
.function = (ddog_prof_Function) {.name = function_name, .filename = function_filename},
|
|
306
306
|
.line = 0,
|
|
307
307
|
};
|
|
308
308
|
}
|
|
@@ -330,22 +330,22 @@ static void maybe_add_placeholder_frames_omitted(VALUE thread, sampling_buffer*
|
|
|
330
330
|
static void record_placeholder_stack_in_native_code(
|
|
331
331
|
sampling_buffer* buffer,
|
|
332
332
|
VALUE recorder_instance,
|
|
333
|
-
|
|
334
|
-
|
|
333
|
+
ddog_Slice_I64 metric_values,
|
|
334
|
+
ddog_prof_Slice_Label labels,
|
|
335
335
|
sampling_buffer *record_buffer,
|
|
336
336
|
int extra_frames_in_record_buffer
|
|
337
337
|
) {
|
|
338
338
|
ddog_CharSlice function_name = DDOG_CHARSLICE_C("");
|
|
339
339
|
ddog_CharSlice function_filename = DDOG_CHARSLICE_C("In native code");
|
|
340
|
-
buffer->lines[0] = (
|
|
341
|
-
.function = (
|
|
340
|
+
buffer->lines[0] = (ddog_prof_Line) {
|
|
341
|
+
.function = (ddog_prof_Function) {.name = function_name, .filename = function_filename},
|
|
342
342
|
.line = 0
|
|
343
343
|
};
|
|
344
344
|
|
|
345
345
|
record_sample(
|
|
346
346
|
recorder_instance,
|
|
347
|
-
(
|
|
348
|
-
.locations = (
|
|
347
|
+
(ddog_prof_Sample) {
|
|
348
|
+
.locations = (ddog_prof_Slice_Location) {.ptr = record_buffer->locations, .len = 1 + extra_frames_in_record_buffer},
|
|
349
349
|
.values = metric_values,
|
|
350
350
|
.labels = labels,
|
|
351
351
|
}
|
|
@@ -364,14 +364,14 @@ sampling_buffer *sampling_buffer_new(unsigned int max_frames) {
|
|
|
364
364
|
buffer->stack_buffer = ruby_xcalloc(max_frames, sizeof(VALUE));
|
|
365
365
|
buffer->lines_buffer = ruby_xcalloc(max_frames, sizeof(int));
|
|
366
366
|
buffer->is_ruby_frame = ruby_xcalloc(max_frames, sizeof(bool));
|
|
367
|
-
buffer->locations = ruby_xcalloc(max_frames, sizeof(
|
|
368
|
-
buffer->lines = ruby_xcalloc(max_frames, sizeof(
|
|
367
|
+
buffer->locations = ruby_xcalloc(max_frames, sizeof(ddog_prof_Location));
|
|
368
|
+
buffer->lines = ruby_xcalloc(max_frames, sizeof(ddog_prof_Line));
|
|
369
369
|
|
|
370
370
|
// Currently we have a 1-to-1 correspondence between lines and locations, so we just initialize the locations once
|
|
371
371
|
// here and then only mutate the contents of the lines.
|
|
372
372
|
for (unsigned int i = 0; i < max_frames; i++) {
|
|
373
|
-
|
|
374
|
-
buffer->locations[i] = (
|
|
373
|
+
ddog_prof_Slice_Line lines = (ddog_prof_Slice_Line) {.ptr = &buffer->lines[i], .len = 1};
|
|
374
|
+
buffer->locations[i] = (ddog_prof_Location) {.lines = lines};
|
|
375
375
|
}
|
|
376
376
|
|
|
377
377
|
return buffer;
|
|
@@ -10,8 +10,8 @@ void sample_thread(
|
|
|
10
10
|
VALUE thread,
|
|
11
11
|
sampling_buffer* buffer,
|
|
12
12
|
VALUE recorder_instance,
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
ddog_Slice_I64 metric_values,
|
|
14
|
+
ddog_prof_Slice_Label labels,
|
|
15
15
|
sample_type type
|
|
16
16
|
);
|
|
17
17
|
sampling_buffer *sampling_buffer_new(unsigned int max_frames);
|
|
@@ -20,20 +20,20 @@ static VALUE http_transport_class = Qnil;
|
|
|
20
20
|
static VALUE library_version_string = Qnil;
|
|
21
21
|
|
|
22
22
|
struct call_exporter_without_gvl_arguments {
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
ddog_prof_Exporter *exporter;
|
|
24
|
+
ddog_prof_Exporter_Request *request;
|
|
25
25
|
ddog_CancellationToken *cancel_token;
|
|
26
|
-
|
|
26
|
+
ddog_prof_Exporter_SendResult result;
|
|
27
27
|
bool send_ran;
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
inline static ddog_ByteSlice byte_slice_from_ruby_string(VALUE string);
|
|
31
31
|
static VALUE _native_validate_exporter(VALUE self, VALUE exporter_configuration);
|
|
32
|
-
static
|
|
33
|
-
static VALUE handle_exporter_failure(
|
|
32
|
+
static ddog_prof_Exporter_NewResult create_exporter(VALUE exporter_configuration, VALUE tags_as_array);
|
|
33
|
+
static VALUE handle_exporter_failure(ddog_prof_Exporter_NewResult exporter_result);
|
|
34
34
|
static ddog_Endpoint endpoint_from(VALUE exporter_configuration);
|
|
35
|
-
static
|
|
36
|
-
static void safely_log_failure_to_process_tag(
|
|
35
|
+
static ddog_Vec_Tag convert_tags(VALUE tags_as_array);
|
|
36
|
+
static void safely_log_failure_to_process_tag(ddog_Vec_Tag tags, VALUE err_details);
|
|
37
37
|
static VALUE _native_do_export(
|
|
38
38
|
VALUE self,
|
|
39
39
|
VALUE exporter_configuration,
|
|
@@ -76,46 +76,46 @@ inline static ddog_ByteSlice byte_slice_from_ruby_string(VALUE string) {
|
|
|
76
76
|
|
|
77
77
|
static VALUE _native_validate_exporter(DDTRACE_UNUSED VALUE _self, VALUE exporter_configuration) {
|
|
78
78
|
ENFORCE_TYPE(exporter_configuration, T_ARRAY);
|
|
79
|
-
|
|
79
|
+
ddog_prof_Exporter_NewResult exporter_result = create_exporter(exporter_configuration, rb_ary_new());
|
|
80
80
|
|
|
81
81
|
VALUE failure_tuple = handle_exporter_failure(exporter_result);
|
|
82
82
|
if (!NIL_P(failure_tuple)) return failure_tuple;
|
|
83
83
|
|
|
84
84
|
// We don't actually need the exporter for now -- we just wanted to validate that we could create it with the
|
|
85
85
|
// settings we were given
|
|
86
|
-
|
|
86
|
+
ddog_prof_Exporter_NewResult_drop(exporter_result);
|
|
87
87
|
|
|
88
88
|
return rb_ary_new_from_args(2, ok_symbol, Qnil);
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
static
|
|
91
|
+
static ddog_prof_Exporter_NewResult create_exporter(VALUE exporter_configuration, VALUE tags_as_array) {
|
|
92
92
|
ENFORCE_TYPE(exporter_configuration, T_ARRAY);
|
|
93
93
|
ENFORCE_TYPE(tags_as_array, T_ARRAY);
|
|
94
94
|
|
|
95
|
-
// This needs to be called BEFORE convert_tags since it can raise an exception and thus cause the
|
|
95
|
+
// This needs to be called BEFORE convert_tags since it can raise an exception and thus cause the ddog_Vec_Tag
|
|
96
96
|
// to be leaked.
|
|
97
97
|
ddog_Endpoint endpoint = endpoint_from(exporter_configuration);
|
|
98
98
|
|
|
99
|
-
|
|
99
|
+
ddog_Vec_Tag tags = convert_tags(tags_as_array);
|
|
100
100
|
|
|
101
101
|
ddog_CharSlice library_name = DDOG_CHARSLICE_C("dd-trace-rb");
|
|
102
102
|
ddog_CharSlice library_version = char_slice_from_ruby_string(library_version_string);
|
|
103
103
|
ddog_CharSlice profiling_family = DDOG_CHARSLICE_C("ruby");
|
|
104
104
|
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
ddog_prof_Exporter_NewResult exporter_result =
|
|
106
|
+
ddog_prof_Exporter_new(library_name, library_version, profiling_family, &tags, endpoint);
|
|
107
107
|
|
|
108
|
-
|
|
108
|
+
ddog_Vec_Tag_drop(tags);
|
|
109
109
|
|
|
110
110
|
return exporter_result;
|
|
111
111
|
}
|
|
112
112
|
|
|
113
|
-
static VALUE handle_exporter_failure(
|
|
114
|
-
if (exporter_result.tag ==
|
|
113
|
+
static VALUE handle_exporter_failure(ddog_prof_Exporter_NewResult exporter_result) {
|
|
114
|
+
if (exporter_result.tag == DDOG_PROF_EXPORTER_NEW_RESULT_OK) return Qnil;
|
|
115
115
|
|
|
116
|
-
VALUE err_details =
|
|
116
|
+
VALUE err_details = ruby_string_from_prof_vec_u8(exporter_result.err);
|
|
117
117
|
|
|
118
|
-
|
|
118
|
+
ddog_prof_Exporter_NewResult_drop(exporter_result);
|
|
119
119
|
|
|
120
120
|
return rb_ary_new_from_args(2, error_symbol, err_details);
|
|
121
121
|
}
|
|
@@ -145,17 +145,17 @@ static ddog_Endpoint endpoint_from(VALUE exporter_configuration) {
|
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
__attribute__((warn_unused_result))
|
|
148
|
-
static
|
|
148
|
+
static ddog_Vec_Tag convert_tags(VALUE tags_as_array) {
|
|
149
149
|
ENFORCE_TYPE(tags_as_array, T_ARRAY);
|
|
150
150
|
|
|
151
151
|
long tags_count = RARRAY_LEN(tags_as_array);
|
|
152
|
-
|
|
152
|
+
ddog_Vec_Tag tags = ddog_Vec_Tag_new();
|
|
153
153
|
|
|
154
154
|
for (long i = 0; i < tags_count; i++) {
|
|
155
155
|
VALUE name_value_pair = rb_ary_entry(tags_as_array, i);
|
|
156
156
|
|
|
157
157
|
if (!RB_TYPE_P(name_value_pair, T_ARRAY)) {
|
|
158
|
-
|
|
158
|
+
ddog_Vec_Tag_drop(tags);
|
|
159
159
|
ENFORCE_TYPE(name_value_pair, T_ARRAY);
|
|
160
160
|
}
|
|
161
161
|
|
|
@@ -164,23 +164,23 @@ static ddog_Vec_tag convert_tags(VALUE tags_as_array) {
|
|
|
164
164
|
VALUE tag_value = rb_ary_entry(name_value_pair, 1);
|
|
165
165
|
|
|
166
166
|
if (!(RB_TYPE_P(tag_name, T_STRING) && RB_TYPE_P(tag_value, T_STRING))) {
|
|
167
|
-
|
|
167
|
+
ddog_Vec_Tag_drop(tags);
|
|
168
168
|
ENFORCE_TYPE(tag_name, T_STRING);
|
|
169
169
|
ENFORCE_TYPE(tag_value, T_STRING);
|
|
170
170
|
}
|
|
171
171
|
|
|
172
|
-
|
|
173
|
-
|
|
172
|
+
ddog_Vec_Tag_PushResult push_result =
|
|
173
|
+
ddog_Vec_Tag_push(&tags, char_slice_from_ruby_string(tag_name), char_slice_from_ruby_string(tag_value));
|
|
174
174
|
|
|
175
|
-
if (push_result.tag ==
|
|
175
|
+
if (push_result.tag == DDOG_VEC_TAG_PUSH_RESULT_ERR) {
|
|
176
176
|
VALUE err_details = ruby_string_from_vec_u8(push_result.err);
|
|
177
|
-
|
|
177
|
+
ddog_Vec_Tag_PushResult_drop(push_result);
|
|
178
178
|
|
|
179
179
|
// libdatadog validates tags and may catch invalid tags that ddtrace didn't actually catch.
|
|
180
180
|
// We warn users about such tags, and then just ignore them.
|
|
181
181
|
safely_log_failure_to_process_tag(tags, err_details);
|
|
182
182
|
} else {
|
|
183
|
-
|
|
183
|
+
ddog_Vec_Tag_PushResult_drop(push_result);
|
|
184
184
|
}
|
|
185
185
|
}
|
|
186
186
|
|
|
@@ -193,12 +193,12 @@ static VALUE log_failure_to_process_tag(VALUE err_details) {
|
|
|
193
193
|
|
|
194
194
|
// Since we are calling into Ruby code, it may raise an exception. This method ensure that dynamically-allocated tags
|
|
195
195
|
// get cleaned before propagating the exception.
|
|
196
|
-
static void safely_log_failure_to_process_tag(
|
|
196
|
+
static void safely_log_failure_to_process_tag(ddog_Vec_Tag tags, VALUE err_details) {
|
|
197
197
|
int exception_state;
|
|
198
198
|
rb_protect(log_failure_to_process_tag, err_details, &exception_state);
|
|
199
199
|
|
|
200
200
|
if (exception_state) { // An exception was raised
|
|
201
|
-
|
|
201
|
+
ddog_Vec_Tag_drop(tags); // clean up
|
|
202
202
|
rb_jump_tag(exception_state); // "Re-raise" exception
|
|
203
203
|
}
|
|
204
204
|
}
|
|
@@ -206,17 +206,18 @@ static void safely_log_failure_to_process_tag(ddog_Vec_tag tags, VALUE err_detai
|
|
|
206
206
|
// Note: This function handles a bunch of libdatadog dynamically-allocated objects, so it MUST not use any Ruby APIs
|
|
207
207
|
// which can raise exceptions, otherwise the objects will be leaked.
|
|
208
208
|
static VALUE perform_export(
|
|
209
|
-
|
|
209
|
+
ddog_prof_Exporter_NewResult valid_exporter_result, // Must be called with a valid exporter result
|
|
210
210
|
ddog_Timespec start,
|
|
211
211
|
ddog_Timespec finish,
|
|
212
|
-
|
|
213
|
-
|
|
212
|
+
ddog_prof_Exporter_Slice_File slice_files,
|
|
213
|
+
ddog_Vec_Tag *additional_tags,
|
|
214
214
|
uint64_t timeout_milliseconds
|
|
215
215
|
) {
|
|
216
|
-
|
|
216
|
+
ddog_prof_Exporter *exporter = valid_exporter_result.ok;
|
|
217
217
|
ddog_CancellationToken *cancel_token = ddog_CancellationToken_new();
|
|
218
|
-
|
|
219
|
-
|
|
218
|
+
ddog_prof_ProfiledEndpointsStats *endpoints_stats = NULL; // Not in use yet
|
|
219
|
+
ddog_prof_Exporter_Request *request =
|
|
220
|
+
ddog_prof_Exporter_Request_build(exporter, start, finish, slice_files, additional_tags, endpoints_stats, timeout_milliseconds);
|
|
220
221
|
|
|
221
222
|
// We'll release the Global VM Lock while we're calling send, so that the Ruby VM can continue to work while this
|
|
222
223
|
// is pending
|
|
@@ -246,23 +247,23 @@ static VALUE perform_export(
|
|
|
246
247
|
|
|
247
248
|
// Cleanup exporter and token, no longer needed
|
|
248
249
|
ddog_CancellationToken_drop(cancel_token);
|
|
249
|
-
|
|
250
|
+
ddog_prof_Exporter_NewResult_drop(valid_exporter_result);
|
|
250
251
|
|
|
251
252
|
if (pending_exception) {
|
|
252
253
|
// If we got here send did not run, so we need to explicitly dispose of the request
|
|
253
|
-
|
|
254
|
+
ddog_prof_Exporter_Request_drop(request);
|
|
254
255
|
|
|
255
256
|
// Let Ruby propagate the exception. This will not return.
|
|
256
257
|
rb_jump_tag(pending_exception);
|
|
257
258
|
}
|
|
258
259
|
|
|
259
|
-
|
|
260
|
-
bool success = result.tag ==
|
|
260
|
+
ddog_prof_Exporter_SendResult result = args.result;
|
|
261
|
+
bool success = result.tag == DDOG_PROF_EXPORTER_SEND_RESULT_HTTP_RESPONSE;
|
|
261
262
|
|
|
262
263
|
VALUE ruby_status = success ? ok_symbol : error_symbol;
|
|
263
|
-
VALUE ruby_result = success ? UINT2NUM(result.http_response.code) :
|
|
264
|
+
VALUE ruby_result = success ? UINT2NUM(result.http_response.code) : ruby_string_from_prof_vec_u8(result.err);
|
|
264
265
|
|
|
265
|
-
|
|
266
|
+
ddog_prof_Exporter_SendResult_drop(args.result);
|
|
266
267
|
// The request itself does not need to be freed as libdatadog takes care of it as part of sending.
|
|
267
268
|
|
|
268
269
|
return rb_ary_new_from_args(2, ruby_status, ruby_result);
|
|
@@ -303,23 +304,23 @@ static VALUE _native_do_export(
|
|
|
303
304
|
{.seconds = NUM2LONG(finish_timespec_seconds), .nanoseconds = NUM2UINT(finish_timespec_nanoseconds)};
|
|
304
305
|
|
|
305
306
|
int files_to_report = 1 + (have_code_provenance ? 1 : 0);
|
|
306
|
-
|
|
307
|
-
|
|
307
|
+
ddog_prof_Exporter_File files[files_to_report];
|
|
308
|
+
ddog_prof_Exporter_Slice_File slice_files = {.ptr = files, .len = files_to_report};
|
|
308
309
|
|
|
309
|
-
files[0] = (
|
|
310
|
+
files[0] = (ddog_prof_Exporter_File) {
|
|
310
311
|
.name = char_slice_from_ruby_string(pprof_file_name),
|
|
311
312
|
.file = byte_slice_from_ruby_string(pprof_data)
|
|
312
313
|
};
|
|
313
314
|
if (have_code_provenance) {
|
|
314
|
-
files[1] = (
|
|
315
|
+
files[1] = (ddog_prof_Exporter_File) {
|
|
315
316
|
.name = char_slice_from_ruby_string(code_provenance_file_name),
|
|
316
317
|
.file = byte_slice_from_ruby_string(code_provenance_data)
|
|
317
318
|
};
|
|
318
319
|
}
|
|
319
320
|
|
|
320
|
-
|
|
321
|
+
ddog_Vec_Tag *null_additional_tags = NULL;
|
|
321
322
|
|
|
322
|
-
|
|
323
|
+
ddog_prof_Exporter_NewResult exporter_result = create_exporter(exporter_configuration, tags_as_array);
|
|
323
324
|
// Note: Do not add anything that can raise exceptions after this line, as otherwise the exporter memory will leak
|
|
324
325
|
|
|
325
326
|
VALUE failure_tuple = handle_exporter_failure(exporter_result);
|
|
@@ -331,7 +332,7 @@ static VALUE _native_do_export(
|
|
|
331
332
|
static void *call_exporter_without_gvl(void *call_args) {
|
|
332
333
|
struct call_exporter_without_gvl_arguments *args = (struct call_exporter_without_gvl_arguments*) call_args;
|
|
333
334
|
|
|
334
|
-
args->result =
|
|
335
|
+
args->result = ddog_prof_Exporter_send(args->exporter, args->request, args->cancel_token);
|
|
335
336
|
args->send_ran = true;
|
|
336
337
|
|
|
337
338
|
return NULL; // Unused
|
|
@@ -9,6 +9,10 @@ inline static ddog_CharSlice char_slice_from_ruby_string(VALUE string) {
|
|
|
9
9
|
return char_slice;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
inline static VALUE ruby_string_from_vec_u8(
|
|
12
|
+
inline static VALUE ruby_string_from_vec_u8(ddog_Vec_U8 string) {
|
|
13
|
+
return rb_str_new((char *) string.ptr, string.len);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
inline static VALUE ruby_string_from_prof_vec_u8(ddog_prof_Vec_U8 string) {
|
|
13
17
|
return rb_str_new((char *) string.ptr, string.len);
|
|
14
18
|
}
|