ddtrace 1.5.1 → 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 +63 -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 +44 -18
- data/lib/datadog/appsec/event.rb +8 -4
- data/lib/datadog/core/configuration/components.rb +20 -14
- data/lib/datadog/core/configuration/settings.rb +59 -7
- 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/client_ip.rb +11 -0
- data/lib/datadog/tracing/configuration/ext.rb +3 -1
- 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 +15 -7
- 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,49 @@
|
|
|
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
|
+
|
|
34
|
+
## [1.5.2] - 2022-10-27
|
|
35
|
+
|
|
36
|
+
### Deprecation notice
|
|
37
|
+
|
|
38
|
+
- `DD_TRACE_CLIENT_IP_HEADER_DISABLED` was changed to `DD_TRACE_CLIENT_IP_ENABLED`. Although the former still works we encourage usage of the latter instead.
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
|
|
42
|
+
- `http.client_ip` tag collection is made opt-in for APM. Note that `http.client_ip` is always collected when ASM is enabled as part of the security service provided ([#2321][], [#2331][])
|
|
43
|
+
|
|
44
|
+
### Fixed
|
|
45
|
+
|
|
46
|
+
- Handle REQUEST_URI with base url ([#2328][], [#2330][])
|
|
47
|
+
|
|
5
48
|
## [1.5.1] - 2022-10-19
|
|
6
49
|
|
|
7
50
|
### Changed
|
|
@@ -2145,7 +2188,9 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
|
|
|
2145
2188
|
|
|
2146
2189
|
Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
2147
2190
|
|
|
2148
|
-
[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
|
|
2193
|
+
[1.5.2]: https://github.com/DataDog/dd-trace-rb/compare/v1.5.1...v1.5.2
|
|
2149
2194
|
[1.5.1]: https://github.com/DataDog/dd-trace-rb/compare/v1.5.0...v1.5.1
|
|
2150
2195
|
[1.5.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.4.2...v1.5.0
|
|
2151
2196
|
[1.4.1]: https://github.com/DataDog/dd-trace-rb/compare/v1.4.1...v1.4.2
|
|
@@ -3003,6 +3048,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
3003
3048
|
[#2054]: https://github.com/DataDog/dd-trace-rb/issues/2054
|
|
3004
3049
|
[#2059]: https://github.com/DataDog/dd-trace-rb/issues/2059
|
|
3005
3050
|
[#2061]: https://github.com/DataDog/dd-trace-rb/issues/2061
|
|
3051
|
+
[#2062]: https://github.com/DataDog/dd-trace-rb/issues/2062
|
|
3006
3052
|
[#2066]: https://github.com/DataDog/dd-trace-rb/issues/2066
|
|
3007
3053
|
[#2069]: https://github.com/DataDog/dd-trace-rb/issues/2069
|
|
3008
3054
|
[#2070]: https://github.com/DataDog/dd-trace-rb/issues/2070
|
|
@@ -3033,25 +3079,41 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
|
3033
3079
|
[#2191]: https://github.com/DataDog/dd-trace-rb/issues/2191
|
|
3034
3080
|
[#2200]: https://github.com/DataDog/dd-trace-rb/issues/2200
|
|
3035
3081
|
[#2201]: https://github.com/DataDog/dd-trace-rb/issues/2201
|
|
3082
|
+
[#2217]: https://github.com/DataDog/dd-trace-rb/issues/2217
|
|
3036
3083
|
[#2219]: https://github.com/DataDog/dd-trace-rb/issues/2219
|
|
3037
3084
|
[#2229]: https://github.com/DataDog/dd-trace-rb/issues/2229
|
|
3085
|
+
[#2230]: https://github.com/DataDog/dd-trace-rb/issues/2230
|
|
3038
3086
|
[#2248]: https://github.com/DataDog/dd-trace-rb/issues/2248
|
|
3039
3087
|
[#2250]: https://github.com/DataDog/dd-trace-rb/issues/2250
|
|
3040
3088
|
[#2252]: https://github.com/DataDog/dd-trace-rb/issues/2252
|
|
3041
3089
|
[#2257]: https://github.com/DataDog/dd-trace-rb/issues/2257
|
|
3042
3090
|
[#2258]: https://github.com/DataDog/dd-trace-rb/issues/2258
|
|
3091
|
+
[#2260]: https://github.com/DataDog/dd-trace-rb/issues/2260
|
|
3043
3092
|
[#2265]: https://github.com/DataDog/dd-trace-rb/issues/2265
|
|
3044
3093
|
[#2267]: https://github.com/DataDog/dd-trace-rb/issues/2267
|
|
3045
3094
|
[#2279]: https://github.com/DataDog/dd-trace-rb/issues/2279
|
|
3046
3095
|
[#2283]: https://github.com/DataDog/dd-trace-rb/issues/2283
|
|
3047
3096
|
[#2289]: https://github.com/DataDog/dd-trace-rb/issues/2289
|
|
3097
|
+
[#2292]: https://github.com/DataDog/dd-trace-rb/issues/2292
|
|
3048
3098
|
[#2293]: https://github.com/DataDog/dd-trace-rb/issues/2293
|
|
3049
3099
|
[#2296]: https://github.com/DataDog/dd-trace-rb/issues/2296
|
|
3100
|
+
[#2302]: https://github.com/DataDog/dd-trace-rb/issues/2302
|
|
3050
3101
|
[#2306]: https://github.com/DataDog/dd-trace-rb/issues/2306
|
|
3102
|
+
[#2307]: https://github.com/DataDog/dd-trace-rb/issues/2307
|
|
3051
3103
|
[#2310]: https://github.com/DataDog/dd-trace-rb/issues/2310
|
|
3052
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
|
|
3053
3107
|
[#2318]: https://github.com/DataDog/dd-trace-rb/issues/2318
|
|
3054
3108
|
[#2319]: https://github.com/DataDog/dd-trace-rb/issues/2319
|
|
3109
|
+
[#2321]: https://github.com/DataDog/dd-trace-rb/issues/2321
|
|
3110
|
+
[#2324]: https://github.com/DataDog/dd-trace-rb/issues/2324
|
|
3111
|
+
[#2328]: https://github.com/DataDog/dd-trace-rb/issues/2328
|
|
3112
|
+
[#2330]: https://github.com/DataDog/dd-trace-rb/issues/2330
|
|
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
|
|
3055
3117
|
[@AdrianLC]: https://github.com/AdrianLC
|
|
3056
3118
|
[@Azure7111]: https://github.com/Azure7111
|
|
3057
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;
|