datadog 2.36.0 → 2.40.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 (854) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +119 -1
  3. data/bin/ddprofrb +4 -4
  4. data/ext/datadog_profiling_native_extension/clock_id_from_mach.c +5 -12
  5. data/ext/datadog_profiling_native_extension/collectors_cpu_and_wall_time_worker.c +105 -18
  6. data/ext/datadog_profiling_native_extension/collectors_idle_sampling_helper.c +17 -3
  7. data/ext/datadog_profiling_native_extension/collectors_stack.c +228 -162
  8. data/ext/datadog_profiling_native_extension/collectors_stack.h +16 -3
  9. data/ext/datadog_profiling_native_extension/collectors_thread_context.c +357 -217
  10. data/ext/datadog_profiling_native_extension/collectors_thread_context.h +3 -0
  11. data/ext/datadog_profiling_native_extension/crashtracking_runtime_stacks.c +5 -4
  12. data/ext/datadog_profiling_native_extension/datadog_ruby_common.c +19 -11
  13. data/ext/datadog_profiling_native_extension/datadog_ruby_common.h +7 -0
  14. data/ext/datadog_profiling_native_extension/extconf.rb +24 -11
  15. data/ext/datadog_profiling_native_extension/private_vm_api_access.c +261 -62
  16. data/ext/datadog_profiling_native_extension/private_vm_api_access.h +17 -9
  17. data/ext/datadog_profiling_native_extension/ruby_helpers.c +7 -0
  18. data/ext/datadog_profiling_native_extension/setup_signal_handler.c +2 -0
  19. data/ext/datadog_profiling_native_extension/time_helpers.h +12 -7
  20. data/ext/libdatadog_api/datadog_ruby_common.c +19 -11
  21. data/ext/libdatadog_api/datadog_ruby_common.h +7 -0
  22. data/ext/libdatadog_api/di.c +76 -0
  23. data/ext/libdatadog_api/extconf.rb +29 -23
  24. data/ext/libdatadog_api/feature_flags.c +26 -0
  25. data/ext/libdatadog_api/init.c +4 -0
  26. data/ext/libdatadog_api/trace_exporter.c +974 -0
  27. data/ext/libdatadog_api/trace_exporter.h +5 -0
  28. data/ext/libdatadog_extconf_helpers.rb +9 -9
  29. data/lib/datadog/ai_guard/api_client.rb +8 -6
  30. data/lib/datadog/ai_guard/component.rb +10 -10
  31. data/lib/datadog/ai_guard/evaluation.rb +1 -0
  32. data/lib/datadog/ai_guard/ext.rb +2 -0
  33. data/lib/datadog/appsec/actions_handler/serializable_backtrace.rb +16 -16
  34. data/lib/datadog/appsec/actions_handler.rb +6 -6
  35. data/lib/datadog/appsec/anonymizer.rb +1 -1
  36. data/lib/datadog/appsec/api_security/endpoint_collection/grape_route_serializer.rb +1 -1
  37. data/lib/datadog/appsec/api_security/endpoint_collection/rails_collector.rb +6 -6
  38. data/lib/datadog/appsec/api_security/endpoint_collection/sinatra_route_serializer.rb +1 -1
  39. data/lib/datadog/appsec/api_security/route_extractor.rb +18 -15
  40. data/lib/datadog/appsec/api_security/sampler.rb +5 -5
  41. data/lib/datadog/appsec/api_security.rb +1 -1
  42. data/lib/datadog/appsec/assets.rb +7 -7
  43. data/lib/datadog/appsec/autoload.rb +3 -3
  44. data/lib/datadog/appsec/component.rb +15 -15
  45. data/lib/datadog/appsec/compressed_json.rb +6 -6
  46. data/lib/datadog/appsec/configuration.rb +73 -58
  47. data/lib/datadog/appsec/context.rb +9 -7
  48. data/lib/datadog/appsec/contrib/active_record/instrumentation.rb +6 -6
  49. data/lib/datadog/appsec/contrib/active_record/integration.rb +4 -4
  50. data/lib/datadog/appsec/contrib/active_record/patcher.rb +4 -4
  51. data/lib/datadog/appsec/contrib/aws_lambda/gateway/watcher.rb +7 -7
  52. data/lib/datadog/appsec/contrib/aws_lambda/integration.rb +2 -2
  53. data/lib/datadog/appsec/contrib/aws_lambda/patcher.rb +2 -2
  54. data/lib/datadog/appsec/contrib/aws_lambda/waf_addresses.rb +36 -34
  55. data/lib/datadog/appsec/contrib/devise/data_extractor.rb +3 -3
  56. data/lib/datadog/appsec/contrib/devise/ext.rb +20 -20
  57. data/lib/datadog/appsec/contrib/devise/integration.rb +4 -4
  58. data/lib/datadog/appsec/contrib/devise/patcher.rb +8 -8
  59. data/lib/datadog/appsec/contrib/devise/patches/signin_tracking_patch.rb +12 -12
  60. data/lib/datadog/appsec/contrib/devise/patches/signup_tracking_patch.rb +8 -8
  61. data/lib/datadog/appsec/contrib/devise/tracking_middleware.rb +24 -9
  62. data/lib/datadog/appsec/contrib/excon/integration.rb +4 -4
  63. data/lib/datadog/appsec/contrib/excon/patcher.rb +1 -1
  64. data/lib/datadog/appsec/contrib/excon/ssrf_detection_middleware.rb +76 -21
  65. data/lib/datadog/appsec/contrib/faraday/integration.rb +4 -4
  66. data/lib/datadog/appsec/contrib/faraday/patcher.rb +4 -4
  67. data/lib/datadog/appsec/contrib/faraday/ssrf_detection_middleware.rb +72 -18
  68. data/lib/datadog/appsec/contrib/graphql/appsec_trace.rb +4 -4
  69. data/lib/datadog/appsec/contrib/graphql/gateway/multiplex.rb +3 -3
  70. data/lib/datadog/appsec/contrib/graphql/gateway/watcher.rb +7 -7
  71. data/lib/datadog/appsec/contrib/graphql/integration.rb +9 -9
  72. data/lib/datadog/appsec/contrib/graphql/patcher.rb +3 -3
  73. data/lib/datadog/appsec/contrib/rack/buffered_input.rb +1 -1
  74. data/lib/datadog/appsec/contrib/rack/ext.rb +29 -29
  75. data/lib/datadog/appsec/contrib/rack/gateway/request.rb +18 -17
  76. data/lib/datadog/appsec/contrib/rack/gateway/response.rb +1 -1
  77. data/lib/datadog/appsec/contrib/rack/gateway/watcher.rb +25 -21
  78. data/lib/datadog/appsec/contrib/rack/input_peeker.rb +9 -22
  79. data/lib/datadog/appsec/contrib/rack/integration.rb +6 -6
  80. data/lib/datadog/appsec/contrib/rack/patcher.rb +3 -3
  81. data/lib/datadog/appsec/contrib/rack/request_body_middleware.rb +11 -8
  82. data/lib/datadog/appsec/contrib/rack/request_middleware.rb +45 -24
  83. data/lib/datadog/appsec/contrib/rack/response_body.rb +1 -1
  84. data/lib/datadog/appsec/contrib/rails/gateway/request.rb +14 -8
  85. data/lib/datadog/appsec/contrib/rails/gateway/watcher.rb +10 -10
  86. data/lib/datadog/appsec/contrib/rails/integration.rb +5 -5
  87. data/lib/datadog/appsec/contrib/rails/patcher.rb +17 -17
  88. data/lib/datadog/appsec/contrib/rails/patches/process_action_patch.rb +2 -2
  89. data/lib/datadog/appsec/contrib/rails/patches/render_to_body_patch.rb +3 -3
  90. data/lib/datadog/appsec/contrib/rails/request.rb +3 -3
  91. data/lib/datadog/appsec/contrib/rails/request_middleware.rb +2 -1
  92. data/lib/datadog/appsec/contrib/rest_client/integration.rb +5 -5
  93. data/lib/datadog/appsec/contrib/rest_client/patcher.rb +1 -1
  94. data/lib/datadog/appsec/contrib/rest_client/request_ssrf_detection_patch.rb +74 -21
  95. data/lib/datadog/appsec/contrib/sinatra/gateway/request.rb +1 -1
  96. data/lib/datadog/appsec/contrib/sinatra/gateway/route_params.rb +1 -1
  97. data/lib/datadog/appsec/contrib/sinatra/gateway/watcher.rb +16 -12
  98. data/lib/datadog/appsec/contrib/sinatra/integration.rb +5 -5
  99. data/lib/datadog/appsec/contrib/sinatra/patcher.rb +11 -11
  100. data/lib/datadog/appsec/contrib/sinatra/patches/json_patch.rb +3 -3
  101. data/lib/datadog/appsec/contrib/sinatra/request_middleware.rb +2 -1
  102. data/lib/datadog/appsec/counter_sampler.rb +1 -1
  103. data/lib/datadog/appsec/event.rb +14 -14
  104. data/lib/datadog/appsec/ext.rb +11 -10
  105. data/lib/datadog/appsec/extensions.rb +2 -2
  106. data/lib/datadog/appsec/instrumentation/gateway.rb +1 -1
  107. data/lib/datadog/appsec/metrics/collector.rb +18 -1
  108. data/lib/datadog/appsec/metrics/exporter.rb +17 -11
  109. data/lib/datadog/appsec/metrics/telemetry.rb +7 -7
  110. data/lib/datadog/appsec/metrics/telemetry_exporter.rb +4 -4
  111. data/lib/datadog/appsec/metrics.rb +4 -4
  112. data/lib/datadog/appsec/monitor/gateway/watcher.rb +16 -12
  113. data/lib/datadog/appsec/monitor.rb +1 -1
  114. data/lib/datadog/appsec/processor/rule_loader.rb +26 -26
  115. data/lib/datadog/appsec/rate_limiter.rb +1 -1
  116. data/lib/datadog/appsec/remote.rb +15 -9
  117. data/lib/datadog/appsec/response.rb +21 -21
  118. data/lib/datadog/appsec/route_normalizer/rails_route_pattern.rb +176 -0
  119. data/lib/datadog/appsec/route_normalizer/route_pattern.rb +378 -0
  120. data/lib/datadog/appsec/route_normalizer/route_text.rb +57 -0
  121. data/lib/datadog/appsec/route_normalizer.rb +80 -0
  122. data/lib/datadog/appsec/security_engine/engine.rb +37 -37
  123. data/lib/datadog/appsec/security_engine/runner.rb +2 -2
  124. data/lib/datadog/appsec/security_event.rb +2 -2
  125. data/lib/datadog/appsec/utils/http/body.rb +11 -8
  126. data/lib/datadog/appsec/utils/http/body_reader.rb +61 -0
  127. data/lib/datadog/appsec/utils/http/media_range.rb +15 -15
  128. data/lib/datadog/appsec/utils/http/media_type.rb +4 -4
  129. data/lib/datadog/appsec/utils/http/url_encoded.rb +80 -25
  130. data/lib/datadog/appsec.rb +16 -16
  131. data/lib/datadog/auto_instrument.rb +2 -2
  132. data/lib/datadog/core/buffer/cruby.rb +1 -1
  133. data/lib/datadog/core/buffer/thread_safe.rb +1 -1
  134. data/lib/datadog/core/configuration/agent_settings.rb +1 -1
  135. data/lib/datadog/core/configuration/agent_settings_resolver.rb +15 -15
  136. data/lib/datadog/core/configuration/agentless_settings_resolver.rb +2 -2
  137. data/lib/datadog/core/configuration/base.rb +2 -2
  138. data/lib/datadog/core/configuration/components.rb +115 -31
  139. data/lib/datadog/core/configuration/components_state.rb +6 -1
  140. data/lib/datadog/core/configuration/config_helper.rb +3 -3
  141. data/lib/datadog/core/configuration/deprecations.rb +6 -6
  142. data/lib/datadog/core/configuration/ext.rb +11 -11
  143. data/lib/datadog/core/configuration/option.rb +16 -16
  144. data/lib/datadog/core/configuration/option_definition.rb +4 -4
  145. data/lib/datadog/core/configuration/options.rb +1 -1
  146. data/lib/datadog/core/configuration/settings.rb +93 -104
  147. data/lib/datadog/core/configuration/stable_config.rb +1 -1
  148. data/lib/datadog/core/configuration/supported_configurations.rb +8 -1
  149. data/lib/datadog/core/configuration.rb +8 -8
  150. data/lib/datadog/core/contrib/rails/railtie.rb +3 -3
  151. data/lib/datadog/core/crashtracking/component.rb +9 -9
  152. data/lib/datadog/core/crashtracking/tag_builder.rb +5 -5
  153. data/lib/datadog/core/deprecations.rb +1 -1
  154. data/lib/datadog/core/diagnostics/environment_logger.rb +6 -6
  155. data/lib/datadog/core/diagnostics/health.rb +2 -2
  156. data/lib/datadog/core/encoding.rb +4 -4
  157. data/lib/datadog/core/environment/agent_info.rb +2 -2
  158. data/lib/datadog/core/environment/cgroup.rb +4 -4
  159. data/lib/datadog/core/environment/container.rb +9 -9
  160. data/lib/datadog/core/environment/execution.rb +3 -3
  161. data/lib/datadog/core/environment/ext.rb +18 -18
  162. data/lib/datadog/core/environment/gc.rb +1 -1
  163. data/lib/datadog/core/environment/git.rb +2 -2
  164. data/lib/datadog/core/environment/identity.rb +10 -10
  165. data/lib/datadog/core/environment/platform.rb +8 -8
  166. data/lib/datadog/core/environment/process.rb +3 -3
  167. data/lib/datadog/core/environment/socket.rb +2 -2
  168. data/lib/datadog/core/environment/variable_helpers.rb +1 -1
  169. data/lib/datadog/core/environment/vm_cache.rb +1 -1
  170. data/lib/datadog/core/environment/yjit.rb +2 -2
  171. data/lib/datadog/core/error.rb +5 -5
  172. data/lib/datadog/core/evp.rb +11 -0
  173. data/lib/datadog/core/extensions.rb +1 -1
  174. data/lib/datadog/core/feature_flags.rb +2 -2
  175. data/lib/datadog/core/git/ext.rb +4 -4
  176. data/lib/datadog/core/knuth_sampler.rb +3 -1
  177. data/lib/datadog/core/logger.rb +3 -3
  178. data/lib/datadog/core/logging/ext.rb +1 -1
  179. data/lib/datadog/core/metrics/client.rb +21 -21
  180. data/lib/datadog/core/metrics/ext.rb +5 -5
  181. data/lib/datadog/core/metrics/logging.rb +2 -2
  182. data/lib/datadog/core/metrics/options.rb +3 -3
  183. data/lib/datadog/core/pin.rb +1 -1
  184. data/lib/datadog/core/process_discovery.rb +8 -8
  185. data/lib/datadog/core/rate_limiter.rb +1 -1
  186. data/lib/datadog/core/remote/client/capabilities.rb +62 -19
  187. data/lib/datadog/core/remote/client.rb +16 -16
  188. data/lib/datadog/core/remote/component.rb +20 -12
  189. data/lib/datadog/core/remote/configuration/content.rb +3 -3
  190. data/lib/datadog/core/remote/configuration/digest.rb +1 -1
  191. data/lib/datadog/core/remote/configuration/path.rb +9 -9
  192. data/lib/datadog/core/remote/configuration/repository.rb +2 -2
  193. data/lib/datadog/core/remote/configuration/target.rb +9 -9
  194. data/lib/datadog/core/remote/configuration.rb +4 -4
  195. data/lib/datadog/core/remote/ext.rb +3 -3
  196. data/lib/datadog/core/remote/negotiation.rb +1 -1
  197. data/lib/datadog/core/remote/tie/tracing.rb +7 -7
  198. data/lib/datadog/core/remote/transport/config.rb +4 -4
  199. data/lib/datadog/core/remote/transport/http/config.rb +7 -7
  200. data/lib/datadog/core/remote/transport/http/negotiation.rb +4 -4
  201. data/lib/datadog/core/remote/transport/http.rb +10 -10
  202. data/lib/datadog/core/remote/transport/negotiation.rb +3 -3
  203. data/lib/datadog/core/remote/worker.rb +5 -5
  204. data/lib/datadog/core/runtime/ext.rb +22 -22
  205. data/lib/datadog/core/runtime/metrics.rb +9 -9
  206. data/lib/datadog/core/tag_builder.rb +18 -18
  207. data/lib/datadog/core/tag_normalizer.rb +7 -7
  208. data/lib/datadog/core/telemetry/component.rb +13 -13
  209. data/lib/datadog/core/telemetry/emitter.rb +4 -4
  210. data/lib/datadog/core/telemetry/event/app_client_configuration_change.rb +5 -5
  211. data/lib/datadog/core/telemetry/event/app_closing.rb +2 -2
  212. data/lib/datadog/core/telemetry/event/app_dependencies_loaded.rb +2 -2
  213. data/lib/datadog/core/telemetry/event/app_endpoints_loaded.rb +2 -2
  214. data/lib/datadog/core/telemetry/event/app_extended_heartbeat.rb +2 -2
  215. data/lib/datadog/core/telemetry/event/app_heartbeat.rb +2 -2
  216. data/lib/datadog/core/telemetry/event/app_integrations_change.rb +2 -2
  217. data/lib/datadog/core/telemetry/event/app_started.rb +41 -34
  218. data/lib/datadog/core/telemetry/event/base.rb +1 -1
  219. data/lib/datadog/core/telemetry/event/distributions.rb +2 -2
  220. data/lib/datadog/core/telemetry/event/generate_metrics.rb +2 -2
  221. data/lib/datadog/core/telemetry/event/log.rb +4 -4
  222. data/lib/datadog/core/telemetry/event/message_batch.rb +1 -1
  223. data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +3 -3
  224. data/lib/datadog/core/telemetry/event.rb +16 -16
  225. data/lib/datadog/core/telemetry/ext.rb +11 -11
  226. data/lib/datadog/core/telemetry/logger.rb +1 -1
  227. data/lib/datadog/core/telemetry/logging.rb +5 -5
  228. data/lib/datadog/core/telemetry/metric.rb +7 -7
  229. data/lib/datadog/core/telemetry/metrics_collection.rb +2 -2
  230. data/lib/datadog/core/telemetry/metrics_manager.rb +1 -1
  231. data/lib/datadog/core/telemetry/request.rb +4 -4
  232. data/lib/datadog/core/telemetry/transport/http/telemetry.rb +14 -14
  233. data/lib/datadog/core/telemetry/transport/http.rb +7 -7
  234. data/lib/datadog/core/telemetry/transport/telemetry.rb +3 -3
  235. data/lib/datadog/core/telemetry/worker.rb +6 -6
  236. data/lib/datadog/core/transport/ext.rb +14 -14
  237. data/lib/datadog/core/transport/http/adapters/net.rb +4 -4
  238. data/lib/datadog/core/transport/http/adapters/test.rb +1 -1
  239. data/lib/datadog/core/transport/http/adapters/unix_socket.rb +4 -4
  240. data/lib/datadog/core/transport/http/api/endpoint.rb +1 -1
  241. data/lib/datadog/core/transport/http/api/map.rb +1 -1
  242. data/lib/datadog/core/transport/http/builder.rb +6 -6
  243. data/lib/datadog/core/transport/http/client.rb +2 -2
  244. data/lib/datadog/core/transport/http/response.rb +1 -1
  245. data/lib/datadog/core/transport/http.rb +8 -8
  246. data/lib/datadog/core/transport/transport.rb +1 -1
  247. data/lib/datadog/core/utils/at_fork_monkey_patch.rb +83 -15
  248. data/lib/datadog/core/utils/base64_codec.rb +3 -3
  249. data/lib/datadog/core/utils/duration.rb +1 -1
  250. data/lib/datadog/core/utils/forking.rb +2 -2
  251. data/lib/datadog/core/utils/lru_cache.rb +3 -3
  252. data/lib/datadog/core/utils/network.rb +11 -11
  253. data/lib/datadog/core/utils/only_once_successful.rb +1 -1
  254. data/lib/datadog/core/utils/safe_dup.rb +2 -1
  255. data/lib/datadog/core/utils/sequence.rb +3 -6
  256. data/lib/datadog/core/utils/spawn_monkey_patch.rb +2 -2
  257. data/lib/datadog/core/utils/time.rb +18 -52
  258. data/lib/datadog/core/utils/url.rb +1 -1
  259. data/lib/datadog/core/utils.rb +4 -4
  260. data/lib/datadog/core/workers/async.rb +1 -1
  261. data/lib/datadog/core/workers/polling.rb +2 -2
  262. data/lib/datadog/core/workers/runtime_metrics.rb +4 -4
  263. data/lib/datadog/core.rb +4 -4
  264. data/lib/datadog/data_streams/configuration.rb +3 -3
  265. data/lib/datadog/data_streams/ext.rb +1 -1
  266. data/lib/datadog/data_streams/extensions.rb +2 -2
  267. data/lib/datadog/data_streams/pathway_context.rb +5 -5
  268. data/lib/datadog/data_streams/processor.rb +52 -52
  269. data/lib/datadog/data_streams/transport/http/stats.rb +5 -5
  270. data/lib/datadog/data_streams/transport/http.rb +5 -5
  271. data/lib/datadog/data_streams/transport/stats.rb +7 -7
  272. data/lib/datadog/data_streams.rb +5 -5
  273. data/lib/datadog/di/base.rb +6 -4
  274. data/lib/datadog/di/boot.rb +25 -22
  275. data/lib/datadog/di/capture_expression.rb +21 -0
  276. data/lib/datadog/di/capture_expression_evaluator.rb +71 -0
  277. data/lib/datadog/di/capture_limits.rb +41 -0
  278. data/lib/datadog/di/code_tracker.rb +10 -7
  279. data/lib/datadog/di/component.rb +122 -40
  280. data/lib/datadog/di/configuration.rb +7 -1
  281. data/lib/datadog/di/context.rb +9 -3
  282. data/lib/datadog/di/contrib/railtie.rb +1 -1
  283. data/lib/datadog/di/contrib.rb +5 -5
  284. data/lib/datadog/di/el/compiler.rb +91 -38
  285. data/lib/datadog/di/el/evaluator.rb +82 -2
  286. data/lib/datadog/di/el/expression.rb +10 -2
  287. data/lib/datadog/di/el.rb +3 -3
  288. data/lib/datadog/di/error.rb +10 -0
  289. data/lib/datadog/di/fatal_exceptions.rb +26 -0
  290. data/lib/datadog/di/instrumenter.rb +426 -169
  291. data/lib/datadog/di/logger.rb +1 -1
  292. data/lib/datadog/di/preload.rb +1 -1
  293. data/lib/datadog/di/probe.rb +61 -2
  294. data/lib/datadog/di/probe_builder.rb +96 -14
  295. data/lib/datadog/di/probe_file_loader/railtie.rb +1 -1
  296. data/lib/datadog/di/probe_file_loader.rb +12 -7
  297. data/lib/datadog/di/probe_manager.rb +67 -9
  298. data/lib/datadog/di/probe_notification_builder.rb +66 -22
  299. data/lib/datadog/di/probe_notifier_worker.rb +57 -37
  300. data/lib/datadog/di/probe_repository.rb +1 -1
  301. data/lib/datadog/di/redactor.rb +16 -1
  302. data/lib/datadog/di/remote.rb +178 -17
  303. data/lib/datadog/di/serializer.rb +47 -28
  304. data/lib/datadog/di/transport/diagnostics.rb +5 -5
  305. data/lib/datadog/di/transport/http/diagnostics.rb +3 -3
  306. data/lib/datadog/di/transport/http/input.rb +2 -2
  307. data/lib/datadog/di/transport/http.rb +10 -10
  308. data/lib/datadog/di/transport/input.rb +16 -12
  309. data/lib/datadog/di/utils.rb +4 -4
  310. data/lib/datadog/di.rb +66 -3
  311. data/lib/datadog/error_tracking/collector.rb +2 -2
  312. data/lib/datadog/error_tracking/component.rb +12 -12
  313. data/lib/datadog/error_tracking/configuration.rb +2 -2
  314. data/lib/datadog/error_tracking/ext.rb +7 -7
  315. data/lib/datadog/error_tracking/extensions.rb +2 -2
  316. data/lib/datadog/error_tracking/filters.rb +4 -4
  317. data/lib/datadog/error_tracking.rb +6 -6
  318. data/lib/datadog/kit/appsec/events/v2.rb +90 -32
  319. data/lib/datadog/kit/appsec/events.rb +25 -25
  320. data/lib/datadog/kit/enable_core_dumps.rb +2 -2
  321. data/lib/datadog/kit/identity.rb +18 -18
  322. data/lib/datadog/kit/tracing/method_tracer.rb +7 -7
  323. data/lib/datadog/kit.rb +1 -1
  324. data/lib/datadog/open_feature/component.rb +53 -21
  325. data/lib/datadog/open_feature/configuration.rb +22 -1
  326. data/lib/datadog/open_feature/evaluation_engine.rb +7 -7
  327. data/lib/datadog/open_feature/exposures/buffer.rb +1 -1
  328. data/lib/datadog/open_feature/exposures/deduplicator.rb +1 -1
  329. data/lib/datadog/open_feature/exposures/event.rb +2 -2
  330. data/lib/datadog/open_feature/exposures/reporter.rb +3 -3
  331. data/lib/datadog/open_feature/exposures/worker.rb +6 -6
  332. data/lib/datadog/open_feature/ext.rb +13 -6
  333. data/lib/datadog/open_feature/flag_evaluation/aggregator.rb +286 -0
  334. data/lib/datadog/open_feature/flag_evaluation/writer.rb +433 -0
  335. data/lib/datadog/open_feature/hooks/flag_eval_evp_hook.rb +102 -0
  336. data/lib/datadog/open_feature/hooks/{flag_eval_hook.rb → flag_eval_metrics_hook.rb} +4 -2
  337. data/lib/datadog/open_feature/hooks/span_enrichment_hook/codec.rb +58 -0
  338. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state.rb +96 -0
  339. data/lib/datadog/open_feature/hooks/span_enrichment_hook/span_enrichment_state_store.rb +49 -0
  340. data/lib/datadog/open_feature/hooks/span_enrichment_hook.rb +184 -0
  341. data/lib/datadog/open_feature/metrics/flag_eval_metrics.rb +24 -24
  342. data/lib/datadog/open_feature/native_evaluator.rb +23 -1
  343. data/lib/datadog/open_feature/noop_evaluator.rb +3 -3
  344. data/lib/datadog/open_feature/provider.rb +97 -30
  345. data/lib/datadog/open_feature/remote.rb +2 -2
  346. data/lib/datadog/open_feature/resolution_details.rb +4 -2
  347. data/lib/datadog/open_feature/transport.rb +65 -11
  348. data/lib/datadog/open_feature.rb +2 -2
  349. data/lib/datadog/opentelemetry/api/baggage.rb +3 -3
  350. data/lib/datadog/opentelemetry/api/context.rb +4 -4
  351. data/lib/datadog/opentelemetry/configuration/settings.rb +41 -41
  352. data/lib/datadog/opentelemetry/ext.rb +1 -1
  353. data/lib/datadog/opentelemetry/logs.rb +5 -5
  354. data/lib/datadog/opentelemetry/metrics.rb +7 -7
  355. data/lib/datadog/opentelemetry/sdk/configurator.rb +8 -8
  356. data/lib/datadog/opentelemetry/sdk/id_generator.rb +2 -2
  357. data/lib/datadog/opentelemetry/sdk/logs_exporter.rb +10 -17
  358. data/lib/datadog/opentelemetry/sdk/metrics_exporter.rb +8 -15
  359. data/lib/datadog/opentelemetry/sdk/propagator.rb +7 -7
  360. data/lib/datadog/opentelemetry/sdk/span_processor.rb +15 -15
  361. data/lib/datadog/opentelemetry/sdk/trace/span.rb +32 -32
  362. data/lib/datadog/opentelemetry/sdk.rb +19 -0
  363. data/lib/datadog/opentelemetry/signal_configuration.rb +11 -11
  364. data/lib/datadog/opentelemetry/trace.rb +1 -1
  365. data/lib/datadog/opentelemetry.rb +8 -8
  366. data/lib/datadog/profiling/collectors/cpu_and_wall_time_worker.rb +6 -1
  367. data/lib/datadog/profiling/collectors/idle_sampling_helper.rb +5 -3
  368. data/lib/datadog/profiling/collectors/thread_context.rb +15 -14
  369. data/lib/datadog/profiling/component.rb +18 -0
  370. data/lib/datadog/profiling/exporter.rb +1 -1
  371. data/lib/datadog/profiling/http_transport.rb +1 -1
  372. data/lib/datadog/profiling/sequence_tracker.rb +1 -1
  373. data/lib/datadog/profiling/tag_builder.rb +19 -19
  374. data/lib/datadog/profiling.rb +31 -27
  375. data/lib/datadog/single_step_instrument.rb +1 -1
  376. data/lib/datadog/symbol_database/component.rb +177 -60
  377. data/lib/datadog/symbol_database/configuration.rb +15 -7
  378. data/lib/datadog/symbol_database/extensions.rb +19 -0
  379. data/lib/datadog/symbol_database/extractor.rb +167 -130
  380. data/lib/datadog/symbol_database/file_hash.rb +5 -3
  381. data/lib/datadog/symbol_database/logger.rb +1 -1
  382. data/lib/datadog/symbol_database/remote.rb +28 -8
  383. data/lib/datadog/symbol_database/scope.rb +2 -2
  384. data/lib/datadog/symbol_database/scope_batcher.rb +8 -4
  385. data/lib/datadog/symbol_database/service_version.rb +4 -4
  386. data/lib/datadog/symbol_database/symbol.rb +1 -1
  387. data/lib/datadog/symbol_database/transport/http/endpoint.rb +1 -1
  388. data/lib/datadog/symbol_database/transport/http.rb +6 -6
  389. data/lib/datadog/symbol_database/transport.rb +4 -4
  390. data/lib/datadog/symbol_database/uploader.rb +28 -21
  391. data/lib/datadog/symbol_database.rb +22 -0
  392. data/lib/datadog/tracing/analytics.rb +1 -1
  393. data/lib/datadog/tracing/buffer.rb +5 -5
  394. data/lib/datadog/tracing/client_ip.rb +4 -4
  395. data/lib/datadog/tracing/component.rb +28 -7
  396. data/lib/datadog/tracing/configuration/dynamic.rb +8 -8
  397. data/lib/datadog/tracing/configuration/ext.rb +43 -42
  398. data/lib/datadog/tracing/configuration/http.rb +2 -2
  399. data/lib/datadog/tracing/configuration/settings.rb +32 -16
  400. data/lib/datadog/tracing/context.rb +1 -1
  401. data/lib/datadog/tracing/context_provider.rb +2 -2
  402. data/lib/datadog/tracing/contrib/action_cable/configuration/settings.rb +2 -2
  403. data/lib/datadog/tracing/contrib/action_cable/event.rb +4 -4
  404. data/lib/datadog/tracing/contrib/action_cable/events/broadcast.rb +5 -5
  405. data/lib/datadog/tracing/contrib/action_cable/events/perform_action.rb +4 -4
  406. data/lib/datadog/tracing/contrib/action_cable/events/transmit.rb +5 -5
  407. data/lib/datadog/tracing/contrib/action_cable/events.rb +4 -4
  408. data/lib/datadog/tracing/contrib/action_cable/ext.rb +18 -18
  409. data/lib/datadog/tracing/contrib/action_cable/instrumentation.rb +4 -4
  410. data/lib/datadog/tracing/contrib/action_cable/integration.rb +7 -7
  411. data/lib/datadog/tracing/contrib/action_cable/patcher.rb +4 -4
  412. data/lib/datadog/tracing/contrib/action_mailer/configuration/settings.rb +2 -2
  413. data/lib/datadog/tracing/contrib/action_mailer/event.rb +3 -3
  414. data/lib/datadog/tracing/contrib/action_mailer/events/deliver.rb +8 -8
  415. data/lib/datadog/tracing/contrib/action_mailer/events/process.rb +4 -4
  416. data/lib/datadog/tracing/contrib/action_mailer/events.rb +2 -2
  417. data/lib/datadog/tracing/contrib/action_mailer/ext.rb +18 -18
  418. data/lib/datadog/tracing/contrib/action_mailer/integration.rb +7 -7
  419. data/lib/datadog/tracing/contrib/action_mailer/patcher.rb +3 -3
  420. data/lib/datadog/tracing/contrib/action_pack/action_controller/instrumentation.rb +8 -8
  421. data/lib/datadog/tracing/contrib/action_pack/action_controller/patcher.rb +2 -2
  422. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/instrumentation.rb +4 -4
  423. data/lib/datadog/tracing/contrib/action_pack/action_dispatch/patcher.rb +4 -4
  424. data/lib/datadog/tracing/contrib/action_pack/configuration/settings.rb +3 -3
  425. data/lib/datadog/tracing/contrib/action_pack/ext.rb +10 -10
  426. data/lib/datadog/tracing/contrib/action_pack/integration.rb +7 -7
  427. data/lib/datadog/tracing/contrib/action_pack/patcher.rb +3 -3
  428. data/lib/datadog/tracing/contrib/action_pack/utils.rb +1 -1
  429. data/lib/datadog/tracing/contrib/action_view/configuration/settings.rb +3 -3
  430. data/lib/datadog/tracing/contrib/action_view/event.rb +1 -1
  431. data/lib/datadog/tracing/contrib/action_view/events/render_partial.rb +6 -6
  432. data/lib/datadog/tracing/contrib/action_view/events/render_template.rb +6 -6
  433. data/lib/datadog/tracing/contrib/action_view/events.rb +2 -2
  434. data/lib/datadog/tracing/contrib/action_view/ext.rb +10 -10
  435. data/lib/datadog/tracing/contrib/action_view/integration.rb +11 -11
  436. data/lib/datadog/tracing/contrib/action_view/patcher.rb +5 -5
  437. data/lib/datadog/tracing/contrib/action_view/utils.rb +2 -2
  438. data/lib/datadog/tracing/contrib/active_job/configuration/settings.rb +2 -2
  439. data/lib/datadog/tracing/contrib/active_job/data_streams.rb +62 -0
  440. data/lib/datadog/tracing/contrib/active_job/event.rb +3 -3
  441. data/lib/datadog/tracing/contrib/active_job/events/discard.rb +5 -5
  442. data/lib/datadog/tracing/contrib/active_job/events/enqueue.rb +5 -5
  443. data/lib/datadog/tracing/contrib/active_job/events/enqueue_at.rb +5 -5
  444. data/lib/datadog/tracing/contrib/active_job/events/enqueue_retry.rb +5 -5
  445. data/lib/datadog/tracing/contrib/active_job/events/perform.rb +5 -5
  446. data/lib/datadog/tracing/contrib/active_job/events/retry_stopped.rb +5 -5
  447. data/lib/datadog/tracing/contrib/active_job/events.rb +6 -6
  448. data/lib/datadog/tracing/contrib/active_job/ext.rb +23 -23
  449. data/lib/datadog/tracing/contrib/active_job/integration.rb +7 -7
  450. data/lib/datadog/tracing/contrib/active_job/patcher.rb +17 -5
  451. data/lib/datadog/tracing/contrib/active_model_serializers/configuration/settings.rb +2 -2
  452. data/lib/datadog/tracing/contrib/active_model_serializers/event.rb +4 -4
  453. data/lib/datadog/tracing/contrib/active_model_serializers/events/render.rb +6 -6
  454. data/lib/datadog/tracing/contrib/active_model_serializers/events/serialize.rb +7 -8
  455. data/lib/datadog/tracing/contrib/active_model_serializers/events.rb +2 -2
  456. data/lib/datadog/tracing/contrib/active_model_serializers/ext.rb +10 -10
  457. data/lib/datadog/tracing/contrib/active_model_serializers/integration.rb +5 -5
  458. data/lib/datadog/tracing/contrib/active_model_serializers/patcher.rb +3 -3
  459. data/lib/datadog/tracing/contrib/active_record/configuration/makara_resolver.rb +1 -1
  460. data/lib/datadog/tracing/contrib/active_record/configuration/resolver.rb +6 -6
  461. data/lib/datadog/tracing/contrib/active_record/configuration/settings.rb +4 -4
  462. data/lib/datadog/tracing/contrib/active_record/event.rb +1 -1
  463. data/lib/datadog/tracing/contrib/active_record/events/instantiation.rb +8 -8
  464. data/lib/datadog/tracing/contrib/active_record/events/sql.rb +9 -9
  465. data/lib/datadog/tracing/contrib/active_record/events.rb +2 -2
  466. data/lib/datadog/tracing/contrib/active_record/ext.rb +15 -15
  467. data/lib/datadog/tracing/contrib/active_record/integration.rb +11 -11
  468. data/lib/datadog/tracing/contrib/active_record/patcher.rb +2 -2
  469. data/lib/datadog/tracing/contrib/active_record/utils.rb +3 -3
  470. data/lib/datadog/tracing/contrib/active_support/cache/event.rb +1 -1
  471. data/lib/datadog/tracing/contrib/active_support/cache/events/cache.rb +11 -11
  472. data/lib/datadog/tracing/contrib/active_support/cache/events.rb +1 -1
  473. data/lib/datadog/tracing/contrib/active_support/cache/instrumentation.rb +4 -4
  474. data/lib/datadog/tracing/contrib/active_support/cache/patcher.rb +5 -5
  475. data/lib/datadog/tracing/contrib/active_support/cache/redis.rb +4 -4
  476. data/lib/datadog/tracing/contrib/active_support/configuration/settings.rb +3 -3
  477. data/lib/datadog/tracing/contrib/active_support/ext.rb +16 -16
  478. data/lib/datadog/tracing/contrib/active_support/integration.rb +8 -8
  479. data/lib/datadog/tracing/contrib/active_support/notifications/event.rb +1 -1
  480. data/lib/datadog/tracing/contrib/active_support/notifications/subscriber.rb +2 -2
  481. data/lib/datadog/tracing/contrib/active_support/notifications/subscription.rb +1 -1
  482. data/lib/datadog/tracing/contrib/active_support/patcher.rb +2 -2
  483. data/lib/datadog/tracing/contrib/analytics.rb +1 -1
  484. data/lib/datadog/tracing/contrib/auto_instrument.rb +4 -4
  485. data/lib/datadog/tracing/contrib/aws/configuration/settings.rb +3 -3
  486. data/lib/datadog/tracing/contrib/aws/ext.rb +25 -25
  487. data/lib/datadog/tracing/contrib/aws/instrumentation.rb +5 -5
  488. data/lib/datadog/tracing/contrib/aws/integration.rb +9 -9
  489. data/lib/datadog/tracing/contrib/aws/parsed_context.rb +1 -1
  490. data/lib/datadog/tracing/contrib/aws/patcher.rb +5 -5
  491. data/lib/datadog/tracing/contrib/aws/service/dynamodb.rb +2 -2
  492. data/lib/datadog/tracing/contrib/aws/service/eventbridge.rb +2 -2
  493. data/lib/datadog/tracing/contrib/aws/service/kinesis.rb +4 -4
  494. data/lib/datadog/tracing/contrib/aws/service/s3.rb +2 -2
  495. data/lib/datadog/tracing/contrib/aws/service/sns.rb +3 -3
  496. data/lib/datadog/tracing/contrib/aws/service/sqs.rb +3 -3
  497. data/lib/datadog/tracing/contrib/aws/service/states.rb +5 -5
  498. data/lib/datadog/tracing/contrib/aws/services.rb +14 -14
  499. data/lib/datadog/tracing/contrib/concurrent_ruby/async_patch.rb +1 -1
  500. data/lib/datadog/tracing/contrib/concurrent_ruby/configuration/settings.rb +2 -2
  501. data/lib/datadog/tracing/contrib/concurrent_ruby/context_composite_executor_service.rb +1 -1
  502. data/lib/datadog/tracing/contrib/concurrent_ruby/ext.rb +2 -2
  503. data/lib/datadog/tracing/contrib/concurrent_ruby/future_patch.rb +1 -1
  504. data/lib/datadog/tracing/contrib/concurrent_ruby/integration.rb +6 -6
  505. data/lib/datadog/tracing/contrib/concurrent_ruby/patcher.rb +4 -4
  506. data/lib/datadog/tracing/contrib/concurrent_ruby/promises_future_patch.rb +1 -1
  507. data/lib/datadog/tracing/contrib/configurable.rb +2 -2
  508. data/lib/datadog/tracing/contrib/configuration/resolvers/pattern_resolver.rb +1 -1
  509. data/lib/datadog/tracing/contrib/configuration/settings.rb +2 -2
  510. data/lib/datadog/tracing/contrib/dalli/configuration/settings.rb +2 -2
  511. data/lib/datadog/tracing/contrib/dalli/ext.rb +13 -13
  512. data/lib/datadog/tracing/contrib/dalli/instrumentation.rb +5 -5
  513. data/lib/datadog/tracing/contrib/dalli/integration.rb +7 -7
  514. data/lib/datadog/tracing/contrib/dalli/patcher.rb +3 -3
  515. data/lib/datadog/tracing/contrib/dalli/quantize.rb +2 -2
  516. data/lib/datadog/tracing/contrib/delayed_job/configuration/settings.rb +2 -2
  517. data/lib/datadog/tracing/contrib/delayed_job/ext.rb +14 -14
  518. data/lib/datadog/tracing/contrib/delayed_job/integration.rb +5 -5
  519. data/lib/datadog/tracing/contrib/delayed_job/patcher.rb +3 -3
  520. data/lib/datadog/tracing/contrib/delayed_job/plugin.rb +5 -5
  521. data/lib/datadog/tracing/contrib/elasticsearch/configuration/settings.rb +2 -2
  522. data/lib/datadog/tracing/contrib/elasticsearch/ext.rb +15 -15
  523. data/lib/datadog/tracing/contrib/elasticsearch/integration.rb +6 -6
  524. data/lib/datadog/tracing/contrib/elasticsearch/patcher.rb +10 -10
  525. data/lib/datadog/tracing/contrib/elasticsearch/quantize.rb +2 -2
  526. data/lib/datadog/tracing/contrib/ethon/configuration/settings.rb +2 -2
  527. data/lib/datadog/tracing/contrib/ethon/easy_patch.rb +8 -8
  528. data/lib/datadog/tracing/contrib/ethon/ext.rb +13 -13
  529. data/lib/datadog/tracing/contrib/ethon/integration.rb +6 -6
  530. data/lib/datadog/tracing/contrib/ethon/multi_patch.rb +3 -3
  531. data/lib/datadog/tracing/contrib/ethon/patcher.rb +3 -3
  532. data/lib/datadog/tracing/contrib/excon/configuration/settings.rb +5 -5
  533. data/lib/datadog/tracing/contrib/excon/ext.rb +11 -11
  534. data/lib/datadog/tracing/contrib/excon/integration.rb +6 -6
  535. data/lib/datadog/tracing/contrib/excon/middleware.rb +8 -8
  536. data/lib/datadog/tracing/contrib/excon/patcher.rb +2 -2
  537. data/lib/datadog/tracing/contrib/ext.rb +15 -15
  538. data/lib/datadog/tracing/contrib/extensions.rb +2 -2
  539. data/lib/datadog/tracing/contrib/faraday/configuration/settings.rb +4 -4
  540. data/lib/datadog/tracing/contrib/faraday/ext.rb +11 -11
  541. data/lib/datadog/tracing/contrib/faraday/integration.rb +6 -6
  542. data/lib/datadog/tracing/contrib/faraday/middleware.rb +8 -8
  543. data/lib/datadog/tracing/contrib/faraday/patcher.rb +6 -6
  544. data/lib/datadog/tracing/contrib/grape/configuration/settings.rb +4 -4
  545. data/lib/datadog/tracing/contrib/grape/endpoint.rb +20 -20
  546. data/lib/datadog/tracing/contrib/grape/ext.rb +15 -15
  547. data/lib/datadog/tracing/contrib/grape/instrumentation.rb +3 -3
  548. data/lib/datadog/tracing/contrib/grape/integration.rb +5 -5
  549. data/lib/datadog/tracing/contrib/grape/patcher.rb +5 -5
  550. data/lib/datadog/tracing/contrib/graphql/configuration/error_extension_env_parser.rb +1 -1
  551. data/lib/datadog/tracing/contrib/graphql/configuration/settings.rb +3 -3
  552. data/lib/datadog/tracing/contrib/graphql/ext.rb +9 -9
  553. data/lib/datadog/tracing/contrib/graphql/integration.rb +9 -9
  554. data/lib/datadog/tracing/contrib/graphql/patcher.rb +7 -7
  555. data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +37 -37
  556. data/lib/datadog/tracing/contrib/graphql/unified_trace_patcher.rb +2 -2
  557. data/lib/datadog/tracing/contrib/grpc/configuration/settings.rb +2 -2
  558. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/client.rb +7 -7
  559. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor/server.rb +7 -7
  560. data/lib/datadog/tracing/contrib/grpc/datadog_interceptor.rb +6 -6
  561. data/lib/datadog/tracing/contrib/grpc/distributed/fetcher.rb +1 -1
  562. data/lib/datadog/tracing/contrib/grpc/distributed/propagation.rb +8 -8
  563. data/lib/datadog/tracing/contrib/grpc/ext.rb +14 -14
  564. data/lib/datadog/tracing/contrib/grpc/formatting.rb +7 -7
  565. data/lib/datadog/tracing/contrib/grpc/integration.rb +5 -5
  566. data/lib/datadog/tracing/contrib/grpc/intercept_with_datadog.rb +1 -1
  567. data/lib/datadog/tracing/contrib/grpc/patcher.rb +3 -3
  568. data/lib/datadog/tracing/contrib/grpc.rb +6 -6
  569. data/lib/datadog/tracing/contrib/hanami/action_tracer.rb +3 -3
  570. data/lib/datadog/tracing/contrib/hanami/configuration/settings.rb +2 -2
  571. data/lib/datadog/tracing/contrib/hanami/ext.rb +8 -8
  572. data/lib/datadog/tracing/contrib/hanami/integration.rb +6 -6
  573. data/lib/datadog/tracing/contrib/hanami/patcher.rb +5 -5
  574. data/lib/datadog/tracing/contrib/hanami/renderer_policy_tracing.rb +3 -3
  575. data/lib/datadog/tracing/contrib/hanami/router_tracing.rb +5 -4
  576. data/lib/datadog/tracing/contrib/http/circuit_breaker.rb +1 -1
  577. data/lib/datadog/tracing/contrib/http/configuration/settings.rb +4 -4
  578. data/lib/datadog/tracing/contrib/http/distributed/fetcher.rb +3 -3
  579. data/lib/datadog/tracing/contrib/http/distributed/propagation.rb +8 -8
  580. data/lib/datadog/tracing/contrib/http/ext.rb +11 -11
  581. data/lib/datadog/tracing/contrib/http/instrumentation.rb +6 -6
  582. data/lib/datadog/tracing/contrib/http/integration.rb +7 -7
  583. data/lib/datadog/tracing/contrib/http/patcher.rb +3 -3
  584. data/lib/datadog/tracing/contrib/http.rb +6 -6
  585. data/lib/datadog/tracing/contrib/httpclient/configuration/settings.rb +4 -4
  586. data/lib/datadog/tracing/contrib/httpclient/ext.rb +11 -11
  587. data/lib/datadog/tracing/contrib/httpclient/instrumentation.rb +5 -5
  588. data/lib/datadog/tracing/contrib/httpclient/integration.rb +6 -6
  589. data/lib/datadog/tracing/contrib/httpclient/patcher.rb +3 -3
  590. data/lib/datadog/tracing/contrib/httprb/configuration/settings.rb +4 -4
  591. data/lib/datadog/tracing/contrib/httprb/ext.rb +11 -11
  592. data/lib/datadog/tracing/contrib/httprb/instrumentation.rb +6 -6
  593. data/lib/datadog/tracing/contrib/httprb/integration.rb +7 -7
  594. data/lib/datadog/tracing/contrib/httprb/patcher.rb +3 -3
  595. data/lib/datadog/tracing/contrib/integration.rb +3 -3
  596. data/lib/datadog/tracing/contrib/kafka/configuration/settings.rb +2 -2
  597. data/lib/datadog/tracing/contrib/kafka/event.rb +3 -3
  598. data/lib/datadog/tracing/contrib/kafka/events/connection/request.rb +7 -3
  599. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_batch.rb +4 -4
  600. data/lib/datadog/tracing/contrib/kafka/events/consumer/process_message.rb +4 -4
  601. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/heartbeat.rb +5 -5
  602. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/join_group.rb +5 -5
  603. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/leave_group.rb +5 -5
  604. data/lib/datadog/tracing/contrib/kafka/events/consumer_group/sync_group.rb +5 -5
  605. data/lib/datadog/tracing/contrib/kafka/events/produce_operation/send_messages.rb +10 -5
  606. data/lib/datadog/tracing/contrib/kafka/events/producer/deliver_messages.rb +10 -5
  607. data/lib/datadog/tracing/contrib/kafka/events.rb +9 -9
  608. data/lib/datadog/tracing/contrib/kafka/ext.rb +40 -40
  609. data/lib/datadog/tracing/contrib/kafka/instrumentation/consumer.rb +2 -2
  610. data/lib/datadog/tracing/contrib/kafka/instrumentation/producer.rb +4 -4
  611. data/lib/datadog/tracing/contrib/kafka/integration.rb +6 -6
  612. data/lib/datadog/tracing/contrib/kafka/patcher.rb +5 -5
  613. data/lib/datadog/tracing/contrib/karafka/configuration/settings.rb +2 -2
  614. data/lib/datadog/tracing/contrib/karafka/distributed/propagation.rb +8 -8
  615. data/lib/datadog/tracing/contrib/karafka/ext.rb +13 -13
  616. data/lib/datadog/tracing/contrib/karafka/integration.rb +5 -5
  617. data/lib/datadog/tracing/contrib/karafka/monitor.rb +14 -14
  618. data/lib/datadog/tracing/contrib/karafka/patcher.rb +8 -8
  619. data/lib/datadog/tracing/contrib/karafka.rb +6 -6
  620. data/lib/datadog/tracing/contrib/lograge/configuration/settings.rb +2 -2
  621. data/lib/datadog/tracing/contrib/lograge/ext.rb +1 -1
  622. data/lib/datadog/tracing/contrib/lograge/integration.rb +5 -5
  623. data/lib/datadog/tracing/contrib/lograge/patcher.rb +9 -9
  624. data/lib/datadog/tracing/contrib/mongodb/configuration/settings.rb +2 -2
  625. data/lib/datadog/tracing/contrib/mongodb/ext.rb +18 -18
  626. data/lib/datadog/tracing/contrib/mongodb/instrumentation.rb +3 -3
  627. data/lib/datadog/tracing/contrib/mongodb/integration.rb +7 -7
  628. data/lib/datadog/tracing/contrib/mongodb/parsers.rb +5 -5
  629. data/lib/datadog/tracing/contrib/mongodb/patcher.rb +3 -3
  630. data/lib/datadog/tracing/contrib/mongodb/subscribers.rb +13 -13
  631. data/lib/datadog/tracing/contrib/mysql2/configuration/settings.rb +3 -3
  632. data/lib/datadog/tracing/contrib/mysql2/ext.rb +11 -11
  633. data/lib/datadog/tracing/contrib/mysql2/instrumentation.rb +6 -6
  634. data/lib/datadog/tracing/contrib/mysql2/integration.rb +5 -5
  635. data/lib/datadog/tracing/contrib/mysql2/patcher.rb +2 -2
  636. data/lib/datadog/tracing/contrib/opensearch/configuration/settings.rb +2 -2
  637. data/lib/datadog/tracing/contrib/opensearch/ext.rb +22 -22
  638. data/lib/datadog/tracing/contrib/opensearch/integration.rb +6 -6
  639. data/lib/datadog/tracing/contrib/opensearch/patcher.rb +13 -13
  640. data/lib/datadog/tracing/contrib/opensearch/quantize.rb +3 -3
  641. data/lib/datadog/tracing/contrib/patcher.rb +2 -2
  642. data/lib/datadog/tracing/contrib/pg/configuration/settings.rb +3 -3
  643. data/lib/datadog/tracing/contrib/pg/ext.rb +19 -19
  644. data/lib/datadog/tracing/contrib/pg/instrumentation.rb +18 -18
  645. data/lib/datadog/tracing/contrib/pg/integration.rb +5 -5
  646. data/lib/datadog/tracing/contrib/pg/patcher.rb +2 -2
  647. data/lib/datadog/tracing/contrib/presto/configuration/settings.rb +2 -2
  648. data/lib/datadog/tracing/contrib/presto/ext.rb +21 -21
  649. data/lib/datadog/tracing/contrib/presto/instrumentation.rb +2 -2
  650. data/lib/datadog/tracing/contrib/presto/integration.rb +6 -6
  651. data/lib/datadog/tracing/contrib/presto/patcher.rb +4 -4
  652. data/lib/datadog/tracing/contrib/propagation/sql_comment/comment.rb +2 -2
  653. data/lib/datadog/tracing/contrib/propagation/sql_comment/ext.rb +17 -17
  654. data/lib/datadog/tracing/contrib/propagation/sql_comment/mode.rb +1 -1
  655. data/lib/datadog/tracing/contrib/propagation/sql_comment.rb +5 -5
  656. data/lib/datadog/tracing/contrib/que/configuration/settings.rb +2 -2
  657. data/lib/datadog/tracing/contrib/que/ext.rb +19 -19
  658. data/lib/datadog/tracing/contrib/que/integration.rb +6 -6
  659. data/lib/datadog/tracing/contrib/que/patcher.rb +1 -1
  660. data/lib/datadog/tracing/contrib/que/tracer.rb +1 -1
  661. data/lib/datadog/tracing/contrib/racecar/configuration/settings.rb +3 -3
  662. data/lib/datadog/tracing/contrib/racecar/event.rb +4 -4
  663. data/lib/datadog/tracing/contrib/racecar/events/batch.rb +3 -3
  664. data/lib/datadog/tracing/contrib/racecar/events/consume.rb +3 -3
  665. data/lib/datadog/tracing/contrib/racecar/events/message.rb +3 -3
  666. data/lib/datadog/tracing/contrib/racecar/events.rb +3 -3
  667. data/lib/datadog/tracing/contrib/racecar/ext.rb +18 -18
  668. data/lib/datadog/tracing/contrib/racecar/integration.rb +5 -5
  669. data/lib/datadog/tracing/contrib/racecar/patcher.rb +3 -3
  670. data/lib/datadog/tracing/contrib/rack/configuration/settings.rb +2 -2
  671. data/lib/datadog/tracing/contrib/rack/ext.rb +33 -33
  672. data/lib/datadog/tracing/contrib/rack/header_collection.rb +3 -3
  673. data/lib/datadog/tracing/contrib/rack/header_tagging.rb +4 -4
  674. data/lib/datadog/tracing/contrib/rack/integration.rb +6 -6
  675. data/lib/datadog/tracing/contrib/rack/middlewares.rb +24 -24
  676. data/lib/datadog/tracing/contrib/rack/patcher.rb +3 -3
  677. data/lib/datadog/tracing/contrib/rack/request_queue.rb +3 -3
  678. data/lib/datadog/tracing/contrib/rack/route_inference.rb +11 -11
  679. data/lib/datadog/tracing/contrib/rack/trace_proxy_middleware.rb +15 -15
  680. data/lib/datadog/tracing/contrib/rails/auto_instrument_railtie.rb +1 -1
  681. data/lib/datadog/tracing/contrib/rails/configuration/settings.rb +3 -3
  682. data/lib/datadog/tracing/contrib/rails/ext.rb +15 -15
  683. data/lib/datadog/tracing/contrib/rails/framework.rb +11 -11
  684. data/lib/datadog/tracing/contrib/rails/integration.rb +5 -5
  685. data/lib/datadog/tracing/contrib/rails/middlewares.rb +1 -1
  686. data/lib/datadog/tracing/contrib/rails/patcher.rb +8 -8
  687. data/lib/datadog/tracing/contrib/rails/railtie.rb +4 -4
  688. data/lib/datadog/tracing/contrib/rails/runner.rb +1 -1
  689. data/lib/datadog/tracing/contrib/rake/configuration/settings.rb +3 -3
  690. data/lib/datadog/tracing/contrib/rake/ext.rb +12 -12
  691. data/lib/datadog/tracing/contrib/rake/instrumentation.rb +4 -4
  692. data/lib/datadog/tracing/contrib/rake/integration.rb +5 -5
  693. data/lib/datadog/tracing/contrib/rake/patcher.rb +3 -3
  694. data/lib/datadog/tracing/contrib/redis/configuration/resolver.rb +2 -2
  695. data/lib/datadog/tracing/contrib/redis/configuration/settings.rb +2 -2
  696. data/lib/datadog/tracing/contrib/redis/ext.rb +16 -16
  697. data/lib/datadog/tracing/contrib/redis/instrumentation.rb +6 -6
  698. data/lib/datadog/tracing/contrib/redis/integration.rb +7 -7
  699. data/lib/datadog/tracing/contrib/redis/patcher.rb +10 -10
  700. data/lib/datadog/tracing/contrib/redis/quantize.rb +4 -4
  701. data/lib/datadog/tracing/contrib/redis/tags.rb +5 -5
  702. data/lib/datadog/tracing/contrib/redis/trace_middleware.rb +5 -5
  703. data/lib/datadog/tracing/contrib/resque/configuration/settings.rb +2 -2
  704. data/lib/datadog/tracing/contrib/resque/ext.rb +7 -7
  705. data/lib/datadog/tracing/contrib/resque/integration.rb +5 -5
  706. data/lib/datadog/tracing/contrib/resque/patcher.rb +3 -3
  707. data/lib/datadog/tracing/contrib/resque/resque_job.rb +5 -5
  708. data/lib/datadog/tracing/contrib/rest_client/configuration/settings.rb +2 -2
  709. data/lib/datadog/tracing/contrib/rest_client/ext.rb +10 -10
  710. data/lib/datadog/tracing/contrib/rest_client/integration.rb +6 -6
  711. data/lib/datadog/tracing/contrib/rest_client/patcher.rb +2 -2
  712. data/lib/datadog/tracing/contrib/rest_client/request_patch.rb +5 -5
  713. data/lib/datadog/tracing/contrib/roda/configuration/settings.rb +2 -2
  714. data/lib/datadog/tracing/contrib/roda/ext.rb +6 -6
  715. data/lib/datadog/tracing/contrib/roda/instrumentation.rb +4 -4
  716. data/lib/datadog/tracing/contrib/roda/integration.rb +6 -6
  717. data/lib/datadog/tracing/contrib/roda/patcher.rb +3 -3
  718. data/lib/datadog/tracing/contrib/semantic_logger/configuration/settings.rb +2 -2
  719. data/lib/datadog/tracing/contrib/semantic_logger/ext.rb +1 -1
  720. data/lib/datadog/tracing/contrib/semantic_logger/integration.rb +5 -5
  721. data/lib/datadog/tracing/contrib/semantic_logger/patcher.rb +2 -2
  722. data/lib/datadog/tracing/contrib/sequel/configuration/settings.rb +2 -2
  723. data/lib/datadog/tracing/contrib/sequel/database.rb +6 -10
  724. data/lib/datadog/tracing/contrib/sequel/dataset.rb +5 -5
  725. data/lib/datadog/tracing/contrib/sequel/ext.rb +12 -8
  726. data/lib/datadog/tracing/contrib/sequel/integration.rb +5 -5
  727. data/lib/datadog/tracing/contrib/sequel/patcher.rb +3 -3
  728. data/lib/datadog/tracing/contrib/sequel/utils.rb +115 -10
  729. data/lib/datadog/tracing/contrib/shoryuken/configuration/settings.rb +2 -2
  730. data/lib/datadog/tracing/contrib/shoryuken/ext.rb +12 -12
  731. data/lib/datadog/tracing/contrib/shoryuken/integration.rb +6 -6
  732. data/lib/datadog/tracing/contrib/shoryuken/patcher.rb +1 -1
  733. data/lib/datadog/tracing/contrib/shoryuken/tracer.rb +2 -2
  734. data/lib/datadog/tracing/contrib/sidekiq/client_tracer.rb +8 -8
  735. data/lib/datadog/tracing/contrib/sidekiq/configuration/settings.rb +2 -2
  736. data/lib/datadog/tracing/contrib/sidekiq/distributed/propagation.rb +9 -9
  737. data/lib/datadog/tracing/contrib/sidekiq/ext.rb +30 -30
  738. data/lib/datadog/tracing/contrib/sidekiq/integration.rb +7 -7
  739. data/lib/datadog/tracing/contrib/sidekiq/patcher.rb +8 -8
  740. data/lib/datadog/tracing/contrib/sidekiq/server_tracer.rb +14 -14
  741. data/lib/datadog/tracing/contrib/sidekiq/utils.rb +9 -9
  742. data/lib/datadog/tracing/contrib/sidekiq.rb +6 -6
  743. data/lib/datadog/tracing/contrib/sinatra/configuration/settings.rb +2 -2
  744. data/lib/datadog/tracing/contrib/sinatra/env.rb +6 -6
  745. data/lib/datadog/tracing/contrib/sinatra/ext.rb +17 -17
  746. data/lib/datadog/tracing/contrib/sinatra/framework.rb +2 -2
  747. data/lib/datadog/tracing/contrib/sinatra/integration.rb +5 -5
  748. data/lib/datadog/tracing/contrib/sinatra/patcher.rb +5 -5
  749. data/lib/datadog/tracing/contrib/sinatra/tracer.rb +10 -10
  750. data/lib/datadog/tracing/contrib/sinatra/tracer_middleware.rb +8 -8
  751. data/lib/datadog/tracing/contrib/sneakers/configuration/settings.rb +1 -1
  752. data/lib/datadog/tracing/contrib/sneakers/ext.rb +12 -12
  753. data/lib/datadog/tracing/contrib/sneakers/integration.rb +7 -7
  754. data/lib/datadog/tracing/contrib/sneakers/patcher.rb +2 -2
  755. data/lib/datadog/tracing/contrib/sneakers/tracer.rb +3 -3
  756. data/lib/datadog/tracing/contrib/span_attribute_schema.rb +2 -2
  757. data/lib/datadog/tracing/contrib/status_range_env_parser.rb +2 -2
  758. data/lib/datadog/tracing/contrib/status_range_matcher.rb +1 -1
  759. data/lib/datadog/tracing/contrib/stripe/configuration/settings.rb +2 -2
  760. data/lib/datadog/tracing/contrib/stripe/ext.rb +12 -12
  761. data/lib/datadog/tracing/contrib/stripe/integration.rb +5 -5
  762. data/lib/datadog/tracing/contrib/stripe/patcher.rb +2 -2
  763. data/lib/datadog/tracing/contrib/stripe/request.rb +3 -3
  764. data/lib/datadog/tracing/contrib/sucker_punch/configuration/settings.rb +2 -2
  765. data/lib/datadog/tracing/contrib/sucker_punch/exception_handler.rb +1 -1
  766. data/lib/datadog/tracing/contrib/sucker_punch/ext.rb +13 -13
  767. data/lib/datadog/tracing/contrib/sucker_punch/instrumentation.rb +4 -4
  768. data/lib/datadog/tracing/contrib/sucker_punch/integration.rb +5 -5
  769. data/lib/datadog/tracing/contrib/sucker_punch/patcher.rb +4 -4
  770. data/lib/datadog/tracing/contrib/trilogy/configuration/settings.rb +3 -3
  771. data/lib/datadog/tracing/contrib/trilogy/ext.rb +11 -11
  772. data/lib/datadog/tracing/contrib/trilogy/instrumentation.rb +6 -6
  773. data/lib/datadog/tracing/contrib/trilogy/integration.rb +5 -5
  774. data/lib/datadog/tracing/contrib/trilogy/patcher.rb +2 -2
  775. data/lib/datadog/tracing/contrib/utils/database.rb +5 -5
  776. data/lib/datadog/tracing/contrib/utils/quantization/hash_formatter.rb +1 -1
  777. data/lib/datadog/tracing/contrib/utils/quantization/http.rb +10 -10
  778. data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +2 -2
  779. data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +8 -8
  780. data/lib/datadog/tracing/contrib/waterdrop/ext.rb +4 -4
  781. data/lib/datadog/tracing/contrib/waterdrop/integration.rb +5 -5
  782. data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +2 -2
  783. data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +7 -7
  784. data/lib/datadog/tracing/contrib/waterdrop/producer.rb +3 -3
  785. data/lib/datadog/tracing/contrib/waterdrop.rb +6 -6
  786. data/lib/datadog/tracing/contrib.rb +54 -54
  787. data/lib/datadog/tracing/correlation.rb +10 -10
  788. data/lib/datadog/tracing/diagnostics/environment_logger.rb +9 -9
  789. data/lib/datadog/tracing/diagnostics/ext.rb +19 -19
  790. data/lib/datadog/tracing/diagnostics/health.rb +1 -1
  791. data/lib/datadog/tracing/distributed/b3_multi.rb +8 -8
  792. data/lib/datadog/tracing/distributed/b3_single.rb +4 -4
  793. data/lib/datadog/tracing/distributed/baggage.rb +28 -27
  794. data/lib/datadog/tracing/distributed/datadog.rb +21 -21
  795. data/lib/datadog/tracing/distributed/datadog_tags_codec.rb +3 -3
  796. data/lib/datadog/tracing/distributed/fetcher.rb +1 -1
  797. data/lib/datadog/tracing/distributed/helpers.rb +3 -3
  798. data/lib/datadog/tracing/distributed/propagation.rb +12 -12
  799. data/lib/datadog/tracing/distributed/propagation_policy.rb +5 -0
  800. data/lib/datadog/tracing/distributed/trace_context.rb +33 -33
  801. data/lib/datadog/tracing/event.rb +1 -1
  802. data/lib/datadog/tracing/ext.rb +9 -0
  803. data/lib/datadog/tracing/metadata/analytics.rb +2 -2
  804. data/lib/datadog/tracing/metadata/errors.rb +4 -4
  805. data/lib/datadog/tracing/metadata/ext.rb +69 -69
  806. data/lib/datadog/tracing/metadata/metastruct.rb +1 -1
  807. data/lib/datadog/tracing/metadata/metastruct_tagging.rb +1 -1
  808. data/lib/datadog/tracing/metadata/tagging.rb +2 -2
  809. data/lib/datadog/tracing/metadata.rb +4 -4
  810. data/lib/datadog/tracing/pipeline/span_filter.rb +2 -2
  811. data/lib/datadog/tracing/pipeline.rb +2 -2
  812. data/lib/datadog/tracing/remote.rb +45 -7
  813. data/lib/datadog/tracing/sampling/all_sampler.rb +1 -1
  814. data/lib/datadog/tracing/sampling/ext.rb +8 -8
  815. data/lib/datadog/tracing/sampling/matcher.rb +4 -4
  816. data/lib/datadog/tracing/sampling/priority_sampler.rb +4 -4
  817. data/lib/datadog/tracing/sampling/rate_by_key_sampler.rb +3 -3
  818. data/lib/datadog/tracing/sampling/rate_by_service_sampler.rb +2 -2
  819. data/lib/datadog/tracing/sampling/rate_sampler.rb +2 -2
  820. data/lib/datadog/tracing/sampling/rule.rb +4 -4
  821. data/lib/datadog/tracing/sampling/rule_sampler.rb +12 -12
  822. data/lib/datadog/tracing/sampling/sampler.rb +2 -2
  823. data/lib/datadog/tracing/sampling/span/ext.rb +3 -3
  824. data/lib/datadog/tracing/sampling/span/matcher.rb +2 -2
  825. data/lib/datadog/tracing/sampling/span/rule.rb +1 -1
  826. data/lib/datadog/tracing/sampling/span/rule_parser.rb +8 -8
  827. data/lib/datadog/tracing/span.rb +8 -8
  828. data/lib/datadog/tracing/span_event.rb +5 -5
  829. data/lib/datadog/tracing/span_operation.rb +21 -21
  830. data/lib/datadog/tracing/sync_writer.rb +12 -7
  831. data/lib/datadog/tracing/trace_operation.rb +11 -11
  832. data/lib/datadog/tracing/trace_segment.rb +10 -10
  833. data/lib/datadog/tracing/tracer.rb +23 -15
  834. data/lib/datadog/tracing/transport/http/client.rb +4 -4
  835. data/lib/datadog/tracing/transport/http/statistics.rb +2 -2
  836. data/lib/datadog/tracing/transport/http/traces.rb +8 -8
  837. data/lib/datadog/tracing/transport/http.rb +10 -10
  838. data/lib/datadog/tracing/transport/io/client.rb +2 -2
  839. data/lib/datadog/tracing/transport/io/response.rb +1 -1
  840. data/lib/datadog/tracing/transport/io/traces.rb +4 -4
  841. data/lib/datadog/tracing/transport/io.rb +3 -3
  842. data/lib/datadog/tracing/transport/native/response.rb +71 -0
  843. data/lib/datadog/tracing/transport/native.rb +363 -0
  844. data/lib/datadog/tracing/transport/serializable_trace.rb +19 -19
  845. data/lib/datadog/tracing/transport/statistics.rb +2 -2
  846. data/lib/datadog/tracing/transport/trace_formatter.rb +10 -10
  847. data/lib/datadog/tracing/transport/traces.rb +8 -8
  848. data/lib/datadog/tracing/utils.rb +2 -2
  849. data/lib/datadog/tracing/workers.rb +2 -2
  850. data/lib/datadog/tracing/writer.rb +21 -8
  851. data/lib/datadog/tracing.rb +3 -3
  852. data/lib/datadog/version.rb +4 -4
  853. data/lib/datadog.rb +13 -12
  854. metadata +33 -8
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ module Datadog
6
+ module Tracing
7
+ module Transport
8
+ module Native
9
+ # Response from the native trace exporter.
10
+ #
11
+ # Constructed by the C extension after a send completes (or fails).
12
+ # Implements the same predicate interface as the HTTP transport's
13
+ # response so callers can treat both uniformly.
14
+ class Response
15
+ SERVICE_RATE_KEY = "rate_by_service"
16
+
17
+ attr_reader :trace_count, :payload
18
+
19
+ def initialize(ok:, internal_error: false, server_error: false, client_error: false,
20
+ not_found: false, unsupported: false, trace_count: 0, payload: nil)
21
+ @ok = ok
22
+ @internal_error = internal_error
23
+ @server_error = server_error
24
+ @client_error = client_error
25
+ @not_found = not_found
26
+ @unsupported = unsupported
27
+ @trace_count = trace_count
28
+ @payload = payload
29
+ end
30
+
31
+ def ok?
32
+ @ok
33
+ end
34
+
35
+ def internal_error?
36
+ @internal_error
37
+ end
38
+
39
+ def server_error?
40
+ @server_error
41
+ end
42
+
43
+ def client_error?
44
+ @client_error
45
+ end
46
+
47
+ def not_found?
48
+ @not_found
49
+ end
50
+
51
+ def unsupported?
52
+ @unsupported
53
+ end
54
+
55
+ # Parse the agent's JSON response body and extract the
56
+ # +rate_by_service+ map. Returns +nil+ when the payload
57
+ # is absent or does not contain sampling rates.
58
+ def service_rates
59
+ payload = @payload
60
+ return nil if payload.nil? || payload.empty?
61
+
62
+ parsed = JSON.parse(payload)
63
+ parsed[SERVICE_RATE_KEY] if parsed.is_a?(Hash)
64
+ rescue JSON::ParserError
65
+ nil
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,363 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+ require_relative "trace_formatter"
5
+ require_relative "statistics"
6
+
7
+ module Datadog
8
+ module Tracing
9
+ module Transport
10
+ # Transport backed by the native trace exporter (Rust via C FFI).
11
+ #
12
+ # Converts Ruby Span objects directly to Rust spans and delegates
13
+ # serialization and sending to the Rust data pipeline, which handles
14
+ # stats computation, msgpack encoding, and HTTP transport with retry
15
+ # logic.
16
+ #
17
+ # Implements the same +send_traces+ / +stats+ interface as
18
+ # {Datadog::Tracing::Transport::Traces::Transport} so it can be used
19
+ # as a drop-in replacement via the +Writer+'s +:transport+ option.
20
+ module Native
21
+ # Returns +nil+ when the native extension is available, or a +String+
22
+ # describing why it is not.
23
+ UNSUPPORTED_REASON = begin
24
+ require "datadog/core"
25
+ Datadog::Core::LIBDATADOG_API_FAILURE
26
+ rescue => e
27
+ e.message
28
+ end
29
+
30
+ def self.supported?
31
+ UNSUPPORTED_REASON.nil?
32
+ end
33
+
34
+ # +TraceExporter+ and +TracerSpan+ are defined by the C extension in
35
+ # +ext/libdatadog_api/trace_exporter.c+ and become available after the
36
+ # native extension is loaded. +Response+ is a plain Ruby class (see
37
+ # +native/response.rb+); the C side only resolves and instantiates it.
38
+ #
39
+ # The hierarchy is:
40
+ # Datadog::Tracing::Transport::Native::TraceExporter (C)
41
+ # Datadog::Tracing::Transport::Native::TracerSpan (C)
42
+ # Datadog::Tracing::Transport::Native::Response (Ruby)
43
+
44
+ # Drop-in transport that delegates to the native trace exporter.
45
+ class Transport
46
+ include Statistics
47
+
48
+ attr_reader :logger
49
+
50
+ # @param agent_settings [Datadog::Core::Configuration::AgentSettingsResolver::AgentSettings]
51
+ # Agent connection settings (provides +#url+).
52
+ # @param logger [Logger]
53
+ def initialize(agent_settings:, logger:)
54
+ unless Native.supported?
55
+ raise "Native transport is not supported: #{UNSUPPORTED_REASON}"
56
+ end
57
+
58
+ @logger = logger
59
+
60
+ # Guards the one-shot warning about span fields the native exporter
61
+ # does not yet convert (see #warn_unsupported_fields!).
62
+ @unsupported_fields_warned = false
63
+
64
+ # Serializes native sends and is held across a fork. See the
65
+ # fork-safety note below.
66
+ @send_mutex = Mutex.new
67
+
68
+ url = agent_settings.url
69
+ tracer_version = tracer_version_string
70
+ language = Core::Environment::Ext::LANG
71
+ language_version = Core::Environment::Ext::LANG_VERSION
72
+ language_interpreter = Core::Environment::Ext::LANG_INTERPRETER
73
+ hostname = begin
74
+ Core::Environment::Socket.hostname
75
+ rescue
76
+ nil
77
+ end
78
+ env = Datadog.configuration.env
79
+ service = Datadog.configuration.service
80
+ version = Datadog.configuration.version
81
+
82
+ exporter = Native::TraceExporter._native_new(
83
+ url: url,
84
+ tracer_version: tracer_version,
85
+ language: language,
86
+ language_version: language_version,
87
+ language_interpreter: language_interpreter,
88
+ hostname: hostname,
89
+ env: env,
90
+ service: service,
91
+ version: version
92
+ )
93
+ @exporter = exporter
94
+
95
+ # Fork safety: the native exporter owns a long-lived tokio runtime
96
+ # with background worker threads. Around a fork we must quiesce the
97
+ # runtime before forking and restore it afterwards in both the parent
98
+ # and the child (where the inherited runtime is dead).
99
+ #
100
+ # A libdatadog Rust call must NOT be interrupted by `fork()`. A
101
+ # native send releases the GVL during the Rust
102
+ # `ddog_trace_exporter_send_trace_chunks` call, so if another thread
103
+ # forks while a (typically the writer/`AsyncTransport`) thread is
104
+ # mid-send, the child would inherit a half-completed send and
105
+ # Rust-internal locks, deadlocking or crashing. `_native_before_fork`
106
+ # also tears down and replaces the runtime, so it must not run while
107
+ # a send is still using that runtime.
108
+ #
109
+ # `@send_mutex` serializes sends (see #send_traces) and is held
110
+ # across the fork. The `:before` hook first calls
111
+ # `_native_before_fork` to pause the runtime, THEN locks the mutex.
112
+ # This ordering minimizes the serialized section and is safe to run
113
+ # concurrently with an in-flight send: `block_on` (used by
114
+ # `send_trace_chunks`) only briefly locks the runtime mutex to clone
115
+ # the `Arc<Runtime>` (or build a throwaway `current_thread` runtime
116
+ # if it has been taken) and then drives the send on its own clone
117
+ # holding no mutex, while `_native_before_fork` just `take()`s the
118
+ # shared `Arc` and pauses workers -- so neither deadlocks the other.
119
+ # Locking the mutex AFTER `_native_before_fork` still guarantees the
120
+ # drain: it BLOCKS until any in-flight send finishes (bounded by the
121
+ # exporter's request timeout), which drops the send's last `Arc` and
122
+ # fully shuts the runtime down, and prevents new sends from starting.
123
+ # The lock is released in the `:parent` and `:child` hooks. In
124
+ # practice only one writer thread sends, so serializing adds no real
125
+ # contention.
126
+ #
127
+ # Note: the `:before` block runs before genuine forks (web-server
128
+ # workers, `Process.daemon`) that go through `Process._fork`. It
129
+ # does NOT run for `system`/backtick/`IO.popen`/`Process.spawn`,
130
+ # which spawn via `posix_spawn`/`vfork`+`exec` and replace the
131
+ # process image rather than carrying over the parent's work. Keeping
132
+ # it cheap is still worthwhile since real forks can be frequent.
133
+ #
134
+ # The hooks below are process-global and are never auto-removed by
135
+ # the fork machinery, so each transport must deregister its own
136
+ # hooks when it goes away (see #close and the finalizer): otherwise
137
+ # the closures keep the exporter -- and its runtime threads -- alive
138
+ # forever, and every later fork runs them against every
139
+ # historically-created exporter. The closures intentionally capture
140
+ # only the `exporter`/`send_mutex` locals (NOT `self`), so the
141
+ # Transport stays GC-eligible and its finalizer can fire even when
142
+ # #close was not called explicitly.
143
+ send_mutex = @send_mutex
144
+ before_hook = Core::Utils::AtForkMonkeyPatch.at_fork(:before) do
145
+ # Pause the runtime first (safe to run concurrently with an
146
+ # in-flight send), then drain by locking the mutex. The lock must
147
+ # happen even if `_native_before_fork` raises, so the in-flight
148
+ # send has returned (dropping the runtime's last `Arc`) before the
149
+ # fork. Held across the fork; released in :parent/:child.
150
+ exporter._native_before_fork
151
+ rescue => e
152
+ Datadog.logger.warn { "Native transport before-fork preparation failed; traces may not be sent to Datadog: #{e.class}: #{e.message}" }
153
+ ensure
154
+ send_mutex.lock
155
+ end
156
+ parent_hook = Core::Utils::AtForkMonkeyPatch.at_fork(:parent) do
157
+ exporter._native_after_fork_in_parent
158
+ rescue => e
159
+ Datadog.logger.warn { "Native transport after-fork reset failed; traces may not be sent to Datadog: #{e.class}: #{e.message}" }
160
+ ensure
161
+ # `:before`'s ensure always locks the mutex on the forking thread
162
+ # before any fork outcome, so it is normally owned here; the guard
163
+ # only covers `:before` being interrupted mid-lock (e.g. a kill
164
+ # between `_native_before_fork` and the lock). Released even if the
165
+ # native call raised, so a failure can't leave the mutex locked.
166
+ send_mutex.unlock if send_mutex.owned?
167
+ end
168
+ child_hook = Core::Utils::AtForkMonkeyPatch.at_fork(:child) do
169
+ exporter._native_after_fork_in_child
170
+ rescue => e
171
+ Datadog.logger.warn { "Native transport after-fork reset failed; traces may not be sent to Datadog: #{e.class}: #{e.message}" }
172
+ ensure
173
+ # See the :parent hook: normally owned (the forking thread is the
174
+ # lone survivor in the child); the guard only covers `:before`
175
+ # being interrupted mid-lock.
176
+ send_mutex.unlock if send_mutex.owned?
177
+ end
178
+
179
+ @fork_hooks = {before: before_hook, parent: parent_hook, child: child_hook}
180
+
181
+ # Fallback so a dropped (un-#close'd) transport doesn't leak its
182
+ # global fork hooks (and, through them, the exporter/runtime). The
183
+ # finalizer proc is built by a class method capturing ONLY the
184
+ # stage->block handles, never `self` -- a finalizer that closed over
185
+ # the object it is attached to would keep that object reachable and
186
+ # never run.
187
+ ObjectSpace.define_finalizer(self, self.class.send(:finalizer_for, @fork_hooks))
188
+ end
189
+
190
+ # Deregister this transport's process-global fork hooks and release the
191
+ # native exporter so its runtime can shut down. Idempotent: safe to
192
+ # call multiple times and safe to call after the finalizer has run.
193
+ def close
194
+ fork_hooks = @fork_hooks
195
+ @fork_hooks = nil
196
+ return if fork_hooks.nil?
197
+
198
+ fork_hooks.each do |stage, block|
199
+ Core::Utils::AtForkMonkeyPatch.remove_at_fork(stage, block)
200
+ end
201
+
202
+ # Drop our reference to the exporter so that, once the hooks above no
203
+ # longer pin it, it can be collected and its runtime shut down
204
+ # cleanly in this (parent) process.
205
+ @exporter = nil
206
+
207
+ # The finalizer only exists to deregister the hooks for a transport
208
+ # dropped without #close. We have just done that, so remove it;
209
+ # otherwise its captured hook blocks keep the exporter (and its
210
+ # runtime threads) alive until this still-reachable transport is
211
+ # itself collected.
212
+ ObjectSpace.undefine_finalizer(self)
213
+
214
+ nil
215
+ end
216
+
217
+ # Builds the finalizer proc for a transport's fork hooks.
218
+ #
219
+ # Defined as a class method so the proc closes over ONLY the
220
+ # stage->block handles passed in and never over a Transport instance
221
+ # (which would keep the instance reachable and prevent the finalizer
222
+ # from ever running). Removing the hooks unpins the exporter captured
223
+ # by those closures, allowing it (and its runtime) to be freed.
224
+ def self.finalizer_for(fork_hooks)
225
+ proc do
226
+ fork_hooks.each do |stage, block|
227
+ Core::Utils::AtForkMonkeyPatch.remove_at_fork(stage, block)
228
+ end
229
+ end
230
+ end
231
+ private_class_method :finalizer_for
232
+
233
+ # Send a list of traces to the agent.
234
+ #
235
+ # Each trace is a {Datadog::Tracing::TraceSegment} whose +#spans+
236
+ # returns an +Array+ of {Datadog::Tracing::Span}.
237
+ #
238
+ # @param traces [Array<Datadog::Tracing::TraceSegment>]
239
+ # @return [Array<Response>] one response per batch sent
240
+ def send_traces(traces)
241
+ return [] if traces.empty?
242
+
243
+ # A closed transport has released its exporter; there is nothing to
244
+ # send through. Raising here is caught below and surfaced as an
245
+ # InternalErrorResponse, matching the other failure paths.
246
+ exporter = @exporter
247
+ raise "Native transport has been closed" if exporter.nil?
248
+
249
+ # Apply trace-level tags to root spans (same as the HTTP transport)
250
+ traces.each { |trace| TraceFormatter.format!(trace) }
251
+
252
+ # Build the Array<Array<Span>> structure expected by the C extension.
253
+ # Each trace segment becomes one inner array (one trace chunk).
254
+ chunks = traces.map(&:spans)
255
+
256
+ # The native exporter only serializes scalar fields plus meta and
257
+ # metrics; span events, span links, and meta_struct are not yet
258
+ # converted and would be dropped. Warn (once) so the loss is visible.
259
+ warn_unsupported_fields!(chunks)
260
+
261
+ # Serialize the native send and hold the mutex across it so a
262
+ # concurrent fork's :before hook blocks until this send drains
263
+ # (and `_native_before_fork` cannot tear down the runtime mid-send).
264
+ # `Mutex#synchronize` releases on exception / `rb_jump_tag` via its
265
+ # ensure, so interrupt propagation stays correct.
266
+ responses = @send_mutex.synchronize { exporter._native_send_traces(chunks) }
267
+
268
+ # Update statistics from the response
269
+ responses.each { |response| update_stats_from_response!(response) }
270
+
271
+ responses
272
+ rescue => e
273
+ logger.debug { "Native transport error: #{e.class} #{e.message}" }
274
+ update_stats_from_exception!(e)
275
+ [InternalErrorResponse.new(e)]
276
+ end
277
+
278
+ private
279
+
280
+ # Warn, at most once per transport, when a batch contains span fields
281
+ # the native exporter does not yet convert (span events, span links,
282
+ # meta_struct). These are silently dropped by the native path; full
283
+ # support is tracked separately. The check is cheap: the fields are
284
+ # already-materialized collections on each Span.
285
+ def warn_unsupported_fields!(chunks)
286
+ return if @unsupported_fields_warned
287
+
288
+ unsupported = []
289
+ chunks.each do |spans|
290
+ spans.each do |span|
291
+ unsupported << "span events" if span.events.any?
292
+ unsupported << "span links" if span.links.any?
293
+ unsupported << "meta_struct" unless span.metastruct.to_h.empty?
294
+ end
295
+ end
296
+ return if unsupported.empty?
297
+
298
+ @unsupported_fields_warned = true
299
+ fields = unsupported.uniq.join(", ")
300
+ logger.warn do
301
+ "Native transport does not yet support: #{fields}. This data will not be sent to Datadog. " \
302
+ "Unset DD_EXPERIMENTAL_NATIVE_TRANSPORT_ENABLED to use the default transport if you rely on these."
303
+ end
304
+ end
305
+
306
+ def tracer_version_string
307
+ defined?(Datadog::VERSION::STRING) ? Datadog::VERSION::STRING : "unknown"
308
+ end
309
+ end
310
+
311
+ # Response for internal errors (exceptions raised before reaching
312
+ # the native transport).
313
+ class InternalErrorResponse
314
+ attr_reader :error
315
+
316
+ def initialize(error)
317
+ @error = error
318
+ end
319
+
320
+ def ok?
321
+ false
322
+ end
323
+
324
+ def internal_error?
325
+ true
326
+ end
327
+
328
+ def server_error?
329
+ false
330
+ end
331
+
332
+ def client_error?
333
+ false
334
+ end
335
+
336
+ def not_found?
337
+ false
338
+ end
339
+
340
+ def unsupported?
341
+ false
342
+ end
343
+
344
+ def payload
345
+ nil
346
+ end
347
+
348
+ def trace_count
349
+ 0
350
+ end
351
+
352
+ def service_rates
353
+ nil
354
+ end
355
+
356
+ def inspect
357
+ "#<#{self.class} error=#{error.inspect}>"
358
+ end
359
+ end
360
+ end
361
+ end
362
+ end
363
+ end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'json'
4
- require 'msgpack'
5
- require 'datadog/tracing/utils'
3
+ require "json"
4
+ require "msgpack"
5
+ require "datadog/tracing/utils"
6
6
 
