ddtrace 1.7.0 → 1.8.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 +50 -1
- data/README.md +2 -2
- data/ext/ddtrace_profiling_loader/extconf.rb +4 -1
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +1 -1
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +3 -2
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +15 -41
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +1 -1
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +284 -74
- data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
- data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
- data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
- data/ext/ddtrace_profiling_native_extension/extconf.rb +21 -7
- data/ext/ddtrace_profiling_native_extension/helpers.h +5 -0
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +8 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +108 -24
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +9 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +205 -0
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +86 -0
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +28 -6
- data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +23 -4
- data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +4 -0
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +15 -18
- data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
- data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
- data/lib/datadog/core/configuration/components.rb +27 -6
- data/lib/datadog/core/configuration/ext.rb +18 -0
- data/lib/datadog/core/configuration/settings.rb +14 -341
- data/lib/datadog/core/diagnostics/health.rb +4 -22
- data/lib/datadog/core/environment/variable_helpers.rb +58 -10
- data/lib/datadog/core/utils.rb +0 -21
- data/lib/datadog/core.rb +21 -1
- data/lib/datadog/opentracer/distributed_headers.rb +2 -2
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +16 -5
- data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
- data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
- data/lib/datadog/profiling/stack_recorder.rb +14 -0
- data/lib/datadog/profiling.rb +2 -0
- data/lib/datadog/tracing/configuration/ext.rb +33 -3
- data/lib/datadog/tracing/configuration/settings.rb +433 -0
- data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/aws/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/dalli/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +9 -4
- data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/http/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +9 -4
- data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +5 -1
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +2 -2
- data/lib/datadog/tracing/contrib/patcher.rb +3 -2
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/pg/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +12 -2
- data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/presto/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +10 -12
- data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +4 -1
- data/lib/datadog/tracing/contrib/redis/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +30 -23
- data/lib/datadog/tracing/contrib/redis/integration.rb +34 -2
- data/lib/datadog/tracing/contrib/redis/patcher.rb +18 -14
- data/lib/datadog/tracing/contrib/redis/quantize.rb +12 -9
- data/lib/datadog/tracing/contrib/redis/tags.rb +4 -6
- data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +72 -0
- data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +6 -1
- data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
- data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -6
- data/lib/datadog/tracing/diagnostics/health.rb +40 -0
- data/lib/datadog/tracing/distributed/{b3.rb → b3_multi.rb} +2 -2
- data/lib/datadog/tracing/distributed/helpers.rb +2 -1
- data/lib/datadog/tracing/distributed/none.rb +19 -0
- data/lib/datadog/tracing/distributed/trace_context.rb +369 -0
- data/lib/datadog/tracing/metadata/ext.rb +1 -1
- data/lib/datadog/tracing/sampling/priority_sampler.rb +11 -0
- data/lib/datadog/tracing/sampling/rate_sampler.rb +3 -3
- data/lib/datadog/tracing/span.rb +3 -19
- data/lib/datadog/tracing/span_operation.rb +5 -4
- data/lib/datadog/tracing/trace_digest.rb +75 -2
- data/lib/datadog/tracing/trace_operation.rb +5 -4
- data/lib/datadog/tracing/utils.rb +50 -0
- data/lib/ddtrace/version.rb +1 -1
- metadata +20 -5
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '02285d37473e8fe6c731e55ae7864860a311e2b6d509f56a41f31094cd198f09'
|
|
4
|
+
data.tar.gz: 8857a0f43f96fef23309cd7fced88b846d5ad48834b6c87d0f40181cc3bd5dd9
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: afcde0e01258f5ab997fa6bcfa51c29a82f0e730258056a9efae86130445dbd63471269c047878b1ee554cc4ec956fe6e95a597ce65930e73549b0e32cbec50c
|
|
7
|
+
data.tar.gz: 292867c7c22146d0bd3147bb8863dd51fc89200a08efe640f05ae053fb93bdaeb068eefb6c89466b40ebbe749174844aa6b874c5a2b6aae30cb5055c9f2dc3cd
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,38 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [1.8.0] - 2022-12-14
|
|
6
|
+
|
|
7
|
+
Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v1.8.0
|
|
8
|
+
|
|
9
|
+
As of ddtrace 1.8.0, CPU Profiling 2.0 is now in opt-in (that is, disabled by default) public beta. For more details,
|
|
10
|
+
check the release notes.
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
* Core: Profiling: [PROF-6559] Mark Ruby CPU Profiling 2.0 as being in beta ([#2489][])
|
|
15
|
+
* Tracing: Attempt to parse future version of TraceContext ([#2473][])
|
|
16
|
+
* Tracing: Add DD_TRACE_PROPAGATION_STYLE option ([#2466][])
|
|
17
|
+
* Integrations: Tracing: SQL comment propagation full mode with traceparent ([#2464][])
|
|
18
|
+
* Integrations: Tracing: Wire W3C propagator to HTTP & gRPC propagation ([#2458][])
|
|
19
|
+
* Integrations: Tracing: Auto-instrumentation with service_name from environmental variable ([#2455][])
|
|
20
|
+
* Core: Integrations: Tracing: Deprecation notice for B3 propagation configuration ([#2454][])
|
|
21
|
+
* Tracing: Add W3C Trace Context propagator ([#2451][])
|
|
22
|
+
* Integrations: Tracing: Redis 5 Instrumentation ([#2428][])
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
* Tracing: Changes `error.msg` to `error.message` for UNC ([#2469][])
|
|
27
|
+
* Tracing: Semicolons not allowed in 'origin' ([#2461][])
|
|
28
|
+
* Core: Dev/refactor: Tracing: Dev/internal: Move Utils#next_id and constants to Tracing::Utils ([#2463][])
|
|
29
|
+
* Core: Dev/refactor: Tracing: Dev/internal: Move Tracing config settings from Core to Tracing ([#2459][])
|
|
30
|
+
* Core: Dev/refactor: Tracing: Dev/internal: Move Tracing diagnostic code from Core to Tracing ([#2453][])
|
|
31
|
+
|
|
32
|
+
### Fixed
|
|
33
|
+
|
|
34
|
+
* Integrations: Tracing: Improve redis integration patching ([#2470][])
|
|
35
|
+
* Tracing: Extra testing from W3C spec ([#2460][])
|
|
36
|
+
|
|
5
37
|
## [1.7.0] - 2022-11-29
|
|
6
38
|
|
|
7
39
|
### Added
|
|
@@ -2218,7 +2250,8 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
|
|
|
2218
2250
|
|
|
2219
2251
|
Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
2220
2252
|
|
|
2221
|
-
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.
|
|
2253
|
+
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.8.0...master
|
|
2254
|
+
[1.8.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.7.0...v1.8.0
|
|
2222
2255
|
[1.7.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.6.1...v1.7.0
|
|
2223
2256
|
[1.6.1]: https://github.com/DataDog/dd-trace-rb/compare/v1.6.0...v1.6.1
|
|
2224
2257
|
[1.6.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.5.2...v1.6.0
|
|
@@ -3161,7 +3194,23 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
3161
3194
|
[#2413]: https://github.com/DataDog/dd-trace-rb/issues/2413
|
|
3162
3195
|
[#2419]: https://github.com/DataDog/dd-trace-rb/issues/2419
|
|
3163
3196
|
[#2420]: https://github.com/DataDog/dd-trace-rb/issues/2420
|
|
3197
|
+
[#2428]: https://github.com/DataDog/dd-trace-rb/issues/2428
|
|
3164
3198
|
[#2435]: https://github.com/DataDog/dd-trace-rb/issues/2435
|
|
3199
|
+
[#2451]: https://github.com/DataDog/dd-trace-rb/issues/2451
|
|
3200
|
+
[#2453]: https://github.com/DataDog/dd-trace-rb/issues/2453
|
|
3201
|
+
[#2454]: https://github.com/DataDog/dd-trace-rb/issues/2454
|
|
3202
|
+
[#2455]: https://github.com/DataDog/dd-trace-rb/issues/2455
|
|
3203
|
+
[#2458]: https://github.com/DataDog/dd-trace-rb/issues/2458
|
|
3204
|
+
[#2459]: https://github.com/DataDog/dd-trace-rb/issues/2459
|
|
3205
|
+
[#2460]: https://github.com/DataDog/dd-trace-rb/issues/2460
|
|
3206
|
+
[#2461]: https://github.com/DataDog/dd-trace-rb/issues/2461
|
|
3207
|
+
[#2463]: https://github.com/DataDog/dd-trace-rb/issues/2463
|
|
3208
|
+
[#2464]: https://github.com/DataDog/dd-trace-rb/issues/2464
|
|
3209
|
+
[#2466]: https://github.com/DataDog/dd-trace-rb/issues/2466
|
|
3210
|
+
[#2469]: https://github.com/DataDog/dd-trace-rb/issues/2469
|
|
3211
|
+
[#2470]: https://github.com/DataDog/dd-trace-rb/issues/2470
|
|
3212
|
+
[#2473]: https://github.com/DataDog/dd-trace-rb/issues/2473
|
|
3213
|
+
[#2489]: https://github.com/DataDog/dd-trace-rb/issues/2489
|
|
3165
3214
|
[@AdrianLC]: https://github.com/AdrianLC
|
|
3166
3215
|
[@Azure7111]: https://github.com/Azure7111
|
|
3167
3216
|
[@BabyGroot]: https://github.com/BabyGroot
|
data/README.md
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
**We've recently released the 1.x version series. If you're upgrading from a 0.x version, check out our [upgrade guide](https://github.com/DataDog/dd-trace-rb/blob/master/docs/UpgradeGuide.md#from-0x-to-10).**
|
|
2
|
-
|
|
3
1
|
# Datadog Trace Client
|
|
4
2
|
|
|
5
3
|
[](https://rubygems.org/gems/ddtrace/)
|
|
@@ -12,6 +10,8 @@ databases and microservices so that developers have great visiblity into bottlen
|
|
|
12
10
|
|
|
13
11
|
## Getting started
|
|
14
12
|
|
|
13
|
+
**If you're upgrading from a 0.x version, check out our [upgrade guide](https://github.com/DataDog/dd-trace-rb/blob/master/docs/UpgradeGuide.md#from-0x-to-10).**
|
|
14
|
+
|
|
15
15
|
For a basic product overview, check out our [setup documentation][setup docs].
|
|
16
16
|
|
|
17
17
|
For installation, configuration, and details about using the API, check out our [API documentation][api docs] and [gem documentation][gem docs].
|
|
@@ -34,7 +34,7 @@ add_compiler_flag '-Werror' if ENV['DDTRACE_CI'] == 'true'
|
|
|
34
34
|
# (https://github.com/msgpack/msgpack-ruby/blob/18ce08f6d612fe973843c366ac9a0b74c4e50599/ext/msgpack/extconf.rb#L8)
|
|
35
35
|
add_compiler_flag '-std=gnu99'
|
|
36
36
|
|
|
37
|
-
# Gets really noisy when we include the MJIT header, let's omit it
|
|
37
|
+
# Gets really noisy when we include the MJIT header, let's omit it (TODO: Use #pragma GCC diagnostic instead?)
|
|
38
38
|
add_compiler_flag '-Wno-unused-function'
|
|
39
39
|
|
|
40
40
|
# Allow defining variables at any point in a function
|
|
@@ -55,6 +55,9 @@ add_compiler_flag '-Wunused-parameter'
|
|
|
55
55
|
# For more details see https://gcc.gnu.org/wiki/Visibility
|
|
56
56
|
add_compiler_flag '-fvisibility=hidden'
|
|
57
57
|
|
|
58
|
+
# Avoid legacy C definitions
|
|
59
|
+
add_compiler_flag '-Wold-style-definition'
|
|
60
|
+
|
|
58
61
|
# Enable all other compiler warnings
|
|
59
62
|
add_compiler_flag '-Wall'
|
|
60
63
|
add_compiler_flag '-Wextra'
|
|
@@ -57,7 +57,7 @@ Non-exhaustive list of APIs that cause exceptions to be raised:
|
|
|
57
57
|
|
|
58
58
|
* `Check_TypedStruct`, `Check_Type`, `ENFORCE_TYPE`
|
|
59
59
|
* `rb_funcall`
|
|
60
|
-
* `rb_thread_call_without_gvl
|
|
60
|
+
* `rb_thread_call_without_gvl`
|
|
61
61
|
* [Numeric conversion APIs, e.g. `NUM2LONG`, `NUM2INT`, etc.](https://silverhammermba.github.io/emberb/c/?#translation)
|
|
62
62
|
* Our `char_slice_from_ruby_string` helper
|
|
63
63
|
|
|
@@ -7,11 +7,12 @@
|
|
|
7
7
|
#include <pthread.h>
|
|
8
8
|
#include <time.h>
|
|
9
9
|
#include <errno.h>
|
|
10
|
-
|
|
11
10
|
#include <ruby.h>
|
|
11
|
+
|
|
12
12
|
#include "helpers.h"
|
|
13
13
|
#include "private_vm_api_access.h"
|
|
14
14
|
#include "clock_id.h"
|
|
15
|
+
#include "time_helpers.h"
|
|
15
16
|
|
|
16
17
|
// Validate that our home-cooked pthread_id_for() matches pthread_self() for the current thread
|
|
17
18
|
void self_test_clock_id(void) {
|
|
@@ -68,7 +69,7 @@ thread_cpu_time thread_cpu_time_for(thread_cpu_time_id time_id) {
|
|
|
68
69
|
// TODO: Include the error code in some way in the output?
|
|
69
70
|
if (clock_gettime(time_id.clock_id, ¤t_cpu) != 0) return error;
|
|
70
71
|
|
|
71
|
-
return (thread_cpu_time) {.valid = true, .result_ns = current_cpu.tv_nsec + (current_cpu.tv_sec
|
|
72
|
+
return (thread_cpu_time) {.valid = true, .result_ns = current_cpu.tv_nsec + SECONDS_AS_NS(current_cpu.tv_sec)};
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
#endif
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
#include <ruby.h>
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
#include "clock_id.h"
|
|
4
|
+
#include "collectors_cpu_and_wall_time.h"
|
|
4
5
|
#include "collectors_stack.h"
|
|
6
|
+
#include "helpers.h"
|
|
5
7
|
#include "libdatadog_helpers.h"
|
|
6
8
|
#include "private_vm_api_access.h"
|
|
7
9
|
#include "stack_recorder.h"
|
|
8
|
-
#include "
|
|
10
|
+
#include "time_helpers.h"
|
|
9
11
|
|
|
10
12
|
// Used to periodically sample threads, recording elapsed CPU-time and Wall-time between samples.
|
|
11
13
|
//
|
|
@@ -60,8 +62,6 @@
|
|
|
60
62
|
|
|
61
63
|
#define INVALID_TIME -1
|
|
62
64
|
#define THREAD_ID_LIMIT_CHARS 44 // Why 44? "#{2**64} (#{2**64})".size + 1 for \0
|
|
63
|
-
#define RAISE_ON_FAILURE true
|
|
64
|
-
#define DO_NOT_RAISE_ON_FAILURE false
|
|
65
65
|
#define IS_WALL_TIME true
|
|
66
66
|
#define IS_NOT_WALL_TIME false
|
|
67
67
|
#define MISSING_TRACER_CONTEXT_KEY 0
|
|
@@ -128,9 +128,8 @@ struct trace_identifiers {
|
|
|
128
128
|
|
|
129
129
|
bool valid;
|
|
130
130
|
ddog_CharSlice local_root_span_id;
|
|
131
|
-
|
|
131
|
+
uint64_t span_id;
|
|
132
132
|
char local_root_span_id_buffer[MAXIMUM_LENGTH_64_BIT_IDENTIFIER];
|
|
133
|
-
char span_id_buffer[MAXIMUM_LENGTH_64_BIT_IDENTIFIER];
|
|
134
133
|
VALUE trace_endpoint;
|
|
135
134
|
};
|
|
136
135
|
|
|
@@ -164,7 +163,6 @@ static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context,
|
|
|
164
163
|
static VALUE _native_per_thread_context(VALUE self, VALUE collector_instance);
|
|
165
164
|
static long update_time_since_previous_sample(long *time_at_previous_sample_ns, long current_time_ns, long gc_start_time_ns, bool is_wall_time);
|
|
166
165
|
static long cpu_time_now_ns(struct per_thread_context *thread_context);
|
|
167
|
-
static long wall_time_now_ns(bool raise_on_failure);
|
|
168
166
|
static long thread_id_for(VALUE thread);
|
|
169
167
|
static VALUE _native_stats(VALUE self, VALUE collector_instance);
|
|
170
168
|
static void trace_identifiers_for(struct cpu_and_wall_time_collector_state *state, VALUE thread, struct trace_identifiers *trace_identifiers_result);
|
|
@@ -300,7 +298,7 @@ static VALUE _native_initialize(DDTRACE_UNUSED VALUE _self, VALUE collector_inst
|
|
|
300
298
|
// This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
|
|
301
299
|
// It SHOULD NOT be used for other purposes.
|
|
302
300
|
static VALUE _native_sample(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
|
|
303
|
-
cpu_and_wall_time_collector_sample(collector_instance);
|
|
301
|
+
cpu_and_wall_time_collector_sample(collector_instance, monotonic_wall_time_now_ns(RAISE_ON_FAILURE));
|
|
304
302
|
return Qtrue;
|
|
305
303
|
}
|
|
306
304
|
|
|
@@ -332,12 +330,11 @@ static VALUE _native_sample_after_gc(DDTRACE_UNUSED VALUE self, VALUE collector_
|
|
|
332
330
|
// Assumption 3: This function IS NOT called from a signal handler. This function is not async-signal-safe.
|
|
333
331
|
// Assumption 4: This function IS NOT called in a reentrant way.
|
|
334
332
|
// Assumption 5: This function is called from the main Ractor (if Ruby has support for Ractors).
|
|
335
|
-
|
|
333
|
+
void cpu_and_wall_time_collector_sample(VALUE self_instance, long current_monotonic_wall_time_ns) {
|
|
336
334
|
struct cpu_and_wall_time_collector_state *state;
|
|
337
335
|
TypedData_Get_Struct(self_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
|
|
338
336
|
|
|
339
337
|
VALUE threads = ddtrace_thread_list();
|
|
340
|
-
long current_wall_time_ns = wall_time_now_ns(RAISE_ON_FAILURE);
|
|
341
338
|
|
|
342
339
|
const long thread_count = RARRAY_LEN(threads);
|
|
343
340
|
for (long i = 0; i < thread_count; i++) {
|
|
@@ -354,7 +351,7 @@ VALUE cpu_and_wall_time_collector_sample(VALUE self_instance) {
|
|
|
354
351
|
);
|
|
355
352
|
long wall_time_elapsed_ns = update_time_since_previous_sample(
|
|
356
353
|
&thread_context->wall_time_at_previous_sample_ns,
|
|
357
|
-
|
|
354
|
+
current_monotonic_wall_time_ns,
|
|
358
355
|
thread_context->gc_tracking.wall_time_at_start_ns,
|
|
359
356
|
IS_WALL_TIME
|
|
360
357
|
);
|
|
@@ -376,12 +373,9 @@ VALUE cpu_and_wall_time_collector_sample(VALUE self_instance) {
|
|
|
376
373
|
|
|
377
374
|
state->sample_count++;
|
|
378
375
|
|
|
379
|
-
// TODO: This seems somewhat overkill and inefficient to do often; right now we just
|
|
376
|
+
// TODO: This seems somewhat overkill and inefficient to do often; right now we just do it every few samples
|
|
380
377
|
// but there's probably a better way to do this if we actually track when threads finish
|
|
381
378
|
if (state->sample_count % 100 == 0) remove_context_for_dead_threads(state);
|
|
382
|
-
|
|
383
|
-
// Return a VALUE to make it easier to call this function from Ruby APIs that expect a return value (such as rb_rescue2)
|
|
384
|
-
return Qnil;
|
|
385
379
|
}
|
|
386
380
|
|
|
387
381
|
// This function gets called when Ruby is about to start running the Garbage Collector on the current thread.
|
|
@@ -425,7 +419,7 @@ void cpu_and_wall_time_collector_on_gc_start(VALUE self_instance) {
|
|
|
425
419
|
thread_context->gc_tracking.wall_time_at_finish_ns != INVALID_TIME) return;
|
|
426
420
|
|
|
427
421
|
// Here we record the wall-time first and in on_gc_finish we record it second to avoid having wall-time be slightly < cpu-time
|
|
428
|
-
thread_context->gc_tracking.wall_time_at_start_ns =
|
|
422
|
+
thread_context->gc_tracking.wall_time_at_start_ns = monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE);
|
|
429
423
|
thread_context->gc_tracking.cpu_time_at_start_ns = cpu_time_now_ns(thread_context);
|
|
430
424
|
}
|
|
431
425
|
|
|
@@ -461,7 +455,7 @@ void cpu_and_wall_time_collector_on_gc_finish(VALUE self_instance) {
|
|
|
461
455
|
|
|
462
456
|
// Here we record the wall-time second and in on_gc_start we record it first to avoid having wall-time be slightly < cpu-time
|
|
463
457
|
thread_context->gc_tracking.cpu_time_at_finish_ns = cpu_time_now_ns(thread_context);
|
|
464
|
-
thread_context->gc_tracking.wall_time_at_finish_ns =
|
|
458
|
+
thread_context->gc_tracking.wall_time_at_finish_ns = monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE);
|
|
465
459
|
}
|
|
466
460
|
|
|
467
461
|
// This function gets called shortly after Ruby has finished running the Garbage Collector.
|
|
@@ -583,7 +577,7 @@ static void trigger_sample_for_thread(
|
|
|
583
577
|
|
|
584
578
|
if (trace_identifiers_result.valid) {
|
|
585
579
|
labels[label_pos++] = (ddog_Label) {.key = DDOG_CHARSLICE_C("local root span id"), .str = trace_identifiers_result.local_root_span_id};
|
|
586
|
-
labels[label_pos++] = (ddog_Label) {.key = DDOG_CHARSLICE_C("span id"), .
|
|
580
|
+
labels[label_pos++] = (ddog_Label) {.key = DDOG_CHARSLICE_C("span id"), .num = trace_identifiers_result.span_id};
|
|
587
581
|
|
|
588
582
|
if (trace_identifiers_result.trace_endpoint != Qnil) {
|
|
589
583
|
// The endpoint gets recorded in a different way because it is mutable in the tracer and can change during a
|
|
@@ -693,8 +687,6 @@ static VALUE per_thread_context_st_table_as_ruby_hash(struct cpu_and_wall_time_c
|
|
|
693
687
|
return result;
|
|
694
688
|
}
|
|
695
689
|
|
|
696
|
-
#define VALUE_COUNT(array) (sizeof(array) / sizeof(VALUE))
|
|
697
|
-
|
|
698
690
|
static int per_thread_context_as_ruby_hash(st_data_t key_thread, st_data_t value_context, st_data_t result_hash) {
|
|
699
691
|
VALUE thread = (VALUE) key_thread;
|
|
700
692
|
struct per_thread_context *thread_context = (struct per_thread_context*) value_context;
|
|
@@ -723,8 +715,8 @@ static VALUE stats_as_ruby_hash(struct cpu_and_wall_time_collector_state *state)
|
|
|
723
715
|
// Update this when modifying state struct (stats inner struct)
|
|
724
716
|
VALUE stats_as_hash = rb_hash_new();
|
|
725
717
|
VALUE arguments[] = {
|
|
726
|
-
ID2SYM(rb_intern("gc_samples")), /* => */
|
|
727
|
-
ID2SYM(rb_intern("gc_samples_missed_due_to_missing_context")), /* => */
|
|
718
|
+
ID2SYM(rb_intern("gc_samples")), /* => */ UINT2NUM(state->stats.gc_samples),
|
|
719
|
+
ID2SYM(rb_intern("gc_samples_missed_due_to_missing_context")), /* => */ UINT2NUM(state->stats.gc_samples_missed_due_to_missing_context),
|
|
728
720
|
};
|
|
729
721
|
for (long unsigned int i = 0; i < VALUE_COUNT(arguments); i += 2) rb_hash_aset(stats_as_hash, arguments[i], arguments[i+1]);
|
|
730
722
|
return stats_as_hash;
|
|
@@ -794,18 +786,6 @@ static long update_time_since_previous_sample(long *time_at_previous_sample_ns,
|
|
|
794
786
|
return elapsed_time_ns;
|
|
795
787
|
}
|
|
796
788
|
|
|
797
|
-
// Safety: This function is assumed never to raise exceptions by callers when raise_on_failure == false
|
|
798
|
-
static long wall_time_now_ns(bool raise_on_failure) {
|
|
799
|
-
struct timespec current_monotonic;
|
|
800
|
-
|
|
801
|
-
if (clock_gettime(CLOCK_MONOTONIC, ¤t_monotonic) != 0) {
|
|
802
|
-
if (raise_on_failure) rb_sys_fail("Failed to read CLOCK_MONOTONIC");
|
|
803
|
-
else return 0;
|
|
804
|
-
}
|
|
805
|
-
|
|
806
|
-
return current_monotonic.tv_nsec + (current_monotonic.tv_sec * 1000 * 1000 * 1000);
|
|
807
|
-
}
|
|
808
|
-
|
|
809
789
|
// Safety: This function is assumed never to raise exceptions by callers
|
|
810
790
|
static long cpu_time_now_ns(struct per_thread_context *thread_context) {
|
|
811
791
|
thread_cpu_time cpu_time = thread_cpu_time_for(thread_context->thread_cpu_time_id);
|
|
@@ -872,19 +852,13 @@ static void trace_identifiers_for(struct cpu_and_wall_time_collector_state *stat
|
|
|
872
852
|
if (numeric_local_root_span_id == Qnil || numeric_span_id == Qnil) return;
|
|
873
853
|
|
|
874
854
|
unsigned long long local_root_span_id = NUM2ULL(numeric_local_root_span_id);
|
|
875
|
-
unsigned long long span_id = NUM2ULL(numeric_span_id);
|
|
876
|
-
|
|
877
855
|
snprintf(trace_identifiers_result->local_root_span_id_buffer, MAXIMUM_LENGTH_64_BIT_IDENTIFIER, "%llu", local_root_span_id);
|
|
878
|
-
snprintf(trace_identifiers_result->span_id_buffer, MAXIMUM_LENGTH_64_BIT_IDENTIFIER, "%llu", span_id);
|
|
879
856
|
|
|
880
857
|
trace_identifiers_result->local_root_span_id = (ddog_CharSlice) {
|
|
881
858
|
.ptr = trace_identifiers_result->local_root_span_id_buffer,
|
|
882
859
|
.len = strlen(trace_identifiers_result->local_root_span_id_buffer)
|
|
883
860
|
};
|
|
884
|
-
trace_identifiers_result->span_id = (
|
|
885
|
-
.ptr = trace_identifiers_result->span_id_buffer,
|
|
886
|
-
.len = strlen(trace_identifiers_result->span_id_buffer)
|
|
887
|
-
};
|
|
861
|
+
trace_identifiers_result->span_id = NUM2ULL(numeric_span_id);
|
|
888
862
|
|
|
889
863
|
trace_identifiers_result->valid = true;
|
|
890
864
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
#include <ruby.h>
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
void cpu_and_wall_time_collector_sample(VALUE self_instance, long current_monotonic_wall_time_ns);
|
|
6
6
|
VALUE cpu_and_wall_time_collector_sample_after_gc(VALUE self_instance);
|
|
7
7
|
void cpu_and_wall_time_collector_on_gc_start(VALUE self_instance);
|
|
8
8
|
void cpu_and_wall_time_collector_on_gc_finish(VALUE self_instance);
|