datadog 2.0.0.beta1 → 2.0.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +125 -1
- data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +32 -12
- data/ext/datadog_profiling_native_extension/collectors_thread_context.c +5 -2
- data/ext/datadog_profiling_native_extension/heap_recorder.c +45 -3
- data/ext/datadog_profiling_native_extension/heap_recorder.h +7 -1
- data/ext/datadog_profiling_native_extension/http_transport.c +5 -5
- data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +1 -1
- data/ext/datadog_profiling_native_extension/stack_recorder.c +7 -9
- data/lib/datadog/appsec/contrib/rack/request_middleware.rb +43 -13
- data/lib/datadog/appsec/event.rb +2 -2
- data/lib/datadog/core/configuration/components.rb +2 -1
- data/lib/datadog/core/configuration/option.rb +7 -5
- data/lib/datadog/core/configuration/settings.rb +38 -14
- data/lib/datadog/core/configuration.rb +20 -4
- data/lib/datadog/core/environment/platform.rb +7 -1
- data/lib/datadog/core/remote/client/capabilities.rb +2 -1
- data/lib/datadog/core/remote/transport/http/config.rb +5 -5
- data/lib/datadog/core/telemetry/client.rb +18 -10
- data/lib/datadog/core/telemetry/emitter.rb +9 -13
- data/lib/datadog/core/telemetry/event.rb +247 -57
- data/lib/datadog/core/telemetry/ext.rb +1 -0
- data/lib/datadog/core/telemetry/heartbeat.rb +1 -3
- data/lib/datadog/core/telemetry/http/ext.rb +4 -1
- data/lib/datadog/core/telemetry/http/transport.rb +9 -4
- data/lib/datadog/core/telemetry/request.rb +59 -0
- data/lib/datadog/core/utils/base64.rb +22 -0
- data/lib/datadog/opentelemetry/sdk/span_processor.rb +1 -1
- data/lib/datadog/opentelemetry/sdk/trace/span.rb +3 -17
- data/lib/datadog/profiling/collectors/code_provenance.rb +10 -4
- data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +25 -0
- data/lib/datadog/profiling/component.rb +23 -15
- data/lib/datadog/profiling/load_native_extension.rb +14 -1
- data/lib/datadog/profiling.rb +11 -0
- data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/action_view/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_record/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
- data/lib/datadog/tracing/contrib/grape/endpoint.rb +43 -5
- data/lib/datadog/tracing/correlation.rb +3 -4
- data/lib/datadog/tracing/sampling/matcher.rb +23 -3
- data/lib/datadog/tracing/sampling/rule.rb +18 -2
- data/lib/datadog/tracing/sampling/rule_sampler.rb +2 -0
- data/lib/datadog/tracing/span.rb +7 -2
- data/lib/datadog/tracing/span_link.rb +86 -0
- data/lib/datadog/tracing/trace_operation.rb +12 -0
- data/lib/datadog/tracing/tracer.rb +4 -3
- data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
- data/lib/datadog/tracing/utils.rb +16 -0
- data/lib/datadog/version.rb +1 -1
- metadata +7 -30
- data/lib/datadog/core/telemetry/collector.rb +0 -248
- data/lib/datadog/core/telemetry/v1/app_event.rb +0 -59
- data/lib/datadog/core/telemetry/v1/application.rb +0 -94
- data/lib/datadog/core/telemetry/v1/configuration.rb +0 -27
- data/lib/datadog/core/telemetry/v1/dependency.rb +0 -45
- data/lib/datadog/core/telemetry/v1/host.rb +0 -59
- data/lib/datadog/core/telemetry/v1/install_signature.rb +0 -38
- data/lib/datadog/core/telemetry/v1/integration.rb +0 -66
- data/lib/datadog/core/telemetry/v1/product.rb +0 -36
- data/lib/datadog/core/telemetry/v1/telemetry_request.rb +0 -108
- data/lib/datadog/core/telemetry/v2/app_client_configuration_change.rb +0 -41
- data/lib/datadog/core/telemetry/v2/request.rb +0 -29
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c98feb8dee5da784f25da37c6989ed32929eeac8189590c0aa6763303ac5076d
|
4
|
+
data.tar.gz: 9324b595c888213affe2a342c4be4dcb49643328cdf3ab0aab9616c41a9b5dd6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f4ee11c65fe76ee70b5c85d67de21a5feadc6938976a0869ae230a6d3a28c38d5ed2c8516633d2046f7fb311ed19d62de9a46317e70a1ade2d4147c139693a44
|
7
|
+
data.tar.gz: 05b8bb6ec82ddb7cd7bce5e461c5e48416df745a23cfcc724d7b2cc0de86e047a4b0e8b7d26dbf9f0b62a12f94dc0492937da3676adb97e458fb41a501a005f3
|
data/CHANGELOG.md
CHANGED
@@ -2,6 +2,72 @@
|
|
2
2
|
|
3
3
|
## [Unreleased]
|
4
4
|
|
5
|
+
## [2.0.0.beta2] - 2024-04-18
|
6
|
+
|
7
|
+
### Added
|
8
|
+
|
9
|
+
* Add Agent configuration option: `timeout_seconds`, `uds_path`, and `use_ssl` ([#3350][])
|
10
|
+
* Tracing: Add lightweight log correlation generation ([#3486][])
|
11
|
+
* Tracing: Add span links ([#3546][])
|
12
|
+
* Tracing: Add `span_remote` field to `TraceDigest` ([#3516][])
|
13
|
+
* Tracing: Add `_dd.parent_id` to `tracestate` ([#3488][])
|
14
|
+
* Tracing: Allow `RateSampler` with zero sampling rate ([#3295][])
|
15
|
+
* Grape: Add `on_error` settings ([#3370][])
|
16
|
+
|
17
|
+
### Changed
|
18
|
+
|
19
|
+
* Rename gem from `ddtrace` to `datadog` ([#3490][])
|
20
|
+
* Require Ruby `>= 2.5` ([#3291][])
|
21
|
+
* Frozen string literals ([#3392][])
|
22
|
+
* Startup logs emit when reconfigures ([#3441][])
|
23
|
+
* Enhance validation for configuration ([#3332][], [#3326][])
|
24
|
+
* Tracing: Propagation style configuration becomes case-insensitive ([#3299][])
|
25
|
+
* Tracing: Return string for `#trace_id` and `#span_id` from `Correlation::Identifier` ([#3322][])
|
26
|
+
* `Elasticsearch`: Replace instance configuration from `client` to `transport` instance ([#3399][])
|
27
|
+
* `Grape`: Change `error_statuses` settings to `error_status_codes` ([#3370][])
|
28
|
+
* `GraphQL`: Instrument with `GraphQL::Tracing::DataDogTrace` and more ([#3409][], [#3417][], [#3388][])
|
29
|
+
* `Rack`: Change http proxy span pattern ([#3369][])
|
30
|
+
* `Sidekiq`: Remove `tag_args` option and worker specific configuration ([#3396][], [#3402][])
|
31
|
+
* Integrations: Rename `error_handler` settings to `on_error` ([#3341][])
|
32
|
+
*
|
33
|
+
### Fixed
|
34
|
+
|
35
|
+
* Tracing: Fix `error_status_codes` options ([#3344][])
|
36
|
+
|
37
|
+
### Removed
|
38
|
+
|
39
|
+
* Profiling: Remove `bin/ddtracerb` ([#3506][])
|
40
|
+
* Ci-app: Remove `datadog-ci` gem dependency ([#3288][])
|
41
|
+
* Tracing: Remove `SpanOperation` aliases ([#3330][])
|
42
|
+
* Tracing: Remove `b3` style from default propagation ([#3293][])
|
43
|
+
* Tracing: Minimize sampling API ([#3423][])
|
44
|
+
* Tracing: Remove `client_ip` disabled env ([#3404][])
|
45
|
+
* Tracing: Remove `use` alias for `instrument` ([#3403][])
|
46
|
+
* Tracing: `OpenTracing`, `qless` removed ([#3398][], [#3443][])
|
47
|
+
* `Net/Http`: Remove `Datadog::Tracing::Contrib::HTTP::Instrumentation.after_request` ([#3367][])
|
48
|
+
* `Rails`: Drop support for Rails 3 ([#3324][])
|
49
|
+
* `Rails`: Remove `exception_controller` option ([#3243][])
|
50
|
+
* Remove constants, methods and more ([#3401][], [#3336][], [#3454][], [#3338][], [#3335][], [#3298][], [#3297][], [#3309][], [#3294][], [#3325][], [#3300][])
|
51
|
+
|
52
|
+
## [1.22.0] - 2024-04-16
|
53
|
+
|
54
|
+
### Added
|
55
|
+
|
56
|
+
* Tracing: Add sampling rules by trace resouce and tags ([#3587][], [#3585][])
|
57
|
+
* Appsec: Add WAF vendor header support ([#3528][])
|
58
|
+
|
59
|
+
### Changed
|
60
|
+
|
61
|
+
* Upgrade `Telemetry` to V2 ([#3551][])
|
62
|
+
* Upgrade to libdatadog 7 ([#3536][])
|
63
|
+
* Profiling: Enable Garbage Collection profiling by default ([#3558][])
|
64
|
+
* Profiling: Skip heap samples with age 0 ([#3573][])
|
65
|
+
* Profiling: Support falling back into extension directory when loading profiler ([#3582][])
|
66
|
+
|
67
|
+
### Fixed
|
68
|
+
|
69
|
+
* Appsec: Fix MIME-style newlines with strict base64 encoding ([#3565][])
|
70
|
+
|
5
71
|
## [2.0.0.beta1] - 2024-03-22
|
6
72
|
|
7
73
|
Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v2.0.0.beta1
|
@@ -2784,7 +2850,9 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
|
|
2784
2850
|
Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
2785
2851
|
|
2786
2852
|
|
2787
|
-
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.
|
2853
|
+
[Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.22.0...master
|
2854
|
+
[2.0.0.beta2]: https://github.com/DataDog/dd-trace-rb/compare/v2.0.0.beta1...v2.0.0.beta2
|
2855
|
+
[1.22.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.21.1...v1.22.0
|
2788
2856
|
[2.0.0.beta1]: https://github.com/DataDog/dd-trace-rb/compare/v1.21.1...v2.0.0.beta1
|
2789
2857
|
[1.21.1]: https://github.com/DataDog/dd-trace-rb/compare/v1.21.0...v1.21.1
|
2790
2858
|
[1.21.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.20.0...v1.21.0
|
@@ -4007,6 +4075,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
4007
4075
|
[#3235]: https://github.com/DataDog/dd-trace-rb/issues/3235
|
4008
4076
|
[#3240]: https://github.com/DataDog/dd-trace-rb/issues/3240
|
4009
4077
|
[#3242]: https://github.com/DataDog/dd-trace-rb/issues/3242
|
4078
|
+
[#3243]: https://github.com/DataDog/dd-trace-rb/issues/3243
|
4010
4079
|
[#3248]: https://github.com/DataDog/dd-trace-rb/issues/3248
|
4011
4080
|
[#3252]: https://github.com/DataDog/dd-trace-rb/issues/3252
|
4012
4081
|
[#3255]: https://github.com/DataDog/dd-trace-rb/issues/3255
|
@@ -4025,21 +4094,43 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
4025
4094
|
[#3284]: https://github.com/DataDog/dd-trace-rb/issues/3284
|
4026
4095
|
[#3286]: https://github.com/DataDog/dd-trace-rb/issues/3286
|
4027
4096
|
[#3287]: https://github.com/DataDog/dd-trace-rb/issues/3287
|
4097
|
+
[#3288]: https://github.com/DataDog/dd-trace-rb/issues/3288
|
4028
4098
|
[#3289]: https://github.com/DataDog/dd-trace-rb/issues/3289
|
4099
|
+
[#3291]: https://github.com/DataDog/dd-trace-rb/issues/3291
|
4100
|
+
[#3293]: https://github.com/DataDog/dd-trace-rb/issues/3293
|
4101
|
+
[#3294]: https://github.com/DataDog/dd-trace-rb/issues/3294
|
4102
|
+
[#3295]: https://github.com/DataDog/dd-trace-rb/issues/3295
|
4103
|
+
[#3297]: https://github.com/DataDog/dd-trace-rb/issues/3297
|
4104
|
+
[#3298]: https://github.com/DataDog/dd-trace-rb/issues/3298
|
4105
|
+
[#3299]: https://github.com/DataDog/dd-trace-rb/issues/3299
|
4106
|
+
[#3300]: https://github.com/DataDog/dd-trace-rb/issues/3300
|
4029
4107
|
[#3303]: https://github.com/DataDog/dd-trace-rb/issues/3303
|
4030
4108
|
[#3307]: https://github.com/DataDog/dd-trace-rb/issues/3307
|
4031
4109
|
[#3308]: https://github.com/DataDog/dd-trace-rb/issues/3308
|
4110
|
+
[#3309]: https://github.com/DataDog/dd-trace-rb/issues/3309
|
4032
4111
|
[#3310]: https://github.com/DataDog/dd-trace-rb/issues/3310
|
4033
4112
|
[#3313]: https://github.com/DataDog/dd-trace-rb/issues/3313
|
4034
4113
|
[#3315]: https://github.com/DataDog/dd-trace-rb/issues/3315
|
4035
4114
|
[#3316]: https://github.com/DataDog/dd-trace-rb/issues/3316
|
4036
4115
|
[#3317]: https://github.com/DataDog/dd-trace-rb/issues/3317
|
4037
4116
|
[#3320]: https://github.com/DataDog/dd-trace-rb/issues/3320
|
4117
|
+
[#3322]: https://github.com/DataDog/dd-trace-rb/issues/3322
|
4118
|
+
[#3324]: https://github.com/DataDog/dd-trace-rb/issues/3324
|
4119
|
+
[#3325]: https://github.com/DataDog/dd-trace-rb/issues/3325
|
4120
|
+
[#3326]: https://github.com/DataDog/dd-trace-rb/issues/3326
|
4038
4121
|
[#3328]: https://github.com/DataDog/dd-trace-rb/issues/3328
|
4039
4122
|
[#3329]: https://github.com/DataDog/dd-trace-rb/issues/3329
|
4123
|
+
[#3330]: https://github.com/DataDog/dd-trace-rb/issues/3330
|
4124
|
+
[#3332]: https://github.com/DataDog/dd-trace-rb/issues/3332
|
4040
4125
|
[#3333]: https://github.com/DataDog/dd-trace-rb/issues/3333
|
4126
|
+
[#3335]: https://github.com/DataDog/dd-trace-rb/issues/3335
|
4127
|
+
[#3336]: https://github.com/DataDog/dd-trace-rb/issues/3336
|
4128
|
+
[#3338]: https://github.com/DataDog/dd-trace-rb/issues/3338
|
4129
|
+
[#3341]: https://github.com/DataDog/dd-trace-rb/issues/3341
|
4130
|
+
[#3344]: https://github.com/DataDog/dd-trace-rb/issues/3344
|
4041
4131
|
[#3345]: https://github.com/DataDog/dd-trace-rb/issues/3345
|
4042
4132
|
[#3349]: https://github.com/DataDog/dd-trace-rb/issues/3349
|
4133
|
+
[#3350]: https://github.com/DataDog/dd-trace-rb/issues/3350
|
4043
4134
|
[#3352]: https://github.com/DataDog/dd-trace-rb/issues/3352
|
4044
4135
|
[#3354]: https://github.com/DataDog/dd-trace-rb/issues/3354
|
4045
4136
|
[#3356]: https://github.com/DataDog/dd-trace-rb/issues/3356
|
@@ -4049,13 +4140,28 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
4049
4140
|
[#3362]: https://github.com/DataDog/dd-trace-rb/issues/3362
|
4050
4141
|
[#3365]: https://github.com/DataDog/dd-trace-rb/issues/3365
|
4051
4142
|
[#3366]: https://github.com/DataDog/dd-trace-rb/issues/3366
|
4143
|
+
[#3367]: https://github.com/DataDog/dd-trace-rb/issues/3367
|
4144
|
+
[#3369]: https://github.com/DataDog/dd-trace-rb/issues/3369
|
4145
|
+
[#3370]: https://github.com/DataDog/dd-trace-rb/issues/3370
|
4052
4146
|
[#3373]: https://github.com/DataDog/dd-trace-rb/issues/3373
|
4053
4147
|
[#3374]: https://github.com/DataDog/dd-trace-rb/issues/3374
|
4054
4148
|
[#3386]: https://github.com/DataDog/dd-trace-rb/issues/3386
|
4149
|
+
[#3388]: https://github.com/DataDog/dd-trace-rb/issues/3388
|
4150
|
+
[#3392]: https://github.com/DataDog/dd-trace-rb/issues/3392
|
4055
4151
|
[#3395]: https://github.com/DataDog/dd-trace-rb/issues/3395
|
4152
|
+
[#3396]: https://github.com/DataDog/dd-trace-rb/issues/3396
|
4153
|
+
[#3398]: https://github.com/DataDog/dd-trace-rb/issues/3398
|
4154
|
+
[#3399]: https://github.com/DataDog/dd-trace-rb/issues/3399
|
4056
4155
|
[#3400]: https://github.com/DataDog/dd-trace-rb/issues/3400
|
4156
|
+
[#3401]: https://github.com/DataDog/dd-trace-rb/issues/3401
|
4157
|
+
[#3402]: https://github.com/DataDog/dd-trace-rb/issues/3402
|
4158
|
+
[#3403]: https://github.com/DataDog/dd-trace-rb/issues/3403
|
4159
|
+
[#3404]: https://github.com/DataDog/dd-trace-rb/issues/3404
|
4057
4160
|
[#3408]: https://github.com/DataDog/dd-trace-rb/issues/3408
|
4161
|
+
[#3409]: https://github.com/DataDog/dd-trace-rb/issues/3409
|
4162
|
+
[#3417]: https://github.com/DataDog/dd-trace-rb/issues/3417
|
4058
4163
|
[#3420]: https://github.com/DataDog/dd-trace-rb/issues/3420
|
4164
|
+
[#3423]: https://github.com/DataDog/dd-trace-rb/issues/3423
|
4059
4165
|
[#3426]: https://github.com/DataDog/dd-trace-rb/issues/3426
|
4060
4166
|
[#3427]: https://github.com/DataDog/dd-trace-rb/issues/3427
|
4061
4167
|
[#3428]: https://github.com/DataDog/dd-trace-rb/issues/3428
|
@@ -4064,24 +4170,42 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
|
|
4064
4170
|
[#3438]: https://github.com/DataDog/dd-trace-rb/issues/3438
|
4065
4171
|
[#3439]: https://github.com/DataDog/dd-trace-rb/issues/3439
|
4066
4172
|
[#3440]: https://github.com/DataDog/dd-trace-rb/issues/3440
|
4173
|
+
[#3441]: https://github.com/DataDog/dd-trace-rb/issues/3441
|
4174
|
+
[#3443]: https://github.com/DataDog/dd-trace-rb/issues/3443
|
4175
|
+
[#3454]: https://github.com/DataDog/dd-trace-rb/issues/3454
|
4067
4176
|
[#3455]: https://github.com/DataDog/dd-trace-rb/issues/3455
|
4068
4177
|
[#3463]: https://github.com/DataDog/dd-trace-rb/issues/3463
|
4069
4178
|
[#3466]: https://github.com/DataDog/dd-trace-rb/issues/3466
|
4070
4179
|
[#3468]: https://github.com/DataDog/dd-trace-rb/issues/3468
|
4071
4180
|
[#3473]: https://github.com/DataDog/dd-trace-rb/issues/3473
|
4181
|
+
[#3486]: https://github.com/DataDog/dd-trace-rb/issues/3486
|
4182
|
+
[#3488]: https://github.com/DataDog/dd-trace-rb/issues/3488
|
4183
|
+
[#3490]: https://github.com/DataDog/dd-trace-rb/issues/3490
|
4072
4184
|
[#3491]: https://github.com/DataDog/dd-trace-rb/issues/3491
|
4073
4185
|
[#3495]: https://github.com/DataDog/dd-trace-rb/issues/3495
|
4074
4186
|
[#3501]: https://github.com/DataDog/dd-trace-rb/issues/3501
|
4075
4187
|
[#3502]: https://github.com/DataDog/dd-trace-rb/issues/3502
|
4076
4188
|
[#3503]: https://github.com/DataDog/dd-trace-rb/issues/3503
|
4189
|
+
[#3506]: https://github.com/DataDog/dd-trace-rb/issues/3506
|
4077
4190
|
[#3511]: https://github.com/DataDog/dd-trace-rb/issues/3511
|
4191
|
+
[#3516]: https://github.com/DataDog/dd-trace-rb/issues/3516
|
4078
4192
|
[#3518]: https://github.com/DataDog/dd-trace-rb/issues/3518
|
4079
4193
|
[#3519]: https://github.com/DataDog/dd-trace-rb/issues/3519
|
4080
4194
|
[#3520]: https://github.com/DataDog/dd-trace-rb/issues/3520
|
4081
4195
|
[#3523]: https://github.com/DataDog/dd-trace-rb/issues/3523
|
4196
|
+
[#3528]: https://github.com/DataDog/dd-trace-rb/issues/3528
|
4082
4197
|
[#3531]: https://github.com/DataDog/dd-trace-rb/issues/3531
|
4083
4198
|
[#3535]: https://github.com/DataDog/dd-trace-rb/issues/3535
|
4199
|
+
[#3536]: https://github.com/DataDog/dd-trace-rb/issues/3536
|
4084
4200
|
[#3539]: https://github.com/DataDog/dd-trace-rb/issues/3539
|
4201
|
+
[#3546]: https://github.com/DataDog/dd-trace-rb/issues/3546
|
4202
|
+
[#3551]: https://github.com/DataDog/dd-trace-rb/issues/3551
|
4203
|
+
[#3558]: https://github.com/DataDog/dd-trace-rb/issues/3558
|
4204
|
+
[#3565]: https://github.com/DataDog/dd-trace-rb/issues/3565
|
4205
|
+
[#3573]: https://github.com/DataDog/dd-trace-rb/issues/3573
|
4206
|
+
[#3582]: https://github.com/DataDog/dd-trace-rb/issues/3582
|
4207
|
+
[#3585]: https://github.com/DataDog/dd-trace-rb/issues/3585
|
4208
|
+
[#3587]: https://github.com/DataDog/dd-trace-rb/issues/3587
|
4085
4209
|
[@AdrianLC]: https://github.com/AdrianLC
|
4086
4210
|
[@Azure7111]: https://github.com/Azure7111
|
4087
4211
|
[@BabyGroot]: https://github.com/BabyGroot
|
@@ -96,6 +96,7 @@ struct cpu_and_wall_time_worker_state {
|
|
96
96
|
bool no_signals_workaround_enabled;
|
97
97
|
bool dynamic_sampling_rate_enabled;
|
98
98
|
bool allocation_profiling_enabled;
|
99
|
+
bool skip_idle_samples_for_testing;
|
99
100
|
VALUE self_instance;
|
100
101
|
VALUE thread_context_collector_instance;
|
101
102
|
VALUE idle_sampling_helper_instance;
|
@@ -132,6 +133,8 @@ struct cpu_and_wall_time_worker_state {
|
|
132
133
|
unsigned int signal_handler_enqueued_sample;
|
133
134
|
// How many times the signal handler was called from the wrong thread
|
134
135
|
unsigned int signal_handler_wrong_thread;
|
136
|
+
// How many times we actually tried to interrupt a thread for sampling
|
137
|
+
unsigned int interrupt_thread_attempts;
|
135
138
|
|
136
139
|
// # Stats for the results of calling rb_postponed_job_register_one
|
137
140
|
// The same function was already waiting to be executed
|
@@ -177,7 +180,8 @@ static VALUE _native_initialize(
|
|
177
180
|
VALUE no_signals_workaround_enabled,
|
178
181
|
VALUE dynamic_sampling_rate_enabled,
|
179
182
|
VALUE dynamic_sampling_rate_overhead_target_percentage,
|
180
|
-
VALUE allocation_profiling_enabled
|
183
|
+
VALUE allocation_profiling_enabled,
|
184
|
+
VALUE skip_idle_samples_for_testing
|
181
185
|
);
|
182
186
|
static void cpu_and_wall_time_worker_typed_data_mark(void *state_ptr);
|
183
187
|
static VALUE _native_sampling_loop(VALUE self, VALUE instance);
|
@@ -272,14 +276,16 @@ void collectors_cpu_and_wall_time_worker_init(VALUE profiling_module) {
|
|
272
276
|
// https://bugs.ruby-lang.org/issues/18007 for a discussion around this.
|
273
277
|
rb_define_alloc_func(collectors_cpu_and_wall_time_worker_class, _native_new);
|
274
278
|
|
275
|
-
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_initialize", _native_initialize,
|
279
|
+
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_initialize", _native_initialize, 9);
|
276
280
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_sampling_loop", _native_sampling_loop, 1);
|
277
281
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_stop", _native_stop, 2);
|
278
282
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_reset_after_fork", _native_reset_after_fork, 1);
|
279
283
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_stats", _native_stats, 1);
|
280
284
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_stats_reset_not_thread_safe", _native_stats_reset_not_thread_safe, 1);
|
281
285
|
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_allocation_count", _native_allocation_count, 0);
|
286
|
+
rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_is_running?", _native_is_running, 1);
|
282
287
|
rb_define_singleton_method(testing_module, "_native_current_sigprof_signal_handler", _native_current_sigprof_signal_handler, 0);
|
288
|
+
// TODO: Remove `_native_is_running` from `testing_module` once `prof-correctness` has been updated to not need it
|
283
289
|
rb_define_singleton_method(testing_module, "_native_is_running?", _native_is_running, 1);
|
284
290
|
rb_define_singleton_method(testing_module, "_native_install_testing_signal_handler", _native_install_testing_signal_handler, 0);
|
285
291
|
rb_define_singleton_method(testing_module, "_native_remove_testing_signal_handler", _native_remove_testing_signal_handler, 0);
|
@@ -315,6 +321,7 @@ static VALUE _native_new(VALUE klass) {
|
|
315
321
|
state->no_signals_workaround_enabled = false;
|
316
322
|
state->dynamic_sampling_rate_enabled = true;
|
317
323
|
state->allocation_profiling_enabled = false;
|
324
|
+
state->skip_idle_samples_for_testing = false;
|
318
325
|
state->thread_context_collector_instance = Qnil;
|
319
326
|
state->idle_sampling_helper_instance = Qnil;
|
320
327
|
state->owner_thread = Qnil;
|
@@ -350,13 +357,15 @@ static VALUE _native_initialize(
|
|
350
357
|
VALUE no_signals_workaround_enabled,
|
351
358
|
VALUE dynamic_sampling_rate_enabled,
|
352
359
|
VALUE dynamic_sampling_rate_overhead_target_percentage,
|
353
|
-
VALUE allocation_profiling_enabled
|
360
|
+
VALUE allocation_profiling_enabled,
|
361
|
+
VALUE skip_idle_samples_for_testing
|
354
362
|
) {
|
355
363
|
ENFORCE_BOOLEAN(gc_profiling_enabled);
|
356
364
|
ENFORCE_BOOLEAN(no_signals_workaround_enabled);
|
357
365
|
ENFORCE_BOOLEAN(dynamic_sampling_rate_enabled);
|
358
366
|
ENFORCE_TYPE(dynamic_sampling_rate_overhead_target_percentage, T_FLOAT);
|
359
367
|
ENFORCE_BOOLEAN(allocation_profiling_enabled);
|
368
|
+
ENFORCE_BOOLEAN(skip_idle_samples_for_testing)
|
360
369
|
|
361
370
|
struct cpu_and_wall_time_worker_state *state;
|
362
371
|
TypedData_Get_Struct(self_instance, struct cpu_and_wall_time_worker_state, &cpu_and_wall_time_worker_typed_data, state);
|
@@ -365,6 +374,7 @@ static VALUE _native_initialize(
|
|
365
374
|
state->no_signals_workaround_enabled = (no_signals_workaround_enabled == Qtrue);
|
366
375
|
state->dynamic_sampling_rate_enabled = (dynamic_sampling_rate_enabled == Qtrue);
|
367
376
|
state->allocation_profiling_enabled = (allocation_profiling_enabled == Qtrue);
|
377
|
+
state->skip_idle_samples_for_testing = (skip_idle_samples_for_testing == Qtrue);
|
368
378
|
|
369
379
|
double total_overhead_target_percentage = NUM2DBL(dynamic_sampling_rate_overhead_target_percentage);
|
370
380
|
if (!state->allocation_profiling_enabled) {
|
@@ -616,17 +626,23 @@ static void *run_sampling_trigger_loop(void *state_ptr) {
|
|
616
626
|
// Note that reading the GVL owner and sending them a signal is a race -- the Ruby VM keeps on executing while
|
617
627
|
// we're doing this, so we may still not signal the correct thread from time to time, but our signal handler
|
618
628
|
// includes a check to see if it got called in the right thread
|
629
|
+
state->stats.interrupt_thread_attempts++;
|
619
630
|
pthread_kill(owner.owner, SIGPROF);
|
620
631
|
} else {
|
621
|
-
|
622
|
-
|
623
|
-
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
|
632
|
+
if (state->skip_idle_samples_for_testing) {
|
633
|
+
// This was added to make sure our tests don't accidentally pass due to idle samples. Specifically, if we
|
634
|
+
// comment out the thread interruption code inside `if (owner.valid)` above, our tests should not pass!
|
635
|
+
} else {
|
636
|
+
// If no thread owns the Global VM Lock, the application is probably idle at the moment. We still want to sample
|
637
|
+
// so we "ask a friend" (the IdleSamplingHelper component) to grab the GVL and simulate getting a SIGPROF.
|
638
|
+
//
|
639
|
+
// In a previous version of the code, we called `grab_gvl_and_sample` directly BUT this was problematic because
|
640
|
+
// Ruby may concurrently get busy and so the CpuAndWallTimeWorker would be blocked in line to acquire the GVL
|
641
|
+
// for an uncontrolled amount of time. (This can still happen to the IdleSamplingHelper, but the
|
642
|
+
// CpuAndWallTimeWorker will still be free to interrupt the Ruby VM and keep sampling for the entire blocking period).
|
643
|
+
state->stats.trigger_simulated_signal_delivery_attempts++;
|
644
|
+
idle_sampling_helper_request_action(state->idle_sampling_helper_instance, grab_gvl_and_sample);
|
645
|
+
}
|
630
646
|
}
|
631
647
|
}
|
632
648
|
|
@@ -737,6 +753,9 @@ static VALUE release_gvl_and_run_sampling_trigger_loop(VALUE instance) {
|
|
737
753
|
if (state->gc_profiling_enabled) rb_tracepoint_enable(state->gc_tracepoint);
|
738
754
|
if (state->allocation_profiling_enabled) rb_tracepoint_enable(state->object_allocation_tracepoint);
|
739
755
|
|
756
|
+
// Flag the profiler as running before we release the GVL, in case anyone's waiting to know about it
|
757
|
+
rb_funcall(instance, rb_intern("signal_running"), 0);
|
758
|
+
|
740
759
|
rb_thread_call_without_gvl(run_sampling_trigger_loop, state, interrupt_sampling_trigger_loop, state);
|
741
760
|
|
742
761
|
// If we stopped sampling due to an exception, re-raise it (now in the worker thread)
|
@@ -943,6 +962,7 @@ static VALUE _native_stats(DDTRACE_UNUSED VALUE self, VALUE instance) {
|
|
943
962
|
ID2SYM(rb_intern("postponed_job_success")), /* => */ UINT2NUM(state->stats.postponed_job_success),
|
944
963
|
ID2SYM(rb_intern("postponed_job_full")), /* => */ UINT2NUM(state->stats.postponed_job_full),
|
945
964
|
ID2SYM(rb_intern("postponed_job_unknown_result")), /* => */ UINT2NUM(state->stats.postponed_job_unknown_result),
|
965
|
+
ID2SYM(rb_intern("interrupt_thread_attempts")), /* => */ UINT2NUM(state->stats.interrupt_thread_attempts),
|
946
966
|
|
947
967
|
// CPU Stats
|
948
968
|
ID2SYM(rb_intern("cpu_sampled")), /* => */ UINT2NUM(state->stats.cpu_sampled),
|
@@ -621,11 +621,14 @@ bool thread_context_collector_on_gc_finish(VALUE self_instance) {
|
|
621
621
|
// Let the caller know if it should schedule a flush or not. Returning true every time would cause a lot of overhead
|
622
622
|
// on the application (see GC tracking introduction at the top of the file), so instead we try to accumulate a few
|
623
623
|
// samples first.
|
624
|
-
bool finished_major_gc = gc_profiling_has_major_gc_finished();
|
625
624
|
bool over_flush_time_treshold =
|
626
625
|
(wall_time_at_finish_ns - state->gc_tracking.wall_time_at_last_flushed_gc_event_ns) >= TIME_BETWEEN_GC_EVENTS_NS;
|
627
626
|
|
628
|
-
|
627
|
+
if (over_flush_time_treshold) {
|
628
|
+
return true;
|
629
|
+
} else {
|
630
|
+
return gc_profiling_has_major_gc_finished();
|
631
|
+
}
|
629
632
|
}
|
630
633
|
|
631
634
|
// This function gets called after one or more GC work steps (calls to on_gc_start/on_gc_finish).
|
@@ -10,6 +10,13 @@
|
|
10
10
|
#define CAN_APPLY_GC_FORCE_RECYCLE_BUG_WORKAROUND
|
11
11
|
#endif
|
12
12
|
|
13
|
+
// Minimum age (in GC generations) of heap objects we want to include in heap
|
14
|
+
// recorder iterations. Object with age 0 represent objects that have yet to undergo
|
15
|
+
// a GC and, thus, may just be noise/trash at instant of iteration and are usually not
|
16
|
+
// relevant for heap profiles as the great majority should be trivially reclaimed
|
17
|
+
// during the next GC.
|
18
|
+
#define ITERATION_MIN_AGE 1
|
19
|
+
|
13
20
|
// A compact representation of a stacktrace frame for a heap allocation.
|
14
21
|
typedef struct {
|
15
22
|
char *name;
|
@@ -137,6 +144,11 @@ struct heap_recorder {
|
|
137
144
|
// mutation of the data so iteration can occur without acquiring a lock.
|
138
145
|
// NOTE: Contrary to object_records, this table has no ownership of its data.
|
139
146
|
st_table *object_records_snapshot;
|
147
|
+
// The GC gen/epoch/count in which we prepared the current iteration.
|
148
|
+
//
|
149
|
+
// This enables us to calculate the age of iterated objects in the above snapshot by
|
150
|
+
// comparing it against an object's alloc_gen.
|
151
|
+
size_t iteration_gen;
|
140
152
|
|
141
153
|
// Data for a heap recording that was started but not yet ended
|
142
154
|
recording active_recording;
|
@@ -353,6 +365,8 @@ void heap_recorder_prepare_iteration(heap_recorder *heap_recorder) {
|
|
353
365
|
return;
|
354
366
|
}
|
355
367
|
|
368
|
+
heap_recorder->iteration_gen = rb_gc_count();
|
369
|
+
|
356
370
|
if (heap_recorder->object_records_snapshot != NULL) {
|
357
371
|
// we could trivially handle this but we raise to highlight and catch unexpected usages.
|
358
372
|
rb_raise(rb_eRuntimeError, "New heap recorder iteration prepared without the previous one having been finished.");
|
@@ -459,6 +473,13 @@ static int st_object_record_entry_free(DDTRACE_UNUSED st_data_t key, st_data_t v
|
|
459
473
|
return ST_DELETE;
|
460
474
|
}
|
461
475
|
|
476
|
+
// Check to see if an object should not be included in a heap recorder iteration.
|
477
|
+
// This centralizes the checking logic to ensure it's equally applied between
|
478
|
+
// preparation and iteration codepaths.
|
479
|
+
static inline bool should_exclude_from_iteration(object_record *obj_record) {
|
480
|
+
return obj_record->object_data.gen_age < ITERATION_MIN_AGE;
|
481
|
+
}
|
482
|
+
|
462
483
|
static int st_object_record_update(st_data_t key, st_data_t value, st_data_t extra_arg) {
|
463
484
|
long obj_id = (long) key;
|
464
485
|
object_record *record = (object_record*) value;
|
@@ -466,6 +487,19 @@ static int st_object_record_update(st_data_t key, st_data_t value, st_data_t ext
|
|
466
487
|
|
467
488
|
VALUE ref;
|
468
489
|
|
490
|
+
size_t iteration_gen = recorder->iteration_gen;
|
491
|
+
size_t alloc_gen = record->object_data.alloc_gen;
|
492
|
+
// Guard against potential overflows given unsigned types here.
|
493
|
+
record->object_data.gen_age = alloc_gen < iteration_gen ? iteration_gen - alloc_gen : 0;
|
494
|
+
|
495
|
+
if (should_exclude_from_iteration(record)) {
|
496
|
+
// If an object won't be included in the current iteration, there's
|
497
|
+
// no point checking for liveness or updating its size, so exit early.
|
498
|
+
// NOTE: This means that there should be an equivalent check during actual
|
499
|
+
// iteration otherwise we'd iterate/expose stale object data.
|
500
|
+
return ST_CONTINUE;
|
501
|
+
}
|
502
|
+
|
469
503
|
if (!ruby_ref_from_id(LONG2NUM(obj_id), &ref)) {
|
470
504
|
// Id no longer associated with a valid ref. Need to delete this object record!
|
471
505
|
on_committed_object_record_cleanup(recorder, record);
|
@@ -525,8 +559,16 @@ static int st_object_records_iterate(DDTRACE_UNUSED st_data_t key, st_data_t val
|
|
525
559
|
const heap_stack *stack = record->heap_record->stack;
|
526
560
|
iteration_context *context = (iteration_context*) extra;
|
527
561
|
|
528
|
-
|
562
|
+
const heap_recorder *recorder = context->heap_recorder;
|
563
|
+
|
564
|
+
if (should_exclude_from_iteration(record)) {
|
565
|
+
// Skip objects that should not be included in iteration
|
566
|
+
// NOTE: This matches the short-circuiting condition in st_object_record_update
|
567
|
+
// and prevents iteration over stale objects.
|
568
|
+
return ST_CONTINUE;
|
569
|
+
}
|
529
570
|
|
571
|
+
ddog_prof_Location *locations = recorder->reusable_locations;
|
530
572
|
for (uint16_t i = 0; i < stack->frames_len; i++) {
|
531
573
|
const heap_frame *frame = &stack->frames[i];
|
532
574
|
ddog_prof_Location *location = &locations[i];
|
@@ -725,9 +767,9 @@ void object_record_free(object_record *record) {
|
|
725
767
|
|
726
768
|
VALUE object_record_inspect(object_record *record) {
|
727
769
|
heap_frame top_frame = record->heap_record->stack->frames[0];
|
728
|
-
VALUE inspect = rb_sprintf("obj_id=%ld weight=%d size=%zu location=%s:%d alloc_gen=%zu ",
|
770
|
+
VALUE inspect = rb_sprintf("obj_id=%ld weight=%d size=%zu location=%s:%d alloc_gen=%zu gen_age=%zu ",
|
729
771
|
record->obj_id, record->object_data.weight, record->object_data.size, top_frame.filename,
|
730
|
-
(int) top_frame.line, record->object_data.alloc_gen);
|
772
|
+
(int) top_frame.line, record->object_data.alloc_gen, record->object_data.gen_age);
|
731
773
|
|
732
774
|
const char *class = record->object_data.class;
|
733
775
|
if (class != NULL) {
|
@@ -27,7 +27,9 @@ typedef struct live_object_data {
|
|
27
27
|
// could be seen as being representative of 50 objects.
|
28
28
|
unsigned int weight;
|
29
29
|
|
30
|
-
// Size of this object
|
30
|
+
// Size of this object in memory.
|
31
|
+
// NOTE: This only gets updated during heap_recorder_prepare_iteration and only
|
32
|
+
// for those objects that meet the minimum iteration age requirements.
|
31
33
|
size_t size;
|
32
34
|
|
33
35
|
// The class of the object that we're tracking.
|
@@ -39,6 +41,10 @@ typedef struct live_object_data {
|
|
39
41
|
// This enables us to calculate the age of this object in terms of GC executions.
|
40
42
|
size_t alloc_gen;
|
41
43
|
|
44
|
+
// The age of this object in terms of GC generations.
|
45
|
+
// NOTE: This only gets updated during heap_recorder_prepare_iteration
|
46
|
+
size_t gen_age;
|
47
|
+
|
42
48
|
// Whether this object was previously seen as being frozen. If this is the case,
|
43
49
|
// we'll skip any further size updates since frozen objects are supposed to be
|
44
50
|
// immutable.
|
@@ -30,7 +30,7 @@ inline static ddog_ByteSlice byte_slice_from_ruby_string(VALUE string);
|
|
30
30
|
static VALUE _native_validate_exporter(VALUE self, VALUE exporter_configuration);
|
31
31
|
static ddog_prof_Exporter_NewResult create_exporter(VALUE exporter_configuration, VALUE tags_as_array);
|
32
32
|
static VALUE handle_exporter_failure(ddog_prof_Exporter_NewResult exporter_result);
|
33
|
-
static
|
33
|
+
static ddog_prof_Endpoint endpoint_from(VALUE exporter_configuration);
|
34
34
|
static ddog_Vec_Tag convert_tags(VALUE tags_as_array);
|
35
35
|
static void safely_log_failure_to_process_tag(ddog_Vec_Tag tags, VALUE err_details);
|
36
36
|
static VALUE _native_do_export(
|
@@ -94,7 +94,7 @@ static ddog_prof_Exporter_NewResult create_exporter(VALUE exporter_configuration
|
|
94
94
|
|
95
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_prof_Endpoint endpoint = endpoint_from(exporter_configuration);
|
98
98
|
|
99
99
|
ddog_Vec_Tag tags = convert_tags(tags_as_array);
|
100
100
|
|
@@ -116,7 +116,7 @@ static VALUE handle_exporter_failure(ddog_prof_Exporter_NewResult exporter_resul
|
|
116
116
|
rb_ary_new_from_args(2, error_symbol, get_error_details_and_drop(&exporter_result.err));
|
117
117
|
}
|
118
118
|
|
119
|
-
static
|
119
|
+
static ddog_prof_Endpoint endpoint_from(VALUE exporter_configuration) {
|
120
120
|
ENFORCE_TYPE(exporter_configuration, T_ARRAY);
|
121
121
|
|
122
122
|
ID working_mode = SYM2ID(rb_ary_entry(exporter_configuration, 0)); // SYM2ID verifies its input so we can do this safely
|
@@ -131,12 +131,12 @@ static ddog_Endpoint endpoint_from(VALUE exporter_configuration) {
|
|
131
131
|
ENFORCE_TYPE(site, T_STRING);
|
132
132
|
ENFORCE_TYPE(api_key, T_STRING);
|
133
133
|
|
134
|
-
return
|
134
|
+
return ddog_prof_Endpoint_agentless(char_slice_from_ruby_string(site), char_slice_from_ruby_string(api_key));
|
135
135
|
} else { // agent_id
|
136
136
|
VALUE base_url = rb_ary_entry(exporter_configuration, 1);
|
137
137
|
ENFORCE_TYPE(base_url, T_STRING);
|
138
138
|
|
139
|
-
return
|
139
|
+
return ddog_prof_Endpoint_agent(char_slice_from_ruby_string(base_url));
|
140
140
|
}
|
141
141
|
}
|
142
142
|
|
@@ -15,7 +15,7 @@ module Datadog
|
|
15
15
|
# The MJIT header was introduced on 2.6 and removed on 3.3; for other Rubies we rely on debase-ruby_core_source
|
16
16
|
CAN_USE_MJIT_HEADER = RUBY_VERSION.start_with?('2.6', '2.7', '3.0.', '3.1.', '3.2.')
|
17
17
|
|
18
|
-
LIBDATADOG_VERSION = '~>
|
18
|
+
LIBDATADOG_VERSION = '~> 7.0.0.1.0'
|
19
19
|
|
20
20
|
def self.fail_install_if_missing_extension?
|
21
21
|
ENV[ENV_FAIL_INSTALL_IF_MISSING_EXTENSION].to_s.strip.downcase == 'true'
|
@@ -196,7 +196,6 @@ struct call_serialize_without_gvl_arguments {
|
|
196
196
|
// Set by caller
|
197
197
|
struct stack_recorder_state *state;
|
198
198
|
ddog_Timespec finish_timestamp;
|
199
|
-
size_t gc_count_before_serialize;
|
200
199
|
|
201
200
|
// Set by callee
|
202
201
|
ddog_prof_Profile *profile;
|
@@ -489,7 +488,6 @@ static VALUE _native_serialize(DDTRACE_UNUSED VALUE _self, VALUE recorder_instan
|
|
489
488
|
struct call_serialize_without_gvl_arguments args = {
|
490
489
|
.state = state,
|
491
490
|
.finish_timestamp = finish_timestamp,
|
492
|
-
.gc_count_before_serialize = rb_gc_count(),
|
493
491
|
.serialize_ran = false
|
494
492
|
};
|
495
493
|
|
@@ -613,8 +611,6 @@ typedef struct heap_recorder_iteration_context {
|
|
613
611
|
|
614
612
|
bool error;
|
615
613
|
char error_msg[MAX_LEN_HEAP_ITERATION_ERROR_MSG];
|
616
|
-
|
617
|
-
size_t profile_gen;
|
618
614
|
} heap_recorder_iteration_context;
|
619
615
|
|
620
616
|
static bool add_heap_sample_to_active_profile_without_gvl(heap_recorder_iteration_data iteration_data, void *extra_arg) {
|
@@ -643,7 +639,7 @@ static bool add_heap_sample_to_active_profile_without_gvl(heap_recorder_iteratio
|
|
643
639
|
}
|
644
640
|
labels[label_offset++] = (ddog_prof_Label) {
|
645
641
|
.key = DDOG_CHARSLICE_C("gc gen age"),
|
646
|
-
.num =
|
642
|
+
.num = object_data->gen_age,
|
647
643
|
};
|
648
644
|
|
649
645
|
ddog_prof_Profile_Result result = ddog_prof_Profile_add(
|
@@ -670,13 +666,12 @@ static bool add_heap_sample_to_active_profile_without_gvl(heap_recorder_iteratio
|
|
670
666
|
return true;
|
671
667
|
}
|
672
668
|
|
673
|
-
static void build_heap_profile_without_gvl(struct stack_recorder_state *state, ddog_prof_Profile *profile
|
669
|
+
static void build_heap_profile_without_gvl(struct stack_recorder_state *state, ddog_prof_Profile *profile) {
|
674
670
|
heap_recorder_iteration_context iteration_context = {
|
675
671
|
.state = state,
|
676
672
|
.profile = profile,
|
677
673
|
.error = false,
|
678
674
|
.error_msg = {0},
|
679
|
-
.profile_gen = gc_count_before_serialize,
|
680
675
|
};
|
681
676
|
bool iterated = heap_recorder_for_each_live_object(state->heap_recorder, add_heap_sample_to_active_profile_without_gvl, (void*) &iteration_context);
|
682
677
|
// We wait until we're out of the iteration to grab the gvl and raise. This is important because during
|
@@ -698,7 +693,7 @@ static void *call_serialize_without_gvl(void *call_args) {
|
|
698
693
|
|
699
694
|
// Now that we have the inactive profile with all but heap samples, lets fill it with heap data
|
700
695
|
// without needing to race with the active sampler
|
701
|
-
build_heap_profile_without_gvl(args->state, args->profile
|
696
|
+
build_heap_profile_without_gvl(args->state, args->profile);
|
702
697
|
|
703
698
|
// Note: The profile gets reset by the serialize call
|
704
699
|
args->result = ddog_prof_Profile_serialize(args->profile, &args->finish_timestamp, NULL /* duration_nanos is optional */, NULL /* start_time is optional */);
|
@@ -918,10 +913,13 @@ static VALUE _native_debug_heap_recorder(DDTRACE_UNUSED VALUE _self, VALUE recor
|
|
918
913
|
#pragma GCC diagnostic push
|
919
914
|
// rb_gc_force_recycle was deprecated in latest versions of Ruby and is a noop.
|
920
915
|
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
916
|
+
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
921
917
|
// This method exists only to enable testing Datadog::Profiling::StackRecorder behavior using RSpec.
|
922
918
|
// It SHOULD NOT be used for other purposes.
|
923
919
|
static VALUE _native_gc_force_recycle(DDTRACE_UNUSED VALUE _self, VALUE obj) {
|
924
|
-
|
920
|
+
#ifdef HAVE_WORKING_RB_GC_FORCE_RECYCLE
|
921
|
+
rb_gc_force_recycle(obj);
|
922
|
+
#endif
|
925
923
|
return Qnil;
|
926
924
|
}
|
927
925
|
#pragma GCC diagnostic pop
|