datadog 2.38.0 → 2.47.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 (922) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +279 -35
  3. data/README.md +3 -0
  4. data/bin/ddprofrb +4 -4
  5. data/ext/datadog_profiling_native_extension/NativeExtensionDesign.md +12 -24
  6. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +256 -117
  7. data/ext/datadog_profiling_native_extension/collectors_discrete_dynamic_sampler.c +1 -5
  8. data/ext/datadog_profiling_native_extension/collectors_gc_profiling_helper.c +0 -2
  9. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +19 -20
  10. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.h +5 -1
  11. data/ext/datadog_profiling_native_extension/collectors_stack.c +267 -171
  12. data/ext/datadog_profiling_native_extension/collectors_stack.h +17 -3
  13. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +307 -217
  14. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +10 -5
  15. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +5 -4
  16. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +19 -11
  17. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +7 -10
  18. data/ext/datadog_profiling_native_extension/extconf.rb +68 -100
  19. data/ext/datadog_profiling_native_extension/heap_recorder.c +353 -257
  20. data/ext/datadog_profiling_native_extension/heap_recorder.h +50 -31
  21. data/ext/datadog_profiling_native_extension/native_extension_helpers.rb +3 -27
  22. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +853 -496
  23. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +42 -15
  24. data/ext/datadog_profiling_native_extension/profiling.c +30 -23
  25. data/ext/datadog_profiling_native_extension/ruby_helpers.c +4 -80
  26. data/ext/datadog_profiling_native_extension/ruby_helpers.h +4 -7
  27. data/ext/datadog_profiling_native_extension/stack_recorder.c +116 -89
  28. data/ext/datadog_profiling_native_extension/stack_recorder.h +12 -5
  29. data/ext/datadog_profiling_native_extension/time_helpers.c +2 -4
  30. data/ext/datadog_profiling_native_extension/time_helpers.h +15 -15
  31. data/ext/libdatadog_api/datadog_ruby_common.c +19 -11
  32. data/ext/libdatadog_api/datadog_ruby_common.h +7 -10
  33. data/ext/libdatadog_api/di.c +43 -3
  34. data/ext/libdatadog_api/extconf.rb +29 -24
  35. data/ext/libdatadog_api/feature_flags.c +34 -0
  36. data/ext/libdatadog_api/init.c +9 -1
  37. data/ext/libdatadog_api/otel_thread_context.c +274 -0
  38. data/ext/libdatadog_api/otel_thread_context.h +5 -0
  39. data/ext/libdatadog_api/process_discovery.c +15 -1
  40. data/ext/libdatadog_api/trace_exporter.c +2078 -0
  41. data/ext/libdatadog_api/trace_exporter.h +5 -0
  42. data/ext/libdatadog_extconf_helpers.rb +22 -17
  43. data/lib/datadog/ai_guard/component.rb +24 -15
  44. data/lib/datadog/ai_guard/configuration/ext.rb +2 -0
  45. data/lib/datadog/ai_guard/configuration.rb +13 -0
  46. data/lib/datadog/ai_guard/contrib/ruby_llm/chat_instrumentation.rb +48 -55
  47. data/lib/datadog/ai_guard/contrib/ruby_llm/integration.rb +1 -1
  48. data/lib/datadog/ai_guard/contrib/ruby_llm/message_adapter.rb +76 -0
  49. data/lib/datadog/ai_guard/contrib/ruby_llm/patcher.rb +1 -0
  50. data/lib/datadog/ai_guard/contrib/ruby_llm/redaction_change_set.rb +135 -0
  51. data/lib/datadog/ai_guard/evaluation/client.rb +50 -0
  52. data/lib/datadog/ai_guard/evaluation/content_part.rb +12 -0
  53. data/lib/datadog/ai_guard/evaluation/message.rb +25 -7
  54. data/lib/datadog/ai_guard/evaluation/message_builder.rb +31 -0
  55. data/lib/datadog/ai_guard/evaluation/no_op_result.rb +6 -6
  56. data/lib/datadog/ai_guard/evaluation/outcome.rb +24 -0
  57. data/lib/datadog/ai_guard/evaluation/request.rb +8 -64
  58. data/lib/datadog/ai_guard/evaluation/response.rb +33 -0
  59. data/lib/datadog/ai_guard/evaluation/result.rb +11 -18
  60. data/lib/datadog/ai_guard/evaluation/tool_call.rb +15 -2
  61. data/lib/datadog/ai_guard/evaluation.rb +36 -14
  62. data/lib/datadog/ai_guard/ext.rb +4 -1
  63. data/lib/datadog/ai_guard/{api_client.rb → http_client.rb} +9 -7
  64. data/lib/datadog/ai_guard/metrics/telemetry.rb +43 -0
  65. data/lib/datadog/ai_guard/redaction/replacements.rb +97 -0
  66. data/lib/datadog/ai_guard/redaction/result.rb +29 -0
  67. data/lib/datadog/ai_guard/redaction.rb +80 -0
  68. data/lib/datadog/ai_guard.rb +58 -57
  69. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +22 -43
  70. data/lib/datadog/appsec/actions_handler.rb +6 -6
  71. data/lib/datadog/appsec/anonymizer.rb +1 -1
  72. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +2 -2
  73. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +6 -6
  74. data/lib/datadog/appsec/api_security/endpoint_collection/rails_route_serializer.rb +1 -1
  75. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +2 -2
  76. data/lib/datadog/appsec/api_security/route_extractor.rb +11 -11
  77. data/lib/datadog/appsec/api_security/sampler.rb +5 -5
  78. data/lib/datadog/appsec/api_security.rb +1 -1
  79. data/lib/datadog/appsec/assets/blocked.html +1 -108
  80. data/lib/datadog/appsec/assets.rb +7 -7
  81. data/lib/datadog/appsec/autoload.rb +3 -3
  82. data/lib/datadog/appsec/component.rb +15 -15
  83. data/lib/datadog/appsec/compressed_json.rb +6 -6
  84. data/lib/datadog/appsec/configuration.rb +70 -61
  85. data/lib/datadog/appsec/context.rb +7 -7
  86. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +6 -6
  87. data/lib/datadog/appsec/contrib/active_record/integration.rb +4 -4
  88. data/lib/datadog/appsec/contrib/active_record/patcher.rb +4 -4
  89. data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +7 -7
  90. data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +2 -2
  91. data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +2 -2
  92. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +36 -34
  93. data/lib/datadog/appsec/contrib/devise/configuration.rb +1 -1
  94. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +3 -3
  95. data/lib/datadog/appsec/contrib/devise/ext.rb +20 -20
  96. data/lib/datadog/appsec/contrib/devise/integration.rb +4 -4
  97. data/lib/datadog/appsec/contrib/devise/patcher.rb +8 -8
  98. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +12 -12
  99. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +8 -8
  100. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +24 -9
  101. data/lib/datadog/appsec/contrib/excon/integration.rb +4 -4
  102. data/lib/datadog/appsec/contrib/excon/patcher.rb +1 -1
  103. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +26 -26
  104. data/lib/datadog/appsec/contrib/faraday/integration.rb +4 -4
  105. data/lib/datadog/appsec/contrib/faraday/patcher.rb +4 -4
  106. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +22 -22
  107. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +4 -4
  108. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +2 -2
  109. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +7 -7
  110. data/lib/datadog/appsec/contrib/graphql/integration.rb +9 -9
  111. data/lib/datadog/appsec/contrib/graphql/patcher.rb +3 -3
  112. data/lib/datadog/appsec/contrib/rack/buffered_input.rb +1 -1
  113. data/lib/datadog/appsec/contrib/rack/ext.rb +29 -29
  114. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +14 -18
  115. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +1 -1
  116. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +24 -24
  117. data/lib/datadog/appsec/contrib/rack/input_peeker.rb +6 -6
  118. data/lib/datadog/appsec/contrib/rack/integration.rb +6 -6
  119. data/lib/datadog/appsec/contrib/rack/patcher.rb +3 -3
  120. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +11 -8
  121. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +26 -26
  122. data/lib/datadog/appsec/contrib/rack/response_body.rb +1 -1
  123. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +10 -10
  124. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +38 -11
  125. data/lib/datadog/appsec/contrib/rails/integration.rb +5 -5
  126. data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -17
  127. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +2 -2
  128. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +10 -9
  129. data/lib/datadog/appsec/contrib/rails/request.rb +3 -3
  130. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -1
  131. data/lib/datadog/appsec/contrib/rest_client/integration.rb +5 -5
  132. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +1 -1
  133. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +23 -23
  134. data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +1 -1
  135. data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +1 -1
  136. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +28 -16
  137. data/lib/datadog/appsec/contrib/sinatra/integration.rb +5 -5
  138. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -11
  139. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +10 -9
  140. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -1
  141. data/lib/datadog/appsec/counter_sampler.rb +1 -1
  142. data/lib/datadog/appsec/event.rb +14 -14
  143. data/lib/datadog/appsec/ext.rb +11 -11
  144. data/lib/datadog/appsec/extensions.rb +2 -2
  145. data/lib/datadog/appsec/instrumentation/gateway.rb +1 -1
  146. data/lib/datadog/appsec/metrics/exporter.rb +8 -8
  147. data/lib/datadog/appsec/metrics/telemetry.rb +7 -7
  148. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +4 -4
  149. data/lib/datadog/appsec/metrics.rb +4 -4
  150. data/lib/datadog/appsec/monitor/gateway/watcher.rb +16 -12
  151. data/lib/datadog/appsec/monitor.rb +1 -1
  152. data/lib/datadog/appsec/processor/rule_loader.rb +32 -32
  153. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  154. data/lib/datadog/appsec/remote.rb +6 -6
  155. data/lib/datadog/appsec/response.rb +22 -22
  156. data/lib/datadog/appsec/route_normalizer/rails_route_pattern.rb +11 -11
  157. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +18 -18
  158. data/lib/datadog/appsec/route_normalizer/route_text.rb +3 -3
  159. data/lib/datadog/appsec/route_normalizer.rb +15 -15
  160. data/lib/datadog/appsec/security_engine/engine.rb +41 -40
  161. data/lib/datadog/appsec/security_engine/runner.rb +2 -2
  162. data/lib/datadog/appsec/security_event.rb +2 -2
  163. data/lib/datadog/appsec/utils/http/body.rb +11 -8
  164. data/lib/datadog/appsec/utils/http/body_reader.rb +1 -1
  165. data/lib/datadog/appsec/utils/http/media_range.rb +15 -15
  166. data/lib/datadog/appsec/utils/http/media_type.rb +4 -4
  167. data/lib/datadog/appsec/utils/http/url_encoded.rb +80 -25
  168. data/lib/datadog/appsec.rb +16 -16
  169. data/lib/datadog/auto_instrument.rb +2 -2
  170. data/lib/datadog/core/buffer/cruby.rb +1 -1
  171. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  172. data/lib/datadog/core/configuration/agent_settings.rb +1 -1
  173. data/lib/datadog/core/configuration/agent_settings_resolver.rb +15 -15
  174. data/lib/datadog/core/configuration/base.rb +2 -2
  175. data/lib/datadog/core/configuration/components.rb +82 -47
  176. data/lib/datadog/core/configuration/components_state.rb +8 -1
  177. data/lib/datadog/core/configuration/config_helper.rb +3 -3
  178. data/lib/datadog/core/configuration/deprecations.rb +6 -6
  179. data/lib/datadog/core/configuration/ext.rb +11 -11
  180. data/lib/datadog/core/configuration/option.rb +16 -16
  181. data/lib/datadog/core/configuration/option_definition.rb +5 -5
  182. data/lib/datadog/core/configuration/options.rb +2 -2
  183. data/lib/datadog/core/configuration/settings.rb +95 -100
  184. data/lib/datadog/core/configuration/stable_config.rb +1 -1
  185. data/lib/datadog/core/configuration/supported_configurations.rb +20 -3
  186. data/lib/datadog/core/configuration.rb +8 -8
  187. data/lib/datadog/core/contrib/rails/railtie.rb +3 -3
  188. data/lib/datadog/core/crashtracking/component.rb +14 -10
  189. data/lib/datadog/core/crashtracking/tag_builder.rb +5 -5
  190. data/lib/datadog/core/deprecations.rb +1 -1
  191. data/lib/datadog/core/diagnostics/environment_logger.rb +42 -7
  192. data/lib/datadog/core/diagnostics/health.rb +2 -2
  193. data/lib/datadog/core/encoding.rb +4 -4
  194. data/lib/datadog/core/environment/agent_info.rb +2 -2
  195. data/lib/datadog/core/environment/cgroup.rb +4 -4
  196. data/lib/datadog/core/environment/container.rb +9 -9
  197. data/lib/datadog/core/environment/execution.rb +3 -3
  198. data/lib/datadog/core/environment/ext.rb +18 -18
  199. data/lib/datadog/core/environment/gc.rb +1 -1
  200. data/lib/datadog/core/environment/git.rb +2 -2
  201. data/lib/datadog/core/environment/identity.rb +10 -10
  202. data/lib/datadog/core/environment/platform.rb +8 -8
  203. data/lib/datadog/core/environment/process.rb +3 -3
  204. data/lib/datadog/core/environment/socket.rb +2 -2
  205. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  206. data/lib/datadog/core/environment/vm_cache.rb +1 -1
  207. data/lib/datadog/core/environment/yjit.rb +2 -2
  208. data/lib/datadog/core/error.rb +5 -5
  209. data/lib/datadog/core/evp.rb +2 -2
  210. data/lib/datadog/core/extensions.rb +1 -1
  211. data/lib/datadog/core/feature_flags.rb +2 -2
  212. data/lib/datadog/core/git/ext.rb +4 -4
  213. data/lib/datadog/core/logger.rb +3 -3
  214. data/lib/datadog/core/logging/ext.rb +1 -1
  215. data/lib/datadog/core/metrics/client.rb +20 -20
  216. data/lib/datadog/core/metrics/ext.rb +5 -5
  217. data/lib/datadog/core/metrics/helpers.rb +1 -1
  218. data/lib/datadog/core/metrics/logging.rb +2 -2
  219. data/lib/datadog/core/metrics/options.rb +5 -5
  220. data/lib/datadog/core/pin.rb +1 -1
  221. data/lib/datadog/core/process_discovery.rb +13 -9
  222. data/lib/datadog/core/rate_limiter.rb +1 -1
  223. data/lib/datadog/core/remote/client/capabilities.rb +60 -33
  224. data/lib/datadog/core/remote/client.rb +61 -20
  225. data/lib/datadog/core/remote/component.rb +48 -17
  226. data/lib/datadog/core/remote/configuration/content.rb +3 -3
  227. data/lib/datadog/core/remote/configuration/digest.rb +1 -1
  228. data/lib/datadog/core/remote/configuration/path.rb +9 -9
  229. data/lib/datadog/core/remote/configuration/repository.rb +4 -4
  230. data/lib/datadog/core/remote/configuration/target.rb +9 -9
  231. data/lib/datadog/core/remote/configuration.rb +4 -4
  232. data/lib/datadog/core/remote/dispatcher.rb +47 -6
  233. data/lib/datadog/core/remote/ext.rb +3 -3
  234. data/lib/datadog/core/remote/negotiation.rb +1 -1
  235. data/lib/datadog/core/remote/tie/tracing.rb +7 -7
  236. data/lib/datadog/core/remote/transport/config.rb +4 -4
  237. data/lib/datadog/core/remote/transport/http/config.rb +7 -7
  238. data/lib/datadog/core/remote/transport/http/negotiation.rb +4 -4
  239. data/lib/datadog/core/remote/transport/http.rb +10 -10
  240. data/lib/datadog/core/remote/transport/negotiation.rb +3 -3
  241. data/lib/datadog/core/remote/worker.rb +13 -5
  242. data/lib/datadog/core/runtime/ext.rb +22 -22
  243. data/lib/datadog/core/runtime/metrics.rb +9 -9
  244. data/lib/datadog/core/tag_builder.rb +18 -18
  245. data/lib/datadog/core/tag_normalizer.rb +7 -7
  246. data/lib/datadog/core/telemetry/component.rb +13 -13
  247. data/lib/datadog/core/telemetry/configuration_value.rb +38 -0
  248. data/lib/datadog/core/telemetry/emitter.rb +4 -4
  249. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +8 -6
  250. data/lib/datadog/core/telemetry/event/app_closing.rb +2 -2
  251. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +2 -2
  252. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +3 -3
  253. data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +2 -2
  254. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +2 -2
  255. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +2 -2
  256. data/lib/datadog/core/telemetry/event/app_started.rb +36 -55
  257. data/lib/datadog/core/telemetry/event/base.rb +1 -1
  258. data/lib/datadog/core/telemetry/event/distributions.rb +2 -2
  259. data/lib/datadog/core/telemetry/event/generate_metrics.rb +3 -3
  260. data/lib/datadog/core/telemetry/event/log.rb +6 -6
  261. data/lib/datadog/core/telemetry/event/message_batch.rb +1 -1
  262. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +3 -3
  263. data/lib/datadog/core/telemetry/event.rb +16 -16
  264. data/lib/datadog/core/telemetry/ext.rb +11 -11
  265. data/lib/datadog/core/telemetry/logger.rb +1 -1
  266. data/lib/datadog/core/telemetry/logging.rb +5 -5
  267. data/lib/datadog/core/telemetry/metric.rb +9 -9
  268. data/lib/datadog/core/telemetry/metrics_collection.rb +2 -2
  269. data/lib/datadog/core/telemetry/metrics_manager.rb +1 -1
  270. data/lib/datadog/core/telemetry/request.rb +6 -6
  271. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +14 -14
  272. data/lib/datadog/core/telemetry/transport/http.rb +7 -7
  273. data/lib/datadog/core/telemetry/transport/telemetry.rb +3 -3
  274. data/lib/datadog/core/telemetry/worker.rb +6 -6
  275. data/lib/datadog/core/transport/ext.rb +14 -14
  276. data/lib/datadog/core/transport/http/adapters/net.rb +4 -4
  277. data/lib/datadog/core/transport/http/adapters/test.rb +1 -1
  278. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +4 -4
  279. data/lib/datadog/core/transport/http/api/endpoint.rb +1 -1
  280. data/lib/datadog/core/transport/http/api/map.rb +1 -1
  281. data/lib/datadog/core/transport/http/builder.rb +5 -5
  282. data/lib/datadog/core/transport/http/client.rb +2 -2
  283. data/lib/datadog/core/transport/http/response.rb +1 -1
  284. data/lib/datadog/core/transport/http.rb +9 -9
  285. data/lib/datadog/core/transport/transport.rb +2 -2
  286. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +172 -20
  287. data/lib/datadog/core/utils/base64_codec.rb +3 -3
  288. data/lib/datadog/core/utils/duration.rb +1 -1
  289. data/lib/datadog/core/utils/forking.rb +2 -2
  290. data/lib/datadog/core/utils/lru_cache.rb +3 -3
  291. data/lib/datadog/core/utils/network.rb +11 -11
  292. data/lib/datadog/core/utils/only_once_successful.rb +1 -1
  293. data/lib/datadog/core/utils/safe_dup.rb +2 -1
  294. data/lib/datadog/core/utils/sequence.rb +3 -6
  295. data/lib/datadog/core/utils/spawn_monkey_patch.rb +2 -2
  296. data/lib/datadog/core/utils/time.rb +16 -54
  297. data/lib/datadog/core/utils/url.rb +1 -1
  298. data/lib/datadog/core/utils.rb +4 -4
  299. data/lib/datadog/core/workers/async.rb +1 -1
  300. data/lib/datadog/core/workers/polling.rb +2 -2
  301. data/lib/datadog/core/workers/runtime_metrics.rb +5 -5
  302. data/lib/datadog/core.rb +4 -4
  303. data/lib/datadog/data_streams/configuration.rb +3 -3
  304. data/lib/datadog/data_streams/ext.rb +1 -1
  305. data/lib/datadog/data_streams/extensions.rb +2 -2
  306. data/lib/datadog/data_streams/pathway_context.rb +25 -27
  307. data/lib/datadog/data_streams/processor.rb +92 -61
  308. data/lib/datadog/data_streams/transport/http/stats.rb +5 -5
  309. data/lib/datadog/data_streams/transport/http.rb +5 -5
  310. data/lib/datadog/data_streams/transport/stats.rb +7 -7
  311. data/lib/datadog/data_streams.rb +5 -5
  312. data/lib/datadog/di/base.rb +4 -4
  313. data/lib/datadog/di/boot.rb +26 -25
  314. data/lib/datadog/di/capture_expression_evaluator/result.rb +30 -0
  315. data/lib/datadog/di/capture_expression_evaluator.rb +39 -9
  316. data/lib/datadog/di/code_tracker.rb +6 -6
  317. data/lib/datadog/di/component.rb +119 -6
  318. data/lib/datadog/di/configuration.rb +54 -3
  319. data/lib/datadog/di/context.rb +7 -2
  320. data/lib/datadog/di/contrib/active_record.rb +8 -2
  321. data/lib/datadog/di/contrib/railtie.rb +1 -1
  322. data/lib/datadog/di/contrib.rb +5 -5
  323. data/lib/datadog/di/el/compiler.rb +113 -37
  324. data/lib/datadog/di/el/evaluator.rb +82 -2
  325. data/lib/datadog/di/el/expression.rb +13 -2
  326. data/lib/datadog/di/el.rb +3 -3
  327. data/lib/datadog/di/evaluation_failure.rb +28 -0
  328. data/lib/datadog/di/guardrails_telemetry/reason.rb +87 -0
  329. data/lib/datadog/di/guardrails_telemetry.rb +203 -0
  330. data/lib/datadog/di/instrumenter.rb +124 -23
  331. data/lib/datadog/di/logger.rb +32 -10
  332. data/lib/datadog/di/preload.rb +1 -1
  333. data/lib/datadog/di/probe.rb +9 -1
  334. data/lib/datadog/di/probe_builder.rb +25 -24
  335. data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
  336. data/lib/datadog/di/probe_file_loader.rb +5 -5
  337. data/lib/datadog/di/probe_manager.rb +57 -9
  338. data/lib/datadog/di/probe_notification_builder.rb +46 -43
  339. data/lib/datadog/di/probe_notifier_worker.rb +62 -12
  340. data/lib/datadog/di/probe_repository.rb +1 -1
  341. data/lib/datadog/di/proc_responder.rb +1 -1
  342. data/lib/datadog/di/remote.rb +52 -8
  343. data/lib/datadog/di/serializer.rb +185 -68
  344. data/lib/datadog/di/snapshot_event.rb +38 -0
  345. data/lib/datadog/di/transport/diagnostics.rb +5 -5
  346. data/lib/datadog/di/transport/http/diagnostics.rb +3 -3
  347. data/lib/datadog/di/transport/http/input.rb +2 -2
  348. data/lib/datadog/di/transport/http.rb +23 -13
  349. data/lib/datadog/di/transport/input.rb +41 -16
  350. data/lib/datadog/di/utils.rb +4 -4
  351. data/lib/datadog/di.rb +5 -5
  352. data/lib/datadog/error_tracking/collector.rb +2 -2
  353. data/lib/datadog/error_tracking/component.rb +12 -12
  354. data/lib/datadog/error_tracking/configuration.rb +2 -2
  355. data/lib/datadog/error_tracking/ext.rb +7 -7
  356. data/lib/datadog/error_tracking/extensions.rb +2 -2
  357. data/lib/datadog/error_tracking/filters.rb +4 -4
  358. data/lib/datadog/error_tracking.rb +6 -6
  359. data/lib/datadog/kit/appsec/events/v2.rb +40 -40
  360. data/lib/datadog/kit/appsec/events.rb +25 -25
  361. data/lib/datadog/kit/enable_core_dumps.rb +2 -2
  362. data/lib/datadog/kit/identity.rb +18 -18
  363. data/lib/datadog/kit/tracing/method_tracer.rb +7 -7
  364. data/lib/datadog/kit.rb +1 -1
  365. data/lib/datadog/open_feature/activation.rb +268 -0
  366. data/lib/datadog/open_feature/agentless/configuration_source.rb +246 -0
  367. data/lib/datadog/open_feature/agentless/parser.rb +43 -0
  368. data/lib/datadog/open_feature/agentless/response.rb +19 -0
  369. data/lib/datadog/open_feature/agentless/transport.rb +103 -0
  370. data/lib/datadog/open_feature/component.rb +112 -31
  371. data/lib/datadog/open_feature/configuration/agentless_endpoint.rb +90 -0
  372. data/lib/datadog/open_feature/configuration/source/resolution.rb +22 -0
  373. data/lib/datadog/open_feature/configuration/source.rb +43 -0
  374. data/lib/datadog/open_feature/configuration.rb +139 -2
  375. data/lib/datadog/open_feature/evaluation_engine.rb +36 -10
  376. data/lib/datadog/open_feature/exposures/batch_builder.rb +1 -1
  377. data/lib/datadog/open_feature/exposures/buffer.rb +1 -1
  378. data/lib/datadog/open_feature/exposures/deduplicator.rb +1 -1
  379. data/lib/datadog/open_feature/exposures/event.rb +17 -10
  380. data/lib/datadog/open_feature/exposures/reporter.rb +3 -3
  381. data/lib/datadog/open_feature/exposures/worker.rb +6 -6
  382. data/lib/datadog/open_feature/ext.rb +32 -8
  383. data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +242 -86
  384. data/lib/datadog/open_feature/flag_evaluation/writer.rb +211 -100
  385. data/lib/datadog/open_feature/hooks/evaluation_telemetry_opt_out_hook.rb +25 -0
  386. data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +28 -24
  387. data/lib/datadog/open_feature/hooks/flag_eval_metrics_hook.rb +3 -1
  388. data/lib/datadog/open_feature/hooks/span_enrichment_hook/codec.rb +58 -0
  389. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state.rb +96 -0
  390. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state_store.rb +49 -0
  391. data/lib/datadog/open_feature/hooks/span_enrichment_hook.rb +184 -0
  392. data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +24 -24
  393. data/lib/datadog/open_feature/native_evaluator.rb +24 -10
  394. data/lib/datadog/open_feature/noop_evaluator.rb +8 -3
  395. data/lib/datadog/open_feature/provider.rb +357 -17
  396. data/lib/datadog/open_feature/remote.rb +7 -7
  397. data/lib/datadog/open_feature/resolution_details.rb +4 -2
  398. data/lib/datadog/open_feature/transport.rb +19 -14
  399. data/lib/datadog/open_feature.rb +33 -3
  400. data/lib/datadog/opentelemetry/api/baggage.rb +3 -3
  401. data/lib/datadog/opentelemetry/api/context.rb +4 -4
  402. data/lib/datadog/opentelemetry/configuration/settings.rb +41 -41
  403. data/lib/datadog/opentelemetry/ext.rb +1 -1
  404. data/lib/datadog/opentelemetry/logs.rb +5 -5
  405. data/lib/datadog/opentelemetry/metrics.rb +7 -7
  406. data/lib/datadog/opentelemetry/sdk/configurator.rb +8 -8
  407. data/lib/datadog/opentelemetry/sdk/id_generator.rb +2 -2
  408. data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +6 -6
  409. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +5 -5
  410. data/lib/datadog/opentelemetry/sdk/propagator.rb +8 -8
  411. data/lib/datadog/opentelemetry/sdk/span_processor.rb +15 -15
  412. data/lib/datadog/opentelemetry/sdk/trace/span.rb +32 -32
  413. data/lib/datadog/opentelemetry/sdk.rb +2 -2
  414. data/lib/datadog/opentelemetry/signal_configuration.rb +20 -16
  415. data/lib/datadog/opentelemetry/trace.rb +4 -1
  416. data/lib/datadog/opentelemetry.rb +8 -8
  417. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +10 -2
  418. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +5 -7
  419. data/lib/datadog/profiling/collectors/info.rb +40 -13
  420. data/lib/datadog/profiling/collectors/thread_context.rb +6 -17
  421. data/lib/datadog/profiling/component.rb +33 -39
  422. data/lib/datadog/profiling/exporter.rb +11 -11
  423. data/lib/datadog/profiling/http_transport.rb +1 -1
  424. data/lib/datadog/profiling/sequence_tracker.rb +1 -1
  425. data/lib/datadog/profiling/tag_builder.rb +19 -19
  426. data/lib/datadog/profiling/tasks/exec.rb +1 -1
  427. data/lib/datadog/profiling.rb +31 -27
  428. data/lib/datadog/single_step_instrument.rb +1 -1
  429. data/lib/datadog/symbol_database/component.rb +15 -15
  430. data/lib/datadog/symbol_database/configuration.rb +3 -3
  431. data/lib/datadog/symbol_database/extensions.rb +2 -2
  432. data/lib/datadog/symbol_database/extractor.rb +141 -159
  433. data/lib/datadog/symbol_database/file_hash.rb +3 -3
  434. data/lib/datadog/symbol_database/logger.rb +1 -1
  435. data/lib/datadog/symbol_database/remote.rb +21 -6
  436. data/lib/datadog/symbol_database/scope.rb +2 -2
  437. data/lib/datadog/symbol_database/scope_batcher.rb +2 -2
  438. data/lib/datadog/symbol_database/service_version.rb +4 -4
  439. data/lib/datadog/symbol_database/symbol.rb +1 -1
  440. data/lib/datadog/symbol_database/transport/http/endpoint.rb +1 -1
  441. data/lib/datadog/symbol_database/transport/http.rb +6 -6
  442. data/lib/datadog/symbol_database/transport.rb +4 -4
  443. data/lib/datadog/symbol_database/uploader.rb +22 -22
  444. data/lib/datadog/symbol_database.rb +2 -2
  445. data/lib/datadog/tracing/analytics.rb +1 -1
  446. data/lib/datadog/tracing/buffer.rb +5 -5
  447. data/lib/datadog/tracing/client_ip.rb +4 -4
  448. data/lib/datadog/tracing/component.rb +51 -9
  449. data/lib/datadog/tracing/configuration/dynamic/option.rb +4 -0
  450. data/lib/datadog/tracing/configuration/dynamic.rb +13 -11
  451. data/lib/datadog/tracing/configuration/ext.rb +46 -42
  452. data/lib/datadog/tracing/configuration/http.rb +2 -2
  453. data/lib/datadog/tracing/configuration/settings.rb +52 -16
  454. data/lib/datadog/tracing/context.rb +25 -3
  455. data/lib/datadog/tracing/context_provider.rb +19 -7
  456. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  457. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -4
  458. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +5 -5
  459. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -4
  460. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +5 -5
  461. data/lib/datadog/tracing/contrib/action_cable/events.rb +5 -5
  462. data/lib/datadog/tracing/contrib/action_cable/ext.rb +18 -18
  463. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -4
  464. data/lib/datadog/tracing/contrib/action_cable/integration.rb +7 -7
  465. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  466. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  467. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
  468. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +8 -8
  469. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +4 -4
  470. data/lib/datadog/tracing/contrib/action_mailer/events.rb +3 -3
  471. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +18 -18
  472. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +7 -7
  473. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  474. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +9 -9
  475. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  476. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +4 -4
  477. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +4 -4
  478. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +3 -3
  479. data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -10
  480. data/lib/datadog/tracing/contrib/action_pack/integration.rb +7 -7
  481. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +3 -3
  482. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  483. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +3 -3
  484. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  485. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +6 -6
  486. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +6 -6
  487. data/lib/datadog/tracing/contrib/action_view/events.rb +3 -3
  488. data/lib/datadog/tracing/contrib/action_view/ext.rb +10 -10
  489. data/lib/datadog/tracing/contrib/action_view/integration.rb +11 -11
  490. data/lib/datadog/tracing/contrib/action_view/patcher.rb +5 -5
  491. data/lib/datadog/tracing/contrib/action_view/utils.rb +2 -2
  492. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +2 -2
  493. data/lib/datadog/tracing/contrib/active_job/data_streams.rb +2 -2
  494. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  495. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +5 -5
  496. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +5 -5
  497. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +5 -5
  498. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +5 -5
  499. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +5 -5
  500. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +5 -5
  501. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  502. data/lib/datadog/tracing/contrib/active_job/ext.rb +23 -23
  503. data/lib/datadog/tracing/contrib/active_job/integration.rb +7 -7
  504. data/lib/datadog/tracing/contrib/active_job/patcher.rb +7 -7
  505. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  506. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -4
  507. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +6 -6
  508. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +6 -6
  509. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +3 -3
  510. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +10 -10
  511. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +5 -5
  512. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -3
  513. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +1 -1
  514. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +7 -7
  515. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +4 -4
  516. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  517. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +8 -8
  518. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +10 -9
  519. data/lib/datadog/tracing/contrib/active_record/events.rb +3 -3
  520. data/lib/datadog/tracing/contrib/active_record/ext.rb +15 -15
  521. data/lib/datadog/tracing/contrib/active_record/integration.rb +11 -11
  522. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  523. data/lib/datadog/tracing/contrib/active_record/utils.rb +3 -3
  524. data/lib/datadog/tracing/contrib/active_support/cache/event.rb +1 -1
  525. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +12 -12
  526. data/lib/datadog/tracing/contrib/active_support/cache/events.rb +1 -1
  527. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +4 -4
  528. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +5 -5
  529. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +4 -4
  530. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +3 -3
  531. data/lib/datadog/tracing/contrib/active_support/ext.rb +16 -16
  532. data/lib/datadog/tracing/contrib/active_support/integration.rb +8 -8
  533. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  534. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +2 -2
  535. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +1 -1
  536. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  537. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  538. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  539. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +3 -3
  540. data/lib/datadog/tracing/contrib/aws/ext.rb +26 -26
  541. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -5
  542. data/lib/datadog/tracing/contrib/aws/integration.rb +9 -9
  543. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +1 -1
  544. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  545. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +2 -2
  546. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +2 -2
  547. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +4 -4
  548. data/lib/datadog/tracing/contrib/aws/service/s3.rb +2 -2
  549. data/lib/datadog/tracing/contrib/aws/service/sns.rb +3 -3
  550. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +3 -3
  551. data/lib/datadog/tracing/contrib/aws/service/states.rb +5 -5
  552. data/lib/datadog/tracing/contrib/aws/services.rb +14 -14
  553. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
  554. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  555. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  556. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +2 -2
  557. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  558. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +6 -6
  559. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +4 -4
  560. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
  561. data/lib/datadog/tracing/contrib/configurable.rb +2 -2
  562. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  563. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  564. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
  565. data/lib/datadog/tracing/contrib/dalli/ext.rb +13 -13
  566. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +5 -5
  567. data/lib/datadog/tracing/contrib/dalli/integration.rb +7 -7
  568. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  569. data/lib/datadog/tracing/contrib/dalli/quantize.rb +2 -2
  570. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +2 -2
  571. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +14 -14
  572. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +5 -5
  573. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +3 -3
  574. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +5 -5
  575. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
  576. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +15 -15
  577. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +6 -6
  578. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +10 -10
  579. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +3 -3
  580. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -2
  581. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +18 -13
  582. data/lib/datadog/tracing/contrib/ethon/ext.rb +13 -13
  583. data/lib/datadog/tracing/contrib/ethon/integration.rb +6 -6
  584. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +3 -3
  585. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  586. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -5
  587. data/lib/datadog/tracing/contrib/excon/ext.rb +11 -11
  588. data/lib/datadog/tracing/contrib/excon/integration.rb +6 -6
  589. data/lib/datadog/tracing/contrib/excon/middleware.rb +17 -10
  590. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  591. data/lib/datadog/tracing/contrib/ext.rb +18 -18
  592. data/lib/datadog/tracing/contrib/extensions.rb +2 -2
  593. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +4 -4
  594. data/lib/datadog/tracing/contrib/faraday/ext.rb +11 -11
  595. data/lib/datadog/tracing/contrib/faraday/integration.rb +6 -6
  596. data/lib/datadog/tracing/contrib/faraday/middleware.rb +17 -11
  597. data/lib/datadog/tracing/contrib/faraday/patcher.rb +6 -6
  598. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +4 -4
  599. data/lib/datadog/tracing/contrib/grape/endpoint.rb +51 -24
  600. data/lib/datadog/tracing/contrib/grape/ext.rb +15 -15
  601. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +3 -3
  602. data/lib/datadog/tracing/contrib/grape/integration.rb +5 -5
  603. data/lib/datadog/tracing/contrib/grape/patcher.rb +5 -5
  604. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +1 -1
  605. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -3
  606. data/lib/datadog/tracing/contrib/graphql/ext.rb +9 -9
  607. data/lib/datadog/tracing/contrib/graphql/integration.rb +9 -9
  608. data/lib/datadog/tracing/contrib/graphql/patcher.rb +7 -7
  609. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +37 -37
  610. data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +2 -2
  611. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +2 -2
  612. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +8 -8
  613. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +8 -8
  614. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +6 -6
  615. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
  616. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +9 -9
  617. data/lib/datadog/tracing/contrib/grpc/ext.rb +14 -14
  618. data/lib/datadog/tracing/contrib/grpc/formatting.rb +7 -7
  619. data/lib/datadog/tracing/contrib/grpc/integration.rb +5 -5
  620. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +1 -1
  621. data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -3
  622. data/lib/datadog/tracing/contrib/grpc.rb +6 -6
  623. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +3 -3
  624. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +2 -2
  625. data/lib/datadog/tracing/contrib/hanami/ext.rb +8 -8
  626. data/lib/datadog/tracing/contrib/hanami/integration.rb +6 -6
  627. data/lib/datadog/tracing/contrib/hanami/patcher.rb +5 -5
  628. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +3 -3
  629. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +5 -4
  630. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -1
  631. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +4 -4
  632. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +3 -3
  633. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +8 -8
  634. data/lib/datadog/tracing/contrib/http/ext.rb +11 -11
  635. data/lib/datadog/tracing/contrib/http/instrumentation.rb +22 -7
  636. data/lib/datadog/tracing/contrib/http/integration.rb +7 -7
  637. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  638. data/lib/datadog/tracing/contrib/http.rb +6 -6
  639. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +4 -4
  640. data/lib/datadog/tracing/contrib/httpclient/ext.rb +11 -11
  641. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +13 -7
  642. data/lib/datadog/tracing/contrib/httpclient/integration.rb +6 -6
  643. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  644. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +4 -4
  645. data/lib/datadog/tracing/contrib/httprb/ext.rb +11 -11
  646. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +16 -10
  647. data/lib/datadog/tracing/contrib/httprb/integration.rb +7 -7
  648. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  649. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  650. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  651. data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
  652. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +7 -3
  653. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +4 -4
  654. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +4 -4
  655. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +5 -5
  656. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +5 -5
  657. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +5 -5
  658. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +5 -5
  659. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +10 -5
  660. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +10 -5
  661. data/lib/datadog/tracing/contrib/kafka/events.rb +10 -10
  662. data/lib/datadog/tracing/contrib/kafka/ext.rb +40 -40
  663. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +2 -2
  664. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +4 -4
  665. data/lib/datadog/tracing/contrib/kafka/integration.rb +6 -6
  666. data/lib/datadog/tracing/contrib/kafka/patcher.rb +5 -5
  667. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +2 -2
  668. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +9 -9
  669. data/lib/datadog/tracing/contrib/karafka/ext.rb +13 -13
  670. data/lib/datadog/tracing/contrib/karafka/integration.rb +5 -5
  671. data/lib/datadog/tracing/contrib/karafka/monitor.rb +14 -14
  672. data/lib/datadog/tracing/contrib/karafka/patcher.rb +8 -8
  673. data/lib/datadog/tracing/contrib/karafka.rb +6 -6
  674. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  675. data/lib/datadog/tracing/contrib/lograge/ext.rb +1 -1
  676. data/lib/datadog/tracing/contrib/lograge/integration.rb +5 -5
  677. data/lib/datadog/tracing/contrib/lograge/patcher.rb +9 -9
  678. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
  679. data/lib/datadog/tracing/contrib/mongodb/ext.rb +18 -18
  680. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  681. data/lib/datadog/tracing/contrib/mongodb/integration.rb +7 -7
  682. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
  683. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  684. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +13 -13
  685. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +3 -3
  686. data/lib/datadog/tracing/contrib/mysql2/ext.rb +11 -11
  687. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +6 -6
  688. data/lib/datadog/tracing/contrib/mysql2/integration.rb +5 -5
  689. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  690. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +2 -2
  691. data/lib/datadog/tracing/contrib/opensearch/ext.rb +23 -23
  692. data/lib/datadog/tracing/contrib/opensearch/integration.rb +6 -6
  693. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +13 -13
  694. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +4 -4
  695. data/lib/datadog/tracing/contrib/patchable.rb +1 -1
  696. data/lib/datadog/tracing/contrib/patcher.rb +3 -3
  697. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +3 -3
  698. data/lib/datadog/tracing/contrib/pg/ext.rb +19 -19
  699. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +6 -6
  700. data/lib/datadog/tracing/contrib/pg/integration.rb +5 -5
  701. data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -2
  702. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
  703. data/lib/datadog/tracing/contrib/presto/ext.rb +21 -21
  704. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -2
  705. data/lib/datadog/tracing/contrib/presto/integration.rb +6 -6
  706. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  707. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +2 -2
  708. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +17 -17
  709. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +1 -1
  710. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +5 -5
  711. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +2 -2
  712. data/lib/datadog/tracing/contrib/que/ext.rb +19 -19
  713. data/lib/datadog/tracing/contrib/que/integration.rb +6 -6
  714. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  715. data/lib/datadog/tracing/contrib/que/tracer.rb +2 -2
  716. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +3 -3
  717. data/lib/datadog/tracing/contrib/racecar/event.rb +4 -4
  718. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +3 -3
  719. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +3 -3
  720. data/lib/datadog/tracing/contrib/racecar/events/message.rb +3 -3
  721. data/lib/datadog/tracing/contrib/racecar/events.rb +4 -4
  722. data/lib/datadog/tracing/contrib/racecar/ext.rb +18 -18
  723. data/lib/datadog/tracing/contrib/racecar/integration.rb +5 -5
  724. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  725. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +3 -3
  726. data/lib/datadog/tracing/contrib/rack/ext.rb +33 -33
  727. data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -3
  728. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +4 -4
  729. data/lib/datadog/tracing/contrib/rack/integration.rb +6 -6
  730. data/lib/datadog/tracing/contrib/rack/middlewares.rb +24 -24
  731. data/lib/datadog/tracing/contrib/rack/patcher.rb +3 -3
  732. data/lib/datadog/tracing/contrib/rack/request_queue.rb +3 -3
  733. data/lib/datadog/tracing/contrib/rack/route_inference.rb +11 -11
  734. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +16 -16
  735. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  736. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +3 -3
  737. data/lib/datadog/tracing/contrib/rails/ext.rb +15 -15
  738. data/lib/datadog/tracing/contrib/rails/framework.rb +11 -11
  739. data/lib/datadog/tracing/contrib/rails/integration.rb +5 -5
  740. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
  741. data/lib/datadog/tracing/contrib/rails/patcher.rb +8 -8
  742. data/lib/datadog/tracing/contrib/rails/railtie.rb +4 -4
  743. data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
  744. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +3 -3
  745. data/lib/datadog/tracing/contrib/rake/ext.rb +12 -12
  746. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
  747. data/lib/datadog/tracing/contrib/rake/integration.rb +5 -5
  748. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -3
  749. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +3 -3
  750. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
  751. data/lib/datadog/tracing/contrib/redis/ext.rb +16 -16
  752. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -6
  753. data/lib/datadog/tracing/contrib/redis/integration.rb +7 -7
  754. data/lib/datadog/tracing/contrib/redis/patcher.rb +10 -10
  755. data/lib/datadog/tracing/contrib/redis/quantize.rb +39 -5
  756. data/lib/datadog/tracing/contrib/redis/tags.rb +5 -5
  757. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +14 -8
  758. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +2 -2
  759. data/lib/datadog/tracing/contrib/resque/ext.rb +7 -7
  760. data/lib/datadog/tracing/contrib/resque/integration.rb +5 -5
  761. data/lib/datadog/tracing/contrib/resque/patcher.rb +3 -3
  762. data/lib/datadog/tracing/contrib/resque/resque_job.rb +5 -5
  763. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +2 -2
  764. data/lib/datadog/tracing/contrib/rest_client/ext.rb +10 -10
  765. data/lib/datadog/tracing/contrib/rest_client/integration.rb +6 -6
  766. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  767. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +15 -8
  768. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +2 -2
  769. data/lib/datadog/tracing/contrib/roda/ext.rb +6 -6
  770. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +4 -4
  771. data/lib/datadog/tracing/contrib/roda/integration.rb +6 -6
  772. data/lib/datadog/tracing/contrib/roda/patcher.rb +3 -3
  773. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  774. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +1 -1
  775. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +5 -5
  776. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  777. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  778. data/lib/datadog/tracing/contrib/sequel/database.rb +6 -10
  779. data/lib/datadog/tracing/contrib/sequel/dataset.rb +5 -5
  780. data/lib/datadog/tracing/contrib/sequel/ext.rb +12 -8
  781. data/lib/datadog/tracing/contrib/sequel/integration.rb +5 -5
  782. data/lib/datadog/tracing/contrib/sequel/jdbc_connection_string.rb +140 -0
  783. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  784. data/lib/datadog/tracing/contrib/sequel/utils.rb +101 -9
  785. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +2 -2
  786. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +12 -12
  787. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +6 -6
  788. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  789. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -2
  790. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +8 -8
  791. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +2 -2
  792. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +10 -10
  793. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +30 -30
  794. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +7 -7
  795. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +8 -8
  796. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +13 -13
  797. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +9 -9
  798. data/lib/datadog/tracing/contrib/sidekiq.rb +6 -6
  799. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +3 -3
  800. data/lib/datadog/tracing/contrib/sinatra/env.rb +6 -6
  801. data/lib/datadog/tracing/contrib/sinatra/ext.rb +17 -17
  802. data/lib/datadog/tracing/contrib/sinatra/framework.rb +1 -1
  803. data/lib/datadog/tracing/contrib/sinatra/integration.rb +5 -5
  804. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
  805. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +10 -10
  806. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +8 -8
  807. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  808. data/lib/datadog/tracing/contrib/sneakers/ext.rb +12 -12
  809. data/lib/datadog/tracing/contrib/sneakers/integration.rb +7 -7
  810. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  811. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +4 -4
  812. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +2 -2
  813. data/lib/datadog/tracing/contrib/status_range_env_parser.rb +2 -2
  814. data/lib/datadog/tracing/contrib/status_range_matcher.rb +1 -1
  815. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +2 -2
  816. data/lib/datadog/tracing/contrib/stripe/ext.rb +12 -12
  817. data/lib/datadog/tracing/contrib/stripe/integration.rb +5 -5
  818. data/lib/datadog/tracing/contrib/stripe/patcher.rb +2 -2
  819. data/lib/datadog/tracing/contrib/stripe/request.rb +3 -3
  820. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  821. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +1 -1
  822. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +13 -13
  823. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +4 -4
  824. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +5 -5
  825. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -4
  826. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +3 -3
  827. data/lib/datadog/tracing/contrib/trilogy/ext.rb +11 -11
  828. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +6 -6
  829. data/lib/datadog/tracing/contrib/trilogy/integration.rb +5 -5
  830. data/lib/datadog/tracing/contrib/trilogy/patcher.rb +2 -2
  831. data/lib/datadog/tracing/contrib/utils/database.rb +5 -5
  832. data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +2 -2
  833. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +118 -13
  834. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +2 -2
  835. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +9 -9
  836. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +4 -4
  837. data/lib/datadog/tracing/contrib/waterdrop/integration.rb +5 -5
  838. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +2 -2
  839. data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +7 -7
  840. data/lib/datadog/tracing/contrib/waterdrop/producer.rb +3 -3
  841. data/lib/datadog/tracing/contrib/waterdrop.rb +6 -6
  842. data/lib/datadog/tracing/contrib.rb +54 -54
  843. data/lib/datadog/tracing/correlation.rb +12 -12
  844. data/lib/datadog/tracing/diagnostics/environment_logger.rb +12 -11
  845. data/lib/datadog/tracing/diagnostics/ext.rb +19 -19
  846. data/lib/datadog/tracing/diagnostics/health.rb +1 -1
  847. data/lib/datadog/tracing/distributed/b3_multi.rb +8 -8
  848. data/lib/datadog/tracing/distributed/b3_single.rb +4 -4
  849. data/lib/datadog/tracing/distributed/baggage.rb +27 -29
  850. data/lib/datadog/tracing/distributed/datadog.rb +23 -23
  851. data/lib/datadog/tracing/distributed/fetcher.rb +1 -1
  852. data/lib/datadog/tracing/distributed/helpers.rb +3 -3
  853. data/lib/datadog/tracing/distributed/propagation.rb +15 -12
  854. data/lib/datadog/tracing/distributed/propagation_policy.rb +5 -0
  855. data/lib/datadog/tracing/distributed/trace_context.rb +21 -278
  856. data/lib/datadog/tracing/distributed/trace_state/datadog.rb +233 -0
  857. data/lib/datadog/tracing/distributed/trace_state/ext.rb +44 -0
  858. data/lib/datadog/tracing/distributed/trace_state/open_telemetry.rb +156 -0
  859. data/lib/datadog/tracing/distributed/trace_state.rb +121 -0
  860. data/lib/datadog/tracing/event.rb +1 -1
  861. data/lib/datadog/tracing/ext.rb +1 -1
  862. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  863. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  864. data/lib/datadog/tracing/metadata/ext.rb +72 -69
  865. data/lib/datadog/tracing/metadata/metastruct.rb +1 -1
  866. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +1 -1
  867. data/lib/datadog/tracing/metadata/tagging.rb +3 -3
  868. data/lib/datadog/tracing/metadata.rb +4 -4
  869. data/lib/datadog/tracing/otel_thread_context.rb +97 -0
  870. data/lib/datadog/tracing/pipeline/span_filter.rb +2 -2
  871. data/lib/datadog/tracing/pipeline.rb +2 -2
  872. data/lib/datadog/tracing/remote.rb +250 -44
  873. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  874. data/lib/datadog/tracing/sampling/ext.rb +8 -8
  875. data/lib/datadog/tracing/sampling/matcher.rb +4 -4
  876. data/lib/datadog/tracing/sampling/priority_sampler.rb +4 -4
  877. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +3 -3
  878. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +2 -2
  879. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -2
  880. data/lib/datadog/tracing/sampling/rule.rb +4 -4
  881. data/lib/datadog/tracing/sampling/rule_sampler.rb +14 -12
  882. data/lib/datadog/tracing/sampling/sampler.rb +2 -2
  883. data/lib/datadog/tracing/sampling/span/ext.rb +3 -3
  884. data/lib/datadog/tracing/sampling/span/matcher.rb +2 -2
  885. data/lib/datadog/tracing/sampling/span/rule.rb +1 -1
  886. data/lib/datadog/tracing/sampling/span/rule_parser.rb +8 -8
  887. data/lib/datadog/tracing/span.rb +9 -9
  888. data/lib/datadog/tracing/span_event.rb +5 -5
  889. data/lib/datadog/tracing/span_operation.rb +22 -22
  890. data/lib/datadog/tracing/sync_writer.rb +12 -7
  891. data/lib/datadog/tracing/trace_digest.rb +22 -4
  892. data/lib/datadog/tracing/trace_operation.rb +33 -21
  893. data/lib/datadog/tracing/trace_segment.rb +10 -10
  894. data/lib/datadog/tracing/tracer.rb +43 -22
  895. data/lib/datadog/tracing/transport/http/client.rb +4 -4
  896. data/lib/datadog/tracing/transport/http/statistics.rb +2 -2
  897. data/lib/datadog/tracing/transport/http/telemetry.rb +94 -0
  898. data/lib/datadog/tracing/transport/http/traces.rb +10 -8
  899. data/lib/datadog/tracing/transport/http.rb +10 -10
  900. data/lib/datadog/tracing/transport/io/client.rb +2 -2
  901. data/lib/datadog/tracing/transport/io/response.rb +1 -1
  902. data/lib/datadog/tracing/transport/io/traces.rb +5 -5
  903. data/lib/datadog/tracing/transport/io.rb +3 -3
  904. data/lib/datadog/tracing/transport/native/response.rb +71 -0
  905. data/lib/datadog/tracing/transport/native/telemetry.rb +17 -0
  906. data/lib/datadog/tracing/transport/native.rb +395 -0
  907. data/lib/datadog/tracing/transport/serializable_trace.rb +19 -19
  908. data/lib/datadog/tracing/transport/span_events_negotiation.rb +41 -0
  909. data/lib/datadog/tracing/transport/statistics.rb +2 -2
  910. data/lib/datadog/tracing/transport/telemetry.rb +62 -0
  911. data/lib/datadog/tracing/transport/trace_formatter.rb +23 -13
  912. data/lib/datadog/tracing/transport/traces.rb +93 -46
  913. data/lib/datadog/tracing/utils.rb +2 -2
  914. data/lib/datadog/tracing/workers.rb +2 -2
  915. data/lib/datadog/tracing/writer.rb +22 -9
  916. data/lib/datadog/tracing.rb +3 -3
  917. data/lib/datadog/version.rb +4 -4
  918. data/lib/datadog.rb +13 -13
  919. metadata +55 -13
  920. data/lib/datadog/ai_guard/evaluation/content_builder.rb +0 -31
  921. data/lib/datadog/appsec/utils/hash_coercion.rb +0 -23
  922. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +0 -69
