ddtrace 1.6.1 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +89 -2
  3. data/README.md +2 -2
  4. data/ext/ddtrace_profiling_loader/extconf.rb +5 -2
  5. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +1 -1
  6. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +3 -2
  7. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.c +81 -47
  8. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time.h +1 -1
  9. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +332 -125
  10. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.c +142 -0
  11. data/ext/ddtrace_profiling_native_extension/collectors_dynamic_sampling_rate.h +14 -0
  12. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +241 -0
  13. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.h +3 -0
  14. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +11 -13
  15. data/ext/ddtrace_profiling_native_extension/extconf.rb +22 -8
  16. data/ext/ddtrace_profiling_native_extension/helpers.h +5 -0
  17. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +8 -0
  18. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +111 -26
  19. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.h +9 -0
  20. data/ext/ddtrace_profiling_native_extension/profiling.c +205 -0
  21. data/ext/ddtrace_profiling_native_extension/ruby_helpers.c +86 -0
  22. data/ext/ddtrace_profiling_native_extension/ruby_helpers.h +28 -6
  23. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.c +115 -0
  24. data/ext/ddtrace_profiling_native_extension/setup_signal_handler.h +11 -0
  25. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +84 -35
  26. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +1 -0
  27. data/ext/ddtrace_profiling_native_extension/time_helpers.c +17 -0
  28. data/ext/ddtrace_profiling_native_extension/time_helpers.h +10 -0
  29. data/lib/datadog/appsec/assets/blocked.html +98 -3
  30. data/lib/datadog/appsec/assets/blocked.json +1 -0
  31. data/lib/datadog/appsec/assets/blocked.text +5 -0
  32. data/lib/datadog/appsec/assets/waf_rules/recommended.json +35 -46
  33. data/lib/datadog/appsec/assets/waf_rules/risky.json +1 -1
  34. data/lib/datadog/appsec/assets/waf_rules/strict.json +46 -1
  35. data/lib/datadog/appsec/assets.rb +2 -2
  36. data/lib/datadog/appsec/configuration/settings.rb +6 -0
  37. data/lib/datadog/appsec/configuration.rb +4 -0
  38. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +4 -8
  39. data/lib/datadog/appsec/contrib/rack/request.rb +17 -0
  40. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +2 -2
  41. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +2 -2
  42. data/lib/datadog/appsec/contrib/rails/patcher.rb +3 -6
  43. data/lib/datadog/appsec/contrib/sinatra/ext.rb +1 -0
  44. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +1 -1
  45. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -8
  46. data/lib/datadog/appsec/extensions.rb +10 -0
  47. data/lib/datadog/appsec/processor.rb +18 -0
  48. data/lib/datadog/appsec/response.rb +54 -0
  49. data/lib/datadog/core/configuration/components.rb +27 -6
  50. data/lib/datadog/core/configuration/ext.rb +18 -0
  51. data/lib/datadog/core/configuration/settings.rb +14 -341
  52. data/lib/datadog/core/diagnostics/health.rb +4 -22
  53. data/lib/datadog/core/environment/variable_helpers.rb +58 -10
  54. data/lib/datadog/core/runtime/ext.rb +1 -1
  55. data/lib/datadog/core/utils.rb +0 -21
  56. data/lib/datadog/core.rb +21 -1
  57. data/lib/datadog/opentracer/distributed_headers.rb +7 -9
  58. data/lib/datadog/opentracer/rack_propagator.rb +0 -3
  59. data/lib/datadog/opentracer/text_map_propagator.rb +5 -7
  60. data/lib/datadog/profiling/collectors/cpu_and_wall_time.rb +10 -4
  61. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +20 -5
  62. data/lib/datadog/profiling/collectors/dynamic_sampling_rate.rb +14 -0
  63. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +68 -0
  64. data/lib/datadog/profiling/collectors/old_stack.rb +7 -0
  65. data/lib/datadog/profiling/exporter.rb +5 -0
  66. data/lib/datadog/profiling/old_recorder.rb +8 -0
  67. data/lib/datadog/profiling/profiler.rb +7 -0
  68. data/lib/datadog/profiling/scheduler.rb +4 -7
  69. data/lib/datadog/profiling/stack_recorder.rb +36 -0
  70. data/lib/datadog/profiling/tasks/setup.rb +0 -7
  71. data/lib/datadog/profiling.rb +2 -0
  72. data/lib/datadog/tracing/configuration/ext.rb +33 -3
  73. data/lib/datadog/tracing/configuration/settings.rb +433 -0
  74. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +4 -1
  75. data/lib/datadog/tracing/contrib/aws/ext.rb +1 -0
  76. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +4 -1
  77. data/lib/datadog/tracing/contrib/dalli/ext.rb +1 -0
  78. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +4 -0
  79. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +5 -1
  80. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +1 -0
  81. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +6 -1
  82. data/lib/datadog/tracing/contrib/ethon/ext.rb +1 -0
  83. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -1
  84. data/lib/datadog/tracing/contrib/excon/ext.rb +1 -0
  85. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +5 -1
  86. data/lib/datadog/tracing/contrib/faraday/ext.rb +1 -0
  87. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +6 -1
  88. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +2 -1
  89. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +6 -12
  90. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +27 -0
  91. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +43 -0
  92. data/lib/datadog/tracing/contrib/grpc/ext.rb +1 -0
  93. data/lib/datadog/tracing/contrib/grpc/patcher.rb +0 -2
  94. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +6 -1
  95. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +32 -0
  96. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +38 -0
  97. data/lib/datadog/tracing/contrib/http/ext.rb +1 -0
  98. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +6 -1
  99. data/lib/datadog/tracing/contrib/httpclient/ext.rb +1 -0
  100. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +6 -1
  101. data/lib/datadog/tracing/contrib/httprb/ext.rb +1 -0
  102. data/lib/datadog/tracing/contrib/kafka/consumer_event.rb +1 -0
  103. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +1 -0
  104. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +1 -0
  105. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +5 -1
  106. data/lib/datadog/tracing/contrib/mongodb/ext.rb +1 -0
  107. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +2 -0
  108. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +4 -1
  109. data/lib/datadog/tracing/contrib/mysql2/ext.rb +1 -0
  110. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +2 -2
  111. data/lib/datadog/tracing/contrib/patcher.rb +3 -2
  112. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +4 -1
  113. data/lib/datadog/tracing/contrib/pg/ext.rb +1 -0
  114. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +12 -2
  115. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +4 -1
  116. data/lib/datadog/tracing/contrib/presto/ext.rb +1 -0
  117. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +1 -0
  118. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +10 -12
  119. data/lib/datadog/tracing/contrib/que/tracer.rb +2 -0
  120. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +4 -1
  121. data/lib/datadog/tracing/contrib/racecar/events/message.rb +4 -1
  122. data/lib/datadog/tracing/contrib/rack/middlewares.rb +2 -0
  123. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +4 -1
  124. data/lib/datadog/tracing/contrib/redis/ext.rb +1 -0
  125. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +30 -21
  126. data/lib/datadog/tracing/contrib/redis/integration.rb +34 -2
  127. data/lib/datadog/tracing/contrib/redis/patcher.rb +18 -14
  128. data/lib/datadog/tracing/contrib/redis/quantize.rb +12 -9
  129. data/lib/datadog/tracing/contrib/redis/tags.rb +4 -6
  130. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +72 -0
  131. data/lib/datadog/tracing/contrib/resque/resque_job.rb +2 -0
  132. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +6 -1
  133. data/lib/datadog/tracing/contrib/rest_client/ext.rb +1 -0
  134. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -0
  135. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +5 -0
  136. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +5 -0
  137. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +2 -0
  138. data/lib/datadog/{core → tracing}/diagnostics/ext.rb +1 -6
  139. data/lib/datadog/tracing/diagnostics/health.rb +40 -0
  140. data/lib/datadog/tracing/distributed/b3_multi.rb +66 -0
  141. data/lib/datadog/tracing/distributed/b3_single.rb +66 -0
  142. data/lib/datadog/tracing/distributed/datadog.rb +153 -0
  143. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +1 -0
  144. data/lib/datadog/tracing/distributed/fetcher.rb +30 -0
  145. data/lib/datadog/tracing/distributed/headers/ext.rb +18 -16
  146. data/lib/datadog/tracing/distributed/helpers.rb +9 -7
  147. data/lib/datadog/tracing/distributed/none.rb +19 -0
  148. data/lib/datadog/tracing/distributed/propagation.rb +127 -0
  149. data/lib/datadog/tracing/distributed/trace_context.rb +369 -0
  150. data/lib/datadog/tracing/metadata/ext.rb +1 -1
  151. data/lib/datadog/tracing/propagation/http.rb +3 -106
  152. data/lib/datadog/tracing/sampling/priority_sampler.rb +11 -0
  153. data/lib/datadog/tracing/sampling/rate_sampler.rb +3 -3
  154. data/lib/datadog/tracing/span.rb +3 -19
  155. data/lib/datadog/tracing/span_operation.rb +5 -4
  156. data/lib/datadog/tracing/trace_digest.rb +75 -2
  157. data/lib/datadog/tracing/trace_operation.rb +5 -4
  158. data/lib/datadog/tracing/trace_segment.rb +1 -1
  159. data/lib/datadog/tracing/utils.rb +50 -0
  160. data/lib/ddtrace/transport/trace_formatter.rb +2 -5
  161. data/lib/ddtrace/version.rb +2 -2
  162. metadata +35 -15
  163. data/lib/datadog/tracing/distributed/headers/b3.rb +0 -55
  164. data/lib/datadog/tracing/distributed/headers/b3_single.rb +0 -67
  165. data/lib/datadog/tracing/distributed/headers/datadog.rb +0 -144
  166. data/lib/datadog/tracing/distributed/headers/parser.rb +0 -37
  167. data/lib/datadog/tracing/distributed/metadata/b3.rb +0 -55
  168. data/lib/datadog/tracing/distributed/metadata/b3_single.rb +0 -66
  169. data/lib/datadog/tracing/distributed/metadata/datadog.rb +0 -73
  170. data/lib/datadog/tracing/distributed/metadata/parser.rb +0 -34
  171. data/lib/datadog/tracing/propagation/grpc.rb +0 -98
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a13232b0a3e34d8c05f4e9cd14083d3da7899e4cd4a8a52a95495193dce81b4
4
- data.tar.gz: '0975d24547f318e657422c35ef54f8f68cff797436594d30514d163b55170220'
3
+ metadata.gz: '02285d37473e8fe6c731e55ae7864860a311e2b6d509f56a41f31094cd198f09'
4
+ data.tar.gz: 8857a0f43f96fef23309cd7fced88b846d5ad48834b6c87d0f40181cc3bd5dd9
5
5
  SHA512:
