ddtrace 1.5.2 → 1.6.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 +44 -1
- data/ext/ddtrace_profiling_loader/ddtrace_profiling_loader.c +9 -2
- data/ext/ddtrace_profiling_loader/extconf.rb +17 -0
- data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +38 -2
- data/ext/ddtrace_profiling_native_extension/clock_id.h +1 -0
- data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +1 -0
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +517 -42
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +3 -0
- data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +208 -30
- data/ext/ddtrace_profiling_native_extension/collectors_stack.c +156 -46
- data/ext/ddtrace_profiling_native_extension/collectors_stack.h +11 -2
- data/ext/ddtrace_profiling_native_extension/extconf.rb +11 -1
- data/ext/ddtrace_profiling_native_extension/http_transport.c +83 -64
- data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +4 -4
- data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +3 -2
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +59 -0
- data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +3 -0
- data/ext/ddtrace_profiling_native_extension/profiling.c +10 -0
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +0 -1
- data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +4 -2
- data/ext/ddtrace_profiling_native_extension/stack_recorder.c +45 -29
- data/ext/ddtrace_profiling_native_extension/stack_recorder.h +7 -7
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +4 -0
- data/lib/datadog/appsec/event.rb +6 -0
- data/lib/datadog/core/configuration/components.rb +20 -14
- data/lib/datadog/core/configuration/settings.rb +42 -4
- data/lib/datadog/core/diagnostics/environment_logger.rb +5 -1
- data/lib/datadog/core/utils/compression.rb +5 -1
- data/lib/datadog/core.rb +0 -54
- data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +12 -2
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +5 -3
- data/lib/datadog/profiling/exporter.rb +2 -4
- data/lib/datadog/profiling/http_transport.rb +1 -1
- data/lib/datadog/tracing/configuration/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/aws/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/dalli/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +4 -0
- data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +3 -0
- data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +2 -0
- data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +2 -0
- data/lib/datadog/tracing/contrib/excon/middleware.rb +2 -0
- data/lib/datadog/tracing/contrib/ext.rb +6 -0
- data/lib/datadog/tracing/contrib/faraday/middleware.rb +2 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +5 -0
- data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +7 -1
- data/lib/datadog/tracing/contrib/grpc/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +47 -0
- data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +22 -0
- data/lib/datadog/tracing/contrib/hanami/ext.rb +24 -0
- data/lib/datadog/tracing/contrib/hanami/integration.rb +44 -0
- data/lib/datadog/tracing/contrib/hanami/patcher.rb +33 -0
- data/lib/datadog/tracing/contrib/hanami/plugin.rb +23 -0
- data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +41 -0
- data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +44 -0
- data/lib/datadog/tracing/contrib/http/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +2 -0
- data/lib/datadog/tracing/contrib/mongodb/ext.rb +7 -0
- data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +4 -0
- data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +12 -0
- data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -0
- data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +16 -0
- data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +12 -0
- data/lib/datadog/tracing/contrib/pg/ext.rb +2 -1
- data/lib/datadog/tracing/contrib/pg/instrumentation.rb +34 -18
- data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +43 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +32 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +28 -0
- data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +49 -0
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +11 -5
- data/lib/datadog/tracing/contrib/redis/ext.rb +2 -0
- data/lib/datadog/tracing/contrib/redis/instrumentation.rb +4 -2
- data/lib/datadog/tracing/contrib/redis/patcher.rb +41 -0
- data/lib/datadog/tracing/contrib/redis/tags.rb +5 -0
- data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +2 -0
- data/lib/datadog/tracing/contrib/sinatra/env.rb +12 -23
- data/lib/datadog/tracing/contrib/sinatra/ext.rb +7 -3
- data/lib/datadog/tracing/contrib/sinatra/patcher.rb +2 -2
- data/lib/datadog/tracing/contrib/sinatra/tracer.rb +8 -80
- data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +14 -9
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +84 -0
- data/lib/datadog/tracing/distributed/headers/datadog.rb +122 -30
- data/lib/datadog/tracing/distributed/headers/ext.rb +2 -0
- data/lib/datadog/tracing/flush.rb +1 -1
- data/lib/datadog/tracing/metadata/ext.rb +8 -0
- data/lib/datadog/tracing/propagation/http.rb +9 -1
- data/lib/datadog/tracing/sampling/ext.rb +31 -0
- data/lib/datadog/tracing/sampling/priority_sampler.rb +46 -4
- data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +8 -9
- data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +29 -5
- data/lib/datadog/tracing/sampling/rate_sampler.rb +10 -3
- data/lib/datadog/tracing/sampling/rule_sampler.rb +4 -3
- data/lib/datadog/tracing/sampling/span/ext.rb +0 -4
- data/lib/datadog/tracing/sampling/span/rule.rb +1 -1
- data/lib/datadog/tracing/sampling/span/sampler.rb +14 -3
- data/lib/datadog/tracing/trace_digest.rb +3 -0
- data/lib/datadog/tracing/trace_operation.rb +10 -0
- data/lib/datadog/tracing/trace_segment.rb +6 -0
- data/lib/datadog/tracing/tracer.rb +3 -1
- data/lib/datadog/tracing/writer.rb +7 -0
- data/lib/ddtrace/transport/trace_formatter.rb +7 -0
- data/lib/ddtrace/transport/traces.rb +1 -1
- data/lib/ddtrace/version.rb +2 -2
- metadata +18 -14
- data/lib/datadog/profiling/old_ext.rb +0 -42
- data/lib/datadog/profiling/transport/http/api/endpoint.rb +0 -85
- data/lib/datadog/profiling/transport/http/api/instance.rb +0 -38
- data/lib/datadog/profiling/transport/http/api/spec.rb +0 -42
- data/lib/datadog/profiling/transport/http/api.rb +0 -45
- data/lib/datadog/profiling/transport/http/builder.rb +0 -30
- data/lib/datadog/profiling/transport/http/client.rb +0 -37
- data/lib/datadog/profiling/transport/http/response.rb +0 -21
- data/lib/datadog/profiling/transport/http.rb +0 -118
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 583531c81dd828631484d4d0d312b77fda75ee12b2a6a4e60c1d235a2743394d
|
|
4
|
+
data.tar.gz: c398e707e66269cc1857d0da25932ec89b943d14202206d5e540c0b9d449f1b8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: ef70965d60a3bd97e474b74a59e3d88eeea026a2cc8c843ca96f2aa2e137d4a5a6dcf9a9bc1b1ba282cabf9fa73bc54038b698c06ec2769ffe50e767802cb0eb
|
|
7
|
+
data.tar.gz: b3c24f7d7322a1a3b080b2decc8262f8cf62ba9ccd59629345696c3b3285f8404ad6a42b3dad6c359d37623ce2a30b392c720d70164605162487ee5cf2a5e483
|
data/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,35 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [1.6.0] - 2022-11-15
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
* Trace level tags propagation in distributed tracing ([#2260][])
|
|
10
|
+
* [hanami]: Hanami 1.x instrumentation ([#2230][])
|
|
11
|
+
* [pg, mysql2]: option `comment_propagation` for SQL comment propagation, default is `disabled` ([#2339][])([#2324][])
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
* [rack, sinatra]: Squash nested spans and improve patching mechanism.<br> No need to `register Datadog::Tracing::Contrib::Sinatra::Tracer`([#2217][])
|
|
16
|
+
* [rails, rack]: Fix Non-GET request method with rails exception controller ([#2317][])
|
|
17
|
+
* Upgrade to libdatadog 0.9.0.1.0 ([#2302][])
|
|
18
|
+
* Remove legacy profiling transport ([#2062][])
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
* [redis]: Fix redis instance configuration, not on `client` ([#2363][])
|
|
23
|
+
```
|
|
24
|
+
# Change your code from
|
|
25
|
+
Datadog.configure_onto(redis.client, service_name: '...')
|
|
26
|
+
# to
|
|
27
|
+
Datadog.configure_onto(redis, service_name: '...')
|
|
28
|
+
```
|
|
29
|
+
* Allow `DD_TAGS` values to have the colon character ([#2292][])
|
|
30
|
+
* Ensure that `TraceSegment` can be reported correctly when they are dropped ([#2335][])
|
|
31
|
+
* Docs: Fixes upgrade guide on configure_onto ([#2307][])
|
|
32
|
+
* Fix environment logger with IO transport ([#2313][])
|
|
33
|
+
|
|
5
34
|
## [1.5.2] - 2022-10-27
|
|
6
35
|
|
|
7
36
|
### Deprecation notice
|
|
@@ -2159,7 +2188,8 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
|
|
|
2159
2188
|
|
|
2160
2189
|
Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
2161
2190
|
|
|
2162
|
-
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.
|
|
2191
|
+
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.6.0...master
|
|
2192
|
+
[1.6.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.5.2...v1.6.0
|
|
2163
2193
|
[1.5.2]: https://github.com/DataDog/dd-trace-rb/compare/v1.5.1...v1.5.2
|
|
2164
2194
|
[1.5.1]: https://github.com/DataDog/dd-trace-rb/compare/v1.5.0...v1.5.1
|
|
2165
2195
|
[1.5.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.4.2...v1.5.0
|
|
@@ -3018,6 +3048,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
3018
3048
|
[#2054]: https://github.com/DataDog/dd-trace-rb/issues/2054
|
|
3019
3049
|
[#2059]: https://github.com/DataDog/dd-trace-rb/issues/2059
|
|
3020
3050
|
[#2061]: https://github.com/DataDog/dd-trace-rb/issues/2061
|
|
3051
|
+
[#2062]: https://github.com/DataDog/dd-trace-rb/issues/2062
|
|
3021
3052
|
[#2066]: https://github.com/DataDog/dd-trace-rb/issues/2066
|
|
3022
3053
|
[#2069]: https://github.com/DataDog/dd-trace-rb/issues/2069
|
|
3023
3054
|
[#2070]: https://github.com/DataDog/dd-trace-rb/issues/2070
|
|
@@ -3048,29 +3079,41 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
3048
3079
|
[#2191]: https://github.com/DataDog/dd-trace-rb/issues/2191
|
|
3049
3080
|
[#2200]: https://github.com/DataDog/dd-trace-rb/issues/2200
|
|
3050
3081
|
[#2201]: https://github.com/DataDog/dd-trace-rb/issues/2201
|
|
3082
|
+
[#2217]: https://github.com/DataDog/dd-trace-rb/issues/2217
|
|
3051
3083
|
[#2219]: https://github.com/DataDog/dd-trace-rb/issues/2219
|
|
3052
3084
|
[#2229]: https://github.com/DataDog/dd-trace-rb/issues/2229
|
|
3085
|
+
[#2230]: https://github.com/DataDog/dd-trace-rb/issues/2230
|
|
3053
3086
|
[#2248]: https://github.com/DataDog/dd-trace-rb/issues/2248
|
|
3054
3087
|
[#2250]: https://github.com/DataDog/dd-trace-rb/issues/2250
|
|
3055
3088
|
[#2252]: https://github.com/DataDog/dd-trace-rb/issues/2252
|
|
3056
3089
|
[#2257]: https://github.com/DataDog/dd-trace-rb/issues/2257
|
|
3057
3090
|
[#2258]: https://github.com/DataDog/dd-trace-rb/issues/2258
|
|
3091
|
+
[#2260]: https://github.com/DataDog/dd-trace-rb/issues/2260
|
|
3058
3092
|
[#2265]: https://github.com/DataDog/dd-trace-rb/issues/2265
|
|
3059
3093
|
[#2267]: https://github.com/DataDog/dd-trace-rb/issues/2267
|
|
3060
3094
|
[#2279]: https://github.com/DataDog/dd-trace-rb/issues/2279
|
|
3061
3095
|
[#2283]: https://github.com/DataDog/dd-trace-rb/issues/2283
|
|
3062
3096
|
[#2289]: https://github.com/DataDog/dd-trace-rb/issues/2289
|
|
3097
|
+
[#2292]: https://github.com/DataDog/dd-trace-rb/issues/2292
|
|
3063
3098
|
[#2293]: https://github.com/DataDog/dd-trace-rb/issues/2293
|
|
3064
3099
|
[#2296]: https://github.com/DataDog/dd-trace-rb/issues/2296
|
|
3100
|
+
[#2302]: https://github.com/DataDog/dd-trace-rb/issues/2302
|
|
3065
3101
|
[#2306]: https://github.com/DataDog/dd-trace-rb/issues/2306
|
|
3102
|
+
[#2307]: https://github.com/DataDog/dd-trace-rb/issues/2307
|
|
3066
3103
|
[#2310]: https://github.com/DataDog/dd-trace-rb/issues/2310
|
|
3067
3104
|
[#2311]: https://github.com/DataDog/dd-trace-rb/issues/2311
|
|
3105
|
+
[#2313]: https://github.com/DataDog/dd-trace-rb/issues/2313
|
|
3106
|
+
[#2317]: https://github.com/DataDog/dd-trace-rb/issues/2317
|
|
3068
3107
|
[#2318]: https://github.com/DataDog/dd-trace-rb/issues/2318
|
|
3069
3108
|
[#2319]: https://github.com/DataDog/dd-trace-rb/issues/2319
|
|
3070
3109
|
[#2321]: https://github.com/DataDog/dd-trace-rb/issues/2321
|
|
3110
|
+
[#2324]: https://github.com/DataDog/dd-trace-rb/issues/2324
|
|
3071
3111
|
[#2328]: https://github.com/DataDog/dd-trace-rb/issues/2328
|
|
3072
3112
|
[#2330]: https://github.com/DataDog/dd-trace-rb/issues/2330
|
|
3073
3113
|
[#2331]: https://github.com/DataDog/dd-trace-rb/issues/2331
|
|
3114
|
+
[#2335]: https://github.com/DataDog/dd-trace-rb/issues/2335
|
|
3115
|
+
[#2339]: https://github.com/DataDog/dd-trace-rb/issues/2339
|
|
3116
|
+
[#2363]: https://github.com/DataDog/dd-trace-rb/issues/2363
|
|
3074
3117
|
[@AdrianLC]: https://github.com/AdrianLC
|
|
3075
3118
|
[@Azure7111]: https://github.com/Azure7111
|
|
3076
3119
|
[@BabyGroot]: https://github.com/BabyGroot
|
|
@@ -29,10 +29,17 @@
|
|
|
29
29
|
#define RTLD_DEEPBIND 0
|
|
30
30
|
#endif
|
|
31
31
|
|
|
32
|
+
// Used to mark function arguments that are deliberately left unused
|
|
33
|
+
#ifdef __GNUC__
|
|
34
|
+
#define DDTRACE_UNUSED __attribute__((unused))
|
|
35
|
+
#else
|
|
36
|
+
#define DDTRACE_UNUSED
|
|
37
|
+
#endif
|
|
38
|
+
|
|
32
39
|
static VALUE ok_symbol = Qnil; // :ok in Ruby
|
|
33
40
|
static VALUE error_symbol = Qnil; // :error in Ruby
|
|
34
41
|
|
|
35
|
-
static VALUE _native_load(VALUE self, VALUE ruby_path, VALUE ruby_init_name);
|
|
42
|
+
static VALUE _native_load(DDTRACE_UNUSED VALUE self, VALUE ruby_path, VALUE ruby_init_name);
|
|
36
43
|
static bool failed_to_load(void *handle, VALUE *failure_details);
|
|
37
44
|
static bool incompatible_library(void *handle, VALUE *failure_details);
|
|
38
45
|
static bool failed_to_initialize(void *handle, char *init_name, VALUE *failure_details);
|
|
@@ -51,7 +58,7 @@ void DDTRACE_EXPORT Init_ddtrace_profiling_loader(void) {
|
|
|
51
58
|
error_symbol = ID2SYM(rb_intern_const("error"));
|
|
52
59
|
}
|
|
53
60
|
|
|
54
|
-
static VALUE _native_load(VALUE self, VALUE ruby_path, VALUE ruby_init_name) {
|
|
61
|
+
static VALUE _native_load(DDTRACE_UNUSED VALUE self, VALUE ruby_path, VALUE ruby_init_name) {
|
|
55
62
|
Check_Type(ruby_path, T_STRING);
|
|
56
63
|
Check_Type(ruby_init_name, T_STRING);
|
|
57
64
|
|
|
@@ -24,6 +24,16 @@ def add_compiler_flag(flag)
|
|
|
24
24
|
end
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
+
# Because we can't control what compiler versions our customers use, shipping with -Werror by default is a no-go.
|
|
28
|
+
# But we can enable it in CI, so that we quickly spot any new warnings that just got introduced.
|
|
29
|
+
add_compiler_flag '-Werror' if ENV['CI'] == 'true'
|
|
30
|
+
|
|
31
|
+
# Older gcc releases may not default to C99 and we need to ask for this. This is also used:
|
|
32
|
+
# * by upstream Ruby -- search for gnu99 in the codebase
|
|
33
|
+
# * by msgpack, another ddtrace dependency
|
|
34
|
+
# (https://github.com/msgpack/msgpack-ruby/blob/18ce08f6d612fe973843c366ac9a0b74c4e50599/ext/msgpack/extconf.rb#L8)
|
|
35
|
+
add_compiler_flag '-std=gnu99'
|
|
36
|
+
|
|
27
37
|
# Gets really noisy when we include the MJIT header, let's omit it
|
|
28
38
|
add_compiler_flag '-Wno-unused-function'
|
|
29
39
|
|
|
@@ -34,6 +44,9 @@ add_compiler_flag '-Wno-declaration-after-statement'
|
|
|
34
44
|
# cause a segfault later. Let's ensure that never happens.
|
|
35
45
|
add_compiler_flag '-Werror-implicit-function-declaration'
|
|
36
46
|
|
|
47
|
+
# Warn on unused parameters to functions. Use `DDTRACE_UNUSED` to mark things as known-to-not-be-used.
|
|
48
|
+
add_compiler_flag '-Wunused-parameter'
|
|
49
|
+
|
|
37
50
|
# The native extension is not intended to expose any symbols/functions for other native libraries to use;
|
|
38
51
|
# the sole exception being `Init_ddtrace_profiling_loader` which needs to be visible for Ruby to call it when
|
|
39
52
|
# it `dlopen`s the library.
|
|
@@ -42,6 +55,10 @@ add_compiler_flag '-Werror-implicit-function-declaration'
|
|
|
42
55
|
# For more details see https://gcc.gnu.org/wiki/Visibility
|
|
43
56
|
add_compiler_flag '-fvisibility=hidden'
|
|
44
57
|
|
|
58
|
+
# Enable all other compiler warnings
|
|
59
|
+
add_compiler_flag '-Wall'
|
|
60
|
+
add_compiler_flag '-Wextra'
|
|
61
|
+
|
|
45
62
|
# Tag the native extension library with the Ruby version and Ruby platform.
|
|
46
63
|
# This makes it easier for development (avoids "oops I forgot to rebuild when I switched my Ruby") and ensures that
|
|
47
64
|
# the wrong library is never loaded.
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
# Profiling Native Extension Design
|
|
2
2
|
|
|
3
3
|
The profiling native extension is used to:
|
|
4
|
+
|
|
4
5
|
1. Implement features which are expensive (in terms of resources) or otherwise impossible to implement using Ruby code.
|
|
5
6
|
2. Bridge between Ruby-specific profiling features and [`libdatadog`](https://github.com/DataDog/libdatadog), a Rust-based
|
|
6
7
|
library with common profiling functionality.
|
|
@@ -20,8 +21,8 @@ and disabling the extension will disable profiling.
|
|
|
20
21
|
|
|
21
22
|
## Who is this page for?
|
|
22
23
|
|
|
23
|
-
This documentation is intended to be used by dd-trace-rb developers. Please see the `docs/` folder for user-level
|
|
24
|
-
documentation
|
|
24
|
+
**This documentation is intended to be used by dd-trace-rb developers. Please see the `docs/` folder for user-level
|
|
25
|
+
documentation.**
|
|
25
26
|
|
|
26
27
|
## Must not block or break users that cannot use it
|
|
27
28
|
|
|
@@ -118,3 +119,38 @@ Note that `pthread_getcpuclockid()` is not available on macOS (nor, obviously, o
|
|
|
118
119
|
is currently Linux-specific. Thus, in the <clock_id_from_pthread.c> file we implement the feature for supported Ruby
|
|
119
120
|
setups but if something is missing we instead compile in <clock_id_noop.c> that includes a no-op implementation of the
|
|
120
121
|
feature.
|
|
122
|
+
|
|
123
|
+
## Fork-safety
|
|
124
|
+
|
|
125
|
+
It's common for Ruby applications to create child processes via the use of `fork`. For instance, this strategy is used
|
|
126
|
+
by the puma webserver and the resque job processing tool.
|
|
127
|
+
|
|
128
|
+
Thus, the profiler needs to be designed to take this into account. I'll call out two important parts of this design:
|
|
129
|
+
|
|
130
|
+
1. Automatically propagate profiler to child processes. To make onboarding easier, we monkey patch the Ruby `fork` APIs
|
|
131
|
+
so that the profiler is automatically restarted in child processes. This way, the user only needs to start profiling at
|
|
132
|
+
the beginning of their application, and automatically forks are profiled as well.
|
|
133
|
+
|
|
134
|
+
2. The profiler must ensure correctness and stability even if the application forks. There must be no impact on the
|
|
135
|
+
application or incorrect data generated.
|
|
136
|
+
|
|
137
|
+
### Fork-safety for libdatadog
|
|
138
|
+
|
|
139
|
+
Since libdatadog is built in native code (Rust), special care needs to be take to consider how we're using it and how
|
|
140
|
+
it can be affected by the use of `fork`.
|
|
141
|
+
|
|
142
|
+
* Profile-related APIs: `Profile_new` and `Profile_add` and `Profile_free` are only called with the Ruby Global VM Lock
|
|
143
|
+
being held. Thus, if Ruby APIs are being used for fork, this prevents any concurrency between profile mutation and
|
|
144
|
+
forking, because if we’re holding the lock, then no other thread can call into the fork APIs.
|
|
145
|
+
(Calling libc `fork()` directly from a native extension is possible but would break the VM as well, since it does need
|
|
146
|
+
to do some of its own work when forking happens, so we’ll ignore that one)
|
|
147
|
+
|
|
148
|
+
* Exporter-related APIs: Explicitly to make sure we had no issues with forking, we create a new `CancellationToken_new`
|
|
149
|
+
and `ProfileExporterV3_new` for every report. We do release the Global VM Lock during exporting, so it's possible for
|
|
150
|
+
forking and exporting to be concurrent.
|
|
151
|
+
|
|
152
|
+
Both the CancellationToken and ProfileExporter are only referenced on the stack of the thread doing the exporting, so
|
|
153
|
+
they will not be reused in the child process after the fork. In the worst case, if a report is concurrent with a fork,
|
|
154
|
+
then it's possible a small amount of memory will not be cleaned up in the child process.
|
|
155
|
+
|
|
156
|
+
Because there is no leftover undefined state, we guarantee correctness for the exporter APIs.
|
|
@@ -20,5 +20,6 @@ void self_test_clock_id(void);
|
|
|
20
20
|
// TODO: Remove this after the OldStack profiler gets removed
|
|
21
21
|
VALUE clock_id_for(VALUE self, VALUE thread);
|
|
22
22
|
|
|
23
|
+
// Safety: This function is assumed never to raise exceptions by callers
|
|
23
24
|
thread_cpu_time_id thread_cpu_time_id_for(VALUE thread);
|
|
24
25
|
thread_cpu_time thread_cpu_time_for(thread_cpu_time_id time_id);
|
|
@@ -43,6 +43,7 @@ VALUE clock_id_for(DDTRACE_UNUSED VALUE _self, VALUE thread) {
|
|
|
43
43
|
}
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
+
// Safety: This function is assumed never to raise exceptions by callers
|
|
46
47
|
thread_cpu_time_id thread_cpu_time_id_for(VALUE thread) {
|
|
47
48
|
rb_nativethread_id_t thread_id = pthread_id_for(thread);
|
|
48
49
|
clockid_t clock_id;
|