datadog 2.0.0.beta1 → 2.0.0.rc1

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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +181 -1
  3. data/ext/datadog_profiling_native_extension/NativeExtensionDesign.md +1 -1
  4. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +40 -32
  5. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +23 -12
  6. data/ext/datadog_profiling_native_extension/crashtracker.c +108 -0
  7. data/ext/datadog_profiling_native_extension/extconf.rb +9 -23
  8. data/ext/datadog_profiling_native_extension/heap_recorder.c +81 -4
  9. data/ext/datadog_profiling_native_extension/heap_recorder.h +12 -1
  10. data/ext/datadog_profiling_native_extension/http_transport.c +1 -94
  11. data/ext/datadog_profiling_native_extension/libdatadog_helpers.c +86 -0
  12. data/ext/datadog_profiling_native_extension/libdatadog_helpers.h +4 -0
  13. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +2 -12
  14. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +25 -86
  15. data/ext/datadog_profiling_native_extension/profiling.c +2 -0
  16. data/ext/datadog_profiling_native_extension/ruby_helpers.h +3 -5
  17. data/ext/datadog_profiling_native_extension/stack_recorder.c +161 -62
  18. data/lib/datadog/appsec/contrib/devise/tracking.rb +8 -0
  19. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +43 -13
  20. data/lib/datadog/appsec/event.rb +2 -2
  21. data/lib/datadog/core/configuration/components.rb +2 -1
  22. data/lib/datadog/core/configuration/option.rb +7 -5
  23. data/lib/datadog/core/configuration/settings.rb +34 -79
  24. data/lib/datadog/core/configuration.rb +20 -4
  25. data/lib/datadog/core/environment/platform.rb +7 -1
  26. data/lib/datadog/core/remote/client/capabilities.rb +2 -1
  27. data/lib/datadog/core/remote/client.rb +1 -5
  28. data/lib/datadog/core/remote/configuration/repository.rb +1 -1
  29. data/lib/datadog/core/remote/dispatcher.rb +3 -3
  30. data/lib/datadog/core/remote/transport/http/config.rb +5 -5
  31. data/lib/datadog/core/telemetry/client.rb +18 -10
  32. data/lib/datadog/core/telemetry/emitter.rb +9 -13
  33. data/lib/datadog/core/telemetry/event.rb +247 -57
  34. data/lib/datadog/core/telemetry/ext.rb +1 -0
  35. data/lib/datadog/core/telemetry/heartbeat.rb +1 -3
  36. data/lib/datadog/core/telemetry/http/ext.rb +4 -1
  37. data/lib/datadog/core/telemetry/http/response.rb +4 -0
  38. data/lib/datadog/core/telemetry/http/transport.rb +9 -4
  39. data/lib/datadog/core/telemetry/request.rb +59 -0
  40. data/lib/datadog/core/utils/base64.rb +22 -0
  41. data/lib/datadog/opentelemetry/sdk/span_processor.rb +19 -2
  42. data/lib/datadog/opentelemetry/sdk/trace/span.rb +3 -17
  43. data/lib/datadog/profiling/collectors/code_provenance.rb +10 -4
  44. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +25 -0
  45. data/lib/datadog/profiling/component.rb +49 -17
  46. data/lib/datadog/profiling/crashtracker.rb +91 -0
  47. data/lib/datadog/profiling/exporter.rb +6 -3
  48. data/lib/datadog/profiling/http_transport.rb +7 -11
  49. data/lib/datadog/profiling/load_native_extension.rb +14 -1
  50. data/lib/datadog/profiling/profiler.rb +9 -2
  51. data/lib/datadog/profiling/stack_recorder.rb +6 -2
  52. data/lib/datadog/profiling.rb +12 -0
  53. data/lib/datadog/tracing/component.rb +5 -1
  54. data/lib/datadog/tracing/configuration/dynamic.rb +39 -1
  55. data/lib/datadog/tracing/configuration/settings.rb +1 -0
  56. data/lib/datadog/tracing/contrib/action_pack/integration.rb +1 -1
  57. data/lib/datadog/tracing/contrib/action_view/integration.rb +1 -1
  58. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +1 -0
  59. data/lib/datadog/tracing/contrib/active_record/integration.rb +11 -1
  60. data/lib/datadog/tracing/contrib/active_support/integration.rb +1 -1
  61. data/lib/datadog/tracing/contrib/configuration/resolver.rb +43 -0
  62. data/lib/datadog/tracing/contrib/grape/endpoint.rb +43 -5
  63. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +1 -1
  64. data/lib/datadog/tracing/correlation.rb +3 -4
  65. data/lib/datadog/tracing/remote.rb +5 -1
  66. data/lib/datadog/tracing/sampling/ext.rb +5 -1
  67. data/lib/datadog/tracing/sampling/matcher.rb +75 -26
  68. data/lib/datadog/tracing/sampling/rule.rb +27 -4
  69. data/lib/datadog/tracing/sampling/rule_sampler.rb +19 -1
  70. data/lib/datadog/tracing/sampling/span/matcher.rb +13 -41
  71. data/lib/datadog/tracing/span.rb +7 -2
  72. data/lib/datadog/tracing/span_link.rb +92 -0
  73. data/lib/datadog/tracing/span_operation.rb +6 -4
  74. data/lib/datadog/tracing/trace_operation.rb +12 -0
  75. data/lib/datadog/tracing/tracer.rb +4 -3
  76. data/lib/datadog/tracing/transport/serializable_trace.rb +3 -1
  77. data/lib/datadog/tracing/utils.rb +16 -0
  78. data/lib/datadog/version.rb +1 -1
  79. metadata +10 -31
  80. data/lib/datadog/core/telemetry/collector.rb +0 -248
  81. data/lib/datadog/core/telemetry/v1/app_event.rb +0 -59
  82. data/lib/datadog/core/telemetry/v1/application.rb +0 -94
  83. data/lib/datadog/core/telemetry/v1/configuration.rb +0 -27
  84. data/lib/datadog/core/telemetry/v1/dependency.rb +0 -45
  85. data/lib/datadog/core/telemetry/v1/host.rb +0 -59
  86. data/lib/datadog/core/telemetry/v1/install_signature.rb +0 -38
  87. data/lib/datadog/core/telemetry/v1/integration.rb +0 -66
  88. data/lib/datadog/core/telemetry/v1/product.rb +0 -36
  89. data/lib/datadog/core/telemetry/v1/telemetry_request.rb +0 -108
  90. data/lib/datadog/core/telemetry/v2/app_client_configuration_change.rb +0 -41
  91. 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: 1b20af2904b022a99ddd6b86a2b0f7fc0dc6aaff6be5e6ce33562e1f33a1f720