7
7
  module Datadog
8
8
  module Tracing
@@ -76,10 +76,10 @@ module Datadog
76
76
  if span.stopped?
77
77
  packer.write_map_header(number_of_elements_to_write + 2) # Set header with how many elements in the map
78
78
 
79
- packer.write('start')
79
+ packer.write("start")
80
80
  packer.write(time_nano(span.start_time))
81
81
 
82
- packer.write('duration')
82
+ packer.write("duration")
83
83
  packer.write(duration_nano(span.duration))
84
84
  else
85
85
  packer.write_map_header(number_of_elements_to_write) # Set header with how many elements in the map
@@ -88,40 +88,40 @@ module Datadog
88
88
  if span.events.any?
89
89
  if @native_events_supported
90
90
  # Use top-level field for native events
91
- packer.write('span_events')
91
+ packer.write("span_events")
92
92
  packer.write(span.events.map(&:to_native_format))
93
93
  else
94
94
  # Serialize span events as meta tags
95
- span.set_tag('events', span.events.map(&:to_hash).to_json)
95
+ span.set_tag("events", span.events.map(&:to_hash).to_json)
96
96
  end
97
97
  end
98
98
 
99
99
  # DEV: We use strings as keys here, instead of symbols, as
100
100
  # DEV: MessagePack will ultimately convert them to strings.