@@ -1,36 +1,36 @@
1
1
  # rubocop:disable Style/StderrPuts
2
2
  # rubocop:disable Style/GlobalVars
3
3
 
4
- require 'rubygems'
5
- require_relative '../libdatadog_extconf_helpers'
4
+ require "rubygems"
5
+ require_relative "../libdatadog_extconf_helpers"
6
6
 
7
7
  def skip_building_extension!(reason)
8
8
  $stderr.puts(
9
9
  "WARN: Skipping build of libdatadog_api (#{reason}). Some functionality will not be available."
10
10
  )
11
11
 
12
- fail_install_if_missing_extension = ENV['DD_FAIL_INSTALL_IF_MISSING_EXTENSION'].to_s.strip.downcase == 'true'
12
+ fail_install_if_missing_extension = ENV["DD_FAIL_INSTALL_IF_MISSING_EXTENSION"].to_s.strip.downcase == "true"
13
13
 
14
14
  if fail_install_if_missing_extension
15
- require 'mkmf'
15
+ require "mkmf"
16
16
  Logging.message("[datadog] Failure cause: #{reason}")
17
17
  else
18
- File.write('Makefile', 'all install clean: # dummy makefile that does nothing')
18
+ File.write("Makefile", "all install clean: # dummy makefile that does nothing")
19
19
  end