6
- metadata.gz: da8917c06511999a28152037efa177fceba67d0329534bc8a462d17ffb151bfad0f360318262be095fc73ce42990051e6856b2cc3663317091b552d76730116c
7
- data.tar.gz: 44a8062936ae2f20fdca4d524d6390825b87092d58ebb934d2e4b715f442b595be020752b3a2c0fd432d4dc3901ad611725adf4d70139c095d78e7b2b127fdd1
6
+ metadata.gz: afcde0e01258f5ab997fa6bcfa51c29a82f0e730258056a9efae86130445dbd63471269c047878b1ee554cc4ec956fe6e95a597ce65930e73549b0e32cbec50c
7
+ data.tar.gz: 292867c7c22146d0bd3147bb8863dd51fc89200a08efe640f05ae053fb93bdaeb068eefb6c89466b40ebbe749174844aa6b874c5a2b6aae30cb5055c9f2dc3cd
data/CHANGELOG.md CHANGED
@@ -2,6 +2,58 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [1.8.0] - 2022-12-14
6
+
7
+ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v1.8.0
8
+
9
+ As of ddtrace 1.8.0, CPU Profiling 2.0 is now in opt-in (that is, disabled by default) public beta. For more details,
10
+ check the release notes.
11
+
12
+ ### Added
13
+
14
+ * Core: Profiling: [PROF-6559] Mark Ruby CPU Profiling 2.0 as being in beta ([#2489][])
15
+ * Tracing: Attempt to parse future version of TraceContext ([#2473][])
16
+ * Tracing: Add DD_TRACE_PROPAGATION_STYLE option ([#2466][])
17
+ * Integrations: Tracing: SQL comment propagation full mode with traceparent ([#2464][])
18
+ * Integrations: Tracing: Wire W3C propagator to HTTP & gRPC propagation ([#2458][])
19
+ * Integrations: Tracing: Auto-instrumentation with service_name from environmental variable ([#2455][])
20
+ * Core: Integrations: Tracing: Deprecation notice for B3 propagation configuration ([#2454][])
21
+ * Tracing: Add W3C Trace Context propagator ([#2451][])
22
+ * Integrations: Tracing: Redis 5 Instrumentation ([#2428][])
23
+
24
+ ### Changed
25
+
26
+ * Tracing: Changes `error.msg` to `error.message` for UNC ([#2469][])
27
+ * Tracing: Semicolons not allowed in 'origin' ([#2461][])
28
+ * Core: Dev/refactor: Tracing: Dev/internal: Move Utils#next_id and constants to Tracing::Utils ([#2463][])
29
+ * Core: Dev/refactor: Tracing: Dev/internal: Move Tracing config settings from Core to Tracing ([#2459][])
30
+ * Core: Dev/refactor: Tracing: Dev/internal: Move Tracing diagnostic code from Core to Tracing ([#2453][])
31
+
32
+ ### Fixed
33
+
34
+ * Integrations: Tracing: Improve redis integration patching ([#2470][])
35
+ * Tracing: Extra testing from W3C spec ([#2460][])
36
+
37
+ ## [1.7.0] - 2022-11-29
38
+
39
+ ### Added
40
+ * Integrations: Support que 2 ([#2382][]) ([@danhodge][])
41
+ * Tracing: Unified tagging `span.kind` as `server` and `client` ([#2365][])
42
+ * Tracing: Adds `span.kind` tag for `kafka`, `sidekiq`, `racecar`, `que`, `shoryuken`, `sneakers`, and `resque` ([#2420][], [#2419][], [#2413][], [#2394][])
43
+ * Tracing: Adds `span.kind` with values `producer` and `consumer` for `delayed_job` ([#2393][])
44
+ * Tracing: Adds `span.kind` as `client` for `redis` ([#2392][])
45
+ * Appsec: Pass HTTP client IP to WAF ([#2316][])
46
+ * Unified tagging `process_id` ([#2276][])
47
+
48
+ ### Changed
49
+ * Allow `debase-ruby_core_source` 0.10.18 to be used ([#2435][])
50
+ * Update AppSec ruleset to v1.4.2 ([#2390][])
51
+ * Refactored clearing of profile data after Ruby app forks ([#2362][], [#2367][])
52
+ * Tracing: Move distributed propagation to Contrib ([#2352][])
53
+
54
+ ### Fixed
55
+ * Fix ddtrace installation issue when users have CI=true ([#2378][])
56
+
5
57
  ## [1.6.1] - 2022-11-16
6
58
 
7
59
  ### Changed
@@ -2198,7 +2250,9 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
2198
2250
 
2199
2251
  Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
2200
2252
 
2201
- [Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.6.1...master
2253
+ [Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.8.0...master
2254
+ [1.8.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.7.0...v1.8.0
2255
+ [1.7.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.6.1...v1.7.0
2202
2256
  [1.6.1]: https://github.com/DataDog/dd-trace-rb/compare/v1.6.0...v1.6.1
2203
2257
  [1.6.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.5.2...v1.6.0
2204
2258
  [1.5.2]: https://github.com/DataDog/dd-trace-rb/compare/v1.5.1...v1.5.2
@@ -3102,6 +3156,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
3102
3156
  [#2260]: https://github.com/DataDog/dd-trace-rb/issues/2260
3103
3157
  [#2265]: https://github.com/DataDog/dd-trace-rb/issues/2265
3104
3158
  [#2267]: https://github.com/DataDog/dd-trace-rb/issues/2267
3159
+ [#2276]: https://github.com/DataDog/dd-trace-rb/issues/2276
3105
3160
  [#2279]: https://github.com/DataDog/dd-trace-rb/issues/2279
3106
3161
  [#2283]: https://github.com/DataDog/dd-trace-rb/issues/2283
3107
3162
  [#2289]: https://github.com/DataDog/dd-trace-rb/issues/2289
@@ -3114,6 +3169,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
3114
3169
  [#2310]: https://github.com/DataDog/dd-trace-rb/issues/2310
3115
3170
  [#2311]: https://github.com/DataDog/dd-trace-rb/issues/2311
3116
3171
  [#2313]: https://github.com/DataDog/dd-trace-rb/issues/2313
3172
+ [#2316]: https://github.com/DataDog/dd-trace-rb/issues/2316
3117
3173
  [#2317]: https://github.com/DataDog/dd-trace-rb/issues/2317
3118
3174
  [#2318]: https://github.com/DataDog/dd-trace-rb/issues/2318
3119
3175
  [#2319]: https://github.com/DataDog/dd-trace-rb/issues/2319
@@ -3124,7 +3180,37 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
3124
3180
  [#2331]: https://github.com/DataDog/dd-trace-rb/issues/2331
3125
3181
  [#2335]: https://github.com/DataDog/dd-trace-rb/issues/2335
3126
3182
  [#2339]: https://github.com/DataDog/dd-trace-rb/issues/2339
3183
+ [#2352]: https://github.com/DataDog/dd-trace-rb/issues/2352
3184
+ [#2362]: https://github.com/DataDog/dd-trace-rb/issues/2362
3127
3185
  [#2363]: https://github.com/DataDog/dd-trace-rb/issues/2363
3186
+ [#2365]: https://github.com/DataDog/dd-trace-rb/issues/2365
3187
+ [#2367]: https://github.com/DataDog/dd-trace-rb/issues/2367
3188
+ [#2378]: https://github.com/DataDog/dd-trace-rb/issues/2378
3189
+ [#2382]: https://github.com/DataDog/dd-trace-rb/issues/2382
3190
+ [#2390]: https://github.com/DataDog/dd-trace-rb/issues/2390
3191
+ [#2392]: https://github.com/DataDog/dd-trace-rb/issues/2392
3192
+ [#2393]: https://github.com/DataDog/dd-trace-rb/issues/2393
3193
+ [#2394]: https://github.com/DataDog/dd-trace-rb/issues/2394
3194
+ [#2413]: https://github.com/DataDog/dd-trace-rb/issues/2413
3195
+ [#2419]: https://github.com/DataDog/dd-trace-rb/issues/2419
3196
+ [#2420]: https://github.com/DataDog/dd-trace-rb/issues/2420
3197
+ [#2428]: https://github.com/DataDog/dd-trace-rb/issues/2428
3198
+ [#2435]: https://github.com/DataDog/dd-trace-rb/issues/2435
3199
+ [#2451]: https://github.com/DataDog/dd-trace-rb/issues/2451
3200
+ [#2453]: https://github.com/DataDog/dd-trace-rb/issues/2453
3201
+ [#2454]: https://github.com/DataDog/dd-trace-rb/issues/2454
3202
+ [#2455]: https://github.com/DataDog/dd-trace-rb/issues/2455
3203
+ [#2458]: https://github.com/DataDog/dd-trace-rb/issues/2458
3204
+ [#2459]: https://github.com/DataDog/dd-trace-rb/issues/2459
3205
+ [#2460]: https://github.com/DataDog/dd-trace-rb/issues/2460
3206
+ [#2461]: https://github.com/DataDog/dd-trace-rb/issues/2461
3207
+ [#2463]: https://github.com/DataDog/dd-trace-rb/issues/2463
3208
+ [#2464]: https://github.com/DataDog/dd-trace-rb/issues/2464
3209
+ [#2466]: https://github.com/DataDog/dd-trace-rb/issues/2466
3210
+ [#2469]: https://github.com/DataDog/dd-trace-rb/issues/2469
3211
+ [#2470]: https://github.com/DataDog/dd-trace-rb/issues/2470
3212
+ [#2473]: https://github.com/DataDog/dd-trace-rb/issues/2473
3213
+ [#2489]: https://github.com/DataDog/dd-trace-rb/issues/2489
3128
3214
  [@AdrianLC]: https://github.com/AdrianLC
3129
3215
  [@Azure7111]: https://github.com/Azure7111
3130
3216
  [@BabyGroot]: https://github.com/BabyGroot
@@ -3170,6 +3256,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
3170
3256
  [@components]: https://github.com/components
3171
3257
  [@cswatt]: https://github.com/cswatt
3172
3258
  [@cwoodcox]: https://github.com/cwoodcox
3259
+ [@danhodge]: https://github.com/danhodge
3173
3260
  [@dasch]: https://github.com/dasch
3174
3261
  [@dim]: https://github.com/dim
3175
3262
  [@dirk]: https://github.com/dirk
@@ -3268,4 +3355,4 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
3268
3355
  [@y-yagi]: https://github.com/y-yagi
3269
3356
  [@yujideveloper]: https://github.com/yujideveloper
3270
3357
  [@yukimurasawa]: https://github.com/yukimurasawa
3271
- [@zachmccormick]: https://github.com/zachmccormick
3358
+ [@zachmccormick]: https://github.com/zachmccormick
data/README.md CHANGED
@@ -1,5 +1,3 @@
1
- **We've recently released the 1.x version series. If you're upgrading from a 0.x version, check out our [upgrade guide](https://github.com/DataDog/dd-trace-rb/blob/master/docs/UpgradeGuide.md#from-0x-to-10).**
2
-
3
1
  # Datadog Trace Client
4
2
 
5
3
  [![Gem](https://img.shields.io/gem/v/ddtrace)](https://rubygems.org/gems/ddtrace/)
@@ -12,6 +10,8 @@ databases and microservices so that developers have great visiblity into bottlen
12
10
 
13
11
  ## Getting started
14
12
 
13
+ **If you're upgrading from a 0.x version, check out our [upgrade guide](https://github.com/DataDog/dd-trace-rb/blob/master/docs/UpgradeGuide.md#from-0x-to-10).**
14
+
15
15
  For a basic product overview, check out our [setup documentation][setup docs].
16
16
 
17
17
  For installation, configuration, and details about using the API, check out our [API documentation][api docs] and [gem documentation][gem docs].
@@ -26,7 +26,7 @@ end
26
26
 
27
27
  # Because we can't control what compiler versions our customers use, shipping with -Werror by default is a no-go.
28
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'
29
+ add_compiler_flag '-Werror' if ENV['DDTRACE_CI'] == 'true'
30
30
 
31
31
  # Older gcc releases may not default to C99 and we need to ask for this. This is also used:
32
32
  # * by upstream Ruby -- search for gnu99 in the codebase
@@ -34,7 +34,7 @@ add_compiler_flag '-Werror' if ENV['CI'] == 'true'
34
34
  # (https://github.com/msgpack/msgpack-ruby/blob/18ce08f6d612fe973843c366ac9a0b74c4e50599/ext/msgpack/extconf.rb#L8)
35
35
  add_compiler_flag '-std=gnu99'
36
36
 
37
- # Gets really noisy when we include the MJIT header, let's omit it
37
+ # Gets really noisy when we include the MJIT header, let's omit it (TODO: Use #pragma GCC diagnostic instead?)
38
38
  add_compiler_flag '-Wno-unused-function'
39
39
 
40
40
  # Allow defining variables at any point in a function
@@ -55,6 +55,9 @@ add_compiler_flag '-Wunused-parameter'
55
55
  # For more details see https://gcc.gnu.org/wiki/Visibility
56
56
  add_compiler_flag '-fvisibility=hidden'
57
57
 
58
+ # Avoid legacy C definitions
59
+ add_compiler_flag '-Wold-style-definition'
60
+
58
61
  # Enable all other compiler warnings
59
62
  add_compiler_flag '-Wall'
60
63
  add_compiler_flag '-Wextra'
@@ -57,7 +57,7 @@ Non-exhaustive list of APIs that cause exceptions to be raised:
57
57
 
58
58
  * `Check_TypedStruct`, `Check_Type`, `ENFORCE_TYPE`
59
59
  * `rb_funcall`
60
- * `rb_thread_call_without_gvl`, `rb_thread_call_without_gvl2`
60
+ * `rb_thread_call_without_gvl`
61
61
  * [Numeric conversion APIs, e.g. `NUM2LONG`, `NUM2INT`, etc.](https://silverhammermba.github.io/emberb/c/?#translation)
62
62
  * Our `char_slice_from_ruby_string` helper
63
63
 
@@ -7,11 +7,12 @@
7
7
  #include <pthread.h>
8
8
  #include <time.h>
9
9
  #include <errno.h>
10
-
11
10
  #include <ruby.h>
11
+
12
12
  #include "helpers.h"
13
13
  #include "private_vm_api_access.h"
14
14
  #include "clock_id.h"
15
+ #include "time_helpers.h"
15
16
 
16
17
  // Validate that our home-cooked pthread_id_for() matches pthread_self() for the current thread
17
18
  void self_test_clock_id(void) {
@@ -68,7 +69,7 @@ thread_cpu_time thread_cpu_time_for(thread_cpu_time_id time_id) {
68
69
  // TODO: Include the error code in some way in the output?
69
70
  if (clock_gettime(time_id.clock_id, &current_cpu) != 0) return error;
70
71
 
71
- return (thread_cpu_time) {.valid = true, .result_ns = current_cpu.tv_nsec + (current_cpu.tv_sec * 1000 * 1000 * 1000)};
72
+ return (thread_cpu_time) {.valid = true, .result_ns = current_cpu.tv_nsec + SECONDS_AS_NS(current_cpu.tv_sec)};
72
73
  }
73
74
 
74
75
  #endif
@@ -1,11 +1,13 @@
1
1
  #include <ruby.h>
2
- #include "helpers.h"
2
+
3
3
  #include "clock_id.h"
4
+ #include "collectors_cpu_and_wall_time.h"
4
5
  #include "collectors_stack.h"
6
+ #include "helpers.h"
5
7
  #include "libdatadog_helpers.h"
6
8
  #include "private_vm_api_access.h"
7
9
  #include "stack_recorder.h"
8
- #include "collectors_cpu_and_wall_time.h"
10
+ #include "time_helpers.h"
9
11
 
10
12
  // Used to periodically sample threads, recording elapsed CPU-time and Wall-time between samples.
11
13
  //
@@ -60,16 +62,16 @@
60
62
 
61
63
  #define INVALID_TIME -1
62
64
  #define THREAD_ID_LIMIT_CHARS 44 // Why 44? "#{2**64} (#{2**64})".size + 1 for \0
63
- #define RAISE_ON_FAILURE true
64
- #define DO_NOT_RAISE_ON_FAILURE false
65
65
  #define IS_WALL_TIME true
66
66
  #define IS_NOT_WALL_TIME false
67
67
  #define MISSING_TRACER_CONTEXT_KEY 0
68
68
 
69
- static ID at_active_trace_id; // id of :@active_trace in Ruby
70
- static ID at_root_span_id; // id of :@root_span in Ruby
71
69
  static ID at_active_span_id; // id of :@active_span in Ruby
70
+ static ID at_active_trace_id; // id of :@active_trace in Ruby
72
71
  static ID at_id_id; // id of :@id in Ruby
72
+ static ID at_resource_id; // id of :@resource in Ruby
73
+ static ID at_root_span_id; // id of :@root_span in Ruby
74
+ static ID at_type_id; // id of :@type in Ruby
73
75
 
74
76
  // Contains state for a single CpuAndWallTime instance
75
77
  struct cpu_and_wall_time_collector_state {
@@ -91,7 +93,7 @@ struct cpu_and_wall_time_collector_state {
91
93
  // is not (just) a stat.
92
94
  unsigned int sample_count;
93
95
 
94
- struct {
96
+ struct stats {
95
97
  // Track how many garbage collection samples we've taken.
96
98
  unsigned int gc_samples;
97
99
  // See cpu_and_wall_time_collector_on_gc_start for details
@@ -126,9 +128,9 @@ struct trace_identifiers {
126
128
 
127
129
  bool valid;
128
130
  ddog_CharSlice local_root_span_id;
129
- ddog_CharSlice span_id;
131
+ uint64_t span_id;
130
132
  char local_root_span_id_buffer[MAXIMUM_LENGTH_64_BIT_IDENTIFIER];
131
- char span_id_buffer[MAXIMUM_LENGTH_64_BIT_IDENTIFIER];
133
+ VALUE trace_endpoint;
132
134
  };
133
135
 
134
136
  static void cpu_and_wall_time_collector_typed_data_mark(void *state_ptr);
@@ -161,10 +163,11 @@ static int remove_if_dead_thread(st_data_t key_thread, st_data_t value_context,
161
163
  static VALUE _native_per_thread_context(VALUE self, VALUE collector_instance);
162
164
  static long update_time_since_previous_sample(long *time_at_previous_sample_ns, long current_time_ns, long gc_start_time_ns, bool is_wall_time);
163
165
  static long cpu_time_now_ns(struct per_thread_context *thread_context);
164
- static long wall_time_now_ns(bool raise_on_failure);
165
166
  static long thread_id_for(VALUE thread);
166
167
  static VALUE _native_stats(VALUE self, VALUE collector_instance);
167
168
  static void trace_identifiers_for(struct cpu_and_wall_time_collector_state *state, VALUE thread, struct trace_identifiers *trace_identifiers_result);
169
+ static bool is_type_web(VALUE root_span_type);
170
+ static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE collector_instance);
168
171
 
169
172
  void collectors_cpu_and_wall_time_init(VALUE profiling_module) {
170
173
  VALUE collectors_module = rb_define_module_under(profiling_module, "Collectors");
@@ -184,6 +187,7 @@ void collectors_cpu_and_wall_time_init(VALUE profiling_module) {
184
187
 
185
188
  rb_define_singleton_method(collectors_cpu_and_wall_time_class, "_native_initialize", _native_initialize, 4);
186
189
  rb_define_singleton_method(collectors_cpu_and_wall_time_class, "_native_inspect", _native_inspect, 1);
190
+ rb_define_singleton_method(collectors_cpu_and_wall_time_class, "_native_reset_after_fork", _native_reset_after_fork, 1);
187
191
  rb_define_singleton_method(testing_module, "_native_sample", _native_sample, 1);
188
192
  rb_define_singleton_method(testing_module, "_native_on_gc_start", _native_on_gc_start, 1);
189
193
  rb_define_singleton_method(testing_module, "_native_on_gc_finish", _native_on_gc_finish, 1);
@@ -192,10 +196,12 @@ void collectors_cpu_and_wall_time_init(VALUE profiling_module) {
192
196
  rb_define_singleton_method(testing_module, "_native_per_thread_context", _native_per_thread_context, 1);
193
197
  rb_define_singleton_method(testing_module, "_native_stats", _native_stats, 1);
194
198
 
195
- at_active_trace_id = rb_intern_const("@active_trace");
196
- at_root_span_id = rb_intern_const("@root_span");
197
199
  at_active_span_id = rb_intern_const("@active_span");
200
+ at_active_trace_id = rb_intern_const("@active_trace");
198
201
  at_id_id = rb_intern_const("@id");
202
+ at_resource_id = rb_intern_const("@resource");
203
+ at_root_span_id = rb_intern_const("@root_span");
204
+ at_type_id = rb_intern_const("@type");
199
205
  }
200
206
 
201
207
  // This structure is used to define a Ruby object that stores a pointer to a struct cpu_and_wall_time_collector_state
@@ -292,7 +298,7 @@ static VALUE _native_initialize(DDTRACE_UNUSED VALUE _self, VALUE collector_inst
292
298
  // This method exists only to enable testing Datadog::Profiling::Collectors::CpuAndWallTime behavior using RSpec.
293
299
  // It SHOULD NOT be used for other purposes.
294
300
  static VALUE _native_sample(DDTRACE_UNUSED VALUE _self, VALUE collector_instance) {
295
- cpu_and_wall_time_collector_sample(collector_instance);
301
+ cpu_and_wall_time_collector_sample(collector_instance, monotonic_wall_time_now_ns(RAISE_ON_FAILURE));
296
302
  return Qtrue;
297
303
  }
298
304
 
@@ -324,12 +330,11 @@ static VALUE _native_sample_after_gc(DDTRACE_UNUSED VALUE self, VALUE collector_
324
330
  // Assumption 3: This function IS NOT called from a signal handler. This function is not async-signal-safe.
325
331
  // Assumption 4: This function IS NOT called in a reentrant way.
326
332
  // Assumption 5: This function is called from the main Ractor (if Ruby has support for Ractors).
327
- VALUE cpu_and_wall_time_collector_sample(VALUE self_instance) {
333
+ void cpu_and_wall_time_collector_sample(VALUE self_instance, long current_monotonic_wall_time_ns) {
328
334
  struct cpu_and_wall_time_collector_state *state;
329
335
  TypedData_Get_Struct(self_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
330
336
 
331
337
  VALUE threads = ddtrace_thread_list();
332
- long current_wall_time_ns = wall_time_now_ns(RAISE_ON_FAILURE);
333
338
 
334
339
  const long thread_count = RARRAY_LEN(threads);
335
340
  for (long i = 0; i < thread_count; i++) {
@@ -346,7 +351,7 @@ VALUE cpu_and_wall_time_collector_sample(VALUE self_instance) {
346
351
  );
347
352
  long wall_time_elapsed_ns = update_time_since_previous_sample(
348
353
  &thread_context->wall_time_at_previous_sample_ns,
349
- current_wall_time_ns,
354
+ current_monotonic_wall_time_ns,
350
355
  thread_context->gc_tracking.wall_time_at_start_ns,
351
356
  IS_WALL_TIME
352
357
  );
@@ -368,12 +373,9 @@ VALUE cpu_and_wall_time_collector_sample(VALUE self_instance) {
368
373
 
369
374
  state->sample_count++;
370
375
 
371
- // TODO: This seems somewhat overkill and inefficient to do often; right now we just doing every few samples
376
+ // TODO: This seems somewhat overkill and inefficient to do often; right now we just do it every few samples
372
377
  // but there's probably a better way to do this if we actually track when threads finish
373
378
  if (state->sample_count % 100 == 0) remove_context_for_dead_threads(state);
374
-
375
- // Return a VALUE to make it easier to call this function from Ruby APIs that expect a return value (such as rb_rescue2)
376
- return Qnil;
377
379
  }
378
380
 
379
381
  // This function gets called when Ruby is about to start running the Garbage Collector on the current thread.
@@ -417,7 +419,7 @@ void cpu_and_wall_time_collector_on_gc_start(VALUE self_instance) {
417
419
  thread_context->gc_tracking.wall_time_at_finish_ns != INVALID_TIME) return;
418
420
 
419
421
  // Here we record the wall-time first and in on_gc_finish we record it second to avoid having wall-time be slightly < cpu-time
420
- thread_context->gc_tracking.wall_time_at_start_ns = wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE);
422
+ thread_context->gc_tracking.wall_time_at_start_ns = monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE);
421
423
  thread_context->gc_tracking.cpu_time_at_start_ns = cpu_time_now_ns(thread_context);
422
424
  }
423
425
 
@@ -453,7 +455,7 @@ void cpu_and_wall_time_collector_on_gc_finish(VALUE self_instance) {
453
455
 
454
456
  // Here we record the wall-time second and in on_gc_start we record it first to avoid having wall-time be slightly < cpu-time
455
457
  thread_context->gc_tracking.cpu_time_at_finish_ns = cpu_time_now_ns(thread_context);
456
- thread_context->gc_tracking.wall_time_at_finish_ns = wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE);
458
+ thread_context->gc_tracking.wall_time_at_finish_ns = monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE);
457
459
  }
458
460
 
459
461
  // This function gets called shortly after Ruby has finished running the Garbage Collector.
@@ -570,12 +572,29 @@ static void trigger_sample_for_thread(
570
572
  };
571
573
  }
572
574
 
573
- struct trace_identifiers trace_identifiers_result = {.valid = false};
575
+ struct trace_identifiers trace_identifiers_result = {.valid = false, .trace_endpoint = Qnil};
574
576
  trace_identifiers_for(state, thread, &trace_identifiers_result);
575
577
 
576
578
  if (trace_identifiers_result.valid) {
577
579
  labels[label_pos++] = (ddog_Label) {.key = DDOG_CHARSLICE_C("local root span id"), .str = trace_identifiers_result.local_root_span_id};
578
- labels[label_pos++] = (ddog_Label) {.key = DDOG_CHARSLICE_C("span id"), .str = trace_identifiers_result.span_id};
580
+ labels[label_pos++] = (ddog_Label) {.key = DDOG_CHARSLICE_C("span id"), .num = trace_identifiers_result.span_id};
581
+
582
+ if (trace_identifiers_result.trace_endpoint != Qnil) {
583
+ // The endpoint gets recorded in a different way because it is mutable in the tracer and can change during a
584
+ // trace.
585
+ //
586
+ // Instead of each sample for the same local_root_span_id getting a potentially-different endpoint,
587
+ // `record_endpoint` (via libdatadog) keeps a list of local_root_span_id values and their most-recently-seen
588
+ // endpoint values, and at serialization time the most-recently-seen endpoint is applied to all relevant samples.
589
+ //
590
+ // This is why the endpoint is not directly added in this function to the labels array, although it will later
591
+ // show up in the array in the output pprof.
592
+ record_endpoint(
593
+ state->recorder_instance,
594
+ trace_identifiers_result.local_root_span_id,
595
+ char_slice_from_ruby_string(trace_identifiers_result.trace_endpoint)
596
+ );
597
+ }
579
598
  }
580
599
 
581
600
  // The number of times `label_pos++` shows up in this function needs to match `max_label_count`. To avoid "oops I
@@ -668,8 +687,6 @@ static VALUE per_thread_context_st_table_as_ruby_hash(struct cpu_and_wall_time_c
668
687
  return result;
669
688
  }
670
689
 
671
- #define VALUE_COUNT(array) (sizeof(array) / sizeof(VALUE))
672
-
673
690
  static int per_thread_context_as_ruby_hash(st_data_t key_thread, st_data_t value_context, st_data_t result_hash) {
674
691
  VALUE thread = (VALUE) key_thread;
675
692
  struct per_thread_context *thread_context = (struct per_thread_context*) value_context;
@@ -698,8 +715,8 @@ static VALUE stats_as_ruby_hash(struct cpu_and_wall_time_collector_state *state)
698
715
  // Update this when modifying state struct (stats inner struct)
699
716
  VALUE stats_as_hash = rb_hash_new();
700
717
  VALUE arguments[] = {
701
- ID2SYM(rb_intern("gc_samples")), /* => */ INT2NUM(state->stats.gc_samples),
702
- ID2SYM(rb_intern("gc_samples_missed_due_to_missing_context")), /* => */ INT2NUM(state->stats.gc_samples_missed_due_to_missing_context),
718
+ ID2SYM(rb_intern("gc_samples")), /* => */ UINT2NUM(state->stats.gc_samples),
719
+ ID2SYM(rb_intern("gc_samples_missed_due_to_missing_context")), /* => */ UINT2NUM(state->stats.gc_samples_missed_due_to_missing_context),
703
720
  };
704
721
  for (long unsigned int i = 0; i < VALUE_COUNT(arguments); i += 2) rb_hash_aset(stats_as_hash, arguments[i], arguments[i+1]);
705
722
  return stats_as_hash;
@@ -769,18 +786,6 @@ static long update_time_since_previous_sample(long *time_at_previous_sample_ns,
769
786
  return elapsed_time_ns;
770
787
  }
771
788
 
772
- // Safety: This function is assumed never to raise exceptions by callers when raise_on_failure == false
773
- static long wall_time_now_ns(bool raise_on_failure) {
774
- struct timespec current_monotonic;
775
-
776
- if (clock_gettime(CLOCK_MONOTONIC, &current_monotonic) != 0) {
777
- if (raise_on_failure) rb_sys_fail("Failed to read CLOCK_MONOTONIC");
778
- else return 0;
779
- }
780
-
781
- return current_monotonic.tv_nsec + (current_monotonic.tv_sec * 1000 * 1000 * 1000);
782
- }
783
-
784
789
  // Safety: This function is assumed never to raise exceptions by callers
785
790
  static long cpu_time_now_ns(struct per_thread_context *thread_context) {
786
791
  thread_cpu_time cpu_time = thread_cpu_time_for(thread_context->thread_cpu_time_id);
@@ -847,19 +852,48 @@ static void trace_identifiers_for(struct cpu_and_wall_time_collector_state *stat
847
852
  if (numeric_local_root_span_id == Qnil || numeric_span_id == Qnil) return;
848
853
 
849
854
  unsigned long long local_root_span_id = NUM2ULL(numeric_local_root_span_id);
850
- unsigned long long span_id = NUM2ULL(numeric_span_id);
851
-
852
855
  snprintf(trace_identifiers_result->local_root_span_id_buffer, MAXIMUM_LENGTH_64_BIT_IDENTIFIER, "%llu", local_root_span_id);
853
- snprintf(trace_identifiers_result->span_id_buffer, MAXIMUM_LENGTH_64_BIT_IDENTIFIER, "%llu", span_id);
854
856
 
855
857
  trace_identifiers_result->local_root_span_id = (ddog_CharSlice) {
856
858
  .ptr = trace_identifiers_result->local_root_span_id_buffer,
857
859
  .len = strlen(trace_identifiers_result->local_root_span_id_buffer)
858
860
  };
859
- trace_identifiers_result->span_id = (ddog_CharSlice) {
860
- .ptr = trace_identifiers_result->span_id_buffer,
861
- .len = strlen(trace_identifiers_result->span_id_buffer)
862
- };
861
+ trace_identifiers_result->span_id = NUM2ULL(numeric_span_id);
863
862
 
864
863
  trace_identifiers_result->valid = true;
864
+
865
+ VALUE root_span_type = rb_ivar_get(root_span, at_type_id /* @type */);
866
+ if (root_span_type == Qnil || !is_type_web(root_span_type)) return;
867
+
868
+ VALUE trace_resource = rb_ivar_get(active_trace, at_resource_id /* @resource */);
869
+ if (RB_TYPE_P(trace_resource, T_STRING)) {
870
+ trace_identifiers_result->trace_endpoint = trace_resource;
871
+ } else if (trace_resource == Qnil) {
872
+ // Fall back to resource from span, if any
873
+ trace_identifiers_result->trace_endpoint = rb_ivar_get(root_span, at_resource_id /* @resource */);
874
+ }
875
+ }
876
+
877
+ static bool is_type_web(VALUE root_span_type) {
878
+ ENFORCE_TYPE(root_span_type, T_STRING);
879
+
880
+ return RSTRING_LEN(root_span_type) == strlen("web") &&
881
+ (memcmp("web", StringValuePtr(root_span_type), strlen("web")) == 0);
882
+ }
883
+
884
+ // After the Ruby VM forks, this method gets called in the child process to clean up any leftover state from the parent.
885
+ //
886
+ // Assumption: This method gets called BEFORE restarting profiling -- e.g. there are no components attempting to
887
+ // trigger samples at the same time.
888
+ static VALUE _native_reset_after_fork(DDTRACE_UNUSED VALUE self, VALUE collector_instance) {
889
+ struct cpu_and_wall_time_collector_state *state;
890
+ TypedData_Get_Struct(collector_instance, struct cpu_and_wall_time_collector_state, &cpu_and_wall_time_collector_typed_data, state);
891
+
892
+ st_clear(state->hash_map_per_thread_context);
893
+
894
+ state->stats = (struct stats) {}; // Resets all stats back to zero
895
+
896
+ rb_funcall(state->recorder_instance, rb_intern("reset_after_fork"), 0);
897
+
898
+ return Qtrue;
865
899
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  #include <ruby.h>
4
4
 
5
- VALUE cpu_and_wall_time_collector_sample(VALUE self_instance);
5
+ void cpu_and_wall_time_collector_sample(VALUE self_instance, long current_monotonic_wall_time_ns);
6
6
  VALUE cpu_and_wall_time_collector_sample_after_gc(VALUE self_instance);
7
7
  void cpu_and_wall_time_collector_on_gc_start(VALUE self_instance);
8
8
  void cpu_and_wall_time_collector_on_gc_finish(VALUE self_instance);