101
101
  # DEV: By providing strings directly, we skip this indirection operation.
102
- packer.write('span_id')
102
+ packer.write("span_id")
103
103
  packer.write(span.id)
104
- packer.write('parent_id')
104
+ packer.write("parent_id")
105
105
  packer.write(span.parent_id)
106
- packer.write('trace_id')
106
+ packer.write("trace_id")
107
107
  packer.write(@trace_id)
108
- packer.write('name')
108
+ packer.write("name")
109
109
  packer.write(span.name)
110
- packer.write('service')
110
+ packer.write("service")
111
111
  packer.write(span.service)
112
- packer.write('resource')
112
+ packer.write("resource")
113
113
  packer.write(span.resource)
114
- packer.write('type')
114
+ packer.write("type")
115
115
  packer.write(span.type)
116
- packer.write('meta')
116
+ packer.write("meta")
117
117
  packer.write(span.meta)
118
- packer.write('metrics')
118
+ packer.write("metrics")
119
119
  packer.write(span.metrics)
120
- packer.write('meta_struct')
120
+ packer.write("meta_struct")
121
121
  packer.write(span.metastruct)
122
- packer.write('span_links')
122
+ packer.write("span_links")
123
123
  packer.write(span.links.map(&:to_hash))
124
- packer.write('error')
124
+ packer.write("error")
125
125
  packer.write(span.status)