20
20
 
21
21
  exit
22
22
  end
23
23
 
24
- if ENV['DD_NO_EXTENSION'].to_s.strip.downcase == 'true'
25
- skip_building_extension!('the `DD_NO_EXTENSION` environment variable is/was set to `true` during installation')
24
+ if ENV["DD_NO_EXTENSION"].to_s.strip.downcase == "true"
25
+ skip_building_extension!("the `DD_NO_EXTENSION` environment variable is/was set to `true` during installation")
26
26
  end
27
- skip_building_extension!('current Ruby VM is not supported') if RUBY_ENGINE != 'ruby'
28
- skip_building_extension!('Microsoft Windows is not supported') if Gem.win_platform?
27
+ skip_building_extension!("current Ruby VM is not supported") unless %w[ruby truffleruby].include?(RUBY_ENGINE)
28
+ skip_building_extension!("Microsoft Windows is not supported") if Gem.win_platform?
29
29
 
30
30
  libdatadog_issue = Datadog::LibdatadogExtconfHelpers.load_libdatadog_or_get_issue
31
31
  skip_building_extension!("issue setting up `libdatadog` gem: #{libdatadog_issue}") if libdatadog_issue
32
32
 
33
- require 'mkmf'
33
+ require "mkmf"
34
34
  Datadog::LibdatadogExtconfHelpers.dump_mkmf_log_on_failure!