4
- data.tar.gz: 5c4881d78dbfc4c07a830c1328609f62fa2595dad2e5a6565432c67ed693a9b9
3
+ metadata.gz: 5c8f4fef81d3a238299c70c27f6ece67dc31e76e4b6ad2180a2d1126e4c9545a
4
+ data.tar.gz: 17bc14574f265b2fdba65d4030e37e513f6af33af6ce8be77e1bbb535d4f6ae4
5
5
  SHA512:
6
- metadata.gz: 40aa8b141fcc9c7faf85d92bef1493e87b5f4ffbee1c9f4c86c32329dd2a243e4fc1f63f668a074e4214bbc77df336853927bb8c57e3728bc4a216987c128ed7
7
- data.tar.gz: 02be99a9ca062989e97c56daaf85c6558f04c4dadc72ff6ff79da3d75a0965113f02a7f6fabef30fa618924e4c62099fc7bcdbcd83fd7719aeae21bcbbfc4175
6
+ metadata.gz: fff160e4a8e316ec82381e5ae6ef5687a434aa0798debcc689c37e127d688e3d0c0f1009befb6871096c77032caeed348df777ba9baab4c8f7d6f4582d02c8bd
7
+ data.tar.gz: 6fb4d250c8838a101a489cc10ee0672c23dd4a9793ad850b17bc2c375881c0e3e4cf2c7c3bf5645a6ce8bce1e59c06cbb82609dffe489101fb3ba158d655f034
data/CHANGELOG.md CHANGED
@@ -2,6 +2,110 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [2.0.0.rc1] - 2024-05-24
6
+
7
+ ### Added
8
+
9
+ * Core: Add libdatadog crash tracker ([#3384][])
10
+ * OpenTelemetry: Add support for Span Links ([#3572][])
11
+ * Profiling: Enable endpoint profiling for Sidekiq and other background job processors ([#3610][])
12
+ * Tracing: Add dynamically configurable sampling rules ([#3598][])
13
+ * Tracing: Add sampling rule glob pattern matching ([#3616][])
14
+
15
+ ### Changed
16
+
17
+ * Appsec: Fix undefined method error when Tracing disabled ([#3645][])
18
+ * Profiling: Upgrade to libdatadog 9 ([#3627][])
19
+ * Tracing: Cache ActiveRecord configuration resolver ([#3630][])
20
+
21
+ ### Fixed
22
+
23
+ * Core: Fix error during telemetry debug logging attempt ([#3617][])
24
+ * OpenTelemetry: Fix attribute merge with Datadog tags ([#3651][])
25
+ * Tracing: Fix environment logger repeated entries ([#3624][])
26
+
27
+ ### Removed
28
+
29
+ * Profiling: Remove profiler support for Ruby 2.3 and 2.4 ([#3621][])
30
+ * Profiling: Remove deprecated profiler settings ([#3597][])
31
+
32
+ ## [1.23.0] - 2024-05-09
33
+
34
+ ### Added
35
+
36
+ * Profiling: Enable endpoint profiling for Sidekiq and similar background job processors ([#3619][])
37
+
38
+ ### Fixed
39
+
40
+ * Fix no such file or directory issue when using single step instrumentation ([#3623][])
41
+ * Fix error during telemetry debug logging attempt ([#3618][])
42
+
43
+ ## [2.0.0.beta2] - 2024-04-18
44
+
45
+ ### Added
46
+
47
+ * Add Agent configuration option: `timeout_seconds`, `uds_path`, and `use_ssl` ([#3350][])
48
+ * Tracing: Add lightweight log correlation generation ([#3486][])
49
+ * Tracing: Add span links ([#3546][])
50
+ * Tracing: Add `span_remote` field to `TraceDigest` ([#3516][])
51
+ * Tracing: Add `_dd.parent_id` to `tracestate` ([#3488][])
52
+ * Tracing: Allow `RateSampler` with zero sampling rate ([#3295][])
53
+ * Grape: Add `on_error` settings ([#3370][])
54
+
55
+ ### Changed
56
+
57
+ * Rename gem from `ddtrace` to `datadog` ([#3490][])
58
+ * Require Ruby `>= 2.5` ([#3291][])
59
+ * Frozen string literals ([#3392][])
60
+ * Startup logs emit when reconfigures ([#3441][])
61
+ * Enhance validation for configuration ([#3332][], [#3326][])
62
+ * Tracing: Propagation style configuration becomes case-insensitive ([#3299][])
63
+ * Tracing: Return string for `#trace_id` and `#span_id` from `Correlation::Identifier` ([#3322][])
64
+ * `Elasticsearch`: Replace instance configuration from `client` to `transport` instance ([#3399][])
65
+ * `Grape`: Change `error_statuses` settings to `error_status_codes` ([#3370][])
66
+ * `GraphQL`: Instrument with `GraphQL::Tracing::DataDogTrace` and more ([#3409][], [#3417][], [#3388][])
67
+ * `Rack`: Change http proxy span pattern ([#3369][])
68
+ * `Sidekiq`: Remove `tag_args` option and worker specific configuration ([#3396][], [#3402][])
69
+ * Integrations: Rename `error_handler` settings to `on_error` ([#3341][])
70
+ *
71
+ ### Fixed
72
+
73
+ * Tracing: Fix `error_status_codes` options ([#3344][])
74
+
75
+ ### Removed
76
+
77
+ * Profiling: Remove `bin/ddtracerb` ([#3506][])
78
+ * Ci-app: Remove `datadog-ci` gem dependency ([#3288][])
79
+ * Tracing: Remove `SpanOperation` aliases ([#3330][])
80
+ * Tracing: Remove `b3` style from default propagation ([#3293][])
81
+ * Tracing: Minimize sampling API ([#3423][])
82
+ * Tracing: Remove `client_ip` disabled env ([#3404][])
83
+ * Tracing: Remove `use` alias for `instrument` ([#3403][])
84
+ * Tracing: `OpenTracing`, `qless` removed ([#3398][], [#3443][])
85
+ * `Net/Http`: Remove `Datadog::Tracing::Contrib::HTTP::Instrumentation.after_request` ([#3367][])
86
+ * `Rails`: Drop support for Rails 3 ([#3324][])
87
+ * `Rails`: Remove `exception_controller` option ([#3243][])
88
+ * Remove constants, methods and more ([#3401][], [#3336][], [#3454][], [#3338][], [#3335][], [#3298][], [#3297][], [#3309][], [#3294][], [#3325][], [#3300][])
89
+
90
+ ## [1.22.0] - 2024-04-16
91
+
92
+ ### Added
93
+
94
+ * Tracing: Add sampling rules by trace resouce and tags ([#3587][], [#3585][])
95
+ * Appsec: Add WAF vendor header support ([#3528][])
96
+
97
+ ### Changed
98
+
99
+ * Upgrade `Telemetry` to V2 ([#3551][])
100
+ * Upgrade to libdatadog 7 ([#3536][])
101
+ * Profiling: Enable Garbage Collection profiling by default ([#3558][])
102
+ * Profiling: Skip heap samples with age 0 ([#3573][])
103
+ * Profiling: Support falling back into extension directory when loading profiler ([#3582][])
104
+
105
+ ### Fixed
106
+
107
+ * Appsec: Fix MIME-style newlines with strict base64 encoding ([#3565][])
108
+
5
109
  ## [2.0.0.beta1] - 2024-03-22
6
110
 
7
111
  Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v2.0.0.beta1
@@ -2784,7 +2888,11 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
2784
2888
  Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
2785
2889
 
2786
2890
 
2787
- [Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.21.1...master
2891
+ [Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v2.0.0.rc1...master
2892
+ [2.0.0.rc1]: https://github.com/DataDog/dd-trace-rb/compare/v2.0.0.beta2...v2.0.0.rc1
2893
+ [1.23.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.22.0...v1.23.0
2894
+ [2.0.0.beta2]: https://github.com/DataDog/dd-trace-rb/compare/v2.0.0.beta1...v2.0.0.beta2
2895
+ [1.22.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.21.1...v1.22.0
2788
2896
  [2.0.0.beta1]: https://github.com/DataDog/dd-trace-rb/compare/v1.21.1...v2.0.0.beta1
2789
2897
  [1.21.1]: https://github.com/DataDog/dd-trace-rb/compare/v1.21.0...v1.21.1
2790
2898
  [1.21.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.20.0...v1.21.0
@@ -4007,6 +4115,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
4007
4115
  [#3235]: https://github.com/DataDog/dd-trace-rb/issues/3235
4008
4116
  [#3240]: https://github.com/DataDog/dd-trace-rb/issues/3240
4009
4117
  [#3242]: https://github.com/DataDog/dd-trace-rb/issues/3242
4118
+ [#3243]: https://github.com/DataDog/dd-trace-rb/issues/3243
4010
4119
  [#3248]: https://github.com/DataDog/dd-trace-rb/issues/3248
4011
4120
  [#3252]: https://github.com/DataDog/dd-trace-rb/issues/3252
4012
4121
  [#3255]: https://github.com/DataDog/dd-trace-rb/issues/3255
@@ -4025,21 +4134,43 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
4025
4134
  [#3284]: https://github.com/DataDog/dd-trace-rb/issues/3284
4026
4135
  [#3286]: https://github.com/DataDog/dd-trace-rb/issues/3286
4027
4136
  [#3287]: https://github.com/DataDog/dd-trace-rb/issues/3287
4137
+ [#3288]: https://github.com/DataDog/dd-trace-rb/issues/3288
4028
4138
  [#3289]: https://github.com/DataDog/dd-trace-rb/issues/3289
4139
+ [#3291]: https://github.com/DataDog/dd-trace-rb/issues/3291
4140
+ [#3293]: https://github.com/DataDog/dd-trace-rb/issues/3293
4141
+ [#3294]: https://github.com/DataDog/dd-trace-rb/issues/3294
4142
+ [#3295]: https://github.com/DataDog/dd-trace-rb/issues/3295
4143
+ [#3297]: https://github.com/DataDog/dd-trace-rb/issues/3297
4144
+ [#3298]: https://github.com/DataDog/dd-trace-rb/issues/3298
4145
+ [#3299]: https://github.com/DataDog/dd-trace-rb/issues/3299
4146
+ [#3300]: https://github.com/DataDog/dd-trace-rb/issues/3300
4029
4147
  [#3303]: https://github.com/DataDog/dd-trace-rb/issues/3303
4030
4148
  [#3307]: https://github.com/DataDog/dd-trace-rb/issues/3307
4031
4149
  [#3308]: https://github.com/DataDog/dd-trace-rb/issues/3308
4150
+ [#3309]: https://github.com/DataDog/dd-trace-rb/issues/3309
4032
4151
  [#3310]: https://github.com/DataDog/dd-trace-rb/issues/3310
4033
4152
  [#3313]: https://github.com/DataDog/dd-trace-rb/issues/3313
4034
4153
  [#3315]: https://github.com/DataDog/dd-trace-rb/issues/3315
4035
4154
  [#3316]: https://github.com/DataDog/dd-trace-rb/issues/3316
4036
4155
  [#3317]: https://github.com/DataDog/dd-trace-rb/issues/3317
4037
4156
  [#3320]: https://github.com/DataDog/dd-trace-rb/issues/3320
4157
+ [#3322]: https://github.com/DataDog/dd-trace-rb/issues/3322
4158
+ [#3324]: https://github.com/DataDog/dd-trace-rb/issues/3324
4159
+ [#3325]: https://github.com/DataDog/dd-trace-rb/issues/3325
4160
+ [#3326]: https://github.com/DataDog/dd-trace-rb/issues/3326
4038
4161
  [#3328]: https://github.com/DataDog/dd-trace-rb/issues/3328
4039
4162
  [#3329]: https://github.com/DataDog/dd-trace-rb/issues/3329
4163
+ [#3330]: https://github.com/DataDog/dd-trace-rb/issues/3330
4164
+ [#3332]: https://github.com/DataDog/dd-trace-rb/issues/3332
4040
4165
  [#3333]: https://github.com/DataDog/dd-trace-rb/issues/3333
4166
+ [#3335]: https://github.com/DataDog/dd-trace-rb/issues/3335
4167
+ [#3336]: https://github.com/DataDog/dd-trace-rb/issues/3336
4168
+ [#3338]: https://github.com/DataDog/dd-trace-rb/issues/3338
4169
+ [#3341]: https://github.com/DataDog/dd-trace-rb/issues/3341
4170
+ [#3344]: https://github.com/DataDog/dd-trace-rb/issues/3344
4041
4171
  [#3345]: https://github.com/DataDog/dd-trace-rb/issues/3345
4042
4172
  [#3349]: https://github.com/DataDog/dd-trace-rb/issues/3349
4173
+ [#3350]: https://github.com/DataDog/dd-trace-rb/issues/3350
4043
4174
  [#3352]: https://github.com/DataDog/dd-trace-rb/issues/3352
4044
4175
  [#3354]: https://github.com/DataDog/dd-trace-rb/issues/3354
4045
4176
  [#3356]: https://github.com/DataDog/dd-trace-rb/issues/3356
@@ -4049,13 +4180,29 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
4049
4180
  [#3362]: https://github.com/DataDog/dd-trace-rb/issues/3362
4050
4181
  [#3365]: https://github.com/DataDog/dd-trace-rb/issues/3365
4051
4182
  [#3366]: https://github.com/DataDog/dd-trace-rb/issues/3366
4183
+ [#3367]: https://github.com/DataDog/dd-trace-rb/issues/3367
4184
+ [#3369]: https://github.com/DataDog/dd-trace-rb/issues/3369
4185
+ [#3370]: https://github.com/DataDog/dd-trace-rb/issues/3370
4052
4186
  [#3373]: https://github.com/DataDog/dd-trace-rb/issues/3373
4053
4187
  [#3374]: https://github.com/DataDog/dd-trace-rb/issues/3374
4188
+ [#3384]: https://github.com/DataDog/dd-trace-rb/issues/3384
4054
4189
  [#3386]: https://github.com/DataDog/dd-trace-rb/issues/3386
4190
+ [#3388]: https://github.com/DataDog/dd-trace-rb/issues/3388
4191
+ [#3392]: https://github.com/DataDog/dd-trace-rb/issues/3392
4055
4192
  [#3395]: https://github.com/DataDog/dd-trace-rb/issues/3395
4193
+ [#3396]: https://github.com/DataDog/dd-trace-rb/issues/3396
4194
+ [#3398]: https://github.com/DataDog/dd-trace-rb/issues/3398
4195
+ [#3399]: https://github.com/DataDog/dd-trace-rb/issues/3399
4056
4196
  [#3400]: https://github.com/DataDog/dd-trace-rb/issues/3400
4197
+ [#3401]: https://github.com/DataDog/dd-trace-rb/issues/3401
4198
+ [#3402]: https://github.com/DataDog/dd-trace-rb/issues/3402
4199
+ [#3403]: https://github.com/DataDog/dd-trace-rb/issues/3403
4200
+ [#3404]: https://github.com/DataDog/dd-trace-rb/issues/3404
4057
4201
  [#3408]: https://github.com/DataDog/dd-trace-rb/issues/3408
4202
+ [#3409]: https://github.com/DataDog/dd-trace-rb/issues/3409
4203
+ [#3417]: https://github.com/DataDog/dd-trace-rb/issues/3417
4058
4204
  [#3420]: https://github.com/DataDog/dd-trace-rb/issues/3420
4205
+ [#3423]: https://github.com/DataDog/dd-trace-rb/issues/3423
4059
4206
  [#3426]: https://github.com/DataDog/dd-trace-rb/issues/3426
4060
4207
  [#3427]: https://github.com/DataDog/dd-trace-rb/issues/3427
4061
4208
  [#3428]: https://github.com/DataDog/dd-trace-rb/issues/3428
@@ -4064,24 +4211,57 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
4064
4211
  [#3438]: https://github.com/DataDog/dd-trace-rb/issues/3438
4065
4212
  [#3439]: https://github.com/DataDog/dd-trace-rb/issues/3439
4066
4213
  [#3440]: https://github.com/DataDog/dd-trace-rb/issues/3440
4214
+ [#3441]: https://github.com/DataDog/dd-trace-rb/issues/3441
4215
+ [#3443]: https://github.com/DataDog/dd-trace-rb/issues/3443
4216
+ [#3454]: https://github.com/DataDog/dd-trace-rb/issues/3454
4067
4217
  [#3455]: https://github.com/DataDog/dd-trace-rb/issues/3455
4068
4218
  [#3463]: https://github.com/DataDog/dd-trace-rb/issues/3463
4069
4219
  [#3466]: https://github.com/DataDog/dd-trace-rb/issues/3466
4070
4220
  [#3468]: https://github.com/DataDog/dd-trace-rb/issues/3468
4071
4221
  [#3473]: https://github.com/DataDog/dd-trace-rb/issues/3473
4222
+ [#3486]: https://github.com/DataDog/dd-trace-rb/issues/3486
4223
+ [#3488]: https://github.com/DataDog/dd-trace-rb/issues/3488
4224
+ [#3490]: https://github.com/DataDog/dd-trace-rb/issues/3490
4072
4225
  [#3491]: https://github.com/DataDog/dd-trace-rb/issues/3491
4073
4226
  [#3495]: https://github.com/DataDog/dd-trace-rb/issues/3495
4074
4227
  [#3501]: https://github.com/DataDog/dd-trace-rb/issues/3501
4075
4228
  [#3502]: https://github.com/DataDog/dd-trace-rb/issues/3502
4076
4229
  [#3503]: https://github.com/DataDog/dd-trace-rb/issues/3503
4230
+ [#3506]: https://github.com/DataDog/dd-trace-rb/issues/3506
4077
4231
  [#3511]: https://github.com/DataDog/dd-trace-rb/issues/3511
4232
+ [#3516]: https://github.com/DataDog/dd-trace-rb/issues/3516
4078
4233
  [#3518]: https://github.com/DataDog/dd-trace-rb/issues/3518
4079
4234
  [#3519]: https://github.com/DataDog/dd-trace-rb/issues/3519
4080
4235
  [#3520]: https://github.com/DataDog/dd-trace-rb/issues/3520
4081
4236
  [#3523]: https://github.com/DataDog/dd-trace-rb/issues/3523
4237
+ [#3528]: https://github.com/DataDog/dd-trace-rb/issues/3528
4082
4238
  [#3531]: https://github.com/DataDog/dd-trace-rb/issues/3531
4083
4239
  [#3535]: https://github.com/DataDog/dd-trace-rb/issues/3535
4240
+ [#3536]: https://github.com/DataDog/dd-trace-rb/issues/3536
4084
4241
  [#3539]: https://github.com/DataDog/dd-trace-rb/issues/3539
4242
+ [#3546]: https://github.com/DataDog/dd-trace-rb/issues/3546
4243
+ [#3551]: https://github.com/DataDog/dd-trace-rb/issues/3551
4244
+ [#3558]: https://github.com/DataDog/dd-trace-rb/issues/3558
4245
+ [#3565]: https://github.com/DataDog/dd-trace-rb/issues/3565
4246
+ [#3572]: https://github.com/DataDog/dd-trace-rb/issues/3572
4247
+ [#3573]: https://github.com/DataDog/dd-trace-rb/issues/3573
4248
+ [#3582]: https://github.com/DataDog/dd-trace-rb/issues/3582
4249
+ [#3585]: https://github.com/DataDog/dd-trace-rb/issues/3585
4250
+ [#3587]: https://github.com/DataDog/dd-trace-rb/issues/3587
4251
+ [#3597]: https://github.com/DataDog/dd-trace-rb/issues/3597
4252
+ [#3598]: https://github.com/DataDog/dd-trace-rb/issues/3598
4253
+ [#3610]: https://github.com/DataDog/dd-trace-rb/issues/3610
4254
+ [#3616]: https://github.com/DataDog/dd-trace-rb/issues/3616
4255
+ [#3617]: https://github.com/DataDog/dd-trace-rb/issues/3617
4256
+ [#3618]: https://github.com/DataDog/dd-trace-rb/issues/3618
4257
+ [#3619]: https://github.com/DataDog/dd-trace-rb/issues/3619
4258
+ [#3621]: https://github.com/DataDog/dd-trace-rb/issues/3621
4259
+ [#3623]: https://github.com/DataDog/dd-trace-rb/issues/3623
4260
+ [#3624]: https://github.com/DataDog/dd-trace-rb/issues/3624
4261
+ [#3627]: https://github.com/DataDog/dd-trace-rb/issues/3627
4262
+ [#3630]: https://github.com/DataDog/dd-trace-rb/issues/3630
4263
+ [#3645]: https://github.com/DataDog/dd-trace-rb/issues/3645
4264
+ [#3651]: https://github.com/DataDog/dd-trace-rb/issues/3651
4085
4265
  [@AdrianLC]: https://github.com/AdrianLC
4086
4266
  [@Azure7111]: https://github.com/Azure7111
4087
4267
  [@BabyGroot]: https://github.com/BabyGroot
@@ -28,7 +28,7 @@ documentation.**
28
28
  The profiling native extension is (and must always be) designed to **not cause failures** during gem installation, even
29
29
  if some features, Ruby versions, or operating systems are not supported.
30
30
 
31
- E.g. the extension must not break installation on Ruby 2.1 (or the oldest Ruby version we support at the time) on 64-bit ARM macOS,
31
+ E.g. the extension must not break installation on Ruby 2.5 (or the oldest Ruby version we support at the time) on 64-bit ARM macOS,
32
32
  even if at run time it will effectively do nothing for such a setup.
33
33
 
34
34
  We have a CI setup to help validate this, but this is really important to keep in mind when adding to or changing the
@@ -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, 8);
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
- // If no thread owns the Global VM Lock, the application is probably idle at the moment. We still want to sample
622
- // so we "ask a friend" (the IdleSamplingHelper component) to grab the GVL and simulate getting a SIGPROF.
623
- //
624
- // In a previous version of the code, we called `grab_gvl_and_sample` directly BUT this was problematic because
625
- // Ruby may concurrently get busy and so the CpuAndWallTimeWorker would be blocked in line to acquire the GVL
626
- // for an uncontrolled amount of time. (This can still happen to the IdleSamplingHelper, but the
627
- // CpuAndWallTimeWorker will still be free to interrupt the Ruby VM and keep sampling for the entire blocking period).
628
- state->stats.trigger_simulated_signal_delivery_attempts++;
629
- idle_sampling_helper_request_action(state->idle_sampling_helper_instance, grab_gvl_and_sample);
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)
@@ -910,18 +929,6 @@ static VALUE _native_stats(DDTRACE_UNUSED VALUE self, VALUE instance) {
910
929
  struct cpu_and_wall_time_worker_state *state;
911
930
  TypedData_Get_Struct(instance, struct cpu_and_wall_time_worker_state, &cpu_and_wall_time_worker_typed_data, state);
912
931
 
913
- VALUE pretty_cpu_sampling_time_ns_min = state->stats.cpu_sampling_time_ns_min == UINT64_MAX ? Qnil : ULL2NUM(state->stats.cpu_sampling_time_ns_min);
914
- VALUE pretty_cpu_sampling_time_ns_max = state->stats.cpu_sampling_time_ns_max == 0 ? Qnil : ULL2NUM(state->stats.cpu_sampling_time_ns_max);
915
- VALUE pretty_cpu_sampling_time_ns_total = state->stats.cpu_sampling_time_ns_total == 0 ? Qnil : ULL2NUM(state->stats.cpu_sampling_time_ns_total);
916
- VALUE pretty_cpu_sampling_time_ns_avg =
917
- state->stats.cpu_sampled == 0 ? Qnil : DBL2NUM(((double) state->stats.cpu_sampling_time_ns_total) / state->stats.cpu_sampled);
918
-
919
- VALUE pretty_allocation_sampling_time_ns_min = state->stats.allocation_sampling_time_ns_min == UINT64_MAX ? Qnil : ULL2NUM(state->stats.allocation_sampling_time_ns_min);
920
- VALUE pretty_allocation_sampling_time_ns_max = state->stats.allocation_sampling_time_ns_max == 0 ? Qnil : ULL2NUM(state->stats.allocation_sampling_time_ns_max);
921
- VALUE pretty_allocation_sampling_time_ns_total = state->stats.allocation_sampling_time_ns_total == 0 ? Qnil : ULL2NUM(state->stats.allocation_sampling_time_ns_total);
922
- VALUE pretty_allocation_sampling_time_ns_avg =
923
- state->stats.allocation_sampled == 0 ? Qnil : DBL2NUM(((double) state->stats.allocation_sampling_time_ns_total) / state->stats.allocation_sampled);
924
-
925
932
  unsigned long total_cpu_samples_attempted = state->stats.cpu_sampled + state->stats.cpu_skipped;
926
933
  VALUE effective_cpu_sample_rate =
927
934
  total_cpu_samples_attempted == 0 ? Qnil : DBL2NUM(((double) state->stats.cpu_sampled) / total_cpu_samples_attempted);
@@ -943,24 +950,25 @@ static VALUE _native_stats(DDTRACE_UNUSED VALUE self, VALUE instance) {
943
950
  ID2SYM(rb_intern("postponed_job_success")), /* => */ UINT2NUM(state->stats.postponed_job_success),
944
951
  ID2SYM(rb_intern("postponed_job_full")), /* => */ UINT2NUM(state->stats.postponed_job_full),
945
952
  ID2SYM(rb_intern("postponed_job_unknown_result")), /* => */ UINT2NUM(state->stats.postponed_job_unknown_result),
953
+ ID2SYM(rb_intern("interrupt_thread_attempts")), /* => */ UINT2NUM(state->stats.interrupt_thread_attempts),
946
954
 
947
955
  // CPU Stats
948
956
  ID2SYM(rb_intern("cpu_sampled")), /* => */ UINT2NUM(state->stats.cpu_sampled),
949
957
  ID2SYM(rb_intern("cpu_skipped")), /* => */ UINT2NUM(state->stats.cpu_skipped),
950
958
  ID2SYM(rb_intern("cpu_effective_sample_rate")), /* => */ effective_cpu_sample_rate,
951
- ID2SYM(rb_intern("cpu_sampling_time_ns_min")), /* => */ pretty_cpu_sampling_time_ns_min,
952
- ID2SYM(rb_intern("cpu_sampling_time_ns_max")), /* => */ pretty_cpu_sampling_time_ns_max,
953
- ID2SYM(rb_intern("cpu_sampling_time_ns_total")), /* => */ pretty_cpu_sampling_time_ns_total,
954
- ID2SYM(rb_intern("cpu_sampling_time_ns_avg")), /* => */ pretty_cpu_sampling_time_ns_avg,
959
+ ID2SYM(rb_intern("cpu_sampling_time_ns_min")), /* => */ RUBY_NUM_OR_NIL(state->stats.cpu_sampling_time_ns_min, != UINT64_MAX, ULL2NUM),
960
+ ID2SYM(rb_intern("cpu_sampling_time_ns_max")), /* => */ RUBY_NUM_OR_NIL(state->stats.cpu_sampling_time_ns_max, > 0, ULL2NUM),
961
+ ID2SYM(rb_intern("cpu_sampling_time_ns_total")), /* => */ RUBY_NUM_OR_NIL(state->stats.cpu_sampling_time_ns_total, > 0, ULL2NUM),
962
+ ID2SYM(rb_intern("cpu_sampling_time_ns_avg")), /* => */ RUBY_AVG_OR_NIL(state->stats.cpu_sampling_time_ns_total, state->stats.cpu_sampled),
955
963
 
956
964
  // Allocation stats
957
965
  ID2SYM(rb_intern("allocation_sampled")), /* => */ state->allocation_profiling_enabled ? ULONG2NUM(state->stats.allocation_sampled) : Qnil,
958
966
  ID2SYM(rb_intern("allocation_skipped")), /* => */ state->allocation_profiling_enabled ? ULONG2NUM(state->stats.allocation_skipped) : Qnil,
959
967
  ID2SYM(rb_intern("allocation_effective_sample_rate")), /* => */ effective_allocation_sample_rate,
960
- ID2SYM(rb_intern("allocation_sampling_time_ns_min")), /* => */ pretty_allocation_sampling_time_ns_min,
961
- ID2SYM(rb_intern("allocation_sampling_time_ns_max")), /* => */ pretty_allocation_sampling_time_ns_max,
962
- ID2SYM(rb_intern("allocation_sampling_time_ns_total")), /* => */ pretty_allocation_sampling_time_ns_total,
963
- ID2SYM(rb_intern("allocation_sampling_time_ns_avg")), /* => */ pretty_allocation_sampling_time_ns_avg,
968
+ ID2SYM(rb_intern("allocation_sampling_time_ns_min")), /* => */ RUBY_NUM_OR_NIL(state->stats.allocation_sampling_time_ns_min, != UINT64_MAX, ULL2NUM),
969
+ ID2SYM(rb_intern("allocation_sampling_time_ns_max")), /* => */ RUBY_NUM_OR_NIL(state->stats.allocation_sampling_time_ns_max, > 0, ULL2NUM),
970
+ ID2SYM(rb_intern("allocation_sampling_time_ns_total")), /* => */ RUBY_NUM_OR_NIL(state->stats.allocation_sampling_time_ns_total, > 0, ULL2NUM),
971
+ ID2SYM(rb_intern("allocation_sampling_time_ns_avg")), /* => */ RUBY_AVG_OR_NIL(state->stats.allocation_sampling_time_ns_total, state->stats.allocation_sampled),
964
972
  ID2SYM(rb_intern("allocation_sampler_snapshot")), /* => */ allocation_sampler_snapshot,
965
973
  ID2SYM(rb_intern("allocations_during_sample")), /* => */ state->allocation_profiling_enabled ? UINT2NUM(state->stats.allocations_during_sample) : Qnil,
966
974
  };
@@ -217,7 +217,7 @@ static long thread_id_for(VALUE thread);
217
217
  static VALUE _native_stats(VALUE self, VALUE collector_instance);
218
218
  static VALUE _native_gc_tracking(VALUE self, VALUE collector_instance);
219
219
  static void trace_identifiers_for(struct thread_context_collector_state *state, VALUE thread, struct trace_identifiers *trace_identifiers_result);
220
- static bool should_collect_resource(VALUE root_span_type);
220
+ static bool should_collect_resource(VALUE root_span);
221
221
  static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE collector_instance);
222
222
  static VALUE thread_list(struct thread_context_collector_state *state);
223
223
  static VALUE _native_sample_allocation(DDTRACE_UNUSED VALUE self, VALUE collector_instance, VALUE sample_weight, VALUE new_object);
@@ -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
- return finished_major_gc || over_flush_time_treshold;
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).
@@ -1143,10 +1146,7 @@ static void trace_identifiers_for(struct thread_context_collector_state *state,
1143
1146
 
1144
1147
  trace_identifiers_result->valid = true;
1145
1148
 
1146
- if (!state->endpoint_collection_enabled) return;
1147
-
1148
- VALUE root_span_type = rb_ivar_get(root_span, at_type_id /* @type */);
1149
- if (root_span_type == Qnil || !should_collect_resource(root_span_type)) return;
1149
+ if (!state->endpoint_collection_enabled || !should_collect_resource(root_span)) return;
1150
1150
 
1151
1151
  VALUE trace_resource = rb_ivar_get(active_trace, at_resource_id /* @resource */);
1152
1152
  if (RB_TYPE_P(trace_resource, T_STRING)) {
@@ -1157,21 +1157,32 @@ static void trace_identifiers_for(struct thread_context_collector_state *state,
1157
1157
  }
1158
1158
  }
1159
1159
 
1160
- // We only collect the resource for spans of types:
1160
+ // We opt-in to collecting the resource for spans of types:
1161
1161
  // * 'web', for web requests
1162
- // * proxy', used by the rack integration with request_queuing: true (e.g. also represents a web request)
1162
+ // * 'proxy', used by the rack integration with request_queuing: true (e.g. also represents a web request)
1163
+ // * 'worker', used for sidekiq and similar background job processors
1163
1164
  //
1164
- // NOTE: Currently we're only interested in HTTP service endpoints. Over time, this list may be expanded.
1165
+ // Over time, this list may be expanded.
1165
1166
  // Resources MUST NOT include personal identifiable information (PII); this should not be the case with
1166
1167
  // ddtrace integrations, but worth mentioning just in case :)
1167
- static bool should_collect_resource(VALUE root_span_type) {
1168
+ static bool should_collect_resource(VALUE root_span) {
1169
+ VALUE root_span_type = rb_ivar_get(root_span, at_type_id /* @type */);
1170
+ if (root_span_type == Qnil) return false;
1168
1171
  ENFORCE_TYPE(root_span_type, T_STRING);
1169
1172
 
1170
1173
  int root_span_type_length = RSTRING_LEN(root_span_type);
1171
1174
  const char *root_span_type_value = StringValuePtr(root_span_type);
1172
1175
 
1173
- return (root_span_type_length == strlen("web") && (memcmp("web", root_span_type_value, strlen("web")) == 0)) ||
1176
+ bool is_web_request =
1177
+ (root_span_type_length == strlen("web") && (memcmp("web", root_span_type_value, strlen("web")) == 0)) ||
1174
1178
  (root_span_type_length == strlen("proxy") && (memcmp("proxy", root_span_type_value, strlen("proxy")) == 0));
1179
+
1180
+ if (is_web_request) return true;
1181
+
1182
+ bool is_worker_request =
1183
+ (root_span_type_length == strlen("worker") && (memcmp("worker", root_span_type_value, strlen("worker")) == 0));
1184
+
1185
+ return is_worker_request;
1175
1186
  }
1176
1187
 
1177
1188
  // After the Ruby VM forks, this method gets called in the child process to clean up any leftover state from the parent.