126
126
  packer
127
127
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../core/metrics/metric'
4
- require_relative '../../core/diagnostics/health'
3
+ require_relative "../../core/metrics/metric"
4
+ require_relative "../../core/diagnostics/health"
5
5
 
6
6
  module Datadog
7
7
  module Tracing
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../core/environment/identity'
4
- require_relative '../../core/environment/process'
5
- require_relative '../../core/environment/socket'
6
- require_relative '../../core/environment/git'
7
- require_relative '../../core/git/ext'
8
- require_relative '../../core/runtime/ext'
9
- require_relative '../metadata/ext'
10
- require_relative '../trace_segment'
3
+ require_relative "../../core/environment/identity"
4
+ require_relative "../../core/environment/process"
5
+ require_relative "../../core/environment/socket"
6
+ require_relative "../../core/environment/git"
7
+ require_relative "../../core/git/ext"
8
+ require_relative "../../core/runtime/ext"
9
+ require_relative "../metadata/ext"
10
+ require_relative "../trace_segment"
11
11
 
12
12
  module Datadog
13
13
  module Tracing
@@ -117,7 +117,7 @@ module Datadog
117
117
 
118
118
  root_span.set_tag(
119
119
  Tracing::Metadata::Ext::Distributed::TAG_KNUTH_SAMPLING_RATE,
120
- format('%.6f', (rate * 1e6).round / 1e6.to_f).sub(/\.?0+\z/, '')
120
+ format("%.6f", (rate * 1e6).round / 1e6).sub(/\.?0+\z/, "")
121
121
  )