35
35
 
36
36
  # We must *never* `append_cflags "-Wall"` or `append_cflags "-Wextra"`, because those add the flag at the end,
@@ -39,30 +39,30 @@ Datadog::LibdatadogExtconfHelpers.dump_mkmf_log_on_failure!
39
39
 
40
40
  # Because we can't control what compiler versions our customers use, shipping with -Werror by default is a no-go.
41
41
  # But we can enable it in CI, so that we quickly spot any new warnings that just got introduced.
42
- append_cflags '-Werror' if ENV['DATADOG_GEM_CI'] == 'true'
42
+ append_cflags "-Werror" if ENV["DATADOG_GEM_CI"] == "true"
43
43
 
44
44
  # TEMPORARY STOPGAP: libdatadog v36's vendored `common.h` ships duplicate typedefs
45
45
  # (a header-dedup regression), which `-Werror` turns into fatal
46
46
  # `-Wtypedef-redefinition` errors under C11/gnu11. Keep it a warning until a fixed
47
47
  # header lands upstream in libdatadog/libdatadog-rb. Remove this once that ships.
48
- append_cflags '-Wno-error=typedef-redefinition' if ENV['DATADOG_GEM_CI'] == 'true'
48
+ append_cflags "-Wno-error=typedef-redefinition" if ENV["DATADOG_GEM_CI"] == "true"
49
49
 
