ddtrace 1.14.0 → 1.16.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (282) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +165 -2
  3. data/ext/ddtrace_profiling_native_extension/NativeExtensionDesign.md +3 -5
  4. data/ext/ddtrace_profiling_native_extension/clock_id.h +0 -3
  5. data/ext/ddtrace_profiling_native_extension/clock_id_from_pthread.c +0 -22
  6. data/ext/ddtrace_profiling_native_extension/clock_id_noop.c +0 -1
  7. data/ext/ddtrace_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +41 -6
  8. data/ext/ddtrace_profiling_native_extension/collectors_idle_sampling_helper.c +3 -0
  9. data/ext/ddtrace_profiling_native_extension/collectors_stack.c +76 -24
  10. data/ext/ddtrace_profiling_native_extension/collectors_stack.h +1 -1
  11. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.c +207 -32
  12. data/ext/ddtrace_profiling_native_extension/collectors_thread_context.h +1 -1
  13. data/ext/ddtrace_profiling_native_extension/extconf.rb +8 -2
  14. data/ext/ddtrace_profiling_native_extension/http_transport.c +26 -10
  15. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.c +42 -0
  16. data/ext/ddtrace_profiling_native_extension/libdatadog_helpers.h +6 -0
  17. data/ext/ddtrace_profiling_native_extension/native_extension_helpers.rb +1 -16
  18. data/ext/ddtrace_profiling_native_extension/pid_controller.c +57 -0
  19. data/ext/ddtrace_profiling_native_extension/pid_controller.h +45 -0
  20. data/ext/ddtrace_profiling_native_extension/private_vm_api_access.c +17 -12
  21. data/ext/ddtrace_profiling_native_extension/profiling.c +0 -2
  22. data/ext/ddtrace_profiling_native_extension/stack_recorder.c +74 -37
  23. data/ext/ddtrace_profiling_native_extension/stack_recorder.h +13 -3
  24. data/lib/datadog/appsec/assets/waf_rules/processors.json +92 -0
  25. data/lib/datadog/appsec/assets/waf_rules/recommended.json +698 -75
  26. data/lib/datadog/appsec/assets/waf_rules/scanners.json +114 -0
  27. data/lib/datadog/appsec/assets/waf_rules/strict.json +98 -8
  28. data/lib/datadog/appsec/assets.rb +8 -0
  29. data/lib/datadog/appsec/component.rb +9 -2
  30. data/lib/datadog/appsec/configuration/settings.rb +61 -2
  31. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +6 -2
  32. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +8 -6
  33. data/lib/datadog/appsec/contrib/rack/reactive/request.rb +2 -7
  34. data/lib/datadog/appsec/contrib/rack/reactive/request_body.rb +2 -5
  35. data/lib/datadog/appsec/contrib/rack/reactive/response.rb +2 -5
  36. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +3 -2
  37. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +24 -10
  38. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +3 -2
  39. data/lib/datadog/appsec/contrib/rails/patcher.rb +9 -3
  40. data/lib/datadog/appsec/contrib/rails/reactive/action.rb +2 -5
  41. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +6 -4
  42. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +13 -7
  43. data/lib/datadog/appsec/contrib/sinatra/reactive/routed.rb +2 -5
  44. data/lib/datadog/appsec/event.rb +106 -50
  45. data/lib/datadog/appsec/monitor/gateway/watcher.rb +3 -3
  46. data/lib/datadog/appsec/monitor/reactive/set_user.rb +2 -5
  47. data/lib/datadog/appsec/processor/actions.rb +49 -0
  48. data/lib/datadog/appsec/processor/rule_merger.rb +22 -2
  49. data/lib/datadog/appsec/processor.rb +34 -6
  50. data/lib/datadog/appsec/remote.rb +4 -1
  51. data/lib/datadog/appsec/response.rb +82 -4
  52. data/lib/datadog/appsec/sample_rate.rb +21 -0
  53. data/lib/datadog/appsec.rb +2 -2
  54. data/lib/datadog/core/configuration/agent_settings_resolver.rb +29 -24
  55. data/lib/datadog/core/configuration/base.rb +1 -11
  56. data/lib/datadog/core/configuration/components.rb +7 -2
  57. data/lib/datadog/core/configuration/ext.rb +21 -0
  58. data/lib/datadog/core/configuration/option.rb +2 -4
  59. data/lib/datadog/core/configuration/option_definition.rb +17 -41
  60. data/lib/datadog/core/configuration/options.rb +5 -5
  61. data/lib/datadog/core/configuration/settings.rb +47 -45
  62. data/lib/datadog/core/environment/execution.rb +47 -9
  63. data/lib/datadog/core/environment/variable_helpers.rb +0 -69
  64. data/lib/datadog/core/error.rb +1 -0
  65. data/lib/datadog/core/git/ext.rb +2 -0
  66. data/lib/datadog/core/remote/client/capabilities.rb +1 -1
  67. data/lib/datadog/core/remote/component.rb +2 -2
  68. data/lib/datadog/core/remote/negotiation.rb +2 -2
  69. data/lib/datadog/core/remote/transport/config.rb +60 -0
  70. data/lib/datadog/core/remote/transport/http/api/instance.rb +39 -0
  71. data/lib/datadog/core/remote/transport/http/api/spec.rb +21 -0
  72. data/lib/datadog/core/remote/transport/http/api.rb +58 -0
  73. data/lib/datadog/core/remote/transport/http/builder.rb +219 -0
  74. data/lib/datadog/core/remote/transport/http/client.rb +48 -0
  75. data/lib/datadog/core/remote/transport/http/config.rb +280 -0
  76. data/lib/datadog/core/remote/transport/http/negotiation.rb +146 -0
  77. data/lib/datadog/core/remote/transport/http.rb +179 -0
  78. data/lib/datadog/core/{transport → remote/transport}/negotiation.rb +25 -23
  79. data/lib/datadog/core/remote/worker.rb +3 -1
  80. data/lib/datadog/core/telemetry/collector.rb +3 -2
  81. data/lib/datadog/core/telemetry/http/transport.rb +2 -1
  82. data/lib/datadog/core/transport/ext.rb +47 -0
  83. data/lib/datadog/core/transport/http/adapters/net.rb +168 -0
  84. data/lib/datadog/core/transport/http/adapters/registry.rb +29 -0
  85. data/lib/datadog/core/transport/http/adapters/test.rb +89 -0
  86. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +83 -0
  87. data/lib/datadog/core/transport/http/api/endpoint.rb +31 -0
  88. data/lib/datadog/core/transport/http/api/fallbacks.rb +26 -0
  89. data/lib/datadog/core/transport/http/api/map.rb +18 -0
  90. data/lib/datadog/core/transport/http/env.rb +62 -0
  91. data/lib/datadog/core/transport/http/response.rb +60 -0
  92. data/lib/datadog/core/transport/parcel.rb +22 -0
  93. data/lib/datadog/core/transport/request.rb +17 -0
  94. data/lib/datadog/core/transport/response.rb +64 -0
  95. data/lib/datadog/core/workers/polling.rb +2 -2
  96. data/lib/datadog/opentelemetry/api/context.rb +10 -3
  97. data/lib/datadog/opentelemetry/sdk/propagator.rb +2 -1
  98. data/lib/datadog/opentelemetry/sdk/span_processor.rb +14 -2
  99. data/lib/datadog/opentelemetry/sdk/trace/span.rb +68 -0
  100. data/lib/datadog/opentelemetry/trace.rb +58 -0
  101. data/lib/datadog/opentelemetry.rb +1 -0
  102. data/lib/datadog/opentracer.rb +9 -0
  103. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +14 -19
  104. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  105. data/lib/datadog/profiling/collectors/thread_context.rb +9 -1
  106. data/lib/datadog/profiling/component.rb +24 -99
  107. data/lib/datadog/profiling/ext.rb +0 -12
  108. data/lib/datadog/profiling/flush.rb +0 -3
  109. data/lib/datadog/profiling/http_transport.rb +6 -3
  110. data/lib/datadog/profiling/native_extension.rb +0 -21
  111. data/lib/datadog/profiling/profiler.rb +36 -13
  112. data/lib/datadog/profiling/scheduler.rb +16 -9
  113. data/lib/datadog/profiling.rb +8 -81
  114. data/lib/datadog/tracing/component.rb +10 -4
  115. data/lib/datadog/tracing/configuration/agent_settings_resolver.rb +13 -0
  116. data/lib/datadog/tracing/configuration/ext.rb +4 -2
  117. data/lib/datadog/tracing/configuration/settings.rb +14 -7
  118. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +1 -1
  119. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +1 -1
  120. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +4 -0
  121. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +106 -197
  122. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +3 -0
  123. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +7 -0
  124. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +14 -14
  125. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +3 -10
  126. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +2 -1
  127. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +8 -1
  128. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +22 -0
  129. data/lib/datadog/tracing/contrib/configuration/settings.rb +1 -1
  130. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +6 -0
  131. data/lib/datadog/tracing/contrib/dalli/ext.rb +7 -0
  132. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +9 -2
  133. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +1 -1
  134. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +5 -0
  135. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +5 -0
  136. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +8 -0
  137. data/lib/datadog/tracing/contrib/excon/middleware.rb +5 -0
  138. data/lib/datadog/tracing/contrib/ext.rb +3 -0
  139. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +1 -1
  140. data/lib/datadog/tracing/contrib/faraday/middleware.rb +5 -0
  141. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +21 -1
  142. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +11 -1
  143. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +18 -0
  144. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +0 -4
  145. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +3 -3
  146. data/lib/datadog/tracing/contrib/http/instrumentation.rb +5 -0
  147. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -0
  148. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +5 -0
  149. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +7 -0
  150. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +13 -3
  151. data/lib/datadog/tracing/contrib/opensearch/integration.rb +2 -2
  152. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +7 -0
  153. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +5 -0
  154. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +5 -0
  155. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +1 -1
  156. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +1 -1
  157. data/lib/datadog/tracing/contrib/racecar/event.rb +5 -0
  158. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +14 -4
  159. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +4 -4
  160. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +1 -1
  161. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +1 -1
  162. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +3 -38
  163. data/lib/datadog/tracing/contrib/redis/tags.rb +7 -2
  164. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +46 -33
  165. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +1 -1
  166. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -0
  167. data/lib/datadog/tracing/contrib/sequel/utils.rb +5 -0
  168. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +1 -1
  169. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +1 -1
  170. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  171. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +2 -2
  172. data/lib/datadog/tracing/diagnostics/environment_logger.rb +6 -0
  173. data/lib/datadog/tracing/distributed/propagation.rb +13 -33
  174. data/lib/datadog/tracing/metadata/tagging.rb +3 -3
  175. data/lib/datadog/tracing/sync_writer.rb +3 -3
  176. data/lib/datadog/tracing/tracer.rb +2 -0
  177. data/lib/datadog/{core → tracing}/transport/http/api/instance.rb +1 -1
  178. data/lib/datadog/{core → tracing}/transport/http/api/spec.rb +1 -1
  179. data/lib/datadog/tracing/transport/http/api.rb +43 -0
  180. data/lib/datadog/{core → tracing}/transport/http/builder.rb +13 -68
  181. data/lib/datadog/tracing/transport/http/client.rb +57 -0
  182. data/lib/datadog/tracing/transport/http/statistics.rb +47 -0
  183. data/lib/datadog/tracing/transport/http/traces.rb +152 -0
  184. data/lib/datadog/tracing/transport/http.rb +124 -0
  185. data/lib/datadog/tracing/transport/io/client.rb +89 -0
  186. data/lib/datadog/tracing/transport/io/response.rb +27 -0
  187. data/lib/datadog/tracing/transport/io/traces.rb +101 -0
  188. data/lib/datadog/tracing/transport/io.rb +30 -0
  189. data/lib/datadog/tracing/transport/serializable_trace.rb +126 -0
  190. data/lib/datadog/tracing/transport/statistics.rb +77 -0
  191. data/lib/datadog/tracing/transport/trace_formatter.rb +209 -0
  192. data/lib/datadog/tracing/transport/traces.rb +224 -0
  193. data/lib/datadog/tracing/workers/trace_writer.rb +5 -3
  194. data/lib/datadog/tracing/workers.rb +3 -2
  195. data/lib/datadog/tracing/writer.rb +5 -2
  196. data/lib/ddtrace/transport/ext.rb +17 -15
  197. data/lib/ddtrace/version.rb +2 -2
  198. data/lib/ddtrace.rb +1 -1
  199. metadata +73 -96
  200. data/lib/datadog/ci/configuration/components.rb +0 -32
  201. data/lib/datadog/ci/configuration/settings.rb +0 -51
  202. data/lib/datadog/ci/contrib/cucumber/configuration/settings.rb +0 -35
  203. data/lib/datadog/ci/contrib/cucumber/ext.rb +0 -22
  204. data/lib/datadog/ci/contrib/cucumber/formatter.rb +0 -94
  205. data/lib/datadog/ci/contrib/cucumber/instrumentation.rb +0 -28
  206. data/lib/datadog/ci/contrib/cucumber/integration.rb +0 -47
  207. data/lib/datadog/ci/contrib/cucumber/patcher.rb +0 -27
  208. data/lib/datadog/ci/contrib/minitest/configuration/settings.rb +0 -35
  209. data/lib/datadog/ci/contrib/minitest/ext.rb +0 -21
  210. data/lib/datadog/ci/contrib/minitest/integration.rb +0 -49
  211. data/lib/datadog/ci/contrib/minitest/patcher.rb +0 -27
  212. data/lib/datadog/ci/contrib/minitest/test_helper.rb +0 -68
  213. data/lib/datadog/ci/contrib/rspec/configuration/settings.rb +0 -35
  214. data/lib/datadog/ci/contrib/rspec/example.rb +0 -68
  215. data/lib/datadog/ci/contrib/rspec/ext.rb +0 -21
  216. data/lib/datadog/ci/contrib/rspec/integration.rb +0 -48
  217. data/lib/datadog/ci/contrib/rspec/patcher.rb +0 -27
  218. data/lib/datadog/ci/ext/app_types.rb +0 -9
  219. data/lib/datadog/ci/ext/environment.rb +0 -575
  220. data/lib/datadog/ci/ext/settings.rb +0 -10
  221. data/lib/datadog/ci/ext/test.rb +0 -35
  222. data/lib/datadog/ci/extensions.rb +0 -19
  223. data/lib/datadog/ci/flush.rb +0 -38
  224. data/lib/datadog/ci/test.rb +0 -81
  225. data/lib/datadog/ci.rb +0 -21
  226. data/lib/datadog/core/configuration/dependency_resolver.rb +0 -28
  227. data/lib/datadog/core/configuration/option_definition_set.rb +0 -22
  228. data/lib/datadog/core/configuration/option_set.rb +0 -10
  229. data/lib/datadog/core/transport/config.rb +0 -58
  230. data/lib/datadog/core/transport/http/api.rb +0 -57
  231. data/lib/datadog/core/transport/http/client.rb +0 -45
  232. data/lib/datadog/core/transport/http/config.rb +0 -278
  233. data/lib/datadog/core/transport/http/negotiation.rb +0 -144
  234. data/lib/datadog/core/transport/http.rb +0 -169
  235. data/lib/datadog/core/utils/object_set.rb +0 -43
  236. data/lib/datadog/core/utils/string_table.rb +0 -47
  237. data/lib/datadog/profiling/backtrace_location.rb +0 -34
  238. data/lib/datadog/profiling/buffer.rb +0 -43
  239. data/lib/datadog/profiling/collectors/old_stack.rb +0 -301
  240. data/lib/datadog/profiling/encoding/profile.rb +0 -41
  241. data/lib/datadog/profiling/event.rb +0 -15
  242. data/lib/datadog/profiling/events/stack.rb +0 -82
  243. data/lib/datadog/profiling/old_recorder.rb +0 -107
  244. data/lib/datadog/profiling/pprof/builder.rb +0 -125
  245. data/lib/datadog/profiling/pprof/converter.rb +0 -102
  246. data/lib/datadog/profiling/pprof/message_set.rb +0 -16
  247. data/lib/datadog/profiling/pprof/payload.rb +0 -20
  248. data/lib/datadog/profiling/pprof/pprof.proto +0 -212
  249. data/lib/datadog/profiling/pprof/pprof_pb.rb +0 -81
  250. data/lib/datadog/profiling/pprof/stack_sample.rb +0 -139
  251. data/lib/datadog/profiling/pprof/string_table.rb +0 -12
  252. data/lib/datadog/profiling/pprof/template.rb +0 -118
  253. data/lib/datadog/profiling/trace_identifiers/ddtrace.rb +0 -43
  254. data/lib/datadog/profiling/trace_identifiers/helper.rb +0 -45
  255. data/lib/ddtrace/transport/http/adapters/net.rb +0 -168
  256. data/lib/ddtrace/transport/http/adapters/registry.rb +0 -27
  257. data/lib/ddtrace/transport/http/adapters/test.rb +0 -85
  258. data/lib/ddtrace/transport/http/adapters/unix_socket.rb +0 -77
  259. data/lib/ddtrace/transport/http/api/endpoint.rb +0 -29
  260. data/lib/ddtrace/transport/http/api/fallbacks.rb +0 -24
  261. data/lib/ddtrace/transport/http/api/instance.rb +0 -35
  262. data/lib/ddtrace/transport/http/api/map.rb +0 -16
  263. data/lib/ddtrace/transport/http/api/spec.rb +0 -17
  264. data/lib/ddtrace/transport/http/api.rb +0 -39
  265. data/lib/ddtrace/transport/http/builder.rb +0 -176
  266. data/lib/ddtrace/transport/http/client.rb +0 -52
  267. data/lib/ddtrace/transport/http/env.rb +0 -58
  268. data/lib/ddtrace/transport/http/response.rb +0 -58
  269. data/lib/ddtrace/transport/http/statistics.rb +0 -43
  270. data/lib/ddtrace/transport/http/traces.rb +0 -144
  271. data/lib/ddtrace/transport/http.rb +0 -117
  272. data/lib/ddtrace/transport/io/client.rb +0 -85
  273. data/lib/ddtrace/transport/io/response.rb +0 -25
  274. data/lib/ddtrace/transport/io/traces.rb +0 -99
  275. data/lib/ddtrace/transport/io.rb +0 -28
  276. data/lib/ddtrace/transport/parcel.rb +0 -20
  277. data/lib/ddtrace/transport/request.rb +0 -15
  278. data/lib/ddtrace/transport/response.rb +0 -60
  279. data/lib/ddtrace/transport/serializable_trace.rb +0 -122
  280. data/lib/ddtrace/transport/statistics.rb +0 -75
  281. data/lib/ddtrace/transport/trace_formatter.rb +0 -207
  282. data/lib/ddtrace/transport/traces.rb +0 -216
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ae7238650b45da9d8bf8f5834af2a29153081e798c2c8733c9bffb8768b6c430
4
- data.tar.gz: b9bc8f36d37b91d18754892bd8dbc92cd515b9e38caf8561e23b665f14ee5e9e
3
+ metadata.gz: 31833e75aea54c0952a8c9bce646f0e75e304a3d9124f372c022a6bb5c700ea6
4
+ data.tar.gz: 6c487891f51fb0ef0c196fab1135f20d99417db62d82ee985cac621fb584f00a
5
5
  SHA512:
6
- metadata.gz: 4b4cdffa9d4ee39e6763be4a87dbdf3e351fd29915d4eaea45dc9c800543c65c8eb21375138422280cfed5715d8f23e95e58190752af6631c14453d39b29b263
7
- data.tar.gz: fbc970e48e5e5038775368618e672ab7b2405cd6ea9b899136b34e9ae776f26a92436087fb0810ef7d66574c2f694cdea03197cf980b08dc35a9defcf4c3dc74
6
+ metadata.gz: d410408162b5ac03f8f80b8a18f5bd1adbcdd70625a45d288bd2f83a38b3b4668514d70ffd57c829d2ecfc9d7c2ac147ed831ccc7f45843ab51676fe501af2be
7
+ data.tar.gz: a76c4aef579a961e0d588577d42ea23ee2ab28f08fa75d29de2fd422e3e8a5c3543e3ea63ae260ddee054c0b4ffa38c469ece4307abac92d36c08d32a971b3f2
data/CHANGELOG.md CHANGED
@@ -2,6 +2,105 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [1.16.2] - 2023-11-10
6
+
7
+ This release reverts a change to appsec response body parsing that was introduced in [1.16.0 ](https://github.com/DataDog/dd-trace-rb/releases/tag/v1.16.0) that may cause memory leaks.
8
+
9
+ ### Fixed
10
+ * Appsec: [Revert parse response body fix introduced in 1.16.0](https://github.com/DataDog/dd-trace-rb/pull/3153) ([#3252][])
11
+
12
+ ## [1.16.1] - 2023-11-08
13
+
14
+ ### Fixed
15
+
16
+ * Tracing: Fix `concurrent-ruby` future propagation without `active_trace` ([#3242][])
17
+ * Tracing: Fix host injection error handling ([#3240][])
18
+
19
+ ## [1.16.0] - 2023-11-03
20
+
21
+ **This release includes a security change for the Tracing Redis integration:**
22
+
23
+ Currently, the Datadog Agent removes command arguments from the resource name. However there are cases, like Redis compressed keys, where this obfuscation cannot correctly remove command arguments. To safeguard that situation, the resource name set by the tracer will only be the command (e.g. `SET`) with no arguments. To retain the previous behavior and keep arguments in the span resource, with the potential risk of some command arguments not being fully obfuscated, set ``DD_REDIS_COMMAND_ARGS=true`` or set the option `c.instrument :redis, command_args: true`.
24
+
25
+ ### Added
26
+
27
+ * Tracing: Propagate trace through `Concurrent::Promises.future` ([#1522][])
28
+ * Core: Name `Datadog::Core::Remote::Worker` thread ([#3207][])
29
+
30
+ ### Changed
31
+
32
+ * Tracing: Redis - Omit command arguments from span.resource by default ([#3235][])
33
+ * Ci-app: Bump `datadog-ci` dependency from 0.2.0 to 0.3.0 ([#3223][])
34
+
35
+ ### Fixed
36
+
37
+ * Appsec: ASM parse response body ([#3153][])
38
+ * Appsec: ASM make sure to append content type and length information ([#3204][])
39
+ * Appsec: Make sure function that checks content-type header value accepts nil content-type header value ([#3234][])
40
+ * Profiling: Shut down profiler if any components failed ([#3197][])
41
+ * Tracing: Fix `ActiveSupport` instrumentation of custom cache stores ([#3206][])
42
+
43
+ ## [1.15.0] - 2023-10-09
44
+
45
+ ### Highlights
46
+
47
+ * Timeline view for Profiler beta
48
+ * Configure AppSec blocking responses via configuration or Remote Configuration
49
+ * CI visibility to configure with agentless mode
50
+
51
+ For more details, check the [release notes](https://github.com/DataDog/dd-trace-rb/releases/tag/v1.15.0)
52
+
53
+ ### Added
54
+
55
+ * Enable allocation counting feature by default for some Ruby 3 versions ([#3176][])
56
+ * Detect `WebMock` `Cucumber` and `Rails.env` to disable telemetry and remote configuration for development environment ([#3065][], [#3062][], [#3145][])
57
+ * Profiling: Import java-profiler PID controller and port it to C ([#3190][])
58
+ * Profiling: Record allocation type when sampling objects ([#3096][])
59
+ * Profiling: Include `ruby vm type` in profiler allocation samples ([#3074][])
60
+ * Tracing: Support `Rack` 3 ([#3132][])
61
+ * Tracing: Support `Opensearch` 3 ([#3189][])
62
+ * Tracing: `grpc` adds `client_error_handler` option ([#3095][])
63
+ * Tracing: Add `async` option for `test_mode` configuration ([#3158][])
64
+ * Tracing: Implements `_dd.base_service` tag ([#3018][])
65
+ * Appsec: Allow blocking response template configuration via ENV variables ([#2975][])
66
+ * Appsec: ASM API security. Schema extraction ([#3131][], [#3166][], [#3177][])
67
+ * Appsec: Enable configuring blocking response via Remote Configuration ([#3099][])
68
+ * Ci-app: Validate git tags ([#3100][])
69
+ * Ci-app: Add agentless mode ([#3186][])
70
+
71
+ ### Changed
72
+
73
+ * Appsec: Skip passing waf addresses when the value is empty ([#3188][])
74
+ * Profiling: Restore support for Ruby 3.3 ([#3167][])
75
+ * Profiling: Add approximate thread state categorization for timeline ([#3162][])
76
+ * Profiling: Wire up allocation sampling into `CpuAndWallTimeWorker` ([#3103][])
77
+ * Tracing: `dalli` disable memcached command tag by default ([#3171][])
78
+ * Tracing: Use first valid extracted style for distributed tracing ([#2879][])
79
+ * Tracing: Rename configuration option `on_set` to `after_set` ([#3107][])
80
+ * Tracing: Rename `experimental_default_proc` to `default_proc` ([#3091][])
81
+ * Tracing: Use `peer.service` for sql comment propagation ([#3127][])
82
+ * Ci-app: Fix `Datadog::CI::Environment` to support the new CI specs ([#3080][])
83
+ * Bump `datadog-ci` dependency to 0.2 ([#3186][])
84
+ * Bump `debase-ruby_core_source` dependency to 3.2.2 ([#3163][])
85
+ * Upgrade `libdatadog` 5 ([#3169][], [#3104][])
86
+ * Upgrade `libddwaf-rb` 1.11.0 ([#3087][])
87
+ * Update AppSec rules to 1.8.0 ([#3140][], [#3139][])
88
+
89
+ ### Fixed
90
+
91
+ * Profiling: Add workaround for incorrect invoke location when logging gem is in use ([#3183][])
92
+ * Profiling: Fix missing endpoint profiling when `request_queuing` is enabled in `rack` instrumentation ([#3109][])
93
+ * Appsec: Span tags reporting the number of WAF failed loaded rules ([#3106][])
94
+ * Tracing: Fix tagging with empty data ([#3102][])
95
+ * Tracing: Fix `rails.cache.backend` span tag with multiple stores ([#3060][])
96
+
97
+ ### Removed
98
+
99
+ * Profiling: Remove legacy profiler codepath ([#3172][])
100
+ * Ci-app: Remove CI module and add a dependency on [`datadog-ci` gem](https://github.com/DataDog/datadog-ci-rb) ([#3128][])
101
+ * Tracing: Remove `depends_on` option from configuration DSL ([#3085][])
102
+ * Tracing: Remove `delegate_to` option from configuration DSL ([#3086][])
103
+
5
104
  ## [1.14.0] - 2023-08-24
6
105
 
7
106
  ### Added
@@ -2534,7 +2633,12 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
2534
2633
 
2535
2634
  Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
2536
2635
 
2537
- [Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.14.0...master
2636
+
2637
+ [Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v1.16.2...master
2638
+ [1.16.2]: https://github.com/DataDog/dd-trace-rb/compare/v1.16.1...v1.16.2
2639
+ [1.16.1]: https://github.com/DataDog/dd-trace-rb/compare/v1.16.0...v1.16.1
2640
+ [1.16.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.15.0...v1.16.0
2641
+ [1.15.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.14.0...v1.15.0
2538
2642
  [1.14.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.13.1...1.14.0
2539
2643
  [1.13.1]: https://github.com/DataDog/dd-trace-rb/compare/v1.13.0...1.13.1
2540
2644
  [1.13.0]: https://github.com/DataDog/dd-trace-rb/compare/v1.12.1...v1.13.0
@@ -3271,6 +3375,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
3271
3375
  [#1509]: https://github.com/DataDog/dd-trace-rb/issues/1509
3272
3376
  [#1510]: https://github.com/DataDog/dd-trace-rb/issues/1510
3273
3377
  [#1511]: https://github.com/DataDog/dd-trace-rb/issues/1511
3378
+ [#1522]: https://github.com/DataDog/dd-trace-rb/issues/1522
3274
3379
  [#1523]: https://github.com/DataDog/dd-trace-rb/issues/1523
3275
3380
  [#1524]: https://github.com/DataDog/dd-trace-rb/issues/1524
3276
3381
  [#1529]: https://github.com/DataDog/dd-trace-rb/issues/1529
@@ -3624,6 +3729,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
3624
3729
  [#2874]: https://github.com/DataDog/dd-trace-rb/issues/2874
3625
3730
  [#2875]: https://github.com/DataDog/dd-trace-rb/issues/2875
3626
3731
  [#2877]: https://github.com/DataDog/dd-trace-rb/issues/2877
3732
+ [#2879]: https://github.com/DataDog/dd-trace-rb/issues/2879
3627
3733
  [#2882]: https://github.com/DataDog/dd-trace-rb/issues/2882
3628
3734
  [#2883]: https://github.com/DataDog/dd-trace-rb/issues/2883
3629
3735
  [#2890]: https://github.com/DataDog/dd-trace-rb/issues/2890
@@ -3659,6 +3765,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
3659
3765
  [#2972]: https://github.com/DataDog/dd-trace-rb/issues/2972
3660
3766
  [#2973]: https://github.com/DataDog/dd-trace-rb/issues/2973
3661
3767
  [#2974]: https://github.com/DataDog/dd-trace-rb/issues/2974
3768
+ [#2975]: https://github.com/DataDog/dd-trace-rb/issues/2975
3662
3769
  [#2977]: https://github.com/DataDog/dd-trace-rb/issues/2977
3663
3770
  [#2978]: https://github.com/DataDog/dd-trace-rb/issues/2978
3664
3771
  [#2982]: https://github.com/DataDog/dd-trace-rb/issues/2982
@@ -3671,6 +3778,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
3671
3778
  [#3005]: https://github.com/DataDog/dd-trace-rb/issues/3005
3672
3779
  [#3007]: https://github.com/DataDog/dd-trace-rb/issues/3007
3673
3780
  [#3011]: https://github.com/DataDog/dd-trace-rb/issues/3011
3781
+ [#3018]: https://github.com/DataDog/dd-trace-rb/issues/3018
3674
3782
  [#3019]: https://github.com/DataDog/dd-trace-rb/issues/3019
3675
3783
  [#3020]: https://github.com/DataDog/dd-trace-rb/issues/3020
3676
3784
  [#3022]: https://github.com/DataDog/dd-trace-rb/issues/3022
@@ -3685,8 +3793,63 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
3685
3793
  [#3054]: https://github.com/DataDog/dd-trace-rb/issues/3054
3686
3794
  [#3056]: https://github.com/DataDog/dd-trace-rb/issues/3056
3687
3795
  [#3057]: https://github.com/DataDog/dd-trace-rb/issues/3057
3796
+ [#3060]: https://github.com/DataDog/dd-trace-rb/issues/3060
3688
3797
  [#3061]: https://github.com/DataDog/dd-trace-rb/issues/3061
3798
+ [#3062]: https://github.com/DataDog/dd-trace-rb/issues/3062
3799
+ [#3065]: https://github.com/DataDog/dd-trace-rb/issues/3065
3689
3800
  [#3070]: https://github.com/DataDog/dd-trace-rb/issues/3070
3801
+ [#3074]: https://github.com/DataDog/dd-trace-rb/issues/3074
3802
+ [#3080]: https://github.com/DataDog/dd-trace-rb/issues/3080
3803
+ [#3085]: https://github.com/DataDog/dd-trace-rb/issues/3085
3804
+ [#3086]: https://github.com/DataDog/dd-trace-rb/issues/3086
3805
+ [#3087]: https://github.com/DataDog/dd-trace-rb/issues/3087
3806
+ [#3091]: https://github.com/DataDog/dd-trace-rb/issues/3091
3807
+ [#3095]: https://github.com/DataDog/dd-trace-rb/issues/3095
3808
+ [#3096]: https://github.com/DataDog/dd-trace-rb/issues/3096
3809
+ [#3099]: https://github.com/DataDog/dd-trace-rb/issues/3099
3810
+ [#3100]: https://github.com/DataDog/dd-trace-rb/issues/3100
3811
+ [#3102]: https://github.com/DataDog/dd-trace-rb/issues/3102
3812
+ [#3103]: https://github.com/DataDog/dd-trace-rb/issues/3103
3813
+ [#3104]: https://github.com/DataDog/dd-trace-rb/issues/3104
3814
+ [#3106]: https://github.com/DataDog/dd-trace-rb/issues/3106
3815
+ [#3107]: https://github.com/DataDog/dd-trace-rb/issues/3107
3816
+ [#3109]: https://github.com/DataDog/dd-trace-rb/issues/3109
3817
+ [#3127]: https://github.com/DataDog/dd-trace-rb/issues/3127
3818
+ [#3128]: https://github.com/DataDog/dd-trace-rb/issues/3128
3819
+ [#3131]: https://github.com/DataDog/dd-trace-rb/issues/3131
3820
+ [#3132]: https://github.com/DataDog/dd-trace-rb/issues/3132
3821
+ [#3139]: https://github.com/DataDog/dd-trace-rb/issues/3139
3822
+ [#3140]: https://github.com/DataDog/dd-trace-rb/issues/3140
3823
+ [#3145]: https://github.com/DataDog/dd-trace-rb/issues/3145
3824
+ [#3148]: https://github.com/DataDog/dd-trace-rb/issues/3148
3825
+ [#3150]: https://github.com/DataDog/dd-trace-rb/issues/3150
3826
+ [#3152]: https://github.com/DataDog/dd-trace-rb/issues/3152
3827
+ [#3153]: https://github.com/DataDog/dd-trace-rb/issues/3153
3828
+ [#3158]: https://github.com/DataDog/dd-trace-rb/issues/3158
3829
+ [#3162]: https://github.com/DataDog/dd-trace-rb/issues/3162
3830
+ [#3163]: https://github.com/DataDog/dd-trace-rb/issues/3163
3831
+ [#3166]: https://github.com/DataDog/dd-trace-rb/issues/3166
3832
+ [#3167]: https://github.com/DataDog/dd-trace-rb/issues/3167
3833
+ [#3169]: https://github.com/DataDog/dd-trace-rb/issues/3169
3834
+ [#3171]: https://github.com/DataDog/dd-trace-rb/issues/3171
3835
+ [#3172]: https://github.com/DataDog/dd-trace-rb/issues/3172
3836
+ [#3176]: https://github.com/DataDog/dd-trace-rb/issues/3176
3837
+ [#3177]: https://github.com/DataDog/dd-trace-rb/issues/3177
3838
+ [#3183]: https://github.com/DataDog/dd-trace-rb/issues/3183
3839
+ [#3186]: https://github.com/DataDog/dd-trace-rb/issues/3186
3840
+ [#3188]: https://github.com/DataDog/dd-trace-rb/issues/3188
3841
+ [#3189]: https://github.com/DataDog/dd-trace-rb/issues/3189
3842
+ [#3190]: https://github.com/DataDog/dd-trace-rb/issues/3190
3843
+ [#3197]: https://github.com/DataDog/dd-trace-rb/issues/3197
3844
+ [#3204]: https://github.com/DataDog/dd-trace-rb/issues/3204
3845
+ [#3206]: https://github.com/DataDog/dd-trace-rb/issues/3206
3846
+ [#3207]: https://github.com/DataDog/dd-trace-rb/issues/3207
3847
+ [#3223]: https://github.com/DataDog/dd-trace-rb/issues/3223
3848
+ [#3234]: https://github.com/DataDog/dd-trace-rb/issues/3234
3849
+ [#3235]: https://github.com/DataDog/dd-trace-rb/issues/3235
3850
+ [#3240]: https://github.com/DataDog/dd-trace-rb/issues/3240
3851
+ [#3242]: https://github.com/DataDog/dd-trace-rb/issues/3242
3852
+ [#3252]: https://github.com/DataDog/dd-trace-rb/issues/3252
3690
3853
  [@AdrianLC]: https://github.com/AdrianLC
3691
3854
  [@Azure7111]: https://github.com/Azure7111
3692
3855
  [@BabyGroot]: https://github.com/BabyGroot
@@ -3838,4 +4001,4 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
3838
4001
  [@y-yagi]: https://github.com/y-yagi
3839
4002
  [@yujideveloper]: https://github.com/yujideveloper
3840
4003
  [@yukimurasawa]: https://github.com/yukimurasawa
3841
- [@zachmccormick]: https://github.com/zachmccormick
4004
+ [@zachmccormick]: https://github.com/zachmccormick
@@ -16,8 +16,7 @@ the gem. Setting `DD_PROFILING_NO_EXTENSION` at installation time skips compilat
16
16
 
17
17
  (If you're a customer and needed to use this, please tell us why on <https://github.com/DataDog/dd-trace-rb/issues/new>.)
18
18
 
19
- In past releases, it was possible for the profiler to run without the native extension, but that's no longer the case,
20
- and disabling the extension will disable profiling.
19
+ Disabling the profiler extension will disable profiling.
21
20
 
22
21
  ## Who is this page for?
23
22
 
@@ -83,7 +82,7 @@ contribute upstream changes so that they become official public VM APIs.
83
82
  Ruby versions 2.6 to 3.2 shipped a JIT compiler called MJIT. This compiler does not directly generate machine code;
84
83
  instead it generates C code and uses the system C compiler to turn it into machine code.
85
84
 
86
- The generated C code `#include`s a private header -- which we reference as "the MJIT header" everywhere.
85
+ The generated C code `#include`s a private header -- which we call "the MJIT header".
87
86
  The MJIT header gets shipped with all MJIT-enabled Rubies and includes the layout of many internal VM structures;
88
87
  and of course the intention is that it is only used by the Ruby MJIT compiler.
89
88
 
@@ -104,8 +103,7 @@ Thus, even though a regular Ruby installation does not include these files, we c
104
103
  * **OS support**: Linux
105
104
 
106
105
  To enable CPU-time profiling, we use the `pthread_getcpuclockid(pthread_t thread, clockid_t *clockid)` C function to
107
- obtain a `clockid_t` that can then be used with the `Process.clock_gettime` method (or directly with the
108
- `clock_gettime()` C function).
106
+ obtain a `clockid_t` that can then be used with the `clock_gettime` function.
109
107
 
110
108
  The challenge with using `pthread_getcpuclockid()` is that we need to get the `pthread_t` for a given Ruby `Thread`
111
109
  object. We previously did this with a weird combination of monkey patching and `pthread_self()` (effectively patching
@@ -17,9 +17,6 @@ typedef struct thread_cpu_time {
17
17
 
18
18
  void self_test_clock_id(void);
19
19
 
20
- // TODO: Remove this after the OldStack profiler gets removed
21
- VALUE clock_id_for(VALUE self, VALUE thread);
22
-
23
20
  // Safety: This function is assumed never to raise exceptions by callers
24
21
  thread_cpu_time_id thread_cpu_time_id_for(VALUE thread);
25
22
  thread_cpu_time thread_cpu_time_for(thread_cpu_time_id time_id);
@@ -22,28 +22,6 @@ void self_test_clock_id(void) {
22
22
  if (expected_pthread_id != actual_pthread_id) rb_raise(rb_eRuntimeError, "pthread_id_for() self-test failed");
23
23
  }
24
24
 
25
- // TODO: Remove this after the OldStack profiler gets removed
26
- VALUE clock_id_for(DDTRACE_UNUSED VALUE _self, VALUE thread) {
27
- rb_nativethread_id_t thread_id = pthread_id_for(thread);
28
-
29
- clockid_t clock_id;
30
- int error = pthread_getcpuclockid(thread_id, &clock_id);
31
-
32
- if (error == 0) {
33
- return CLOCKID2NUM(clock_id);
34
- } else {
35
- switch(error) {
36
- // The more specific error messages are based on the pthread_getcpuclockid(3) man page
37
- case ENOENT:
38
- rb_exc_raise(rb_syserr_new(error, "Failed to get clock_id for given thread: Per-thread CPU time clocks are not supported by the system."));
39
- case ESRCH:
40
- rb_exc_raise(rb_syserr_new(error, "Failed to get clock_id for given thread: No thread could be found."));
41
- default:
42
- rb_exc_raise(rb_syserr_new(error, "Failed to get clock_id for given thread"));
43
- }
44
- }
45
- }
46
-
47
25
  // Safety: This function is assumed never to raise exceptions by callers
48
26
  thread_cpu_time_id thread_cpu_time_id_for(VALUE thread) {
49
27
  rb_nativethread_id_t thread_id = pthread_id_for(thread);
@@ -10,7 +10,6 @@
10
10
  #include "helpers.h"
11
11
 
12
12
  void self_test_clock_id(void) { } // Nothing to check
13
- VALUE clock_id_for(DDTRACE_UNUSED VALUE _self, DDTRACE_UNUSED VALUE _thread) { return Qnil; } // Nothing to return
14
13
 
15
14
  thread_cpu_time_id thread_cpu_time_id_for(DDTRACE_UNUSED VALUE _thread) {
16
15
  return (thread_cpu_time_id) {.valid = false};
@@ -83,6 +83,7 @@ struct cpu_and_wall_time_worker_state {
83
83
  bool allocation_counting_enabled;
84
84
  bool no_signals_workaround_enabled;
85
85
  bool dynamic_sampling_rate_enabled;
86
+ int allocation_sample_every; // Temporarily used for development/testing of allocation profiling
86
87
  VALUE self_instance;
87
88
  VALUE thread_context_collector_instance;
88
89
  VALUE idle_sampling_helper_instance;
@@ -150,7 +151,8 @@ static VALUE _native_initialize(
150
151
  VALUE idle_sampling_helper_instance,
151
152
  VALUE allocation_counting_enabled,
152
153
  VALUE no_signals_workaround_enabled,
153
- VALUE dynamic_sampling_rate_enabled
154
+ VALUE dynamic_sampling_rate_enabled,
155
+ VALUE allocation_sample_every
154
156
  );
155
157
  static void cpu_and_wall_time_worker_typed_data_mark(void *state_ptr);
156
158
  static VALUE _native_sampling_loop(VALUE self, VALUE instance);
@@ -183,9 +185,10 @@ static void grab_gvl_and_sample(void);
183
185
  static void reset_stats(struct cpu_and_wall_time_worker_state *state);
184
186
  static void sleep_for(uint64_t time_ns);
185
187
  static VALUE _native_allocation_count(DDTRACE_UNUSED VALUE self);
186
- static void on_newobj_event(DDTRACE_UNUSED VALUE tracepoint_data, DDTRACE_UNUSED void *unused);
188
+ static void on_newobj_event(VALUE tracepoint_data, DDTRACE_UNUSED void *unused);
187
189
  static void disable_tracepoints(struct cpu_and_wall_time_worker_state *state);
188
190
  static VALUE _native_with_blocked_sigprof(DDTRACE_UNUSED VALUE self);
191
+ static VALUE rescued_sample_allocation(VALUE tracepoint_data);
189
192
 
190
193
  // Note on sampler global state safety:
191
194
  //
@@ -223,7 +226,7 @@ void collectors_cpu_and_wall_time_worker_init(VALUE profiling_module) {
223
226
  // https://bugs.ruby-lang.org/issues/18007 for a discussion around this.
224
227
  rb_define_alloc_func(collectors_cpu_and_wall_time_worker_class, _native_new);
225
228
 
226
- rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_initialize", _native_initialize, 7);
229
+ rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_initialize", _native_initialize, 8);
227
230
  rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_sampling_loop", _native_sampling_loop, 1);
228
231
  rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_stop", _native_stop, 2);
229
232
  rb_define_singleton_method(collectors_cpu_and_wall_time_worker_class, "_native_reset_after_fork", _native_reset_after_fork, 1);
@@ -257,10 +260,14 @@ static const rb_data_type_t cpu_and_wall_time_worker_typed_data = {
257
260
  static VALUE _native_new(VALUE klass) {
258
261
  struct cpu_and_wall_time_worker_state *state = ruby_xcalloc(1, sizeof(struct cpu_and_wall_time_worker_state));
259
262
 
263
+ // Note: Any exceptions raised from this note until the TypedData_Wrap_Struct call will lead to the state memory
264
+ // being leaked.
265
+
260
266
  state->gc_profiling_enabled = false;
261
267
  state->allocation_counting_enabled = false;
262
268
  state->no_signals_workaround_enabled = false;
263
269
  state->dynamic_sampling_rate_enabled = true;
270
+ state->allocation_sample_every = 0;
264
271
  state->thread_context_collector_instance = Qnil;
265
272
  state->idle_sampling_helper_instance = Qnil;
266
273
  state->owner_thread = Qnil;
@@ -287,12 +294,14 @@ static VALUE _native_initialize(
287
294
  VALUE idle_sampling_helper_instance,
288
295
  VALUE allocation_counting_enabled,
289
296
  VALUE no_signals_workaround_enabled,
290
- VALUE dynamic_sampling_rate_enabled
297
+ VALUE dynamic_sampling_rate_enabled,
298
+ VALUE allocation_sample_every
291
299
  ) {
292
300
  ENFORCE_BOOLEAN(gc_profiling_enabled);
293
301
  ENFORCE_BOOLEAN(allocation_counting_enabled);
294
302
  ENFORCE_BOOLEAN(no_signals_workaround_enabled);
295
303
  ENFORCE_BOOLEAN(dynamic_sampling_rate_enabled);
304
+ ENFORCE_TYPE(allocation_sample_every, T_FIXNUM);
296
305
 
297
306
  struct cpu_and_wall_time_worker_state *state;
298
307
  TypedData_Get_Struct(self_instance, struct cpu_and_wall_time_worker_state, &cpu_and_wall_time_worker_typed_data, state);
@@ -301,6 +310,12 @@ static VALUE _native_initialize(
301
310
  state->allocation_counting_enabled = (allocation_counting_enabled == Qtrue);
302
311
  state->no_signals_workaround_enabled = (no_signals_workaround_enabled == Qtrue);
303
312
  state->dynamic_sampling_rate_enabled = (dynamic_sampling_rate_enabled == Qtrue);
313
+ state->allocation_sample_every = NUM2INT(allocation_sample_every);
314
+
315
+ if (state->allocation_sample_every < 0) {
316
+ rb_raise(rb_eArgError, "Unexpected value for allocation_sample_every: %d. This value must be >= 0.", state->allocation_sample_every);
317
+ }
318
+
304
319
  state->thread_context_collector_instance = enforce_thread_context_collector_instance(thread_context_collector_instance);
305
320
  state->idle_sampling_helper_instance = idle_sampling_helper_instance;
306
321
  state->gc_tracepoint = rb_tracepoint_new(Qnil, RUBY_INTERNAL_EVENT_GC_ENTER | RUBY_INTERNAL_EVENT_GC_EXIT, on_gc_event, NULL /* unused */);
@@ -880,7 +895,7 @@ static VALUE _native_allocation_count(DDTRACE_UNUSED VALUE self) {
880
895
 
881
896
  // Implements memory-related profiling events. This function is called by Ruby via the `object_allocation_tracepoint`
882
897
  // when the RUBY_INTERNAL_EVENT_NEWOBJ event is triggered.
883
- static void on_newobj_event(DDTRACE_UNUSED VALUE tracepoint_data, DDTRACE_UNUSED void *unused) {
898
+ static void on_newobj_event(VALUE tracepoint_data, DDTRACE_UNUSED void *unused) {
884
899
  // Update thread-local allocation count
885
900
  if (RB_UNLIKELY(allocation_count == UINT64_MAX)) {
886
901
  allocation_count = 0;
@@ -907,7 +922,12 @@ static void on_newobj_event(DDTRACE_UNUSED VALUE tracepoint_data, DDTRACE_UNUSED
907
922
  // defined as not being able to allocate) sets this.
908
923
  state->during_sample = true;
909
924
 
910
- // TODO: Sampling goes here (calling into `thread_context_collector_sample_allocation`)
925
+ // TODO: This is a placeholder sampling decision strategy. We plan to replace it with a better one soon (e.g. before
926
+ // beta), and having something here allows us to test the rest of feature, sampling decision aside.
927
+ if (state->allocation_sample_every > 0 && ((allocation_count % state->allocation_sample_every) == 0)) {
928
+ // Rescue against any exceptions that happen during sampling
929
+ safely_call(rescued_sample_allocation, tracepoint_data, state->self_instance);
930
+ }
911
931
 
912
932
  state->during_sample = false;
913
933
  }
@@ -929,3 +949,18 @@ static VALUE _native_with_blocked_sigprof(DDTRACE_UNUSED VALUE self) {
929
949
  return result;
930
950
  }
931
951
  }
952
+
953
+ static VALUE rescued_sample_allocation(VALUE tracepoint_data) {
954
+ struct cpu_and_wall_time_worker_state *state = active_sampler_instance_state; // Read from global variable, see "sampler global state safety" note above
955
+
956
+ // This should not happen in a normal situation because on_newobj_event already checked for this, but just in case...
957
+ if (state == NULL) return Qnil;
958
+
959
+ rb_trace_arg_t *data = rb_tracearg_from_tracepoint(tracepoint_data);
960
+ VALUE new_object = rb_tracearg_object(data);
961
+
962
+ thread_context_collector_sample_allocation(state->thread_context_collector_instance, state->allocation_sample_every, new_object);
963
+
964
+ // Return a dummy VALUE because we're called from rb_rescue2 which requires it
965
+ return Qnil;
966
+ }
@@ -78,6 +78,9 @@ static const rb_data_type_t idle_sampling_helper_typed_data = {
78
78
  static VALUE _native_new(VALUE klass) {
79
79
  struct idle_sampling_loop_state *state = ruby_xcalloc(1, sizeof(struct idle_sampling_loop_state));
80
80
 
81
+ // Note: Any exceptions raised from this note until the TypedData_Wrap_Struct call will lead to the state memory
82
+ // being leaked.
83
+
81
84
  reset_state(state);
82
85
 
83
86
  return TypedData_Wrap_Struct(klass, &idle_sampling_helper_typed_data, state);