122
122
  end
123
123
 
@@ -213,7 +213,7 @@ module Datadog
213
213
  def tag_apm_tracing_disabled!
214
214
  return if trace.apm_tracing_enabled
215
215
 
216
- root_span.set_tag(Tracing::Metadata::Ext::TAG_APM_ENABLED, 0)
216
+ trace.spans.each { |span| span.set_metric(Tracing::Metadata::Ext::TAG_APM_ENABLED, 0) }
217
217
  end
218
218
 
219
219
  def tag_git_repository_url!
@@ -1,13 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../core/chunker'
4
- require_relative '../../core/transport/parcel'
5
- require_relative '../../core/transport/request'
6
- require_relative '../../core/transport/transport'
7
- require_relative '../../core/utils/enumerable_compat'
8
- require_relative 'http/client'
9
- require_relative 'serializable_trace'
10
- require_relative 'trace_formatter'
3
+ require_relative "../../core/chunker"
4
+ require_relative "../../core/transport/parcel"
5
+ require_relative "../../core/transport/request"
6
+ require_relative "../../core/transport/transport"
7
+ require_relative "../../core/utils/enumerable_compat"
8
+ require_relative "http/client"
9
+ require_relative "serializable_trace"
10
+ require_relative "trace_formatter"
11
11
 