50
50
  # Older gcc releases may not default to C99 and we need to ask for this. This is also used:
51
51
  # * by upstream Ruby -- search for gnu99 in the codebase
52
52
  # * by msgpack, another datadog gem dependency
53
53
  # (https://github.com/msgpack/msgpack-ruby/blob/18ce08f6d612fe973843c366ac9a0b74c4e50599/ext/msgpack/extconf.rb#L8)
54
54
  # @ivoanjo: We could probably start using C11/gnu11 for non macOS-too but it's somewhat hard to validate so I chickened out for now
55
- append_cflags RUBY_PLATFORM.include?('darwin') ? '-std=gnu11' : '-std=gnu99'
55
+ append_cflags RUBY_PLATFORM.include?("darwin") ? "-std=gnu11" : "-std=gnu99"
56
56
 
57
57
  # Allow defining variables at any point in a function
58
- append_cflags '-Wno-declaration-after-statement'
58
+ append_cflags "-Wno-declaration-after-statement"
59
59
 
60
60
  # If we forget to include a Ruby header, the function call may still appear to work, but then
61
61
  # cause a segfault later. Let's ensure that never happens.
62
- append_cflags '-Werror-implicit-function-declaration'
62
+ append_cflags "-Werror-implicit-function-declaration"
63
63
 
