datadog 2.21.0 → 2.23.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 (205) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +106 -2
  3. data/ext/LIBDATADOG_DEVELOPMENT.md +3 -0
  4. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -1
  5. data/ext/datadog_profiling_native_extension/collectors_stack.c +4 -0
  6. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +1 -1
  7. data/ext/datadog_profiling_native_extension/extconf.rb +6 -4
  8. data/ext/datadog_profiling_native_extension/heap_recorder.c +1 -1
  9. data/ext/libdatadog_api/datadog_ruby_common.h +1 -1
  10. data/ext/libdatadog_api/ddsketch.c +106 -0
  11. data/ext/libdatadog_api/feature_flags.c +554 -0
  12. data/ext/libdatadog_api/feature_flags.h +5 -0
  13. data/ext/libdatadog_api/init.c +5 -0
  14. data/ext/libdatadog_api/library_config.c +34 -25
  15. data/ext/libdatadog_api/process_discovery.c +19 -13
  16. data/ext/libdatadog_extconf_helpers.rb +1 -1
  17. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +26 -0
  18. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +59 -0
  19. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +29 -0
  20. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +26 -0
  21. data/lib/datadog/appsec/api_security/endpoint_collection.rb +10 -0
  22. data/lib/datadog/appsec/api_security/route_extractor.rb +23 -6
  23. data/lib/datadog/appsec/api_security/sampler.rb +7 -4
  24. data/lib/datadog/appsec/assets/blocked.html +8 -0
  25. data/lib/datadog/appsec/assets/blocked.json +1 -1
  26. data/lib/datadog/appsec/assets/blocked.text +3 -1
  27. data/lib/datadog/appsec/assets/waf_rules/README.md +30 -36
  28. data/lib/datadog/appsec/assets/waf_rules/recommended.json +359 -4
  29. data/lib/datadog/appsec/assets/waf_rules/strict.json +43 -2
  30. data/lib/datadog/appsec/assets.rb +1 -1
  31. data/lib/datadog/appsec/compressed_json.rb +1 -1
  32. data/lib/datadog/appsec/configuration/settings.rb +9 -0
  33. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +3 -1
  34. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +3 -2
  35. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +3 -1
  36. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +3 -1
  37. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +9 -4
  38. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +5 -1
  39. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +7 -2
  40. data/lib/datadog/appsec/contrib/rails/patcher.rb +30 -0
  41. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +3 -1
  42. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +10 -4
  43. data/lib/datadog/appsec/event.rb +12 -14
  44. data/lib/datadog/appsec/metrics/collector.rb +19 -3
  45. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +2 -1
  46. data/lib/datadog/appsec/monitor/gateway/watcher.rb +4 -4
  47. data/lib/datadog/appsec/remote.rb +29 -13
  48. data/lib/datadog/appsec/response.rb +18 -4
  49. data/lib/datadog/appsec/security_engine/result.rb +28 -9
  50. data/lib/datadog/appsec/security_engine/runner.rb +17 -7
  51. data/lib/datadog/appsec/security_event.rb +5 -7
  52. data/lib/datadog/core/configuration/components.rb +44 -9
  53. data/lib/datadog/core/configuration/config_helper.rb +1 -1
  54. data/lib/datadog/core/configuration/settings.rb +14 -0
  55. data/lib/datadog/core/configuration/stable_config.rb +10 -0
  56. data/lib/datadog/core/configuration/supported_configurations.rb +330 -299
  57. data/lib/datadog/core/configuration.rb +1 -1
  58. data/lib/datadog/core/ddsketch.rb +19 -0
  59. data/lib/datadog/core/environment/ext.rb +6 -0
  60. data/lib/datadog/core/environment/process.rb +79 -0
  61. data/lib/datadog/core/environment/yjit.rb +2 -1
  62. data/lib/datadog/core/feature_flags.rb +61 -0
  63. data/lib/datadog/core/pin.rb +4 -8
  64. data/lib/datadog/core/process_discovery.rb +4 -2
  65. data/lib/datadog/core/remote/client/capabilities.rb +7 -0
  66. data/lib/datadog/core/remote/component.rb +4 -6
  67. data/lib/datadog/core/remote/transport/config.rb +2 -10
  68. data/lib/datadog/core/remote/transport/http/config.rb +9 -9
  69. data/lib/datadog/core/remote/transport/http/negotiation.rb +17 -8
  70. data/lib/datadog/core/remote/transport/http.rb +2 -0
  71. data/lib/datadog/core/remote/transport/negotiation.rb +2 -18
  72. data/lib/datadog/core/remote/worker.rb +25 -37
  73. data/lib/datadog/core/tag_builder.rb +0 -4
  74. data/lib/datadog/core/tag_normalizer.rb +84 -0
  75. data/lib/datadog/core/telemetry/component.rb +18 -3
  76. data/lib/datadog/core/telemetry/emitter.rb +6 -6
  77. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +30 -0
  78. data/lib/datadog/core/telemetry/event/app_started.rb +52 -49
  79. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +1 -1
  80. data/lib/datadog/core/telemetry/event.rb +1 -0
  81. data/lib/datadog/core/telemetry/logger.rb +2 -2
  82. data/lib/datadog/core/telemetry/logging.rb +2 -8
  83. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +5 -6
  84. data/lib/datadog/core/telemetry/transport/telemetry.rb +1 -2
  85. data/lib/datadog/core/transport/http/client.rb +69 -0
  86. data/lib/datadog/core/transport/response.rb +4 -1
  87. data/lib/datadog/core/utils/array.rb +29 -0
  88. data/lib/datadog/{appsec/api_security → core/utils}/lru_cache.rb +10 -21
  89. data/lib/datadog/core/utils/network.rb +22 -1
  90. data/lib/datadog/core/utils/only_once_successful.rb +6 -2
  91. data/lib/datadog/core/utils.rb +2 -0
  92. data/lib/datadog/data_streams/configuration/settings.rb +49 -0
  93. data/lib/datadog/data_streams/configuration.rb +11 -0
  94. data/lib/datadog/data_streams/ext.rb +11 -0
  95. data/lib/datadog/data_streams/extensions.rb +16 -0
  96. data/lib/datadog/data_streams/pathway_context.rb +169 -0
  97. data/lib/datadog/data_streams/processor.rb +509 -0
  98. data/lib/datadog/data_streams/transport/http/api.rb +33 -0
  99. data/lib/datadog/data_streams/transport/http/client.rb +21 -0
  100. data/lib/datadog/data_streams/transport/http/stats.rb +87 -0
  101. data/lib/datadog/data_streams/transport/http.rb +41 -0
  102. data/lib/datadog/data_streams/transport/stats.rb +60 -0
  103. data/lib/datadog/data_streams.rb +100 -0
  104. data/lib/datadog/di/boot.rb +1 -0
  105. data/lib/datadog/di/component.rb +14 -16
  106. data/lib/datadog/di/context.rb +70 -0
  107. data/lib/datadog/di/el/compiler.rb +164 -0
  108. data/lib/datadog/di/el/evaluator.rb +159 -0
  109. data/lib/datadog/di/el/expression.rb +42 -0
  110. data/lib/datadog/di/el.rb +5 -0
  111. data/lib/datadog/di/error.rb +29 -0
  112. data/lib/datadog/di/instrumenter.rb +163 -48
  113. data/lib/datadog/di/probe.rb +55 -15
  114. data/lib/datadog/di/probe_builder.rb +39 -1
  115. data/lib/datadog/di/probe_manager.rb +13 -4
  116. data/lib/datadog/di/probe_notification_builder.rb +105 -67
  117. data/lib/datadog/di/proc_responder.rb +32 -0
  118. data/lib/datadog/di/serializer.rb +151 -7
  119. data/lib/datadog/di/transport/diagnostics.rb +2 -2
  120. data/lib/datadog/di/transport/http/diagnostics.rb +2 -4
  121. data/lib/datadog/di/transport/http/input.rb +2 -4
  122. data/lib/datadog/di/transport/http.rb +6 -2
  123. data/lib/datadog/di/transport/input.rb +64 -4
  124. data/lib/datadog/open_feature/component.rb +60 -0
  125. data/lib/datadog/open_feature/configuration.rb +27 -0
  126. data/lib/datadog/open_feature/evaluation_engine.rb +69 -0
  127. data/lib/datadog/open_feature/exposures/batch_builder.rb +32 -0
  128. data/lib/datadog/open_feature/exposures/buffer.rb +43 -0
  129. data/lib/datadog/open_feature/exposures/deduplicator.rb +30 -0
  130. data/lib/datadog/open_feature/exposures/event.rb +60 -0
  131. data/lib/datadog/open_feature/exposures/reporter.rb +40 -0
  132. data/lib/datadog/open_feature/exposures/worker.rb +116 -0
  133. data/lib/datadog/open_feature/ext.rb +14 -0
  134. data/lib/datadog/open_feature/native_evaluator.rb +38 -0
  135. data/lib/datadog/open_feature/noop_evaluator.rb +26 -0
  136. data/lib/datadog/open_feature/provider.rb +141 -0
  137. data/lib/datadog/open_feature/remote.rb +74 -0
  138. data/lib/datadog/open_feature/resolution_details.rb +35 -0
  139. data/lib/datadog/open_feature/transport.rb +72 -0
  140. data/lib/datadog/open_feature.rb +19 -0
  141. data/lib/datadog/opentelemetry/configuration/settings.rb +159 -0
  142. data/lib/datadog/opentelemetry/metrics.rb +110 -0
  143. data/lib/datadog/opentelemetry/sdk/configurator.rb +25 -1
  144. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +38 -0
  145. data/lib/datadog/opentelemetry.rb +3 -0
  146. data/lib/datadog/profiling/collectors/code_provenance.rb +15 -6
  147. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +1 -1
  148. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +1 -1
  149. data/lib/datadog/profiling/profiler.rb +4 -0
  150. data/lib/datadog/profiling/tag_builder.rb +36 -3
  151. data/lib/datadog/profiling.rb +1 -2
  152. data/lib/datadog/single_step_instrument.rb +1 -1
  153. data/lib/datadog/tracing/component.rb +6 -17
  154. data/lib/datadog/tracing/configuration/dynamic.rb +2 -2
  155. data/lib/datadog/tracing/configuration/ext.rb +9 -0
  156. data/lib/datadog/tracing/configuration/settings.rb +77 -3
  157. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +4 -4
  158. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -2
  159. data/lib/datadog/tracing/contrib/active_job/log_injection.rb +21 -7
  160. data/lib/datadog/tracing/contrib/active_job/patcher.rb +5 -1
  161. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +4 -2
  162. data/lib/datadog/tracing/contrib/component.rb +2 -2
  163. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +4 -1
  164. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +11 -3
  165. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +11 -7
  166. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +7 -3
  167. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +7 -0
  168. data/lib/datadog/tracing/contrib/graphql/ext.rb +1 -0
  169. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +74 -44
  170. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +11 -3
  171. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +11 -3
  172. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +11 -3
  173. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +66 -0
  174. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +66 -0
  175. data/lib/datadog/tracing/contrib/kafka/patcher.rb +14 -0
  176. data/lib/datadog/tracing/contrib/karafka/framework.rb +30 -0
  177. data/lib/datadog/tracing/contrib/karafka/monitor.rb +11 -0
  178. data/lib/datadog/tracing/contrib/karafka/patcher.rb +32 -0
  179. data/lib/datadog/tracing/contrib/rack/middlewares.rb +59 -27
  180. data/lib/datadog/tracing/contrib/rack/route_inference.rb +53 -0
  181. data/lib/datadog/tracing/contrib/rails/middlewares.rb +2 -2
  182. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +4 -1
  183. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +3 -1
  184. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +3 -1
  185. data/lib/datadog/tracing/contrib/status_range_matcher.rb +7 -0
  186. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +27 -0
  187. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +48 -0
  188. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +17 -0
  189. data/lib/datadog/tracing/contrib/waterdrop/integration.rb +43 -0
  190. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +46 -0
  191. data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +46 -0
  192. data/lib/datadog/tracing/contrib/waterdrop/producer.rb +50 -0
  193. data/lib/datadog/tracing/contrib/waterdrop.rb +37 -0
  194. data/lib/datadog/tracing/contrib.rb +1 -0
  195. data/lib/datadog/tracing/metadata/ext.rb +9 -1
  196. data/lib/datadog/tracing/transport/http/client.rb +12 -26
  197. data/lib/datadog/tracing/transport/trace_formatter.rb +11 -0
  198. data/lib/datadog/tracing/transport/traces.rb +3 -5
  199. data/lib/datadog/version.rb +2 -2
  200. data/lib/datadog.rb +2 -0
  201. metadata +92 -16
  202. data/ext/libdatadog_api/macos_development.md +0 -26
  203. data/lib/datadog/core/remote/transport/http/client.rb +0 -49
  204. data/lib/datadog/core/telemetry/transport/http/client.rb +0 -49
  205. data/lib/datadog/di/transport/http/client.rb +0 -47
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e804b0ea5131eba47b865f95a6540c84a2c20e061a9d25a9bf1f2841895c46c6
4
- data.tar.gz: 7c7b61bb061c943aad519ede1f4900351db8b79e7111368c3d85f23ac73fafb8
3
+ metadata.gz: a168735b19c403a74cd23f49a301a74006d827ff24f62cc93255a353d0415359
4
+ data.tar.gz: 7f6df03ec7834bf5709b36d8fa9a8213ad5c5f9bf04e299acb7d3c1e781760e7
5
5
  SHA512:
6
- metadata.gz: 669cc7248fe15fbd07ab98e71d20e3ec97d644b27ef43be9b7fe7b047c60bd8794c903db3cfe1f4580f7877f7a1491f5028743a618e649930ff10d14756ae820
7
- data.tar.gz: e5a2e28ebcc390f1e2277299b883946c4f0baec35754216bbea4da4df437fa06e8c2b6cc0aa5f7847256e0b500903076a19ec7456c7979e7759fc7a4fb8836d3
6
+ metadata.gz: a933fb99fd374b1da93fd0a70b7cb33b2396977e8388ebfd5e12d968da7158ef8fc23a73672c308f8a72e433525c99ac1182285adc2df1eb244082efeef374bb
7
+ data.tar.gz: 224bbcc48cde29a3a85c1eea9d5e1653ed26ad2d195389e599f2e4614158d63284c92fbf155cbd7bf584930195d4b30b7bf5a8a1fd6951ac798c1d3a1b35969b
data/CHANGELOG.md CHANGED
@@ -2,6 +2,65 @@
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## [2.23.0] - 2025-12-11
6
+
7
+ ### Added
8
+
9
+ * Tracing: Add process tags to trace payloads with `DD_EXPERIMENTAL_PROPAGATE_PROCESS_TAGS_ENABLED` environment variable ([#5033][])
10
+ * Tracing: Integrations: Add Data Streams Monitoring (DSM) instrumentation to Waterdrop producers ([#5031][])
11
+ * Tracing: Open Telemetry: Add OpenTelemetry metrics support with OTLP exporters using `DD_METRICS_OTEL_ENABLED` and standard OpenTelemetry environment variables ([#5021][])
12
+ * Tracing: Add `http.endpoint` tag which contains the route whenever routing info is available, and falls back to route inferred from the request path ([#4995][])
13
+ * Tracing: Add configuration of HTTP client and server error ranges via `DD_TRACE_HTTP_CLIENT_ERROR_STATUSES` and `DD_TRACE_HTTP_SERVER_ERROR_STATUSES` ([#4991][])
14
+ * Tracing: Integrations: Add Data Streams Monitoring for `ruby-kafka` and `karafka` consumers with optional manual instrumentation ([#4901][])
15
+ * Dynamic Instrumentation: Add support for Hash length operations in expression language ([#5019][])
16
+ * AppSec: Add unique security response identifier in the response body for blocked requests ([#5049][])
17
+ * AppSec: Add support for processor overrides and custom data scanners ([#5044][])
18
+ * Feature Flags: Add new component to support Open Feature SDK ([#5054][], [#5024][])
19
+
20
+ ### Changed
21
+
22
+ * Core: Update minimum `datadog-ruby_core_source` dependency to 3.4.2 ([#5122][])
23
+ * Core: Update `libdatadog` dependency to version 24.0.1 ([#5058][], [#5045][], [#5020][])
24
+ * Tracing: Treat IPs from `100.65.0.0/10` range as private. ([#4975][])
25
+
26
+ ### Fixed
27
+
28
+ * Live Debugger / Dynamic Instrumentation: Fix issues delivering large quantities of snapshots ([#5086][])
29
+ * Tracing: Integrations: Fix `NoMethodError` in GraphQL integration when error has no `locations`. ([#5025][])
30
+ * Tracing: Integrations: Fix `http.route` tag for Rack applications mounted inside Rails. ([#4988][])
31
+ * Profiling: Fix profiler support for Ruby 4.0.0-preview2 ([#5091][])
32
+ * Profiling: Fix profiler sleep and wait states not being categorized in timeline ([#5000][])
33
+ * Profiling: Fix profiler not identifying executables with gems they belong to ([#4999][])
34
+ * Stable Config: Fix potential segfault during configuration file parsing ([#5073][])
35
+ * AppSec: Fix route extraction error for Rails 8.1.1+. ([#5042][])
36
+
37
+ ## [2.22.0] - 2025-10-15
38
+
39
+ ### Added
40
+
41
+ * Tracing: Add GraphQL error tracking with OpenTelemetry semantics ([#4864][])
42
+ * AppSec: API Security: Add endpoint collection for Rails ([#4919][])
43
+ * AppSec: Updated WAF rules to add support for JWT analysis ([#4907][])
44
+ * AppSec: Enable Remote Configuration capabilities for fingerprinting, trace tagging and user auto-instrumentation ([#4965][])
45
+ * Dynamic Instrumentation: Support `[@duration][]`, `[@return][]` and `[@exception][]` in message templates ([#4914][])
46
+ * Dynamic Instrumentation: Report evaluation errors to the UI ([#4913][])
47
+ * Dynamic Instrumentation: Support conditions for method probes ([#4909][])
48
+ * Dynamic Instrumentation: Capture exceptions raised by instrumented methods in method probes ([#4906][])
49
+ * Dynamic Instrumentation: Add support for probe conditions for line probes ([#4861][])
50
+
51
+ ### Changed
52
+
53
+ * Core: Upgrade `libdatadog` dependency to 22.0.1 ([#4902][])
54
+ * Tracing: Add `Forwarded` header to the list of headers used for remote IP detection. ([#4969][])
55
+ * AppSec: Update `libbddwaf` to version 1.25.1.0.1 ([#4894][])
56
+ * AppSec: WAF rules can control whether traces are kept or sampled ([#4918][])
57
+ * Dynamic Instrumentation: Evaluate message templates when logging instrumented code ([#4908][])
58
+
59
+ ### Fixed
60
+
61
+ * Core: Improve locking code for remote configuration worker ([#4957][])
62
+ * Dynamic Instrumentation: Emit a single log event for line probes on exception-raising lines ([#4900][])
63
+
5
64
  ## [2.21.0] - 2025-09-17
6
65
 
7
66
  ### Added
@@ -3333,7 +3392,9 @@ Release notes: https://github.com/DataDog/dd-trace-rb/releases/tag/v0.3.1
3333
3392
  Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
3334
3393
 
3335
3394
 
3336
- [Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v2.21.0...master
3395
+ [Unreleased]: https://github.com/DataDog/dd-trace-rb/compare/v2.23.0...master
3396
+ [2.23.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.22.0...v2.23.0
3397
+ [2.22.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.21.0...v2.22.0
3337
3398
  [2.21.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.20.0...v2.21.0
3338
3399
  [2.20.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.19.0...v2.20.0
3339
3400
  [2.19.0]: https://github.com/DataDog/dd-trace-rb/compare/v2.18.0...v2.19.0
@@ -4929,12 +4990,52 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
4929
4990
  [#4838]: https://github.com/DataDog/dd-trace-rb/issues/4838
4930
4991
  [#4848]: https://github.com/DataDog/dd-trace-rb/issues/4848
4931
4992
  [#4851]: https://github.com/DataDog/dd-trace-rb/issues/4851
4993
+ [#4861]: https://github.com/DataDog/dd-trace-rb/issues/4861
4932
4994
  [#4862]: https://github.com/DataDog/dd-trace-rb/issues/4862
4933
4995
  [#4863]: https://github.com/DataDog/dd-trace-rb/issues/4863
4996
+ [#4864]: https://github.com/DataDog/dd-trace-rb/issues/4864
4934
4997
  [#4877]: https://github.com/DataDog/dd-trace-rb/issues/4877
4935
4998
  [#4884]: https://github.com/DataDog/dd-trace-rb/issues/4884
4936
4999
  [#4887]: https://github.com/DataDog/dd-trace-rb/issues/4887
4937
5000
  [#4893]: https://github.com/DataDog/dd-trace-rb/issues/4893
5001
+ [#4894]: https://github.com/DataDog/dd-trace-rb/issues/4894
5002
+ [#4900]: https://github.com/DataDog/dd-trace-rb/issues/4900
5003
+ [#4901]: https://github.com/DataDog/dd-trace-rb/issues/4901
5004
+ [#4902]: https://github.com/DataDog/dd-trace-rb/issues/4902
5005
+ [#4906]: https://github.com/DataDog/dd-trace-rb/issues/4906
5006
+ [#4907]: https://github.com/DataDog/dd-trace-rb/issues/4907
5007
+ [#4908]: https://github.com/DataDog/dd-trace-rb/issues/4908
5008
+ [#4909]: https://github.com/DataDog/dd-trace-rb/issues/4909
5009
+ [#4913]: https://github.com/DataDog/dd-trace-rb/issues/4913
5010
+ [#4914]: https://github.com/DataDog/dd-trace-rb/issues/4914
5011
+ [#4918]: https://github.com/DataDog/dd-trace-rb/issues/4918
5012
+ [#4919]: https://github.com/DataDog/dd-trace-rb/issues/4919
5013
+ [#4957]: https://github.com/DataDog/dd-trace-rb/issues/4957
5014
+ [#4965]: https://github.com/DataDog/dd-trace-rb/issues/4965
5015
+ [#4969]: https://github.com/DataDog/dd-trace-rb/issues/4969
5016
+ [#4975]: https://github.com/DataDog/dd-trace-rb/issues/4975
5017
+ [#4988]: https://github.com/DataDog/dd-trace-rb/issues/4988
5018
+ [#4991]: https://github.com/DataDog/dd-trace-rb/issues/4991
5019
+ [#4995]: https://github.com/DataDog/dd-trace-rb/issues/4995
5020
+ [#4999]: https://github.com/DataDog/dd-trace-rb/issues/4999
5021
+ [#5000]: https://github.com/DataDog/dd-trace-rb/issues/5000
5022
+ [#5019]: https://github.com/DataDog/dd-trace-rb/issues/5019
5023
+ [#5020]: https://github.com/DataDog/dd-trace-rb/issues/5020
5024
+ [#5021]: https://github.com/DataDog/dd-trace-rb/issues/5021
5025
+ [#5024]: https://github.com/DataDog/dd-trace-rb/issues/5024
5026
+ [#5025]: https://github.com/DataDog/dd-trace-rb/issues/5025
5027
+ [#5031]: https://github.com/DataDog/dd-trace-rb/issues/5031
5028
+ [#5033]: https://github.com/DataDog/dd-trace-rb/issues/5033
5029
+ [#5042]: https://github.com/DataDog/dd-trace-rb/issues/5042
5030
+ [#5044]: https://github.com/DataDog/dd-trace-rb/issues/5044
5031
+ [#5045]: https://github.com/DataDog/dd-trace-rb/issues/5045
5032
+ [#5049]: https://github.com/DataDog/dd-trace-rb/issues/5049
5033
+ [#5054]: https://github.com/DataDog/dd-trace-rb/issues/5054
5034
+ [#5058]: https://github.com/DataDog/dd-trace-rb/issues/5058
5035
+ [#5073]: https://github.com/DataDog/dd-trace-rb/issues/5073
5036
+ [#5086]: https://github.com/DataDog/dd-trace-rb/issues/5086
5037
+ [#5091]: https://github.com/DataDog/dd-trace-rb/issues/5091
5038
+ [#5122]: https://github.com/DataDog/dd-trace-rb/issues/5122
4938
5039
  [@AdrianLC]: https://github.com/AdrianLC
4939
5040
  [@Azure7111]: https://github.com/Azure7111
4940
5041
  [@BabyGroot]: https://github.com/BabyGroot
@@ -4993,6 +5094,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
4993
5094
  [@dorner]: https://github.com/dorner
4994
5095
  [@drcapulet]: https://github.com/drcapulet
4995
5096
  [@dudo]: https://github.com/dudo
5097
+ [@duration]: https://github.com/duration
4996
5098
  [@e1senh0rn]: https://github.com/e1senh0rn
4997
5099
  [@ecdemis123]: https://github.com/ecdemis123
4998
5100
  [@elliterate]: https://github.com/elliterate
@@ -5001,6 +5103,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
5001
5103
  [@erict-square]: https://github.com/erict-square
5002
5104
  [@errriclee]: https://github.com/errriclee
5003
5105
  [@evan-waters]: https://github.com/evan-waters
5106
+ [@exception]: https://github.com/exception
5004
5107
  [@fledman]: https://github.com/fledman
5005
5108
  [@frsantos]: https://github.com/frsantos
5006
5109
  [@fteem]: https://github.com/fteem
@@ -5058,6 +5161,7 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
5058
5161
  [@rahul342]: https://github.com/rahul342
5059
5162
  [@randy-girard]: https://github.com/randy-girard
5060
5163
  [@renchap]: https://github.com/renchap
5164
+ [@return]: https://github.com/return
5061
5165
  [@ricbartm]: https://github.com/ricbartm
5062
5166
  [@roccoblues]: https://github.com/roccoblues
5063
5167
  [@rqz13]: https://github.com/rqz13
@@ -5086,4 +5190,4 @@ Git diff: https://github.com/DataDog/dd-trace-rb/compare/v0.3.0...v0.3.1
5086
5190
  [@y-yagi]: https://github.com/y-yagi
5087
5191
  [@yujideveloper]: https://github.com/yujideveloper
5088
5192
  [@yukimurasawa]: https://github.com/yukimurasawa
5089
- [@zachmccormick]: https://github.com/zachmccormick
5193
+ [@zachmccormick]: https://github.com/zachmccormick
@@ -0,0 +1,3 @@
1
+ # Libdatadog development
2
+
3
+ Moved to <../docs/LibdatadogDevelopment.md>!
@@ -365,7 +365,7 @@ static const rb_data_type_t sampler_typed_data = {
365
365
  };
366
366
 
367
367
  static VALUE _native_new(VALUE klass) {
368
- sampler_state *state = ruby_xcalloc(sizeof(sampler_state), 1);
368
+ sampler_state *state = ruby_xcalloc(1, sizeof(sampler_state));
369
369
 
370
370
  long now_ns = monotonic_wall_time_now_ns(DO_NOT_RAISE_ON_FAILURE);
371
371
  if (now_ns == 0) {
@@ -354,6 +354,10 @@ void sample_thread(
354
354
  state_label->str = DDOG_CHARSLICE_C("blocked");
355
355
  } else if (CHARSLICE_EQUALS("wait_readable", name_slice)) { // Expected to be IO#wait_readable
356
356
  state_label->str = DDOG_CHARSLICE_C("network");
357
+ } else if (CHARSLICE_EQUALS("_native_idle_sampling_loop", name_slice)) { // Expected to be Datadog::Profiler::Collectors::IdleSamplingHelper#_native_idle_sampling_loop
358
+ state_label->str = DDOG_CHARSLICE_C("waiting");
359
+ } else if (CHARSLICE_EQUALS("_native_sampling_loop", name_slice)) { // Expected to be Datadog::Profiler::Collectors::CpuAndWallTimeWorker#_native_sampling_loop
360
+ state_label->str = DDOG_CHARSLICE_C("sleeping");
357
361
  }
358
362
  #ifdef NO_PRIMITIVE_POP // Ruby < 3.2
359
363
  else if (CHARSLICE_EQUALS("pop", name_slice)) { // Expected to be Queue/SizedQueue#pop
@@ -3,7 +3,7 @@
3
3
  // IMPORTANT: Currently this file is copy-pasted between extensions. Make sure to update all versions when doing any change!
4
4
 
5
5
  #include <ruby.h>
6
- #include <datadog/profiling.h>
6
+ #include <datadog/common.h>
7
7
 
8
8
  // Used to mark symbols to be exported to the outside of the extension.
9
9
  // Consider very carefully before tagging a function with this.
@@ -138,11 +138,13 @@ if have_header("dlfcn.h")
138
138
  have_func("dladdr")
139
139
  end
140
140
 
141
- # On Ruby 3.5, we can't ask the object_id from IMEMOs (https://github.com/ruby/ruby/pull/13347)
142
- $defs << "-DNO_IMEMO_OBJECT_ID" unless RUBY_VERSION < "3.5"
141
+ # On Ruby 4, we can't ask the object_id from IMEMOs (https://github.com/ruby/ruby/pull/13347)
142
+ $defs << "-DNO_IMEMO_OBJECT_ID" unless RUBY_VERSION < "4.0"
143
143
 
144
- # On Ruby 2.5 and 3.3, this symbol was not visible. It is on 2.6 to 3.2, as well as 3.4+
145
- $defs << "-DNO_RB_OBJ_INFO" if RUBY_VERSION.start_with?("2.5", "3.3")
144
+ # This symbol is exclusively visible on certain Ruby versions: 2.6 to 3.2, as well as 3.4 (but not 4.0+)
145
+ # It's only used to get extra information about an object when a failure happens, so it's a "very nice to have" but not
146
+ # actually required for correct behavior of the profiler.
147
+ $defs << "-DNO_RB_OBJ_INFO" if RUBY_VERSION.start_with?("2.5", "3.3", "4.")
146
148
 
147
149
  # On older Rubies, rb_postponed_job_preregister/rb_postponed_job_trigger did not exist
148
150
  $defs << "-DNO_POSTPONED_TRIGGER" if RUBY_VERSION < "3.3"
@@ -305,7 +305,7 @@ void start_heap_allocation_recording(heap_recorder *heap_recorder, VALUE new_obj
305
305
 
306
306
  if (++heap_recorder->num_recordings_skipped < heap_recorder->sample_rate ||
307
307
  #ifdef NO_IMEMO_OBJECT_ID
308
- // On Ruby 3.5, we can't ask the object_id from IMEMOs (https://github.com/ruby/ruby/pull/13347)
308
+ // On Ruby 4, we can't ask the object_id from IMEMOs (https://github.com/ruby/ruby/pull/13347)
309
309
  RB_BUILTIN_TYPE(new_obj) == RUBY_T_IMEMO
310
310
  #else
311
311
  false
@@ -3,7 +3,7 @@
3
3
  // IMPORTANT: Currently this file is copy-pasted between extensions. Make sure to update all versions when doing any change!
4
4
 
5
5
  #include <ruby.h>
6
- #include <datadog/profiling.h>
6
+ #include <datadog/common.h>
7
7
 
8
8
  // Used to mark symbols to be exported to the outside of the extension.
9
9
  // Consider very carefully before tagging a function with this.
@@ -0,0 +1,106 @@
1
+ #include <ruby.h>
2
+ #include <datadog/ddsketch.h>
3
+
4
+ #include "datadog_ruby_common.h"
5
+
6
+ static VALUE _native_new(VALUE klass);
7
+ static void ddsketch_free(void *ptr);
8
+ static VALUE native_add(VALUE self, VALUE point);
9
+ static VALUE native_add_with_count(VALUE self, VALUE point, VALUE count);
10
+ static VALUE native_count(VALUE self);
11
+ static VALUE native_encode(VALUE self);
12
+ NORETURN(static void raise_ddsketch_error(const char *message, ddog_VoidResult result));
13
+
14
+ void ddsketch_init(VALUE core_module) {
15
+ VALUE ddsketch_class = rb_define_class_under(core_module, "DDSketch", rb_cObject);
16
+
17
+ rb_define_alloc_func(ddsketch_class, _native_new);
18
+ rb_define_method(ddsketch_class, "add", native_add, 1);
19
+ rb_define_method(ddsketch_class, "add_with_count", native_add_with_count, 2);
20
+ rb_define_method(ddsketch_class, "count", native_count, 0);
21
+ rb_define_method(ddsketch_class, "encode", native_encode, 0);
22
+ }
23
+
24
+ // This structure is used to define a Ruby object that stores a pointer to a ddsketch_Handle_DDSketch
25
+ // See also https://github.com/ruby/ruby/blob/master/doc/extension.rdoc for how this works
26
+ static const rb_data_type_t ddsketch_typed_data = {
27
+ .wrap_struct_name = "Datadog::DDSketch",
28
+ .function = {
29
+ .dmark = NULL, // We don't store references to Ruby objects so we don't need to mark any of them
30
+ .dfree = ddsketch_free,
31
+ .dsize = NULL, // We don't track memory usage (although it'd be cool if we did!)
32
+ //.dcompact = NULL, // Not needed -- we don't store references to Ruby objects
33
+ },
34
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
35
+ };
36
+
37
+ static VALUE _native_new(VALUE klass) {
38
+ ddsketch_Handle_DDSketch *state = ruby_xcalloc(1, sizeof(ddsketch_Handle_DDSketch));
39
+
40
+ *state = ddog_ddsketch_new();
41
+
42
+ return TypedData_Wrap_Struct(klass, &ddsketch_typed_data, state);
43
+ }
44
+
45
+ static void ddsketch_free(void *ptr) {
46
+ ddsketch_Handle_DDSketch *state = (ddsketch_Handle_DDSketch *) ptr;
47
+ ddog_ddsketch_drop(state);
48
+ ruby_xfree(ptr);
49
+ }
50
+
51
+ static void raise_ddsketch_error(const char *message, ddog_VoidResult result) {
52
+ rb_raise(rb_eRuntimeError, "%s: %"PRIsVALUE, message, get_error_details_and_drop(&result.err));
53
+ }
54
+
55
+ static VALUE native_add(VALUE self, VALUE point) {
56
+ ddsketch_Handle_DDSketch *state;
57
+ TypedData_Get_Struct(self, ddsketch_Handle_DDSketch, &ddsketch_typed_data, state);
58
+
59
+ ddog_VoidResult result = ddog_ddsketch_add(state, NUM2DBL(point));
60
+
61
+ if (result.tag == DDOG_VOID_RESULT_ERR) raise_ddsketch_error("DDSketch add failed", result);
62
+
63
+ return self;
64
+ }
65
+
66
+ static VALUE native_add_with_count(VALUE self, VALUE point, VALUE count) {
67
+ ddsketch_Handle_DDSketch *state;
68
+ TypedData_Get_Struct(self, ddsketch_Handle_DDSketch, &ddsketch_typed_data, state);
69
+
70
+ ddog_VoidResult result = ddog_ddsketch_add_with_count(state, NUM2DBL(point), NUM2DBL(count));
71
+
72
+ if (result.tag == DDOG_VOID_RESULT_ERR) raise_ddsketch_error("DDSketch add_with_count failed", result);
73
+
74
+ return self;
75
+ }
76
+
77
+ static VALUE native_count(VALUE self) {
78
+ ddsketch_Handle_DDSketch *state;
79
+ TypedData_Get_Struct(self, ddsketch_Handle_DDSketch, &ddsketch_typed_data, state);
80
+
81
+ double count_out;
82
+ ddog_VoidResult result = ddog_ddsketch_count(state, &count_out);
83
+
84
+ if (result.tag == DDOG_VOID_RESULT_ERR) raise_ddsketch_error("DDSketch count failed", result);
85
+
86
+ return DBL2NUM(count_out);
87
+ }
88
+
89
+ static VALUE native_encode(VALUE self) {
90
+ ddsketch_Handle_DDSketch *state;
91
+ TypedData_Get_Struct(self, ddsketch_Handle_DDSketch, &ddsketch_typed_data, state);
92
+
93
+ ddog_Vec_U8 encoded = ddog_ddsketch_encode(state);
94
+
95
+ // Copy into a Ruby string
96
+ VALUE bytes = rb_str_new((const char *) encoded.ptr, encoded.len);
97
+
98
+ ddog_Vec_U8_drop(encoded);
99
+
100
+ // The sketch is consumed by encode; to make this a bit more user-friendly for
101
+ // a Ruby API (since we can't "kill" the Ruby object), let's re-initialize it so
102
+ // it can be used again.
103
+ *state = ddog_ddsketch_new();
104
+
105
+ return bytes;
106
+ }