12
12
  module Datadog
13
13
  module Tracing
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../core/utils/forking'
4
- require_relative '../core/utils/time'
3
+ require_relative "../core/utils/forking"
4
+ require_relative "../core/utils/time"
5
5
 
6
6
  module Datadog
7
7
  module Tracing
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'buffer'
4
- require_relative 'pipeline'
3
+ require_relative "buffer"
4
+ require_relative "pipeline"
5
5
 
6
6
  module Datadog
7
7
  module Tracing
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'event'
4
- require_relative 'runtime/metrics'
5
- require_relative 'workers'
3
+ require_relative "event"
4
+ require_relative "runtime/metrics"
5
+ require_relative "workers"
6
6
 
7
- require_relative 'transport/http'
7
+ require_relative "transport/http"
8
8
 
9
9
  module Datadog
10
10
  module Tracing
@@ -122,7 +122,7 @@ module Datadog
122
122
  if worker_local
123
123
  worker_local.enqueue_trace(trace)
124
124
  elsif !@stopped
125
- logger.debug('Writer either failed to start or was stopped before #write could complete')
125
+ logger.debug("Writer either failed to start or was stopped before #write could complete")
126
126
  end
127
127
  end
128
128
 
@@ -173,10 +173,23 @@ module Datadog
173
173
  def stop_worker
174
174
  @stopped = true
175
175
 
176
- return if @worker.nil?
176
+ if @worker
177
+ @worker.stop
178
+ @worker = nil
179
+ end
177
180
 
178
- @worker.stop
179
- @worker = nil
181
+ # Stopping a writer is permanent: once `@stopped` is set, `#start`
182
+ # refuses to spin up a new worker, so this writer (and the transport it
183
+ # owns) is being discarded for good. Forks do not stop the writer
184
+ # (`#start` re-creates the worker for the new pid while reusing the same
185
+ # transport), so this only runs on real teardown/reconfiguration.
186
+ #
187
+ # Deterministically release transports that hold native resources
188
+ # (e.g. the native trace exporter's Rust runtime and process-global
189
+ # fork hooks) instead of waiting on the GC finalizer. The default HTTP
190
+ # transport has no `#close` and is left untouched. `#close` is
191
+ # idempotent, so repeated `#stop` calls are safe.
192
+ @transport.close if @transport.respond_to?(:close)
180
193
 
181
194
  true
182
195
  end