64
64
  # Warn on unused parameters to functions. Use `DDTRACE_UNUSED` to mark things as known-to-not-be-used.
65
- append_cflags '-Wunused-parameter'
65
+ append_cflags "-Wunused-parameter"
66
66
 
67
67
  # The native extension is not intended to expose any symbols/functions for other native libraries to use;
68
68
  # the sole exception being `Init_libdatadog_api` which needs to be visible for Ruby to call it when
@@ -70,22 +70,22 @@ append_cflags '-Wunused-parameter'
70
70
  #
71
71
  # By setting this compiler flag, we tell it to assume that everything is private unless explicitly stated.
72
72
  # For more details see https://gcc.gnu.org/wiki/Visibility
73
- append_cflags '-fvisibility=hidden'
73
+ append_cflags "-fvisibility=hidden"
74
74
 
75
75
  # Avoid legacy C definitions
76
- append_cflags '-Wold-style-definition'
76
+ append_cflags "-Wold-style-definition"
77
77
 
78
- if ENV['DDTRACE_DEBUG'] == 'true'
79
- $defs << '-DDD_DEBUG'
80
- CONFIG['optflags'] = '-O0'
81
- CONFIG['debugflags'] = '-ggdb3'
78
+ if ENV["DDTRACE_DEBUG"] == "true"
79
+ $defs << "-DDD_DEBUG"
80
+ CONFIG["optflags"] = "-O0"
81
+ CONFIG["debugflags"] = "-ggdb3"
82
82
  end
83
83
 
84
84
  # If we got here, libdatadog is available and loaded
85
85
  $stderr.puts("Using libdatadog #{Libdatadog::VERSION} from #{Libdatadog.pkgconfig_folder}")
86
86
 
87
87
  unless Datadog::LibdatadogExtconfHelpers.configure_libdatadog(extconf_folder: __dir__)
88
- skip_building_extension!('there was a problem in setting up the `libdatadog` dependency')
88
+ skip_building_extension!("there was a problem in setting up the `libdatadog` dependency")
89
89
  end
90
90
 
91
91
  Datadog::LibdatadogExtconfHelpers.add_libdatadog_version_define
@@ -96,7 +96,12 @@ Datadog::LibdatadogExtconfHelpers.add_libdatadog_version_define
96
96
  # When requiring, we need to use the exact same string, including the version and the platform.
97
97
  EXTENSION_NAME = "libdatadog_api.#{RUBY_VERSION[/\d+.\d+/]}_#{RUBY_PLATFORM}".freeze
98
98
 
99
- have_func('rb_iseq_type')
99
+ have_func("rb_iseq_type")
100
+
101
+ $defs << "-DHAVE_RB_IMEMO_NAME" if RUBY_VERSION >= "3.0"
102
+ $defs << "-DHAVE_SHIFTED_IMEMO_MASK" if RUBY_VERSION >= "4.1"
103
+ $defs << "-DHAVE_RUBY_THREAD_STORAGE_API" if RUBY_VERSION >= "3.3"
104
+ $defs << "-DHAVE_RUBY_THREAD_HAS_GVL_P" if have_func("ruby_thread_has_gvl_p")
100
105
 
101
106
  create_makefile(EXTENSION_NAME)
102
107
 
@@ -13,6 +13,7 @@
13
13
  // Forward declarations
14
14
  static VALUE configuration_new(VALUE klass, VALUE json_str);
15
15
  static void configuration_free(void *ptr);
16
+ static VALUE configuration_get_observe_full_evaluation_data(VALUE self);
16
17
  static VALUE configuration_get_assignment(
17
18
  VALUE self, VALUE flag_key, VALUE expected_type, VALUE context);
18
19
 
@@ -21,6 +22,7 @@ static VALUE resolution_details_get_raw_value(VALUE self);
21
22
  static VALUE resolution_details_get_flag_type(VALUE self);
22
23
  static VALUE resolution_details_get_variant(VALUE self);
23
24
  static VALUE resolution_details_get_allocation_key(VALUE self);
25
+ static VALUE resolution_details_get_serial_id(VALUE self);
24
26
  static VALUE resolution_details_get_reason(VALUE self);
25
27
  static VALUE resolution_details_get_error_code(VALUE self);
26
28
  static VALUE resolution_details_get_error_message(VALUE self);
@@ -93,6 +95,7 @@ void feature_flags_init(VALUE core_module) {
93
95
  rb_undef_alloc_func(configuration_class);
94
96
  rb_define_singleton_method(configuration_class, "new", configuration_new, 1);
95
97
  rb_define_method(configuration_class, "get_assignment", configuration_get_assignment, 3);
98
+ rb_define_method(configuration_class, "observe_full_evaluation_data", configuration_get_observe_full_evaluation_data, 0);
96
99
 
97
100
  rb_gc_register_address(&resolution_details_class);
98
101
  resolution_details_class = rb_define_class_under(feature_flags_module, "ResolutionDetails", rb_cObject);
@@ -101,6 +104,7 @@ void feature_flags_init(VALUE core_module) {
101
104
  rb_define_method(resolution_details_class, "flag_type", resolution_details_get_flag_type, 0);
102
105
  rb_define_method(resolution_details_class, "variant", resolution_details_get_variant, 0);
103
106
  rb_define_method(resolution_details_class, "allocation_key", resolution_details_get_allocation_key, 0);
107
+ rb_define_method(resolution_details_class, "serial_id", resolution_details_get_serial_id, 0);
104
108
  rb_define_method(resolution_details_class, "reason", resolution_details_get_reason, 0);
105
109
  rb_define_method(resolution_details_class, "error_code", resolution_details_get_error_code, 0);
106
110
  rb_define_method(resolution_details_class, "error_message", resolution_details_get_error_message, 0);
@@ -135,6 +139,12 @@ static VALUE configuration_new(VALUE klass, VALUE json_str) {
135
139
  return TypedData_Wrap_Struct(klass, &configuration_data_type, result.ok);
136
140
  }
137
141
 
142
+ static VALUE configuration_get_observe_full_evaluation_data(VALUE self) {
143
+ ddog_ffe_Handle_Configuration configuration =
144
+ (ddog_ffe_Handle_Configuration)rb_check_typeddata(self, &configuration_data_type);
145
+ return ddog_ffe_configuration_get_observe_full_evaluation_data(configuration) ? Qtrue : Qfalse;
146
+ }
147
+
138
148
  static void configuration_free(void *ptr) {
139
149
  ddog_ffe_Handle_Configuration config = (ddog_ffe_Handle_Configuration)ptr;
140
150
  ddog_ffe_configuration_drop(&config);
@@ -421,6 +431,30 @@ static VALUE resolution_details_get_allocation_key(VALUE self) {
421
431
  return str_from_borrow(allocation_key);
422
432
  }
423
433
 
434
+ /*
435
+ * call-seq:
436
+ * resolution_details.serial_id() -> Integer or nil
437
+ *
438
+ * Get the split serial id assigned for this evaluation.
439
+ *
440
+ * libdatadog returns an optional 32-bit integer (`ddog_Option_I32`, a tagged
441
+ * union). When the assignment carries a serial id the tag is
442
+ * DDOG_OPTION_I32_SOME_I32 and the value is in the `.some` field; otherwise the
443
+ * tag is DDOG_OPTION_I32_NONE_I32 and we return nil. This is consumed by the
444
+ * APM span-enrichment hook as `__dd_split_serial_id`.
445
+ *
446
+ * @return [Integer, nil] The split serial id or nil when absent
447
+ */
448
+ static VALUE resolution_details_get_serial_id(VALUE self) {
449
+ ddog_ffe_Handle_ResolutionDetails resolution_details =
450
+ (ddog_ffe_Handle_ResolutionDetails)rb_check_typeddata(self, &resolution_details_typed_data);
451
+ struct ddog_Option_I32 serial_id = ddog_ffe_assignment_get_serial_id(resolution_details);
452
+ if (serial_id.tag == DDOG_OPTION_I32_SOME_I32) {
453
+ return INT2NUM(serial_id.some);
454
+ }
455
+ return Qnil;
456
+ }
457
+
424
458
  /*
425
459
  * call-seq:
426
460
  * resolution_details.reason() -> String
@@ -5,7 +5,9 @@
5
5
  #include "crashtracker.h"
6
6
  #include "feature_flags.h"
7
7
  #include "library_config.h"
8
+ #include "otel_thread_context.h"
8
9
  #include "process_discovery.h"
10
+ #include "trace_exporter.h"
9
11
 
10
12
  void ddsketch_init(VALUE core_module);
11
13
  void di_init(VALUE datadog_module);
@@ -23,5 +25,11 @@ void DDTRACE_EXPORT Init_libdatadog_api(void) {
23
25
  library_config_init(core_module);
24
26
  ddsketch_init(core_module);
25
27
  feature_flags_init(core_module);
26
- di_init(datadog_module);
28
+ #ifndef TRUFFLERUBY
29
+ di_init(datadog_module);
30
+ #endif
31
+
32
+ VALUE tracing_module = rb_define_module_under(datadog_module, "Tracing");
33
+ trace_exporter_init(tracing_module);
34
+ otel_thread_context_init(tracing_module);
27
35
  }
@@ -0,0 +1,274 @@
1
+ #include <ruby.h>
2
+ #include <ruby/thread.h>
3
+
4
+ #include "datadog_ruby_common.h"
5
+ #include "otel_thread_context.h"
6
+
7
+ // Relies on a :fiber_switch TracePoint that TruffleRuby does not support yet
8
+ #if defined(__linux__) && !defined(TRUFFLERUBY)
9
+ #define OTEL_THREAD_CONTEXT_SUPPORTED
10
+ #endif
11
+
12
+ #ifdef OTEL_THREAD_CONTEXT_SUPPORTED
13
+ #include <datadog/otel-thread-ctx.h>
14
+ extern __thread const uint8_t *otel_thread_ctx_v1;
15
+
16
+ static void otel_ctx_handle_free(void *handle) {
17
+ ddog_otel_thread_ctx_free((ddog_ThreadContextHandle *) handle);
18
+ }
19
+
20
+ static const rb_data_type_t otel_ctx_handle_t = {
21
+ .wrap_struct_name = "Datadog::Tracing::OTelThreadContext handle",
22
+ .function = {.dfree = otel_ctx_handle_free},
23
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY,
24
+ };
25
+ #endif
26
+
27
+ static ID fiber_context_slot;
28
+
29
+ DDTRACE_UNUSED static bool otel_context_enabled = false;
30
+
31
+ static VALUE native_set(VALUE _self, VALUE trace_id, VALUE span_id, VALUE local_root_span_id);
32
+ static VALUE native_clear(VALUE _self);
33
+ static VALUE native_enable(VALUE _self);
34
+ static VALUE native_read(VALUE _self);
35
+
36
+ void otel_thread_context_init(VALUE tracing_module) {
37
+ fiber_context_slot = rb_intern("__dd_otel_fiber_context");
38
+
39
+ VALUE otel_thread_context_class = rb_define_class_under(tracing_module, "OTelThreadContext", rb_cObject);
40
+
41
+ rb_define_method(otel_thread_context_class, "_native_enable", native_enable, 0);
42
+ rb_define_method(otel_thread_context_class, "_native_set", native_set, 3);
43
+ rb_define_method(otel_thread_context_class, "_native_clear", native_clear, 0);
44
+
45
+ VALUE testing_module = rb_define_module_under(otel_thread_context_class, "Testing");
46
+ rb_define_singleton_method(testing_module, "_native_read", native_read, 0);
47
+ }
48
+
49
+ #ifdef OTEL_THREAD_CONTEXT_SUPPORTED
50
+ static ddog_ThreadContextHandle *get_fiber_handle_for(VALUE thread) {
51
+ VALUE obj = rb_thread_local_aref(thread, fiber_context_slot);
52
+
53
+ if (!rb_typeddata_is_kind_of(obj, &otel_ctx_handle_t)) return NULL;
54
+
55
+ return RTYPEDDATA_DATA(obj);
56
+ }
57
+
58
+ static ddog_ThreadContextHandle *get_current_fiber_handle(void) {
59
+ return get_fiber_handle_for(rb_thread_current());
60
+ }
61
+
62
+ static void pack_span_id(VALUE id, uint8_t bytes[8]) {
63
+ // Tracing::Utils.next_id caps generated span IDs at (1 << 62) - 1, which fits
64
+ // in a Fixnum on 64-bit Ruby. Packing them directly avoids rb_integer_pack's
65
+ // generic conversion and format checks on each context update.
66
+ // https://github.com/DataDog/dd-trace-rb/blob/0b10368e0a2940c1f4d50c9739b9973b4f8bc32a/lib/datadog/tracing/utils.rb#L20-L37
67
+ if (FIXNUM_P(id)) {
68
+ uint64_t number = (uint64_t) FIX2LONG(id);
69
+ for (int i = 7; i >= 0; i--) {
70
+ bytes[i] = (uint8_t) number;
71
+ number >>= 8;
72
+ }
73
+ } else {
74
+ rb_integer_pack(id, bytes, 1, sizeof(uint64_t), 0, INTEGER_PACK_BIG_ENDIAN);
75
+ }
76
+ }
77
+
78
+ static void store_current_fiber_handle(ddog_ThreadContextHandle *handle) {
79
+ VALUE obj = TypedData_Wrap_Struct(rb_cObject, &otel_ctx_handle_t, handle);
80
+ rb_thread_local_aset(rb_thread_current(), fiber_context_slot, obj);
81
+ }
82
+
83
+ #ifdef RUBY_INTERNAL_THREAD_EVENT_EXITED
84
+ static void on_thread_exited(
85
+ DDTRACE_UNUSED rb_event_flag_t event,
86
+ DDTRACE_UNUSED const rb_internal_thread_event_data_t *event_data,
87
+ DDTRACE_UNUSED void *user_data
88
+ ) {
89
+ ddog_otel_thread_ctx_detach();
90
+ }
91
+ #else
92
+ static void on_thread_end(
93
+ DDTRACE_UNUSED rb_event_flag_t evflag,
94
+ DDTRACE_UNUSED VALUE data,
95
+ DDTRACE_UNUSED VALUE self,
96
+ DDTRACE_UNUSED ID mid,
97
+ DDTRACE_UNUSED VALUE klass
98
+ ) {
99
+ ddog_otel_thread_ctx_detach();
100
+ }
101
+
102
+ // CRuby fires RUBY_EVENT_THREAD_END only after the thread body returns,
103
+ // and Thread#kill unwinds the body via EC_JUMP_TAG(TAG_FATAL):
104
+ // https://github.com/ruby/ruby/blob/v3_1_4/thread.c#L744-L775
105
+ static void on_thread_begin(
106
+ DDTRACE_UNUSED rb_event_flag_t evflag,
107
+ DDTRACE_UNUSED VALUE data,
108
+ DDTRACE_UNUSED VALUE self,
109
+ DDTRACE_UNUSED ID mid,
110
+ DDTRACE_UNUSED VALUE klass
111
+ ) {
112
+ ddog_otel_thread_ctx_detach();
113
+ }
114
+ #endif
115
+
116
+ #ifdef HAVE_RUBY_THREAD_STORAGE_API
117
+ // This function is declared in internal/thread.h.
118
+ // It returns 0 when the current thread sits in a blocking region.
119
+ int ruby_thread_has_gvl_p(void);
120
+
121
+ static bool in_blocking_region(void) {
122
+ #ifdef HAVE_RUBY_THREAD_HAS_GVL_P
123
+ return ruby_thread_has_gvl_p() == 0;
124
+ #else
125
+ return false;
126
+ #endif
127
+ }
128
+
129
+ // Under M:N a Ruby thread can migrate between native threads,
130
+ // so we need to detach the context when the Ruby thread gets suspended.
131
+ static void on_thread_suspended(
132
+ DDTRACE_UNUSED rb_event_flag_t event,
133
+ DDTRACE_UNUSED const rb_internal_thread_event_data_t *event_data,
134
+ DDTRACE_UNUSED void *user_data
135
+ ) {
136
+ // Ruby pins threads that release GVL to call into a native extension,
137
+ // so we know the thread will not migrate.
138
+ if (in_blocking_region()) return;
139
+
140
+ ddog_otel_thread_ctx_detach();
141
+ }
142
+
143
+ static void on_thread_resumed(
144
+ DDTRACE_UNUSED rb_event_flag_t event,
145
+ const rb_internal_thread_event_data_t *event_data,
146
+ DDTRACE_UNUSED void *user_data
147
+ ) {
148
+ ddog_ThreadContextHandle *handle = get_fiber_handle_for(event_data->thread);
149
+
150
+ if (handle != NULL) ddog_otel_thread_ctx_attach(handle);
151
+ }
152
+ #endif
153
+
154
+ static void on_fiber_switch(
155
+ DDTRACE_UNUSED rb_event_flag_t evflag,
156
+ DDTRACE_UNUSED VALUE data,
157
+ DDTRACE_UNUSED VALUE self,
158
+ DDTRACE_UNUSED ID mid,
159
+ DDTRACE_UNUSED VALUE klass
160
+ ) {
161
+ ddog_ThreadContextHandle *handle = get_current_fiber_handle();
162
+
163
+ if (handle != NULL) {
164
+ ddog_otel_thread_ctx_attach(handle);
165
+ } else {
166
+ ddog_otel_thread_ctx_detach();
167
+ }
168
+ }
169
+ #endif
170
+
171
+ static VALUE native_enable(DDTRACE_UNUSED VALUE _self) {
172
+ #ifdef OTEL_THREAD_CONTEXT_SUPPORTED
173
+ if (otel_context_enabled) return Qtrue;
174
+ otel_context_enabled = true;
175
+
176
+ #ifdef RUBY_INTERNAL_THREAD_EVENT_EXITED
177
+ rb_internal_thread_add_event_hook(on_thread_exited, RUBY_INTERNAL_THREAD_EVENT_EXITED, NULL);
178
+ #else
179
+ rb_add_event_hook(on_thread_end, RUBY_EVENT_THREAD_END, Qnil);
180
+ // RUBY_EVENT_THREAD_END does not fire for threads terminated via Thread#kill
181
+ // on Ruby < 3.2, so a killed thread's otel_thread_ctx_v1 TLS stays attached
182
+ // on a native thread CRuby may recycle for a later Ruby thread. Detach on
183
+ // thread begin to drop that stale record before the new thread runs.
184
+ rb_add_event_hook(on_thread_begin, RUBY_EVENT_THREAD_BEGIN, Qnil);
185
+ #endif
186
+
187
+ // These hooks only matter under the M:N thread scheduler (Ruby 3.3+),
188
+ // where a Ruby thread can migrate between native threads.
189
+ #ifdef HAVE_RUBY_THREAD_STORAGE_API
190
+ rb_internal_thread_add_event_hook(on_thread_suspended, RUBY_INTERNAL_THREAD_EVENT_SUSPENDED, NULL);
191
+ rb_internal_thread_add_event_hook(on_thread_resumed, RUBY_INTERNAL_THREAD_EVENT_RESUMED, NULL);
192
+ #endif
193
+
194
+ rb_add_event_hook(on_fiber_switch, RUBY_EVENT_FIBER_SWITCH, Qnil);
195
+
196
+ return Qtrue;
197
+ #else
198
+ raise_error(rb_eRuntimeError, "OTel thread context is not supported on this platform");
199
+ #endif
200
+ }
201
+
202
+ static VALUE native_set(
203
+ DDTRACE_UNUSED VALUE _self,
204
+ DDTRACE_UNUSED VALUE trace_id,
205
+ DDTRACE_UNUSED VALUE span_id,
206
+ DDTRACE_UNUSED VALUE local_root_span_id
207
+ ) {
208
+ #ifdef OTEL_THREAD_CONTEXT_SUPPORTED
209
+ if (!otel_context_enabled) return Qfalse;
210
+
211
+ uint8_t trace_id_bytes[16];
212
+ uint8_t span_id_bytes[8];
213
+ uint8_t local_root_span_id_bytes[8];
214
+
215
+ // Note: We use 2 words of size 8, as `rb_integer_pack` has a fast path for it (vs 16 bytes of size 1)
216
+ rb_integer_pack(trace_id, trace_id_bytes, 2, sizeof(uint64_t), 0, INTEGER_PACK_BIG_ENDIAN);
217
+ pack_span_id(span_id, span_id_bytes);
218
+ pack_span_id(local_root_span_id, local_root_span_id_bytes);
219
+
220
+ ddog_ThreadContextHandle *handle = get_current_fiber_handle();
221
+
222
+ if (handle == NULL) {
223
+ handle = ddog_otel_thread_ctx_new(&trace_id_bytes, &span_id_bytes, 0, &local_root_span_id_bytes);
224
+ store_current_fiber_handle(handle);
225
+ ddog_otel_thread_ctx_attach(handle);
226
+ } else {
227
+ ddog_otel_thread_ctx_update_and_attach(handle, &trace_id_bytes, &span_id_bytes, 0, &local_root_span_id_bytes);
228
+ }
229
+
230
+ return Qtrue;
231
+ #else
232
+ return Qfalse;
233
+ #endif
234
+ }
235
+
236
+ static VALUE native_clear(DDTRACE_UNUSED VALUE _self) {
237
+ #ifdef OTEL_THREAD_CONTEXT_SUPPORTED
238
+ if (!otel_context_enabled) return Qfalse;
239
+
240
+ ddog_ThreadContextHandle *detached = ddog_otel_thread_ctx_detach();
241
+ rb_thread_local_aset(rb_thread_current(), fiber_context_slot, Qnil);
242
+
243
+ return detached == NULL ? Qfalse : Qtrue;
244
+ #else
245
+ return Qfalse;
246
+ #endif
247
+ }
248
+
249
+ static VALUE native_read(DDTRACE_UNUSED VALUE _self) {
250
+ #ifdef OTEL_THREAD_CONTEXT_SUPPORTED
251
+ const uint8_t *raw = otel_thread_ctx_v1;
252
+ if (!raw) return Qnil;
253
+
254
+ uint16_t attrs_data_size = (uint16_t) raw[26] | ((uint16_t) raw[27] << 8);
255
+
256
+ if (attrs_data_size > ddog_MAX_ATTRS_DATA_SIZE) {
257
+ raise_error(
258
+ rb_eRuntimeError,
259
+ "Invalid OTel thread context record: attrs_data_size (%d) exceeds maximum (%d)",
260
+ attrs_data_size, ddog_MAX_ATTRS_DATA_SIZE
261
+ );
262
+ }
263
+
264
+ VALUE result = rb_hash_new();
265
+ rb_hash_aset(result, ID2SYM(rb_intern("trace_id")), rb_str_new((const char *) raw, 16));
266
+ rb_hash_aset(result, ID2SYM(rb_intern("span_id")), rb_str_new((const char *) (raw + 16), 8));
267
+ rb_hash_aset(result, ID2SYM(rb_intern("valid")), rb_str_new((const char *) (raw + 24), 1));
268
+ rb_hash_aset(result, ID2SYM(rb_intern("attrs")), rb_str_new((const char *) (raw + 28), attrs_data_size));
269
+
270
+ return result;
271
+ #else
272
+ return Qnil;
273
+ #endif
274
+ }
@@ -0,0 +1,5 @@
1
+ #pragma once
2
+
3
+ #include <ruby.h>
4
+
5
+ void otel_thread_context_init(VALUE tracing_module);
@@ -4,6 +4,7 @@
4
4
  #include <datadog/library-config.h>
5
5
 
6
6
  #include "datadog_ruby_common.h"
7
+ #include "helpers.h"
7
8
 
8
9
  static VALUE _native_store_tracer_metadata(int argc, VALUE *argv, DDTRACE_UNUSED VALUE _self);
9
10
  static VALUE _native_to_rb_int(DDTRACE_UNUSED VALUE _self, VALUE tracer_memfd);
@@ -38,8 +39,9 @@ void process_discovery_init(VALUE core_module) {
38
39
 
39
40
  static VALUE _native_store_tracer_metadata(int argc, VALUE *argv, VALUE self) {
40
41
  VALUE logger;
42
+ VALUE otel_thread_context_enabled;
41
43
  VALUE options;
42
- rb_scan_args(argc, argv, "1:", &logger, &options);
44
+ rb_scan_args(argc, argv, "2:", &logger, &otel_thread_context_enabled, &options);
43
45
  if (options == Qnil) options = rb_hash_new();
44
46
 
45
47
  VALUE runtime_id = rb_hash_fetch(options, ID2SYM(rb_intern("runtime_id")));
@@ -61,6 +63,7 @@ static VALUE _native_store_tracer_metadata(int argc, VALUE *argv, VALUE self) {
61
63
  ENFORCE_TYPE(service_version, T_STRING);
62
64
  ENFORCE_TYPE(process_tags, T_STRING);
63
65
  ENFORCE_TYPE(container_id, T_STRING);
66
+ ENFORCE_BOOLEAN(otel_thread_context_enabled);
64
67
 
65
68
  void* builder = ddog_tracer_metadata_new();
66
69
 
@@ -74,6 +77,16 @@ static VALUE _native_store_tracer_metadata(int argc, VALUE *argv, VALUE self) {
74
77
  ddog_tracer_metadata_set(builder, DDOG_METADATA_KIND_PROCESS_TAGS, StringValueCStr(process_tags));
75
78
  ddog_tracer_metadata_set(builder, DDOG_METADATA_KIND_CONTAINER_ID, StringValueCStr(container_id));
76
79
 
80
+ if (RTEST(otel_thread_context_enabled)) {
81
+ ddog_VoidResult include_result = ddog_tracer_metadata_include_otel_thread_context(builder);
82
+
83
+ if (include_result.tag == DDOG_VOID_RESULT_ERR) {
84
+ ddog_tracer_metadata_free(builder);
85
+ }
86
+
87
+ CHECK_VOID_RESULT("Failed to include OTel thread context metadata", include_result);
88
+ }
89
+
77
90
  ddog_Result_TracerMemfdHandle result = ddog_tracer_metadata_store(builder);
78
91
  ddog_tracer_metadata_free(builder);
79
92
 
@@ -89,6 +102,7 @@ static VALUE _native_store_tracer_metadata(int argc, VALUE *argv, VALUE self) {
89
102
  *fd = result.ok.fd;
90
103
  VALUE tracer_memfd_class = rb_const_get(self, rb_intern("TracerMemfd"));
91
104
  VALUE tracer_memfd = TypedData_Wrap_Struct(tracer_memfd_class, &tracer_memfd_type, fd);
105
+
92
106
  return tracer_memfd;
93
107
  }
94
108